|
From: <axl...@us...> - 2009-08-05 00:38:05
|
Revision: 453
http://hgengine.svn.sourceforge.net/hgengine/?rev=453&view=rev
Author: axlecrusher
Date: 2009-08-05 00:37:56 +0000 (Wed, 05 Aug 2009)
Log Message:
-----------
updates for deferred shading
Modified Paths:
--------------
Mercury2/src/BoundingBox.cpp
Mercury2/src/BoundingBox.h
Mercury2/src/FullscreenQuad.h
Mercury2/src/GLHelpers.h
Mercury2/src/HGMDLModel.cpp
Mercury2/src/HGMDLModel.h
Mercury2/src/MercuryAsset.cpp
Mercury2/src/MercuryAsset.h
Mercury2/src/MercuryFBO.cpp
Mercury2/src/MercuryNode.cpp
Mercury2/src/Quad.cpp
Mercury2/src/RenderGraph.cpp
Mercury2/src/RenderGraph.h
Mercury2/src/Texture.cpp
Modified: Mercury2/src/BoundingBox.cpp
===================================================================
--- Mercury2/src/BoundingBox.cpp 2009-08-05 00:34:44 UTC (rev 452)
+++ Mercury2/src/BoundingBox.cpp 2009-08-05 00:37:56 UTC (rev 453)
@@ -28,14 +28,14 @@
}
BoundingBox::BoundingBox(const MercuryVertex& center, const MercuryVertex& extend)
- :m_center(center), m_extend(extend)
+ :BoundingVolume(), m_center(center), m_extend(extend)
{
PopulateVertices();
ComputeNormals();
}
BoundingBox::BoundingBox(const BoundingBox& bb)
- :m_center(bb.m_center), m_extend(bb.m_extend)
+ :BoundingVolume(), m_center(bb.m_center), m_extend(bb.m_extend)
{
PopulateVertices();
for (uint8_t i = 0; i < 3; ++i)
@@ -172,7 +172,30 @@
glEndQueryARB(GL_SAMPLES_PASSED_ARB);
// glGetQueryObjectuivARB(q, GL_QUERY_RESULT_ARB, &samples);
+ glPopMatrix();
glPopAttrib( );
+}
+
+void BoundingBox::RenderFaces() const
+{
+ const float* center = GetCenter();
+ const float* extend = GetExtend();
+
+ glPushMatrix();
+ glTranslatef(center[0], center[1], center[2]);
+ glScalef(extend[0],extend[1],extend[2]);
+
+ if (m_vboID == 0) InitVBO();
+
+// if ( MercuryVBO::m_lastVBOrendered != &m_vboID )
+ {
+ MercuryVBO::m_lastVBOrendered = &m_vboID;
+ glBindBufferARB(GL_ARRAY_BUFFER_ARB, m_vboID); // once
+ glBindBufferARB(GL_ELEMENT_ARRAY_BUFFER_ARB, 0); // once
+ glVertexPointer(3, GL_FLOAT, 0, 0); // once
+ }
+
+ glDrawArrays(GL_QUADS, 0, 24);
glPopMatrix();
}
@@ -275,10 +298,10 @@
uint32_t i = 0;
//back
+ m_vertexData[i++] = 1.0f; m_vertexData[i++] = 1.0f; m_vertexData[i++] = -1.0f;
+ m_vertexData[i++] = 1.0f; m_vertexData[i++] = -1.0f; m_vertexData[i++] = -1.0f;
+ m_vertexData[i++] = -1.0f; m_vertexData[i++] = -1.0f; m_vertexData[i++] = -1.0f;
m_vertexData[i++] = -1.0f; m_vertexData[i++] = 1.0f; m_vertexData[i++] = -1.0f;
- m_vertexData[i++] = -1.0f; m_vertexData[i++] = -1.0f; m_vertexData[i++] = -1.0f;
- m_vertexData[i++] = 1.0f; m_vertexData[i++] = -1.0f; m_vertexData[i++] = -1.0f;
- m_vertexData[i++] = 1.0f; m_vertexData[i++] = 1.0f; m_vertexData[i++] = -1.0f;
//front
m_vertexData[i++] = -1.0f; m_vertexData[i++] = 1.0f; m_vertexData[i++] = 1.0f;
@@ -293,10 +316,10 @@
m_vertexData[i++] = -1.0f; m_vertexData[i++] = 1.0f; m_vertexData[i++] = 1.0f;
//right
+ m_vertexData[i++] = 1.0f; m_vertexData[i++] = 1.0f; m_vertexData[i++] = 1.0f;
+ m_vertexData[i++] = 1.0f; m_vertexData[i++] = -1.0f; m_vertexData[i++] = 1.0f;
+ m_vertexData[i++] = 1.0f; m_vertexData[i++] = -1.0f; m_vertexData[i++] = -1.0f;
m_vertexData[i++] = 1.0f; m_vertexData[i++] = 1.0f; m_vertexData[i++] = -1.0f;
- m_vertexData[i++] = 1.0f; m_vertexData[i++] = -1.0f; m_vertexData[i++] = -1.0f;
- m_vertexData[i++] = 1.0f; m_vertexData[i++] = -1.0f; m_vertexData[i++] = 1.0f;
- m_vertexData[i++] = 1.0f; m_vertexData[i++] = 1.0f; m_vertexData[i++] = 1.0f;
//top
m_vertexData[i++] = -1.0f; m_vertexData[i++] = 1.0f; m_vertexData[i++] = -1.0f;
@@ -305,10 +328,10 @@
m_vertexData[i++] = 1.0f; m_vertexData[i++] = 1.0f; m_vertexData[i++] = -1.0f;
//bottom
+ m_vertexData[i++] = 1.0f; m_vertexData[i++] = -1.0f; m_vertexData[i++] = -1.0f;
+ m_vertexData[i++] = 1.0f; m_vertexData[i++] = -1.0f; m_vertexData[i++] = 1.0f;
+ m_vertexData[i++] = -1.0f; m_vertexData[i++] = -1.0f; m_vertexData[i++] = 1.0f;
m_vertexData[i++] = -1.0f; m_vertexData[i++] = -1.0f; m_vertexData[i++] = -1.0f;
- m_vertexData[i++] = -1.0f; m_vertexData[i++] = -1.0f; m_vertexData[i++] = 1.0f;
- m_vertexData[i++] = 1.0f; m_vertexData[i++] = -1.0f; m_vertexData[i++] = 1.0f;
- m_vertexData[i++] = 1.0f; m_vertexData[i++] = -1.0f; m_vertexData[i++] = -1.0f;
}
void BoundingBox::InitVBO()
Modified: Mercury2/src/BoundingBox.h
===================================================================
--- Mercury2/src/BoundingBox.h 2009-08-05 00:34:44 UTC (rev 452)
+++ Mercury2/src/BoundingBox.h 2009-08-05 00:37:56 UTC (rev 453)
@@ -79,6 +79,7 @@
const MercuryVector& Normal(uint8_t i) const { return m_normals[i]; }
virtual void Render();
+ void RenderFaces() const;
virtual BoundingVolume* SpawnClone() const;
virtual bool Clip( const MercuryPlane& p );
Modified: Mercury2/src/FullscreenQuad.h
===================================================================
--- Mercury2/src/FullscreenQuad.h 2009-08-05 00:34:44 UTC (rev 452)
+++ Mercury2/src/FullscreenQuad.h 2009-08-05 00:37:56 UTC (rev 453)
@@ -1,5 +1,9 @@
+#ifndef FULLSCREENQUAD_H
+#define FULLSCREENQUAD_H
+
#include <Quad.h>
+
class FullscreenQuad : public Quad
{
public:
@@ -13,6 +17,8 @@
MercuryMatrix m_matrix;
};
+#endif
+
/****************************************************************************
* Copyright (C) 2009 by Joshua Allen *
* *
Modified: Mercury2/src/GLHelpers.h
===================================================================
--- Mercury2/src/GLHelpers.h 2009-08-05 00:34:44 UTC (rev 452)
+++ Mercury2/src/GLHelpers.h 2009-08-05 00:37:56 UTC (rev 453)
@@ -7,7 +7,7 @@
MString GlError2String(uint32_t e);
void glLoadMatrix(const MercuryMatrix& m);
-MercuryMatrix glGetMatrix(int m);
+MercuryMatrix glGetMatrix(GLenum m);
MercuryVertex pointFromScreenLoc(int screen_x, int screen_y);
GLenum ToGLColorType(ColorByteType cbt);
Modified: Mercury2/src/HGMDLModel.cpp
===================================================================
--- Mercury2/src/HGMDLModel.cpp 2009-08-05 00:34:44 UTC (rev 452)
+++ Mercury2/src/HGMDLModel.cpp 2009-08-05 00:37:56 UTC (rev 453)
@@ -19,6 +19,8 @@
{
MString path = node.Attribute("file");
LoadHGMDL( path );
+
+ MercuryAsset::LoadFromXML( node );
}
void HGMDLModel::LoadModel(MercuryFile* hgmdl, HGMDLModel* model)
@@ -58,11 +60,16 @@
}
}
-void HGMDLModel::DoCullingTests(MercuryNode* n, const MercuryMatrix& matrix)
+bool HGMDLModel::DoCullingTests(MercuryNode* n, const MercuryMatrix& matrix)
{
+ bool culled = false;
if ( GetLoadState() != LOADING )
+ {
+ culled = true;
for(uint16_t i = 0; i < m_meshes.size(); ++i)
- m_meshes[i]->DoCullingTests(n, matrix);
+ culled = culled && m_meshes[i]->DoCullingTests(n, matrix);
+ }
+ return culled;
}
void HGMDLModel::PreRender(const MercuryNode* node)
Modified: Mercury2/src/HGMDLModel.h
===================================================================
--- Mercury2/src/HGMDLModel.h 2009-08-05 00:34:44 UTC (rev 452)
+++ Mercury2/src/HGMDLModel.h 2009-08-05 00:37:56 UTC (rev 453)
@@ -19,7 +19,7 @@
static HGMDLModel* Generate();
- virtual void DoCullingTests(MercuryNode* n, const MercuryMatrix& matrix);
+ virtual bool DoCullingTests(MercuryNode* n, const MercuryMatrix& matrix);
virtual void PreRender(const MercuryNode* node);
virtual void Render(const MercuryNode* node);
Modified: Mercury2/src/MercuryAsset.cpp
===================================================================
--- Mercury2/src/MercuryAsset.cpp 2009-08-05 00:34:44 UTC (rev 452)
+++ Mercury2/src/MercuryAsset.cpp 2009-08-05 00:37:56 UTC (rev 453)
@@ -39,14 +39,16 @@
SetLoadState( LOADED );
}
-void MercuryAsset::DoCullingTests(MercuryNode* n, const MercuryMatrix& matrix)
+bool MercuryAsset::DoCullingTests(MercuryNode* n, const MercuryMatrix& matrix)
{
+ bool culled = false;
if ( m_boundingVolume )
{
- n->SetCulled( m_boundingVolume->DoFrustumTest(matrix) );
- if ( !n->IsCulled() && DOOCCLUSIONCULL)
+ culled = m_boundingVolume->DoFrustumTest(matrix);
+ if ( !culled && DOOCCLUSIONCULL)
m_boundingVolume->DoOcclusionTest( n->GetOcclusionResult() );
}
+ return culled;
}
void MercuryAsset::PreRender(const MercuryNode* node)
@@ -62,6 +64,17 @@
*/
}
+void MercuryAsset::LoadFromXML(const XMLNode& node)
+{
+
+ printf("asset xml\n");
+ if ( !node.Attribute("nocull").empty() )
+ {
+ printf("NO CULL!!!!!!!!!!\n");
+ SetExcludeFromCull( node.Attribute("nocull")=="true" );
+ }
+}
+
void MercuryAsset::DrawAxes()
{
glBegin(GL_LINES);
Modified: Mercury2/src/MercuryAsset.h
===================================================================
--- Mercury2/src/MercuryAsset.h 2009-08-05 00:34:44 UTC (rev 452)
+++ Mercury2/src/MercuryAsset.h 2009-08-05 00:37:56 UTC (rev 453)
@@ -42,7 +42,7 @@
virtual void PostRender(const MercuryNode* node) {};
///Loads an asset from an XMLAsset representing itself
- virtual void LoadFromXML(const XMLNode& node) {};
+ virtual void LoadFromXML(const XMLNode& node);
virtual void LoadedCallback(); //thread safe
@@ -51,8 +51,12 @@
inline BoundingVolume* GetBoundingVolume() const { return m_boundingVolume; }
inline const MString& Path() const { return m_path; }
- virtual void DoCullingTests(MercuryNode* n, const MercuryMatrix& matrix);
+ ///Retuns true if culled, also will initiate occlusion test
+ virtual bool DoCullingTests(MercuryNode* n, const MercuryMatrix& matrix);
void DrawAxes();
+
+ inline void SetExcludeFromCull(bool t) { m_excludeFromCull = t; }
+ inline bool ExcludeFromCull() const { return m_excludeFromCull; }
protected:
void SetLoadState(LoadState ls); //thread safe
LoadState GetLoadState(); //thread safe
@@ -63,6 +67,7 @@
private:
LoadState m_loadState;
MSemaphore m_lock;
+ bool m_excludeFromCull;
};
class LoaderThreadData
Modified: Mercury2/src/MercuryFBO.cpp
===================================================================
--- Mercury2/src/MercuryFBO.cpp 2009-08-05 00:34:44 UTC (rev 452)
+++ Mercury2/src/MercuryFBO.cpp 2009-08-05 00:37:56 UTC (rev 453)
@@ -3,6 +3,8 @@
#include <MercuryWindow.h>
#include <assert.h>
+#include <RenderGraph.h>
+
REGISTER_NODE_TYPE(MercuryFBO);
MercuryFBO::MercuryFBO()
@@ -134,8 +136,10 @@
// glActiveTextureARB( GL_TEXTURE0_ARB + i );
// glDisable( GL_TEXTURE_2D );
// }
+// CURRENTRENDERGRAPH->DoDifferedLightPass();
glBindFramebufferEXT( GL_FRAMEBUFFER_EXT, 0 );
// glBindRenderbufferEXT( GL_RENDERBUFFER_EXT, 0 );
+// CURRENTRENDERGRAPH->DoDifferedLightPass();
CHECKFBO;
GLERRORCHECK;
Modified: Mercury2/src/MercuryNode.cpp
===================================================================
--- Mercury2/src/MercuryNode.cpp 2009-08-05 00:34:44 UTC (rev 452)
+++ Mercury2/src/MercuryNode.cpp 2009-08-05 00:37:56 UTC (rev 453)
@@ -220,6 +220,7 @@
MAutoPtr< MercuryAsset > asset( AssetFactory::GetInstance().Generate( child.Attribute("type"), key ) );
if ( asset.IsValid() )
{
+ printf("new asset %s\n", child.Attribute("type").c_str());
asset->LoadFromXML( child );
this->AddAsset( asset );
asset->Init( this );
@@ -231,11 +232,15 @@
void MercuryNode::PreRender(const MercuryMatrix& matrix)
{
+ SetCulled( false );
+ bool culled = true;
list< MercuryAsset* >::iterator i;
for (i = m_prerender.begin(); i != m_prerender.end(); ++i )
{
- (*i)->DoCullingTests( this, matrix );
+ if ( !(*i)->ExcludeFromCull() )
+ culled = culled && (*i)->DoCullingTests( this, matrix );
(*i)->PreRender(this);
+ SetCulled( culled );
}
}
Modified: Mercury2/src/Quad.cpp
===================================================================
--- Mercury2/src/Quad.cpp 2009-08-05 00:34:44 UTC (rev 452)
+++ Mercury2/src/Quad.cpp 2009-08-05 00:37:56 UTC (rev 453)
@@ -36,6 +36,8 @@
m_indexData[1] = 1;
m_indexData[3] = m_indexData[2] = 2;
m_indexData[4] = 3;
+
+ SetExcludeFromCull( true );
}
Quad::~Quad()
Modified: Mercury2/src/RenderGraph.cpp
===================================================================
--- Mercury2/src/RenderGraph.cpp 2009-08-05 00:34:44 UTC (rev 452)
+++ Mercury2/src/RenderGraph.cpp 2009-08-05 00:37:56 UTC (rev 453)
@@ -104,6 +104,20 @@
}
}
+void RenderGraph::AddDifferedLight( Light* l )
+{
+ m_lights.push_back( l );
+}
+
+void RenderGraph::DoDifferedLightPass()
+{
+ std::list< Light* >::iterator i;
+ for (i = m_lights.begin();i != m_lights.end(); ++i)
+ (*i)->DifferedRender();
+
+ m_lights.clear();
+}
+
StoreRenderState::StoreRenderState()
:Node(NULL)
{
Modified: Mercury2/src/RenderGraph.h
===================================================================
--- Mercury2/src/RenderGraph.h 2009-08-05 00:34:44 UTC (rev 452)
+++ Mercury2/src/RenderGraph.h 2009-08-05 00:37:56 UTC (rev 453)
@@ -5,6 +5,8 @@
//#include <RenderableNode.h>
#include <PriorityQueue.h>
+#include <Light.h>
+
class RenderGraphEntry
{
friend class RenderGraph;
@@ -49,12 +51,16 @@
void AddAlphaNode( MercuryNode* node );
void RenderAlpha();
+
+ void AddDifferedLight( Light* l );
+ void DoDifferedLightPass();
private:
void Build( MercuryNode* node, RenderGraphEntry& entry );
RenderGraphEntry m_root;
//nodes that use alpha, ordered from farthest to nearest from the camera
PriorityQueue<float, StoreRenderState > m_alphaNodesQueue;
+ std::list< Light* > m_lights;
};
extern RenderGraph* CURRENTRENDERGRAPH;
Modified: Mercury2/src/Texture.cpp
===================================================================
--- Mercury2/src/Texture.cpp 2009-08-05 00:34:44 UTC (rev 452)
+++ Mercury2/src/Texture.cpp 2009-08-05 00:37:56 UTC (rev 453)
@@ -18,6 +18,8 @@
m_initTextureSuccess = true;
m_numActiveTextures = 0;
}
+
+ SetExcludeFromCull( true );
}
Texture::~Texture()
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|