// @(#)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_TGLScene_H
#define ROOT_TGLScene_H

#include "TGLSceneBase.h"
#include "TGLSceneInfo.h"

#include "Gtypes.h"

#include <map>
#include <vector>

class TGLObject;
class TGLCamera;
class TGLLogicalShape;
class TGLPhysicalShape;

class TGLContextIdentity;

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

   // Compare physical-shape volumes/diagonals -- for draw-vec sorting
   static Bool_t ComparePhysicalVolumes(const TGLPhysicalShape* shape1,
                                        const TGLPhysicalShape* shape2);
   static Bool_t ComparePhysicalDiagonals(const TGLPhysicalShape* shape1,
                                          const TGLPhysicalShape* shape2);
public:
   // Logical shapes
   typedef std::map<TObject*, TGLLogicalShape*>    LogicalShapeMap_t;
   typedef LogicalShapeMap_t::value_type           LogicalShapeMapValueType_t;
   typedef LogicalShapeMap_t::iterator             LogicalShapeMapIt_t;
   typedef LogicalShapeMap_t::const_iterator       LogicalShapeMapCIt_t;

   // Physical Shapes
   typedef std::map<UInt_t, TGLPhysicalShape*>     PhysicalShapeMap_t;
   typedef PhysicalShapeMap_t::value_type          PhysicalShapeMapValueType_t;
   typedef PhysicalShapeMap_t::iterator            PhysicalShapeMapIt_t;
   typedef PhysicalShapeMap_t::const_iterator      PhysicalShapeMapCIt_t;


   struct DrawElement_t
   {
      const TGLPhysicalShape* fPhysical; // Physical shape.

      Float_t    fPixelSize; // Size of largest lod-axis in pixels.
      Short_t    fPixelLOD;  // Size in LOD units.
      Short_t    fFinalLOD;  // Corrected with SceneLOD and quantized.

      DrawElement_t(const TGLPhysicalShape* pshp=0) :
         fPhysical(pshp), fPixelSize(0), fPixelLOD(0), fFinalLOD(0) {}
   };

   typedef std::vector<DrawElement_t>              DrawElementVec_t;
   typedef std::vector<DrawElement_t>::iterator    DrawElementVec_i;

   typedef std::vector<DrawElement_t*>             DrawElementPtrVec_t;
   typedef std::vector<DrawElement_t*>::iterator   DrawElementPtrVec_i;

   // List of physical shapes ordered by volume/diagonal
   typedef std::vector<const TGLPhysicalShape*>    ShapeVec_t;
   typedef ShapeVec_t::iterator                    ShapeVec_i;

   // ----------------------------------------------------------------
   // SceneInfo ... extended scene context

   class TSceneInfo : public TGLSceneInfo
   {
   private:
      Bool_t CmpDrawElements(const DrawElement_t& de1, const DrawElement_t& de2);

   protected:
      void ClearDrawElementVec(DrawElementVec_t& vec, Int_t maxSize);
      void ClearDrawElementPtrVec(DrawElementPtrVec_t& vec, Int_t maxSize);

   public:
      ShapeVec_t          fShapesOfInterest;

      DrawElementVec_t    fVisibleElements;

      UInt_t              fMinorStamp;
      DrawElementPtrVec_t fOpaqueElements;
      DrawElementPtrVec_t fTranspElements;
      DrawElementPtrVec_t fSelOpaqueElements;
      DrawElementPtrVec_t fSelTranspElements;

      TSceneInfo(TGLViewerBase* view=0, TGLScene* scene=0);
      virtual ~TSceneInfo();

      void ClearAfterRebuild();
      void ClearAfterUpdate();

      void Lodify(TGLRnrCtx& ctx);

      void PreDraw();
      void PostDraw();

      // ---------------
      // Draw statistics

      Int_t                     fOpaqueCnt;
      Int_t                     fTranspCnt;
      Int_t                     fAsPixelCnt;
      std::map<TClass*, UInt_t> fByShapeCnt;

      void ResetDrawStats();
      void UpdateDrawStats(const TGLPhysicalShape& shape, Short_t lod);
      void DumpDrawStats(); // Debug
   };
   friend class TSceneInfo; // for solaris cc


