]>
Commit | Line | Data |
---|---|---|
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 | 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 | ||
32e219c2 | 20 | void 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 | ||
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); | |
b7a5b6f9 | 90 | |
32e219c2 | 91 | glPopAttrib(); |
b7a5b6f9 | 92 | } |