// @(#)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_TGLSceneInfo_H
#define ROOT_TGLSceneInfo_H

#include "Rtypes.h"

#include "TGLBoundingBox.h"
#include "TGLUtil.h"

class TGLViewerBase;
class TGLSceneBase;
class TGLClip;
class TGLRenderContext;
class TGLCamera;

class TGLSceneInfo
{
   friend class TGLSceneBase;

public:
   enum EClipTest { kClipNone, kClipOutside, kClipInside };

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

protected:
   TGLViewerBase  * fViewer;
   TGLSceneBase   * fScene;
   Bool_t           fActive;      // Show fScene in fViewer

   Short_t          fLOD;         // Optional override of scene lod
   Short_t          fStyle;       // Optional override of scene style
   Float_t          fWFLineW;     // Optional override of scene wire-frame line-width
   Float_t          fOLLineW;     // Optional override of scene outline line-width
   TGLClip        * fClip;        // Optional override of clipping-plane

   Short_t          fLastLOD;     // Last combined viewer/scene lod   (set in scene::lodify-scene-info).
   Short_t          fLastStyle;   // Last combined viewer/scene style (set in scene::pre-draw).
   Float_t          fLastWFLineW; // Last combined viewer/scene wire-frame line-width (set in scene::pre-draw).
   Float_t          fLastOLLineW; // Last combined viewer/scene outline line-width (set in scene::pre-draw).
   TGLClip        * fLastClip;    // Last combined viewer/scene clip  (set in scene::update)
   TGLCamera      * fLastCamera;  // Last camera used.

   UInt_t           fSceneStamp;  // Scene's time-stamp on last update.
   UInt_t           fClipStamp;   // Clip's time-stamp on last update.
   UInt_t           fCameraStamp; // Camera's time-stamp on last update.
   Bool_t           fUpdateTimeouted; // Set if update was interrupted.

   // Eventually we will allow additional per-scene transforamtion.
   // TGLMatrix  fSceneTrans;
   // Also needed:
   // *) transformed clipping planes of the camera
   // *) transformed bounding-box of the scene
   TGLBoundingBox   fTransformedBBox;

   Bool_t           fViewCheck;     // Viewer side check if render is necessary.
   Bool_t           fInFrustum;     // Is scene intersecting view-frustum.
   Bool_t           fInClip;        // Is scene contained within clipping-volume.
   Char_t           fClipMode;      // Clipping mode, can be disbled.
   TGLPlaneSet_t    fFrustumPlanes; // Clipping planes defined by frustum; only those intersecting the scene volume are kept.
   TGLPlaneSet_t    fClipPlanes;    // Clipping planes from clip-object; which planes are kept depends on inside/outside mode.

   // Additional stuff (scene-class specific) can be added by sub-classing.
   // For TGLScene these data include draw-lists after clipping.

public:
   TGLSceneInfo(TGLViewerBase* view=0, TGLSceneBase* scene=0);
   virtual ~TGLSceneInfo() {}

   TGLViewerBase * GetViewer() const { return  fViewer; }
   TGLViewerBase & RefViewer() const { return *fViewer; }
   TGLSceneBase  * GetScene()  const { return  fScene;  }
   TGLSceneBase  & RefScene()  const { return *fScene;  }

   Bool_t GetActive() const { return fActive; }
   void   SetActive(Bool_t a);

   void  SetupTransformsAndBBox();

   const TGLBoundingBox& GetTransformedBBox() { return fTransformedBBox; }

   virtual void SetSceneTrans(TGLMatrix&) { ResetSceneStamp(); }

   Bool_t   ViewCheck() const   { return fViewCheck; }
   void     ViewCheck(Bool_t c) { fViewCheck = c;    }
   Bool_t   IsInFrustum() const { return fInFrustum; }
   void     InFrustum(Bool_t f) { fInFrustum = f;    }
   Bool_t   IsInClip()    const { return fInClip;    }
   void     InClip(Bool_t c)    { fInClip = c;       }
   Char_t   ClipMode()    const { return fClipMode;  }
   void     ClipMode(Char_t m)  { fClipMode = m;     }

   Bool_t   ShouldClip()  const { return fClipMode != kClipNone; }
   Bool_t   IsVisible()   const { return fInFrustum && fInClip;  }

   std::vector<TGLPlane>& FrustumPlanes() { return fFrustumPlanes; }
   std::vector<TGLPlane>& ClipPlanes()    { return fClipPlanes;    }

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

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

   Short_t  LastLOD()        const { return fLastLOD; }
   void     SetLastLOD(Short_t ld) { fLastLOD = ld;   }

   Short_t  LastStyle()      const   { return fLastStyle; }
   void     SetLastStyle(Short_t st) { fLastStyle = st;   }

   Float_t  LastWFLineW()       const { return fLastWFLineW; }
   void     SetLastWFLineW(Float_t w) { fLastWFLineW = w;    }
   Float_t  LastOLLineW()       const { return fLastOLLineW; }
   void     SetLastOLLineW(Float_t w) { fLastOLLineW = w;    }

   TGLClip* LastClip()         const { return fLastClip; }
   void     SetLastClip(TGLClip *p)  { fLastClip = p;    }

   TGLCamera* LastCamera()        const { return fLastCamera; }
   void     SetLastCamera(TGLCamera *p) { fLastCamera = p;    }

   UInt_t   SceneStamp()       const { return fSceneStamp; }
   void     SetSceneStamp(UInt_t ts) { fSceneStamp = ts;   }
   void     ResetSceneStamp()        { fSceneStamp = 0;    }

   UInt_t   ClipStamp()       const { return fClipStamp; }
   void     SetClipStamp(UInt_t ts) { fClipStamp = ts;   }
   void     ResetClipStamp()        { fClipStamp = 0;    }

   UInt_t   CameraStamp()       const { return fCameraStamp; }
   void     SetCameraStamp(UInt_t ts) { fCameraStamp = ts;   }
   void     ResetCameraStamp()        { fCameraStamp = 0;    }

   Bool_t   HasUpdateTimeouted() const { return fUpdateTimeouted;   }
   void     UpdateTimeouted()          { fUpdateTimeouted = kTRUE;  }
   void     ResetUpdateTimeouted()     { fUpdateTimeouted = kFALSE; }

   ClassDef(TGLSceneInfo, 0) // Data about a scene within a viewer context.
}; // endclass TGLSceneInfo


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