示例#1
0
void SMwriter_smc_old::set_boundingbox(const float* bb_min_f, const float* bb_max_f)
{
  if (this->bb_min_f == 0) this->bb_min_f = new float[3];
  if (this->bb_max_f == 0) this->bb_max_f = new float[3];
  VecCopy3fv(this->bb_min_f, bb_min_f);
  VecCopy3fv(this->bb_max_f, bb_max_f);
}
示例#2
0
SMevent SMreadPostAsCompactPre::read_event()
{
  if ((have_new + have_triangle + have_finalized) == 0)
  {
    return read_element();
  }
  if (have_new)
  {
    v_idx = t_idx[new_vertices[next_new]];
    VecCopy3fv(v_pos_f, t_pos_f[new_vertices[next_new]]);
    have_new--; next_new++;
    v_count++;
    return SM_VERTEX;
  }
  else if (have_triangle)
  {
    have_triangle = 0;
    f_count++;
    return SM_TRIANGLE;
  }
  else if (have_finalized)
  {
    final_idx = t_idx[finalized_vertices[next_finalized]];
    have_finalized--; next_finalized++;
    return SM_FINALIZED;
  }
  return SM_ERROR;
}
示例#3
0
SMevent SMreadPostAsCompactPre::read_element()
{
  if ((have_new + have_triangle) == 0)
  {
    next_new = 0;
    have_finalized = next_finalized = 0;
    
    int ok = read_triangle();
    if (ok <= 0)
    {
      return (SMevent)ok;
    }
  }
  if (have_new)
  {
    v_idx = t_idx[new_vertices[next_new]];
    VecCopy3fv(v_pos_f,t_pos_f[new_vertices[next_new]]);
    have_new--; next_new++;
    v_count++;
    return SM_VERTEX;
  }
  else
  {
    have_triangle = 0;
    f_count++;
    return SM_TRIANGLE;
  }
}
SMevent SMreader_smb::read_element()
{
  if (element_counter < element_number)
  {
    have_finalized = next_finalized = 0;
    if (element_descriptor & 1) // next element is a vertex
    {
      if (endian_swap) VecCopy3fv_swap_endian(v_pos_f, (float*)(&element_buffer[element_counter*3]));
      else VecCopy3fv(v_pos_f, (float*)(&element_buffer[element_counter*3]));
      v_idx = v_count;
      v_count++;
      if (post_order) {finalized_vertices[have_finalized] = v_idx; have_finalized++;}
      element_counter++;
      if (element_counter == element_number)
      {
        read_buffer();
      }
      else
      {
        element_descriptor = element_descriptor >> 1;
      }
      return SM_VERTEX;
    }
    else // next element is a triangle
    {
      if (endian_swap) VecCopy3iv_swap_endian(t_idx, (int*)(&element_buffer[element_counter*3]));
示例#5
0
static SMedge* allocEdge(float* v)
{
  if (edge_buffer_next == 0)
  {
    edge_buffer_next = (SMedge*)malloc(sizeof(SMedge)*edge_buffer_alloc);
    if (edge_buffer_next == 0)
    {
      fprintf(stderr,"malloc for edge buffer failed\n");
      return 0;
    }
    for (int i = 0; i < edge_buffer_alloc; i++)
    {
      edge_buffer_next[i].buffer_next = &(edge_buffer_next[i+1]);
    }
    edge_buffer_next[edge_buffer_alloc-1].buffer_next = 0;
    edge_buffer_alloc = 2*edge_buffer_alloc;
  }
  // get index of next available vertex
  SMedge* edge = edge_buffer_next;
  edge_buffer_next = edge->buffer_next;
 
  edge->origin = 0;
  edge->target = 0;
  edge->degree = 1;
  VecCopy3fv(edge->across,v);

  edge_buffer_size++; if (edge_buffer_size > edge_buffer_maxsize) edge_buffer_maxsize = edge_buffer_size;

  return edge;
}
示例#6
0
void SMwriter_smc_old::write_vertex(const float* v_pos_f)
{
  if (v_count + f_count == 0) write_header();

  SMvertex* vertex = allocVertex();
  vertex->index = v_count;
  VecCopy3fv(vertex->v, v_pos_f);
  vertex_hash->insert(my_vertex_hash::value_type(v_count, vertex));
  v_count++;
}
示例#7
0
int SMreadPostAsCompactPre::read_postorder_input()
{
  int i;
  SMvertex* vertex;
  SMtriangle* triangle;
  my_hash::iterator hash_element;

  SMevent event = smreader->read_element();
    
  if (event == SM_TRIANGLE)
  {
    // create triangle
    triangle = allocTriangle();
    // insert triangle into waiting area
    waiting_area->addElement(triangle);
    // process the triangle's vertices
    for (i = 0; i < 3; i++)
    {
      // look for vertex in the hash
      hash_element = vertex_hash->find(smreader->t_idx[i]);
      // did we find the vertex in the hash  
      if (hash_element == vertex_hash->end())
      {
        // create vertex
        vertex = allocVertex();
        // insert vertex into hash
        vertex_hash->insert(my_hash::value_type(smreader->t_idx[i], vertex));
      }
      else
      {
        // use vertex found in hash
        vertex = (*hash_element).second;
      }
      // add vertex to triangle
      triangle->vertices[i] = vertex;
      // add triangle to vertex
      if (vertex->list_size == vertex->list_alloc)
      {
        vertex->list_alloc += 4;
        vertex->list = (SMtriangle**)realloc(vertex->list,vertex->list_alloc*sizeof(SMtriangle*));
      }
      vertex->list[vertex->list_size++] = triangle;
    }
  }
  else if (event == SM_VERTEX)
  {
    // look for vertex in the vertex hash
    hash_element = vertex_hash->find(smreader->v_idx);
    // we inform the user if a vertex was not in the hash
    if (hash_element == vertex_hash->end())
    {
      fprintf(stderr, "WARNING: post-order vertex not used by any triangle. skipping ...\n");
      return 1;
    }
    // use vertex found in hash
    vertex = vertex = (*hash_element).second;
    // copy coordinates
    VecCopy3fv(vertex->v, smreader->v_pos_f);
    // finalizing vertex may make some triangles eligible for output
    for (i = 0; i < vertex->list_size; i++)
    {
      triangle = vertex->list[i];
      triangle->ready++;
      if (triangle->ready == 3)
      {
        if (preserve_order) // we have to preserve the triangle order
        {
          if (triangle == waiting_area->getFirstElement())
          {
            waiting_area->removeFirstElement();
            output_triangles->addElement(triangle);

            // behind this triangle additional ready triangles may be waiting

            while (waiting_area->size())
            {
              triangle = (SMtriangle*)waiting_area->getFirstElement();
              if (triangle->ready == 3)
              {
                waiting_area->removeFirstElement();
                output_triangles->addElement(triangle);
              }
              else
              {
                break;
              }
            }
          }
        }
        else // we do not have to preserve the triangle order
        {
          waiting_area->removeElement(triangle);
          output_triangles->addElement(triangle);
        }
      }
    }
    // remove vertex from hash
    vertex_hash->erase(hash_element);
  }
  else if (event == SM_EOF)
  {
    if (vertex_hash->size())
    {
      fprintf(stderr, "FATAL ERROR: some outstanding vertices when reaching SM_EOF\n");
      return -1;
    }
    else
    {
      return 0;
    }
  }
  return 1;
}
示例#8
0
int main(int argc, char *argv[])
{
  char* file_name;

  if (argc == 2)
  {
    file_name = argv[1];
  }
  else
  {
    fprintf(stderr,"usage:\n");
    fprintf(stderr,"ps_load <file_name>\n");
    exit(1);
  }

  PSreader* psreader = 0;

  if (strstr(file_name, "compressed"))
  {
    PSreader_oocc* psreader_oocc = new PSreader_oocc();
    psreader_oocc->open(file_name);
    psreader = psreader_oocc;
  }
  else if (strstr(file_name, ".sma") || strstr(file_name, ".obj") || strstr(file_name, ".smf"))
  {
    FILE* sma_fp = fopen(file_name, "r");
    if (sma_fp == 0)
    {
      fprintf(stderr,"ERROR: cannot open %s\n",file_name);
      exit(1);
    }
    SMreader_sma* smreader_sma = new SMreader_sma();
    smreader_sma->open(sma_fp);
    PSconverter* psconverter = new PSconverter();
    psconverter->open(smreader_sma, 256, 512);
    psreader = psconverter;
  }
  else
  {
    fprintf(stderr,"ERROR: cannot guess input type from file name\n");
    exit(1);
  }

  float* vertices = 0;
  int vertices_alloced = 1024;
  int vertices_number = 0;

  int* faces = 0;
  int faces_alloced = 512;
  int faces_number = 0;

  if (psreader->nverts == -1)
  {
    fprintf(stderr,"nverts not defined\n");
  }
  else
  {
    fprintf(stderr,"nverts %d\n",psreader->nverts);
    vertices_alloced = psreader->nverts;
  }
  vertices = allocVertices(0, vertices_alloced);

  if (psreader->nfaces == -1)
  {
    fprintf(stderr,"nfaces not defined\n");
  }
  else
  {
    fprintf(stderr,"nfaces %d\n",psreader->nfaces);
    faces_alloced = psreader->nfaces;
  }
  faces = allocFaces(0, faces_alloced);

  int i;

  while(psreader->read_triangle())
  {
    // make sure there is memory for the next face
    if (faces_number == faces_alloced)
    {
      faces_alloced *= 2;
      faces = allocFaces(faces, faces_alloced);
    }

    // copy new face into memory
    VecCopy3iv(&(faces[faces_number*3]), psreader->t_idx);
    faces_number++;

    for (i = 0; i < 3; i++)
    {
      // check for new vertices
      if (PS_IS_NEW_VERTEX(psreader->t_vflag[i]))
      {
        // make sure there is memory for the next vertex
        if (vertices_number == vertices_alloced)
        {
          vertices_alloced *= 2;
          vertices = allocVertices(vertices, vertices_alloced);
        }

        // copy new face into memory
        VecCopy3fv(&(vertices[vertices_number*3]), psreader->t_pos_f[i]);
        vertices_number++;
      }
    }
  }

  fprintf(stderr,"vertex counters: %d %d %d (should be equal)\n",vertices_number,psreader->v_count,psreader->nverts);
  fprintf(stderr,"face counters: %d %d %d (should be equal)\n",faces_number,psreader->f_count,psreader->nfaces);

  psreader->close();

  deallocVertices(vertices);
  deallocFaces(faces);

  return 1;
}
 void veccopy3fv(float v[3], const float a[3]) {
   VecCopy3fv(v, a);
 }