|
From: <axl...@us...> - 2009-06-21 02:53:08
|
Revision: 350
http://hgengine.svn.sourceforge.net/hgengine/?rev=350&view=rev
Author: axlecrusher
Date: 2009-06-21 01:49:14 +0000 (Sun, 21 Jun 2009)
Log Message:
-----------
no more renderable node
Modified Paths:
--------------
Mercury2/src/BoundingBox.h
Mercury2/src/Mercury2.cpp
Mercury2/src/MercuryAsset.cpp
Mercury2/src/MercuryAsset.h
Mercury2/src/MercuryFBO.cpp
Mercury2/src/MercuryFBO.h
Mercury2/src/MercuryNode.cpp
Mercury2/src/MercuryNode.h
Mercury2/src/RenderGraph.cpp
Mercury2/src/RenderGraph.h
Mercury2/src/Shader.cpp
Mercury2/src/Texture.cpp
Mercury2/src/Viewport.cpp
Mercury2/src/Viewport.h
Modified: Mercury2/src/BoundingBox.h
===================================================================
--- Mercury2/src/BoundingBox.h 2009-06-21 01:44:12 UTC (rev 349)
+++ Mercury2/src/BoundingBox.h 2009-06-21 01:49:14 UTC (rev 350)
@@ -1,7 +1,7 @@
#ifndef BOUNDINGBOX_H
#define BOUNDINGBOX_H
-#include <MercuryNode.h>
+//#include <MercuryNode.h>
#include <MercuryVertex.h>
#include <MercuryMatrix.h>
#include <Frustum.h>
Modified: Mercury2/src/Mercury2.cpp
===================================================================
--- Mercury2/src/Mercury2.cpp 2009-06-21 01:44:12 UTC (rev 349)
+++ Mercury2/src/Mercury2.cpp 2009-06-21 01:49:14 UTC (rev 350)
@@ -1,12 +1,12 @@
#include <MercuryWindow.h>
#include <Quad.h>
-#include <RenderableNode.h>
+//#include <RenderableNode.h>
#include <Viewport.h>
#include <TransformNode.h>
#include <XMLParser.h>
-#include <RenderableNode.h>
+//#include <RenderableNode.h>
#include <MercuryCrash.h>
#include <MercuryBacktrace.h>
@@ -82,8 +82,10 @@
}
w->Clear();
- renderGraph.Render();
+// renderGraph.Render();
// RenderableNode::RecursiveRender(root);
+// printf("\n");
+ root->RecursiveRender();
w->SwapBuffers();
++m_count;
Modified: Mercury2/src/MercuryAsset.cpp
===================================================================
--- Mercury2/src/MercuryAsset.cpp 2009-06-21 01:44:12 UTC (rev 349)
+++ Mercury2/src/MercuryAsset.cpp 2009-06-21 01:49:14 UTC (rev 350)
@@ -1,6 +1,6 @@
#include <MercuryAsset.h>
-#include <RenderableNode.h>
-
+//#include <RenderableNode.h>
+#include <MercuryNode.h>
#include <GLHeaders.h>
MercuryAsset::MercuryAsset()
@@ -15,9 +15,8 @@
void MercuryAsset::Init(MercuryNode* node)
{
- RenderableNode* rn;
- if ( (rn=RenderableNode::Cast( node )) )
- rn->AddRender(this);
+// RenderableNode* rn;
+ if ( node ) node->AddRender(this);
}
void MercuryAsset::SetLoadState(LoadState ls)
Modified: Mercury2/src/MercuryAsset.h
===================================================================
--- Mercury2/src/MercuryAsset.h 2009-06-21 01:44:12 UTC (rev 349)
+++ Mercury2/src/MercuryAsset.h 2009-06-21 01:49:14 UTC (rev 350)
@@ -2,13 +2,16 @@
#define MERCURYASSET_H
#include <MAutoPtr.h>
-#include <MercuryNode.h>
#include <MessageHandler.h>
-#include <map>
#include <MercuryMatrix.h>
#include <BoundingBox.h>
#include <MSemaphore.h>
+#include <XMLParser.h>
+#include <Callback.h>
+#include <map>
+#include <list>
+
enum LoadState
{
LOADING,
@@ -16,6 +19,8 @@
NONE
};
+class MercuryNode;
+
/* Assets are stored in renderable nodes with MAuto pointers.
The renderable nodes handle the memory management
*/
Modified: Mercury2/src/MercuryFBO.cpp
===================================================================
--- Mercury2/src/MercuryFBO.cpp 2009-06-21 01:44:12 UTC (rev 349)
+++ Mercury2/src/MercuryFBO.cpp 2009-06-21 01:49:14 UTC (rev 350)
@@ -97,7 +97,7 @@
GLERRORCHECK;
}
- RenderableNode::PreRender(matrix);
+ MercuryNode::PreRender(matrix);
}
void MercuryFBO::Render(const MercuryMatrix& matrix)
@@ -117,7 +117,7 @@
if ( !m_useScreenSize ) glViewport(0,0,m_width, m_height);
GLERRORCHECK;
- RenderableNode::Render(matrix);
+ MercuryNode::Render(matrix);
GLERRORCHECK;
}
@@ -125,7 +125,7 @@
{
glPopAttrib();
- RenderableNode::PostRender(matrix);
+ MercuryNode::PostRender(matrix);
// for( uint8_t i = 0; i < m_numTextures; i++ )
// {
@@ -159,7 +159,7 @@
if ( !node.Attribute("usescreensize").empty() )
m_useScreenSize = node.Attribute("usescreensize") == "true"?true:false;
- RenderableNode::LoadFromXML(node);
+ MercuryNode::LoadFromXML(node);
}
//uint32_t MercuryFBO::m_lastRendered = NULL;
Modified: Mercury2/src/MercuryFBO.h
===================================================================
--- Mercury2/src/MercuryFBO.h 2009-06-21 01:44:12 UTC (rev 349)
+++ Mercury2/src/MercuryFBO.h 2009-06-21 01:49:14 UTC (rev 350)
@@ -1,10 +1,10 @@
#ifndef MERCURYFBO_H
#define MERCURYFBO_H
-#include <RenderableNode.h>
+#include <MercuryNode.h>
#include <Texture.h>
-class MercuryFBO : public RenderableNode
+class MercuryFBO : public MercuryNode
{
public:
MercuryFBO();
Modified: Mercury2/src/MercuryNode.cpp
===================================================================
--- Mercury2/src/MercuryNode.cpp 2009-06-21 01:44:12 UTC (rev 349)
+++ Mercury2/src/MercuryNode.cpp 2009-06-21 01:49:14 UTC (rev 350)
@@ -1,13 +1,19 @@
#include <MercuryNode.h>
#include <MercuryUtil.h>
#include <UpdateThreader.h>
+#include <TransformNode.h>
+#include <Viewport.h>
+
+#include <GLHeaders.h>
+#include <Shader.h>
+
using namespace std;
REGISTER_NODE_TYPE(MercuryNode);
MercuryNode::MercuryNode()
- :m_parent(NULL), m_prevSibling(NULL), m_nextSibling(NULL)
+ :m_parent(NULL), m_prevSibling(NULL), m_nextSibling(NULL), m_hidden(false)
{
}
@@ -98,6 +104,36 @@
child->RecursiveUpdate(dTime);
}
+void MercuryNode::RecursiveRender()
+{
+ MercuryMatrix modelView;
+ ShaderAttribute sa;
+
+ MercuryMatrix matrix = FindGlobalMatrix();
+
+ PreRender( matrix ); //calls on children assets
+ modelView = ManipulateMatrix( matrix );
+ if ( IsHidden() || IsCulled(modelView) ) return;
+ modelView.Transpose();
+
+ glLoadMatrixf( modelView.Ptr() );
+
+ sa.type = ShaderAttribute::TYPE_MATRIX;
+ sa.value.matrix = matrix.Ptr();
+ Shader::SetAttribute("HG_ModelMatrix", sa);
+
+ Render( modelView ); //calls on children assets
+
+ //call render on other render graph entries under me
+ std::list< MercuryNode* >::iterator i;
+ for (i = m_children.begin(); i != m_children.end(); ++i )
+ (*i)->RecursiveRender();
+
+ glLoadMatrixf( modelView.Ptr() );
+ Shader::SetAttribute("HG_ModelMatrix", sa);
+ PostRender( modelView ); //calls on children assets
+}
+
void MercuryNode::ThreadedUpdate(float dTime)
{
//XXX EXPERIMENTAL
@@ -111,6 +147,10 @@
void MercuryNode::LoadFromXML(const XMLNode& node)
{
SetName( node.Attribute("name") );
+
+ if ( !node.Attribute("hidden").empty() )
+ m_hidden = node.Attribute("hidden")=="true"?true:false;
+
//Not much to do here except run through all the children nodes
for (XMLNode child = node.Child(); child.IsValid(); child = child.NextNode())
{
@@ -121,9 +161,121 @@
node->LoadFromXML( child );
this->AddChild( node );
}
+ else if ( child.Name() == "asset" )
+ {
+ MString key = child.Attribute("file");
+ MAutoPtr< MercuryAsset > asset( AssetFactory::GetInstance().Generate( child.Attribute("type"), key ) );
+ if ( asset.IsValid() )
+ {
+ asset->LoadFromXML( child );
+ this->AddAsset( asset );
+ asset->Init( this );
+ }
+ }
}
}
+
+void MercuryNode::PreRender(const MercuryMatrix& matrix)
+{
+ list< MercuryAsset* >::iterator i;
+ for (i = m_prerender.begin(); i != m_prerender.end(); ++i )
+ (*i)->PreRender(this);
+}
+
+void MercuryNode::Render(const MercuryMatrix& matrix)
+{
+ list< MercuryAsset* >::iterator i;
+ for (i = m_render.begin(); i != m_render.end(); ++i )
+ (*i)->Render(this);
+}
+
+void MercuryNode::PostRender(const MercuryMatrix& matrix)
+{
+ list< MercuryAsset* >::iterator i;
+ for (i = m_postrender.begin(); i != m_postrender.end(); ++i )
+ (*i)->PostRender(this);
+}
+
+const MercuryMatrix& MercuryNode::FindGlobalMatrix() const
+{
+ const MercuryNode* n = NULL;
+ const TransformNode* tn;
+ for (n = this; n; n = n->Parent())
+ {
+ tn = TransformNode::Cast(n);
+ if ( tn )
+ return tn->GetGlobalMatrix();
+ }
+
+ return MercuryMatrix::Identity();
+}
+
+void MercuryNode::AddPreRender(MercuryAsset* asset)
+{
+#ifdef MCHECKASSETS
+ if ( !IsInAssetList(asset) ) //yell and scream
+ assert(!"Asset does not exist in list!");
+#endif
+
+ m_prerender.push_back(asset);
+}
+
+void MercuryNode::AddRender(MercuryAsset* asset)
+{
+#ifdef MCHECKASSETS
+ if ( !IsInAssetList(asset) ) //yell and scream
+ assert(!"Asset does not exist in list!");
+#endif
+
+ m_render.push_back(asset);
+}
+void MercuryNode::AddPostRender(MercuryAsset* asset)
+{
+#ifdef MCHECKASSETS
+ if ( !IsInAssetList(asset) ) //yell and scream
+ assert(!"Asset does not exist in list!");
+#endif
+
+ m_postrender.push_back(asset);
+}
+
+bool MercuryNode::IsInAssetList( MercuryAsset* asset ) const
+{
+ std::list< MAutoPtr< MercuryAsset > >::const_iterator i;
+ for (i = m_assets.begin(); i != m_assets.end(); ++i )
+ if ( (*i) == asset ) return true;
+ return false;
+}
+
+bool MercuryNode::IsCulled(const MercuryMatrix& matrix)
+{
+ bool clip = false;
+
+ std::list< MAutoPtr< MercuryAsset > >::iterator i;
+ for (i = m_assets.begin(); i != m_assets.end(); ++i )
+ {
+ const BoundingVolume* bv = (*i)->GetBoundingVolume();
+ if (bv)
+ {
+ BoundingVolume* v = bv->SpawnClone();
+ v->Transform( matrix );
+ clip = v->Clip( *FRUSTUM );
+ delete v;
+ if ( clip == false ) return false;
+ }
+ else
+ return false;
+ }
+ return clip;
+}
+
+MercuryMatrix MercuryNode::ManipulateMatrix(const MercuryMatrix& matrix)
+{
+ return VIEWMATRIX * matrix;
+}
+
+
NodeFactory& NodeFactory::GetInstance()
{
static NodeFactory* instance = NULL;
Modified: Mercury2/src/MercuryNode.h
===================================================================
--- Mercury2/src/MercuryNode.h 2009-06-21 01:44:12 UTC (rev 349)
+++ Mercury2/src/MercuryNode.h 2009-06-21 01:49:14 UTC (rev 350)
@@ -8,6 +8,8 @@
#include <MercuryUtil.h>
#include <MessageHandler.h>
+#include <MercuryAsset.h>
+
/** This is the basic node of the scene graph. It is not intended to be instanced.
Each node exists as a single entity in the scene graph.
**/
@@ -44,6 +46,9 @@
virtual void RecursiveUpdate(float dTime);
void ThreadedUpdate(float dTime);
+
+ void RecursiveRender();
+
///Run on parent when a child is added
virtual void OnAddChild() {};
@@ -65,6 +70,25 @@
inline void SetName(const MString& name) { m_name = name; }
inline MString GetName() const { return m_name; }
+ inline void AddAsset(MAutoPtr< MercuryAsset > asset) { m_assets.push_back(asset); }
+
+ void AddPreRender(MercuryAsset* asset);
+ void AddRender(MercuryAsset* asset);
+ void AddPostRender(MercuryAsset* asset);
+
+ virtual void PreRender(const MercuryMatrix& matrix);
+ virtual void Render(const MercuryMatrix& matrix);
+ virtual void PostRender(const MercuryMatrix& matrix);
+
+ ///This will get the world space matrix
+ const MercuryMatrix& FindGlobalMatrix() const;
+
+ virtual bool IsCulled(const MercuryMatrix& matrix);
+ bool IsHidden() { return m_hidden; }
+
+ virtual MercuryMatrix ManipulateMatrix(const MercuryMatrix& matrix);
+
+
protected:
std::list< MercuryNode* > m_children; //These nodes are unique, not instanced
MercuryNode* m_parent;
@@ -73,7 +97,19 @@
static bool m_rebuildRenderGraph;
MString m_name;
-
+ bool m_hidden;
+ private:
+ bool IsInAssetList(MercuryAsset* asset) const;
+
+ //The asset is actually stored here
+ std::list< MAutoPtr< MercuryAsset > > 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,
+ //they must exist in m_assets.
+ std::list< MercuryAsset* > m_prerender;
+ std::list< MercuryAsset* > m_render;
+ std::list< MercuryAsset* > m_postrender;
};
class NodeFactory
Modified: Mercury2/src/RenderGraph.cpp
===================================================================
--- Mercury2/src/RenderGraph.cpp 2009-06-21 01:44:12 UTC (rev 349)
+++ Mercury2/src/RenderGraph.cpp 2009-06-21 01:49:14 UTC (rev 350)
@@ -49,12 +49,12 @@
void RenderGraph::Build( MercuryNode* node, RenderGraphEntry& entry)
{
RenderGraphEntry* lastEntry = &entry;
- RenderableNode* rn = RenderableNode::Cast(node);
+// MercuryNode* rn = MercuryNode::Cast(node);
- if ( rn )
+ if ( node )
{
//found a new renderable
- entry.m_children.push_back( RenderGraphEntry(&rn->FindGlobalMatrix(), rn) );
+ entry.m_children.push_back( RenderGraphEntry(&(node->FindGlobalMatrix()), node) );
lastEntry = &(entry.m_children.back());
}
Modified: Mercury2/src/RenderGraph.h
===================================================================
--- Mercury2/src/RenderGraph.h 2009-06-21 01:44:12 UTC (rev 349)
+++ Mercury2/src/RenderGraph.h 2009-06-21 01:49:14 UTC (rev 350)
@@ -2,7 +2,7 @@
#define RENDERGRAPH_H
#include <MercuryNode.h>
-#include <RenderableNode.h>
+//#include <RenderableNode.h>
class RenderGraphEntry
{
@@ -14,14 +14,14 @@
m_matrix = &MercuryMatrix::Identity();
}
- RenderGraphEntry(const MercuryMatrix* matrix, RenderableNode* node)
+ RenderGraphEntry(const MercuryMatrix* matrix, MercuryNode* node)
:m_node(node), m_matrix(matrix)
{}
void AddChild(RenderGraphEntry entry);
void Render();
private:
- RenderableNode* m_node; //we don't own this, no new or free
+ MercuryNode* m_node; //we don't own this, no new or free
std::list< RenderGraphEntry > m_children;
const MercuryMatrix* m_matrix;
};
Modified: Mercury2/src/Shader.cpp
===================================================================
--- Mercury2/src/Shader.cpp 2009-06-21 01:44:12 UTC (rev 349)
+++ Mercury2/src/Shader.cpp 2009-06-21 01:49:14 UTC (rev 350)
@@ -1,5 +1,5 @@
#include <Shader.h>
-#include <RenderableNode.h>
+#include <MercuryNode.h>
#include <MercuryFile.h>
#include <GLHeaders.h>
@@ -44,9 +44,8 @@
void Shader::Init(MercuryNode* node)
{
MercuryAsset::Init( node );
- RenderableNode* rn = RenderableNode::Cast( node );
- if ( rn )
- rn->AddPostRender( this );
+// RenderableNode* rn = RenderableNode::Cast( node );
+ if ( node ) node->AddPostRender( this );
}
void Shader::Render(const MercuryNode* node)
Modified: Mercury2/src/Texture.cpp
===================================================================
--- Mercury2/src/Texture.cpp 2009-06-21 01:44:12 UTC (rev 349)
+++ Mercury2/src/Texture.cpp 2009-06-21 01:49:14 UTC (rev 350)
@@ -1,7 +1,7 @@
#include <Texture.h>
-#include <RenderableNode.h>
+//#include <RenderableNode.h>
#include <ImageLoader.h>
-
+#include <MercuryNode.h>
#include <GLHeaders.h>
#include <Shader.h>
@@ -38,9 +38,8 @@
{
MercuryAsset::Init( node );
- RenderableNode* rn = RenderableNode::Cast( node );
- if ( rn )
- rn->AddPostRender( this );
+// RenderableNode* rn = RenderableNode::Cast( node );
+ if ( node ) node->AddPostRender( this );
}
void Texture::LoadFromRaw()
Modified: Mercury2/src/Viewport.cpp
===================================================================
--- Mercury2/src/Viewport.cpp 2009-06-21 01:44:12 UTC (rev 349)
+++ Mercury2/src/Viewport.cpp 2009-06-21 01:49:14 UTC (rev 350)
@@ -65,7 +65,7 @@
StrToFloat(node.Attribute("near")),
StrToFloat(node.Attribute("far")));
- RenderableNode::LoadFromXML(node);
+ MercuryNode::LoadFromXML(node);
}
Modified: Mercury2/src/Viewport.h
===================================================================
--- Mercury2/src/Viewport.h 2009-06-21 01:44:12 UTC (rev 349)
+++ Mercury2/src/Viewport.h 2009-06-21 01:49:14 UTC (rev 350)
@@ -1,7 +1,7 @@
#ifndef VIEWPORT_H
#define VIEWPORT_H
-#include <RenderableNode.h>
+#include <MercuryNode.h>
#include <MercuryMatrix.h>
#include <MercuryVertex.h>
#include <MercuryPlane.h>
@@ -12,7 +12,7 @@
extern MercuryVertex EYE;
extern MercuryVector LOOKAT;
-class Viewport : public RenderableNode
+class Viewport : public MercuryNode
{
public:
Viewport();
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|