Inheritance diagram for NL3D::CAsyncFileManager3D::CMeshLoad:

Public Member Functions | |
| CMeshLoad (const std::string &meshName, IShape **ppShp, IDriver *pDriver, const CVector &position, uint selectedTexture) | |
| void | getName (std::string &result) const |
| void | run (void) |
Data Fields | |
| std::string | MeshName |
| NLMISC::CVector | Position |
Private Attributes | |
| IDriver * | _pDriver |
| IShape ** | _ppShp |
| uint | _SelectedTexture |
|
||||||||||||||||||||||||
|
Definition at line 220 of file async_file_manager_3d.cpp. References _pDriver, _ppShp, _SelectedTexture, MeshName, and uint.
00221 {
00222 _pDriver = pDriver;
00223 MeshName = sMeshName;
00224 _ppShp = ppShp;
00225 Position = position;
00226 _SelectedTexture = selectedTexture;
00227 }
|
|
|
Reimplemented from NLMISC::IRunnable. Definition at line 358 of file async_file_manager_3d.cpp. References MeshName.
00359 {
00360 result = "LoadMesh (" + MeshName + ")";
00361 }
|
|
|
Implements NLMISC::IRunnable. Definition at line 231 of file async_file_manager_3d.cpp. References _pDriver, _ppShp, _SelectedTexture, NLMISC::CIFile::close(), NL3D::ITexture::generate(), NL3D::CMaterial::getLightMap(), NL3D::CMeshBase::getMaterial(), NL3D::CMeshBase::getNbMaterial(), NL3D::CMaterial::getShader(), NL3D::CShapeStream::getShapePointer(), NL3D::ITexture::getShareName(), NL3D::CMaterial::getTexture(), NL3D::IDRV_MAT_MAXTEXTURES, NL3D::IDriver::isTextureExist(), MeshName, NL3D_MEM_INSTANCE, nlwarning, NLMISC::CIFile::open(), NL3D::ITexture::selectTexture(), NLMISC::IStream::serial(), NLMISC::CIFile::setAsyncLoading(), NLMISC::CIFile::setCacheFileOnOpen(), NL3D::ITexture::supportSharing(), NL3D::CMaterial::texturePresent(), and uint.
00232 {
00233 NL3D_MEM_INSTANCE
00234 // This set represent the texture already loaded in memory
00235 // We have to have this set because the driver load the textures only on the
00236 // setupTexture, done in CShapeBank::isPresent. This must be done in the main
00237 // thread because setupTexture upload texture to VRAM.
00238 typedef set<string> TAlreadyPresentTextureSet;
00239 TAlreadyPresentTextureSet AlreadyPresentTextureSet;
00240
00241 try
00242 {
00243 // Load from file the mesh
00244 CShapeStream mesh;
00245 CIFile meshfile;
00246 meshfile.setAsyncLoading (true);
00247 meshfile.setCacheFileOnOpen (true);
00248 meshfile.open (CPath::lookup(MeshName));
00249 meshfile.serial (mesh);
00250 meshfile.close ();
00251
00252 // Is the pointer is invalid return -1
00253 if (mesh.getShapePointer() == NULL)
00254 {
00255 nlwarning ("Couldn't load '%s'", MeshName.c_str());
00256 *_ppShp = (IShape*)-1;
00257 delete this;
00258 return;
00259 }
00260
00261 CMeshBase *pMesh = dynamic_cast<CMeshBase *>(mesh.getShapePointer());
00262
00263 // If the shape is a mesh but the driver is not given or if the shape is not a mesh
00264 // so do not try to load the textures
00265
00266 if ((pMesh == NULL) || ((pMesh != NULL) && (_pDriver == NULL)))
00267 {
00268 if (_pDriver == NULL || mesh.getShapePointer() == NULL)
00269 {
00270 nlwarning ("mesh or driver is NULL for file '%s'", MeshName.c_str());
00271 }
00272
00273 *_ppShp = mesh.getShapePointer();
00274 delete this;
00275 return;
00276 }
00277
00278 // Here we are sure that the shape is a mesh and the driver is not null
00279 // Parse all materials of the mesh
00280 uint i, j;
00281 uint nNbMat = pMesh->getNbMaterial();
00282 ITexture *pText;
00283
00284 for(i = 0; i < nNbMat; ++i)
00285 {
00286 const CMaterial &rMat = pMesh->getMaterial(i);
00287 // Parse all textures from this material and generate them
00288 for(j = 0; j < IDRV_MAT_MAXTEXTURES; ++j)
00289 if (rMat.texturePresent(j))
00290 {
00291 pText = rMat.getTexture (j);
00292
00293 // Does this texture is a texture file ?
00294 if ((pText != NULL) && (pText->supportSharing()))
00295 {
00296 // Set texture slot
00297 pText->selectTexture(_SelectedTexture);
00298
00299 // Yes -> Does the texture is already present in the driver ?
00300 if( ! _pDriver->isTextureExist(*pText) )
00301 {
00302 // No -> So we have perhaps to load it
00303 TAlreadyPresentTextureSet::iterator aptmIt = AlreadyPresentTextureSet.find (pText->getShareName());
00304 // Is the texture already loaded ?
00305 if(aptmIt == AlreadyPresentTextureSet.end())
00306 {
00307 // Texture not already present
00308 // add it
00309 AlreadyPresentTextureSet.insert (pText->getShareName());
00310 // And load it (to RAM only (upload in VRAM is done in the shape bank))
00311 pText->generate(true);
00312 }
00313 }
00314 }
00315 }
00316
00317 // Do the same with lightmaps
00318 if (rMat.getShader() == CMaterial::LightMap)
00319 {
00320 j = 0; pText = rMat.getLightMap (j);
00321 while (pText != NULL)
00322 {
00323 // Does this texture is a texture file ?
00324 if ((pText != NULL) && (pText->supportSharing()))
00325 {
00326 // Yes -> Does the texture is already present in the driver ?
00327 if (!_pDriver->isTextureExist(*pText))
00328 {
00329 // No -> So we have perhaps to load it
00330 TAlreadyPresentTextureSet::iterator aptmIt = AlreadyPresentTextureSet.find (pText->getShareName());
00331 // Is the texture already loaded ?
00332 if(aptmIt == AlreadyPresentTextureSet.end())
00333 {
00334 // Texture not already present -> add it and load it to RAM
00335 AlreadyPresentTextureSet.insert (pText->getShareName());
00336 pText->generate(true);
00337 }
00338 }
00339 }
00340 ++j; pText = rMat.getLightMap (j);
00341 }
00342 }
00343 }
00344 // Finally affect the pointer (Trans-Thread operation -> this operation must be atomic)
00345 *_ppShp = mesh.getShapePointer();
00346 }
00347 catch(EPathNotFound &)
00348 {
00349 nlwarning ("Couldn't load '%s'", MeshName.c_str());
00350 *_ppShp = (IShape*)-1;
00351 delete this;
00352 return;
00353 }
00354 delete this;
00355 }
|
|
|
Definition at line 93 of file async_file_manager_3d.h. Referenced by CMeshLoad(), and run(). |
|
|
Definition at line 92 of file async_file_manager_3d.h. Referenced by CMeshLoad(), and run(). |
|
|
Definition at line 94 of file async_file_manager_3d.h. Referenced by CMeshLoad(), and run(). |
|
|
Definition at line 96 of file async_file_manager_3d.h. Referenced by NL3D::CLoadMeshCancel::callback(), CMeshLoad(), getName(), and run(). |
|
|
Definition at line 46 of file task_manager.h. |
1.3.6