]> git.uio.no Git - u/mrichter/AliRoot.git/blob - EVE/Reve/TriangleSetGL.cxx
Add Getters and Setters in TrackRnrStyle and TrackList to define rendering of path...
[u/mrichter/AliRoot.git] / EVE / Reve / TriangleSetGL.cxx
1 // $Header$
2
3 #include "TriangleSetGL.h"
4 #include "TriangleSet.h"
5 #include <TVector3.h>
6
7 #include <TGLDrawFlags.h>
8
9 #ifdef WIN32
10 #include "Windows4root.h"
11 #endif
12 #include <GL/gl.h>
13
14 //______________________________________________________________________
15 // TriangleSetGL
16 //
17
18 using namespace Reve;
19
20 ClassImp(TriangleSetGL)
21
22 TriangleSetGL::TriangleSetGL() : TGLObject(), fM(0)
23 {
24   // fCached = false; // Disable display list.
25 }
26
27 TriangleSetGL::~TriangleSetGL()
28 {}
29
30 /**************************************************************************/
31
32 Bool_t TriangleSetGL::SetModel(TObject* obj)
33 {
34   if(SetModelCheckClass(obj, TriangleSet::Class())) {
35     fM = dynamic_cast<TriangleSet*>(obj);
36     return kTRUE;
37   }
38   return kFALSE;
39 }
40
41 void TriangleSetGL::SetBBox()
42 {
43   // !! This ok if master sub-classed from TAttBBox
44   SetAxisAlignedBBox(((TriangleSet*)fExternalObj)->AssertBBox());
45 }
46
47 /**************************************************************************/
48
49 void TriangleSetGL::DirectDraw(const TGLDrawFlags& /*flags*/) const
50 {
51   TriangleSet& TS = *fM;
52   Bool_t isScaled = TS.fHMTrans.IsScale();
53
54   GLint ex_shade_model;
55   glGetIntegerv(GL_SHADE_MODEL, &ex_shade_model);
56   glShadeModel(GL_FLAT);
57
58   glPushAttrib(GL_ENABLE_BIT | GL_POLYGON_BIT);
59
60   glColorMaterial(GL_FRONT_AND_BACK, GL_DIFFUSE);
61   glEnable(GL_COLOR_MATERIAL);
62   glPolygonMode(GL_FRONT, GL_FILL);
63   glPolygonMode(GL_BACK,  GL_LINE);
64   glDisable(GL_CULL_FACE);
65   if (isScaled) glEnable(GL_NORMALIZE);
66   glPushClientAttrib(GL_CLIENT_VERTEX_ARRAY_BIT);
67   glVertexPointer(3, GL_FLOAT, 0, TS.fVerts);
68   glEnableClientState(GL_VERTEX_ARRAY);
69
70   Int_t*   T = TS.fTrings;
71   Float_t* N = TS.fTringNorms;
72   UChar_t* C = TS.fTringCols;
73
74   TVector3 e1, e2, n;
75
76   glBegin(GL_TRIANGLES);
77   for(Int_t t=0; t<TS.fNTrings; ++t) {
78     if (N) {
79       glNormal3fv(N); N += 3;
80     } else {
81       Float_t* v0 = TS.Vertex(T[0]);
82       Float_t* v1 = TS.Vertex(T[1]);
83       Float_t* v2 = TS.Vertex(T[2]);
84       e1.SetXYZ(v1[0]-v0[0], v1[1]-v0[1], v1[2]-v0[2]);
85       e2.SetXYZ(v2[0]-v0[0], v2[1]-v0[1], v2[2]-v0[2]);
86       n = e1.Cross(e2);
87       if (!isScaled) n.SetMag(1);
88       glNormal3d(n.x(), n.y(), n.z());
89     }
90     if (C) {
91       glColor3ubv(C);  C += 3;
92     }
93     glArrayElement(T[0]);
94     glArrayElement(T[1]);
95     glArrayElement(T[2]);
96     T += 3;
97   }
98   glEnd();
99
100   glPopClientAttrib();
101   glPopAttrib();
102   glShadeModel(ex_shade_model);
103 }