Logo ROOT  
Reference Guide
TEveFrameBoxGL.cxx
Go to the documentation of this file.
1// @(#)root/eve:$Id$
2// Authors: Matevz Tadel & Alja Mrak-Tadel: 2006, 2007
3
4/*************************************************************************
5 * Copyright (C) 1995-2007, Rene Brun and Fons Rademakers. *
6 * All rights reserved. *
7 * *
8 * For the licensing terms see $ROOTSYS/LICENSE. *
9 * For the list of contributors see $ROOTSYS/README/CREDITS. *
10 *************************************************************************/
11
12#include "TEveFrameBoxGL.h"
13#include "TEveFrameBox.h"
14
15#include "TGLIncludes.h"
16#include "TGLUtil.h"
17
18#include "TMath.h"
19
20/** \class TEveFrameBoxGL
21\ingroup TEve
22A class encapsulating GL rendering of TEveFrameBox via a static member function.
23*/
24
26
27////////////////////////////////////////////////////////////////////////////////
28/// Render the frame with GL.
29
31{
32 const Float_t * p = b.fFramePoints;
33 Float_t normal[3];
34
35 if (b.fFrameType == TEveFrameBox::kFT_Quad)
36 {
37 if (fillp)
38 {
39 TMath::Normal2Plane(p, p+3, p+6, normal);
40 glNormal3fv(normal);
41 glBegin(GL_POLYGON);
42 }
43 else
44 {
45 glBegin(GL_LINE_LOOP);
46 }
47 Int_t nPoints = b.fFrameSize / 3;
48 for (Int_t i = 0; i < nPoints; ++i, p += 3)
49 glVertex3fv(p);
50 glEnd();
51 }
52 else if (b.fFrameType == TEveFrameBox::kFT_Box)
53 {
54 if (fillp)
55 {
56 glBegin(GL_QUADS);
57 TMath::Normal2Plane(p, p+3, p+6, normal);
58 glNormal3fv(normal);
59 glVertex3fv(p); glVertex3fv(p + 3);
60 glVertex3fv(p + 6); glVertex3fv(p + 9);
61 // top: 7654
62 TMath::Normal2Plane(p+21, p+18, p+15, normal);
63 glNormal3fv(normal);
64 glVertex3fv(p + 21); glVertex3fv(p + 18);
65 glVertex3fv(p + 15); glVertex3fv(p + 12);
66 // back: 0451
67 TMath::Normal2Plane(p, p+12, p+15, normal);
68 glNormal3fv(normal);
69 glVertex3fv(p); glVertex3fv(p + 12);
70 glVertex3fv(p + 15); glVertex3fv(p + 3);
71 // front: 3267
72 TMath::Normal2Plane(p+9, p+6, p+18, normal);
73 glNormal3fv(normal);
74 glVertex3fv(p + 9); glVertex3fv(p + 6);
75 glVertex3fv(p + 18); glVertex3fv(p + 21);
76 // left: 0374
77 TMath::Normal2Plane(p, p+9, p+21, normal);
78 glNormal3fv(normal);
79 glVertex3fv(p); glVertex3fv(p + 9);
80 glVertex3fv(p + 21); glVertex3fv(p + 12);
81 // right: 1562
82 TMath::Normal2Plane(p+3, p+15, p+18, normal);
83 glNormal3fv(normal);
84 glVertex3fv(p + 3); glVertex3fv(p + 15);
85 glVertex3fv(p + 18); glVertex3fv(p + 6);
86 glEnd();
87 }
88 else
89 {
90 glBegin(GL_LINE_STRIP);
91 glVertex3fv(p); glVertex3fv(p + 3);
92 glVertex3fv(p + 6); glVertex3fv(p + 9);
93 glVertex3fv(p);
94 glVertex3fv(p + 12); glVertex3fv(p + 15);
95 glVertex3fv(p + 18); glVertex3fv(p + 21);
96 glVertex3fv(p + 12);
97 glEnd();
98 glBegin(GL_LINES);
99 glVertex3fv(p + 3); glVertex3fv(p + 15);
100 glVertex3fv(p + 6); glVertex3fv(p + 18);
101 glVertex3fv(p + 9); glVertex3fv(p + 21);
102 glEnd();
103 }
104 }
105}
106
107////////////////////////////////////////////////////////////////////////////////
108/// Render the frame-box with GL.
109
111{
112 const TEveFrameBox& b = *box;
113
114 glPushAttrib(GL_POLYGON_BIT | GL_LINE_BIT | GL_ENABLE_BIT);
115
116 glColorMaterial(GL_FRONT_AND_BACK, GL_DIFFUSE);
117 glEnable(GL_COLOR_MATERIAL);
118 glDisable(GL_CULL_FACE);
119
120 if (b.fDrawBack)
121 {
122 GLboolean lmts;
123 glGetBooleanv(GL_LIGHT_MODEL_TWO_SIDE, &lmts);
124 if (!lmts) glLightModeli(GL_LIGHT_MODEL_TWO_SIDE, GL_TRUE);
125
126 glEnable(GL_POLYGON_OFFSET_FILL);
127 glPolygonOffset(2, 2);
128 glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
129
130 if (b.fBackRGBA[3] < 255)
131 {
132 glEnable(GL_BLEND);
133 glDepthMask(GL_FALSE);
134 }
135
136 TGLUtil::Color4ubv(b.fBackRGBA);
138
139 if (!lmts) glLightModeli(GL_LIGHT_MODEL_TWO_SIDE, GL_FALSE);
140 }
141
142 glDisable(GL_LIGHTING);
143 glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
144 glEnable(GL_BLEND);
145 glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
146 glEnable(GL_LINE_SMOOTH);
147
148 TGLUtil::LineWidth(b.fFrameWidth);
149 TGLUtil::Color4ubv(b.fFrameRGBA);
150 RenderFrame(b, b.fFrameFill);
151
152 glPopAttrib();
153}
#define GL_TRUE
Definition: GL_glu.h:262
#define GL_QUADS
Definition: GL_glu.h:290
#define GL_LINE_STRIP
Definition: GL_glu.h:286
#define GL_LINES
Definition: GL_glu.h:284
unsigned char GLboolean
Definition: GL_glu.h:267
#define GL_FALSE
Definition: GL_glu.h:261
#define GL_POLYGON
Definition: GL_glu.h:292
#define GL_LINE_LOOP
Definition: GL_glu.h:285
#define b(i)
Definition: RSha256.hxx:100
float Float_t
Definition: RtypesCore.h:55
const Bool_t kTRUE
Definition: RtypesCore.h:89
#define ClassImp(name)
Definition: Rtypes.h:361
A class encapsulating GL rendering of TEveFrameBox via a static member function.
static void RenderFrame(const TEveFrameBox &b, Bool_t fillp)
Render the frame with GL.
static void Render(const TEveFrameBox *box)
Render the frame-box with GL.
Description of a 2D or 3D frame that can be used to visually group a set of objects.
Definition: TEveFrameBox.h:19
static void Color4ubv(const UChar_t *rgba)
Wrapper for glColor4ubv.
Definition: TGLUtil.cxx:1774
static Float_t LineWidth()
Get the line-width, taking the global scaling into account.
Definition: TGLUtil.cxx:1938
void box(Int_t pat, Double_t x1, Double_t y1, Double_t x2, Double_t y2)
Definition: fillpatterns.C:1
T * Normal2Plane(const T v1[3], const T v2[3], const T v3[3], T normal[3])
Calculate a normal vector of a plane.
Definition: TMath.h:1179