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");