From b605d04d26d09f6458220f36e1617a0984722482 Mon Sep 17 00:00:00 2001 From: cignoni Date: Thu, 19 Jun 2014 11:41:55 +0000 Subject: [PATCH] Improved float/double consistency removing some wrong Point3f and substitued with MeshType::CoordType --- wrap/gl/trimesh.h | 270 +++++++++++++++++++++++----------------------- 1 file changed, 135 insertions(+), 135 deletions(-) diff --git a/wrap/gl/trimesh.h b/wrap/gl/trimesh.h index 78b7181b..9859083b 100644 --- a/wrap/gl/trimesh.h +++ b/wrap/gl/trimesh.h @@ -83,15 +83,15 @@ public: HNPPointSize = 2 // the point size used in point rendering }; - template + template class VertToSplit { public: - typename MESH_TYPE::face_base_pointer f; + typename MeshType::face_base_pointer f; char z; char edge; bool newp; - typename MESH_TYPE::vertex_pointer v; + typename MeshType::vertex_pointer v; }; // GL Array Elemet @@ -105,12 +105,19 @@ public: }; -template > +template > class GlTrimesh : public GLW { public: - typedef MESH_TYPE mesh_type; + typedef typename MeshType::VertexType VertexType; + typedef typename MeshType::FaceType FaceType; + typedef typename MeshType::VertexType::CoordType CoordType; + typedef typename MeshType::VertexType::ScalarType ScalarType; + typedef typename MeshType::VertexIterator VertexIterator; + typedef typename MeshType::EdgeIterator EdgeIterator; + typedef typename MeshType::FaceIterator FaceIterator; + FACE_POINTER_CONTAINER face_pointers; @@ -123,7 +130,7 @@ public: int HNParami[8]; float HNParamf[8]; - MESH_TYPE *m; + MeshType *m; GlTrimesh() { m=0; @@ -189,9 +196,8 @@ void Update(/*Change c=CHAll*/) if(curr_hints&HNUseVArray || curr_hints&HNUseVBO) { - typename MESH_TYPE::FaceIterator fi; indices.clear(); - for(fi = m->face.begin(); fi != m->face.end(); ++fi) + for(FaceIterator fi = m->face.begin(); fi != m->face.end(); ++fi) { indices.push_back((unsigned int)((*fi).V(0) - &(*m->vert.begin()))); indices.push_back((unsigned int)((*fi).V(1) - &(*m->vert.begin()))); @@ -203,16 +209,16 @@ void Update(/*Change c=CHAll*/) if(!glIsBuffer(array_buffers[1])) glGenBuffers(2,(GLuint*)array_buffers); glBindBuffer(GL_ARRAY_BUFFER,array_buffers[0]); - glBufferData(GL_ARRAY_BUFFER_ARB, m->vn * sizeof(typename MESH_TYPE::VertexType), + glBufferData(GL_ARRAY_BUFFER_ARB, m->vn * sizeof(VertexType), (char *)&(m->vert[0].P()), GL_STATIC_DRAW_ARB); glBindBuffer(GL_ARRAY_BUFFER,array_buffers[1]); - glBufferData(GL_ARRAY_BUFFER_ARB, m->vn * sizeof(typename MESH_TYPE::VertexType), + glBufferData(GL_ARRAY_BUFFER_ARB, m->vn * sizeof(VertexType), (char *)&(m->vert[0].N()), GL_STATIC_DRAW_ARB); } - glVertexPointer(3,GL_FLOAT,sizeof(typename MESH_TYPE::VertexType),0); - glNormalPointer(GL_FLOAT,sizeof(typename MESH_TYPE::VertexType),0); + glVertexPointer(3,GL_FLOAT,sizeof(VertexType),0); + glNormalPointer(GL_FLOAT,sizeof(VertexType),0); } //int C=c; @@ -224,14 +230,14 @@ void Update(/*Change c=CHAll*/) //} //if((C&CHFace) && (curr_hints&HNUseEdgeStrip)) ComputeEdges(); //if((C&CHFace) && (curr_hints&HNUseLazyEdgeStrip)) ClearEdges(); - //if(MESH_TYPE::HasFFTopology()) + //if(MeshType::HasFFTopology()) // if((C&CHFace) && (curr_hints&HNUseTriStrip)) { // if(!(curr_hints&HNHasFFTopology)) m->FFTopology(); // ComputeTriStrip(); // } //if((C&CHFaceNormal) && (curr_hints&HNUsePerWedgeNormal)) { // if(!(curr_hints&HNHasVFTopology)) m->VFTopology(); - // CreaseWN(*m,MESH_TYPE::scalar_type(GetHintParamf(HNPCreaseAngle))); + // CreaseWN(*m,MeshType::scalar_type(GetHintParamf(HNPCreaseAngle))); //} //if(C!=0) { // force the recomputation of display list // cdm=DMNone; @@ -240,7 +246,7 @@ void Update(/*Change c=CHAll*/) //} //if((curr_hints&HNUseVArray) && (curr_hints&HNUseTriStrip)) // { - // ConvertTriStrip(*m,TStrip,TStripF,TStripVED,TStripVEI); + // ConvertTriStrip(*m,TStrip,TStripF,TStripVED,TStripVEI); // } } @@ -336,11 +342,6 @@ template void DrawFill() { if(m->fn==0) return; - typename FACE_POINTER_CONTAINER::iterator fp; - - typename MESH_TYPE::FaceIterator fi; - - typename std::vector::iterator fip; if(cm == CMPerMesh) glColor(m->C()); @@ -359,10 +360,10 @@ void DrawFill() if (nm==NMPerVert) { glBindBuffer(GL_ARRAY_BUFFER,array_buffers[1]); - glNormalPointer(GL_FLOAT,sizeof(typename MESH_TYPE::VertexType),0); + glNormalPointer(GL_FLOAT,sizeof(typename MeshType::VertexType),0); } glBindBuffer(GL_ARRAY_BUFFER,array_buffers[0]); - glVertexPointer(3,GL_FLOAT,sizeof(typename MESH_TYPE::VertexType),0); + glVertexPointer(3,GL_FLOAT,sizeof(typename MeshType::VertexType),0); glDrawElements(GL_TRIANGLES ,m->fn*3,GL_UNSIGNED_INT, &(*indices.begin()) ); glDisableClientState (GL_VERTEX_ARRAY); @@ -385,8 +386,8 @@ void DrawFill() glEnableClientState (GL_VERTEX_ARRAY); if (nm==NMPerVert) - glNormalPointer(GL_FLOAT,sizeof(typename MESH_TYPE::VertexType),&(m->vert.begin()->N()[0])); - glVertexPointer(3,GL_FLOAT,sizeof(typename MESH_TYPE::VertexType),&(m->vert.begin()->P()[0])); + glNormalPointer(GL_FLOAT,sizeof(typename MeshType::VertexType),&(m->vert.begin()->N()[0])); + glVertexPointer(3,GL_FLOAT,sizeof(typename MeshType::VertexType),&(m->vert.begin()->P()[0])); glDrawElements(GL_TRIANGLES ,m->fn*3,GL_UNSIGNED_INT, &(*indices.begin()) ); glDisableClientState (GL_VERTEX_ARRAY); @@ -403,9 +404,9 @@ void DrawFill() //if( (nm==NMPerVert) && ((cm==CMNone) || (cm==CMPerMesh))) // if(curr_hints&HNUseVArray){ // glEnableClientState (GL_NORMAL_ARRAY ); - // glNormalPointer(GL_FLOAT,sizeof(MESH_TYPE::VertexType),&(m->vert[0].cN())); + // glNormalPointer(GL_FLOAT,sizeof(MeshType::VertexType),&(m->vert[0].cN())); // glEnableClientState (GL_VERTEX_ARRAY); - // glVertexPointer(3,GL_FLOAT,sizeof(MESH_TYPE::VertexType),&(m->vert[0].cP())); + // glVertexPointer(3,GL_FLOAT,sizeof(MeshType::VertexType),&(m->vert[0].cP())); // std::vector::iterator vi; // for(vi=TStripVED.begin();vi!=TStripVED.end();++vi) // glDrawElements(vi->glmode ,vi->len,GL_UNSIGNED_SHORT,&TStripVEI[vi->start] ); @@ -415,7 +416,7 @@ void DrawFill() // return; // } - //std::vector< MESH_TYPE::VertexType *>::iterator vi; + //std::vector< MeshType::VertexType *>::iterator vi; //glBegin(GL_TRIANGLE_STRIP); //if(nm == NMPerFace) fip=TStripF.begin(); @@ -436,6 +437,9 @@ void DrawFill() } else { + typename FACE_POINTER_CONTAINER::iterator fp; + FaceIterator fi; + short curtexname=-1; if(partial) fp = face_pointers.begin(); @@ -469,7 +473,7 @@ void DrawFill() while( (partial)?(fp!=face_pointers.end()):(fi!=m->face.end())) { - typename MESH_TYPE::FaceType & f = (partial)?(*(*fp)): *fi; + FaceType & f = (partial)?(*(*fp)): *fi; if(!f.IsD()) { @@ -533,82 +537,72 @@ void DrawFill() template void DrawWirePolygonal() { - - typename MESH_TYPE::FaceIterator fi; - - + if(cm == CMPerMesh) glColor(m->C()); + FaceIterator fi; typename FACE_POINTER_CONTAINER::iterator fp; - typename std::vector::iterator fip; + if(partial) + fp = face_pointers.begin(); + else + fi = m->face.begin(); - if(cm == CMPerMesh) - glColor(m->C()); + glBegin(GL_LINES); + while( (partial)?(fp!=face_pointers.end()):(fi!=m->face.end())) + { + typename MeshType::FaceType & f = (partial)?(*(*fp)): *fi; + + if(!f.IsD()) { - if(partial) - fp = face_pointers.begin(); - else - fi = m->face.begin(); - glBegin(GL_LINES); + if(nm == NMPerFace) glNormal(f.cN()); + if(cm == CMPerFace) glColor(f.C()); - while( (partial)?(fp!=face_pointers.end()):(fi!=m->face.end())) - { - typename MESH_TYPE::FaceType & f = (partial)?(*(*fp)): *fi; + if (!f.IsF(0)) { + if(nm == NMPerVert) glNormal(f.V(0)->cN()); + if(nm == NMPerWedge)glNormal(f.WN(0)); + if(cm == CMPerVert) glColor(f.V(0)->C()); + glVertex(f.V(0)->P()); - if(!f.IsD()) - { + if(nm == NMPerVert) glNormal(f.V(1)->cN()); + if(nm == NMPerWedge)glNormal(f.WN(1)); + if(cm == CMPerVert) glColor(f.V(1)->C()); + glVertex(f.V(1)->P()); + } - if(nm == NMPerFace) glNormal(f.cN()); - if(cm == CMPerFace) glColor(f.C()); + if (!f.IsF(1)) { + if(nm == NMPerVert) glNormal(f.V(1)->cN()); + if(nm == NMPerWedge)glNormal(f.WN(1)); + if(cm == CMPerVert) glColor(f.V(1)->C()); + glVertex(f.V(1)->P()); - if (!f.IsF(0)) { - if(nm == NMPerVert) glNormal(f.V(0)->cN()); - if(nm == NMPerWedge)glNormal(f.WN(0)); - if(cm == CMPerVert) glColor(f.V(0)->C()); - glVertex(f.V(0)->P()); + if(nm == NMPerVert) glNormal(f.V(2)->cN()); + if(nm == NMPerWedge)glNormal(f.WN(2)); + if(cm == CMPerVert) glColor(f.V(2)->C()); + glVertex(f.V(2)->P()); + } - if(nm == NMPerVert) glNormal(f.V(1)->cN()); - if(nm == NMPerWedge)glNormal(f.WN(1)); - if(cm == CMPerVert) glColor(f.V(1)->C()); - glVertex(f.V(1)->P()); - } + if (!f.IsF(2)) { + if(nm == NMPerVert) glNormal(f.V(2)->cN()); + if(nm == NMPerWedge)glNormal(f.WN(2)); + if(cm == CMPerVert) glColor(f.V(2)->C()); + glVertex(f.V(2)->P()); - if (!f.IsF(1)) { - if(nm == NMPerVert) glNormal(f.V(1)->cN()); - if(nm == NMPerWedge)glNormal(f.WN(1)); - if(cm == CMPerVert) glColor(f.V(1)->C()); - glVertex(f.V(1)->P()); - - if(nm == NMPerVert) glNormal(f.V(2)->cN()); - if(nm == NMPerWedge)glNormal(f.WN(2)); - if(cm == CMPerVert) glColor(f.V(2)->C()); - glVertex(f.V(2)->P()); - } - - if (!f.IsF(2)) { - if(nm == NMPerVert) glNormal(f.V(2)->cN()); - if(nm == NMPerWedge)glNormal(f.WN(2)); - if(cm == CMPerVert) glColor(f.V(2)->C()); - glVertex(f.V(2)->P()); - - if(nm == NMPerVert) glNormal(f.V(0)->cN()); - if(nm == NMPerWedge)glNormal(f.WN(0)); - if(cm == CMPerVert) glColor(f.V(0)->C()); - glVertex(f.V(0)->P()); - } - - } - - if(partial) - ++fp; - else - ++fi; - } - - glEnd(); + if(nm == NMPerVert) glNormal(f.V(0)->cN()); + if(nm == NMPerWedge)glNormal(f.WN(0)); + if(cm == CMPerVert) glColor(f.V(0)->C()); + glVertex(f.V(0)->P()); + } } + + if(partial) + ++fp; + else + ++fi; + } + + glEnd(); } /// Basic Point drawing fucntion @@ -616,11 +610,10 @@ void DrawWirePolygonal() template void DrawPointsBase() { - typename MESH_TYPE::VertexIterator vi; glBegin(GL_POINTS); if(cm==CMPerMesh) glColor(m->C()); - for(vi=m->vert.begin();vi!=m->vert.end();++vi)if(!(*vi).IsD()) + for(VertexIterator vi=m->vert.begin();vi!=m->vert.end();++vi)if(!(*vi).IsD()) { if(nm==NMPerVert) glNormal((*vi).cN()); if(cm==CMPerVert) glColor((*vi).C()); @@ -631,13 +624,14 @@ void DrawPointsBase() /// Utility function that computes in eyespace the current distance between the camera and the center of the bbox of the mesh double CameraDistance(){ - Point3 res; - Matrix44 mm; + CoordType res; + Matrix44 mm; glGetv(GL_MODELVIEW_MATRIX,mm); - Point3 c=m->bbox.Center(); + CoordType c=m->bbox.Center(); res=mm*c; return Norm(res); } + template void DrawPoints() { @@ -646,56 +640,62 @@ void DrawPoints() else glDisable(GL_POINT_SMOOTH); glPointSize(GetHintParamf(HNPPointSize)); if(GetHintParami(HNPPointDistanceAttenuation)>0) - { - float camDist = (float)CameraDistance(); - float quadratic[] = { 0.0f, 0.0f, 1.0f/(camDist*camDist) , 0.0f }; - glPointParameterfv( GL_POINT_DISTANCE_ATTENUATION, quadratic ); - glPointParameterf( GL_POINT_SIZE_MAX, 16.0f ); - glPointParameterf( GL_POINT_SIZE_MIN, 1.0f ); - } - else - { - float quadratic[] = { 1.0f, 0.0f, 0.0f}; - glPointParameterfv( GL_POINT_DISTANCE_ATTENUATION, quadratic ); - glPointSize(GetHintParamf(HNPPointSize)); - } + { + float camDist = (float)CameraDistance(); + float quadratic[] = { 0.0f, 0.0f, 1.0f/(camDist*camDist) , 0.0f }; + glPointParameterfv( GL_POINT_DISTANCE_ATTENUATION, quadratic ); + glPointParameterf( GL_POINT_SIZE_MAX, 16.0f ); + glPointParameterf( GL_POINT_SIZE_MIN, 1.0f ); + } + else + { + float quadratic[] = { 1.0f, 0.0f, 0.0f}; + glPointParameterfv( GL_POINT_DISTANCE_ATTENUATION, quadratic ); + glPointSize(GetHintParamf(HNPPointSize)); + } - if(m->vn!=(int)m->vert.size()) - { - DrawPointsBase(); - } + if(m->vn!=(int)m->vert.size()) + { + DrawPointsBase(); + } else { if(cm==CMPerMesh) glColor(m->C()); - - // Perfect case, no deleted stuff, - // draw the vertices using vertex arrays - if (nm==NMPerVert) + if (m->vert.size() != 0) + { + // Perfect case, no deleted stuff, + // draw the vertices using vertex arrays + if (nm==NMPerVert) { glEnableClientState (GL_NORMAL_ARRAY); - if (m->vert.size() != 0) - glNormalPointer(GL_FLOAT,sizeof(typename MESH_TYPE::VertexType),&(m->vert.begin()->N()[0])); + + if(sizeof(CoordType)==sizeof(float)*3) + glNormalPointer(GL_FLOAT,sizeof(VertexType),&(m->vert.begin()->N()[0])); + else + glNormalPointer(GL_DOUBLE,sizeof(VertexType),&(m->vert.begin()->N()[0])); } - if (cm==CMPerVert) + if (cm==CMPerVert) { glEnableClientState (GL_COLOR_ARRAY); - if (m->vert.size() != 0) - glColorPointer(4,GL_UNSIGNED_BYTE,sizeof(typename MESH_TYPE::VertexType),&(m->vert.begin()->C()[0])); + glColorPointer(4,GL_UNSIGNED_BYTE,sizeof(typename MeshType::VertexType),&(m->vert.begin()->C()[0])); } - glEnableClientState (GL_VERTEX_ARRAY); - if (m->vert.size() != 0) - glVertexPointer(3,GL_FLOAT,sizeof(typename MESH_TYPE::VertexType),&(m->vert.begin()->P()[0])); + glEnableClientState (GL_VERTEX_ARRAY); + if(sizeof(CoordType)==sizeof(float)*3) + glVertexPointer(3,GL_FLOAT,sizeof(VertexType),&(m->vert.begin()->P()[0])); + else + glVertexPointer(3,GL_DOUBLE,sizeof(VertexType),&(m->vert.begin()->P()[0])); - glDrawArrays(GL_POINTS,0,m->vn); + glDrawArrays(GL_POINTS,0,m->vn); - glDisableClientState (GL_VERTEX_ARRAY); - if (nm==NMPerVert) glDisableClientState (GL_NORMAL_ARRAY); - if (cm==CMPerVert) glDisableClientState (GL_COLOR_ARRAY); + glDisableClientState (GL_VERTEX_ARRAY); + if (nm==NMPerVert) glDisableClientState (GL_NORMAL_ARRAY); + if (cm==CMPerVert) glDisableClientState (GL_COLOR_ARRAY); + } } glPopAttrib(); - return; + return; } void DrawHidden() @@ -773,7 +773,7 @@ void DrawTexture_NPV_TPW2() { unsigned int texname=(*(m->face.begin())).WT(0).n(0); glBindTexture(GL_TEXTURE_2D,TMId[texname]); - typename MESH_TYPE::FaceIterator fi; + typename MeshType::FaceIterator fi; glBegin(GL_TRIANGLES); for(fi=m->face.begin();fi!=m->face.end();++fi)if(!(*fi).IsD()){ if(texname!=(*fi).WT(0).n(0)) { @@ -807,9 +807,9 @@ void DrawTexture_NPV_TPW2() { int tot=sizeof(GlTrimesh); tot+=sizeof(mesh_type::edge_type)*edge.size(); - tot+=sizeof(MESH_TYPE::VertexType *) * EStrip.size(); - tot+=sizeof(MESH_TYPE::VertexType *) * TStrip.size(); - tot+=sizeof(MESH_TYPE::FaceType *) * TStripF.size(); + tot+=sizeof(MeshType::VertexType *) * EStrip.size(); + tot+=sizeof(MeshType::VertexType *) * TStrip.size(); + tot+=sizeof(MeshType::FaceType *) * TStripF.size(); return tot; }*/ @@ -835,7 +835,7 @@ void DrawWire() glPushAttrib(GL_ENABLE_BIT); glDisable(GL_LIGHTING); glBegin(GL_LINES); - for(typename mesh_type::EdgeIterator ei=m->edge.begin();ei!=m->edge.end(); ++ei) + for(EdgeIterator ei=m->edge.begin();ei!=m->edge.end(); ++ei) { glVertex((*ei).V(0)->P()); glVertex((*ei).V(1)->P()); @@ -847,7 +847,7 @@ void DrawWire() // if(!HasEdges()) ComputeEdges(); //if(cm==CMPerMesh) glColor(m->C()); - //std::vector< MESH_TYPE::VertexType *>::iterator vi; + //std::vector< MeshType::VertexType *>::iterator vi; //glBegin(GL_LINE_STRIP); //for(vi=EStrip.begin();vi!=EStrip.end(); ++vi){ // if((*vi)){