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 : public LLThreadSafeRefCount 00045 { 00046 protected: 00047 ~LLVolumeLODGroup(); 00048 00049 public: 00050 enum 00051 { 00052 NUM_LODS = 4 00053 }; 00054 00055 LLVolumeLODGroup(const LLVolumeParams ¶ms); 00056 00057 BOOL derefLOD(LLVolume *volumep); 00058 static S32 getDetailFromTan(const F32 tan_angle); 00059 static F32 getVolumeScaleFromDetail(const S32 detail); 00060 00061 LLVolume *getLOD(const S32 detail); 00062 const LLVolumeParams &getParams() const { return mParams; }; 00063 00064 F32 dump(); 00065 friend std::ostream& operator<<(std::ostream& s, const LLVolumeLODGroup& volgroup); 00066 00067 protected: 00068 LLVolumeParams mParams; 00069 00070 S32 mLODRefs[NUM_LODS]; 00071 LLVolume *mVolumeLODs[NUM_LODS]; 00072 static F32 mDetailThresholds[NUM_LODS]; 00073 static F32 mDetailScales[NUM_LODS]; 00074 S32 mAccessCount[NUM_LODS]; 00075 }; 00076 00077 class LLVolumeMgr 00078 { 00079 public: 00080 static void initClass(); 00081 static BOOL cleanupClass(); 00082 00083 public: 00084 LLVolumeMgr(); 00085 ~LLVolumeMgr(); 00086 BOOL cleanup(); // Cleanup all volumes being managed, returns TRUE if no dangling references 00087 LLVolume *getVolume(const LLVolumeParams &volume_params, const S32 detail); 00088 void cleanupVolume(LLVolume *volumep); 00089 00090 void dump(); 00091 friend std::ostream& operator<<(std::ostream& s, const LLVolumeMgr& volume_mgr); 00092 00093 protected: 00094 typedef std::map<const LLVolumeParams*, LLVolumeLODGroup*, LLVolumeParams::compare> volume_lod_group_map_t; 00095 typedef volume_lod_group_map_t::const_iterator volume_lod_group_map_iter; 00096 volume_lod_group_map_t mVolumeLODGroups; 00097 00098 LLMutex* mDataMutex; 00099 00100 // S32 mNumVolumes; 00101 }; 00102 00103 extern LLVolumeMgr* gVolumeMgr; 00104 00105 #endif // LL_LLVOLUMEMGR_H