ROOT logo
// @(#)root/gl:$Id: TGLScenePad.h 26649 2008-12-04 11:30:23Z matevz $
// Author:  Matevz Tadel, Jun 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_TGLScenePad
#define ROOT_TGLScenePad

#ifndef ROOT_TGLScene
#include "TGLScene.h"
#endif
#ifndef ROOT_TVirtualViewer3D
#include "TVirtualViewer3D.h"
#endif
#ifndef ROOT_CsgOps
#include "CsgOps.h"
#endif


class TGLViewer;
class TGLFaceSet;


class TGLScenePad : public TVirtualViewer3D,  public TGLScene {

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

protected:
   TVirtualPad*       fPad;

   // For building via VV3D
   Bool_t             fInternalPIDs;          //! using internal physical IDs
   UInt_t             fNextInternalPID;       //! next internal physical ID (from 1 - 0 reserved)
   UInt_t             fLastPID;               //! last physical ID that was processed in AddObject()
   Int_t              fAcceptedPhysicals;

   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;

   // Composite shape specific
   typedef std::pair<UInt_t, RootCsg::TBaseMesh*> CSPart_t;
   mutable TGLFaceSet     *fComposite; //! Paritally created composite
   UInt_t                  fCSLevel;
   std::vector<CSPart_t>   fCSTokens;
   RootCsg::TBaseMesh*     BuildComposite();

   TGLLogicalShape* AttemptDirectRenderer(TObject* id);

   Bool_t         fSmartRefresh;   //! cache logicals during scene rebuilds, use TAtt3D time-stamp to determine if they are still valid

public:
   TGLScenePad(TVirtualPad* pad);
   virtual ~TGLScenePad() {}

   TVirtualPad* GetPad() const { return fPad; }
   // void SetPad(TVirtualPad* p) { fPad = p; /* also need to drop contents */ }

   // Histo import and Sub-pad traversal
   void AddHistoPhysical(TGLLogicalShape* log);
   void SubPadPaint(TVirtualPad* pad);

   // PadPaint wrapper for calls from TGLViewer:
   virtual void   PadPaintFromViewer(TGLViewer* viewer);

   Bool_t  GetSmartRefresh() const           { return fSmartRefresh; }
   void    SetSmartRefresh(Bool_t smart_ref) { fSmartRefresh = smart_ref; }


   // TVirtualViewer3D interface

   virtual Bool_t CanLoopOnPrimitives() const { return kTRUE; }
   virtual void   PadPaint(TVirtualPad* pad);
   virtual void   ObjectPaint(TObject* obj, Option_t* opt="");

   // For now handled by viewer
   virtual Int_t  DistancetoPrimitive(Int_t /*px*/, Int_t /*py*/) { return 9999; }
   virtual void   ExecuteEvent(Int_t /*event*/, Int_t /*px*/, Int_t /*py*/) {}

   virtual Bool_t PreferLocalFrame() const { return kTRUE; }

   virtual void   BeginScene();
   virtual Bool_t BuildingScene() const { return 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);

   ClassDef(TGLScenePad, 0); // GL-scene filled via TPad-TVirtualViewer interface.
};

#endif
 TGLScenePad.h:1
 TGLScenePad.h:2
 TGLScenePad.h:3
 TGLScenePad.h:4
 TGLScenePad.h:5
 TGLScenePad.h:6
 TGLScenePad.h:7
 TGLScenePad.h:8
 TGLScenePad.h:9
 TGLScenePad.h:10
 TGLScenePad.h:11
 TGLScenePad.h:12
 TGLScenePad.h:13
 TGLScenePad.h:14
 TGLScenePad.h:15
 TGLScenePad.h:16
 TGLScenePad.h:17
 TGLScenePad.h:18
 TGLScenePad.h:19
 TGLScenePad.h:20
 TGLScenePad.h:21
 TGLScenePad.h:22
 TGLScenePad.h:23
 TGLScenePad.h:24
 TGLScenePad.h:25
 TGLScenePad.h:26
 TGLScenePad.h:27
 TGLScenePad.h:28
 TGLScenePad.h:29
 TGLScenePad.h:30
 TGLScenePad.h:31
 TGLScenePad.h:32
 TGLScenePad.h:33
 TGLScenePad.h:34
 TGLScenePad.h:35
 TGLScenePad.h:36
 TGLScenePad.h:37
 TGLScenePad.h:38
 TGLScenePad.h:39
 TGLScenePad.h:40
 TGLScenePad.h:41
 TGLScenePad.h:42
 TGLScenePad.h:43
 TGLScenePad.h:44
 TGLScenePad.h:45
 TGLScenePad.h:46
 TGLScenePad.h:47
 TGLScenePad.h:48
 TGLScenePad.h:49
 TGLScenePad.h:50
 TGLScenePad.h:51
 TGLScenePad.h:52
 TGLScenePad.h:53
 TGLScenePad.h:54
 TGLScenePad.h:55
 TGLScenePad.h:56
 TGLScenePad.h:57
 TGLScenePad.h:58
 TGLScenePad.h:59
 TGLScenePad.h:60
 TGLScenePad.h:61
 TGLScenePad.h:62
 TGLScenePad.h:63
 TGLScenePad.h:64
 TGLScenePad.h:65
 TGLScenePad.h:66
 TGLScenePad.h:67
 TGLScenePad.h:68
 TGLScenePad.h:69
 TGLScenePad.h:70
 TGLScenePad.h:71
 TGLScenePad.h:72
 TGLScenePad.h:73
 TGLScenePad.h:74
 TGLScenePad.h:75
 TGLScenePad.h:76
 TGLScenePad.h:77
 TGLScenePad.h:78
 TGLScenePad.h:79
 TGLScenePad.h:80
 TGLScenePad.h:81
 TGLScenePad.h:82
 TGLScenePad.h:83
 TGLScenePad.h:84
 TGLScenePad.h:85
 TGLScenePad.h:86
 TGLScenePad.h:87
 TGLScenePad.h:88
 TGLScenePad.h:89
 TGLScenePad.h:90
 TGLScenePad.h:91
 TGLScenePad.h:92
 TGLScenePad.h:93
 TGLScenePad.h:94
 TGLScenePad.h:95
 TGLScenePad.h:96
 TGLScenePad.h:97
 TGLScenePad.h:98
 TGLScenePad.h:99
 TGLScenePad.h:100
 TGLScenePad.h:101
 TGLScenePad.h:102
 TGLScenePad.h:103
 TGLScenePad.h:104