From 5d16fedc010f2a973718c4cadc8a7992bb46b7ef Mon Sep 17 00:00:00 2001 From: Paolo Cignoni cignoni Date: Thu, 2 Feb 2006 10:50:46 +0000 Subject: [PATCH] deleted a big bug of exporter 3ds --- src/meshlabplugins/meshio/export_3ds.h | 111 ++++++++++++++++++++----- 1 file changed, 91 insertions(+), 20 deletions(-) diff --git a/src/meshlabplugins/meshio/export_3ds.h b/src/meshlabplugins/meshio/export_3ds.h index 5496fea07..b084a3c73 100644 --- a/src/meshlabplugins/meshio/export_3ds.h +++ b/src/meshlabplugins/meshio/export_3ds.h @@ -25,6 +25,9 @@ History $Log$ + Revision 1.5 2006/02/02 10:50:46 fmazzant + deleted a big bug of exporter 3ds + Revision 1.4 2006/01/31 09:34:30 fmazzant bug-fix on savemaskexporter, when press cancel returns -1. @@ -113,6 +116,10 @@ namespace io { typedef typename SaveMeshType::FaceIterator FaceIterator; typedef typename SaveMeshType::VertexIterator VertexIterator; typedef typename SaveMeshType::VertexType VertexType; + + //int:rappresenta indice vertice vecchio + //TCoord2: la cordinata di texture del vertice con indice i + typedef std::pair > Key; /* enum of all the types of error @@ -199,59 +206,108 @@ namespace io { if(m.face.size() == 0) return E_NOTFACESVALID; - Lib3dsFile *file = lib3ds_file_new();//crea un nuovo file + /* + commentare bene .... + */ + std::map ListOfDuplexVert; + std::vector v; + + int count = 1; + if(m.HasPerWedgeTexture() && mask & vcg::tri::io::Mask::IOM_WEDGTEXCOORD ) + { + FaceIterator fi; + for(fi=m.face.begin(); fi!=m.face.end(); ++fi) if( !(*fi).IsD() ) + for(unsigned int k=0;k<3;k++) + { + int i = GetIndexVertex(m, (*fi).V(k)); + vcg::TCoord2 t = (*fi).WT(k); + if(AddDublexVertexCoord(ListOfDuplexVert,Key(i,t), count)) + { + v.push_back((*(*fi).V(k))); + ListOfDuplexVert[Key(i,t)] = v.size()-1; + count++; + } + } + } + + int number_vertex_to_duplicate = (count-1) - m.vert.size(); + + + Lib3dsFile *file = lib3ds_file_new();//creates new file Lib3dsMesh *mesh = lib3ds_mesh_new("mesh");//creates a new mesh with mesh's name "mesh" QString qnamematerial = "Material - %1"; std::vector materials; int current = 0; - int max = m.vert.size()+m.face.size(); + int max = m.vert.size()+m.face.size()+ number_vertex_to_duplicate; - lib3ds_mesh_new_point_list(mesh, m.vert.size());// set number of vertexs + lib3ds_mesh_new_point_list(mesh, m.vert.size() + number_vertex_to_duplicate);// set number of vertexs if(m.HasPerWedgeTexture() && mask & vcg::tri::io::Mask::IOM_WEDGTEXCOORD ) - lib3ds_mesh_new_texel_list(mesh,m.vert.size()); //set number of textures + lib3ds_mesh_new_texel_list(mesh,m.vert.size() + number_vertex_to_duplicate); //set number of textures int v_index = 0; VertexIterator vi; - //saves vert - for(vi=m.vert.begin(); vi!=m.vert.end(); ++vi) if( !(*vi).IsD() ) + ////saves vert + //for(vi=m.vert.begin(); vi!=m.vert.end(); ++vi) if( !(*vi).IsD() ) + //{ + // Lib3dsPoint point; + // point.pos[0] = (*vi).P()[0]; + // point.pos[1] = (*vi).P()[1]; + // point.pos[2] = (*vi).P()[2]; + + // mesh->pointL[v_index] = point; + + // if (cb !=NULL) + // (*cb)(100.0 * (float)++current/(float)max, "writing vertices "); + // else + // return E_ABORTED; + // v_index++; + //} + for(unsigned int i=0; i< v.size();i++) { Lib3dsPoint point; - point.pos[0] = (*vi).P()[0]; - point.pos[1] = (*vi).P()[1]; - point.pos[2] = (*vi).P()[2]; + point.pos[0] = v[i].P()[0]; + point.pos[1] = v[i].P()[1]; + point.pos[2] = v[i].P()[2]; - mesh->pointL[v_index] = point; + mesh->pointL[i] = point; if (cb !=NULL) (*cb)(100.0 * (float)++current/(float)max, "writing vertices "); else return E_ABORTED; - v_index++; } + lib3ds_mesh_new_face_list (mesh, m.face.size());//set number of faces int f_index = 0;//face index int t_index = 0;//texture index FaceIterator fi; for(fi=m.face.begin(); fi!=m.face.end(); ++fi) if( !(*fi).IsD() ) { + int i0 = GetIndexVertex(m, (*fi).V(0)); + vcg::TCoord2 t0 = (*fi).WT(0); + int i1 = GetIndexVertex(m, (*fi).V(1)); + vcg::TCoord2 t1 = (*fi).WT(1); + int i2 = GetIndexVertex(m, (*fi).V(2)); + vcg::TCoord2 t2 = (*fi).WT(2); + Lib3dsFace face; - face.points[0] = GetIndexVertex(m, (*fi).V(0)); - face.points[1] = GetIndexVertex(m, (*fi).V(1)); - face.points[2] = GetIndexVertex(m, (*fi).V(2)); + face.points[0] = GetIndexDublexVertex(ListOfDuplexVert,Key(i0,t0));//GetIndexVertex(m, (*fi).V(0)); + face.points[1] = GetIndexDublexVertex(ListOfDuplexVert,Key(i1,t1));//GetIndexVertex(m, (*fi).V(1)); + face.points[2] = GetIndexDublexVertex(ListOfDuplexVert,Key(i2,t2));//GetIndexVertex(m, (*fi).V(2)); //saves coord textures if(m.HasPerWedgeTexture() && mask & MeshModel::IOM_WEDGTEXCOORD ) { - unsigned int MAX = 3; - for(unsigned int k=0;ktexelL[face.points[k]][0] = (*fi).WT(k).u(); - mesh->texelL[face.points[k]][1] = (*fi).WT(k).v(); - } + mesh->texelL[face.points[0]][0] = t0.u();//(*fi).WT(0).u(); + mesh->texelL[face.points[0]][1] = t0.v();//(*fi).WT(0).v(); + mesh->texelL[face.points[1]][0] = t1.u();//(*fi).WT(1).u(); + mesh->texelL[face.points[1]][1] = t1.v();//(*fi).WT(1).v(); + mesh->texelL[face.points[2]][0] = t2.u();//(*fi).WT(2).u(); + mesh->texelL[face.points[2]][1] = t2.v();//(*fi).WT(2).v(); } if(mask & MeshModel::IOM_FACEFLAGS) @@ -353,6 +409,21 @@ namespace io { { return p-&*(m.vert.begin()); } + + /* + + */ + inline static bool AddDublexVertexCoord(std::map &m,Key key, int value) + { + int index = m[key]; + if(index==0){m[key]=value;return true;} + return false; + } + + inline static int GetIndexDublexVertex(std::map &m,Key key) + { + return m[key]; + } /* create a new material