ROOT logo
// @(#)root/gl:$Id$
// Author:  Matevz Tadel, Feb 2007

/*************************************************************************
 * Copyright (C) 1995-2004, Rene Brun and Fons Rademakers.               *
 * All rights reserved.                                                  *
 *                                                                       *
 * For the licensing terms see $ROOTSYS/LICENSE.                         *
 * For the list of contributors see $ROOTSYS/README/CREDITS.             *
 *************************************************************************/

#ifndef ROOT_TGLRnrCtx
#define ROOT_TGLRnrCtx

#include "Rtypes.h"
#include "TGLStopwatch.h"
#include <list>

class TGLViewerBase;
class TGLCamera;
class TGLSceneBase;
class TGLSceneInfo;

class TGLColorSet;
class TGLFont;
class TGLContextIdentity;

class TGLClip;
class TGLSelectBuffer;

class TGLRect;

class GLUquadric;


/**************************************************************************/
// TGLRnrCtx
/**************************************************************************/

class TGLRnrCtx
{
public:
   enum EStyle
   {
      kStyleUndef     =  -1,
      kFill,
      kOutline,
      kWireFrame
   };
   static const char* StyleName(Short_t style);

   enum EPass
   {
      kPassUndef      =  -1,
      kPassFill,
      kPassOutlineFill,
      kPassOutlineLine,
      kPassWireFrame
   };

   enum ELODPresets
   {
      kLODUndef       =  -1,
      kLODPixel       =   0, // Projected size pixel or less
      kLODLow         =  20,
      kLODMed         =  50,
      kLODHigh        = 100
   };

   enum EShapeSelectionLevel
   {
      kSSLNotSelected,
      kSSLSelected,
      kSSLImpliedSelected,
      kSSLHighlighted,
      kSSLImpliedHighlighted,
      kSSLEnd
   };

   enum ESelectabilityOfTransparents
   {
      kIfNoOpaques = 0,
      kIfClosest,
      kNever
   };

private:
   TGLRnrCtx(const TGLRnrCtx&);            // Not implemented
   TGLRnrCtx& operator=(const TGLRnrCtx&); // Not implemented

   typedef std::list<TGLColorSet*> lpTGLColorSet_t;

protected:
   TGLViewerBase  *fViewer;
   TGLCamera      *fCamera;
   TGLSceneInfo   *fSceneInfo;

   Short_t         fViewerLOD;
   Short_t         fSceneLOD;
   Short_t         fCombiLOD;     // Combined viewer/scene lod.
   Short_t         fShapeLOD;     // LOD calculated for current shape.
   Float_t         fShapePixSize; // Only relevant when not using display lists.

   Short_t         fViewerStyle;
   Short_t         fSceneStyle;

   Float_t         fViewerWFLineW;
   Float_t         fSceneWFLineW;
   Float_t         fViewerOLLineW;
   Float_t         fSceneOLLineW;

   TGLClip        *fViewerClip;
   TGLClip        *fSceneClip;
   TGLClip        *fClip;

   Short_t         fDrawPass;

   TGLStopwatch    fStopwatch;
   Double_t        fRenderTimeOut;
   Bool_t          fIsRunning;
   Bool_t          fHasTimedOut;

   // Highlight / Selection stuff
   Bool_t          fHighlight;        // True when in highlight.
   Bool_t          fHighlightOutline; // True when in highlight-outline.
   Bool_t          fSelection;        // True when in selection.
   Bool_t          fSecSelection;     // True when in secondary selection.
   Short_t         fSelectTransparents;
   Int_t           fPickRadius;
   TGLRect        *fPickRectangle;
   TGLSelectBuffer*fSelectBuffer;

   lpTGLColorSet_t*fColorSetStack;
   Float_t         fRenderScale;

   UInt_t          fEventKeySym;

   // GL state
   Bool_t              fDLCaptureOpen; //! DL-capture currently open
   TGLContextIdentity *fGLCtxIdentity; //! Current GL context identity

   GLUquadric         *fQuadric;

   // Picture grabbing
   Bool_t           fGrabImage;    // Set to true to store the image.
   Int_t            fGrabBuffer;   // Which buffer to grab after render.
   UChar_t         *fGrabbedImage; // Buffer where image was stored after rendering.

public:
   TGLRnrCtx(TGLViewerBase* viewer);
   virtual ~TGLRnrCtx();

