// @(#)root/gl:$Name: $:$Id: TGLScene.h,v 1.10 2005/06/23 15:08:45 brun Exp $ // Author: Richard Maunder 25/05/2005 // Parts taken from original TGLRender by Timur Pocheptsov /************************************************************************* * 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 #define ROOT_TGLScene #ifndef ROOT_TGLBoundingBox #include "TGLBoundingBox.h" #endif #ifndef ROOT_TError #include "TError.h" #endif #include #include #include class TGLCamera; class TGLDrawable; class TGLLogicalShape; class TGLPhysicalShape; /************************************************************************* * TGLScene - TODO * * * *************************************************************************/ class TGLScene { public: enum EDrawMode{kFill, kOutline, kWireFrame}; enum ELock { kUnlocked, // Unlocked kDrawLock, // Locked for draw, cannot select or modify kSelectLock, // Locked for select, cannot modify (draw part of select) kModifyLock }; // Locked for modify, cannot draw or select private: // Fields // Locking - can take/release via const handle mutable ELock fLock; //! // Logical shapes typedef std::map LogicalShapeMap_t; typedef LogicalShapeMap_t::value_type LogicalShapeMapValueType_t; typedef LogicalShapeMap_t::iterator LogicalShapeMapIt_t; typedef LogicalShapeMap_t::const_iterator LogicalShapeMapCIt_t; LogicalShapeMap_t fLogicalShapes; //! // Physical Shapes typedef std::map PhysicalShapeMap_t; typedef PhysicalShapeMap_t::value_type PhysicalShapeMapValueType_t; typedef PhysicalShapeMap_t::iterator PhysicalShapeMapIt_t; typedef PhysicalShapeMap_t::const_iterator PhysicalShapeMapCIt_t; PhysicalShapeMap_t fPhysicalShapes; //! // Draw list of physical shapes typedef std::vector DrawList_t; typedef DrawList_t::iterator DrawListIt_t; DrawList_t fDrawList; //! Bool_t fDrawListValid; //! (do we need this & fBoundingBoxValid) mutable TGLBoundingBox fBoundingBox; //! bounding box for scene (axis aligned) - lazy update - use BoundingBox() to access mutable Bool_t fBoundingBoxValid; //! bounding box valid? UInt_t fLastDrawLOD; //! last LOD for the scene draw EDrawMode fDrawMode; //! current draw style (Fill/Outline/WireFrame) TGLPhysicalShape * fSelectedPhysical; //! current selected physical shape // Methods // Draw sorting void SortDrawList(); static Bool_t ComparePhysicalVolumes(const TGLPhysicalShape * shape1, const TGLPhysicalShape * shape2); // Misc void DrawNumber(Double_t num, Double_t x, Double_t y, Double_t z, Double_t yorig) const; UInt_t CalcPhysicalLOD(const TGLPhysicalShape & shape, const TGLCamera & camera, UInt_t sceneLOD) const; // Non-copyable class TGLScene(const TGLScene &); TGLScene & operator=(const TGLScene &); public: TGLScene(); virtual ~TGLScene(); // ClassDef introduces virtual fns // Drawing const TGLBoundingBox & BoundingBox() const; void SetDrawMode(EDrawMode mode){fDrawMode = mode;} UInt_t Draw(const TGLCamera & camera, UInt_t sceneLOD, Double_t timeout = 0.0); void DrawAxes() const; Bool_t Select(const TGLCamera & camera); // Logical Shape Management void AdoptLogical(TGLLogicalShape & shape); Bool_t DestroyLogical(ULong_t ID); UInt_t DestroyLogicals(); void PurgeNextLogical() {}; TGLLogicalShape * FindLogical(ULong_t ID) const; // Physical Shape Management void AdoptPhysical(TGLPhysicalShape & shape); Bool_t DestroyPhysical(ULong_t ID); UInt_t DestroyPhysicals(Bool_t incModified, const TGLCamera * camera = 0); TGLPhysicalShape * FindPhysical(ULong_t ID) const; void SetPhysicalsColorByLogical(ULong_t logicalID, const Float_t rgba[4]); TGLPhysicalShape * GetSelected() const { return fSelectedPhysical; } void SelectedModified(); // Locking inline Bool_t TakeLock(ELock lock) const; inline Bool_t ReleaseLock(ELock lock) const; inline Bool_t IsLocked() const; inline ELock CurrentLock() const; static inline const char * LockName(ELock lock); static inline Bool_t LockValid(ELock lock); // Debug void Dump() const; UInt_t SizeOf() const; ClassDef(TGLScene,0) // a GL scene - collection of physical and logical shapes }; inline Bool_t TGLScene::TakeLock(ELock lock) const { if (LockValid(lock) && fLock == kUnlocked) { fLock = lock; if (gDebug>3) { Info("TGLScene::TakeLock", "took %s", LockName(fLock)); } return kTRUE; } Error("TGLScene::TakeLock", "Unable take %s, already %s", LockName(lock), LockName(fLock)); return kFALSE; } inline Bool_t TGLScene::ReleaseLock(ELock lock) const { if (LockValid(lock) && fLock == lock) { fLock = kUnlocked; if (gDebug>3) { Info("TGLScene::ReleaseLock", "released %s", LockName(lock)); } return kTRUE; } Error("TGLScene::ReleaseLock", "Unable release %s, is %s", LockName(lock), LockName(fLock)); return kFALSE; } inline Bool_t TGLScene::IsLocked() const { return (fLock != kUnlocked); } inline TGLScene::ELock TGLScene::CurrentLock() const { return fLock; } inline const char * TGLScene::LockName(ELock lock) { static const std::string names[5] = { "Unlocked", "DrawLock", "SelectLock", "ModifyLock", "UnknownLock" }; if (lock < 4) { return names[lock].c_str(); } else { return names[4].c_str(); } } inline Bool_t TGLScene::LockValid(ELock lock) { // Test if lock is a valid type to take/release // kUnlocked is never valid in these cases switch(lock) { case kDrawLock: case kSelectLock: case kModifyLock: return kTRUE; default: return kFALSE; } } #endif // ROOT_TGLScene