4 #include <Reve/FrameBoxGL.h>
6 #include <TGLDrawFlags.h>
13 //______________________________________________________________________
17 ClassImp(OldQuadSetGL)
19 /**************************************************************************/
21 OldQuadSetGL::OldQuadSetGL() : TGLObject()
23 // fCached = false; // Disable DL.
26 OldQuadSetGL::~OldQuadSetGL()
29 /**************************************************************************/
31 Bool_t OldQuadSetGL::SetModel(TObject* obj)
33 return SetModelCheckClass(obj, Reve::OldQuadSet::Class());
36 void OldQuadSetGL::SetBBox()
38 SetAxisAlignedBBox(((OldQuadSet*)fExternalObj)->AssertBBox());
41 /**************************************************************************/
43 void OldQuadSetGL::DirectDraw(const TGLDrawFlags & ) const
45 // printf("OldQuadSetGLRenderer::DirectDraw Style %d, LOD %d\n", flags.Style(), flags.LOD());
47 OldQuadSet& Q = * (OldQuadSet*) fExternalObj;
49 glPushAttrib(GL_ENABLE_BIT | GL_POLYGON_BIT);
51 glDisable(GL_LIGHTING);
52 glColorMaterial(GL_FRONT_AND_BACK, GL_DIFFUSE);
53 glEnable(GL_COLOR_MATERIAL);
54 glPolygonMode(GL_FRONT, GL_LINE);
55 glPolygonMode(GL_BACK, GL_LINE);
56 glDisable(GL_CULL_FACE);
58 Float_t c[4]; glGetFloatv(GL_CURRENT_COLOR, c);
59 // UChar_t alpha = (UChar_t)(255*c[3]);
62 for(std::vector<Quad>::iterator q=Q.fQuads.begin(); q!=Q.fQuads.end(); ++q) {
63 UChar_t* c = (UChar_t*) &q->color;
64 //glColor4ub(c[0], c[1], c[2], (c[3]*alpha) >> 8);
65 glColor3ub(c[0], c[1], c[2]);
66 glVertex3fv(q->vertices);
67 glVertex3fv(q->vertices + 3);
68 glVertex3fv(q->vertices + 6);
69 glVertex3fv(q->vertices + 9);
77 /**************************************************************************/
78 /**************************************************************************/
79 /**************************************************************************/
80 /**************************************************************************/
82 //______________________________________________________________________
88 /**************************************************************************/
90 QuadSetGL::QuadSetGL() : TGLObject(), fM(0)
92 // fCached = false; // Disable DL.
95 QuadSetGL::~QuadSetGL()
98 /**************************************************************************/
100 Bool_t QuadSetGL::SetModel(TObject* obj)
102 Bool_t ok = SetModelCheckClass(obj, Reve::QuadSet::Class());
103 fM = ok ? dynamic_cast<Reve::QuadSet*>(obj) : 0;
107 void QuadSetGL::SetBBox()
109 SetAxisAlignedBBox(fM->AssertBBox());
112 /**************************************************************************/
114 inline Bool_t QuadSetGL::SetupColor(const QuadSet::QuadBase& q) const
116 if (fM->fValueIsColor)
118 glColor4ubv((UChar_t*) & q.fValue);
124 Bool_t visible = fM->fPalette->ColorFromValue(q.fValue, fM->fDefaultValue, c);
131 /**************************************************************************/
133 void QuadSetGL::DirectDraw(const TGLDrawFlags & flags) const
135 static const Exc_t eH("QuadSetGL::DirectDraw ");
137 // printf("QuadSetGLRenderer::DirectDraw Style %d, LOD %d\n", flags.Style(), flags.LOD());
142 FrameBoxGL::Render(mQ.fFrame);
144 if (mQ.fPlex.Size() == 0)
146 if ( ! mQ.fValueIsColor && mQ.fPalette == 0)
151 glPushAttrib(GL_ENABLE_BIT | GL_POLYGON_BIT);
152 glColorMaterial(GL_FRONT_AND_BACK, GL_DIFFUSE);
153 glEnable(GL_COLOR_MATERIAL);
154 glDisable(GL_CULL_FACE);
156 if (mQ.fRenderMode == QuadSet::RM_Fill)
157 glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
158 else if (mQ.fRenderMode == QuadSet::RM_Line)
159 glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
161 if (mQ.fDisableLigting) glDisable(GL_LIGHTING);
163 if (mQ.fQuadType < QuadSet::QT_Rectangle_End) RenderQuads(flags);
164 else if (mQ.fQuadType < QuadSet::QT_Line_End) RenderLines(flags);
165 else if (mQ.fQuadType < QuadSet::QT_Hexagon_End) RenderHexagons(flags);
172 void QuadSetGL::RenderQuads(const TGLDrawFlags &flags) const
174 static const Exc_t eH("QuadSetGL::RenderQuads ");
178 GLenum primitiveType;
179 if (mQ.fRenderMode != QuadSet::RM_Line)
181 primitiveType = GL_QUADS;
182 if (mQ.fQuadType == QuadSet::QT_FreeQuad)
183 glEnable(GL_NORMALIZE);
187 primitiveType = GL_LINE_LOOP;
190 VoidCPlex::iterator qi(mQ.fPlex);
192 if (flags.SecSelection()) glPushName(0);
194 switch (mQ.fQuadType)
197 case QuadSet::QT_FreeQuad:
199 Float_t e1[3], e2[3], normal[3];
201 QuadSet::QFreeQuad& q = * (QuadSet::QFreeQuad*) qi();
204 Float_t* p = q.fVertices;
205 e1[0] = p[3] - p[0]; e1[1] = p[4] - p[1]; e1[2] = p[5] - p[2];
206 e2[0] = p[6] - p[0]; e2[1] = p[7] - p[1]; e2[2] = p[8] - p[2];
207 TMath::Cross(e1, e2, normal);
208 if (flags.SecSelection()) glLoadName(qi.index());
209 glBegin(primitiveType);
221 case QuadSet::QT_RectangleXY:
224 QuadSet::QRect& q = * (QuadSet::QRect*) qi();
227 if (flags.SecSelection()) glLoadName(qi.index());
228 glBegin(primitiveType);
229 glVertex3f(q.fX, q.fY, q.fZ);
230 glVertex3f(q.fX + q.fW, q.fY, q.fZ);
231 glVertex3f(q.fX + q.fW, q.fY + q.fH, q.fZ);
232 glVertex3f(q.fX, q.fY + q.fH, q.fZ);
239 case QuadSet::QT_RectangleXYFixedDim:
241 const Float_t& w = mQ.fDefWidth;
242 const Float_t& h = mQ.fDefHeight;
244 QuadSet::QRectFixDim& q = * (QuadSet::QRectFixDim*) qi();
247 if (flags.SecSelection()) glLoadName(qi.index());
248 glBegin(primitiveType);
249 glVertex3f(q.fX, q.fY, q.fZ);
250 glVertex3f(q.fX + w, q.fY, q.fZ);
251 glVertex3f(q.fX + w, q.fY + h, q.fZ);
252 glVertex3f(q.fX, q.fY + h, q.fZ);
259 case QuadSet::QT_RectangleXYFixedZ:
261 const Float_t& z = mQ.fDefCoord;
263 QuadSet::QRectFixC& q = * (QuadSet::QRectFixC*) qi();
266 if (flags.SecSelection()) glLoadName(qi.index());
267 glBegin(primitiveType);
268 glVertex3f(q.fX, q.fY, z);
269 glVertex3f(q.fX + q.fW, q.fY, z);
270 glVertex3f(q.fX + q.fW, q.fY + q.fH, z);
271 glVertex3f(q.fX, q.fY + q.fH, z);
278 case QuadSet::QT_RectangleXZFixedY:
280 const Float_t& z = mQ.fDefCoord;
282 QuadSet::QRectFixC& q = * (QuadSet::QRectFixC*) qi();
285 if (flags.SecSelection()) glLoadName(qi.index());
286 glBegin(primitiveType);
287 glVertex3f(q.fX, z, q.fY);
288 glVertex3f(q.fX + q.fW, z, q.fY);
289 glVertex3f(q.fX + q.fW, z, q.fY + q.fH);
290 glVertex3f(q.fX, z, q.fY + q.fH);
297 case QuadSet::QT_RectangleXYFixedDimZ:
299 const Float_t& z = mQ.fDefCoord;
300 const Float_t& w = mQ.fDefWidth;
301 const Float_t& h = mQ.fDefHeight;
303 QuadSet::QRectFixDimC& q = * (QuadSet::QRectFixDimC*) qi();
306 if (flags.SecSelection()) glLoadName(qi.index());
307 glBegin(primitiveType);
308 glVertex3f(q.fX, q.fY, z);
309 glVertex3f(q.fX + w, q.fY, z);
310 glVertex3f(q.fX + w, q.fY + h, z);
311 glVertex3f(q.fX, q.fY + h, z);
318 case QuadSet::QT_RectangleXZFixedDimY:
320 const Float_t& z = mQ.fDefCoord;
321 const Float_t& w = mQ.fDefWidth;
322 const Float_t& h = mQ.fDefHeight;
324 QuadSet::QRectFixDimC& q = * (QuadSet::QRectFixDimC*) qi();
327 if (flags.SecSelection()) glLoadName(qi.index());
328 glBegin(primitiveType);
329 glVertex3f(q.fX, z, q.fY);
330 glVertex3f(q.fX + w, z, q.fY);
331 glVertex3f(q.fX + w, z, q.fY + h);
332 glVertex3f(q.fX, z, q.fY + h);
340 throw(eH + "unsupported quad-type.");
342 } // end switch quad-type
344 if (flags.SecSelection()) glPopName();
348 void QuadSetGL::RenderLines(const TGLDrawFlags &flags) const
350 static const Exc_t eH("QuadSetGL::RenderLines ");
354 VoidCPlex::iterator qi(mQ.fPlex);
356 if (flags.SecSelection()) glPushName(0);
358 switch (mQ.fQuadType)
361 case QuadSet::QT_LineXYFixedZ:
363 const Float_t& z = mQ.fDefCoord;
365 QuadSet::QLineFixC& q = * (QuadSet::QLineFixC*) qi();
368 if (flags.SecSelection()) glLoadName(qi.index());
370 glVertex3f(q.fX, q.fY, z);
371 glVertex3f(q.fX + q.fDx, q.fY + q.fDy, z);
378 case QuadSet::QT_LineXZFixedY:
380 const Float_t& z = mQ.fDefCoord;
382 QuadSet::QLineFixC& q = * (QuadSet::QLineFixC*) qi();
385 if (flags.SecSelection()) glLoadName(qi.index());
387 glVertex3f(q.fX, z, q.fY);
388 glVertex3f(q.fX + q.fDx, z, q.fY + q.fDy);
396 throw(eH + "unsupported quad-type.");
400 if (flags.SecSelection()) glPopName();
403 void QuadSetGL::RenderHexagons(const TGLDrawFlags &flags) const
405 static const Exc_t eH("QuadSetGL::RenderHexagons ");
407 const Float_t sqr3hf = 0.5*TMath::Sqrt(3);
411 GLenum primitveType = (mQ.fRenderMode != QuadSet::RM_Line) ?
412 GL_POLYGON : GL_LINE_LOOP;
416 VoidCPlex::iterator qi(mQ.fPlex);
418 if (flags.SecSelection()) glPushName(0);
420 switch (mQ.fQuadType)
423 case QuadSet::QT_HexagonXY:
426 QuadSet::QHex& q = * (QuadSet::QHex*) qi();
429 const Float_t rh = q.fR * 0.5;
430 const Float_t rs = q.fR * sqr3hf;
431 if (flags.SecSelection()) glLoadName(qi.index());
432 glBegin(primitveType);
433 glVertex3f( q.fR + q.fX, q.fY, q.fZ);
434 glVertex3f( rh + q.fX, rs + q.fY, q.fZ);
435 glVertex3f( -rh + q.fX, rs + q.fY, q.fZ);
436 glVertex3f(-q.fR + q.fX, q.fY, q.fZ);
437 glVertex3f( -rh + q.fX, -rs + q.fY, q.fZ);
438 glVertex3f( rh + q.fX, -rs + q.fY, q.fZ);
445 case QuadSet::QT_HexagonYX:
448 QuadSet::QHex& q = * (QuadSet::QHex*) qi();
451 const Float_t rh = q.fR * 0.5;
452 const Float_t rs = q.fR * sqr3hf;
453 if (flags.SecSelection()) glLoadName(qi.index());
454 glBegin(primitveType);
455 glVertex3f( rs + q.fX, rh + q.fY, q.fZ);
456 glVertex3f( q.fX, q.fR + q.fY, q.fZ);
457 glVertex3f(-rs + q.fX, rh + q.fY, q.fZ);
458 glVertex3f(-rs + q.fX, -rh + q.fY, q.fZ);
459 glVertex3f( q.fX, -q.fR + q.fY, q.fZ);
460 glVertex3f( rs + q.fX, -rh + q.fY, q.fZ);
468 throw(eH + "unsupported quad-type.");
470 } // end switch quad-type
472 if (flags.SecSelection()) glPopName();
475 /**************************************************************************/
476 /**************************************************************************/
478 //______________________________________________________________________________
479 void QuadSetGL::ProcessSelection(UInt_t* ptr, TGLViewer*, TGLScene*)
481 // Processes secondary selection from TGLViewer.
482 // Calls TPointSet3D::PointSelected(Int_t) with index of selected
483 // point as an argument.
485 if (ptr[0] < 2) return;
486 fM->QuadSelected(ptr[4]);