|
From: <axl...@us...> - 2009-07-04 16:01:20
|
Revision: 406
http://hgengine.svn.sourceforge.net/hgengine/?rev=406&view=rev
Author: axlecrusher
Date: 2009-07-04 16:01:19 +0000 (Sat, 04 Jul 2009)
Log Message:
-----------
new culling
Modified Paths:
--------------
Mercury2/src/BoundingBox.cpp
Mercury2/src/BoundingBox.h
Mercury2/src/Mercury2.cpp
Mercury2/src/MercuryNode.cpp
Mercury2/src/MercuryVBO.cpp
Modified: Mercury2/src/BoundingBox.cpp
===================================================================
--- Mercury2/src/BoundingBox.cpp 2009-07-04 15:46:32 UTC (rev 405)
+++ Mercury2/src/BoundingBox.cpp 2009-07-04 16:01:19 UTC (rev 406)
@@ -35,27 +35,31 @@
void BoundingBox::ComputeNormals()
{
- MercuryVertex t(m_center);
+ //normals are probably just the cardinal axises
+/* MercuryVertex t(m_center, 0);
t.SetX( t.GetX() + m_extend.GetX() );
- m_normals[0] = (m_center - t).Normalize();
+ m_normals[0] = t;//.Normalize();
t = m_center;
t.SetY( t.GetY() + m_extend.GetY() );
- m_normals[1] = (m_center - t).Normalize();
+ m_normals[1] = t;//.Normalize();
t = m_center;
t.SetZ( t.GetZ() + m_extend.GetZ() );
- m_normals[2] = (m_center - t).Normalize();
+ m_normals[2] = t;//.Normalize();
+ */
}
void BoundingBox::Transform( const MercuryMatrix& m )
{
BoundingBox bb;
- bb.m_extend = m_center;
- bb.m_center = m * m_center;
- bb.m_normals[0] = (m * m_normals[0]).Normalize();
- bb.m_normals[1] = (m * m_normals[1]).Normalize();
- bb.m_normals[2] = (m * m_normals[2]).Normalize();
+ bb.m_extend = m_extend;
+ MercuryMatrix mm = m * FRUSTUM->GetMatrix();
+ bb.m_center = mm * MercuryVertex(m_center, 1);
+ bb.m_normals[0] = (mm * MercuryVector(1.0f,0,0,0)).Normalize();
+ bb.m_normals[1] = (mm * MercuryVector(0,1.0f,0,0)).Normalize();
+ bb.m_normals[2] = (mm * MercuryVector(0,0,1.0f,0)).Normalize();
+// bb.Render();
*this = bb;
}
@@ -84,7 +88,121 @@
return !inView;
}
+bool BoundingBox::FrustumCull() const
+{
+ static float b[3];
+ uint32_t samples;
+ const float* center = GetCenter();
+ const float* extend = GetExtend();
+
+ glPushAttrib( GL_CURRENT_BIT | GL_ENABLE_BIT );
+ glDisable(GL_CULL_FACE);
+ glFeedbackBuffer(3, GL_3D, b);
+ glRenderMode( GL_FEEDBACK );
+
+ glBegin(GL_QUADS);
+ //front
+ glVertex3f(center[0]-extend[0], center[1]+extend[1], center[2]+extend[2]);
+ glVertex3f(center[0]-extend[0], center[1]-extend[1], center[2]+extend[2]);
+ glVertex3f(center[0]+extend[0], center[1]-extend[1], center[2]+extend[2]);
+ glVertex3f(center[0]+extend[0], center[1]+extend[1], center[2]+extend[2]);
+
+ //back
+ glVertex3f(center[0]-extend[0], center[1]+extend[1], center[2]-extend[2]);
+ glVertex3f(center[0]-extend[0], center[1]-extend[1], center[2]-extend[2]);
+ glVertex3f(center[0]+extend[0], center[1]-extend[1], center[2]-extend[2]);
+ glVertex3f(center[0]+extend[0], center[1]+extend[1], center[2]-extend[2]);
+
+ //top
+ glVertex3f(center[0]-extend[0], center[1]+extend[1], center[2]+extend[2]);
+ glVertex3f(center[0]-extend[0], center[1]+extend[1], center[2]-extend[2]);
+ glVertex3f(center[0]+extend[0], center[1]+extend[1], center[2]-extend[2]);
+ glVertex3f(center[0]+extend[0], center[1]+extend[1], center[2]+extend[2]);
+
+ //bottom
+ glVertex3f(center[0]-extend[0], center[1]-extend[1], center[2]+extend[2]);
+ glVertex3f(center[0]-extend[0], center[1]-extend[1], center[2]-extend[2]);
+ glVertex3f(center[0]+extend[0], center[1]-extend[1], center[2]-extend[2]);
+ glVertex3f(center[0]+extend[0], center[1]-extend[1], center[2]+extend[2]);
+
+ //left
+ glVertex3f(center[0]-extend[0], center[1]+extend[1], center[2]-extend[2]);
+ glVertex3f(center[0]-extend[0], center[1]-extend[1], center[2]-extend[2]);
+ glVertex3f(center[0]-extend[0], center[1]-extend[1], center[2]+extend[2]);
+ glVertex3f(center[0]-extend[0], center[1]+extend[1], center[2]+extend[2]);
+
+ //right
+ glVertex3f(center[0]+extend[0], center[1]+extend[1], center[2]-extend[2]);
+ glVertex3f(center[0]+extend[0], center[1]-extend[1], center[2]-extend[2]);
+ glVertex3f(center[0]+extend[0], center[1]-extend[1], center[2]+extend[2]);
+ glVertex3f(center[0]+extend[0], center[1]+extend[1], center[2]+extend[2]);
+
+ glEnd();
+ samples = glRenderMode( GL_RENDER );
+ glPopAttrib( );
+ return samples==0;
+}
+
+bool BoundingBox::OcclusionCull() const
+{
+ static uint32_t q;
+ uint32_t samples;
+ const float* center = GetCenter();
+ const float* extend = GetExtend();
+
+ glPushAttrib( GL_CURRENT_BIT | GL_ENABLE_BIT );
+ glDisable(GL_CULL_FACE);
+ glGenQueriesARB(1, &q);
+ glBeginQueryARB(GL_SAMPLES_PASSED_ARB, q);
+
+ glBegin(GL_QUADS);
+
+ //front
+ glVertex3f(center[0]-extend[0], center[1]+extend[1], center[2]+extend[2]);
+ glVertex3f(center[0]-extend[0], center[1]-extend[1], center[2]+extend[2]);
+ glVertex3f(center[0]+extend[0], center[1]-extend[1], center[2]+extend[2]);
+ glVertex3f(center[0]+extend[0], center[1]+extend[1], center[2]+extend[2]);
+
+ //back
+ glVertex3f(center[0]-extend[0], center[1]+extend[1], center[2]-extend[2]);
+ glVertex3f(center[0]-extend[0], center[1]-extend[1], center[2]-extend[2]);
+ glVertex3f(center[0]+extend[0], center[1]-extend[1], center[2]-extend[2]);
+ glVertex3f(center[0]+extend[0], center[1]+extend[1], center[2]-extend[2]);
+
+ //top
+ glVertex3f(center[0]-extend[0], center[1]+extend[1], center[2]+extend[2]);
+ glVertex3f(center[0]-extend[0], center[1]+extend[1], center[2]-extend[2]);
+ glVertex3f(center[0]+extend[0], center[1]+extend[1], center[2]-extend[2]);
+ glVertex3f(center[0]+extend[0], center[1]+extend[1], center[2]+extend[2]);
+
+ //bottom
+ glVertex3f(center[0]-extend[0], center[1]-extend[1], center[2]+extend[2]);
+ glVertex3f(center[0]-extend[0], center[1]-extend[1], center[2]-extend[2]);
+ glVertex3f(center[0]+extend[0], center[1]-extend[1], center[2]-extend[2]);
+ glVertex3f(center[0]+extend[0], center[1]-extend[1], center[2]+extend[2]);
+
+ //left
+ glVertex3f(center[0]-extend[0], center[1]+extend[1], center[2]-extend[2]);
+ glVertex3f(center[0]-extend[0], center[1]-extend[1], center[2]-extend[2]);
+ glVertex3f(center[0]-extend[0], center[1]-extend[1], center[2]+extend[2]);
+ glVertex3f(center[0]-extend[0], center[1]+extend[1], center[2]+extend[2]);
+
+ //right
+ glVertex3f(center[0]+extend[0], center[1]+extend[1], center[2]-extend[2]);
+ glVertex3f(center[0]+extend[0], center[1]-extend[1], center[2]-extend[2]);
+ glVertex3f(center[0]+extend[0], center[1]-extend[1], center[2]+extend[2]);
+ glVertex3f(center[0]+extend[0], center[1]+extend[1], center[2]+extend[2]);
+
+ glEnd();
+ glEndQueryARB(GL_SAMPLES_PASSED_ARB);
+ glGetQueryObjectuivARB(q, GL_QUERY_RESULT_ARB, &samples);
+
+ glPopAttrib( );
+
+ return samples==0;
+}
+
void BoundingBox::Render()
{
// BoundingBox gbb = *this;
@@ -95,6 +213,8 @@
const float* center = GetCenter();
const float* extend = GetExtend();
+// glPushMatrix();
+// glLoadIdentity();
glPushAttrib( GL_CURRENT_BIT );
glBegin(GL_LINES);
glColor3f(0,1.0f,0);
@@ -133,12 +253,34 @@
glEnd();
+ //center
glPointSize(4);
glBegin(GL_POINTS);
glVertex3f(center[0], center[1], center[2]);
glEnd();
+ //normals
+ MercuryVertex c;
+ glBegin(GL_LINES);
+ glColor3f(1.0f,0,0);
+ glVertex3f(center[0], center[1], center[2]);
+ c = center;
+ c += m_normals[0];
+ glVertex3f(c.GetX(), c.GetY(), c.GetZ());
+ glColor3f(0,1.0f,0);
+ glVertex3f(center[0], center[1], center[2]);
+ c = center;
+ c += m_normals[1];
+ glVertex3f(c.GetX(), c.GetY(), c.GetZ());
+ glColor3f(0,0,1.0f);
+ glVertex3f(center[0], center[1], center[2]);
+ c = center;
+ c += m_normals[2];
+ glVertex3f(c.GetX(), c.GetY(), c.GetZ());
+ glEnd();
+
glPopAttrib( );
+// glPopMatrix();
}
/****************************************************************************
Modified: Mercury2/src/BoundingBox.h
===================================================================
--- Mercury2/src/BoundingBox.h 2009-07-04 15:46:32 UTC (rev 405)
+++ Mercury2/src/BoundingBox.h 2009-07-04 16:01:19 UTC (rev 406)
@@ -20,6 +20,9 @@
virtual bool Clip( const MercuryPlane& p ) = 0;
virtual bool Clip( const Frustum& f ) = 0;
+
+ virtual bool FrustumCull() const = 0;
+ virtual bool OcclusionCull() const = 0;
};
class BoundingBox : public BoundingVolume
@@ -45,6 +48,9 @@
virtual bool Clip( const MercuryPlane& p );
virtual bool Clip( const Frustum& f );
+ virtual bool FrustumCull() const;
+ virtual bool OcclusionCull() const;
+
private:
void ComputeNormals();
Modified: Mercury2/src/Mercury2.cpp
===================================================================
--- Mercury2/src/Mercury2.cpp 2009-07-04 15:46:32 UTC (rev 405)
+++ Mercury2/src/Mercury2.cpp 2009-07-04 16:01:19 UTC (rev 406)
@@ -19,6 +19,7 @@
#include <ModuleManager.h>
#include <MercuryFile.h>
bool SHOWBOUNDINGVOLUME = false;
+bool SHOWAXISES = false;
MSemaphore UpdateLoopGo;
void* UpdateThread(void* node)
Modified: Mercury2/src/MercuryNode.cpp
===================================================================
--- Mercury2/src/MercuryNode.cpp 2009-07-04 15:46:32 UTC (rev 405)
+++ Mercury2/src/MercuryNode.cpp 2009-07-04 16:01:19 UTC (rev 406)
@@ -137,12 +137,13 @@
MercuryMatrix matrix = FindGlobalMatrix();
PreRender( matrix ); //calls on children assets
+
modelView = ManipulateMatrix( matrix );
- if ( IsHidden() || IsCulled(modelView) ) return;
- modelView.Transpose();
+// if ( IsHidden() || IsCulled(modelView) ) return;
+ if ( IsHidden() ) return;
+
+ glLoadMatrix( modelView );
- glLoadMatrixf( modelView.Ptr() );
-
sa.type = ShaderAttribute::TYPE_MATRIX;
sa.value.matrix = matrix.Ptr();
Shader::SetAttribute("HG_ModelMatrix", sa);
@@ -158,7 +159,7 @@
child->RecursiveRender();
}
- glLoadMatrixf( modelView.Ptr() );
+ glLoadMatrix( modelView );
Shader::SetAttribute("HG_ModelMatrix", sa);
PostRender( modelView ); //calls on children assets
}
@@ -217,9 +218,15 @@
void MercuryNode::Render(const MercuryMatrix& matrix)
{
+ bool cull;
list< MercuryAsset* >::iterator i;
for (i = m_render.begin(); i != m_render.end(); ++i )
- (*i)->Render(this);
+ {
+ cull = false;
+ const BoundingVolume* bv = (*i)->GetBoundingVolume();
+ if (bv) cull = bv->FrustumCull();
+ if ( !cull ) (*i)->Render(this);
+ }
}
void MercuryNode::PostRender(const MercuryMatrix& matrix)
@@ -283,22 +290,14 @@
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;
+ clip = (*i)->IsCulled( matrix );
+ if ( clip == false ) return false;
}
+ */
return clip;
}
Modified: Mercury2/src/MercuryVBO.cpp
===================================================================
--- Mercury2/src/MercuryVBO.cpp 2009-07-04 15:46:32 UTC (rev 405)
+++ Mercury2/src/MercuryVBO.cpp 2009-07-04 16:01:19 UTC (rev 406)
@@ -8,6 +8,7 @@
#define BUFFER_OFFSET(i) ((char*)NULL + (i))
extern bool SHOWBOUNDINGVOLUME;
+extern bool SHOWAXISES;
MercuryVBO::MercuryVBO()
:MercuryAsset(), m_initiated(false)
@@ -60,7 +61,7 @@
m_lastVBOrendered = this;
if (m_boundingVolume && SHOWBOUNDINGVOLUME) m_boundingVolume->Render();
- DrawAxes();
+ if ( SHOWAXISES ) DrawAxes();
}
void MercuryVBO::InitVBO()
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|