30 TEveBoxGL::TEveBoxGL() :
39 Bool_t TEveBoxGL::SetModel(TObject* obj,
const Option_t* )
41 fM = SetModelDynCast<TEveBox>(obj);
48 void TEveBoxGL::SetBBox()
51 SetAxisAlignedBBox(((TEveBox*)fExternalObj)->AssertBBox());
56 void subtract_and_normalize(
const Float_t a[3],
const Float_t b[3],
63 Float_t d = sqrtf(o[0]*o[0] + o[1]*o[1] + o[2]*o[2]);
78 void TEveBoxGL::RenderOutline(
const Float_t p[8][3])
const
80 glBegin(GL_LINE_STRIP);
81 glVertex3fv(p[0]); glVertex3fv(p[1]);
82 glVertex3fv(p[5]); glVertex3fv(p[6]);
83 glVertex3fv(p[2]); glVertex3fv(p[3]);
84 glVertex3fv(p[7]); glVertex3fv(p[4]);
85 glVertex3fv(p[0]); glVertex3fv(p[3]);
89 glVertex3fv(p[1]); glVertex3fv(p[2]);
90 glVertex3fv(p[4]); glVertex3fv(p[5]);
91 glVertex3fv(p[6]); glVertex3fv(p[7]);
98 void TEveBoxGL::RenderBoxStdNorm(
const Float_t p[8][3])
const
103 glNormal3f(0, 0, -1);
104 glVertex3fv(p[0]); glVertex3fv(p[1]);
105 glVertex3fv(p[2]); glVertex3fv(p[3]);
108 glVertex3fv(p[7]); glVertex3fv(p[6]);
109 glVertex3fv(p[5]); glVertex3fv(p[4]);
112 glVertex3fv(p[0]); glVertex3fv(p[4]);
113 glVertex3fv(p[5]); glVertex3fv(p[1]);
115 glNormal3f(0, -1, 0);
116 glVertex3fv(p[3]); glVertex3fv(p[2]);
117 glVertex3fv(p[6]); glVertex3fv(p[7]);
119 glNormal3f(-1, 0, 0);
120 glVertex3fv(p[0]); glVertex3fv(p[3]);
121 glVertex3fv(p[7]); glVertex3fv(p[4]);
124 glVertex3fv(p[1]); glVertex3fv(p[5]);
125 glVertex3fv(p[6]); glVertex3fv(p[2]);
133 void TEveBoxGL::RenderBoxAutoNorm(
const Float_t p[8][3])
const
135 Float_t e[6][3], n[3];
136 subtract_and_normalize(p[1], p[0], e[0]);
137 subtract_and_normalize(p[3], p[0], e[1]);
138 subtract_and_normalize(p[4], p[0], e[2]);
139 subtract_and_normalize(p[5], p[6], e[3]);
140 subtract_and_normalize(p[7], p[6], e[4]);
141 subtract_and_normalize(p[2], p[6], e[5]);
146 glNormal3fv(TMath::Cross(e[0], e[1], n));
147 glVertex3fv(p[0]); glVertex3fv(p[1]);
148 glVertex3fv(p[2]); glVertex3fv(p[3]);
150 glNormal3fv(TMath::Cross(e[3], e[4], n));
151 glVertex3fv(p[7]); glVertex3fv(p[6]);
152 glVertex3fv(p[5]); glVertex3fv(p[4]);
154 glNormal3fv(TMath::Cross(e[2], e[0], n));
155 glVertex3fv(p[0]); glVertex3fv(p[4]);
156 glVertex3fv(p[5]); glVertex3fv(p[1]);
158 glNormal3fv(TMath::Cross(e[4], e[5], n));
159 glVertex3fv(p[3]); glVertex3fv(p[2]);
160 glVertex3fv(p[6]); glVertex3fv(p[7]);
162 glNormal3fv(TMath::Cross(e[1], e[2], n));
163 glVertex3fv(p[0]); glVertex3fv(p[3]);
164 glVertex3fv(p[7]); glVertex3fv(p[4]);
166 glNormal3fv(TMath::Cross(e[5], e[3], n));
167 glVertex3fv(p[1]); glVertex3fv(p[5]);
168 glVertex3fv(p[6]); glVertex3fv(p[2]);
176 void TEveBoxGL::Draw(TGLRnrCtx& rnrCtx)
const
178 if (rnrCtx.IsDrawPassOutlineLine())
180 RenderOutline(fM->fVertices);
184 if (fM->fHighlightFrame && rnrCtx.Highlight())
189 TGLUtil::LineWidth(fM->fLineWidth);
190 TGLUtil::Color(fM->fLineColor);
192 RenderOutline(fM->fVertices);
196 TGLObject::Draw(rnrCtx);
203 void TEveBoxGL::DirectDraw(TGLRnrCtx&)
const
205 fMultiColor = (fM->fDrawFrame && fM->fFillColor != fM->fLineColor);
207 glPushAttrib(GL_ENABLE_BIT);
209 glEnable(GL_POLYGON_OFFSET_FILL);
210 glPolygonOffset(1.0f, 1.0f);
211 RenderBoxAutoNorm(fM->fVertices);
212 glDisable(GL_POLYGON_OFFSET_FILL);
218 TGLUtil::Color(fM->fLineColor);
219 TGLUtil::LineWidth(fM->fLineWidth);
220 RenderOutline(fM->fVertices);
232 ClassImp(TEveBoxProjectedGL);
237 TEveBoxProjectedGL::TEveBoxProjectedGL() :
246 Bool_t TEveBoxProjectedGL::SetModel(TObject* obj,
const Option_t* )
248 fM = SetModelDynCast<TEveBoxProjected>(obj);
255 void TEveBoxProjectedGL::SetBBox()
257 SetAxisAlignedBBox(((TEveBoxProjected*)fExternalObj)->AssertBBox());
264 void TEveBoxProjectedGL::RenderPoints(Int_t mode)
const
266 Int_t B = fM->fBreakIdx;
267 Int_t N = fM->fPoints.size();
271 for (Int_t i = 0; i < B; ++i)
273 glVertex2fv(fM->fPoints[i]);
278 for (Int_t i = B; i < N; ++i)
280 glVertex2fv(fM->fPoints[i]);
288 void TEveBoxProjectedGL::Draw(TGLRnrCtx& rnrCtx)
const
290 if (rnrCtx.IsDrawPassOutlineLine())
294 glTranslatef(0.0f, 0.0f, fM->fDepth);
296 if (fM->fHighlightFrame && rnrCtx.Highlight())
301 TGLUtil::LineWidth(fM->fLineWidth);
302 TGLUtil::Color(fM->fLineColor);
304 RenderPoints(GL_LINE_LOOP);
308 TGLObject::Draw(rnrCtx);
311 if (TEveBoxProjected::fgDebugCornerPoints && ! fM->fDebugPoints.empty())
314 Int_t N = fM->fDebugPoints.size();
317 for (Int_t i = 0; i < N; ++i)
319 glVertex2fv(fM->fDebugPoints[i]);
330 void TEveBoxProjectedGL::DirectDraw(TGLRnrCtx&)
const
332 fMultiColor = (fM->fDrawFrame && fM->fFillColor != fM->fLineColor);
334 glPushAttrib(GL_ENABLE_BIT | GL_LINE_BIT | GL_POLYGON_BIT);
336 glDisable(GL_LIGHTING);
338 glColorMaterial(GL_FRONT_AND_BACK, GL_DIFFUSE);
339 glEnable(GL_COLOR_MATERIAL);
340 glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
341 glDisable(GL_CULL_FACE);
343 glEnable(GL_POLYGON_OFFSET_FILL);
344 glPolygonOffset(1.0f, 1.0f);
345 RenderPoints(GL_POLYGON);
346 glDisable(GL_POLYGON_OFFSET_FILL);
352 TGLUtil::Color(fM->fLineColor);
353 TGLUtil::LineWidth(fM->fLineWidth);
354 RenderPoints(GL_LINE_LOOP);