1 /**************************************************************************
2 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
4 * Author: The ALICE Off-line Project. *
5 * Contributors are mentioned in the code where appropriate. *
7 * Permission to use, copy, modify and distribute this software and its *
8 * documentation strictly for non-commercial purposes is hereby granted *
9 * without fee, provided that the above copyright notice appears in all *
10 * copies and that both the copyright notice and this permission notice *
11 * appear in the supporting documentation. The authors make no claims *
12 * about the suitability of this software for any purpose. It is *
13 * provided "as is" without express or implied warranty. *
14 **************************************************************************/
20 #include "QuadSetGL.h"
21 #include <Reve/FrameBoxGL.h>
23 #include <TGLRnrCtx.h>
24 #include <TGLSelectRecord.h>
25 #include <TGLIncludes.h>
29 //______________________________________________________________________
33 ClassImp(OldQuadSetGL)
35 /**************************************************************************/
37 OldQuadSetGL::OldQuadSetGL() : TGLObject()
39 // fDLCache = false; // Disable DL.
42 OldQuadSetGL::~OldQuadSetGL()
45 /**************************************************************************/
47 Bool_t OldQuadSetGL::SetModel(TObject* obj, const Option_t* /*opt*/)
49 return SetModelCheckClass(obj, Reve::OldQuadSet::Class());
52 void OldQuadSetGL::SetBBox()
54 SetAxisAlignedBBox(((OldQuadSet*)fExternalObj)->AssertBBox());
57 /**************************************************************************/
59 void OldQuadSetGL::DirectDraw(TGLRnrCtx & /*rnrCtx*/) const
61 // printf("OldQuadSetGLRenderer::DirectDraw Style %d, LOD %d\n", rnrCtx.Style(), rnrCtx.LOD());
63 OldQuadSet& Q = * (OldQuadSet*) fExternalObj;
65 glPushAttrib(GL_ENABLE_BIT | GL_POLYGON_BIT);
67 glDisable(GL_LIGHTING);
68 glColorMaterial(GL_FRONT_AND_BACK, GL_DIFFUSE);
69 glEnable(GL_COLOR_MATERIAL);
70 glPolygonMode(GL_FRONT, GL_LINE);
71 glPolygonMode(GL_BACK, GL_LINE);
72 glDisable(GL_CULL_FACE);
74 Float_t c[4]; glGetFloatv(GL_CURRENT_COLOR, c);
75 // UChar_t alpha = (UChar_t)(255*c[3]);
78 for(std::vector<Quad>::iterator q=Q.fQuads.begin(); q!=Q.fQuads.end(); ++q) {
79 UChar_t* c = (UChar_t*) &q->color;
80 //glColor4ub(c[0], c[1], c[2], (c[3]*alpha) >> 8);
81 glColor3ub(c[0], c[1], c[2]);
82 glVertex3fv(q->vertices);
83 glVertex3fv(q->vertices + 3);
84 glVertex3fv(q->vertices + 6);
85 glVertex3fv(q->vertices + 9);
93 /**************************************************************************/
94 /**************************************************************************/
95 /**************************************************************************/
96 /**************************************************************************/
98 //______________________________________________________________________
104 /**************************************************************************/
106 QuadSetGL::QuadSetGL() : TGLObject(), fM(0)
108 // fDLCache = false; // Disable DL.
111 QuadSetGL::~QuadSetGL()
114 /**************************************************************************/
116 Bool_t QuadSetGL::ShouldDLCache(const TGLRnrCtx & rnrCtx) const
118 if (rnrCtx.DrawPass() == TGLRnrCtx::kPassOutlineLine)
120 return TGLObject::ShouldDLCache(rnrCtx);
123 /**************************************************************************/
125 Bool_t QuadSetGL::SetModel(TObject* obj, const Option_t* /*opt*/)
127 Bool_t ok = SetModelCheckClass(obj, Reve::QuadSet::Class());
128 fM = ok ? dynamic_cast<Reve::QuadSet*>(obj) : 0;
132 void QuadSetGL::SetBBox()
134 SetAxisAlignedBBox(fM->AssertBBox());
137 /**************************************************************************/
139 inline Bool_t QuadSetGL::SetupColor(const DigitSet::DigitBase& q) const
141 if (fM->fValueIsColor)
143 glColor4ubv((UChar_t*) & q.fValue);
149 Bool_t visible = fM->fPalette->ColorFromValue(q.fValue, fM->fDefaultValue, c);
156 /**************************************************************************/
158 void QuadSetGL::DirectDraw(TGLRnrCtx & rnrCtx) const
160 static const Exc_t eH("QuadSetGL::DirectDraw ");
162 // printf("QuadSetGLRenderer::DirectDraw Style %d, LOD %d\n", rnrCtx.Style(), rnrCtx.LOD());
164 if (rnrCtx.DrawPass() == TGLRnrCtx::kPassOutlineLine)
169 if (mQ.fFrame != 0 && ! rnrCtx.SecSelection())
170 FrameBoxGL::Render(mQ.fFrame);
172 if (mQ.fPlex.Size() == 0)
174 if ( ! mQ.fValueIsColor && mQ.fPalette == 0)
179 glPushAttrib(GL_ENABLE_BIT | GL_POLYGON_BIT);
180 glColorMaterial(GL_FRONT_AND_BACK, GL_DIFFUSE);
181 glEnable(GL_COLOR_MATERIAL);
182 glDisable(GL_CULL_FACE);
184 if (mQ.fRenderMode == DigitSet::RM_Fill)
185 glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
186 else if (mQ.fRenderMode == DigitSet::RM_Line)
187 glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
189 if (mQ.fDisableLigting) glDisable(GL_LIGHTING);
191 if (mQ.fQuadType < QuadSet::QT_Rectangle_End) RenderQuads(rnrCtx);
192 else if (mQ.fQuadType < QuadSet::QT_Line_End) RenderLines(rnrCtx);
193 else if (mQ.fQuadType < QuadSet::QT_Hexagon_End) RenderHexagons(rnrCtx);
200 void QuadSetGL::RenderQuads(TGLRnrCtx & rnrCtx) const
202 static const Exc_t eH("QuadSetGL::RenderQuads ");
206 GLenum primitiveType;
207 if (mQ.fRenderMode != DigitSet::RM_Line)
209 primitiveType = GL_QUADS;
210 if (mQ.fQuadType == QuadSet::QT_FreeQuad)
211 glEnable(GL_NORMALIZE);
215 primitiveType = GL_LINE_LOOP;
218 VoidCPlex::iterator qi(mQ.fPlex);
220 if (rnrCtx.SecSelection()) glPushName(0);
222 switch (mQ.fQuadType)
225 case QuadSet::QT_FreeQuad:
227 Float_t e1[3], e2[3], normal[3];
229 QuadSet::QFreeQuad& q = * (QuadSet::QFreeQuad*) qi();
232 Float_t* p = q.fVertices;
233 e1[0] = p[3] - p[0]; e1[1] = p[4] - p[1]; e1[2] = p[5] - p[2];
234 e2[0] = p[6] - p[0]; e2[1] = p[7] - p[1]; e2[2] = p[8] - p[2];
235 TMath::Cross(e1, e2, normal);
236 if (rnrCtx.SecSelection()) glLoadName(qi.index());
237 glBegin(primitiveType);
249 case QuadSet::QT_RectangleXY:
252 QuadSet::QRect& q = * (QuadSet::QRect*) qi();
255 if (rnrCtx.SecSelection()) glLoadName(qi.index());
256 glBegin(primitiveType);
257 glVertex3f(q.fA, q.fB, q.fC);
258 glVertex3f(q.fA + q.fW, q.fB, q.fC);
259 glVertex3f(q.fA + q.fW, q.fB + q.fH, q.fC);
260 glVertex3f(q.fA, q.fB + q.fH, q.fC);
267 case QuadSet::QT_RectangleXZ:
270 QuadSet::QRect& q = * (QuadSet::QRect*) qi();
273 if (rnrCtx.SecSelection()) glLoadName(qi.index());
274 glBegin(primitiveType);
275 glVertex3f(q.fA, q.fC, q.fB);
276 glVertex3f(q.fA + q.fW, q.fC, q.fB);
277 glVertex3f(q.fA + q.fW, q.fC, q.fB + q.fH);
278 glVertex3f(q.fA, q.fC, q.fB + q.fH);
285 case QuadSet::QT_RectangleYZ:
288 QuadSet::QRect& q = * (QuadSet::QRect*) qi();
291 if (rnrCtx.SecSelection()) glLoadName(qi.index());
292 glBegin(primitiveType);
293 glVertex3f(q.fC, q.fA, q.fB);
294 glVertex3f(q.fC, q.fA + q.fW, q.fB);
295 glVertex3f(q.fC, q.fA + q.fW, q.fB + q.fH);
296 glVertex3f(q.fC, q.fA, q.fB + q.fH);
303 case QuadSet::QT_RectangleXYFixedDim:
305 const Float_t& w = mQ.fDefWidth;
306 const Float_t& h = mQ.fDefHeight;
308 QuadSet::QRectFixDim& q = * (QuadSet::QRectFixDim*) qi();
311 if (rnrCtx.SecSelection()) glLoadName(qi.index());
312 glBegin(primitiveType);
313 glVertex3f(q.fA, q.fB, q.fC);
314 glVertex3f(q.fA + w, q.fB, q.fC);
315 glVertex3f(q.fA + w, q.fB + h, q.fC);
316 glVertex3f(q.fA, q.fB + h, q.fC);
323 case QuadSet::QT_RectangleXYFixedZ:
325 const Float_t& z = mQ.fDefCoord;
327 QuadSet::QRectFixC& q = * (QuadSet::QRectFixC*) qi();
330 if (rnrCtx.SecSelection()) glLoadName(qi.index());
331 glBegin(primitiveType);
332 glVertex3f(q.fA, q.fB, z);
333 glVertex3f(q.fA + q.fW, q.fB, z);
334 glVertex3f(q.fA + q.fW, q.fB + q.fH, z);
335 glVertex3f(q.fA, q.fB + q.fH, z);
342 case QuadSet::QT_RectangleXZFixedY:
344 const Float_t& y = mQ.fDefCoord;
346 QuadSet::QRectFixC& q = * (QuadSet::QRectFixC*) qi();
349 if (rnrCtx.SecSelection()) glLoadName(qi.index());
350 glBegin(primitiveType);
351 glVertex3f(q.fA, y, q.fB);
352 glVertex3f(q.fA + q.fW, y, q.fB);
353 glVertex3f(q.fA + q.fW, y, q.fB + q.fH);
354 glVertex3f(q.fA, y, q.fB + q.fH);
361 case QuadSet::QT_RectangleYZFixedX:
363 const Float_t& x = mQ.fDefCoord;
365 QuadSet::QRectFixC& q = * (QuadSet::QRectFixC*) qi();
368 if (rnrCtx.SecSelection()) glLoadName(qi.index());
369 glBegin(primitiveType);
370 glVertex3f(x, q.fA, q.fB);
371 glVertex3f(x, q.fA + q.fW, q.fB);
372 glVertex3f(x, q.fA + q.fW, q.fB + q.fH);
373 glVertex3f(x, q.fA, q.fB + q.fH);
380 case QuadSet::QT_RectangleXYFixedDimZ:
382 const Float_t& z = mQ.fDefCoord;
383 const Float_t& w = mQ.fDefWidth;
384 const Float_t& h = mQ.fDefHeight;
386 QuadSet::QRectFixDimC& q = * (QuadSet::QRectFixDimC*) qi();
389 if (rnrCtx.SecSelection()) glLoadName(qi.index());
390 glBegin(primitiveType);
391 glVertex3f(q.fA, q.fB, z);
392 glVertex3f(q.fA + w, q.fB, z);
393 glVertex3f(q.fA + w, q.fB + h, z);
394 glVertex3f(q.fA, q.fB + h, z);
401 case QuadSet::QT_RectangleXZFixedDimY:
403 const Float_t& y = mQ.fDefCoord;
404 const Float_t& w = mQ.fDefWidth;
405 const Float_t& h = mQ.fDefHeight;
407 QuadSet::QRectFixDimC& q = * (QuadSet::QRectFixDimC*) qi();
410 if (rnrCtx.SecSelection()) glLoadName(qi.index());
411 glBegin(primitiveType);
412 glVertex3f(q.fA, y, q.fB);
413 glVertex3f(q.fA + w, y, q.fB);
414 glVertex3f(q.fA + w, y, q.fB + h);
415 glVertex3f(q.fA, y, q.fB + h);
422 case QuadSet::QT_RectangleYZFixedDimX:
424 const Float_t& x = mQ.fDefCoord;
425 const Float_t& w = mQ.fDefWidth;
426 const Float_t& h = mQ.fDefHeight;
428 QuadSet::QRectFixDimC& q = * (QuadSet::QRectFixDimC*) qi();
431 if (rnrCtx.SecSelection()) glLoadName(qi.index());
432 glBegin(primitiveType);
433 glVertex3f(x, q.fA, q.fB);
434 glVertex3f(x, q.fA + w, q.fB);
435 glVertex3f(x, q.fA + w, q.fB + h);
436 glVertex3f(x, q.fA, q.fB + h);
444 throw(eH + "unsupported quad-type.");
446 } // end switch quad-type
448 if (rnrCtx.SecSelection()) glPopName();
452 void QuadSetGL::RenderLines(TGLRnrCtx & rnrCtx) const
454 static const Exc_t eH("QuadSetGL::RenderLines ");
458 VoidCPlex::iterator qi(mQ.fPlex);
460 if (rnrCtx.SecSelection()) glPushName(0);
462 switch (mQ.fQuadType)
465 case QuadSet::QT_LineXYFixedZ:
467 const Float_t& z = mQ.fDefCoord;
469 QuadSet::QLineFixC& q = * (QuadSet::QLineFixC*) qi();
472 if (rnrCtx.SecSelection()) glLoadName(qi.index());
474 glVertex3f(q.fA, q.fB, z);
475 glVertex3f(q.fA + q.fDx, q.fB + q.fDy, z);
482 case QuadSet::QT_LineXZFixedY:
484 const Float_t& z = mQ.fDefCoord;
486 QuadSet::QLineFixC& q = * (QuadSet::QLineFixC*) qi();
489 if (rnrCtx.SecSelection()) glLoadName(qi.index());
491 glVertex3f(q.fA, z, q.fB);
492 glVertex3f(q.fA + q.fDx, z, q.fB + q.fDy);
500 throw(eH + "unsupported quad-type.");
504 if (rnrCtx.SecSelection()) glPopName();
507 void QuadSetGL::RenderHexagons(TGLRnrCtx & rnrCtx) const
509 static const Exc_t eH("QuadSetGL::RenderHexagons ");
511 const Float_t sqr3hf = 0.5*TMath::Sqrt(3);
515 GLenum primitveType = (mQ.fRenderMode != DigitSet::RM_Line) ?
516 GL_POLYGON : GL_LINE_LOOP;
520 VoidCPlex::iterator qi(mQ.fPlex);
522 if (rnrCtx.SecSelection()) glPushName(0);
524 switch (mQ.fQuadType)
527 case QuadSet::QT_HexagonXY:
530 QuadSet::QHex& q = * (QuadSet::QHex*) qi();
533 const Float_t rh = q.fR * 0.5;
534 const Float_t rs = q.fR * sqr3hf;
535 if (rnrCtx.SecSelection()) glLoadName(qi.index());
536 glBegin(primitveType);
537 glVertex3f( q.fR + q.fA, q.fB, q.fC);
538 glVertex3f( rh + q.fA, rs + q.fB, q.fC);
539 glVertex3f( -rh + q.fA, rs + q.fB, q.fC);
540 glVertex3f(-q.fR + q.fA, q.fB, q.fC);
541 glVertex3f( -rh + q.fA, -rs + q.fB, q.fC);
542 glVertex3f( rh + q.fA, -rs + q.fB, q.fC);
549 case QuadSet::QT_HexagonYX:
552 QuadSet::QHex& q = * (QuadSet::QHex*) qi();
555 const Float_t rh = q.fR * 0.5;
556 const Float_t rs = q.fR * sqr3hf;
557 if (rnrCtx.SecSelection()) glLoadName(qi.index());
558 glBegin(primitveType);
559 glVertex3f( rs + q.fA, rh + q.fB, q.fC);
560 glVertex3f( q.fA, q.fR + q.fB, q.fC);
561 glVertex3f(-rs + q.fA, rh + q.fB, q.fC);
562 glVertex3f(-rs + q.fA, -rh + q.fB, q.fC);
563 glVertex3f( q.fA, -q.fR + q.fB, q.fC);
564 glVertex3f( rs + q.fA, -rh + q.fB, q.fC);
572 throw(eH + "unsupported quad-type.");
574 } // end switch quad-type
576 if (rnrCtx.SecSelection()) glPopName();
579 /**************************************************************************/
580 /**************************************************************************/
582 //______________________________________________________________________________
583 void QuadSetGL::ProcessSelection(TGLRnrCtx & /*rnrCtx*/, TGLSelectRecord & rec)
585 // Processes secondary selection from TGLViewer.
586 // Calls TPointSet3D::PointSelected(Int_t) with index of selected
587 // point as an argument.
589 if (rec.GetN() < 2) return;
590 fM->DigitSelected(rec.GetItem(1));