void write_file(const char* strName) { int i; PlyFile *ply; int num_elem_types; /*** Write out the transformed PLY object ***/ FILE* pFile = fopen(strName,"w"); ply = write_ply (pFile, nelems, elem_names, PLY_ASCII); /* describe what properties go into the vertex elements */ describe_element_ply (ply, "vertex", nverts); describe_property_ply (ply, &vert_props[0]); describe_property_ply (ply, &vert_props[1]); describe_property_ply (ply, &vert_props[2]); if (has_normals) { describe_property_ply (ply, &vert_props[4]); describe_property_ply (ply, &vert_props[5]); describe_property_ply (ply, &vert_props[6]); } if (texture_coords) { describe_property_ply (ply, &vert_props[7]); describe_property_ply (ply, &vert_props[8]); } describe_element_ply (ply, "face", nfaces); describe_property_ply (ply, &face_props[0]); for (i = 0; i < ncomments; i++) append_comment_ply (ply, comments[i]); append_comment_ply (ply, "converted from OBJ by obj2ply"); header_complete_ply (ply); /* set up and write the vertex elements */ put_element_setup_ply (ply, "vertex"); for (i = 0; i < nverts; i++) put_element_ply (ply, &vVertex[i]);//(void *) &vlist[i]); /* set up and write the face elements */ put_element_setup_ply (ply, "face"); for (i = 0; i < nfaces; i++){ int idx[3]; memcpy(idx,&vIndex[i*3],sizeof(int)*3); Face f; f.nverts = 3; f.verts = idx; put_element_ply (ply, (void *)&f);// &flist[i]); } close_ply (ply); free_ply (ply); fclose(pFile); }
write_file() { int i; PlyFile *ply; int num_elem_types; /*** Write out the transformed PLY object ***/ ply = write_ply (stdout, nelems, elem_names, PLY_ASCII); /* describe what properties go into the vertex elements */ describe_element_ply (ply, "vertex", nverts); describe_property_ply (ply, &vert_props[0]); describe_property_ply (ply, &vert_props[1]); describe_property_ply (ply, &vert_props[2]); describe_element_ply (ply, "face", nfaces); describe_property_ply (ply, &face_props[0]); append_comment_ply (ply, "created by platoply"); header_complete_ply (ply); /* set up and write the vertex elements */ put_element_setup_ply (ply, "vertex"); for (i = 0; i < nverts; i++) put_element_ply (ply, (void *) &vlist[i]); /* set up and write the face elements */ put_element_setup_ply (ply, "face"); for (i = 0; i < nfaces; i++) put_element_ply (ply, (void *) &flist[i]); close_ply (ply); free_ply (ply); }
write_file() { int i; PlyFile *ply; char **elist; int num_elem_types; /*** Write out the transformed PLY object ***/ elist = get_element_list_ply (in_ply, &num_elem_types); ply = write_ply (stdout, num_elem_types, elist, in_ply->file_type); /* describe what properties go into the vertex elements */ describe_element_ply (ply, "vertex", nverts); describe_property_ply (ply, &vert_props[0]); describe_property_ply (ply, &vert_props[1]); describe_property_ply (ply, &vert_props[2]); describe_other_properties_ply (ply, vert_other, offsetof(Vertex,other_props)); describe_other_elements_ply (ply, in_ply->other_elems); copy_comments_ply (ply, in_ply); append_comment_ply (ply, "modified by xformply"); copy_obj_info_ply (ply, in_ply); header_complete_ply (ply); /* set up and write the vertex elements */ put_element_setup_ply (ply, "vertex"); for (i = 0; i < nverts; i++) put_element_ply (ply, (void *) vlist[i]); put_other_elements_ply (ply); close_ply (ply); free_ply (ply); }
void write_file ( void ) /******************************************************************************/ /* Purpose: WRITE_FILE writes the PLY file to the standard output unit. Modified: 17 January 2011 Author: Greg Turk */ { int i; int num_elem_types; PlyFile *ply; /* Write out the transformed PLY object. */ ply = write_ply (stdout, nelems, elem_names, PLY_ASCII); /* Describe what properties go into the vertex elements. */ describe_element_ply (ply, "vertex", nverts); describe_property_ply (ply, &vert_props[0]); describe_property_ply (ply, &vert_props[1]); describe_property_ply (ply, &vert_props[2]); if ( has_normals ) { describe_property_ply (ply, &vert_props[3]); describe_property_ply (ply, &vert_props[4]); describe_property_ply (ply, &vert_props[5]); } if (texture_coords) { describe_property_ply (ply, &vert_props[6]); describe_property_ply (ply, &vert_props[7]); } describe_element_ply (ply, "face", nfaces); describe_property_ply (ply, &face_props[0]); /* Insert the comments. */ for (i = 0; i < ncomments; i++) { append_comment_ply (ply, comments[i]); } append_comment_ply (ply, "converted from OBJ by obj2ply"); header_complete_ply (ply); /* Set up and write the vertex elements. */ put_element_setup_ply (ply, "vertex"); for (i = 0; i < nverts; i++) { put_element_ply (ply, (void *) &vlist[i]); } /* Set up and write the face elements. */ put_element_setup_ply (ply, "face"); for (i = 0; i < nfaces; i++) { put_element_ply (ply, (void *) &flist[i]); } close_ply ( ply ); free_ply ( ply ); return; }
main(int argc, char *argv[]) { int i,j,k; PlyFile *in_ply; PlyFile *out_ply; int nelems; char **elist; int file_type; float version; int nprops; int num_elems; PlyProperty **plist; PlyProperty **plist_copy; PlyProperty *prop; char *elem_name; char *data; int offset; int *offset_list; int **lists; int *list_count; char **list_ptr; int verbose_flag = 0; #ifndef WRITE_ASCII #ifndef WRITE_BINARY fprintf (stderr, "'%s' compiled incorrectly.\n", argv[0]); fprintf (stderr, "Must have WRITE_ASCII or WRITE_BINARY defined during compile.\n"); exit (-1); #endif #endif /* maybe print out help message */ #ifdef WRITE_ASCII if (argc > 2 || (argc == 2 && !equal_strings (argv[1], "-p"))) { fprintf (stderr, "usage: %s [flags] <infile >outfile\n", argv[0]); fprintf (stderr, " -p (print element labels)\n"); exit (0); } #endif #ifdef WRITE_BINARY if (argc > 1) { fprintf (stderr, "usage: %s <infile >outfile\n", argv[0]); exit (0); } #endif if (argc == 2 && equal_strings (argv[1], "-p")) verbose_flag = 1; /* open the input and output files */ in_ply = read_ply (stdin); elist = get_element_list_ply (in_ply, &nelems); #ifdef WRITE_ASCII out_ply = write_ply (stdout, nelems, elist, PLY_ASCII); #endif #ifdef WRITE_BINARY out_ply = write_ply (stdout, nelems, elist, PLY_BINARY_BE); #endif /* allocate space for various lists that keep track of the elements */ plist_copy = (PlyProperty **) malloc (sizeof (PlyProperty *) * nelems); offset_list = (int *) malloc (sizeof (int) * nelems); lists = (int **) malloc (sizeof (int *) * nelems); list_count = (int *) malloc (sizeof (int)); /* go through each kind of element that we learned is in the file */ /* and come up with a list that has offsets for all properties */ for (i = 0; i < nelems; i++) { /* get the description of the element */ elem_name = elist[i]; plist = get_element_description_ply(in_ply, elem_name, &num_elems, &nprops); /* make room for a list of the lists in an element, so that */ /* we can later easily free up the space created by malloc'ed lists */ list_count[i] = 0; lists[i] = (int *) malloc (sizeof (int) * nprops); /* set up pointers into data */ offset = 0; for (j = 0; j < nprops; j++) { plist[j]->offset = offset; offset += 8; if (plist[j]->is_list) { plist[j]->count_offset = offset; lists[i][list_count[i]] = offset - 8; list_count[i]++; offset += 8; } } offset_list[i] = offset; /* copy the property list */ plist_copy[i] = (PlyProperty *) malloc (sizeof (PlyProperty) * nprops); prop = plist_copy[i]; for (j = 0; j < nprops; j++) { prop->name = plist[j]->name; prop->external_type = plist[j]->external_type; prop->internal_type = plist[j]->external_type; prop->offset = plist[j]->offset; prop->is_list = plist[j]->is_list; prop->count_external = plist[j]->count_external; prop->count_internal = plist[j]->count_external; prop->count_offset = plist[j]->count_offset; prop++; } element_layout_ply (out_ply, elem_name, num_elems, nprops, plist_copy[i]); } /* copy the comments and obj_info */ copy_comments_ply (out_ply, in_ply); copy_obj_info_ply (out_ply, in_ply); /* finish the header for the output file */ header_complete_ply (out_ply); /* copy all the element information */ for (i = 0; i < nelems; i++) { /* get the description of the element */ elem_name = elist[i]; plist = get_element_description_ply(in_ply, elem_name, &num_elems, &nprops); /* allocate space for an element */ data = (char *) malloc (8 * offset_list[i]); /* set up for getting elements */ get_element_setup_ply (in_ply, elem_name, nprops, plist_copy[i]); put_element_setup_ply (out_ply, elem_name); /* possibly print out name of element */ if (verbose_flag) fprintf (out_ply->fp, "%s:\n", elem_name); /* copy all the elements */ if (list_count[i]) { /* need to free the lists */ for (j = 0; j < num_elems; j++) { get_element_ply (in_ply, (void *) data); put_element_ply (out_ply, (void *) data); for (k = 0; k < list_count[i]; k++) { list_ptr = (char **) (data + lists[i][k]); free (*list_ptr); } } } else { /* no lists */ for (j = 0; j < num_elems; j++) { get_element_ply (in_ply, (void *) data); put_element_ply (out_ply, (void *) data); } } } /* close the PLY files */ close_ply (in_ply); close_ply (out_ply); }
void TrisetObject::save() { bool has_normals = (m_normals.count() > 0); bool per_vertex_color = (m_vcolor.count() > 0); QString flnm = QFileDialog::getSaveFileName(0, "Export mesh to file", Global::previousDirectory(), "*.ply"); if (flnm.size() == 0) return; typedef struct PlyFace { unsigned char nverts; /* number of Vertex indices in list */ int *verts; /* Vertex index list */ } PlyFace; typedef struct { float x, y, z; /**< Vertex coordinates */ float nx, ny, nz; /**< Vertex normal */ uchar r, g, b; } myVertex ; PlyProperty vert_props[] = { /* list of property information for a PlyVertex */ {"x", Float32, Float32, offsetof( myVertex,x ), 0, 0, 0, 0}, {"y", Float32, Float32, offsetof( myVertex,y ), 0, 0, 0, 0}, {"z", Float32, Float32, offsetof( myVertex,z ), 0, 0, 0, 0}, {"nx", Float32, Float32, offsetof( myVertex,nx ), 0, 0, 0, 0}, {"ny", Float32, Float32, offsetof( myVertex,ny ), 0, 0, 0, 0}, {"nz", Float32, Float32, offsetof( myVertex,nz ), 0, 0, 0, 0}, {"red", Uint8, Uint8, offsetof( myVertex,r ), 0, 0, 0, 0}, {"green", Uint8, Uint8, offsetof( myVertex,g ), 0, 0, 0, 0}, {"blue", Uint8, Uint8, offsetof( myVertex,b ), 0, 0, 0, 0} }; PlyProperty face_props[] = { /* list of property information for a PlyFace */ {"vertex_indices", Int32, Int32, offsetof( PlyFace,verts ), 1, Uint8, Uint8, offsetof( PlyFace,nverts )}, }; PlyFile *ply; FILE *fp = fopen(flnm.toAscii().data(), bin ? "wb" : "w"); PlyFace face ; int verts[3] ; char *elem_names[] = { "vertex", "face" }; ply = write_ply (fp, 2, elem_names, bin? PLY_BINARY_LE : PLY_ASCII ); int nvertices = m_vertices.count(); /* describe what properties go into the PlyVertex elements */ describe_element_ply ( ply, "vertex", nvertices ); describe_property_ply ( ply, &vert_props[0] ); describe_property_ply ( ply, &vert_props[1] ); describe_property_ply ( ply, &vert_props[2] ); describe_property_ply ( ply, &vert_props[3] ); describe_property_ply ( ply, &vert_props[4] ); describe_property_ply ( ply, &vert_props[5] ); describe_property_ply ( ply, &vert_props[6] ); describe_property_ply ( ply, &vert_props[7] ); describe_property_ply ( ply, &vert_props[8] ); /* describe PlyFace properties (just list of PlyVertex indices) */ int ntriangles = m_triangles.count()/3; describe_element_ply ( ply, "face", ntriangles ); describe_property_ply ( ply, &face_props[0] ); header_complete_ply ( ply ); /* set up and write the PlyVertex elements */ put_element_setup_ply ( ply, "vertex" ); for(int i=0; i<m_vertices.count(); i++) { myVertex vertex; vertex.x = m_vertices[i].x*m_scale.x; vertex.y = m_vertices[i].y*m_scale.y; vertex.z = m_vertices[i].z*m_scale.z; if (has_normals) { vertex.nx = m_normals[i].x; vertex.ny = m_normals[i].y; vertex.nz = m_normals[i].z; } if (per_vertex_color) { vertex.r = 255*m_vcolor[i].x; vertex.g = 255*m_vcolor[i].y; vertex.b = 255*m_vcolor[i].z; } put_element_ply ( ply, ( void * ) &vertex ); } put_element_setup_ply ( ply, "face" ); face.nverts = 3 ; face.verts = verts ; for(int i=0; i<m_triangles.count()/3; i++) { int v0 = m_triangles[3*i]; int v1 = m_triangles[3*i+1]; int v2 = m_triangles[3*i+2]; face.verts[0] = v0; face.verts[1] = v1; face.verts[2] = v2; put_element_ply ( ply, ( void * ) &face ); } close_ply ( ply ); free_ply ( ply ); fclose( fp ) ; QMessageBox::information(0, "Save Mesh", "done"); }
void MeshGenerator::savePLY(QString flnm) { m_meshLog->moveCursor(QTextCursor::End); m_meshLog->insertPlainText("Saving Mesh"); PlyProperty vert_props[] = { /* list of property information for a PlyVertex */ {"x", Float32, Float32, offsetof( Vertex,x ), 0, 0, 0, 0}, {"y", Float32, Float32, offsetof( Vertex,y ), 0, 0, 0, 0}, {"z", Float32, Float32, offsetof( Vertex,z ), 0, 0, 0, 0}, {"nx", Float32, Float32, offsetof( Vertex,nx ), 0, 0, 0, 0}, {"ny", Float32, Float32, offsetof( Vertex,ny ), 0, 0, 0, 0}, {"nz", Float32, Float32, offsetof( Vertex,nz ), 0, 0, 0, 0}, {"red", Uint8, Uint8, offsetof( Vertex,r ), 0, 0, 0, 0}, {"green", Uint8, Uint8, offsetof( Vertex,g ), 0, 0, 0, 0}, {"blue", Uint8, Uint8, offsetof( Vertex,b ), 0, 0, 0, 0} }; PlyProperty face_props[] = { /* list of property information for a PlyFace */ {"vertex_indices", Int32, Int32, offsetof( Face,verts ), 1, Uint8, Uint8, offsetof( Face,nverts )}, }; PlyFile *ply; FILE *fp = fopen(flnm.toLatin1().data(), "wb"); Face face ; int verts[3] ; char *elem_names[] = { "vertex", "face" }; ply = write_ply (fp, 2, elem_names, PLY_BINARY_LE ); /* describe what properties go into the PlyVertex elements */ describe_element_ply ( ply, "vertex", m_nverts ); describe_property_ply ( ply, &vert_props[0] ); describe_property_ply ( ply, &vert_props[1] ); describe_property_ply ( ply, &vert_props[2] ); describe_property_ply ( ply, &vert_props[3] ); describe_property_ply ( ply, &vert_props[4] ); describe_property_ply ( ply, &vert_props[5] ); describe_property_ply ( ply, &vert_props[6] ); describe_property_ply ( ply, &vert_props[7] ); describe_property_ply ( ply, &vert_props[8] ); /* describe PlyFace properties (just list of PlyVertex indices) */ describe_element_ply ( ply, "face", m_nfaces ); describe_property_ply ( ply, &face_props[0] ); header_complete_ply ( ply ); /* set up and write the PlyVertex elements */ put_element_setup_ply ( ply, "vertex" ); for(int ni=0; ni<m_nverts; ni++) put_element_ply ( ply, ( void * ) m_vlist[ni] ); /* set up and write the PlyFace elements */ put_element_setup_ply ( ply, "face" ); for(int ni=0; ni<m_nfaces; ni++) put_element_ply ( ply, ( void * ) m_flist[ni] ); close_ply ( ply ); free_ply ( ply ); m_meshProgress->setValue(100); }
write_file() { int i; PlyFile *ply; char **elist; int num_elem_types; /*** Write out the transformed PLY object ***/ elist = get_element_list_ply (in_ply, &num_elem_types); ply = write_ply (stdout, num_elem_types, elist, in_ply->file_type); /* describe what properties go into the vertex elements */ /* (position x,y,z and normals nx,ny,nz if they were provided) */ describe_element_ply (ply, "vertex", nverts); describe_property_ply (ply, &vert_props[0]); describe_property_ply (ply, &vert_props[1]); describe_property_ply (ply, &vert_props[2]); if (has_nx) describe_property_ply (ply, &vert_props[3]); if (has_ny) describe_property_ply (ply, &vert_props[4]); if (has_nz) describe_property_ply (ply, &vert_props[5]); /* all other vertex properties besides position and normal */ describe_other_properties_ply (ply, vert_other, offsetof(Vertex,other_props)); /* describe face properties (just list of vertex indices) */ describe_element_ply (ply, "face", nfaces); describe_property_ply (ply, &face_props[0]); describe_other_properties_ply (ply, face_other, offsetof(Face,other_props)); /* all other properties that we tucked away are mentioned here */ describe_other_elements_ply (ply, in_ply->other_elems); /* copy the comments and other textual object information */ copy_comments_ply (ply, in_ply); append_comment_ply (ply, "modified by flipply"); copy_obj_info_ply (ply, in_ply); /* we've told the routines enough information so that the file header */ /* can be written out now */ header_complete_ply (ply); /* set up and write the vertex elements */ put_element_setup_ply (ply, "vertex"); for (i = 0; i < nverts; i++) put_element_ply (ply, (void *) vlist[i]); /* set up and write the face elements */ put_element_setup_ply (ply, "face"); for (i = 0; i < nfaces; i++) put_element_ply (ply, (void *) flist[i]); /* the other properties that we tucked away are written out here */ put_other_elements_ply (ply); /* close the file and free up the memory */ close_ply (ply); free_ply (ply); }