#ifndef ROOT_TGLViewer
#define ROOT_TGLViewer
#include "TGLViewerBase.h"
#include "TGLRnrCtx.h"
#include "TGLSelectRecord.h"
#include "TVirtualViewer3D.h"
#include "TGLScene.h"
#include "TGLPerspectiveCamera.h"
#include "TGLOrthoCamera.h"
#include "TTimer.h"
#include "TPoint.h"
#include "CsgOps.h"
#include "GuiTypes.h"
#include "RQ_OBJECT.h"
#include <vector>
class TGLFaceSet;
class TGLRedrawTimer;
class TGLViewerEditor;
class TGLWidget;
class TGLLightSet;
class TGLClipSet;
class TGLManipSet;
class TGLCameraMarkupStyle;
class TGLContextIdentity;
class TContextMenu;
class TGLViewer : public TVirtualViewer3D,
                  public TGLViewerBase
{
   RQ_OBJECT("TGLViewer")
   friend class TGLOutput;
public:
   enum ECameraType { kCameraPerspXOZ, kCameraPerspYOZ, kCameraPerspXOY,
                      kCameraOrthoXOY, kCameraOrthoXOZ, kCameraOrthoZOY };
private:
   TGLViewer(const TGLViewer &);             
   TGLViewer & operator=(const TGLViewer &); 
   void InitSecondaryObjects();
protected:
   
   TVirtualPad  * fPad;         
   
   TContextMenu * fContextMenu; 
   
   
   TGLPerspectiveCamera fPerspectiveCameraXOZ; 
   TGLPerspectiveCamera fPerspectiveCameraYOZ; 
   TGLPerspectiveCamera fPerspectiveCameraXOY; 
   TGLOrthoCamera       fOrthoXOYCamera;       
   TGLOrthoCamera       fOrthoXOZCamera;       
   TGLOrthoCamera       fOrthoZOYCamera;       
   TGLCamera          * fCurrentCamera;        
   
   TGLLightSet        * fLightSet;             
   
   TGLClipSet         * fClipSet;              
   
   TGLSelectRecord      fCurrentSelRec;        
   TGLSelectRecord      fSelRec;               
   TGLSelectRecord      fSecSelRec;            
   TGLManipSet        * fSelectedPShapeRef;    
   
   TGLOverlayElement  * fCurrentOvlElm;        
   TGLOvlSelectRecord   fOvlSelRec;            
   
   Bool_t            fInternalRebuild;       
   Bool_t            fPostSceneBuildSetup;   
   Bool_t            fAcceptedAllPhysicals;  
   Bool_t            fForceAcceptAll;        
   Bool_t            fInternalPIDs;          
   UInt_t            fNextInternalPID;       
   
   typedef std::pair<UInt_t, RootCsg::TBaseMesh *> CSPart_t;
   mutable TGLFaceSet     *fComposite; 
   UInt_t                  fCSLevel;
   std::vector<CSPart_t>   fCSTokens;
   
   enum EDragAction   { kDragNone,
                        kDragCameraRotate, kDragCameraTruck, kDragCameraDolly,
                        kDragOverlay };
   EDragAction          fAction;
   TPoint               fLastPos;
   UInt_t               fActiveButtonID;
   
   TGLRedrawTimer     * fRedrawTimer; 
   
   
   TGLScene       fScene;          
   TGLRect        fViewport;       
   Color_t        fClearColor;     
   Int_t          fAxesType;       
   Bool_t         fReferenceOn;    
   TGLVertex3     fReferencePos;   
   TGLCameraMarkupStyle * fCameraMarkup; 
   Bool_t         fInitGL;         
   Bool_t         fSmartRefresh;   
   
   Bool_t         fDebugMode;             
   UInt_t         fAcceptedPhysicals;     
   UInt_t         fRejectedPhysicals;     
   Bool_t         fIsPrinting;
   
   
   
   
   void InitGL();
   void PreDraw();
   void PostDraw();
   void MakeCurrent() const;
   void SwapBuffers() const;
   
   Bool_t             RebuildScene();
   Int_t              ValidateObjectBuffer(const TBuffer3D & buffer, Bool_t includeRaw) const;
   TGLLogicalShape  * CreateNewLogical(const TBuffer3D & buffer) const;
   TGLPhysicalShape * CreateNewPhysical(UInt_t physicalID, const TBuffer3D & buffer,
                                        const TGLLogicalShape & logical) const;
   RootCsg::TBaseMesh *BuildComposite();
   
   void        SetViewport(Int_t x, Int_t y, Int_t width, Int_t height);
   void        SetupCameras(Bool_t reset);
protected:
   TGLWidget         *fGLWindow;
   Int_t              fGLDevice; 
   TGLContextIdentity*fGLCtxId;  
   TGLViewerEditor *fPadEditor;
   std::map<TClass*, TClass*> fDirectRendererMap; 
   TClass*          FindDirectRendererClass(TClass* cls);
   TGLLogicalShape* AttemptDirectRenderer(TObject* id);
   
   Bool_t           fIgnoreSizesOnUpdate;      
   Bool_t           fResetCamerasOnUpdate;     
   Bool_t           fResetCamerasOnNextUpdate; 
   Bool_t           fResetCameraOnDoubleClick; 
public:
   TGLViewer(TVirtualPad * pad, Int_t x, Int_t y, Int_t width, Int_t height);
   TGLViewer(TVirtualPad * pad);
   virtual ~TGLViewer();
   
   void AddHistoPhysical(TGLLogicalShape* log);
   void SubPadPaint(TVirtualPad* pad);
   
   virtual Bool_t CanLoopOnPrimitives() const { return kTRUE; }
   virtual void   PadPaint(TVirtualPad* pad);
   
   virtual Int_t  DistancetoPrimitive(Int_t px, Int_t py);
   virtual void   ExecuteEvent(Int_t event, Int_t px, Int_t py);
   virtual Bool_t PreferLocalFrame() const;
   virtual void   BeginScene();
   virtual Bool_t BuildingScene() const { return fScene.CurrentLock() == kModifyLock; }
   virtual void   EndScene();
   virtual Int_t  AddObject(const TBuffer3D & buffer, Bool_t * addChildren = 0);
   virtual Int_t  AddObject(UInt_t physicalID, const TBuffer3D & buffer, Bool_t * addChildren = 0);
   virtual Bool_t OpenComposite(const TBuffer3D & buffer, Bool_t * addChildren = 0);
   virtual void   CloseComposite();
   virtual void   AddCompositeOp(UInt_t operation);
   virtual void   PrintObjects();
   virtual void   ResetCameras()                { SetupCameras(kTRUE); }
   virtual void   ResetCamerasAfterNextUpdate() { fResetCamerasOnNextUpdate = kTRUE; }
   virtual void   RefreshPadEditor(TObject* = 0) {}
   Int_t   GetDev()          const           { return fGLDevice; }
   Color_t GetClearColor()   const           { return fClearColor; }
   void    SetClearColor(Color_t col)        { fClearColor = col; }
   Bool_t  GetSmartRefresh() const           { return fSmartRefresh; }
   void    SetSmartRefresh(Bool_t smart_ref) { fSmartRefresh = smart_ref; }
   TGLLightSet* GetLightSet() const { return fLightSet; }
   TGLClipSet * GetClipSet()  const { return fClipSet; }
   
   TGLCamera & CurrentCamera() const { return *fCurrentCamera; }
   void SetCurrentCamera(ECameraType camera);
   void SetOrthoCamera(ECameraType camera, Double_t left, Double_t right, Double_t top, Double_t bottom);
   void SetPerspectiveCamera(ECameraType camera, Double_t fov, Double_t dolly,
                             Double_t center[3], Double_t hRotate, Double_t vRotate);
   void GetGuideState(Int_t & axesType, Bool_t & referenceOn, Double_t referencePos[3]) const;
   void SetGuideState(Int_t axesType, Bool_t referenceOn, const Double_t referencePos[3]);
   TGLCameraMarkupStyle* GetCameraMarkup() const { return fCameraMarkup; }
   void SetCameraMarkup(TGLCameraMarkupStyle* m) { fCameraMarkup = m; }
   const TGLPhysicalShape * GetSelected() const;
   
   
   void RequestDraw(Short_t LOD = TGLRnrCtx::kLODMed); 
   virtual void PreRender();
   void DoDraw();
   void DrawGuides();
   void DrawCameraMarkup();
   void DrawDebugInfo();
   Bool_t RequestSelect(Int_t x, Int_t y, Bool_t trySecSel=kFALSE); 
   Bool_t DoSelect(Int_t x, Int_t y, Bool_t trySecSel=kFALSE);      
   void   ApplySelection();
   Bool_t RequestOverlaySelect(Int_t x, Int_t y); 
   Bool_t DoOverlaySelect(Int_t x, Int_t y);      
   
   void   UpdateScene();
   Bool_t GetIgnoreSizesOnUpdate() const        { return fIgnoreSizesOnUpdate; }
   void   SetIgnoreSizesOnUpdate(Bool_t v)      { fIgnoreSizesOnUpdate = v; }
   void   ResetCurrentCamera();
   Bool_t GetResetCamerasOnUpdate() const       { return fResetCamerasOnUpdate; }
   void   SetResetCamerasOnUpdate(Bool_t v)     { fResetCamerasOnUpdate = v; }
   Bool_t GetResetCameraOnDoubleClick() const   { return fResetCameraOnDoubleClick; }
   void   SetResetCameraOnDoubleClick(Bool_t v) { fResetCameraOnDoubleClick = v; }
   virtual void PostSceneBuildSetup(Bool_t resetCameras);
   virtual void SelectionChanged(); 
   
   Bool_t HandleEvent(Event_t *ev);
   Bool_t HandleButton(Event_t *ev);
   Bool_t HandleDoubleClick(Event_t *ev);
   Bool_t HandleConfigureNotify(Event_t *ev);
   Bool_t HandleKey(Event_t *ev);
   Bool_t HandleMotion(Event_t *ev);
   Bool_t HandleExpose(Event_t *ev);
   void   Repaint();
   void SetPadEditor(TGLViewerEditor *ed){fPadEditor = ed;}
   ClassDef(TGLViewer,0) 
};
class TGLRedrawTimer : public TTimer
{
private:
   TGLViewer & fViewer;
   Short_t     fRedrawLOD;
   Bool_t      fPending;
public:
   TGLRedrawTimer(TGLViewer & viewer) :
      fViewer(viewer), fRedrawLOD(TGLRnrCtx::kLODHigh), fPending(kFALSE) {}
   ~TGLRedrawTimer() {}
   void RequestDraw(Int_t milliSec, Short_t redrawLOD=TGLRnrCtx::kLODHigh)
   {
      if (fPending) TurnOff(); else fPending = kTRUE;
      if (redrawLOD > fRedrawLOD) fRedrawLOD = redrawLOD;
      TTimer::Start(milliSec, kTRUE);
   }
   virtual void Stop()
   {
      if (fPending) { TurnOff(); fPending = kFALSE; }
   }
   Bool_t Notify()
   {
      TurnOff();
      fPending = kFALSE;
      fViewer.RequestDraw(fRedrawLOD);
      return kTRUE;
   }
};
#endif // ROOT_TGLViewer
This page has been automatically generated. If you have any comments or suggestions about the page layout send a mail to ROOT support, or contact the developers with any questions or problems regarding ROOT.