]> git.uio.no Git - u/mrichter/AliRoot.git/blob - EVE/Reve/FrameBoxGL.cxx
Record changes.
[u/mrichter/AliRoot.git] / EVE / Reve / FrameBoxGL.cxx
1 // $Header$
2
3 #include "FrameBoxGL.h"
4 #include <Reve/FrameBox.h>
5
6 #include <TGLIncludes.h>
7
8 #include <TMath.h>
9
10 using namespace Reve;
11
12 //______________________________________________________________________
13 // FrameBoxGL
14 //
15 // A class encapsulating GL rendering of Reve::FrameBox via a static
16 // meber function.
17
18 ClassImp(FrameBoxGL)
19
20 void FrameBoxGL::RenderFrame(const FrameBox& b, Bool_t fillp)
21 {
22   const Float_t*  p =  b.fFramePoints;
23
24   if (b.fFrameType == FrameBox::FT_Quad)
25   {
26     glBegin(fillp ? GL_POLYGON : GL_LINE_LOOP);
27     glVertex3fv(p);       glVertex3fv(p + 3);
28     glVertex3fv(p + 6);   glVertex3fv(p + 9);
29     glEnd();
30   }
31   else if (b.fFrameType == FrameBox::FT_Box)
32   {
33     // !!! frame-fill not implemented for 3D frame.
34     glBegin(GL_LINE_STRIP);
35     glVertex3fv(p);       glVertex3fv(p + 3);
36     glVertex3fv(p + 6);   glVertex3fv(p + 9);
37     glVertex3fv(p);
38     glVertex3fv(p + 12);  glVertex3fv(p + 15);
39     glVertex3fv(p + 18);  glVertex3fv(p + 21);
40     glVertex3fv(p + 12);
41     glEnd();
42     glBegin(GL_LINES);
43     glVertex3fv(p + 3);   glVertex3fv(p + 15);
44     glVertex3fv(p + 6);   glVertex3fv(p + 18);
45     glVertex3fv(p + 9);   glVertex3fv(p + 21);
46     glEnd();
47   }
48 }
49
50 void FrameBoxGL::Render(const FrameBox* box)
51 {
52   const FrameBox& b = *box;
53
54   glPushAttrib(GL_POLYGON_BIT | GL_LINE_BIT | GL_ENABLE_BIT);
55
56   glColorMaterial(GL_FRONT_AND_BACK, GL_DIFFUSE);
57   glEnable(GL_COLOR_MATERIAL);
58   glDisable(GL_CULL_FACE);
59
60   if (b.fFrameType == FrameBox::FT_Quad && b.fDrawBack)
61   {
62     GLboolean lmts;
63     glGetBooleanv(GL_LIGHT_MODEL_TWO_SIDE, &lmts);
64     if (!lmts) glLightModeli(GL_LIGHT_MODEL_TWO_SIDE, GL_TRUE);
65
66     glEnable(GL_POLYGON_OFFSET_FILL);
67     glPolygonOffset(2, 2);
68     glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
69
70     const Float_t*  p =  b.fFramePoints;
71     Float_t normal[3];
72     TMath::Normal2Plane(p, p+3, p+6, normal);
73     glNormal3fv(normal);
74
75     glColor4ubv(b.fBackRGBA);
76     RenderFrame(b, kTRUE);
77
78     if (!lmts) glLightModeli(GL_LIGHT_MODEL_TWO_SIDE, GL_FALSE);
79   }
80
81   glDisable(GL_LIGHTING);
82   glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
83   glEnable(GL_BLEND);
84   glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
85   glEnable(GL_LINE_SMOOTH);
86
87   glLineWidth(b.fFrameWidth);
88   glColor4ubv(b.fFrameRGBA);
89   RenderFrame(b, b.fFrameFill);
90
91   glPopAttrib();
92 }