// @(#)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_TGLSceneBase_H
#define ROOT_TGLSceneBase_H

#include "TGLLockable.h"
#include "TGLBoundingBox.h"

#include <TString.h>

#include <list>

class TGLViewerBase;
class TGLSceneInfo;
class TGLClip;
class TGLRnrCtx;
class TGLLogicalShape;
class TGLSelectRecord;

// Avoid TObject inheritance due to clash with TObject::Draw as well
// as possible inheritance of TGLPadScene from VierualViewer3D.

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

   static UInt_t fgSceneIDSrc;

protected:
   UInt_t             fSceneID;     // Unique scene id.
   TString            fName;        // Object identifier.
   TString            fTitle;       // Object title.

   UInt_t             fTimeStamp;   // Counter increased on every update.
   UInt_t             fMinorStamp;  // Counter increased on minimal update.
   Short_t            fLOD;         // Scene-lod.
   Short_t            fStyle;       // Scene-style.
   Float_t            fWFLineW;     // Scene wire-frame line-width.
   Float_t            fOLLineW;     // Scene outline line-width.
   TGLClip          * fClip;        // Scene clipping-plane.
   Bool_t             fSelectable;  // Objects in the scene are selectable.

   // BoundingBox
   mutable TGLBoundingBox fBoundingBox;      // bounding box for scene (axis aligned) - lazy update - use BoundingBox() to access
   mutable Bool_t         fBoundingBoxValid; // bounding box valid?

   Bool_t  fDoFrustumCheck;  // Perform global frustum-check in UpdateSceneInfo()
   Bool_t  fDoClipCheck;     // Perform global clip-plane-check in UpdateSceneInfo()

   // Interface to other components
   typedef std::list<TGLViewerBase*>           ViewerList_t;
   typedef std::list<TGLViewerBase*>::iterator ViewerList_i;

   ViewerList_t       fViewers;
   Bool_t             fAutoDestruct;

   // Possible future extensions
   // TGLMatrix fGlobalTrans;

public:
   TGLSceneBase();
   virtual ~TGLSceneBase();

   void AddViewer(TGLViewerBase* viewer);
   void RemoveViewer(TGLViewerBase* viewer);
   void TagViewersChanged();

   virtual const char* LockIdStr() const;

   virtual const char  *GetName()  const { return fName; }
   virtual const char  *GetTitle() const { return fTitle; }
   virtual void  SetName (const char *name)  { fName = name; }
   virtual void  SetTitle(const char *title) { fTitle = title; }
   virtual void  SetNameTitle(const char *name, const char *title) { SetName(name); SetTitle(title); }

   virtual TGLSceneInfo* CreateSceneInfo(TGLViewerBase* view);
   virtual void          RebuildSceneInfo(TGLRnrCtx& ctx);
   virtual void          UpdateSceneInfo(TGLRnrCtx& ctx);
   virtual void          LodifySceneInfo(TGLRnrCtx& ctx);

   // Rendering
   virtual void PreDraw   (TGLRnrCtx& rnrCtx);
   virtual void PreRender (TGLRnrCtx& rnrCtx);
   virtual void Render    (TGLRnrCtx& rnrCtx);
   virtual void RenderOpaque   (TGLRnrCtx& rnrCtx);
   virtual void RenderTransp   (TGLRnrCtx& rnrCtx);
   virtual void RenderSelOpaque(TGLRnrCtx& rnrCtx);
   virtual void RenderSelTransp(TGLRnrCtx& rnrCtx);
   virtual void RenderSelOpaqueForHighlight(TGLRnrCtx& rnrCtx);
   virtual void RenderSelTranspForHighlight(TGLRnrCtx& rnrCtx);
   virtual void PostRender(TGLRnrCtx& rnrCtx);
   virtual void PostDraw  (TGLRnrCtx& rnrCtx);

   virtual TGLLogicalShape* FindLogical(TObject*) const { return 0; }

   // Selection interface
   virtual Bool_t ResolveSelectRecord(TGLSelectRecord& rec, Int_t curIdx);


   // Getters & setters

   UInt_t GetTimeStamp() const { return fTimeStamp; }
   void   IncTimeStamp()       { ++fTimeStamp; fMinorStamp = 1; }

   UInt_t GetMinorStamp() const { return fMinorStamp; }
   void   IncMinorStamp()       { ++fMinorStamp;      }

   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;   }

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

   Bool_t   GetSelectable()   const { return fSelectable; }
   void     SetSelectable(Bool_t a) { fSelectable = a;    }

   Bool_t   GetAutoDestruct()   const { return fAutoDestruct; }
   void     SetAutoDestruct(Bool_t a) { fAutoDestruct = a;    }

   // BoundingBox

   virtual void CalcBoundingBox() const = 0;
   void         InvalidateBoundingBox() { fBoundingBoxValid = kFALSE; }
   const TGLBoundingBox& BoundingBox() const
   { if (!fBoundingBoxValid) CalcBoundingBox(); return fBoundingBox; }


   ClassDef(TGLSceneBase, 0) // Base-class for OpenGL scenes.
}; // endclass TGLSceneBase


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