]> git.uio.no Git - u/mrichter/AliRoot.git/blame - EVE/Reve/FrameBoxGL.cxx
First big commit of the mchview program and its accompanying library,
[u/mrichter/AliRoot.git] / EVE / Reve / FrameBoxGL.cxx
CommitLineData
b7a5b6f9 1// $Header$
2
3#include "FrameBoxGL.h"
4#include <Reve/FrameBox.h>
5
19208112 6#include <TGLIncludes.h>
b7a5b6f9 7
32e219c2 8#include <TMath.h>
9
b7a5b6f9 10using namespace Reve;
11
12//______________________________________________________________________
13// FrameBoxGL
14//
15// A class encapsulating GL rendering of Reve::FrameBox via a static
16// meber function.
17
18ClassImp(FrameBoxGL)
19
32e219c2 20void FrameBoxGL::RenderFrame(const FrameBox& b, Bool_t fillp)
b7a5b6f9 21{
b7a5b6f9 22 const Float_t* p = b.fFramePoints;
32e219c2 23
b7a5b6f9 24 if (b.fFrameType == FrameBox::FT_Quad)
25 {
32e219c2 26 glBegin(fillp ? GL_POLYGON : GL_LINE_LOOP);
b7a5b6f9 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 {
32e219c2 33 // !!! frame-fill not implemented for 3D frame.
b7a5b6f9 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 }
32e219c2 48}
49
50void 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);
b7a5b6f9 90
32e219c2 91 glPopAttrib();
b7a5b6f9 92}