|
From: <axl...@us...> - 2009-07-05 13:09:49
|
Revision: 407
http://hgengine.svn.sourceforge.net/hgengine/?rev=407&view=rev
Author: axlecrusher
Date: 2009-07-05 12:55:17 +0000 (Sun, 05 Jul 2009)
Log Message:
-----------
updates
Modified Paths:
--------------
Mercury2/src/BoundingBox.cpp
Mercury2/src/BoundingBox.h
Modified: Mercury2/src/BoundingBox.cpp
===================================================================
--- Mercury2/src/BoundingBox.cpp 2009-07-04 16:01:19 UTC (rev 406)
+++ Mercury2/src/BoundingBox.cpp 2009-07-05 12:55:17 UTC (rev 407)
@@ -2,21 +2,32 @@
#include <BoundingBox.h>
#include <string.h>
#include <Viewport.h>
+#include <Texture.h>
#define SIGNED_DIST(x) m_normal.DotProduct(x)
// origional algorithim was -x<0
#define BEHIND_PLANE(x) x>=0
+bool BoundingVolume::IsOccluded()
+{
+ uint32_t samples = 1;
+ if (m_occlusionQuery != 0)
+ glGetQueryObjectuivARB(m_occlusionQuery, GL_QUERY_RESULT_ARB, &samples);
+ return samples==0;
+}
+
BoundingBox::BoundingBox(const MercuryVertex& center, const MercuryVertex& extend)
:m_center(center), m_extend(extend)
{
+ PopulateVertices();
ComputeNormals();
-};
+}
BoundingBox::BoundingBox(const BoundingBox& bb)
:m_center(bb.m_center), m_extend(bb.m_extend)
{
+ PopulateVertices();
for (uint8_t i = 0; i < 3; ++i)
m_normals[i] = bb.m_normals[i];
}
@@ -94,113 +105,96 @@
uint32_t samples;
const float* center = GetCenter();
const float* extend = GetExtend();
-
+
glPushAttrib( GL_CURRENT_BIT | GL_ENABLE_BIT );
glDisable(GL_CULL_FACE);
+
+ glPushMatrix();
+ glTranslatef(center[0], center[1], center[2]);
+ glScalef(extend[0],extend[1],extend[2]);
+
+ uint8_t tCount = Texture::NumberActiveTextures();
+ for (uint8_t i = 0; i < tCount; ++i)
+ {
+ glActiveTexture( GL_TEXTURE0+i );
+ glClientActiveTextureARB( GL_TEXTURE0+i );
+ glDisableClientState(GL_TEXTURE_COORD_ARRAY);
+ glDisable( GL_TEXTURE_2D );
+ }
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]);
+ InitVBO();
- //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]);
+ glBindBufferARB(GL_ARRAY_BUFFER_ARB, m_vboID);
+ glBindBufferARB(GL_ELEMENT_ARRAY_BUFFER_ARB, 0);
+ glVertexPointer(3, GL_FLOAT, 0, 0);
+ glDrawArrays(GL_QUADS, 0, 24);
+
+ for (uint8_t i = 0; i < tCount; ++i)
+ {
+ glActiveTexture( GL_TEXTURE0+i );
+ glClientActiveTextureARB(GL_TEXTURE0+i);
+ glEnableClientState(GL_TEXTURE_COORD_ARRAY);
+ glEnable( GL_TEXTURE_2D );
+ }
- glEnd();
samples = glRenderMode( GL_RENDER );
+ glPopMatrix();
glPopAttrib( );
+
+// return false;
return samples==0;
}
-bool BoundingBox::OcclusionCull() const
+void BoundingBox::DoOcclusionTest()
{
- static uint32_t q;
- uint32_t samples;
const float* center = GetCenter();
const float* extend = GetExtend();
-
- glPushAttrib( GL_CURRENT_BIT | GL_ENABLE_BIT );
+
+ glPushAttrib( GL_CURRENT_BIT | GL_ENABLE_BIT | GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT);
glDisable(GL_CULL_FACE);
- glGenQueriesARB(1, &q);
- glBeginQueryARB(GL_SAMPLES_PASSED_ARB, q);
- glBegin(GL_QUADS);
+ glPushMatrix();
+ glTranslatef(center[0], center[1], center[2]);
+ glScalef(extend[0],extend[1],extend[2]);
+/*
+ uint8_t tCount = Texture::NumberActiveTextures();
+ for (uint8_t i = 0; i < tCount; ++i)
+ {
+ glActiveTexture( GL_TEXTURE0+i );
+ glClientActiveTextureARB( GL_TEXTURE0+i );
+ glDisableClientState(GL_TEXTURE_COORD_ARRAY);
+ glDisable( GL_TEXTURE_2D );
+ }
+*/
+ InitVBO();
+
+ glBindBufferARB(GL_ARRAY_BUFFER_ARB, m_vboID);
+ glBindBufferARB(GL_ELEMENT_ARRAY_BUFFER_ARB, 0);
+ glVertexPointer(3, GL_FLOAT, 0, 0);
+
+ if (m_occlusionQuery == 0) glGenQueriesARB(1, &m_occlusionQuery);
+ glBeginQueryARB(GL_SAMPLES_PASSED_ARB, m_occlusionQuery);
- //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]);
+ glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE);
+ glDepthMask(GL_FALSE);
- //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();
+ glDrawArrays(GL_QUADS, 0, 24);
+/*
+ for (uint8_t i = 0; i < tCount; ++i)
+ {
+ glActiveTexture( GL_TEXTURE0+i );
+ glClientActiveTextureARB(GL_TEXTURE0+i);
+ glEnableClientState(GL_TEXTURE_COORD_ARRAY);
+ glEnable( GL_TEXTURE_2D );
+ }
+*/
glEndQueryARB(GL_SAMPLES_PASSED_ARB);
- glGetQueryObjectuivARB(q, GL_QUERY_RESULT_ARB, &samples);
+// glGetQueryObjectuivARB(q, GL_QUERY_RESULT_ARB, &samples);
glPopAttrib( );
-
- return samples==0;
+ glPopMatrix();
}
void BoundingBox::Render()
@@ -283,6 +277,64 @@
// glPopMatrix();
}
+void BoundingBox::PopulateVertices()
+{
+ if (m_vertexData.Length() == 72) return;
+ m_vertexData.Allocate( 72 );
+
+ 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;
+
+ //front
+ 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;
+
+ //left
+ 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;
+
+ //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;
+
+ //top
+ 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;
+
+ //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;
+}
+
+void BoundingBox::InitVBO()
+{
+ if (m_vboID != 0) return;
+
+ glGenBuffersARB(1, &m_vboID);
+
+ //vertex VBO
+ glBindBufferARB(GL_ARRAY_BUFFER_ARB, m_vboID);
+ glBufferDataARB(GL_ARRAY_BUFFER_ARB, m_vertexData.LengthInBytes(), m_vertexData.Buffer(), GL_STATIC_DRAW_ARB);
+}
+
+AlignedBuffer<float> BoundingBox::m_vertexData;
+uint32_t BoundingBox::m_vboID = 0;
+
/****************************************************************************
* Copyright (C) 2008 by Joshua Allen *
* *
Modified: Mercury2/src/BoundingBox.h
===================================================================
--- Mercury2/src/BoundingBox.h 2009-07-04 16:01:19 UTC (rev 406)
+++ Mercury2/src/BoundingBox.h 2009-07-05 12:55:17 UTC (rev 407)
@@ -8,9 +8,15 @@
#include <Mint.h>
#include <MercuryPlane.h>
+#include <AlignedBuffer.h>
+
class BoundingVolume
{
public:
+ BoundingVolume()
+ :m_occlusionQuery(0)
+ {}
+
virtual ~BoundingVolume() {};
virtual void LoadFromBinary(char* data) = 0;
@@ -22,14 +28,25 @@
virtual bool Clip( const Frustum& f ) = 0;
virtual bool FrustumCull() const = 0;
- virtual bool OcclusionCull() const = 0;
+// virtual bool OcclusionCull() const = 0;
+ bool IsOccluded();
+ virtual void DoOcclusionTest() = 0;
+
+ protected:
+ uint32_t m_occlusionQuery;
};
class BoundingBox : public BoundingVolume
{
public:
- BoundingBox() {};
+ BoundingBox()
+ :BoundingVolume()
+ {
+ PopulateVertices();
+ }
+
BoundingBox(const MercuryVertex& center, const MercuryVertex& extend);
+
BoundingBox(const BoundingBox& bb);
virtual ~BoundingBox() {};
@@ -49,15 +66,21 @@
virtual bool Clip( const Frustum& f );
virtual bool FrustumCull() const;
- virtual bool OcclusionCull() const;
+// virtual bool OcclusionCull() const;
+ virtual void DoOcclusionTest();
private:
void ComputeNormals();
-
+ static void PopulateVertices();
+ static void InitVBO();
+
MercuryVertex m_center;
MercuryVertex m_extend;
MercuryVector m_normals[3];
+
+ static AlignedBuffer<float> m_vertexData;
+ static uint32_t m_vboID;
};
#endif
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|