From 88ce09698e8e2230ba696b77c4a1b71010826ead Mon Sep 17 00:00:00 2001 From: Adam Johnson Date: Wed, 9 Jul 2014 22:55:45 -0400 Subject: [PATCH 1/3] Convert plPageTree::fNodes to std::vector --- .../PubUtilLib/plScene/plPageTreeMgr.cpp | 41 ++++++++----------- .../Plasma/PubUtilLib/plScene/plPageTreeMgr.h | 7 ++-- 2 files changed, 21 insertions(+), 27 deletions(-) diff --git a/Sources/Plasma/PubUtilLib/plScene/plPageTreeMgr.cpp b/Sources/Plasma/PubUtilLib/plScene/plPageTreeMgr.cpp index 6e31267f..232821aa 100644 --- a/Sources/Plasma/PubUtilLib/plScene/plPageTreeMgr.cpp +++ b/Sources/Plasma/PubUtilLib/plScene/plPageTreeMgr.cpp @@ -85,21 +85,21 @@ void plPageTreeMgr::AddNode(plSceneNode* node) node->Init(); - fNodes.Append(node); + fNodes.push_back(node); } void plPageTreeMgr::RemoveNode(plSceneNode* node) { ITrashSpaceTree(); - int idx = fNodes.Find(node); - if( idx != fNodes.kMissingIndex ) - fNodes.Remove(idx); + auto it = std::find(fNodes.begin(), fNodes.end(), node); + if (it != fNodes.end()) + fNodes.erase(it); } void plPageTreeMgr::Reset() { - fNodes.Reset(); + fNodes.clear(); ITrashSpaceTree(); } @@ -474,16 +474,13 @@ bool plPageTreeMgr::IRenderSortingSpans(plPipeline* pipe, hsTArrayGetSpaceTree()->GetWorldBounds(), fNodes[i]->GetSpaceTree()->IsEmpty()); - } + for (plSceneNode* node : fNodes) + maker.AddLeaf(node->GetSpaceTree()->GetWorldBounds(), node->GetSpaceTree()->IsEmpty()); fSpaceTree = maker.MakeTree(); return true; @@ -491,18 +488,17 @@ bool plPageTreeMgr::IBuildSpaceTree() bool plPageTreeMgr::IRefreshTree(plPipeline* pipe) { - int i; - for( i = 0; i < fNodes.GetCount(); i++ ) + for (size_t i = 0; i < fNodes.size(); ++i) { - if( fNodes[i]->GetSpaceTree()->IsDirty() ) + plSceneNode* node = fNodes[i]; + if (node->GetSpaceTree()->IsDirty()) { - fNodes[i]->GetSpaceTree()->Refresh(); - - GetSpaceTree()->MoveLeaf(i, fNodes[i]->GetSpaceTree()->GetWorldBounds()); + node->GetSpaceTree()->Refresh(); - if( !fNodes[i]->GetSpaceTree()->IsEmpty() && fSpaceTree->HasLeafFlag(i, plSpaceTreeNode::kDisabled) ) + GetSpaceTree()->MoveLeaf(i, node->GetSpaceTree()->GetWorldBounds()); + + if (!node->GetSpaceTree()->IsEmpty() && fSpaceTree->HasLeafFlag(i, plSpaceTreeNode::kDisabled) ) fSpaceTree->SetLeafFlag(i, plSpaceTreeNode::kDisabled, false); - } } @@ -679,11 +675,8 @@ bool plPageTreeMgr::IGetOcclusion(plPipeline* pipe, hsTArray& list) fCullPolys.SetCount(0); fOccluders.SetCount(0); - int i; - for( i = 0; i < fNodes.GetCount(); i++ ) - { - fNodes[i]->SubmitOccluders(this); - } + for (plSceneNode* node : fNodes) + node->SubmitOccluders(this); if( !IGetCullPolys(pipe) ) { diff --git a/Sources/Plasma/PubUtilLib/plScene/plPageTreeMgr.h b/Sources/Plasma/PubUtilLib/plScene/plPageTreeMgr.h index 2c8775a3..2edcb28e 100644 --- a/Sources/Plasma/PubUtilLib/plScene/plPageTreeMgr.h +++ b/Sources/Plasma/PubUtilLib/plScene/plPageTreeMgr.h @@ -44,6 +44,7 @@ You can contact Cyan Worlds, Inc. by email legal@cyan.com #define plPageTreeMgr_inc #include "hsTemplates.h" +#include class plSceneNode; class plSpaceTree; @@ -79,7 +80,7 @@ public: class plPageTreeMgr { protected: - hsTArray fNodes; + std::vector fNodes; plSpaceTree* fSpaceTree; plVisMgr* fVisMgr; @@ -108,12 +109,12 @@ public: plPageTreeMgr(); virtual ~plPageTreeMgr(); - const hsTArray& GetNodes() const { return fNodes; } + const std::vector& GetNodes() const { return fNodes; } void AddNode(plSceneNode* node); void RemoveNode(plSceneNode* node); virtual void Reset(); // remove all nodes, nuke the space tree - virtual bool Empty() const { return !fNodes.GetCount(); } + virtual bool Empty() const { return fNodes.empty(); } virtual int Render(plPipeline* pipe); From d2b913f35018344e2f82cbdd71b35d46bfdaca8e Mon Sep 17 00:00:00 2001 From: Adam Johnson Date: Thu, 10 Jul 2014 19:39:50 -0400 Subject: [PATCH 2/3] Convert most of plSceneNode to std::vector --- .../Plasma/PubUtilLib/plScene/plSceneNode.cpp | 153 ++++++++---------- .../Plasma/PubUtilLib/plScene/plSceneNode.h | 19 +-- 2 files changed, 76 insertions(+), 96 deletions(-) diff --git a/Sources/Plasma/PubUtilLib/plScene/plSceneNode.cpp b/Sources/Plasma/PubUtilLib/plScene/plSceneNode.cpp index f681b6da..889b4938 100644 --- a/Sources/Plasma/PubUtilLib/plScene/plSceneNode.cpp +++ b/Sources/Plasma/PubUtilLib/plScene/plSceneNode.cpp @@ -100,7 +100,7 @@ void plSceneNode::Read(hsStream* s, hsResMgr* mgr) int i; n = s->ReadLE32(); - fSceneObjects.Reset(); + fSceneObjects.clear(); for( i = 0; i < n; i++ ) { plNodeRefMsg* refMsg = new plNodeRefMsg(GetKey(), plRefMsg::kOnCreate, i, plNodeRefMsg::kObject); @@ -108,7 +108,7 @@ void plSceneNode::Read(hsStream* s, hsResMgr* mgr) } n = s->ReadLE32(); - fGenericPool.Reset(); + fGenericPool.clear(); for( i = 0; i < n; i++ ) { plNodeRefMsg* refMsg = new plNodeRefMsg(GetKey(), plRefMsg::kOnCreate, -1, plNodeRefMsg::kGeneric); @@ -122,12 +122,12 @@ void plSceneNode::Write(hsStream* s, hsResMgr* mgr) int i; - s->WriteLE32(fSceneObjects.GetCount()); - for( i = 0; i < fSceneObjects.GetCount(); i++ ) + s->WriteLE32(fSceneObjects.size()); + for( i = 0; i < fSceneObjects.size(); i++ ) mgr->WriteKey(s,fSceneObjects[i]); - s->WriteLE32(fGenericPool.GetCount()); - for( i = 0; i < fGenericPool.GetCount(); i++ ) + s->WriteLE32(fGenericPool.size()); + for( i = 0; i < fGenericPool.size(); i++ ) mgr->WriteKey(s, fGenericPool[i]); } @@ -189,7 +189,7 @@ plSpaceTree* plSceneNode::IBuildSpaceTree() bnd.Reset(&zero); int i; - for( i = 0; i < fDrawPool.GetCount(); i++ ) + for( i = 0; i < fDrawPool.size(); i++ ) { if( fDrawPool[i] ) maker.AddLeaf(fDrawPool[i]->GetSpaceTree()->GetWorldBounds()); @@ -211,23 +211,21 @@ plSpaceTree* plSceneNode::ITrashSpaceTree() void plSceneNode::IDirtySpaceTree() { - int i; - for( i = 0; i < fDrawPool.GetCount(); i++ ) + for (size_t i = 0; i < fDrawPool.size(); ++i) { - if( fDrawPool[i] && fDrawPool[i]->GetSpaceTree()->IsDirty() ) + plDrawable* drawable = fDrawPool[i]; + if (drawable && drawable->GetSpaceTree()->IsDirty() ) { - fDrawPool[i]->GetSpaceTree()->Refresh(); - fSpaceTree->MoveLeaf(i, fDrawPool[i]->GetSpaceTree()->GetWorldBounds()); + drawable->GetSpaceTree()->Refresh(); + fSpaceTree->MoveLeaf(i, drawable->GetSpaceTree()->GetWorldBounds()); } } } plSpaceTree* plSceneNode::GetSpaceTree() { - if( !fSpaceTree ) - { + if (!fSpaceTree) IBuildSpaceTree(); - } IDirtySpaceTree(); return fSpaceTree; } @@ -237,12 +235,10 @@ void plSceneNode::ISetDrawable(plDrawable* d) if( !d ) return; - if (fDrawPool.Find(d) == fDrawPool.kMissingIndex) - { - fDrawPool.Append(d); + if (std::find(fDrawPool.begin(), fDrawPool.end(), d) == fDrawPool.end()) { + fDrawPool.push_back(d); + ITrashSpaceTree(); } - - ITrashSpaceTree(); } void plSceneNode::ISetAudible(plAudible* a) @@ -250,10 +246,8 @@ void plSceneNode::ISetAudible(plAudible* a) if( !a ) return; - if( fAudioPool.kMissingIndex == fAudioPool.Find(a) ) - { - fAudioPool.Append(a); - } + if (std::find(fAudioPool.begin(), fAudioPool.end(), a) == fAudioPool.end()) + fAudioPool.push_back(a); } void plSceneNode::ISetPhysical(plPhysical* p) @@ -261,31 +255,29 @@ void plSceneNode::ISetPhysical(plPhysical* p) if( !p ) return; - if( fSimulationPool.kMissingIndex == fSimulationPool.Find(p) ) - { - fSimulationPool.Append(p); - } + if (std::find(fSimulationPool.begin(), fSimulationPool.end(), p) == fSimulationPool.end()) + fSimulationPool.push_back(p); } void plSceneNode::ISetObject(plSceneObject* o) { - if( o && (fSceneObjects.kMissingIndex == fSceneObjects.Find(o)) ) - { - fSceneObjects.Append(o); + if (!o) + return; + + if (std::find(fSceneObjects.begin(), fSceneObjects.end(), o) == fSceneObjects.end()) + fSceneObjects.push_back(o); // MF_NET_GROUPS_TEST // This will have no effect on members of NetGroupConstants - o->SetNetGroup(o->SelectNetGroup(GetKey())); + o->SetNetGroup(o->SelectNetGroup(GetKey())); - o->SetSceneNode(GetKey()); - } + o->SetSceneNode(GetKey()); } void plSceneNode::ISetLight(plLightInfo* l) { - if( fLightPool.kMissingIndex == fLightPool.Find(l) ) - fLightPool.Append( l ); - + if (std::find(fLightPool.begin(), fLightPool.end(), l) == fLightPool.end()) + fLightPool.push_back(l); } void plSceneNode::ISetOccluder(plOccluder* o) @@ -298,25 +290,24 @@ void plSceneNode::ISetOccluder(plOccluder* o) void plSceneNode::ISetGeneric(hsKeyedObject* k) { - if( fGenericPool.kMissingIndex == fGenericPool.Find(k) ) - fGenericPool.Append(k); + if (std::find(fGenericPool.begin(), fGenericPool.end(), k) == fGenericPool.end()) + fGenericPool.push_back(k); } void plSceneNode::IRemoveDrawable(plDrawable* d) { - int idx = fDrawPool.Find(d); - if( idx != fDrawPool.kMissingIndex ) - fDrawPool.Remove(idx); - - ITrashSpaceTree(); + auto it = std::find(fDrawPool.begin(), fDrawPool.end(), d); + if (it != fDrawPool.end()) { + fDrawPool.erase(it); + ITrashSpaceTree(); + } } void plSceneNode::IRemoveAudible(plAudible* a) { - int idx = fAudioPool.Find(a); - if( idx != fAudioPool.kMissingIndex ) - fAudioPool.Remove(idx); - + auto it = std::find(fAudioPool.begin(), fAudioPool.end(), a); + if (it != fAudioPool.end()) + fAudioPool.erase(it); } void plSceneNode::IRemovePhysical(plPhysical* p) @@ -337,27 +328,25 @@ void plSceneNode::IRemovePhysical(plPhysical* p) } #endif - int idx = fSimulationPool.Find(p); - if( idx != fSimulationPool.kMissingIndex ) - fSimulationPool.Remove(idx); + auto it = std::find(fSimulationPool.begin(), fSimulationPool.end(), p); + if (it != fSimulationPool.end()) + fSimulationPool.erase(it); } void plSceneNode::IRemoveObject(plSceneObject* o) { - int idx = fSceneObjects.Find(o); - if( idx != fSceneObjects.kMissingIndex ) - fSceneObjects.Remove(idx); + auto it = std::find(fSceneObjects.begin(), fSceneObjects.end(), o); + if (it != fSceneObjects.end()) + fSceneObjects.erase(it); } void plSceneNode::IRemoveLight(plLightInfo* l) { hsAssert(l, "Removing nil light"); - int idx = fLightPool.Find(l); - if( idx != fLightPool.kMissingIndex ) - { - fLightPool.Remove(idx); - } + auto it = std::find(fLightPool.begin(), fLightPool.end(), l); + if (it != fLightPool.end()) + fLightPool.erase(it); } void plSceneNode::IRemoveOccluder(plOccluder* o) @@ -369,9 +358,9 @@ void plSceneNode::IRemoveOccluder(plOccluder* o) void plSceneNode::IRemoveGeneric(hsKeyedObject* k) { - int idx = fGenericPool.Find(k); - if( idx != fGenericPool.kMissingIndex ) - fGenericPool.Remove(idx); + auto it = std::find(fGenericPool.begin(), fGenericPool.end(), k); + if (it != fGenericPool.end()) + fGenericPool.erase(it); } bool plSceneNode::IOnRemove(plNodeRefMsg* refMsg) @@ -466,26 +455,24 @@ bool plSceneNode::MsgReceive(plMessage* msg) void plSceneNode::ICleanUp( void ) { - int i; - - /// Go find drawables to delete - for( i = 0; i < fDrawPool.GetCount(); i++ ) - fDrawPool[ i ]->Optimize(); + for (auto draw : fDrawPool) + draw->Optimize(); if (fFilterGenerics) { - for( i = fSceneObjects.GetCount() - 1; i >= 0; i--) + ssize_t i; + for ( i = fSceneObjects.size() - 1; i >= 0; i--) GetKey()->Release(fSceneObjects[i]->GetKey()); - for( i = fDrawPool.GetCount() - 1; i >= 0; i--) + for ( i = fDrawPool.size() - 1; i >= 0; i--) GetKey()->Release(fDrawPool[i]->GetKey()); - for( i = fSimulationPool.GetCount() - 1; i >= 0; i--) + for ( i = fSimulationPool.size() - 1; i >= 0; i--) GetKey()->Release(fSimulationPool[i]->GetKey()); - for( i = fAudioPool.GetCount() - 1; i >= 0; i--) + for ( i = fAudioPool.size() - 1; i >= 0; i--) GetKey()->Release(fAudioPool[i]->GetKey()); - for( i = fOccluders.GetCount() - 1; i >= 0; i--) + for ( i = fOccluders.GetCount() - 1; i >= 0; i--) GetKey()->Release(fOccluders[i]->GetKey()); - for( i = fLightPool.GetCount() - 1; i >= 0; i--) + for ( i = fLightPool.size() - 1; i >= 0; i--) GetKey()->Release(fLightPool[i]->GetKey()); } @@ -497,16 +484,11 @@ void plSceneNode::ICleanUp( void ) plDrawable *plSceneNode::GetMatchingDrawable( const plDrawableCriteria& crit ) { - int i; - - - for( i = 0; i < fDrawPool.GetCount(); i++ ) - { - if( fDrawPool[ i ]->DoIMatch( crit ) ) - return fDrawPool[ i ]; + for (auto draw : fDrawPool) { + if (draw->DoIMatch(crit)) + return draw; } - - return nil; + return nullptr; } //// OptimizeDrawables /////////////////////////////////////////////////////// @@ -515,10 +497,7 @@ plDrawable *plSceneNode::GetMatchingDrawable( const plDrawableCriteria& crit ) void plSceneNode::OptimizeDrawables( void ) { - int i; - - - for( i = 0; i < fDrawPool.GetCount(); i++ ) - fDrawPool[ i ]->Optimize(); + for (auto draw : fDrawPool) + draw->Optimize(); } diff --git a/Sources/Plasma/PubUtilLib/plScene/plSceneNode.h b/Sources/Plasma/PubUtilLib/plScene/plSceneNode.h index 36c8eda0..11c0b0d0 100644 --- a/Sources/Plasma/PubUtilLib/plScene/plSceneNode.h +++ b/Sources/Plasma/PubUtilLib/plScene/plSceneNode.h @@ -45,6 +45,7 @@ You can contact Cyan Worlds, Inc. by email legal@cyan.com #include "pnKeyedObject/hsKeyedObject.h" #include "hsTemplates.h" +#include class plSceneObject; @@ -76,17 +77,17 @@ protected: int16_t fDepth; - hsTArray fSceneObjects; - - hsTArray fDrawPool; - hsTArray fSimulationPool; - hsTArray fAudioPool; + std::vector fSceneObjects; - hsTArray fOccluders; + std::vector fDrawPool; + std::vector fSimulationPool; + std::vector fAudioPool; - hsTArray fLightPool; + hsTArray fOccluders; - hsTArray fGenericPool; + std::vector fLightPool; + + std::vector fGenericPool; plSpaceTree* fSpaceTree; @@ -149,7 +150,7 @@ public: void SetFilterGenericsOnly(bool b) { fFilterGenerics = b; } - const hsTArray& GetDrawPool() const { return fDrawPool; } + const std::vector& GetDrawPool() const { return fDrawPool; } }; #endif // plSceneNode_inc From fb66dca69147c0865b4327aa827f5b85da5054e6 Mon Sep 17 00:00:00 2001 From: Adam Johnson Date: Sat, 18 Oct 2014 20:11:01 -0400 Subject: [PATCH 3/3] Fix linux compile issues Add that include, foo! --- Sources/Plasma/PubUtilLib/plScene/plPageTreeMgr.cpp | 2 ++ Sources/Plasma/PubUtilLib/plScene/plSceneNode.cpp | 2 ++ 2 files changed, 4 insertions(+) diff --git a/Sources/Plasma/PubUtilLib/plScene/plPageTreeMgr.cpp b/Sources/Plasma/PubUtilLib/plScene/plPageTreeMgr.cpp index 232821aa..8d7ddeea 100644 --- a/Sources/Plasma/PubUtilLib/plScene/plPageTreeMgr.cpp +++ b/Sources/Plasma/PubUtilLib/plScene/plPageTreeMgr.cpp @@ -41,6 +41,8 @@ You can contact Cyan Worlds, Inc. by email legal@cyan.com *==LICENSE==*/ #include "HeadSpin.h" +#include + #include "plPageTreeMgr.h" #include "plDrawable/plSpaceTreeMaker.h" #include "plDrawable/plSpaceTree.h" diff --git a/Sources/Plasma/PubUtilLib/plScene/plSceneNode.cpp b/Sources/Plasma/PubUtilLib/plScene/plSceneNode.cpp index 889b4938..8684ae87 100644 --- a/Sources/Plasma/PubUtilLib/plScene/plSceneNode.cpp +++ b/Sources/Plasma/PubUtilLib/plScene/plSceneNode.cpp @@ -42,6 +42,8 @@ You can contact Cyan Worlds, Inc. by email legal@cyan.com #include "HeadSpin.h" +#include + #include "plSceneNode.h" #include "pnDispatch/plDispatch.h" #include "plMessage/plNodeCleanupMsg.h"