00001
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026 #include "std3d.h"
00027 #include "3d/hls_texture_bank.h"
00028
00029
00030 using namespace std;
00031 using namespace NLMISC;
00032
00033 namespace NL3D
00034 {
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045 CHLSTextureBank::CHLSTextureBank()
00046 {
00047 }
00048
00049 void CHLSTextureBank::reset()
00050 {
00051 contReset(_ColorTextures);
00052 contReset(_TextureInstanceData);
00053 contReset(_TextureInstances);
00054 }
00055
00056 uint32 CHLSTextureBank::addColorTexture(const CHLSColorTexture &tex)
00057 {
00058 _ColorTextures.push_back(tex);
00059 return _ColorTextures.size()-1;
00060 }
00061
00062 void CHLSTextureBank::addTextureInstance(const std::string &name, uint32 colorTextureId, const vector<CHLSColorDelta> &cols)
00063 {
00064 string nameLwr= strlwr(name);
00065
00066
00067 nlassert(colorTextureId<_ColorTextures.size());
00068 CHLSColorTexture &colText= _ColorTextures[colorTextureId];
00069 nlassert(cols.size()==colText.getNumMasks());
00070
00071
00072 CTextureInstance textInst;
00073 textInst._ColorTextureId= colorTextureId;
00074 textInst._DataIndex= _TextureInstanceData.size();
00075
00076 textInst._DataPtr= NULL;
00077 textInst._ColorTexturePtr= NULL;
00078
00079
00080 uint32 nameSize= (nameLwr.size()+1);
00081 uint32 colSize= cols.size()*sizeof(CHLSColorDelta);
00082 _TextureInstanceData.resize(_TextureInstanceData.size() + nameSize + colSize);
00083
00084 memcpy(&_TextureInstanceData[textInst._DataIndex], nameLwr.c_str(), nameSize);
00085
00086 memcpy(&_TextureInstanceData[textInst._DataIndex+nameSize], &cols[0], colSize);
00087
00088
00089 _TextureInstances.push_back(textInst);
00090 }
00091
00092 void CHLSTextureBank::compilePtrs()
00093 {
00094 uint8 *data= &_TextureInstanceData[0];
00095
00096
00097 for(uint i=0;i<_TextureInstances.size();i++)
00098 {
00099 CTextureInstance &text= _TextureInstances[i];
00100 text._DataPtr= data + text._DataIndex;
00101 text._ColorTexturePtr= &_ColorTextures[text._ColorTextureId];
00102 }
00103 }
00104
00105
00106
00107 void CHLSTextureBank::compile()
00108 {
00109
00110 compilePtrs();
00111
00112
00113 }
00114
00115
00116
00117 void CHLSTextureBank::serial(NLMISC::IStream &f)
00118 {
00119 sint ver= f.serialVersion(0);
00120
00121 f.serialCont(_ColorTextures);
00122 f.serialCont(_TextureInstanceData);
00123 f.serialCont(_TextureInstances);
00124
00125
00126 if(f.isReading())
00127 {
00128
00129 compilePtrs();
00130 }
00131 }
00132
00133
00134
00135 void CHLSTextureBank::fillHandleArray(std::vector<CTextureInstanceHandle> &array)
00136 {
00137 for(uint i=0;i<_TextureInstances.size();i++)
00138 {
00139 CTextureInstanceHandle h;
00140 h.Texture= &_TextureInstances[i];
00141 array.push_back(h);
00142 }
00143 }
00144
00145
00146
00147
00148
00149
00150
00151
00152
00153
00154 void CHLSTextureBank::CTextureInstance::serial(NLMISC::IStream &f)
00155 {
00156 sint ver= f.serialVersion(0);
00157
00158 f.serial(_DataIndex);
00159 f.serial(_ColorTextureId);
00160 }
00161
00162
00163
00164 bool CHLSTextureBank::CTextureInstance::operator<(const CTextureInstance &t) const
00165 {
00166
00167 return (strcmp((const char*)_DataPtr, (const char*)t._DataPtr)<0);
00168 }
00169
00170 bool CHLSTextureBank::CTextureInstance::operator<=(const CTextureInstance &t) const
00171 {
00172
00173 return (strcmp((const char*)_DataPtr, (const char*)t._DataPtr)<=0);
00174 }
00175
00176
00177
00178 bool CHLSTextureBank::CTextureInstance::sameName(const char *str)
00179 {
00180 return (strcmp((const char*)_DataPtr, str)==0);
00181 }
00182
00183
00184
00185 void CHLSTextureBank::CTextureInstance::buildColorVersion(NLMISC::CBitmap &out)
00186 {
00187
00188 uint nameSize= strlen((const char*)_DataPtr)+1;
00189 CHLSColorDelta *colDeltas= (CHLSColorDelta*)(_DataPtr + nameSize);
00190
00191
00192 _ColorTexturePtr->buildColorVersion(colDeltas, out);
00193 }
00194
00195
00196 }