   // Central objects
   TGLViewerBase * GetViewer() { return  fViewer; }
   TGLViewerBase & RefViewer() { return *fViewer; }
   TGLCamera     * GetCamera() { return  fCamera; }
   TGLCamera     & RefCamera() { return *fCamera; }
   TGLSceneInfo  * GetSceneInfo()  { return  fSceneInfo; }
   TGLSceneInfo  & RefSceneInfo()  { return *fSceneInfo; }
   TGLSceneBase  * GetScene();
   TGLSceneBase  & RefScene();

   const TGLCamera & RefCamera() const { return *fCamera; }
   const TGLCamera * GetCamera() const { return  fCamera; }

   // void SetViewer   (TGLViewerBase* v) { fViewer = v; }
   void SetCamera   (TGLCamera*     c) { fCamera = c; }
   void SetSceneInfo(TGLSceneInfo* si) { fSceneInfo = si; }

   // Draw LOD, style, clip, rnr-pass
   Short_t ViewerLOD()   const         { return fViewerLOD; }
   void    SetViewerLOD(Short_t LOD)   { fViewerLOD = LOD;  }
   Short_t SceneLOD()    const         { return fSceneLOD; }
   void    SetSceneLOD(Short_t LOD)    { fSceneLOD = LOD;  }
   Short_t CombiLOD()    const         { return fCombiLOD; }
   void    SetCombiLOD(Short_t LOD)    { fCombiLOD = LOD;  }
   Short_t ShapeLOD()    const         { return fShapeLOD; }
   void    SetShapeLOD(Short_t LOD)    { fShapeLOD = LOD;  }
   Float_t ShapePixSize() const        { return fShapePixSize; }
   void    SetShapePixSize(Float_t ps) { fShapePixSize = ps; }

   Short_t ViewerStyle() const         { return fViewerStyle; }
   void    SetViewerStyle(Short_t sty) { fViewerStyle = sty;  }
   Short_t SceneStyle()  const         { return fSceneStyle; }
   void    SetSceneStyle(Short_t sty)  { fSceneStyle = sty;  }

   Float_t ViewerWFLineW()       const { return fViewerWFLineW; }
   void    SetViewerWFLineW(Float_t w) { fViewerWFLineW = w;    }
   Float_t SceneWFLineW()        const { return fSceneWFLineW;  }
   void    SetSceneWFLineW(Float_t w)  { fSceneWFLineW = w;     }
   Float_t ViewerOLLineW()       const { return fViewerOLLineW; }
   void    SetViewerOLLineW(Float_t w) { fViewerOLLineW = w;    }
   Float_t SceneOLLineW()        const { return fSceneOLLineW;  }
   void    SetSceneOLLineW(Float_t w)  { fSceneOLLineW = w;     }

   TGLClip* ViewerClip()         const { return fViewerClip; }
   void     SetViewerClip(TGLClip *p)  { fViewerClip = p;    }
   TGLClip* SceneClip()          const { return fSceneClip;  }
   void     SetSceneClip(TGLClip *p)   { fSceneClip = p;     }
   TGLClip* Clip()               const { return  fClip;      }
   void     SetClip(TGLClip *p)        { fClip = p;          }
   Bool_t   HasClip()            const { return  fClip != 0; }

   Short_t DrawPass()    const         { return fDrawPass;  }
   void    SetDrawPass(Short_t dpass)  { fDrawPass = dpass; }
   Bool_t  IsDrawPassFilled() const;
   Bool_t  IsDrawPassOutlineLine() const { return fDrawPass == kPassOutlineLine; }

   // Render time-out
   Double_t RenderTimeOut()           const { return fRenderTimeOut; }
   void     SetRenderTimeOut(Double_t tout) { fRenderTimeOut = tout; }
   void     StartStopwatch();
   void     StopStopwatch();
   Bool_t   IsStopwatchRunning() const { return fIsRunning; }
   Bool_t   HasStopwatchTimedOut();

