|
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.
|