]> git.uio.no Git - u/mrichter/AliRoot.git/blame - EVE/Reve/QuadSetGL.cxx
Remove unnecessary includes.
[u/mrichter/AliRoot.git] / EVE / Reve / QuadSetGL.cxx
CommitLineData
37b09b91 1/**************************************************************************
2 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
3 * *
4 * Author: The ALICE Off-line Project. *
5 * Contributors are mentioned in the code where appropriate. *
6 * *
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 **************************************************************************/
15
16/* $Id$ */
17
18#include <TMath.h>
5a5a1232 19
20#include "QuadSetGL.h"
8be1b0cc 21#include <Reve/FrameBoxGL.h>
5a5a1232 22
23#include <TGLDrawFlags.h>
24
25#include <GL/gl.h>
26#include <GL/glu.h>
27
28using namespace Reve;
29
30//______________________________________________________________________
3aa97c5d 31// OldQuadSetGL
5a5a1232 32//
33
3aa97c5d 34ClassImp(OldQuadSetGL)
5a5a1232 35
36/**************************************************************************/
37
3aa97c5d 38OldQuadSetGL::OldQuadSetGL() : TGLObject()
5a5a1232 39{
40 // fCached = false; // Disable DL.
41}
42
3aa97c5d 43OldQuadSetGL::~OldQuadSetGL()
5a5a1232 44{}
45
46/**************************************************************************/
47
3aa97c5d 48Bool_t OldQuadSetGL::SetModel(TObject* obj)
5a5a1232 49{
3aa97c5d 50 return SetModelCheckClass(obj, Reve::OldQuadSet::Class());
5a5a1232 51}
52
3aa97c5d 53void OldQuadSetGL::SetBBox()
5a5a1232 54{
3aa97c5d 55 SetAxisAlignedBBox(((OldQuadSet*)fExternalObj)->AssertBBox());
5a5a1232 56}
57
58/**************************************************************************/
59
3aa97c5d 60void OldQuadSetGL::DirectDraw(const TGLDrawFlags & ) const
5a5a1232 61{
3aa97c5d 62 // printf("OldQuadSetGLRenderer::DirectDraw Style %d, LOD %d\n", flags.Style(), flags.LOD());
5a5a1232 63
3aa97c5d 64 OldQuadSet& Q = * (OldQuadSet*) fExternalObj;
5a5a1232 65
66 glPushAttrib(GL_ENABLE_BIT | GL_POLYGON_BIT);
67
68 glDisable(GL_LIGHTING);
69 glColorMaterial(GL_FRONT_AND_BACK, GL_DIFFUSE);
70 glEnable(GL_COLOR_MATERIAL);
71 glPolygonMode(GL_FRONT, GL_LINE);
72 glPolygonMode(GL_BACK, GL_LINE);
73 glDisable(GL_CULL_FACE);
74
75 Float_t c[4]; glGetFloatv(GL_CURRENT_COLOR, c);
76 // UChar_t alpha = (UChar_t)(255*c[3]);
77
78 glBegin(GL_QUADS);
79 for(std::vector<Quad>::iterator q=Q.fQuads.begin(); q!=Q.fQuads.end(); ++q) {
80 UChar_t* c = (UChar_t*) &q->color;
81 //glColor4ub(c[0], c[1], c[2], (c[3]*alpha) >> 8);
82 glColor3ub(c[0], c[1], c[2]);
83 glVertex3fv(q->vertices);
84 glVertex3fv(q->vertices + 3);
85 glVertex3fv(q->vertices + 6);
86 glVertex3fv(q->vertices + 9);
87 }
88 glEnd();
89
90 glPopAttrib();
91}
8be1b0cc 92
93
94/**************************************************************************/
95/**************************************************************************/
96/**************************************************************************/
97/**************************************************************************/
98
99//______________________________________________________________________
100// QuadSetGL
101//
102
103ClassImp(QuadSetGL)
104
105/**************************************************************************/
106
89083271 107QuadSetGL::QuadSetGL() : TGLObject(), fM(0)
8be1b0cc 108{
109 // fCached = false; // Disable DL.
110}
111
112QuadSetGL::~QuadSetGL()
113{}
114
115/**************************************************************************/
116
117Bool_t QuadSetGL::SetModel(TObject* obj)
118{
119 Bool_t ok = SetModelCheckClass(obj, Reve::QuadSet::Class());
120 fM = ok ? dynamic_cast<Reve::QuadSet*>(obj) : 0;
121 return ok;
122}
123
124void QuadSetGL::SetBBox()
125{
126 SetAxisAlignedBBox(fM->AssertBBox());
127}
128
129/**************************************************************************/
130
131inline Bool_t QuadSetGL::SetupColor(const QuadSet::QuadBase& q) const
132{
133 if (fM->fValueIsColor)
134 {
135 glColor4ubv((UChar_t*) & q.fValue);
975a1f61 136 return kTRUE;
8be1b0cc 137 }
138 else
139 {
975a1f61 140 UChar_t c[4];
141 Bool_t visible = fM->fPalette->ColorFromValue(q.fValue, fM->fDefaultValue, c);
142 if (visible)
143 glColor4ubv(c);
144 return visible;
8be1b0cc 145 }
8be1b0cc 146}
147
148/**************************************************************************/
149
150void QuadSetGL::DirectDraw(const TGLDrawFlags & flags) const
151{
152 static const Exc_t eH("QuadSetGL::DirectDraw ");
153
154 // printf("QuadSetGLRenderer::DirectDraw Style %d, LOD %d\n", flags.Style(), flags.LOD());
155
156 QuadSet& mQ = * fM;
44eb96d2 157
158 if (mQ.fFrame != 0)
159 FrameBoxGL::Render(mQ.fFrame);
160
8be1b0cc 161 if (mQ.fPlex.Size() == 0)
162 return;
163 if ( ! mQ.fValueIsColor && mQ.fPalette == 0)
164 {
20358789 165 mQ.AssertPalette();
8be1b0cc 166 }
167
8be1b0cc 168 glPushAttrib(GL_ENABLE_BIT | GL_POLYGON_BIT);
169 glColorMaterial(GL_FRONT_AND_BACK, GL_DIFFUSE);
170 glEnable(GL_COLOR_MATERIAL);
171 glDisable(GL_CULL_FACE);
172
173 if (mQ.fRenderMode == QuadSet::RM_Fill)
8be1b0cc 174 glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
8be1b0cc 175 else if (mQ.fRenderMode == QuadSet::RM_Line)
8be1b0cc 176 glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
8be1b0cc 177
20358789 178 if (mQ.fDisableLigting) glDisable(GL_LIGHTING);
179
96c51586 180 if (mQ.fQuadType < QuadSet::QT_Rectangle_End) RenderQuads(flags);
181 else if (mQ.fQuadType < QuadSet::QT_Line_End) RenderLines(flags);
182 else if (mQ.fQuadType < QuadSet::QT_Hexagon_End) RenderHexagons(flags);
20358789 183
8be1b0cc 184 glPopAttrib();
185
186}
187
188
1545977c 189void QuadSetGL::RenderQuads(const TGLDrawFlags &flags) const
8be1b0cc 190{
191 static const Exc_t eH("QuadSetGL::RenderQuads ");
192
193 QuadSet& mQ = * fM;
194
1545977c 195 GLenum primitiveType;
8be1b0cc 196 if (mQ.fRenderMode != QuadSet::RM_Line)
197 {
1545977c 198 primitiveType = GL_QUADS;
8be1b0cc 199 if (mQ.fQuadType == QuadSet::QT_FreeQuad)
200 glEnable(GL_NORMALIZE);
201 else
202 glNormal3f(0, 0, 1);
1545977c 203 } else {
204 primitiveType = GL_LINE_LOOP;
205 }
8be1b0cc 206
1545977c 207 VoidCPlex::iterator qi(mQ.fPlex);
8be1b0cc 208
1545977c 209 if (flags.SecSelection()) glPushName(0);
8be1b0cc 210
1545977c 211 switch (mQ.fQuadType)
8be1b0cc 212 {
213
1545977c 214 case QuadSet::QT_FreeQuad:
8be1b0cc 215 {
1545977c 216 Float_t e1[3], e2[3], normal[3];
217 while (qi.next()) {
218 QuadSet::QFreeQuad& q = * (QuadSet::QFreeQuad*) qi();
219 if (SetupColor(q))
220 {
221 Float_t* p = q.fVertices;
222 e1[0] = p[3] - p[0]; e1[1] = p[4] - p[1]; e1[2] = p[5] - p[2];
223 e2[0] = p[6] - p[0]; e2[1] = p[7] - p[1]; e2[2] = p[8] - p[2];
224 TMath::Cross(e1, e2, normal);
225 if (flags.SecSelection()) glLoadName(qi.index());
226 glBegin(primitiveType);
227 glNormal3fv(normal);
228 glVertex3fv(p);
229 glVertex3fv(p + 3);
230 glVertex3fv(p + 6);
231 glVertex3fv(p + 9);
232 glEnd();
8be1b0cc 233 }
ca462fa9 234 }
1545977c 235 break;
236 }
8be1b0cc 237
1545977c 238 case QuadSet::QT_RectangleXY:
239 {
240 while (qi.next()) {
241 QuadSet::QRect& q = * (QuadSet::QRect*) qi();
242 if (SetupColor(q))
243 {
244 if (flags.SecSelection()) glLoadName(qi.index());
245 glBegin(primitiveType);
253a61b0 246 glVertex3f(q.fA, q.fB, q.fC);
247 glVertex3f(q.fA + q.fW, q.fB, q.fC);
248 glVertex3f(q.fA + q.fW, q.fB + q.fH, q.fC);
249 glVertex3f(q.fA, q.fB + q.fH, q.fC);
250 glEnd();
251 }
252 }
253 break;
254 }
255
256 case QuadSet::QT_RectangleXZ:
257 {
258 while (qi.next()) {
259 QuadSet::QRect& q = * (QuadSet::QRect*) qi();
260 if (SetupColor(q))
261 {
262 if (flags.SecSelection()) glLoadName(qi.index());
263 glBegin(primitiveType);
264 glVertex3f(q.fA, q.fC, q.fB);
265 glVertex3f(q.fA + q.fW, q.fC, q.fB);
266 glVertex3f(q.fA + q.fW, q.fC, q.fB + q.fH);
267 glVertex3f(q.fA, q.fC, q.fB + q.fH);
268 glEnd();
269 }
270 }
271 break;
272 }
273
274 case QuadSet::QT_RectangleYZ:
275 {
276 while (qi.next()) {
277 QuadSet::QRect& q = * (QuadSet::QRect*) qi();
278 if (SetupColor(q))
279 {
280 if (flags.SecSelection()) glLoadName(qi.index());
281 glBegin(primitiveType);
282 glVertex3f(q.fC, q.fA, q.fB);
283 glVertex3f(q.fC, q.fA + q.fW, q.fB);
284 glVertex3f(q.fC, q.fA + q.fW, q.fB + q.fH);
285 glVertex3f(q.fC, q.fA, q.fB + q.fH);
1545977c 286 glEnd();
8be1b0cc 287 }
ca462fa9 288 }
1545977c 289 break;
290 }
8be1b0cc 291
1545977c 292 case QuadSet::QT_RectangleXYFixedDim:
293 {
294 const Float_t& w = mQ.fDefWidth;
295 const Float_t& h = mQ.fDefHeight;
296 while (qi.next()) {
297 QuadSet::QRectFixDim& q = * (QuadSet::QRectFixDim*) qi();
298 if (SetupColor(q))
299 {
300 if (flags.SecSelection()) glLoadName(qi.index());
301 glBegin(primitiveType);
253a61b0 302 glVertex3f(q.fA, q.fB, q.fC);
303 glVertex3f(q.fA + w, q.fB, q.fC);
304 glVertex3f(q.fA + w, q.fB + h, q.fC);
305 glVertex3f(q.fA, q.fB + h, q.fC);
1545977c 306 glEnd();
8be1b0cc 307 }
ca462fa9 308 }
1545977c 309 break;
310 }
8be1b0cc 311
1545977c 312 case QuadSet::QT_RectangleXYFixedZ:
313 {
314 const Float_t& z = mQ.fDefCoord;
315 while (qi.next()) {
316 QuadSet::QRectFixC& q = * (QuadSet::QRectFixC*) qi();
317 if (SetupColor(q))
318 {
319 if (flags.SecSelection()) glLoadName(qi.index());
320 glBegin(primitiveType);
253a61b0 321 glVertex3f(q.fA, q.fB, z);
322 glVertex3f(q.fA + q.fW, q.fB, z);
323 glVertex3f(q.fA + q.fW, q.fB + q.fH, z);
324 glVertex3f(q.fA, q.fB + q.fH, z);
1545977c 325 glEnd();
8be1b0cc 326 }
ca462fa9 327 }
1545977c 328 break;
329 }
8be1b0cc 330
1545977c 331 case QuadSet::QT_RectangleXZFixedY:
332 {
253a61b0 333 const Float_t& y = mQ.fDefCoord;
334 while (qi.next()) {
335 QuadSet::QRectFixC& q = * (QuadSet::QRectFixC*) qi();
336 if (SetupColor(q))
337 {
338 if (flags.SecSelection()) glLoadName(qi.index());
339 glBegin(primitiveType);
340 glVertex3f(q.fA, y, q.fB);
341 glVertex3f(q.fA + q.fW, y, q.fB);
342 glVertex3f(q.fA + q.fW, y, q.fB + q.fH);
343 glVertex3f(q.fA, y, q.fB + q.fH);
344 glEnd();
345 }
346 }
347 break;
348 }
349
350 case QuadSet::QT_RectangleYZFixedX:
351 {
352 const Float_t& x = mQ.fDefCoord;
1545977c 353 while (qi.next()) {
354 QuadSet::QRectFixC& q = * (QuadSet::QRectFixC*) qi();
355 if (SetupColor(q))
356 {
357 if (flags.SecSelection()) glLoadName(qi.index());
358 glBegin(primitiveType);
253a61b0 359 glVertex3f(x, q.fA, q.fB);
360 glVertex3f(x, q.fA + q.fW, q.fB);
361 glVertex3f(x, q.fA + q.fW, q.fB + q.fH);
362 glVertex3f(x, q.fA, q.fB + q.fH);
1545977c 363 glEnd();
8be1b0cc 364 }
ca462fa9 365 }
1545977c 366 break;
367 }
8be1b0cc 368
1545977c 369 case QuadSet::QT_RectangleXYFixedDimZ:
370 {
371 const Float_t& z = mQ.fDefCoord;
372 const Float_t& w = mQ.fDefWidth;
373 const Float_t& h = mQ.fDefHeight;
374 while (qi.next()) {
375 QuadSet::QRectFixDimC& q = * (QuadSet::QRectFixDimC*) qi();
376 if (SetupColor(q))
377 {
378 if (flags.SecSelection()) glLoadName(qi.index());
379 glBegin(primitiveType);
253a61b0 380 glVertex3f(q.fA, q.fB, z);
381 glVertex3f(q.fA + w, q.fB, z);
382 glVertex3f(q.fA + w, q.fB + h, z);
383 glVertex3f(q.fA, q.fB + h, z);
1545977c 384 glEnd();
8be1b0cc 385 }
ca462fa9 386 }
1545977c 387 break;
388 }
8be1b0cc 389
1545977c 390 case QuadSet::QT_RectangleXZFixedDimY:
391 {
253a61b0 392 const Float_t& y = mQ.fDefCoord;
393 const Float_t& w = mQ.fDefWidth;
394 const Float_t& h = mQ.fDefHeight;
395 while (qi.next()) {
396 QuadSet::QRectFixDimC& q = * (QuadSet::QRectFixDimC*) qi();
397 if (SetupColor(q))
398 {
399 if (flags.SecSelection()) glLoadName(qi.index());
400 glBegin(primitiveType);
401 glVertex3f(q.fA, y, q.fB);
402 glVertex3f(q.fA + w, y, q.fB);
403 glVertex3f(q.fA + w, y, q.fB + h);
404 glVertex3f(q.fA, y, q.fB + h);
405 glEnd();
406 }
407 }
408 break;
409 }
410
411 case QuadSet::QT_RectangleYZFixedDimX:
412 {
413 const Float_t& x = mQ.fDefCoord;
1545977c 414 const Float_t& w = mQ.fDefWidth;
415 const Float_t& h = mQ.fDefHeight;
416 while (qi.next()) {
417 QuadSet::QRectFixDimC& q = * (QuadSet::QRectFixDimC*) qi();
418 if (SetupColor(q))
419 {
420 if (flags.SecSelection()) glLoadName(qi.index());
421 glBegin(primitiveType);
253a61b0 422 glVertex3f(x, q.fA, q.fB);
423 glVertex3f(x, q.fA + w, q.fB);
424 glVertex3f(x, q.fA + w, q.fB + h);
425 glVertex3f(x, q.fA, q.fB + h);
1545977c 426 glEnd();
8be1b0cc 427 }
ca462fa9 428 }
1545977c 429 break;
430 }
8be1b0cc 431
1545977c 432 default:
433 throw(eH + "unsupported quad-type.");
8be1b0cc 434
1545977c 435 } // end switch quad-type
8be1b0cc 436
1545977c 437 if (flags.SecSelection()) glPopName();
8be1b0cc 438}
439
440
1545977c 441void QuadSetGL::RenderLines(const TGLDrawFlags &flags) const
8be1b0cc 442{
443 static const Exc_t eH("QuadSetGL::RenderLines ");
444
445 QuadSet& mQ = * fM;
446
ca462fa9 447 VoidCPlex::iterator qi(mQ.fPlex);
448
1545977c 449 if (flags.SecSelection()) glPushName(0);
ca462fa9 450
451 switch (mQ.fQuadType)
8be1b0cc 452 {
8be1b0cc 453
ca462fa9 454 case QuadSet::QT_LineXYFixedZ:
8be1b0cc 455 {
ca462fa9 456 const Float_t& z = mQ.fDefCoord;
457 while (qi.next()) {
458 QuadSet::QLineFixC& q = * (QuadSet::QLineFixC*) qi();
459 if (SetupColor(q))
460 {
1545977c 461 if (flags.SecSelection()) glLoadName(qi.index());
462 glBegin(GL_LINES);
253a61b0 463 glVertex3f(q.fA, q.fB, z);
464 glVertex3f(q.fA + q.fDx, q.fB + q.fDy, z);
1545977c 465 glEnd();
8be1b0cc 466 }
8be1b0cc 467 }
ca462fa9 468 break;
469 }
8be1b0cc 470
ca462fa9 471 case QuadSet::QT_LineXZFixedY:
472 {
473 const Float_t& z = mQ.fDefCoord;
474 while (qi.next()) {
475 QuadSet::QLineFixC& q = * (QuadSet::QLineFixC*) qi();
476 if (SetupColor(q))
477 {
1545977c 478 if (flags.SecSelection()) glLoadName(qi.index());
479 glBegin(GL_LINES);
253a61b0 480 glVertex3f(q.fA, z, q.fB);
481 glVertex3f(q.fA + q.fDx, z, q.fB + q.fDy);
1545977c 482 glEnd();
8be1b0cc 483 }
8be1b0cc 484 }
ca462fa9 485 break;
486 }
8be1b0cc 487
ca462fa9 488 default:
489 throw(eH + "unsupported quad-type.");
8be1b0cc 490
8be1b0cc 491 }
ca462fa9 492
1545977c 493 if (flags.SecSelection()) glPopName();
8be1b0cc 494}
96c51586 495
1545977c 496void QuadSetGL::RenderHexagons(const TGLDrawFlags &flags) const
96c51586 497{
498 static const Exc_t eH("QuadSetGL::RenderHexagons ");
499
500 const Float_t sqr3hf = 0.5*TMath::Sqrt(3);
501
502 QuadSet& mQ = * fM;
503
ca462fa9 504 GLenum primitveType = (mQ.fRenderMode != QuadSet::RM_Line) ?
505 GL_POLYGON : GL_LINE_LOOP;
96c51586 506
ca462fa9 507 glNormal3f(0, 0, 1);
96c51586 508
ca462fa9 509 VoidCPlex::iterator qi(mQ.fPlex);
96c51586 510
1545977c 511 if (flags.SecSelection()) glPushName(0);
512
ca462fa9 513 switch (mQ.fQuadType)
96c51586 514 {
515
ca462fa9 516 case QuadSet::QT_HexagonXY:
96c51586 517 {
ca462fa9 518 while (qi.next()) {
519 QuadSet::QHex& q = * (QuadSet::QHex*) qi();
520 if (SetupColor(q))
96c51586 521 {
ca462fa9 522 const Float_t rh = q.fR * 0.5;
523 const Float_t rs = q.fR * sqr3hf;
1545977c 524 if (flags.SecSelection()) glLoadName(qi.index());
ca462fa9 525 glBegin(primitveType);
253a61b0 526 glVertex3f( q.fR + q.fA, q.fB, q.fC);
527 glVertex3f( rh + q.fA, rs + q.fB, q.fC);
528 glVertex3f( -rh + q.fA, rs + q.fB, q.fC);
529 glVertex3f(-q.fR + q.fA, q.fB, q.fC);
530 glVertex3f( -rh + q.fA, -rs + q.fB, q.fC);
531 glVertex3f( rh + q.fA, -rs + q.fB, q.fC);
ca462fa9 532 glEnd();
96c51586 533 }
ca462fa9 534 }
535 break;
536 }
96c51586 537
ca462fa9 538 case QuadSet::QT_HexagonYX:
539 {
540 while (qi.next()) {
541 QuadSet::QHex& q = * (QuadSet::QHex*) qi();
542 if (SetupColor(q))
96c51586 543 {
ca462fa9 544 const Float_t rh = q.fR * 0.5;
545 const Float_t rs = q.fR * sqr3hf;
1545977c 546 if (flags.SecSelection()) glLoadName(qi.index());
ca462fa9 547 glBegin(primitveType);
253a61b0 548 glVertex3f( rs + q.fA, rh + q.fB, q.fC);
549 glVertex3f( q.fA, q.fR + q.fB, q.fC);
550 glVertex3f(-rs + q.fA, rh + q.fB, q.fC);
551 glVertex3f(-rs + q.fA, -rh + q.fB, q.fC);
552 glVertex3f( q.fA, -q.fR + q.fB, q.fC);
553 glVertex3f( rs + q.fA, -rh + q.fB, q.fC);
ca462fa9 554 glEnd();
96c51586 555 }
ca462fa9 556 }
557 break;
558 }
96c51586 559
ca462fa9 560 default:
561 throw(eH + "unsupported quad-type.");
96c51586 562
ca462fa9 563 } // end switch quad-type
96c51586 564
1545977c 565 if (flags.SecSelection()) glPopName();
566}
567
568/**************************************************************************/
569/**************************************************************************/
570
571//______________________________________________________________________________
572void QuadSetGL::ProcessSelection(UInt_t* ptr, TGLViewer*, TGLScene*)
573{
574 // Processes secondary selection from TGLViewer.
575 // Calls TPointSet3D::PointSelected(Int_t) with index of selected
576 // point as an argument.
577
578 if (ptr[0] < 2) return;
579 fM->QuadSelected(ptr[4]);
96c51586 580}