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
00028 #include "3d/mesh_base.h"
00029 #include "3d/mesh_base_instance.h"
00030 #include "3d/lod_character_texture.h"
00031
00032
00033 using namespace std;
00034 using namespace NLMISC;
00035
00036
00037 namespace NL3D
00038 {
00039
00040
00041
00042
00043 CMeshBase::CMeshBase()
00044 {
00045 _UseLightingLocalAttenuation= false;
00046
00047
00048 _DefaultPos.setValue(CVector(0,0,0));
00049 _DefaultPivot.setValue(CVector(0,0,0));
00050 _DefaultRotEuler.setValue(CVector(0,0,0));
00051 _DefaultRotQuat.setValue(CQuat::Identity);
00052 _DefaultScale.setValue(CVector(1,1,1));
00053 _DefaultLMFactor.setValue(CRGBA(255,255,255,255));
00054
00055 _AutoAnim = false;
00056
00057 _LodCharacterTexture= NULL;
00058 }
00059
00060
00061
00062 CMeshBase::~CMeshBase()
00063 {
00064
00065 resetLodCharacterTexture();
00066 }
00067
00068
00069
00070
00071
00072
00073
00074
00075
00076
00077 void CMeshBase::setAnimatedMaterial(uint id, const std::string &matName)
00078 {
00079 nlassert(!matName.empty());
00080 if(id<_Materials.size())
00081 {
00082
00083 _AnimatedMaterials[id].Name= matName;
00084
00085 _AnimatedMaterials[id].copyFromMaterial(&_Materials[id]);
00086 }
00087 }
00088
00089
00090 CMaterialBase *CMeshBase::getAnimatedMaterial(uint id)
00091 {
00092 TAnimatedMaterialMap::iterator it;
00093 it= _AnimatedMaterials.find(id);
00094 if(it!=_AnimatedMaterials.end())
00095 return &it->second;
00096 else
00097 return NULL;
00098 }
00099
00100
00101
00102
00103
00104
00105
00106
00107
00108
00109 CMeshBase::CMeshBaseBuild::CMeshBaseBuild()
00110 {
00111 DefaultPos.set(0,0,0);
00112 DefaultPivot.set(0,0,0);
00113 DefaultRotEuler.set(0,0,0);
00114 DefaultScale.set(1,1,1);
00115
00116 bCastShadows= false;
00117 bRcvShadows= false;
00118 UseLightingLocalAttenuation= false;
00119 }
00120
00121
00122 #if 0
00123 void CMeshBase::CMeshBaseBuild::serial(NLMISC::IStream &f) throw(NLMISC::EStream)
00124 {
00125
00126
00127
00128
00129
00130
00131
00132 sint ver= f.serialVersion(1);
00133
00134 if(ver<1)
00135 throw NLMISC::EStream(f, "MeshBuild in Stream is too old (MeshBaseBuild version < 1)");
00136
00137 f.serial( DefaultPos );
00138 f.serial( DefaultPivot );
00139 f.serial( DefaultRotEuler );
00140 f.serial( DefaultRotQuat );
00141 f.serial( DefaultScale );
00142
00143 f.serialCont( Materials );
00144 }
00145 #endif
00146
00147
00148
00149 void CMeshBase::serialMeshBase(NLMISC::IStream &f) throw(NLMISC::EStream)
00150 {
00151
00152
00153
00154
00155
00156
00157
00158
00159
00160
00161
00162
00163
00164
00165
00166
00167
00168
00169
00170 sint ver = f.serialVersion(7);
00171
00172 if (ver >= 2)
00173 {
00174 f.serialCont (_AnimatedMorph);
00175 }
00176
00177 if(ver<1)
00178 throw NLMISC::EStream(f, "Mesh in Stream is too old (MeshBase version < 1)");
00179
00180 f.serial (_DefaultPos);
00181 f.serial (_DefaultPivot);
00182 f.serial (_DefaultRotEuler);
00183 f.serial (_DefaultRotQuat);
00184 f.serial (_DefaultScale);
00185
00186 f.serialCont(_Materials);
00187 f.serialCont(_AnimatedMaterials);
00188 f.serialCont(_LightInfos);
00189
00190 if(ver>=3)
00191
00192 f.serial(_IsLightable);
00193 else if( f.isReading() )
00194
00195 computeIsLightable();
00196
00197 if(ver>=4)
00198 f.serial(_UseLightingLocalAttenuation);
00199 else if( f.isReading() )
00200 _UseLightingLocalAttenuation= false;
00201
00202 if (ver >= 5)
00203 {
00204 f.serial(_AutoAnim);
00205 }
00206
00207 if(ver >= 6)
00208 f.serial(_DistMax);
00209
00210 if(ver >= 7)
00211 f.serialPtr(_LodCharacterTexture);
00212
00213 }
00214
00215
00216
00217 void CMeshBase::buildMeshBase(CMeshBaseBuild &m)
00218 {
00219
00220 _LightInfos = m.LightInfoMap;
00221
00222
00223 _Materials= m.Materials;
00224
00225
00226 _AnimatedMaterials.clear();
00227
00229 _DefaultPos.setValue (m.DefaultPos);
00230 _DefaultPivot.setValue (m.DefaultPivot);
00231 _DefaultRotEuler.setValue (m.DefaultRotEuler);
00232 _DefaultRotQuat.setValue (m.DefaultRotQuat);
00233 _DefaultScale.setValue (m.DefaultScale);
00234
00235 _AnimatedMorph .resize(m.DefaultBSFactors.size());
00236 for (uint32 i = 0; i < m.DefaultBSFactors.size(); ++i)
00237 {
00238 _AnimatedMorph[i].DefaultFactor.setValue (m.DefaultBSFactors[i]);
00239 _AnimatedMorph[i].Name = m.BSNames[i];
00240 }
00241
00242
00243 computeIsLightable();
00244
00245 _UseLightingLocalAttenuation= m.UseLightingLocalAttenuation;
00246 }
00247
00248
00249
00250
00251
00252 void CMeshBase::instanciateMeshBase(CMeshBaseInstance *mi, CScene *ownerScene)
00253 {
00254 uint32 i;
00255
00256
00257
00258 mi->_OwnerScene= ownerScene;
00259
00260
00261
00262
00263 mi->_AnimatedMorphFactor.reserve(_AnimatedMorph.size());
00264 for(i = 0; i < _AnimatedMorph.size(); ++i)
00265 {
00266 CAnimatedMorph am(&_AnimatedMorph[i]);
00267 mi->_AnimatedMorphFactor.push_back (am);
00268 }
00269
00270
00271
00272
00273 mi->Materials= _Materials;
00274
00275
00276 mi->selectTextureSet(0);
00277
00278
00279 mi->AsyncTextures.resize(_Materials.size());
00280
00281
00282
00283 TAnimatedMaterialMap::iterator it;
00284 mi->_AnimatedMaterials.reserve(_AnimatedMaterials.size());
00285 for(it= _AnimatedMaterials.begin(); it!= _AnimatedMaterials.end(); it++)
00286 {
00287 CAnimatedMaterial aniMat(&it->second);
00288
00289
00290 nlassert(it->first < mi->Materials.size());
00291 aniMat.setMaterial(&mi->Materials[it->first]);
00292
00293
00294 aniMat.setFather(mi, CMeshBaseInstance::OwnerBit);
00295
00296
00297 mi->_AnimatedMaterials.push_back(aniMat);
00298 }
00299
00300
00301
00302
00303
00304 mi->ITransformable::setPos( ((CAnimatedValueVector&)_DefaultPos.getValue()).Value );
00305 mi->ITransformable::setRotQuat( ((CAnimatedValueQuat&)_DefaultRotQuat.getValue()).Value );
00306 mi->ITransformable::setScale( ((CAnimatedValueVector&)_DefaultScale.getValue()).Value );
00307 mi->ITransformable::setPivot( ((CAnimatedValueVector&)_DefaultPivot.getValue()).Value );
00308
00309
00310 mi->setTransparency( false );
00311 mi->setOpacity( false );
00312 for( i = 0; i < mi->Materials.size(); ++i )
00313 if( mi->Materials[i].getBlend() )
00314 mi->setTransparency( true );
00315 else
00316 mi->setOpacity( true );
00317
00318
00319 mi->setIsLightable(this->isLightable());
00320
00321
00322 mi->setIsBigLightable(this->useLightingLocalAttenuation());
00323
00324 }
00325
00326
00327
00328 void CMeshBase::applyMaterialUsageOptim(const std::vector<bool> &materialUsed, std::vector<sint> &remap)
00329 {
00330 nlassert(_Materials.size()==materialUsed.size());
00331
00332
00333 resetLodCharacterTexture();
00334 _AnimatedMaterials.clear();
00335
00336
00337 remap.clear();
00338 remap.resize(_Materials.size(), -1);
00339
00340
00341 vector<CMaterial>::iterator itMat= _Materials.begin();
00342 uint dstIdx= 0;
00343 for(uint i=0;i<materialUsed.size();i++)
00344 {
00345
00346 if(materialUsed[i])
00347 {
00348 remap[i]= dstIdx;
00349 itMat++;
00350 dstIdx++;
00351 }
00352
00353 else
00354 {
00355 itMat= _Materials.erase(itMat);
00356 }
00357 }
00358
00359
00360 TLightInfoMap::iterator itLight;
00361 for(itLight= _LightInfos.begin();itLight!= _LightInfos.end();itLight++)
00362 {
00363 CLightInfoMapList::iterator itList= itLight->second.begin();
00364 for(;itList!=itLight->second.end();)
00365 {
00366 sint newId= remap[itList->nMatNb];
00367
00368 if(newId>=0)
00369 {
00370
00371 itList->nMatNb= newId;
00372 itList++;
00373 }
00374 else
00375 {
00376
00377 itList= itLight->second.erase(itList);
00378 }
00379 }
00380 }
00381 }
00382
00383
00384
00385 void CMeshBase::flushTextures(IDriver &driver)
00386 {
00387
00388 uint matCount=_Materials.size();
00389
00390
00391 for (uint mat=0; mat<matCount; mat++)
00392 {
00394 _Materials[mat].flushTextures (driver);
00395 }
00396 }
00397
00398
00399
00400 void CMeshBase::computeIsLightable()
00401 {
00402
00403 _IsLightable= false;
00404
00405
00406 uint matCount=_Materials.size();
00407
00408
00409 for (uint mat=0; mat<matCount; mat++)
00410 {
00411
00412 if( _Materials[mat].getShader()!=CMaterial::LightMap )
00413 {
00414 _IsLightable= true;
00415 break;
00416 }
00417 }
00418 }
00419
00420
00421
00422 bool CMeshBase::useLightingLocalAttenuation () const
00423 {
00424 return _UseLightingLocalAttenuation;
00425 }
00426
00427
00428
00429 void CMeshBase::resetLodCharacterTexture()
00430 {
00431 if(_LodCharacterTexture)
00432 {
00433 delete _LodCharacterTexture;
00434 _LodCharacterTexture= NULL;
00435 }
00436 }
00437
00438
00439 void CMeshBase::setupLodCharacterTexture(CLodCharacterTexture &lodText)
00440 {
00441
00442 resetLodCharacterTexture();
00443
00444 _LodCharacterTexture= new CLodCharacterTexture;
00445 *_LodCharacterTexture= lodText;
00446 }
00447
00448
00449 }