   // Highlight / Selection state during rendering
   Bool_t  Highlight()    const           { return fHighlight;      }
   void    SetHighlight(Bool_t hil)       { fHighlight = hil;       }
   Bool_t  HighlightOutline() const       { return fHighlightOutline; }
   void    SetHighlightOutline(Bool_t ho) { fHighlightOutline = ho;   }
   Bool_t  Selection()    const           { return fSelection;      }
   void    SetSelection(Bool_t sel)       { fSelection = sel;       }
   Bool_t  SecSelection() const           { return fSecSelection;   }
   void    SetSecSelection(Bool_t secSel) { fSecSelection = secSel; }
   // Highlight / selection parameters
   Short_t SelectTransparents()        const { return fSelectTransparents; }
   void    SetSelectTransparents(Short_t st) { fSelectTransparents = st;   }
   TGLRect         * GetPickRectangle();
   Int_t             GetPickRadius();
   TGLSelectBuffer * GetSelectBuffer() const { return fSelectBuffer; }
   // Selection setup / end
   void    BeginSelection(Int_t x, Int_t y, Int_t r=3);
   void    EndSelection  (Int_t glResult);

   void         PushColorSet();
   TGLColorSet& ColorSet();
   void         PopColorSet();
   TGLColorSet* ChangeBaseColorSet(TGLColorSet* set);
   TGLColorSet* GetBaseColorSet();

   void         ColorOrForeground(Color_t col);

   Float_t GetRenderScale()    const { return fRenderScale; }
   void    SetRenderScale(Float_t s) { fRenderScale = s; }

   UInt_t GetEventKeySym()   const { return fEventKeySym; }
   void   SetEventKeySym(UInt_t k) { fEventKeySym = k; }

   Bool_t IsDLCaptureOpen() const  { return fDLCaptureOpen; }
   void   OpenDLCapture();
   void   CloseDLCapture();

   TGLContextIdentity* GetGLCtxIdentity()   const { return fGLCtxIdentity; }
   void SetGLCtxIdentity(TGLContextIdentity* cid) { fGLCtxIdentity = cid; }

   void  RegisterFont(Int_t size, Int_t file, Int_t mode, TGLFont& out);
   void  RegisterFont(Int_t size, const char* name, Int_t mode, TGLFont& out);
   void  RegisterFontNoScale(Int_t size, Int_t file, Int_t mode, TGLFont& out);
   void  RegisterFontNoScale(Int_t size, const char* name, Int_t mode, TGLFont& out);
   void  ReleaseFont(TGLFont& font);

   GLUquadric* GetGluQuadric();

   // Picture grabbing
   void     SetGrabImage(Bool_t gi) { fGrabImage = gi;   }
   Bool_t   GetGrabImage()    const { return fGrabImage; }

   // Matrix manipulation helpers
   void ProjectionMatrixPushIdentity();
   void ProjectionMatrixPop();

   ClassDef(TGLRnrCtx, 0); // Collection of objects and data passes along all rendering calls.
};


