Logo ROOT  
Reference Guide
TGLRnrCtx.cxx
Go to the documentation of this file.
1// @(#)root/gl:$Id$
2// Author: Matevz Tadel, Feb 2007
3
4/*************************************************************************
5 * Copyright (C) 1995-2004, 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 "TString.h"
13
14#include "TGLRnrCtx.h"
15#include "TGLSceneInfo.h"
16#include "TGLSelectBuffer.h"
17#include "TGLIncludes.h"
18#include "TGLUtil.h"
19#include "TGLCamera.h"
20#include "TGLFontManager.h"
21#include "TGLContext.h"
22
23#include "TError.h"
24#include "TMathBase.h"
25#include "TMath.h"
26
27#include <list>
28#include <algorithm>
29#include <cassert>
30
31/** \class TGLRnrCtx
32\ingroup opengl
33The TGLRnrCtx class aggregates data for a given redering context as
34needed by various parts of the ROOT's OpenGL infrastructure. It
35serves as a connecting point between the steering part of the
36infrastructure (viewer, scene) and concrete rendering classes
37(logical, physical shape). It is just a data-holder, there is no
38functionality in it.
39
40Development notes:
41
42One RnrCtx is created by each viewer and it is just an extension of
43the viewer context that changes along the render
44descend. Separating this also has some abstract benefit of hiding
45viewer implementation from those that do not need to know it.
46
47Current scene / scene-info part is always initialized by viewer,
48scenes can assume they're ok.
49*/
50
52
53////////////////////////////////////////////////////////////////////////////////
54
56 fViewer (viewer),
57 fCamera (0),
58 fSceneInfo (0),
59
60 fViewerLOD (kLODUndef),
61 fSceneLOD (kLODUndef),
62 fCombiLOD (kLODUndef),
63 fShapeLOD (kLODUndef),
64 fShapePixSize (0),
65
66 fViewerStyle (kStyleUndef),
67 fSceneStyle (kStyleUndef),
68
69 fViewerWFLineW (0),
70 fSceneWFLineW (0),
71 fViewerOLLineW (0),
72 fSceneOLLineW (0),
73
74 fViewerClip (0),
75 fSceneClip (0),
76 fClip (0),
77 fDrawPass (kPassUndef),
78
79 fStopwatch (),
80 fRenderTimeOut(0.0),
81 fIsRunning (kFALSE),
82 fHasTimedOut (kFALSE),
83
84 fHighlight (kFALSE), fHighlightOutline (kFALSE),
85 fSelection (kFALSE), fSecSelection (kFALSE),
86 fSelectTransparents (kIfNoOpaques),
87 fPickRadius (0),
88 fPickRectangle(0),
89 fSelectBuffer (0),
90
91 fColorSetStack(0),
92 fRenderScale (1),
93
94 fEventKeySym (0),
95
96 fDLCaptureOpen (kFALSE),
97 fGLCtxIdentity (0),
98 fQuadric (0),
99
100 fGrabImage (kFALSE),
101 fGrabBuffer (-1),
102 fGrabbedImage (0)
103{
104 // Constructor.
105
107 fColorSetStack->push_back(0);
108
110 if (fViewer == 0)
111 {
112 // Assume external usage, initialize for highest quality.
116 }
117}
118
119////////////////////////////////////////////////////////////////////////////////
120/// Destructor.
121
123{
124 gluDeleteQuadric(fQuadric);
125 delete fPickRectangle;
126 delete fSelectBuffer;
127 delete fColorSetStack;
128}
129
130////////////////////////////////////////////////////////////////////////////////
131/// Return current scene (based on scene-info data).
132
134{
135 return fSceneInfo->GetScene();
136}
137
138////////////////////////////////////////////////////////////////////////////////
139/// Return current scene (based on scene-info data).
140
142{
143 return *fSceneInfo->GetScene();
144}
145
146/**************************************************************************/
147
148////////////////////////////////////////////////////////////////////////////////
149/// Returns true if current render-pass uses filled polygon style.
150
152{
154}
155
156
157/******************************************************************************/
158// Stopwatch
159/******************************************************************************/
160
161////////////////////////////////////////////////////////////////////////////////
162/// Start the stopwatch.
163
165{
166 if (fIsRunning)
167 return;
168
172}
173
174////////////////////////////////////////////////////////////////////////////////
175/// Stop the stopwatch.
176
178{
181}
182
183////////////////////////////////////////////////////////////////////////////////
184/// Check if the stopwatch went beyond the render time limit.
185
187{
188 if (fHasTimedOut) return kTRUE;
191 return fHasTimedOut;
192}
193
194
195/******************************************************************************/
196// Selection & picking
197/******************************************************************************/
198
199////////////////////////////////////////////////////////////////////////////////
200/// Setup context for running selection.
201/// x and y are in window coordinates.
202
204{
207 fPickRadius = r;
209 fPickRectangle->Set(x, y, r, r);
210
211 glSelectBuffer(fSelectBuffer->GetBufSize(), fSelectBuffer->GetBuf());
212}
213
214////////////////////////////////////////////////////////////////////////////////
215/// End selection.
216
218{
221 fPickRadius = 0;
222 delete fPickRectangle; fPickRectangle = 0;
223
224 if (glResult < 0)
225 {
226 if (fSelectBuffer->CanGrow())
227 {
228 Warning("TGLRnrCtx::EndSelection",
229 "Select buffer size (%d) insufficient, doubling it.",
232 }
233 else
234 {
235 Warning("TGLRnrCtx::EndSelection",
236 "Select buffer size (%d) insufficient. This is maximum.",
238 }
239 }
240 fSelectBuffer->ProcessResult(glResult);
241}
242
243////////////////////////////////////////////////////////////////////////////////
244/// Return current pick rectangle. This is *zero* when
245/// selection is not set.
246
248{
249 return fPickRectangle;
250}
251
252////////////////////////////////////////////////////////////////////////////////
253/// Return pick radius. If selection is not active it returns 0.
254
256{
257 return fPickRadius;
258}
259
260
261/**************************************************************************/
262// ColorSet access & management
263/******************************************************************************/
264
265////////////////////////////////////////////////////////////////////////////////
266/// Create copy of current color-set on the top of the stack.
267
269{
270 fColorSetStack->push_back(new TGLColorSet(*fColorSetStack->back()));
271}
272
273////////////////////////////////////////////////////////////////////////////////
274/// Return reference to current color-set (top of the stack).
275
277{
278 return * fColorSetStack->back();
279}
280
281////////////////////////////////////////////////////////////////////////////////
282/// Pops the top-most color-set.
283/// If only one entry is available, error is printed and the entry remains.
284
286{
287 if (fColorSetStack->size() >= 2)
288 {
289 delete fColorSetStack->back();
290 fColorSetStack->pop_back();
291 }
292 else
293 {
294 Error("PopColorSet()", "Attempting to remove the last entry.");
295 }
296}
297
298////////////////////////////////////////////////////////////////////////////////
299/// Change the default/bottom color-set.
300/// Returns the previous color-set.
301
303{
304 TGLColorSet* old = fColorSetStack->front();
305 fColorSetStack->front() = set;
306 return old;
307}
308
309////////////////////////////////////////////////////////////////////////////////
310/// Returns the current base color-set.
311
313{
314 return fColorSetStack->front();
315}
316
317////////////////////////////////////////////////////////////////////////////////
318/// Set col if it is different from background, otherwise use
319/// current foreground color.
320
322{
323 if (fColorSetStack->back()->Background().GetColorIndex() == col)
324 TGLUtil::Color(fColorSetStack->back()->Foreground());
325 else
326 TGLUtil::Color(col);
327}
328
329/**************************************************************************/
330// Display-list state
331/******************************************************************************/
332
333////////////////////////////////////////////////////////////////////////////////
334/// Start display-list capture.
335
337{
338 assert(fDLCaptureOpen == kFALSE);
340}
341
342////////////////////////////////////////////////////////////////////////////////
343/// End display list capture.
344
346{
347 assert(fDLCaptureOpen == kTRUE);
349}
350
351/******************************************************************************/
352// TGLFont interface
353/******************************************************************************/
354////////////////////////////////////////////////////////////////////////////////
355/// Release font in the GL rendering context.
356
358{
360}
361
362////////////////////////////////////////////////////////////////////////////////
363/// Get font in the GL rendering context.
364
366{
368}
369
370////////////////////////////////////////////////////////////////////////////////
371/// Get font in the GL rendering context.
372
374{
376}
377
378////////////////////////////////////////////////////////////////////////////////
379/// Get font in the GL rendering context.
380/// The font is scaled relative to current render scale.
381
383{
385}
386
387////////////////////////////////////////////////////////////////////////////////
388/// Get font in the GL rendering context.
389/// The font is scaled relative to current render scale.
390
391void TGLRnrCtx::RegisterFont(Int_t size, const char* name, Int_t mode, TGLFont& out)
392{
394}
395
396/******************************************************************************/
397// fQuadric's initialization.
398/******************************************************************************/
399
400////////////////////////////////////////////////////////////////////////////////
401/// Initialize fQuadric.
402
404{
405 if (!fQuadric) {
406 if ((fQuadric = gluNewQuadric())) {
407 gluQuadricOrientation(fQuadric, (GLenum)GLU_OUTSIDE);
408 gluQuadricNormals(fQuadric, (GLenum)GLU_SMOOTH);
409 } else
410 Error("TGLRnrCtx::GetGluQuadric", "gluNewQuadric failed");
411 }
412
413 return fQuadric;
414}
415
416
417/******************************************************************************/
418// Matrix manipulation helpers
419/******************************************************************************/
420
422{
423 glMatrixMode(GL_PROJECTION);
424 glPushMatrix();
425 glLoadIdentity();
426 if (Selection())
427 {
428 TGLRect rect(*GetPickRectangle());
430 gluPickMatrix(rect.X(), rect.Y(), rect.Width(), rect.Height(),
431 (Int_t*) GetCamera()->RefViewport().CArr());
432 }
433 glMatrixMode(GL_MODELVIEW);
434}
435
437{
438 glMatrixMode(GL_PROJECTION);
439 glPopMatrix();
440 glMatrixMode(GL_MODELVIEW);
441}
442
443
444/**************************************************************************/
445// Static helpers
446/**************************************************************************/
447
448////////////////////////////////////////////////////////////////////////////////
449/// Return string describing the style.
450
452{
453 switch (style)
454 {
455 case TGLRnrCtx::kFill: return "Filled Polys";
456 case TGLRnrCtx::kWireFrame: return "Wireframe";
457 case TGLRnrCtx::kOutline: return "Outline";
458 default: return "Oogaa-dooga style";
459 }
460}
#define GLU_OUTSIDE
Definition: GL_glu.h:203
#define GLU_SMOOTH
Definition: GL_glu.h:198
unsigned int GLenum
Definition: GL_glu.h:266
ROOT::R::TRInterface & r
Definition: Object.C:4
size_t size(const MatrixT &matrix)
retrieve the size of a square matrix
int Int_t
Definition: RtypesCore.h:45
const Bool_t kFALSE
Definition: RtypesCore.h:101
bool Bool_t
Definition: RtypesCore.h:63
short Short_t
Definition: RtypesCore.h:39
short Color_t
Definition: RtypesCore.h:92
const Bool_t kTRUE
Definition: RtypesCore.h:100
#define ClassImp(name)
Definition: Rtypes.h:364
void Error(const char *location, const char *msgfmt,...)
Use this function in case an error occurred.
Definition: TError.cxx:187
void Warning(const char *location, const char *msgfmt,...)
Use this function in warning situations.
Definition: TError.cxx:231
char name[80]
Definition: TGX11.cxx:110
void WindowToViewport(Int_t &, Int_t &y) const
Definition: TGLCamera.h:198
Class encapsulating a set of colors used throughout standard rendering.
Definition: TGLUtil.h:836
TGLFontManager * GetFontManager()
Get the free-type font-manager associated with this context-identity.
Definition: TGLContext.cxx:568
void RegisterFont(Int_t size, Int_t file, TGLFont::EMode mode, TGLFont &out)
Provide font with given size, file and FTGL class.
void ReleaseFont(TGLFont &font)
Release font with given attributes.
A wrapper class for FTFont.
Viewport (pixel base) 2D rectangle class.
Definition: TGLUtil.h:422
Int_t Y() const
Definition: TGLUtil.h:448
Int_t Height() const
Definition: TGLUtil.h:452
Int_t Width() const
Definition: TGLUtil.h:450
void Set(Int_t x, Int_t y, Int_t width, Int_t height)
Definition: TGLUtil.h:471
Int_t X() const
Definition: TGLUtil.h:446
The TGLRnrCtx class aggregates data for a given redering context as needed by various parts of the RO...
Definition: TGLRnrCtx.h:41
TGLColorSet * ChangeBaseColorSet(TGLColorSet *set)
Change the default/bottom color-set.
Definition: TGLRnrCtx.cxx:302
Bool_t fSecSelection
Definition: TGLRnrCtx.h:127
TGLViewerBase * fViewer
Definition: TGLRnrCtx.h:94
std::list< TGLColorSet * > lpTGLColorSet_t
Definition: TGLRnrCtx.h:91
@ kLODHigh
Definition: TGLRnrCtx.h:67
void BeginSelection(Int_t x, Int_t y, Int_t r=3)
Setup context for running selection.
Definition: TGLRnrCtx.cxx:203
TGLSceneInfo * fSceneInfo
Definition: TGLRnrCtx.h:96
void PopColorSet()
Pops the top-most color-set.
Definition: TGLRnrCtx.cxx:285
Int_t fPickRadius
Definition: TGLRnrCtx.h:129
TGLRect * fPickRectangle
Definition: TGLRnrCtx.h:130
Int_t GetPickRadius()
Return pick radius. If selection is not active it returns 0.
Definition: TGLRnrCtx.cxx:255
Short_t fShapeLOD
Definition: TGLRnrCtx.h:101
TGLColorSet * GetBaseColorSet()
Returns the current base color-set.
Definition: TGLRnrCtx.cxx:312
GLUquadric * fQuadric
Current GL context identity.
Definition: TGLRnrCtx.h:142
void ReleaseFont(TGLFont &font)
Release font in the GL rendering context.
Definition: TGLRnrCtx.cxx:357
TGLSceneBase * GetScene()
Return current scene (based on scene-info data).
Definition: TGLRnrCtx.cxx:133
void PushColorSet()
Create copy of current color-set on the top of the stack.
Definition: TGLRnrCtx.cxx:268
TGLStopwatch fStopwatch
Definition: TGLRnrCtx.h:118
TGLRect * GetPickRectangle()
Return current pick rectangle.
Definition: TGLRnrCtx.cxx:247
GLUquadric * GetGluQuadric()
Initialize fQuadric.
Definition: TGLRnrCtx.cxx:403
void RegisterFontNoScale(Int_t size, Int_t file, Int_t mode, TGLFont &out)
Get font in the GL rendering context.
Definition: TGLRnrCtx.cxx:365
void CloseDLCapture()
End display list capture.
Definition: TGLRnrCtx.cxx:345
lpTGLColorSet_t * fColorSetStack
Definition: TGLRnrCtx.h:133
Bool_t IsDrawPassFilled() const
Returns true if current render-pass uses filled polygon style.
Definition: TGLRnrCtx.cxx:151
Short_t fSceneLOD
Definition: TGLRnrCtx.h:99
TGLSceneBase & RefScene()
Return current scene (based on scene-info data).
Definition: TGLRnrCtx.cxx:141
TGLColorSet & ColorSet()
Return reference to current color-set (top of the stack).
Definition: TGLRnrCtx.cxx:276
TGLRnrCtx(const TGLRnrCtx &)
Bool_t fHasTimedOut
Definition: TGLRnrCtx.h:121
virtual ~TGLRnrCtx()
Destructor.
Definition: TGLRnrCtx.cxx:122
void StartStopwatch()
Start the stopwatch.
Definition: TGLRnrCtx.cxx:164
void RegisterFont(Int_t size, Int_t file, Int_t mode, TGLFont &out)
Get font in the GL rendering context.
Definition: TGLRnrCtx.cxx:382
void StopStopwatch()
Stop the stopwatch.
Definition: TGLRnrCtx.cxx:177
Double_t fRenderTimeOut
Definition: TGLRnrCtx.h:119
void EndSelection(Int_t glResult)
End selection.
Definition: TGLRnrCtx.cxx:217
Bool_t fSelection
Definition: TGLRnrCtx.h:126
Bool_t fDLCaptureOpen
Definition: TGLRnrCtx.h:139
void ProjectionMatrixPushIdentity()
Definition: TGLRnrCtx.cxx:421
Short_t fDrawPass
Definition: TGLRnrCtx.h:116
Bool_t HasStopwatchTimedOut()
Check if the stopwatch went beyond the render time limit.
Definition: TGLRnrCtx.cxx:186
void ColorOrForeground(Color_t col)
Set col if it is different from background, otherwise use current foreground color.
Definition: TGLRnrCtx.cxx:321
TGLSelectBuffer * fSelectBuffer
Definition: TGLRnrCtx.h:131
void ProjectionMatrixPop()
Definition: TGLRnrCtx.cxx:436
TGLContextIdentity * fGLCtxIdentity
DL-capture currently open.
Definition: TGLRnrCtx.h:140
Short_t fCombiLOD
Definition: TGLRnrCtx.h:100
TGLCamera * GetCamera()
Definition: TGLRnrCtx.h:156
static const char * StyleName(Short_t style)
Return string describing the style.
Definition: TGLRnrCtx.cxx:451
void OpenDLCapture()
Start display-list capture.
Definition: TGLRnrCtx.cxx:336
Bool_t fIsRunning
Definition: TGLRnrCtx.h:120
Short_t fSceneStyle
Definition: TGLRnrCtx.h:105
@ kPassFill
Definition: TGLRnrCtx.h:55
@ kPassOutlineFill
Definition: TGLRnrCtx.h:56
Float_t fRenderScale
Definition: TGLRnrCtx.h:134
Bool_t Selection() const
Definition: TGLRnrCtx.h:222
Short_t fViewerStyle
Definition: TGLRnrCtx.h:104
Short_t fViewerLOD
Definition: TGLRnrCtx.h:98
@ kWireFrame
Definition: TGLRnrCtx.h:48
@ kOutline
Definition: TGLRnrCtx.h:47
Scene base-class – provides basic interface expected by the TGLViewer or its sub-classes:
Definition: TGLSceneBase.h:33
TGLSceneBase * GetScene() const
Definition: TGLSceneInfo.h:84
Encapsulates OpenGL select buffer.
void ProcessResult(Int_t glResult)
Process result of GL-selection: sort the hits by their minimum z-coordinate.
void Grow()
Increase size of the select buffer.
Bool_t CanGrow()
static: return true if current buffer is smaller than the max buffer size
Int_t GetBufSize() const
UInt_t * GetBuf() const
void Start()
Start timing.
Double_t Lap() const
Return lap time since Start(), in milliseconds.
Double_t End()
End timing, return total time since Start(), in milliseconds.
static void Color(const TGLColor &color)
Set color from TGLColor.
Definition: TGLUtil.cxx:1691
Base class for GL viewers.
Definition: TGLViewerBase.h:37
Double_t y[n]
Definition: legend1.C:17
Double_t x[n]
Definition: legend1.C:17
Int_t Nint(T x)
Round to nearest integer. Rounds half integers to the nearest even integer.
Definition: TMath.h:713
Definition: file.py:1
TCanvas * style()
Definition: style.C:1