llvolumemgr.h

Go to the documentation of this file.
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 &params);
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

Generated on Fri May 16 08:32:18 2008 for SecondLife by  doxygen 1.5.5