Definition in file landscapeig_manager.cpp.
#include "std3d.h"
#include "nel/3d/landscapeig_manager.h"
#include "3d/scene_user.h"
#include "3d/instance_group_user.h"
#include "3d/shape.h"
#include "nel/misc/common.h"
#include "nel/misc/debug.h"
#include "nel/misc/path.h"
#include "nel/misc/file.h"
#include "nel/misc/hierarchical_timer.h"
#include <fstream>
Go to the source code of this file.
Defines | |
| #define | NL3D_HAUTO_LAND_MNGR_LOAD_ZONEIG H_AUTO_USE( NL3D_Load_Zone_IG ) |
| #define | NL3D_HAUTO_LAND_MNGR_UNLOAD_ZONEIG H_AUTO_USE( NL3D_Unload_Zone_IG ) |
Functions | |
| H_AUTO_DECL (NL3D_Load_Zone_IG) H_AUTO_DECL(NL3D_Unload_Zone_IG) namespace NL3D | |
|
|
Referenced by H_AUTO_DECL(). |
|
|
Referenced by H_AUTO_DECL(). |
|
|
Definition at line 45 of file landscapeig_manager.cpp. References file, NL3D_HAUTO_LAND_MNGR_LOAD_ZONEIG, NL3D_HAUTO_LAND_MNGR_UNLOAD_ZONEIG, NL3D_MEM_LANDSCAPE_IG, nlassert, nlwarning, NLMISC::strlwr(), NLMISC::strupr(), and uint.
00052 {
00053
00054
00055 // ***************************************************************************
00056 CLandscapeIGManager::CInstanceGroupElement::CInstanceGroupElement(UInstanceGroup *ig, const char *fileName)
00057 {
00058 NL3D_MEM_LANDSCAPE_IG
00059 Ig = ig;
00060 AddedToScene = false;
00061 if (fileName != NULL)
00062 FileName = fileName;
00063 }
00064
00065 // ***************************************************************************
00066 void CLandscapeIGManager::CInstanceGroupElement::release()
00067 {
00068 NL3D_MEM_LANDSCAPE_IG
00069 delete Ig;
00070 Ig= NULL;
00071 }
00072
00073
00074 // ***************************************************************************
00075 CLandscapeIGManager::CLandscapeIGManager()
00076 {
00077 NL3D_MEM_LANDSCAPE_IG
00078 _Scene=NULL;
00079 }
00080 // ***************************************************************************
00081 CLandscapeIGManager::~CLandscapeIGManager()
00082 {
00083 NL3D_MEM_LANDSCAPE_IG
00084 // reset should have been called.
00085 if(_Scene!=NULL)
00086 throw Exception("CLandscapeIGManager not reseted");
00087 }
00088 // ***************************************************************************
00089 void CLandscapeIGManager::initIG(UScene *scene, const std::string &igDesc, UDriver *driver, uint selectedTexture,
00090 NLMISC::IProgressCallback *callBack)
00091 {
00092 NL3D_MEM_LANDSCAPE_IG
00093 nlassert(scene);
00094 _Scene= scene;
00095
00096 // Load the file.
00097 if(igDesc.empty())
00098 return;
00099
00100 string igFile = CPath::lookup(igDesc);
00101
00102 //ifstream file(igFile.c_str(), ios::in);
00103
00104 CIFile file;
00105
00106 // Shape to add should be empty !
00107 nlassert(_ShapeAdded.empty ());
00108
00109 // if loading ok.
00110 //if(file.is_open())
00111 if (file.open (igFile))
00112 {
00113 char tmpBuff[260];
00114 char delimiterBox[] = "\t";
00115 // While the end of the file is not reached.
00116 while(!file.eof())
00117 {
00118 // Get a line
00119 file.getline(tmpBuff, 260);
00120 char *token = strtok(tmpBuff, delimiterBox);
00121 // create the instance group.
00122 if(token != NULL)
00123 {
00124 if( _ZoneInstanceGroupMap.find(token)!=_ZoneInstanceGroupMap.end() )
00125 throw Exception("CLandscapeIGManager::initIG() found 2 igs with same name in %s", igFile.c_str());
00126 else
00127 {
00128 // create the instanceGroup.
00129 UInstanceGroup *ig = UInstanceGroup::createInstanceGroup(token);
00130 if (ig)
00131 {
00132 // add it to the map.
00133 string tokId= token;
00134 strupr(tokId);
00135 _ZoneInstanceGroupMap[tokId]= CInstanceGroupElement(ig, token);
00136
00137 // Add a reference on the shapes
00138 CInstanceGroup &_ig = static_cast<CInstanceGroupUser*>(ig)->getInternalIG();
00139 CScene &_scene = static_cast<CSceneUser*>(scene)->getScene();
00140 uint i;
00141 for (i=0; i<_ig.getNumInstance(); i++)
00142 {
00143 // Get the instance name
00144 string shapeName;
00145 _ig.getShapeName(i, shapeName);
00146 if (!shapeName.empty ())
00147 {
00148 if (strlwr(CFile::getExtension(shapeName)) != "pacs_prim")
00149 {
00150 // Insert a new shape ?
00151 if (_ShapeAdded.find(shapeName) == _ShapeAdded.end())
00152 {
00153 // Shape present ?
00154 CShapeBank *shapeBank = _scene.getShapeBank();
00155 IShape *shape = NULL;
00156 if (shapeBank->isPresent (shapeName) == CShapeBank::NotPresent)
00157 shapeBank->load (shapeName);
00158 if (shapeBank->isPresent (shapeName) == CShapeBank::Present)
00159 shape = shapeBank->addRef(shapeName);
00160
00161 // Shape loaded ?
00162 if (shape)
00163 {
00164 // Insert the shape
00165 CSmartPtr<IShape> *smartPtr = new CSmartPtr<IShape>;
00166 *smartPtr = shape;
00167 _ShapeAdded.insert (TShapeMap::value_type (shapeName, smartPtr));
00168
00169 // Flush the shape
00170 IDriver *_driver = static_cast<CDriverUser*>(driver)->getDriver();
00171 shape->flushTextures(*_driver, selectedTexture);
00172 }
00173 }
00174 }
00175 }
00176 }
00177 }
00178 else
00179 {
00180 nlwarning ("CLandscapeIGManager::initIG() Can't load instance group '%s' in '%s'", token, igFile.c_str());
00181 }
00182 }
00183 }
00184 }
00185 file.close();
00186 }
00187 else
00188 {
00189 nlwarning ("Couldn't load '%s'", igFile.c_str());
00190 }
00191 }
00192 // ***************************************************************************
00193 UInstanceGroup *CLandscapeIGManager::loadZoneIG(const std::string &name)
00194 {
00195 NL3D_MEM_LANDSCAPE_IG
00196 NL3D_HAUTO_LAND_MNGR_LOAD_ZONEIG
00197
00198 if(name=="")
00199 return NULL;
00200
00201 // try to find this InstanceGroup.
00202 ItZoneInstanceGroupMap it;
00203 it= _ZoneInstanceGroupMap.find( translateName(name) );
00204
00205 // if found.
00206 if( it!= _ZoneInstanceGroupMap.end() )
00207 {
00208 // if not already added to the scene.
00209 if( !it->second.AddedToScene )
00210 {
00211 // add to the scene.
00212 if (it->second.Ig != NULL)
00213 {
00214 it->second.Ig->addToScene(*_Scene);
00215 it->second.AddedToScene= true;
00216 }
00217 }
00218 return it->second.Ig;
00219 }
00220 else
00221 {
00222 return NULL;
00223 }
00224 }
00225 // ***************************************************************************
00226 void CLandscapeIGManager::loadArrayZoneIG(const std::vector<std::string> &names, std::vector<UInstanceGroup *> *dest /*= NULL*/)
00227 {
00228 NL3D_MEM_LANDSCAPE_IG
00229 if (dest)
00230 {
00231 dest->clear();
00232 dest->reserve(names.size());
00233 }
00234 for(uint i=0; i<names.size(); i++)
00235 {
00236 UInstanceGroup *ig = loadZoneIG(names[i]);
00237 if (dest && ig)
00238 {
00239 dest->push_back(ig);
00240 }
00241 }
00242 }
00243
00244 // ***************************************************************************
00245 void CLandscapeIGManager::unloadArrayZoneIG(const std::vector<std::string> &names)
00246 {
00247 NL3D_MEM_LANDSCAPE_IG
00248 for(uint i=0; i<names.size(); i++)
00249 {
00250 unloadZoneIG(names[i]);
00251 }
00252 }
00253
00254 // ***************************************************************************
00255 void CLandscapeIGManager::unloadZoneIG(const std::string &name)
00256 {
00257 NL3D_MEM_LANDSCAPE_IG
00258 NL3D_HAUTO_LAND_MNGR_UNLOAD_ZONEIG
00259 if(name=="")
00260 return;
00261
00262 // try to find this InstanceGroup.
00263 ItZoneInstanceGroupMap it;
00264 it= _ZoneInstanceGroupMap.find( translateName(name) );
00265
00266 // if found.
00267 if( it!= _ZoneInstanceGroupMap.end() )
00268 {
00269 // if really added to the scene.
00270 if( it->second.AddedToScene )
00271 {
00272 // remove from the scene.
00273 it->second.Ig->removeFromScene(*_Scene);
00274 it->second.AddedToScene= false;
00275 }
00276 }
00277 }
00278
00279 // ***************************************************************************
00280 bool CLandscapeIGManager::isIGAddedToScene(const std::string &name) const
00281 {
00282 NL3D_MEM_LANDSCAPE_IG
00283 if(name=="")
00284 return false;
00285
00286 // try to find this InstanceGroup.
00287 ConstItZoneInstanceGroupMap it;
00288 it= _ZoneInstanceGroupMap.find( translateName(name) );
00289
00290 // if found.
00291 if( it!= _ZoneInstanceGroupMap.end() )
00292 return it->second.AddedToScene;
00293 else
00294 return false;
00295 }
00296
00297 // ***************************************************************************
00298 UInstanceGroup *CLandscapeIGManager::getIG(const std::string &name) const
00299 {
00300 NL3D_MEM_LANDSCAPE_IG
00301 if(name=="")
00302 return NULL;
00303
00304 // try to find this InstanceGroup.
00305 ConstItZoneInstanceGroupMap it;
00306 it= _ZoneInstanceGroupMap.find( translateName(name) );
00307
00308 // if found.
00309 if( it!= _ZoneInstanceGroupMap.end() )
00310 return it->second.Ig;
00311 else
00312 return NULL;
00313 }
00314
00315
00316 // ***************************************************************************
00317 std::string CLandscapeIGManager::translateName(const std::string &name) const
00318 {
00319 NL3D_MEM_LANDSCAPE_IG
00320 std::string ret;
00321 ret= name + ".ig";
00322 strupr(ret);
00323
00324 return ret;
00325 }
00326
00327
00328 // ***************************************************************************
00329 void CLandscapeIGManager::reset()
00330 {
00331 NL3D_MEM_LANDSCAPE_IG
00332 while( _ZoneInstanceGroupMap.begin() != _ZoneInstanceGroupMap.end() )
00333 {
00334 string name= _ZoneInstanceGroupMap.begin()->first;
00335 // first remove from scene
00336 unloadZoneIG( name.substr(0, name.find('.')) );
00337
00338 // then delete this entry.
00339 _ZoneInstanceGroupMap.begin()->second.release();
00340 _ZoneInstanceGroupMap.erase(_ZoneInstanceGroupMap.begin());
00341 }
00342
00343 // For all shape reference
00344 TShapeMap::iterator ite = _ShapeAdded.begin ();
00345 while (ite != _ShapeAdded.end())
00346 {
00347 // Unreference shape
00348 CScene &_scene = static_cast<CSceneUser*>(_Scene)->getScene();
00349 CSmartPtr<IShape> *smartPtr = (CSmartPtr<IShape> *)(ite->second);
00350 IShape *shapeToRelease = *smartPtr;
00351 *smartPtr = NULL;
00352 _scene.getShapeBank()->release(shapeToRelease);
00353 delete smartPtr;
00354
00355 // Next
00356 ite++;
00357 }
00358 _ShapeAdded.clear ();
00359
00360 _Scene=NULL;
00361 }
00362
00363
00364 // ***************************************************************************
00365 void CLandscapeIGManager::reloadAllIgs()
00366 {
00367 NL3D_MEM_LANDSCAPE_IG
00368 vector<std::string> bkupIgFileNameList;
00369 vector<bool> bkupIgAddedToScene;
00370
00371 // First, erase all igs.
00372 while( _ZoneInstanceGroupMap.begin() != _ZoneInstanceGroupMap.end() )
00373 {
00374 string name= _ZoneInstanceGroupMap.begin()->first;
00375
00376 // bkup the state of this ig.
00377 bkupIgFileNameList.push_back(_ZoneInstanceGroupMap.begin()->second.FileName);
00378 bkupIgAddedToScene.push_back(_ZoneInstanceGroupMap.begin()->second.AddedToScene);
00379
00380 // first remove from scene
00381 unloadZoneIG( name.substr(0, name.find('.')) );
00382
00383 // then delete this entry.
00384 _ZoneInstanceGroupMap.begin()->second.release();
00385 _ZoneInstanceGroupMap.erase(_ZoneInstanceGroupMap.begin());
00386 }
00387
00388 // Then reload all Igs.
00389 for(uint i=0; i<bkupIgFileNameList.size(); i++)
00390 {
00391 const char *token= bkupIgFileNameList[i].c_str();
00392 UInstanceGroup *ig = UInstanceGroup::createInstanceGroup(token);
00393 // add it to the map.
00394 string tokId= token;
00395 strupr(tokId);
00396 _ZoneInstanceGroupMap[tokId]= CInstanceGroupElement(ig, token);
00397
00398 // If was addedToScene before, re-add to scene now.
00399 if(bkupIgAddedToScene[i])
00400 {
00401 loadZoneIG( tokId.substr(0, tokId.find('.')) );
00402 }
00403 }
00404 }
00405
00406
00407 // ***************************************************************************
00408 void CLandscapeIGManager::getAllIG(std::vector<UInstanceGroup *> &dest) const
00409 {
00410 NL3D_MEM_LANDSCAPE_IG
00411 dest.clear();
00412 dest.reserve(_ZoneInstanceGroupMap.size());
00413 // add the instances
00414 for(TZoneInstanceGroupMap::const_iterator it = _ZoneInstanceGroupMap.begin(); it != _ZoneInstanceGroupMap.end(); ++it)
00415 {
00416 dest.push_back(it->second.Ig);
00417 }
00418 }
00419
00420 // ***************************************************************************
00421 void CLandscapeIGManager::getAllIGWithNames(std::vector<std::pair<UInstanceGroup *, std::string> > &dest) const
00422 {
00423 NL3D_MEM_LANDSCAPE_IG
00424 dest.clear();
00425 dest.reserve(_ZoneInstanceGroupMap.size());
00426 // add the instances
00427 for(TZoneInstanceGroupMap::const_iterator it = _ZoneInstanceGroupMap.begin(); it != _ZoneInstanceGroupMap.end(); ++it)
00428 {
00429 dest.push_back(std::make_pair(it->second.Ig, it->second.FileName));
00430 }
00431 }
00432
00433
00434 } // NL3D
|
1.3.6