From: <axl...@us...> - 2009-10-11 03:32:39
|
Revision: 559 http://hgengine.svn.sourceforge.net/hgengine/?rev=559&view=rev Author: axlecrusher Date: 2009-10-11 03:32:30 +0000 (Sun, 11 Oct 2009) Log Message: ----------- allow for abstracted assted instance data Modified Paths: -------------- Mercury2/src/MercuryAsset.cpp Mercury2/src/MercuryAsset.h Mercury2/src/MercuryNode.cpp Mercury2/src/MercuryNode.h Modified: Mercury2/src/MercuryAsset.cpp =================================================================== --- Mercury2/src/MercuryAsset.cpp 2009-10-11 03:27:58 UTC (rev 558) +++ Mercury2/src/MercuryAsset.cpp 2009-10-11 03:32:30 UTC (rev 559) @@ -93,6 +93,11 @@ GLCALL( glEnd() ); } +MercuryAssetInstance* MercuryAsset::GenerateInstanceData(MercuryNode* parentNode) +{ + return new MercuryAssetInstance(this, parentNode); +} + MercuryAssetInstance::MercuryAssetInstance(MercuryAsset* asset, MercuryNode* parentNode) :m_parentNode(parentNode), m_asset( asset ), m_isCulled( false ), m_iPasses( asset->GetPasses() ) { Modified: Mercury2/src/MercuryAsset.h =================================================================== --- Mercury2/src/MercuryAsset.h 2009-10-11 03:27:58 UTC (rev 558) +++ Mercury2/src/MercuryAsset.h 2009-10-11 03:32:30 UTC (rev 559) @@ -21,6 +21,7 @@ }; class MercuryNode; +class MercuryAssetInstance; /* Assets are stored in renderable nodes with MAuto pointers. The renderable nodes handle the memory management @@ -61,6 +62,8 @@ inline unsigned short GetPasses() { return m_iPasses; } inline void SetPasses( unsigned short p ) { m_iPasses = p; } + + virtual MercuryAssetInstance* GenerateInstanceData(MercuryNode* parentNode); protected: void SetLoadState(LoadState ls); //thread safe LoadState GetLoadState(); //thread safe @@ -77,10 +80,12 @@ /** This holds the per-instance data for each asset instance. Used in MercuryNode. */ -class MercuryAssetInstance +class MercuryAssetInstance : public MessageHandler { public: MercuryAssetInstance(MercuryAsset* asset, MercuryNode* parentNode); + virtual ~MercuryAssetInstance() {}; + inline MercuryAsset& Asset() { return *m_asset; } inline const MercuryAsset& Asset() const { return *m_asset; } inline const MercuryAsset* AssetPtr() const { return m_asset; } @@ -92,8 +97,9 @@ inline unsigned short GetPasses() { return m_iPasses; } inline void SetPasses( unsigned short p ) { m_iPasses = p; } + protected: + MercuryNode* m_parentNode; private: - MercuryNode* m_parentNode; MAutoPtr< MercuryAsset > m_asset; //actual asset storage OcclusionResult m_occlusionResult; bool m_isCulled; Modified: Mercury2/src/MercuryNode.cpp =================================================================== --- Mercury2/src/MercuryNode.cpp 2009-10-11 03:27:58 UTC (rev 558) +++ Mercury2/src/MercuryNode.cpp 2009-10-11 03:32:30 UTC (rev 559) @@ -30,13 +30,22 @@ SAFE_DELETE(*i); m_children.clear(); + + ClearAssets(); } void MercuryNode::AddAsset(MercuryAsset* asset) { - m_assets.push_back( MercuryAssetInstance(asset, this) ); + m_assets.push_back( asset->GenerateInstanceData(this) ); } +void MercuryNode::ClearAssets() +{ + list< MercuryAssetInstance* >::iterator i; + for (i = m_assets.begin(); i != m_assets.end(); ++i ) + SAFE_DELETE(*i); +} + void MercuryNode::AddChild(MercuryNode* n) { // list< MercuryNode* >::iterator last = m_children.end(); @@ -299,36 +308,39 @@ SetCulled( false ); bool culled = true; - std::list< MercuryAssetInstance >::iterator i; + std::list< MercuryAssetInstance* >::iterator i; for (i = m_assets.begin(); i != m_assets.end(); ++i ) { - MercuryAssetInstance& mai = *i; - MercuryAsset& a = mai.Asset(); + MercuryAssetInstance* mai = *i; + MercuryAsset& a = mai->Asset(); ///NOTE: Things that ignore culling do not affect culling one way or the other if ( !a.IgnoreCull() ) { - mai.Culled( a.DoCullingTests( mai.GetOcclusionResult(), matrix ) ); - culled = culled && mai.Culled(); + mai->Culled( a.DoCullingTests( mai->GetOcclusionResult(), matrix ) ); + culled = culled && mai->Culled(); } - if ( !mai.Culled() ) a.PreRender(this); + if ( !mai->Culled() ) a.PreRender(this); } SetCulled( culled ); } void MercuryNode::Render(const MercuryMatrix& matrix) { - std::list< MercuryAssetInstance >::iterator i; + std::list< MercuryAssetInstance* >::iterator i; for (i = m_assets.begin(); i != m_assets.end(); ++i ) - if ( !(i->Culled() || i->GetOcclusionResult().IsOccluded()) ) i->Asset().Render(this); + { + MercuryAssetInstance* mai = *i; + if ( !(mai->Culled() || mai->GetOcclusionResult().IsOccluded()) ) mai->Asset().Render(this); + } } void MercuryNode::PostRender(const MercuryMatrix& matrix) { - std::list< MercuryAssetInstance >::iterator i; + std::list< MercuryAssetInstance* >::iterator i; for (i = m_assets.begin(); i != m_assets.end(); ++i ) - i->Asset().PostRender(this); + (*i)->Asset().PostRender(this); } const MercuryMatrix& MercuryNode::FindGlobalMatrix() const Modified: Mercury2/src/MercuryNode.h =================================================================== --- Mercury2/src/MercuryNode.h 2009-10-11 03:27:58 UTC (rev 558) +++ Mercury2/src/MercuryNode.h 2009-10-11 03:32:30 UTC (rev 559) @@ -101,6 +101,7 @@ inline MString GetName() const { return m_name; } void AddAsset(MercuryAsset* asset); + void ClearAssets(); virtual void PreRender(const MercuryMatrix& matrix); virtual void Render(const MercuryMatrix& matrix); @@ -134,7 +135,7 @@ unsigned short m_iForcePasses; //If (1<<15) is set, then, we know the force is enabled. //The asset is actually stored here - std::list< MercuryAssetInstance > m_assets; + std::list< MercuryAssetInstance* > m_assets; //we will just use normal pointers here because we don't want to waste too much time //dereferencing the autopointer. As a precaution when assets are added to these lists, This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |