From: <rly...@us...> - 2010-06-07 17:05:22
|
Revision: 5969 http://planeshift.svn.sourceforge.net/planeshift/?rev=5969&view=rev Author: rlydontknow Date: 2010-06-07 17:05:15 +0000 (Mon, 07 Jun 2010) Log Message: ----------- implemented functionality to use <autoresolve /> for portals fixes HoM in portals - testing highly appreciated Modified Paths: -------------- trunk/src/common/bgloader/loader.cpp trunk/src/common/bgloader/loader.h trunk/src/common/bgloader/parser.cpp Modified: trunk/src/common/bgloader/loader.cpp =================================================================== --- trunk/src/common/bgloader/loader.cpp 2010-06-07 06:23:28 UTC (rev 5968) +++ trunk/src/common/bgloader/loader.cpp 2010-06-07 17:05:15 UTC (rev 5969) @@ -1066,9 +1066,16 @@ return true; } + iSector* target = portal->targetSector->object; + + if(portal->autoresolve) + { + target = 0; + } + portal->mObject = engine->CreatePortal(portal->name, sector->object, csVector3(0), - portal->targetSector->object, portal->poly.GetVertices(), - (int)portal->poly.GetVertexCount(), portal->pObject); + target, portal->poly.GetVertices(), (int)portal->poly.GetVertexCount(), + portal->pObject); if(portal->warp) { @@ -1090,6 +1097,13 @@ portal->pObject->GetFlags().SetBool(CS_PORTAL_ZFILL, true); } + if(!target) + { + csRef<Portal::MissingSectorCallback> cb; + cb.AttachNew(new Portal::MissingSectorCallback(portal->targetSector, portal->autoresolve)); + portal->pObject->SetMissingSectorCallback(cb); + } + return true; } Modified: trunk/src/common/bgloader/loader.h =================================================================== --- trunk/src/common/bgloader/loader.h 2010-06-07 06:23:28 UTC (rev 5968) +++ trunk/src/common/bgloader/loader.h 2010-06-07 17:05:15 UTC (rev 5969) @@ -502,12 +502,48 @@ bool clip; bool zfill; bool warp; + bool autoresolve; csPoly3D poly; csBox3 bbox; csRef<Sector> targetSector; iPortal* pObject; csRef<iMeshWrapper> mObject; + + class MissingSectorCallback : public scfImplementation1<MissingSectorCallback, iPortalCallback> + { + private: + csRef<Sector> targetSector; + bool autoresolve; + + public: + MissingSectorCallback(Sector* target, bool resolve) : scfImplementationType(this),targetSector(target),autoresolve(resolve) + { + } + + virtual ~MissingSectorCallback() + { + } + + virtual bool Traverse(iPortal* p, iBase* /*context*/) + { + if(targetSector->object.IsValid()) + { + p->SetSector(targetSector->object); + } + else + { + return false; + } + + if(!autoresolve) + { + p->RemoveMissingSectorCallback(this); + } + + return true; + } + }; }; class Light : public CS::Utility::AtomicRefCount Modified: trunk/src/common/bgloader/parser.cpp =================================================================== --- trunk/src/common/bgloader/parser.cpp 2010-06-07 06:23:28 UTC (rev 5968) +++ trunk/src/common/bgloader/parser.cpp 2010-06-07 17:05:15 UTC (rev 5969) @@ -942,6 +942,11 @@ p->zfill = true; } + if(node2->GetNode("autoresolve")) + { + p->autoresolve = true; + } + csRef<iDocumentNodeIterator> nodeItr3 = node2->GetNodes("v"); while(nodeItr3->HasNext()) { This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |