// @(#)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_TGLViewerBase
#define ROOT_TGLViewerBase

#include <TObject.h>

#include "TGLLockable.h"
#include <TGLBoundingBox.h>
#include "TGLOverlay.h"

#include <list>
#include <vector>

class TGLSceneBase;
class TGLSceneInfo;
class TGLCamera;
class TGLClip;
class TGLRnrCtx;
class TGLLogicalShape;
class TGLSelectRecord;
class TGLOvlSelectRecord;
class TGLOverlayElement;

// Avoid TObject inheritance due to clash with TVirtualViewer3D.

class TGLViewerBase : public TGLLockable // : public TObject
{
private:
   TGLViewerBase(const TGLViewerBase&);            // Not implemented
   TGLViewerBase& operator=(const TGLViewerBase&); // Not implemented

protected:
   typedef std::list<TGLSceneInfo*>             SceneInfoList_t;
   typedef SceneInfoList_t::iterator            SceneInfoList_i;

   typedef std::vector<TGLSceneInfo*>           SceneInfoVec_t;
   typedef SceneInfoVec_t::iterator             SceneInfoVec_i;

   typedef std::vector<TGLOverlayElement*>      OverlayElmVec_t;
   typedef OverlayElmVec_t::iterator            OverlayElmVec_i;

   SceneInfoList_i FindScene(TGLSceneBase* scene);

   typedef void (TGLSceneBase::* SubRender_foo) (TGLRnrCtx &);

   void SubRenderScenes(SubRender_foo render_foo);

   virtual void SetupClipObject();

   // Members

   TGLRnrCtx         *fRnrCtx;

   TGLCamera         *fCamera;      // Camera for rendering.
   TGLClip           *fClip;        // Viewer clipping-plane.
   Short_t            fLOD;         // Viewer-lod for rendering.
   Short_t            fStyle;       // Viewer-style for rendering.
   Float_t            fWFLineW;     // Optional override of scene wire-frame line-width
   Float_t            fOLLineW;     // Optional override of scene outline line-width

   Bool_t             fResetSceneInfosOnRender; // Request rebuild of view-specific scene data.
   Bool_t             fChanged;                 // Change requiring redraw is pending.

   SceneInfoList_t    fScenes;                  // Registered scenes.
   SceneInfoVec_t     fVisScenes;               // Visible scenes.

   TGLBoundingBox     fOverallBoundingBox;      // Axis-aligned union of scene bboxes.

   OverlayElmVec_t    fOverlay;

   // ================================================================

public:

   TGLViewerBase();
   virtual ~TGLViewerBase();

   virtual const char* LockIdStr() const;

   TGLSceneInfo* AddScene(TGLSceneBase* scene);
   void          RemoveScene(TGLSceneBase* scene);
   void          RemoveAllScenes();
   void          SceneDestructing(TGLSceneBase* scene);

   TGLSceneInfo* GetSceneInfo(TGLSceneBase* scene);

   TGLLogicalShape* FindLogicalInScenes(TObject* id);

   virtual void AddOverlayElement(TGLOverlayElement* el);
   virtual void RemoveOverlayElement(TGLOverlayElement* el);
   virtual void DeleteOverlayAnnotations();
   virtual void DeleteOverlayElements(TGLOverlayElement::ERole r);

   TGLClip* Clip()         const { return fClip; }
   void     SetClip(TGLClip *p)  { fClip = p;    }

   Short_t  LOD()          const { return fLOD; }
   void     SetLOD(Short_t lod)  { fLOD = lod;  }

   Short_t  Style()        const { return fStyle; }
   void     SetStyle(Short_t st) { fStyle = st;   }

   Float_t  WFLineW()       const { return fWFLineW; }
   void     SetWFLineW(Float_t w) { fWFLineW = w;    }
   Float_t  OLLineW()       const { return fOLLineW; }
   void     SetOLLineW(Float_t w) { fOLLineW = w;    }

   // ================================================================

   virtual void   ResetSceneInfos();
   virtual void   Changed() { fChanged = kTRUE; }
   virtual Bool_t IsChanged() const { return fChanged; }

   virtual void   MergeSceneBBoxes(TGLBoundingBox& bbox);

   // ================================================================

   // Low-level methods
   virtual void PreRender();
   virtual void Render();
   virtual void RenderNonSelected();
   virtual void RenderSelected();
   virtual void RenderSelectedForHighlight();
   virtual void RenderOpaque(Bool_t rnr_non_selected=kTRUE, Bool_t rnr_selected=kTRUE);
   virtual void RenderTransparent(Bool_t rnr_non_selected=kTRUE, Bool_t rnr_selected=kTRUE);
   virtual void RenderOverlay(Int_t state, Bool_t selection);
   virtual void PostRender();

   virtual void PreRenderOverlaySelection();
   virtual void PostRenderOverlaySelection();

   // High-level methods
   // virtual void Draw();
   // virtual void Select();
   // virtual void SelectOverlay();

   // Demangle select buffer
   Bool_t ResolveSelectRecord(TGLSelectRecord& rec, Int_t recIdx);
   // Slightly higher-level search in select-buffer
   Bool_t FindClosestRecord      (TGLSelectRecord& rec, Int_t& recIdx);
   Bool_t FindClosestOpaqueRecord(TGLSelectRecord& rec, Int_t& recIdx);

   // Demangle overlay select buffer
   Bool_t FindClosestOverlayRecord(TGLOvlSelectRecord& rec, Int_t& recIdx);

   TGLRnrCtx* GetRnrCtx() const { return  fRnrCtx; }
   TGLRnrCtx& RnrCtx() const    { return *fRnrCtx; }

   ClassDef(TGLViewerBase, 0); // GL Viewer base-class.
};


#endif
 TGLViewerBase.h:1
 TGLViewerBase.h:2
 TGLViewerBase.h:3
 TGLViewerBase.h:4
 TGLViewerBase.h:5
 TGLViewerBase.h:6
 TGLViewerBase.h:7
 TGLViewerBase.h:8
 TGLViewerBase.h:9
 TGLViewerBase.h:10
 TGLViewerBase.h:11
 TGLViewerBase.h:12
 TGLViewerBase.h:13
 TGLViewerBase.h:14
 TGLViewerBase.h:15
 TGLViewerBase.h:16
 TGLViewerBase.h:17
 TGLViewerBase.h:18
 TGLViewerBase.h:19
 TGLViewerBase.h:20
 TGLViewerBase.h:21
 TGLViewerBase.h:22
 TGLViewerBase.h:23
 TGLViewerBase.h:24
 TGLViewerBase.h:25
 TGLViewerBase.h:26
 TGLViewerBase.h:27
 TGLViewerBase.h:28
 TGLViewerBase.h:29
 TGLViewerBase.h:30
 TGLViewerBase.h:31
 TGLViewerBase.h:32
 TGLViewerBase.h:33
 TGLViewerBase.h:34
 TGLViewerBase.h:35
 TGLViewerBase.h:36
 TGLViewerBase.h:37
 TGLViewerBase.h:38
 TGLViewerBase.h:39
 TGLViewerBase.h:40
 TGLViewerBase.h:41
 TGLViewerBase.h:42
 TGLViewerBase.h:43
 TGLViewerBase.h:44
 TGLViewerBase.h:45
 TGLViewerBase.h:46
 TGLViewerBase.h:47
 TGLViewerBase.h:48
 TGLViewerBase.h:49
 TGLViewerBase.h:50
 TGLViewerBase.h:51
 TGLViewerBase.h:52
 TGLViewerBase.h:53
 TGLViewerBase.h:54
 TGLViewerBase.h:55
 TGLViewerBase.h:56
 TGLViewerBase.h:57
 TGLViewerBase.h:58
 TGLViewerBase.h:59
 TGLViewerBase.h:60
 TGLViewerBase.h:61
 TGLViewerBase.h:62
 TGLViewerBase.h:63
 TGLViewerBase.h:64
 TGLViewerBase.h:65
 TGLViewerBase.h:66
 TGLViewerBase.h:67
 TGLViewerBase.h:68
 TGLViewerBase.h:69
 TGLViewerBase.h:70
 TGLViewerBase.h:71
 TGLViewerBase.h:72
 TGLViewerBase.h:73
 TGLViewerBase.h:74
 TGLViewerBase.h:75
 TGLViewerBase.h:76
 TGLViewerBase.h:77
 TGLViewerBase.h:78
 TGLViewerBase.h:79
 TGLViewerBase.h:80
 TGLViewerBase.h:81
 TGLViewerBase.h:82
 TGLViewerBase.h:83
 TGLViewerBase.h:84
 TGLViewerBase.h:85
 TGLViewerBase.h:86
 TGLViewerBase.h:87
 TGLViewerBase.h:88
 TGLViewerBase.h:89
 TGLViewerBase.h:90
 TGLViewerBase.h:91
 TGLViewerBase.h:92
 TGLViewerBase.h:93
 TGLViewerBase.h:94
 TGLViewerBase.h:95
 TGLViewerBase.h:96
 TGLViewerBase.h:97
 TGLViewerBase.h:98
 TGLViewerBase.h:99
 TGLViewerBase.h:100
 TGLViewerBase.h:101
 TGLViewerBase.h:102
 TGLViewerBase.h:103
 TGLViewerBase.h:104
 TGLViewerBase.h:105
 TGLViewerBase.h:106
 TGLViewerBase.h:107
 TGLViewerBase.h:108
 TGLViewerBase.h:109
 TGLViewerBase.h:110
 TGLViewerBase.h:111
 TGLViewerBase.h:112
 TGLViewerBase.h:113
 TGLViewerBase.h:114
 TGLViewerBase.h:115
 TGLViewerBase.h:116
 TGLViewerBase.h:117
 TGLViewerBase.h:118
 TGLViewerBase.h:119
 TGLViewerBase.h:120
 TGLViewerBase.h:121
 TGLViewerBase.h:122
 TGLViewerBase.h:123
 TGLViewerBase.h:124
 TGLViewerBase.h:125
 TGLViewerBase.h:126
 TGLViewerBase.h:127
 TGLViewerBase.h:128
 TGLViewerBase.h:129
 TGLViewerBase.h:130
 TGLViewerBase.h:131
 TGLViewerBase.h:132
 TGLViewerBase.h:133
 TGLViewerBase.h:134
 TGLViewerBase.h:135
 TGLViewerBase.h:136
 TGLViewerBase.h:137
 TGLViewerBase.h:138
 TGLViewerBase.h:139
 TGLViewerBase.h:140
 TGLViewerBase.h:141
 TGLViewerBase.h:142
 TGLViewerBase.h:143
 TGLViewerBase.h:144
 TGLViewerBase.h:145
 TGLViewerBase.h:146
 TGLViewerBase.h:147
 TGLViewerBase.h:148
 TGLViewerBase.h:149
 TGLViewerBase.h:150
 TGLViewerBase.h:151
 TGLViewerBase.h:152
 TGLViewerBase.h:153
 TGLViewerBase.h:154
 TGLViewerBase.h:155
 TGLViewerBase.h:156
 TGLViewerBase.h:157
 TGLViewerBase.h:158
 TGLViewerBase.h:159
 TGLViewerBase.h:160
 TGLViewerBase.h:161
 TGLViewerBase.h:162
 TGLViewerBase.h:163