00001
00032 #include "llviewerprecompiledheaders.h"
00033
00034 #include "llvlmanager.h"
00035
00036 #include "indra_constants.h"
00037 #include "bitpack.h"
00038 #include "patch_code.h"
00039 #include "patch_dct.h"
00040 #include "llviewerregion.h"
00041 #include "llframetimer.h"
00042 #include "llagent.h"
00043 #include "llsurface.h"
00044
00045 LLVLManager gVLManager;
00046
00047 LLVLManager::~LLVLManager()
00048 {
00049 S32 i;
00050 for (i = 0; i < mPacketData.count(); i++)
00051 {
00052 delete mPacketData[i];
00053 }
00054 mPacketData.reset();
00055 }
00056
00057 void LLVLManager::addLayerData(LLVLData *vl_datap, const S32 mesg_size)
00058 {
00059 if (LAND_LAYER_CODE == vl_datap->mType)
00060 {
00061 mLandBits += mesg_size * 8;
00062 }
00063 else if (WIND_LAYER_CODE == vl_datap->mType)
00064 {
00065 mWindBits += mesg_size * 8;
00066 }
00067 else if (CLOUD_LAYER_CODE == vl_datap->mType)
00068 {
00069 mCloudBits += mesg_size * 8;
00070 }
00071 else
00072 {
00073 llerrs << "Unknown layer type!" << (S32)vl_datap->mType << llendl;
00074 }
00075
00076 mPacketData.put(vl_datap);
00077 }
00078
00079 void LLVLManager::unpackData(const S32 num_packets)
00080 {
00081 static LLFrameTimer decode_timer;
00082
00083 S32 i;
00084 for (i = 0; i < mPacketData.count(); i++)
00085 {
00086 LLVLData *datap = mPacketData[i];
00087
00088 LLBitPack bit_pack(datap->mData, datap->mSize);
00089 LLGroupHeader goph;
00090
00091 decode_patch_group_header(bit_pack, &goph);
00092 if (LAND_LAYER_CODE == datap->mType)
00093 {
00094 datap->mRegionp->getLand().decompressDCTPatch(bit_pack, &goph, FALSE);
00095 }
00096 else if (WIND_LAYER_CODE == datap->mType)
00097 {
00098 datap->mRegionp->mWind.decompress(bit_pack, &goph);
00099
00100 }
00101 else if (CLOUD_LAYER_CODE == datap->mType)
00102 {
00103 datap->mRegionp->mCloudLayer.decompress(bit_pack, &goph);
00104 }
00105 }
00106
00107 for (i = 0; i < mPacketData.count(); i++)
00108 {
00109 delete mPacketData[i];
00110 }
00111 mPacketData.reset();
00112
00113 }
00114
00115 void LLVLManager::resetBitCounts()
00116 {
00117 mLandBits = mWindBits = mCloudBits = 0;
00118 }
00119
00120 S32 LLVLManager::getLandBits() const
00121 {
00122 return mLandBits;
00123 }
00124
00125 S32 LLVLManager::getWindBits() const
00126 {
00127 return mWindBits;
00128 }
00129
00130 S32 LLVLManager::getCloudBits() const
00131 {
00132 return mCloudBits;
00133 }
00134
00135 S32 LLVLManager::getTotalBytes() const
00136 {
00137 return mLandBits + mWindBits + mCloudBits;
00138 }
00139
00140 void LLVLManager::cleanupData(LLViewerRegion *regionp)
00141 {
00142 S32 cur = 0;
00143 while (cur < mPacketData.count())
00144 {
00145 if (mPacketData[cur]->mRegionp == regionp)
00146 {
00147 delete mPacketData[cur];
00148 mPacketData.remove(cur);
00149 }
00150 else
00151 {
00152 cur++;
00153 }
00154 }
00155 }
00156
00157 LLVLData::LLVLData(LLViewerRegion *regionp, const S8 type, U8 *data, const S32 size)
00158 {
00159 mType = type;
00160 mData = data;
00161 mRegionp = regionp;
00162 mSize = size;
00163 }
00164
00165 LLVLData::~LLVLData()
00166 {
00167 delete [] mData;
00168 mData = NULL;
00169 mRegionp = NULL;
00170 }