From: <mg...@us...> - 2008-02-22 17:40:25
|
Revision: 968 http://planeshift.svn.sourceforge.net/planeshift/?rev=968&view=rev Author: mgist Date: 2008-02-22 09:40:31 -0800 (Fri, 22 Feb 2008) Log Message: ----------- - Added support for loading colldet from reduced maps. - Cleaned up psregion some more. Modified Paths: -------------- personal/Xordan/docs/history.txt personal/Xordan/src/common/engine/psregion.cpp personal/Xordan/src/common/engine/psregion.h Modified: personal/Xordan/docs/history.txt =================================================================== --- personal/Xordan/docs/history.txt 2008-02-22 13:39:43 UTC (rev 967) +++ personal/Xordan/docs/history.txt 2008-02-22 17:40:31 UTC (rev 968) @@ -1,3 +1,7 @@ +*** 2008-02-22 by Mike Gist +- Added support for loading colldet from reduced maps. +- Cleaned up psregion some more. + *** 2008-02-05 by Roland Schulz - patch by Vornne to substitute appropriate GM_* defines for numerical constants - fix for FS#1057 and FS#1058 by peeg Modified: personal/Xordan/src/common/engine/psregion.cpp =================================================================== --- personal/Xordan/src/common/engine/psregion.cpp 2008-02-22 13:39:43 UTC (rev 967) +++ personal/Xordan/src/common/engine/psregion.cpp 2008-02-22 17:40:31 UTC (rev 968) @@ -45,10 +45,16 @@ object_reg = obj_reg; worlddir.Format("/planeshift/world/%s", file); + colldetworlddir.Format("/planeshift/world/colldet_%s", file); worldfile = "world"; regionName = file; loaded = false; Engine = csQueryRegistry<iEngine> (object_reg); + + vfs = csQueryRegistry<iVFS>(object_reg); + xml = csQueryRegistry<iDocumentSystem>(object_reg); + loader = csQueryRegistry<iLoader>(object_reg); + } psRegion::~psRegion() @@ -63,31 +69,24 @@ if (loaded) return true; - bool using3D; - // Find out if we are ever going to render 3D csRef<iGraphics3D> g3d = csQueryRegistry<iGraphics3D> (object_reg); csRef<iFactory> factory = scfQueryInterface<iFactory> (g3d); - const char* g3Dname = factory->QueryClassID(); - using3D = (strcmp("crystalspace.graphics3d.null", g3Dname)? true: false); + bool using3D = (strcmp("crystalspace.graphics3d.null", factory->QueryClassID())? true: false); csString target; - target.Format("%s/world", worlddir.GetData()); - csRef<iVFS> vfs = csQueryRegistry<iVFS > ( object_reg); + target.Format("%s/%s", worlddir.GetData(), worldfile.GetData()); - csRef<iDocumentSystem> xml ( - csQueryRegistry<iDocumentSystem> (object_reg)); - - csRef<iDocument> doc = xml->CreateDocument(); - - csRef<iDataBuffer> buf (vfs->ReadFile (target.GetData())); + csRef<iDataBuffer> buf = vfs->ReadFile(target.GetData()); if (!buf || !buf->GetSize ()) { Error2("Error loading world file. %s\n", target.GetData()); return false; } + csRef<iDocument> doc = xml->CreateDocument(); + const char* error = doc->Parse( buf ); if( error ) @@ -109,19 +108,15 @@ collection = Engine->CreateCollection(regionName); // Now load the map into the selected region - csRef<iLoader> loader ( csQueryRegistry<iLoader> (object_reg)); - CS_ASSERT (loader != NULL); - csRef<iVFS> VFS ( csQueryRegistry<iVFS> (object_reg)); - CS_ASSERT (VFS != NULL); - VFS->ChDir (worlddir); + vfs->ChDir (worlddir); csTicks start = csGetTicks(); Debug2(LOG_LOAD, 0,"Loading map file %s", worlddir.GetData()); - if (!loader->LoadMap(worldNode, CS_LOADER_KEEP_WORLD, collection, CS_LOADER_ACROSS_REGIONS, true, 0, 0, true)) + if(!loader->LoadMap(worldNode, CS_LOADER_KEEP_WORLD, collection, CS_LOADER_ACROSS_REGIONS, true, 0, 0, true, KEEP_USED)) { - Error3("loader->LoadMapFile(%s,%s) failed.",worlddir.GetData(),worldfile.GetData() ); - Error2("Region name was: %s", regionName.GetData() ); + Error3("LoadMap failed: %s, %s.",worlddir.GetData(),worldfile.GetData() ); + Error2("Region name was: %s", regionName.GetData()); return false; } Debug2(LOG_LOAD, 0,"After LoadMapFile, %dms elapsed", csGetTicks()-start); @@ -243,6 +238,46 @@ void psRegion::SetupWorldColliders() { + iCollection* colldetCollection = Engine->CreateCollection("colldetPS"); csRef<iCollideSystem> cdsys = csQueryRegistry<iCollideSystem> (object_reg); - csColliderHelper::InitializeCollisionWrappers(cdsys, Engine, collection); + + csString target; + target.Format("%s/%s", colldetworlddir.GetData(), worldfile.GetData()); + + csRef<iDataBuffer> buf = vfs->ReadFile(target.GetData()); + if (!buf || !buf->GetSize()) + { + csColliderHelper::InitializeCollisionWrappers(cdsys, Engine, collection); + } + else + { + const char* error = doc->Parse(buf); + if(error) + { + Error3("Error %s while loading colldet world file: %s.\nFalling back to normal colldet, please report this error.\n", error, target.GetData()); + csColliderHelper::InitializeCollisionWrappers(cdsys, Engine, collection); + } + else + { + + csRef<iDocumentNode> worldNode = doc->GetRoot()->GetNode("world"); + + iCollection* colldetCollection = Engine->CreateCollection("colldetPS"); + + vfs->ChDir(colldetworlddir); + + if(!loader->LoadMap(worldNode, CS_LOADER_KEEP_WORLD, colldetCollection) + { + Error3("LoadMap failed: %s, %s.\n", colldetworlddir.GetData(), worldfile.GetData() ); + Error2("Region name was: %s\nFalling back to normal colldet, please report this error.\n", regionName.GetData()); + csColliderHelper::InitializeCollisionWrappers(cdsys, Engine, collection); + } + else + { + csColliderHelper::InitializeCollisionWrappers(cdsys, Engine, colldetCollection); + } + + Engine->RemoveCollection("colldetPS"); + } + } } Modified: personal/Xordan/src/common/engine/psregion.h =================================================================== --- personal/Xordan/src/common/engine/psregion.h 2008-02-22 13:39:43 UTC (rev 967) +++ personal/Xordan/src/common/engine/psregion.h 2008-02-22 17:40:31 UTC (rev 968) @@ -96,10 +96,15 @@ csString regionName; csRef<iEngine> Engine; csString worlddir; + csString colldetworlddir; csString worldfile; bool loaded; bool isNeeded; + csRef<iVFS> vfs; + csRef<iDocumentSystem> xml; + csRef<iLoader> loader; + static void CloneNode(iDocumentNode* from, iDocumentNode* to); }; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |