24 ClassImp(TEveQuadSetGL);
29 TEveQuadSetGL::TEveQuadSetGL() : TEveDigitSetGL(), fM(0)
38 Bool_t TEveQuadSetGL::SetModel(TObject* obj,
const Option_t* )
40 fM = SetModelDynCast<TEveQuadSet>(obj);
46 inline void AntiFlick(Float_t x, Float_t y, Float_t z)
58 void TEveQuadSetGL::DirectDraw(TGLRnrCtx & rnrCtx)
const
60 static const TEveException eH(
"TEveQuadSetGL::DirectDraw ");
64 TEveQuadSet& mQ = * fM;
66 if (mQ.fPlex.Size() > 0)
68 if (! mQ.fSingleColor && ! mQ.fValueIsColor && mQ.fPalette == 0)
73 glPushAttrib(GL_ENABLE_BIT | GL_POLYGON_BIT);
74 glColorMaterial(GL_FRONT_AND_BACK, GL_DIFFUSE);
75 glEnable(GL_COLOR_MATERIAL);
76 glDisable(GL_CULL_FACE);
78 if ( ! rnrCtx.IsDrawPassOutlineLine())
80 if (mQ.fRenderMode == TEveDigitSet::kRM_Fill)
81 glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
82 else if (mQ.fRenderMode == TEveDigitSet::kRM_Line)
83 glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
86 if (mQ.fDisableLighting) glDisable(GL_LIGHTING);
88 if (mQ.fQuadType < TEveQuadSet::kQT_Rectangle_End) RenderQuads(rnrCtx);
89 else if (mQ.fQuadType < TEveQuadSet::kQT_Line_End) RenderLines(rnrCtx);
90 else if (mQ.fQuadType < TEveQuadSet::kQT_Hexagon_End) RenderHexagons(rnrCtx);
95 DrawFrameIfNeeded(rnrCtx);
101 void TEveQuadSetGL::RenderQuads(TGLRnrCtx& rnrCtx)
const
103 static const TEveException eH(
"TEveQuadSetGL::RenderQuads ");
105 TEveQuadSet& mQ = * fM;
107 GLenum primitiveType;
108 if (mQ.fRenderMode != TEveDigitSet::kRM_Line)
110 primitiveType = GL_QUADS;
111 if (mQ.fQuadType == TEveQuadSet::kQT_FreeQuad)
112 glEnable(GL_NORMALIZE);
116 primitiveType = GL_LINE_LOOP;
119 TEveChunkManager::iterator qi(mQ.fPlex);
120 if (rnrCtx.Highlight() && fHighlightSet)
121 qi.fSelection = fHighlightSet;
123 if (rnrCtx.SecSelection()) glPushName(0);
125 switch (mQ.fQuadType)
127 case TEveQuadSet::kQT_FreeQuad:
129 Float_t e1[3], e2[3], normal[3];
131 TEveQuadSet::QFreeQuad_t& q = * (TEveQuadSet::QFreeQuad_t*) qi();
134 Float_t* p = q.fVertices;
135 e1[0] = p[3] - p[0]; e1[1] = p[4] - p[1]; e1[2] = p[5] - p[2];
136 e2[0] = p[6] - p[0]; e2[1] = p[7] - p[1]; e2[2] = p[8] - p[2];
137 TMath::Cross(e1, e2, normal);
138 if (rnrCtx.SecSelection()) glLoadName(qi.index());
139 glBegin(primitiveType);
147 AntiFlick(0.5f*(p[0]+p[6]), 0.5f*(p[1]+p[7]), 0.5f*(p[2]+p[8]));
153 case TEveQuadSet::kQT_RectangleXY:
156 TEveQuadSet::QRect_t& q = * (TEveQuadSet::QRect_t*) qi();
159 if (rnrCtx.SecSelection()) glLoadName(qi.index());
160 glBegin(primitiveType);
161 glVertex3f(q.fA, q.fB, q.fC);
162 glVertex3f(q.fA + q.fW, q.fB, q.fC);
163 glVertex3f(q.fA + q.fW, q.fB + q.fH, q.fC);
164 glVertex3f(q.fA, q.fB + q.fH, q.fC);
167 AntiFlick(q.fA + 0.5f*q.fW, q.fB + 0.5f*q.fH, q.fC);
173 case TEveQuadSet::kQT_RectangleXZ:
176 TEveQuadSet::QRect_t& q = * (TEveQuadSet::QRect_t*) qi();
179 if (rnrCtx.SecSelection()) glLoadName(qi.index());
180 glBegin(primitiveType);
181 glVertex3f(q.fA, q.fC, q.fB);
182 glVertex3f(q.fA + q.fW, q.fC, q.fB);
183 glVertex3f(q.fA + q.fW, q.fC, q.fB + q.fH);
184 glVertex3f(q.fA, q.fC, q.fB + q.fH);
187 AntiFlick(q.fA + 0.5f*q.fW, q.fC, q.fB + 0.5f*q.fH);
193 case TEveQuadSet::kQT_RectangleYZ:
196 TEveQuadSet::QRect_t& q = * (TEveQuadSet::QRect_t*) qi();
199 if (rnrCtx.SecSelection()) glLoadName(qi.index());
200 glBegin(primitiveType);
201 glVertex3f(q.fC, q.fA, q.fB);
202 glVertex3f(q.fC, q.fA + q.fW, q.fB);
203 glVertex3f(q.fC, q.fA + q.fW, q.fB + q.fH);
204 glVertex3f(q.fC, q.fA, q.fB + q.fH);
207 AntiFlick(q.fC, q.fA + 0.5f*q.fW, q.fB + 0.5f*q.fH);
213 case TEveQuadSet::kQT_RectangleXYFixedDim:
215 const Float_t& w = mQ.fDefWidth;
216 const Float_t& h = mQ.fDefHeight;
218 TEveQuadSet::QRectFixDim_t& q = * (TEveQuadSet::QRectFixDim_t*) qi();
221 if (rnrCtx.SecSelection()) glLoadName(qi.index());
222 glBegin(primitiveType);
223 glVertex3f(q.fA, q.fB, q.fC);
224 glVertex3f(q.fA + w, q.fB, q.fC);
225 glVertex3f(q.fA + w, q.fB + h, q.fC);
226 glVertex3f(q.fA, q.fB + h, q.fC);
230 AntiFlick(q.fA + 0.5f*w, q.fB + 0.5f*h, q.fC);
236 case TEveQuadSet::kQT_RectangleXYFixedZ:
238 const Float_t& z = mQ.fDefCoord;
240 TEveQuadSet::QRectFixC_t& q = * (TEveQuadSet::QRectFixC_t*) qi();
243 if (rnrCtx.SecSelection()) glLoadName(qi.index());
244 glBegin(primitiveType);
245 glVertex3f(q.fA, q.fB, z);
246 glVertex3f(q.fA + q.fW, q.fB, z);
247 glVertex3f(q.fA + q.fW, q.fB + q.fH, z);
248 glVertex3f(q.fA, q.fB + q.fH, z);
251 AntiFlick(q.fA + 0.5f*q.fW, q.fB + 0.5f*q.fH, z);
257 case TEveQuadSet::kQT_RectangleXZFixedY:
259 const Float_t& y = mQ.fDefCoord;
261 TEveQuadSet::QRectFixC_t& q = * (TEveQuadSet::QRectFixC_t*) qi();
264 if (rnrCtx.SecSelection()) glLoadName(qi.index());
265 glBegin(primitiveType);
266 glVertex3f(q.fA, y, q.fB);
267 glVertex3f(q.fA + q.fW, y, q.fB);
268 glVertex3f(q.fA + q.fW, y, q.fB + q.fH);
269 glVertex3f(q.fA, y, q.fB + q.fH);
272 AntiFlick(q.fA + 0.5f*q.fW, y, q.fB + 0.5f*q.fH);
278 case TEveQuadSet::kQT_RectangleYZFixedX:
280 const Float_t& x = mQ.fDefCoord;
282 TEveQuadSet::QRectFixC_t& q = * (TEveQuadSet::QRectFixC_t*) qi();
285 if (rnrCtx.SecSelection()) glLoadName(qi.index());
286 glBegin(primitiveType);
287 glVertex3f(x, q.fA, q.fB);
288 glVertex3f(x, q.fA + q.fW, q.fB);
289 glVertex3f(x, q.fA + q.fW, q.fB + q.fH);
290 glVertex3f(x, q.fA, q.fB + q.fH);
293 AntiFlick(x, q.fA + 0.5f*q.fW, q.fB + 0.5f*q.fH);
299 case TEveQuadSet::kQT_RectangleXYFixedDimZ:
301 const Float_t& z = mQ.fDefCoord;
302 const Float_t& w = mQ.fDefWidth;
303 const Float_t& h = mQ.fDefHeight;
305 TEveQuadSet::QRectFixDimC_t& q = * (TEveQuadSet::QRectFixDimC_t*) qi();
308 if (rnrCtx.SecSelection()) glLoadName(qi.index());
309 glBegin(primitiveType);
310 glVertex3f(q.fA, q.fB, z);
311 glVertex3f(q.fA + w, q.fB, z);
312 glVertex3f(q.fA + w, q.fB + h, z);
313 glVertex3f(q.fA, q.fB + h, z);
316 AntiFlick(q.fA + 0.5f*w, q.fB + 0.5f*h, z);
322 case TEveQuadSet::kQT_RectangleXZFixedDimY:
324 const Float_t& y = mQ.fDefCoord;
325 const Float_t& w = mQ.fDefWidth;
326 const Float_t& h = mQ.fDefHeight;
328 TEveQuadSet::QRectFixDimC_t& q = * (TEveQuadSet::QRectFixDimC_t*) qi();
331 if (rnrCtx.SecSelection()) glLoadName(qi.index());
332 glBegin(primitiveType);
333 glVertex3f(q.fA, y, q.fB);
334 glVertex3f(q.fA + w, y, q.fB);
335 glVertex3f(q.fA + w, y, q.fB + h);
336 glVertex3f(q.fA, y, q.fB + h);
339 AntiFlick(q.fA + 0.5f*w, y, q.fB + 0.5f*h);
345 case TEveQuadSet::kQT_RectangleYZFixedDimX:
347 const Float_t& x = mQ.fDefCoord;
348 const Float_t& w = mQ.fDefWidth;
349 const Float_t& h = mQ.fDefHeight;
351 TEveQuadSet::QRectFixDimC_t& q = * (TEveQuadSet::QRectFixDimC_t*) qi();
354 if (rnrCtx.SecSelection()) glLoadName(qi.index());
355 glBegin(primitiveType);
356 glVertex3f(x, q.fA, q.fB);
357 glVertex3f(x, q.fA + w, q.fB);
358 glVertex3f(x, q.fA + w, q.fB + h);
359 glVertex3f(x, q.fA, q.fB + h);
362 AntiFlick(x, q.fA + 0.5f*w, q.fB + 0.5f*h);
369 throw(eH +
"unsupported quad-type.");
373 if (rnrCtx.SecSelection()) glPopName();
379 void TEveQuadSetGL::RenderLines(TGLRnrCtx & rnrCtx)
const
381 static const TEveException eH(
"TEveQuadSetGL::RenderLines ");
383 TEveQuadSet& mQ = * fM;
385 TEveChunkManager::iterator qi(mQ.fPlex);
386 if (rnrCtx.Highlight() && fHighlightSet)
387 qi.fSelection = fHighlightSet;
389 if (rnrCtx.SecSelection()) glPushName(0);
391 switch (mQ.fQuadType)
394 case TEveQuadSet::kQT_LineXYFixedZ:
396 const Float_t& z = mQ.fDefCoord;
398 TEveQuadSet::QLineFixC_t& q = * (TEveQuadSet::QLineFixC_t*) qi();
401 if (rnrCtx.SecSelection()) glLoadName(qi.index());
403 glVertex3f(q.fA, q.fB, z);
404 glVertex3f(q.fA + q.fDx, q.fB + q.fDy, z);
411 case TEveQuadSet::kQT_LineXZFixedY:
413 const Float_t& z = mQ.fDefCoord;
415 TEveQuadSet::QLineFixC_t& q = * (TEveQuadSet::QLineFixC_t*) qi();
418 if (rnrCtx.SecSelection()) glLoadName(qi.index());
420 glVertex3f(q.fA, z, q.fB);
421 glVertex3f(q.fA + q.fDx, z, q.fB + q.fDy);
429 throw(eH +
"unsupported quad-type.");
433 if (rnrCtx.SecSelection()) glPopName();
439 void TEveQuadSetGL::RenderHexagons(TGLRnrCtx & rnrCtx)
const
441 static const TEveException eH(
"TEveQuadSetGL::RenderHexagons ");
443 const Float_t sqr3hf = 0.5*TMath::Sqrt(3);
445 TEveQuadSet& mQ = * fM;
447 GLenum primitveType = (mQ.fRenderMode != TEveDigitSet::kRM_Line) ?
448 GL_POLYGON : GL_LINE_LOOP;
452 TEveChunkManager::iterator qi(mQ.fPlex);
453 if (rnrCtx.Highlight() && fHighlightSet)
454 qi.fSelection = fHighlightSet;
456 if (rnrCtx.SecSelection()) glPushName(0);
458 switch (mQ.fQuadType)
460 case TEveQuadSet::kQT_HexagonXY:
463 TEveQuadSet::QHex_t& q = * (TEveQuadSet::QHex_t*) qi();
466 const Float_t rh = q.fR * 0.5;
467 const Float_t rs = q.fR * sqr3hf;
468 if (rnrCtx.SecSelection()) glLoadName(qi.index());
469 glBegin(primitveType);
470 glVertex3f( q.fR + q.fA, q.fB, q.fC);
471 glVertex3f( rh + q.fA, rs + q.fB, q.fC);
472 glVertex3f( -rh + q.fA, rs + q.fB, q.fC);
473 glVertex3f(-q.fR + q.fA, q.fB, q.fC);
474 glVertex3f( -rh + q.fA, -rs + q.fB, q.fC);
475 glVertex3f( rh + q.fA, -rs + q.fB, q.fC);
478 AntiFlick(q.fA, q.fB, q.fC);
484 case TEveQuadSet::kQT_HexagonYX:
487 TEveQuadSet::QHex_t& q = * (TEveQuadSet::QHex_t*) qi();
490 const Float_t rh = q.fR * 0.5;
491 const Float_t rs = q.fR * sqr3hf;
492 if (rnrCtx.SecSelection()) glLoadName(qi.index());
493 glBegin(primitveType);
494 glVertex3f( rs + q.fA, rh + q.fB, q.fC);
495 glVertex3f( q.fA, q.fR + q.fB, q.fC);
496 glVertex3f(-rs + q.fA, rh + q.fB, q.fC);
497 glVertex3f(-rs + q.fA, -rh + q.fB, q.fC);
498 glVertex3f( q.fA, -q.fR + q.fB, q.fC);
499 glVertex3f( rs + q.fA, -rh + q.fB, q.fC);
502 AntiFlick(q.fA, q.fB, q.fC);
509 throw(eH +
"unsupported quad-type.");
513 if (rnrCtx.SecSelection()) glPopName();