From 96797011c1840db4317cab135370e192118db36d Mon Sep 17 00:00:00 2001 From: Pierre Kraemer Date: Wed, 14 Dec 2011 16:51:30 +0100 Subject: [PATCH] update mapRender : initPrimitives takes position for ear triangulation --- Apps/Examples/Tests/concave_rendering.cpp | 7 +- include/Algo/Render/GL2/mapRender.h | 19 ++- include/Algo/Render/GL2/mapRender.hpp | 118 ++++++++++++------- include/Utils/Shaders/shaderScalarField.frag | 2 +- src/Algo/Render/mapRender.cpp | 1 - 5 files changed, 86 insertions(+), 61 deletions(-) diff --git a/Apps/Examples/Tests/concave_rendering.cpp b/Apps/Examples/Tests/concave_rendering.cpp index db1deda8d..de38e37a0 100644 --- a/Apps/Examples/Tests/concave_rendering.cpp +++ b/Apps/Examples/Tests/concave_rendering.cpp @@ -438,10 +438,9 @@ int main(int argc, char **argv) sqt.m_positionVBO->updateData(position); // update des primitives du renderer - sqt.m_render->initPrimitives(myMap, allDarts, Algo::Render::GL2::TRIANGLES); - sqt.m_render->initPrimitives(myMap, allDarts, Algo::Render::GL2::LINES); - sqt.m_render->initPrimitives(myMap, allDarts, Algo::Render::GL2::POINTS); - + sqt.m_render->initPrimitives(myMap, allDarts, Algo::Render::GL2::TRIANGLES, &position); + sqt.m_render->initPrimitives(myMap, allDarts, Algo::Render::GL2::LINES, &position); + sqt.m_render->initPrimitives(myMap, allDarts, Algo::Render::GL2::POINTS, &position); // show final pour premier redraw sqt.show(); diff --git a/include/Algo/Render/GL2/mapRender.h b/include/Algo/Render/GL2/mapRender.h index e03a19bc8..7119816a8 100644 --- a/include/Algo/Render/GL2/mapRender.h +++ b/include/Algo/Render/GL2/mapRender.h @@ -78,7 +78,6 @@ enum bufferIndex SIZE_BUFFER } ; - class MapRender { @@ -137,8 +136,6 @@ protected: }; - - public: /** * Constructor @@ -159,7 +156,6 @@ public: buffer_array get_nb_index_buffer() { return std::make_pair(m_nbIndices, SIZE_BUFFER); } protected: - /** * addition of indices table of one triangle * @param d a dart of the triangle @@ -169,29 +165,28 @@ protected: void addTri(typename PFP::MAP& map, Dart d, std::vector& tableIndices) ; template - inline void addEarTri(typename PFP::MAP& map, Dart d, std::vector& tableIndices); + inline void addEarTri(typename PFP::MAP& map, Dart d, std::vector& tableIndices, const typename PFP::TVEC3* position); template float computeEarAngle(const typename PFP::VEC3& P1, const typename PFP::VEC3& P2, const typename PFP::VEC3& P3, const typename PFP::VEC3& normalPoly); template - bool computeEarIntersection(AttributeHandler& position, VertexPoly* vp, const typename PFP::VEC3& normalPoly); + bool computeEarIntersection(const typename PFP::TVEC3& position, VertexPoly* vp, const typename PFP::VEC3& normalPoly); template - void recompute2Ears( AttributeHandler& position, VertexPoly* vp, const typename PFP::VEC3& normalPoly, VPMS& ears, bool convex); + void recompute2Ears(const typename PFP::TVEC3& position, VertexPoly* vp, const typename PFP::VEC3& normalPoly, VPMS& ears, bool convex); template bool inTriangle(const VEC3& P, const VEC3& normal, const VEC3& Ta, const VEC3& Tb, const VEC3& Tc); -public: /** * creation of indices table of triangles (optimized order) * @param tableIndices the table where indices are stored */ template - void initTriangles(typename PFP::MAP& map, const FunctorSelect& good, std::vector& tableIndices, unsigned int thread = 0) ; + void initTriangles(typename PFP::MAP& map, const FunctorSelect& good, std::vector& tableIndices, const typename PFP::TVEC3* position, unsigned int thread = 0) ; template - void initTrianglesOptimized(typename PFP::MAP& map, const FunctorSelect& good, std::vector& tableIndices, unsigned int thread = 0) ; + void initTrianglesOptimized(typename PFP::MAP& map, const FunctorSelect& good, std::vector& tableIndices, const typename PFP::TVEC3* position, unsigned int thread = 0) ; /** * creation of indices table of lines (optimized order) @@ -216,6 +211,7 @@ public: template void initBoundaries(typename PFP::MAP& map, const FunctorSelect& good, std::vector& tableIndices, unsigned int thread = 0) ; +public: /** * initialization of the VBO indices primitives * computed by a traversal of the map @@ -224,6 +220,9 @@ public: template void initPrimitives(typename PFP::MAP& map, const FunctorSelect& good, int prim, bool optimized = true, unsigned int thread = 0) ; + template + void initPrimitives(typename PFP::MAP& map, const FunctorSelect& good, int prim, const typename PFP::TVEC3* position, bool optimized = true, unsigned int thread = 0) ; + /** * initialization of the VBO indices primitives * using the given table diff --git a/include/Algo/Render/GL2/mapRender.hpp b/include/Algo/Render/GL2/mapRender.hpp index 8ee264d91..898f71aa1 100644 --- a/include/Algo/Render/GL2/mapRender.hpp +++ b/include/Algo/Render/GL2/mapRender.hpp @@ -71,7 +71,7 @@ bool MapRender::inTriangle(const VEC3& P, const VEC3& normal, const VEC3& Ta, c } template -void MapRender::recompute2Ears( AttributeHandler& position, VertexPoly* vp, const typename PFP::VEC3& normalPoly, VPMS& ears, bool convex) +void MapRender::recompute2Ears(const typename PFP::TVEC3& position, VertexPoly* vp, const typename PFP::VEC3& normalPoly, VPMS& ears, bool convex) { VertexPoly* vprev = vp->prev; VertexPoly* vp2 = vp->next; @@ -151,7 +151,7 @@ float MapRender::computeEarAngle(const typename PFP::VEC3& P1, const typename PF } template -bool MapRender::computeEarIntersection(AttributeHandler& position, VertexPoly* vp, const typename PFP::VEC3& normalPoly) +bool MapRender::computeEarIntersection(const typename PFP::TVEC3& position, VertexPoly* vp, const typename PFP::VEC3& normalPoly) { VertexPoly* endV = vp->prev; @@ -175,20 +175,19 @@ bool MapRender::computeEarIntersection(AttributeHandler& pos } template -inline void MapRender::addEarTri(typename PFP::MAP& map, Dart d, std::vector& tableIndices) +inline void MapRender::addEarTri(typename PFP::MAP& map, Dart d, std::vector& tableIndices, const typename PFP::TVEC3* pos) { bool(*fn_pt1)(VertexPoly*,VertexPoly*) = &(MapRender::cmpVP); VPMS ears(fn_pt1); - - AttributeHandler position = map.template getAttribute(VERTEX,"position"); + const typename PFP::TVEC3& position = *pos ; // compute normal to polygon typename PFP::VEC3 normalPoly = Algo::Geometry::newellNormal(map, d, position); // first pass create polygon in chained list witht angle computation - VertexPoly* vpp=NULL; - VertexPoly* prem=NULL; + VertexPoly* vpp = NULL; + VertexPoly* prem = NULL; unsigned int nbv = 0; unsigned int nbe = 0; Dart a = d; @@ -196,27 +195,27 @@ inline void MapRender::addEarTri(typename PFP::MAP& map, Dart d, std::vector(P1,P2,P3,normalPoly); - VertexPoly* vp = new VertexPoly(map.getEmbedding(VERTEX,b),val,(P3-P1).norm2(),vpp); + float val = computeEarAngle(P1, P2, P3, normalPoly); + VertexPoly* vp = new VertexPoly(map.getEmbedding(VERTEX, b), val, (P3-P1).norm2(), vpp); - if (vp->value <5.0f) + if (vp->value < 5.0f) nbe++; - if (vpp==NULL) + if (vpp == NULL) prem = vp; vpp = vp; a = b; b = c; c = map.phi1(c); nbv++; - }while (a!=d); + }while (a != d); - VertexPoly::close(prem,vpp); + VertexPoly::close(prem, vpp); - bool convex = nbe==nbv; + bool convex = nbe == nbv; if (convex) { // second pass with no test of intersections with polygons @@ -234,7 +233,7 @@ inline void MapRender::addEarTri(typename PFP::MAP& map, Dart d, std::vectorvalue <5.0f) - computeEarIntersection(position,vpp,normalPoly); + computeEarIntersection(position, vpp, normalPoly); vpp->ear = ears.insert(vpp); vpp = vpp->next; } @@ -286,40 +285,43 @@ inline void MapRender::addTri(typename PFP::MAP& map, Dart d, std::vector(map, d, tableIndices); - return; - } - - tableIndices.push_back(map.getEmbedding(VERTEX, d)); - tableIndices.push_back(map.getEmbedding(VERTEX, b)); - tableIndices.push_back(map.getEmbedding(VERTEX, c)); - // loop to cut a polygon in triangle on the fly (works only with convex faces) -// do -// { -// tableIndices.push_back(map.getEmbedding(VERTEX, d)); -// tableIndices.push_back(map.getEmbedding(VERTEX, b)); -// tableIndices.push_back(map.getEmbedding(VERTEX, c)); -// b = c; -// c = map.phi1(b); -// } while (c != d); - + do + { + tableIndices.push_back(map.getEmbedding(VERTEX, d)); + tableIndices.push_back(map.getEmbedding(VERTEX, b)); + tableIndices.push_back(map.getEmbedding(VERTEX, c)); + b = c; + c = map.phi1(b); + } while (c != d); } template -void MapRender::initTriangles(typename PFP::MAP& map, const FunctorSelect& good, std::vector& tableIndices, unsigned int thread) +void MapRender::initTriangles(typename PFP::MAP& map, const FunctorSelect& good, std::vector& tableIndices, const typename PFP::TVEC3* position, unsigned int thread) { tableIndices.reserve(4 * map.getNbDarts() / 3); TraversorF trav(map, good, thread); - for (Dart d = trav.begin(); d != trav.end(); d = trav.next()) - addTri(map, d, tableIndices); + + if(position == NULL) + { + for (Dart d = trav.begin(); d != trav.end(); d = trav.next()) + addTri(map, d, tableIndices); + } + else + { + for (Dart d = trav.begin(); d != trav.end(); d = trav.next()) + { + if(map.faceDegree(d) == 3) + addTri(map, d, tableIndices); + else + addEarTri(map, d, tableIndices, position); + } + } } template -void MapRender::initTrianglesOptimized(typename PFP::MAP& map, const FunctorSelect& good, std::vector& tableIndices, unsigned int thread) +void MapRender::initTrianglesOptimized(typename PFP::MAP& map, const FunctorSelect& good, std::vector& tableIndices, const typename PFP::TVEC3* position, unsigned int thread) { #define LIST_SIZE 20 DartMarker m(map, thread); @@ -335,7 +337,17 @@ void MapRender::initTrianglesOptimized(typename PFP::MAP& map, const FunctorSele std::list bound; if (good(dd) && !map.isBoundaryMarked(dd)) - addTri(map, dd, tableIndices); + { + if(position == NULL) + addTri(map, dd, tableIndices); + else + { + if(map.faceDegree(dd) == 3) + addTri(map, dd, tableIndices); + else + addEarTri(map, dd, tableIndices, position); + } + } m.markOrbit(FACE, dd); bound.push_back(dd); int nb = 1; @@ -351,7 +363,17 @@ void MapRender::initTrianglesOptimized(typename PFP::MAP& map, const FunctorSele if (!m.isMarked(f)) { if (good(f) && !map.isBoundaryMarked(f)) - addTri(map, f, tableIndices); + { + if(position == NULL) + addTri(map, f, tableIndices); + else + { + if(map.faceDegree(f) == 3) + addTri(map, f, tableIndices); + else + addEarTri(map, f, tableIndices, position); + } + } m.markOrbit(FACE, f); bound.push_back(map.phi1(f)); ++nb; @@ -464,6 +486,12 @@ void MapRender::initPoints(typename PFP::MAP& map, const FunctorSelect& good, st template void MapRender::initPrimitives(typename PFP::MAP& map, const FunctorSelect& good, int prim, bool optimized, unsigned int thread) +{ + initPrimitives(map, good, prim, NULL, optimized, thread) ; +} + +template +void MapRender::initPrimitives(typename PFP::MAP& map, const FunctorSelect& good, int prim, const typename PFP::TVEC3* position, bool optimized, unsigned int thread) { std::vector tableIndices; @@ -487,9 +515,9 @@ void MapRender::initPrimitives(typename PFP::MAP& map, const FunctorSelect& good break; case TRIANGLES: if(optimized) - initTrianglesOptimized(map, good, tableIndices, thread); + initTrianglesOptimized(map, good, tableIndices, position, thread); else - initTriangles(map, good, tableIndices, thread) ; + initTriangles(map, good, tableIndices, position, thread) ; m_nbIndices[TRIANGLE_INDICES] = tableIndices.size(); vbo_ind = m_indexBuffers[TRIANGLE_INDICES]; break; diff --git a/include/Utils/Shaders/shaderScalarField.frag b/include/Utils/Shaders/shaderScalarField.frag index f8c2c1661..5f410276a 100644 --- a/include/Utils/Shaders/shaderScalarField.frag +++ b/include/Utils/Shaders/shaderScalarField.frag @@ -6,7 +6,7 @@ VARYING_FRAG float scalar; FRAG_OUT_DEF; void main() { - float s = scalar * 50.0; + float s = scalar * 30.0; if( s - floor(s) <= 0.01 ) gl_FragColor = vec4(0.0); else diff --git a/src/Algo/Render/mapRender.cpp b/src/Algo/Render/mapRender.cpp index d62d97896..33b9e19a2 100644 --- a/src/Algo/Render/mapRender.cpp +++ b/src/Algo/Render/mapRender.cpp @@ -37,7 +37,6 @@ namespace Render namespace GL2 { - MapRender::MapRender() { glGenBuffersARB(SIZE_BUFFER, m_indexBuffers) ; -- GitLab