35#if defined(__APPLE_CC__) && __APPLE_CC__ > 4000 && __APPLE_CC__ < 5450 && !defined(__INTEL_COMPILER)
36 typedef GLvoid (*tessfuncptr_t)(...);
37#elif defined(__linux__) || defined(__FreeBSD__) || defined( __OpenBSD__ ) || defined(__sun) || defined (__CYGWIN__) || defined (__APPLE__)
38 typedef GLvoid (*tessfuncptr_t)();
40 typedef GLvoid (
CALLBACK *tessfuncptr_t)();
42 #error "Error - need to define type tessfuncptr_t for this platform/compiler"
60 fVertices(buffer.fPnts, buffer.fPnts + 3 * buffer.NbPnts()),
74 descSize += pols[j] + 1;
80 for (
UInt_t numPol = 0, currInd = 0, j = 1; numPol <
fNbPols; ++numPol)
82 Int_t segmentInd = pols[j] + j;
83 Int_t segmentCol = pols[j];
86 Int_t s2 = pols[segmentInd];
90 Int_t numPnts[3] = {0};
92 if (segEnds[0] == segEnds[2]) {
93 numPnts[0] = segEnds[1], numPnts[1] = segEnds[0], numPnts[2] = segEnds[3];
94 }
else if (segEnds[0] == segEnds[3]) {
95 numPnts[0] = segEnds[1], numPnts[1] = segEnds[0], numPnts[2] = segEnds[2];
96 }
else if (segEnds[1] == segEnds[2]) {
97 numPnts[0] = segEnds[0], numPnts[1] = segEnds[1], numPnts[2] = segEnds[3];
99 numPnts[0] = segEnds[0], numPnts[1] = segEnds[1], numPnts[2] = segEnds[2];
103 Int_t sizeInd = currInd++;
107 Int_t lastAdded = numPnts[2];
110 for (; segmentInd != end; segmentInd--) {
111 segEnds[0] =
segs[pols[segmentInd] * 3 + 1];
112 segEnds[1] =
segs[pols[segmentInd] * 3 + 2];
113 if (segEnds[0] == lastAdded) {
115 lastAdded = segEnds[1];
118 lastAdded = segEnds[0];
138 UInt_t nv = mesh->NumberOfVertices();
142 for (i = 0; i < nv; ++i) {
147 fNbPols = mesh->NumberOfPolys();
151 for (i = 0; i <
fNbPols; ++i) descSize += mesh->SizeOfPoly(i) + 1;
155 for (
UInt_t polyIndex = 0; polyIndex <
fNbPols; ++polyIndex) {
156 UInt_t polySize = mesh->SizeOfPoly(polyIndex);
160 for(i = 0; i < polySize; ++i)
fPolyDesc.push_back(mesh->GetVertexIndex(polyIndex, i));
178 class TriangleCollector
196 void process_vertex(
Int_t vi)
213 add_triangle(fV0, fV1, vi);
217 case GL_TRIANGLE_STRIP:
219 if (fNVertices % 2 == 0)
220 add_triangle(fV1, fV0, vi);
222 add_triangle(fV0, fV1, vi);
227 case GL_TRIANGLE_FAN:
229 add_triangle(fV0, fV1, vi);
235 throw std::runtime_error(
"TGLFaceSet::EnforceTriangles unexpected type in tess_vertex callback.");
241 TriangleCollector(GLUtesselator* ts) :
242 fNTriangles(0), fNVertices(0), fV0(-1), fV1(-1),
fType(GL_NONE)
244 gluTessCallback(ts, (GLenum)GLU_TESS_BEGIN_DATA, (tessfuncptr_t)((
void*)tess_begin));
245 gluTessCallback(ts, (GLenum)GLU_TESS_VERTEX_DATA, (tessfuncptr_t)((
void*)tess_vertex));
246 gluTessCallback(ts, (GLenum)GLU_TESS_COMBINE_DATA, (tessfuncptr_t)((
void*)tess_combine));
247 gluTessCallback(ts, (GLenum)GLU_TESS_END_DATA, (tessfuncptr_t)((
void*)tess_end));
250 Int_t GetNTrianlges() {
return fNTriangles; }
251 std::vector<Int_t>& RefPolyDesc() {
return fPolyDesc; }
253 static void tess_begin(GLenum
type, TriangleCollector* tc)
256 tc->fV0 = tc->fV1 = -1;
260 static void tess_vertex(
Int_t* vi, TriangleCollector* tc)
262 tc->process_vertex(*vi);
265 static void tess_combine(GLdouble [3],
void* [4],
266 GLfloat [4],
void** ,
269 throw std::runtime_error(
"TGLFaceSet::EnforceTriangles tesselator requested vertex combining -- not supported yet.");
272 static void tess_end(TriangleCollector* tc)
278 GLUtesselator *tess = gluNewTess();
279 if (!tess)
throw std::bad_alloc();
281 TriangleCollector tc(tess);
289 Int_t npoints = pols[j++];
291 gluTessBeginPolygon(tess, &tc);
292 gluTessBeginContour(tess);
294 for (
Int_t k = 0; k < npoints; ++k, ++j)
296 gluTessVertex(tess, (
Double_t*) pnts + pols[j] * 3, (GLvoid*) &pols[j]);
299 gluTessEndContour(tess);
300 gluTessEndPolygon(tess);
326 Int_t npoints = pols[j++];
328 if (tessObj && npoints > 4) {
329 gluBeginPolygon(tessObj);
330 gluNextContour(tessObj, (GLenum)GLU_UNKNOWN);
331 glNormal3dv(normals + i * 3);
333 for (
Int_t k = 0; k < npoints; ++k, ++j) {
334 gluTessVertex(tessObj, (
Double_t *)pnts + pols[j] * 3, (
Double_t *)pnts + pols[j] * 3);
336 gluEndPolygon(tessObj);
339 glNormal3dv(normals + i * 3);
341 for (
Int_t k = 0; k < npoints; ++k, ++j) {
342 glVertex3dv(pnts + pols[j] * 3);
390 return dx < 1
e-10 && dy < 1
e-10 && dz < 1
e-10;
408 pnts + norm[2] * 3, &
fNormals[i * 3]);
412 while (j < (
UInt_t)polEnd) {
418 pnts + norm[2] * 3, &
fNormals[i * 3]);
static double p3(double t, double a, double b, double c, double d)
static double p1(double t, double a, double b)
static double p2(double t, double a, double b, double c)
void Info(const char *location, const char *msgfmt,...)
Generic 3D primitive description class.
Implements a native ROOT-GL representation of an arbitrary set of polygons.
void EnforceTriangles()
Use GLU tesselator to replace all polygons with N > 3 with triangles.
static void SetEnforceTriangles(Bool_t e)
Set state of static flag EnforceTriangles.
std::vector< Int_t > fPolyDesc
std::vector< Double_t > fNormals
Int_t CheckPoints(const Int_t *source, Int_t *dest) const
CheckPoints.
void SetFromMesh(const RootCsg::TBaseMesh *m)
Should only be done on an empty faceset object.
virtual void DirectDraw(TGLRnrCtx &rnrCtx) const
Debug tracing.
TGLFaceSet(const TBuffer3D &buffer)
constructor
void CalculateNormals()
CalculateNormals.
std::vector< Double_t > fVertices
static Bool_t Eq(const Double_t *p1, const Double_t *p2)
test equality
static Bool_t fgEnforceTriangles
static Bool_t GetEnforceTriangles()
Get current state of static flag EnforceTriangles.
Abstract logical shape - a GL 'drawable' - base for all shapes - faceset sphere etc.
The TGLRnrCtx class aggregates data for a given redering context as needed by various parts of the RO...
static GLUtesselator * GetDrawTesselator3dv()
Returns a tesselator for direct drawing when using 3-vertices with double precision.
std::string GetName(const std::string &scope_name)
T * Normal2Plane(const T v1[3], const T v2[3], const T v3[3], T normal[3])
Calculate a normal vector of a plane.
#define dest(otri, vertexptr)