protected:
   LogicalShapeMap_t      fLogicalShapes;  //!
   PhysicalShapeMap_t     fPhysicalShapes; //!

   virtual void DestroyPhysicalInternal(PhysicalShapeMapIt_t pit);

   // GLcontext
   TGLContextIdentity * fGLCtxIdentity;
   void ReleaseGLCtxIdentity();

   // Smart Refresh -- will go in this version
   Bool_t                    fInSmartRefresh;    //!
   mutable LogicalShapeMap_t fSmartRefreshCache; //!

   // State that requires recreation of display-lists
   Float_t                   fLastPointSizeScale;
   Float_t                   fLastLineWidthScale;

   // ----------------------------------------------------------------
   // ----------------------------------------------------------------

public:
   TGLScene();
   virtual ~TGLScene();

   virtual void CalcBoundingBox() const;

   virtual TSceneInfo* CreateSceneInfo(TGLViewerBase* view);
   virtual void        RebuildSceneInfo(TGLRnrCtx& rnrCtx);
   virtual void        UpdateSceneInfo(TGLRnrCtx& rnrCtx);
   virtual void        LodifySceneInfo(TGLRnrCtx& rnrCtx);


   // 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 RenderHighlight(TGLRnrCtx&           rnrCtx,
                                DrawElementPtrVec_t& elVec);

   // virtual void PostRender(TGLRnrCtx& rnrCtx);
   virtual void PostDraw       (TGLRnrCtx& rnrCtx);

   virtual void RenderAllPasses(TGLRnrCtx&           rnrCtx,
                                DrawElementPtrVec_t& elVec,
                                Bool_t               check_timeout);


   virtual void RenderElements (TGLRnrCtx&           rnrCtx,
                                DrawElementPtrVec_t& elVec,
                                Bool_t               check_timeout,
                                const TGLPlaneSet_t* clipPlanes = 0);

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

   // Basic logical shape management
   virtual void              AdoptLogical(TGLLogicalShape& shape);
   virtual Bool_t            DestroyLogical(TObject* logid, Bool_t mustFind=kTRUE);
   virtual Int_t             DestroyLogicals();
   virtual TGLLogicalShape*  FindLogical(TObject* logid)  const;

   // Basic physical shape management
   virtual void              AdoptPhysical(TGLPhysicalShape& shape);
   virtual Bool_t            DestroyPhysical(UInt_t phid);
   virtual Int_t             DestroyPhysicals();
   virtual TGLPhysicalShape* FindPhysical(UInt_t phid) const;

   virtual UInt_t            GetMaxPhysicalID();

   // ----------------------------------------------------------------
   // Updates / removals of logical and physical shapes

   virtual Bool_t BeginUpdate();
   virtual void   EndUpdate(Bool_t minorChange=kTRUE, Bool_t sceneChanged=kTRUE, Bool_t updateViewers=kTRUE);

   virtual void UpdateLogical(TObject* logid);

   virtual void UpdatePhysical(UInt_t phid, Double_t* trans, UChar_t* col);
   virtual void UpdatePhysical(UInt_t phid, Double_t* trans, Color_t cidx=-1, UChar_t transp=0);

   virtual void UpdatePhysioLogical(TObject* logid, Double_t* trans, UChar_t* col);
   virtual void UpdatePhysioLogical(TObject* logid, Double_t* trans, Color_t cidx, UChar_t transp);

   // Temporary export for setting selected-state of physical shapes.
   LogicalShapeMap_t& RefLogicalShapes() { return fLogicalShapes; }


   // ----------------------------------------------------------------
   // SmartRefresh

   UInt_t            BeginSmartRefresh();
   void              EndSmartRefresh();
   TGLLogicalShape*  FindLogicalSmartRefresh(TObject* ID) const;


   // ----------------------------------------------------------------
   // GL-context holding display-list definitions

   TGLContextIdentity* GetGLCtxIdentity() const { return fGLCtxIdentity; }


   // ----------------------------------------------------------------
   // Helpers

   UInt_t SizeOfScene() const;
   void   DumpMapSizes() const;

   static void RGBAFromColorIdx(Float_t rgba[4], Color_t ci, Char_t transp=0);

   static Bool_t IsOutside(const TGLBoundingBox& box,
                           const TGLPlaneSet_t& planes);

   ClassDef(TGLScene, 0); // Standard ROOT OpenGL scene with logial/physical shapes.
};


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