]> git.uio.no Git - u/mrichter/AliRoot.git/blob - EVE/Reve/TriangleSetGL.cxx
Dummy methods DefineParticle required by the interface added.
[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 <TGLIncludes.h>
8
9 //______________________________________________________________________
10 // TriangleSetGL
11 //
12 // GL-renderer for TriangleSet class.
13 //
14 // See also: TGLObject, TGLLogicalShape.
15
16 using namespace Reve;
17
18 ClassImp(TriangleSetGL)
19
20 TriangleSetGL::TriangleSetGL() : TGLObject(), fM(0)
21 {
22   // Constructor.
23
24   // fDLCache = false; // Disable display list.
25 }
26
27 TriangleSetGL::~TriangleSetGL()
28 {
29   // Destructor.
30 }
31
32 /**************************************************************************/
33
34 Bool_t TriangleSetGL::SetModel(TObject* obj, const Option_t* /*opt*/)
35 {
36   // Set model object.
37
38   if(SetModelCheckClass(obj, TriangleSet::Class())) {
39     fM = dynamic_cast<TriangleSet*>(obj);
40     return kTRUE;
41   }
42   return kFALSE;
43 }
44
45 void TriangleSetGL::SetBBox()
46 {
47   // Set bounding-box from the model.
48
49   // !! This ok if master sub-classed from TAttBBox
50   SetAxisAlignedBBox(((TriangleSet*)fExternalObj)->AssertBBox());
51 }
52
53 /**************************************************************************/
54
55 void TriangleSetGL::DirectDraw(TGLRnrCtx & /*rnrCtx*/) const
56 {
57   // Low-level GL rendering.
58
59   TriangleSet& TS = *fM;
60   Bool_t isScaled = TS.fHMTrans.IsScale();
61
62   GLint ex_shade_model;
63   glGetIntegerv(GL_SHADE_MODEL, &ex_shade_model);
64   glShadeModel(GL_FLAT);
65
66   glPushAttrib(GL_ENABLE_BIT | GL_POLYGON_BIT);
67
68   glColorMaterial(GL_FRONT_AND_BACK, GL_DIFFUSE);
69   glEnable(GL_COLOR_MATERIAL);
70   glPolygonMode(GL_FRONT, GL_FILL);
71   glPolygonMode(GL_BACK,  GL_LINE);
72   glDisable(GL_CULL_FACE);
73   if (isScaled) glEnable(GL_NORMALIZE);
74   glPushClientAttrib(GL_CLIENT_VERTEX_ARRAY_BIT);
75   glVertexPointer(3, GL_FLOAT, 0, TS.fVerts);
76   glEnableClientState(GL_VERTEX_ARRAY);
77
78   Int_t*   T = TS.fTrings;
79   Float_t* N = TS.fTringNorms;
80   UChar_t* C = TS.fTringCols;
81
82   TVector3 e1, e2, n;
83
84   glBegin(GL_TRIANGLES);
85   for(Int_t t=0; t<TS.fNTrings; ++t) {
86     if (N) {
87       glNormal3fv(N); N += 3;
88     } else {
89       Float_t* v0 = TS.Vertex(T[0]);
90       Float_t* v1 = TS.Vertex(T[1]);
91       Float_t* v2 = TS.Vertex(T[2]);
92       e1.SetXYZ(v1[0]-v0[0], v1[1]-v0[1], v1[2]-v0[2]);
93       e2.SetXYZ(v2[0]-v0[0], v2[1]-v0[1], v2[2]-v0[2]);
94       n = e1.Cross(e2);
95       if (!isScaled) n.SetMag(1);
96       glNormal3d(n.x(), n.y(), n.z());
97     }
98     if (C) {
99       glColor3ubv(C);  C += 3;
100     }
101     glArrayElement(T[0]);
102     glArrayElement(T[1]);
103     glArrayElement(T[2]);
104     T += 3;
105   }
106   glEnd();
107
108   glPopClientAttrib();
109   glPopAttrib();
110   glShadeModel(ex_shade_model);
111 }