|
From: <axl...@us...> - 2009-03-03 21:44:11
|
Revision: 174
http://hgengine.svn.sourceforge.net/hgengine/?rev=174&view=rev
Author: axlecrusher
Date: 2009-03-03 21:44:02 +0000 (Tue, 03 Mar 2009)
Log Message:
-----------
compute box normals
Modified Paths:
--------------
Mercury2/src/BoundingBox.cpp
Mercury2/src/BoundingBox.h
Modified: Mercury2/src/BoundingBox.cpp
===================================================================
--- Mercury2/src/BoundingBox.cpp 2009-03-03 21:41:55 UTC (rev 173)
+++ Mercury2/src/BoundingBox.cpp 2009-03-03 21:44:02 UTC (rev 174)
@@ -4,12 +4,45 @@
#include <Viewport.h>
+BoundingBox::BoundingBox(const MercuryVertex& center, const MercuryVertex& extend)
+ :m_center(center), m_extend(extend)
+{
+ ComputeNormals();
+};
+
void BoundingBox::LoadFromBinary(char* data)
{
memcpy(m_center, data, sizeof(float)*3);
memcpy(m_extend, data+(sizeof(float)*3), sizeof(float)*3);
+ ComputeNormals();
}
+void BoundingBox::ComputeNormals()
+{
+ MercuryVertex t(m_center);
+ t.SetX( t.GetX() + m_extend.GetX() );
+ m_normals[0] = (m_center - t).Normalize();
+
+ t = m_center;
+ t.SetY( t.GetY() + m_extend.GetY() );
+ m_normals[1] = (m_center - t).Normalize();
+
+ t = m_center;
+ t.SetZ( t.GetZ() + m_extend.GetZ() );
+ m_normals[2] = (m_center - t).Normalize();
+}
+
+BoundingBox BoundingBox::Transform( const MercuryMatrix& m ) const
+{
+ 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();
+ return bb;
+}
+
RenderableBoundingBox::RenderableBoundingBox(const BoundingBox* bb)
:MercuryAsset(), m_bb(bb)
{
@@ -19,11 +52,11 @@
{
const BoundingBox& bb = *m_bb;
- MercuryVertex c = GetGlobalMatrix() * m_bb->GetCenter();
- BoundingBox gbb( c, bb.GetExtend() );
- c.Print();
-// printf("clip %d\n", FRUSTUM->Clip(gbb) );
+ BoundingBox gbb = m_bb->Transform( GetGlobalMatrix() );
+ FRUSTUM->m_planes[PFAR].IsBehindPlane( gbb.GetCenter() );
+// printf("clip %d\n", FRUSTUM->m_planes[PFAR].IsBehindPlane( gbb.GetCenter() ));
+
const float* center = m_bb->GetCenter();
const float* extend = m_bb->GetExtend();
Modified: Mercury2/src/BoundingBox.h
===================================================================
--- Mercury2/src/BoundingBox.h 2009-03-03 21:41:55 UTC (rev 173)
+++ Mercury2/src/BoundingBox.h 2009-03-03 21:44:02 UTC (rev 174)
@@ -3,23 +3,29 @@
#include <MercuryAsset.h>
#include <MercuryVertex.h>
+#include <MercuryMatrix.h>
class BoundingBox
{
public:
BoundingBox() {};
- BoundingBox(const MercuryVertex& center, const MercuryVertex& extend)
- :m_center(center), m_extend(extend)
- {};
+ BoundingBox(const MercuryVertex& center, const MercuryVertex& extend);
void LoadFromBinary(char* data);
inline const MercuryVertex& GetCenter() const { return m_center; }
inline const MercuryVertex& GetExtend() const { return m_extend; }
+ BoundingBox Transform( const MercuryMatrix& m ) const;
+ const MercuryVector& Normal(uint8_t i) const { return m_normals[i]; }
+
private:
+ void ComputeNormals();
+
MercuryVertex m_center;
MercuryVertex m_extend;
+
+ MercuryVector m_normals[3];
};
class RenderableBoundingBox : public MercuryAsset
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|