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. |