#endif
 TGLRnrCtx.h:1
 TGLRnrCtx.h:2
 TGLRnrCtx.h:3
 TGLRnrCtx.h:4
 TGLRnrCtx.h:5
 TGLRnrCtx.h:6
 TGLRnrCtx.h:7
 TGLRnrCtx.h:8
 TGLRnrCtx.h:9
 TGLRnrCtx.h:10
 TGLRnrCtx.h:11
 TGLRnrCtx.h:12
 TGLRnrCtx.h:13
 TGLRnrCtx.h:14
 TGLRnrCtx.h:15
 TGLRnrCtx.h:16
 TGLRnrCtx.h:17
 TGLRnrCtx.h:18
 TGLRnrCtx.h:19
 TGLRnrCtx.h:20
 TGLRnrCtx.h:21
 TGLRnrCtx.h:22
 TGLRnrCtx.h:23
 TGLRnrCtx.h:24
 TGLRnrCtx.h:25
 TGLRnrCtx.h:26
 TGLRnrCtx.h:27
 TGLRnrCtx.h:28
 TGLRnrCtx.h:29
 TGLRnrCtx.h:30
 TGLRnrCtx.h:31
 TGLRnrCtx.h:32
 TGLRnrCtx.h:33
 TGLRnrCtx.h:34
 TGLRnrCtx.h:35
 TGLRnrCtx.h:36
 TGLRnrCtx.h:37
 TGLRnrCtx.h:38
 TGLRnrCtx.h:39
 TGLRnrCtx.h:40
 TGLRnrCtx.h:41
 TGLRnrCtx.h:42
 TGLRnrCtx.h:43
 TGLRnrCtx.h:44
 TGLRnrCtx.h:45
 TGLRnrCtx.h:46
 TGLRnrCtx.h:47
 TGLRnrCtx.h:48
 TGLRnrCtx.h:49
 TGLRnrCtx.h:50
 TGLRnrCtx.h:51
 TGLRnrCtx.h:52
 TGLRnrCtx.h:53
 TGLRnrCtx.h:54
 TGLRnrCtx.h:55
 TGLRnrCtx.h:56
 TGLRnrCtx.h:57
 TGLRnrCtx.h:58
 TGLRnrCtx.h:59
 TGLRnrCtx.h:60
 TGLRnrCtx.h:61
 TGLRnrCtx.h:62
 TGLRnrCtx.h:63
 TGLRnrCtx.h:64
 TGLRnrCtx.h:65
 TGLRnrCtx.h:66
 TGLRnrCtx.h:67
 TGLRnrCtx.h:68
 TGLRnrCtx.h:69
 TGLRnrCtx.h:70
 TGLRnrCtx.h:71
 TGLRnrCtx.h:72
 TGLRnrCtx.h:73
 TGLRnrCtx.h:74
 TGLRnrCtx.h:75
 TGLRnrCtx.h:76
 TGLRnrCtx.h:77
 TGLRnrCtx.h:78
 TGLRnrCtx.h:79
 TGLRnrCtx.h:80
 TGLRnrCtx.h:81
 TGLRnrCtx.h:82
 TGLRnrCtx.h:83
 TGLRnrCtx.h:84
 TGLRnrCtx.h:85
 TGLRnrCtx.h:86
 TGLRnrCtx.h:87
 TGLRnrCtx.h:88
 TGLRnrCtx.h:89
 TGLRnrCtx.h:90
 TGLRnrCtx.h:91
 TGLRnrCtx.h:92
 TGLRnrCtx.h:93
 TGLRnrCtx.h:94
 TGLRnrCtx.h:95
 TGLRnrCtx.h:96
 TGLRnrCtx.h:97
 TGLRnrCtx.h:98
 TGLRnrCtx.h:99
 TGLRnrCtx.h:100
 TGLRnrCtx.h:101
 TGLRnrCtx.h:102
 TGLRnrCtx.h:103
 TGLRnrCtx.h:104
 TGLRnrCtx.h:105
 TGLRnrCtx.h:106
 TGLRnrCtx.h:107
 TGLRnrCtx.h:108
 TGLRnrCtx.h:109
 TGLRnrCtx.h:110
 TGLRnrCtx.h:111
 TGLRnrCtx.h:112
 TGLRnrCtx.h:113
 TGLRnrCtx.h:114
 TGLRnrCtx.h:115
 TGLRnrCtx.h:116
 TGLRnrCtx.h:117
 TGLRnrCtx.h:118
 TGLRnrCtx.h:119
 TGLRnrCtx.h:120
 TGLRnrCtx.h:121
 TGLRnrCtx.h:122
 TGLRnrCtx.h:123
 TGLRnrCtx.h:124
 TGLRnrCtx.h:125
 TGLRnrCtx.h:126
 TGLRnrCtx.h:127
 TGLRnrCtx.h:128
 TGLRnrCtx.h:129
 TGLRnrCtx.h:130
 TGLRnrCtx.h:131
 TGLRnrCtx.h:132
 TGLRnrCtx.h:133
 TGLRnrCtx.h:134
 TGLRnrCtx.h:135
 TGLRnrCtx.h:136
 TGLRnrCtx.h:137
 TGLRnrCtx.h:138
 TGLRnrCtx.h:139
 TGLRnrCtx.h:140
 TGLRnrCtx.h:141
 TGLRnrCtx.h:142
 TGLRnrCtx.h:143
 TGLRnrCtx.h:144
 TGLRnrCtx.h:145
 TGLRnrCtx.h:146
 TGLRnrCtx.h:147
 TGLRnrCtx.h:148
 TGLRnrCtx.h:149
 TGLRnrCtx.h:150
 TGLRnrCtx.h:151
 TGLRnrCtx.h:152
 TGLRnrCtx.h:153
 TGLRnrCtx.h:154
 TGLRnrCtx.h:155
 TGLRnrCtx.h:156
 TGLRnrCtx.h:157
 TGLRnrCtx.h:158
 TGLRnrCtx.h:159
 TGLRnrCtx.h:160
 TGLRnrCtx.h:161
 TGLRnrCtx.h:162
 TGLRnrCtx.h:163
 TGLRnrCtx.h:164
 TGLRnrCtx.h:165
 TGLRnrCtx.h:166
 TGLRnrCtx.h:167
 TGLRnrCtx.h:168
 TGLRnrCtx.h:169
 TGLRnrCtx.h:170
 TGLRnrCtx.h:171
 TGLRnrCtx.h:172
 TGLRnrCtx.h:173
 TGLRnrCtx.h:174
 TGLRnrCtx.h:175
 TGLRnrCtx.h:176
 TGLRnrCtx.h:177
 TGLRnrCtx.h:178
 TGLRnrCtx.h:179
 TGLRnrCtx.h:180
 TGLRnrCtx.h:181
 TGLRnrCtx.h:182
 TGLRnrCtx.h:183
 TGLRnrCtx.h:184
 TGLRnrCtx.h:185
 TGLRnrCtx.h:186
 TGLRnrCtx.h:187
 TGLRnrCtx.h:188
 TGLRnrCtx.h:189
 TGLRnrCtx.h:190
 TGLRnrCtx.h:191
 TGLRnrCtx.h:192
 TGLRnrCtx.h:193
 TGLRnrCtx.h:194
 TGLRnrCtx.h:195
 TGLRnrCtx.h:196
 TGLRnrCtx.h:197
 TGLRnrCtx.h:198
 TGLRnrCtx.h:199
 TGLRnrCtx.h:200
 TGLRnrCtx.h:201
 TGLRnrCtx.h:202
 TGLRnrCtx.h:203
 TGLRnrCtx.h:204
 TGLRnrCtx.h:205
 TGLRnrCtx.h:206
 TGLRnrCtx.h:207
 TGLRnrCtx.h:208
 TGLRnrCtx.h:209
 TGLRnrCtx.h:210
 TGLRnrCtx.h:211
 TGLRnrCtx.h:212
 TGLRnrCtx.h:213
 TGLRnrCtx.h:214
 TGLRnrCtx.h:215
 TGLRnrCtx.h:216
 TGLRnrCtx.h:217
 TGLRnrCtx.h:218
 TGLRnrCtx.h:219
 TGLRnrCtx.h:220
 TGLRnrCtx.h:221
 TGLRnrCtx.h:222
 TGLRnrCtx.h:223
 TGLRnrCtx.h:224
 TGLRnrCtx.h:225
 TGLRnrCtx.h:226
 TGLRnrCtx.h:227
 TGLRnrCtx.h:228
 TGLRnrCtx.h:229
 TGLRnrCtx.h:230
 TGLRnrCtx.h:231
 TGLRnrCtx.h:232
 TGLRnrCtx.h:233
 TGLRnrCtx.h:234
 TGLRnrCtx.h:235
 TGLRnrCtx.h:236
 TGLRnrCtx.h:237
 TGLRnrCtx.h:238
 TGLRnrCtx.h:239
 TGLRnrCtx.h:240
 TGLRnrCtx.h:241
 TGLRnrCtx.h:242
 TGLRnrCtx.h:243
 TGLRnrCtx.h:244
 TGLRnrCtx.h:245
 TGLRnrCtx.h:246
 TGLRnrCtx.h:247
 TGLRnrCtx.h:248
 TGLRnrCtx.h:249
 TGLRnrCtx.h:250
 TGLRnrCtx.h:251
 TGLRnrCtx.h:252
 TGLRnrCtx.h:253
 TGLRnrCtx.h:254
 TGLRnrCtx.h:255
 TGLRnrCtx.h:256
 TGLRnrCtx.h:257
 TGLRnrCtx.h:258
 TGLRnrCtx.h:259
 TGLRnrCtx.h:260
 TGLRnrCtx.h:261
 TGLRnrCtx.h:262
 TGLRnrCtx.h:263
 TGLRnrCtx.h:264
 TGLRnrCtx.h:265
 TGLRnrCtx.h:266
 TGLRnrCtx.h:267
 TGLRnrCtx.h:268
 TGLRnrCtx.h:269
 TGLRnrCtx.h:270
 TGLRnrCtx.h:271
 TGLRnrCtx.h:272
 TGLRnrCtx.h:273
 TGLRnrCtx.h:274
 TGLRnrCtx.h:275
 TGLRnrCtx.h:276
 TGLRnrCtx.h:277