00001 00032 #ifndef LL_LLVOLUMEMGR_H 00033 #define LL_LLVOLUMEMGR_H 00034 00035 #include <map> 00036 00037 #include "llvolume.h" 00038 #include "llmemory.h" 00039 #include "llthread.h" 00040 00041 class LLVolumeParams; 00042 class LLVolumeLODGroup; 00043 00044 class LLVolumeLODGroup 00045 { 00046 LOG_CLASS(LLVolumeLODGroup); 00047 00048 public: 00049 enum 00050 { 00051 NUM_LODS = 4 00052 }; 00053 00054 LLVolumeLODGroup(const LLVolumeParams ¶ms); 00055 ~LLVolumeLODGroup(); 00056 bool cleanupRefs(); 00057 00058 static S32 getDetailFromTan(const F32 tan_angle); 00059 static void getDetailProximity(const F32 tan_angle, F32 &to_lower, F32& to_higher); 00060 static F32 getVolumeScaleFromDetail(const S32 detail); 00061 00062 LLVolume* getLODVolume(const S32 detail); 00063 BOOL derefLOD(LLVolume *volumep); 00064 S32 getNumRefs() const { return mRefs; } 00065 00066 const LLVolumeParams* getVolumeParams() const { return &mVolumeParams; }; 00067 00068 F32 dump(); 00069 friend std::ostream& operator<<(std::ostream& s, const LLVolumeLODGroup& volgroup); 00070 00071 protected: 00072 LLVolumeParams mVolumeParams; 00073 00074 S32 mRefs; 00075 S32 mLODRefs[NUM_LODS]; 00076 LLPointer<LLVolume> mVolumeLODs[NUM_LODS]; 00077 static F32 mDetailThresholds[NUM_LODS]; 00078 static F32 mDetailScales[NUM_LODS]; 00079 S32 mAccessCount[NUM_LODS]; 00080 }; 00081 00082 class LLVolumeMgr 00083 { 00084 public: 00085 LLVolumeMgr(); 00086 virtual ~LLVolumeMgr(); 00087 BOOL cleanup(); // Cleanup all volumes being managed, returns TRUE if no dangling references 00088 00089 virtual LLVolumeLODGroup* getGroup( const LLVolumeParams& volume_params ) const; 00090 00091 // whatever calls getVolume() never owns the LLVolume* and 00092 // cannot keep references for long since it may be deleted 00093 // later. For best results hold it in an LLPointer<LLVolume>. 00094 LLVolume *refVolume(const LLVolumeParams &volume_params, const S32 detail); 00095 void unrefVolume(LLVolume *volumep); 00096 00097 void dump(); 00098 00099 // manually call this for mutex magic 00100 void useMutex(); 00101 00102 friend std::ostream& operator<<(std::ostream& s, const LLVolumeMgr& volume_mgr); 00103 00104 protected: 00105 void insertGroup(LLVolumeLODGroup* volgroup); 00106 // Overridden in llphysics/abstract/utils/llphysicsvolumemanager.h 00107 virtual LLVolumeLODGroup* createNewGroup(const LLVolumeParams& volume_params); 00108 00109 protected: 00110 typedef std::map<const LLVolumeParams*, LLVolumeLODGroup*, LLVolumeParams::compare> volume_lod_group_map_t; 00111 volume_lod_group_map_t mVolumeLODGroups; 00112 00113 LLMutex* mDataMutex; 00114 }; 00115 00116 #endif // LL_LLVOLUMEMGR_H