33 namespace Experimental {
41 class TestTriangleHandler {
43 static void tess_begin(GLenum type, TriangleCollector *tc);
44 static void tess_vertex(Int_t *vi, TriangleCollector *tc);
46 tess_combine(GLdouble coords[3],
void *vertex_data[4], GLfloat weight[4],
void **outData, TriangleCollector *tc);
47 static void tess_end(TriangleCollector *tc);
54 void TestTriangleHandler::tess_begin(GLenum type, TriangleCollector *tc)
57 tc->fV0 = tc->fV1 = -1;
64 void TestTriangleHandler::tess_vertex(Int_t *vi, TriangleCollector *tc)
66 tc->process_vertex(*vi);
72 void TestTriangleHandler::tess_combine(GLdouble [3],
void * [4],
73 GLfloat [4],
void ** ,
76 throw std::runtime_error(
"GLU::TriangleCollector tesselator requested vertex combining -- not supported yet.");
82 void TestTriangleHandler::tess_end(TriangleCollector *tc)
95 TriangleCollector::TriangleCollector()
99 if (!fTess)
throw std::bad_alloc();
101 gluTessCallback(fTess, (GLenum)GLU_TESS_BEGIN_DATA, (_GLUfuncptr) TestTriangleHandler::tess_begin);
102 gluTessCallback(fTess, (GLenum)GLU_TESS_VERTEX_DATA, (_GLUfuncptr) TestTriangleHandler::tess_vertex);
103 gluTessCallback(fTess, (GLenum)GLU_TESS_COMBINE_DATA, (_GLUfuncptr) TestTriangleHandler::tess_combine);
104 gluTessCallback(fTess, (GLenum)GLU_TESS_END_DATA, (_GLUfuncptr) TestTriangleHandler::tess_end);
110 TriangleCollector::~TriangleCollector()
112 gluDeleteTess(fTess);
118 void TriangleCollector::add_triangle(Int_t v0, Int_t v1, Int_t v2)
120 fPolyDesc.emplace_back(3);
121 fPolyDesc.emplace_back(v0);
122 fPolyDesc.emplace_back(v1);
123 fPolyDesc.emplace_back(v2);
130 void ROOT::Experimental::EveGlu::TriangleCollector::process_vertex(Int_t vi)
147 add_triangle(fV0, fV1, vi);
151 case GL_TRIANGLE_STRIP:
153 if (fNVertices % 2 == 0)
154 add_triangle(fV1, fV0, vi);
156 add_triangle(fV0, fV1, vi);
161 case GL_TRIANGLE_FAN:
163 add_triangle(fV0, fV1, vi);
169 throw std::runtime_error(
"GLU::TriangleCollector unexpected type in tess_vertex callback.");
177 void ROOT::Experimental::EveGlu::TriangleCollector::ProcessData(
const std::vector<Double_t>& verts,
178 const std::vector<Int_t> & polys,
181 const Double_t *pnts = &verts[0];
182 const Int_t *pols = &polys[0];
184 for (Int_t i = 0, j = 0; i < n_polys; ++i)
186 Int_t n_points = pols[j++];
188 gluTessBeginPolygon(fTess,
this);
189 gluTessBeginContour(fTess);
191 for (Int_t k = 0; k < n_points; ++k, ++j)
193 gluTessVertex(fTess, (Double_t*) pnts + pols[j] * 3, (GLvoid*) &pols[j]);
196 gluTessEndContour(fTess);
198 static int except_cnt = 0;
201 gluTessEndPolygon(fTess);
203 if (except_cnt++ < 100) printf(
"Catch exception gluTessEndPolygon!\n");