212 lines
5.8 KiB
C++
212 lines
5.8 KiB
C++
//====== Copyright © 1996-2004, Valve Corporation, All rights reserved. =====//
|
|
//
|
|
// Dme version of an axis aligned bounding box
|
|
//
|
|
//===========================================================================//
|
|
|
|
|
|
// Valve includes
|
|
#include "datamodel/dmelementfactoryhelper.h"
|
|
#include "mdlobjects/dmebbox.h"
|
|
#include "mathlib/mathlib.h"
|
|
#include "tier2/renderutils.h"
|
|
|
|
|
|
// memdbgon must be the last include file in a .cpp file!!!
|
|
#include "tier0/memdbgon.h"
|
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// Expose this class to the scene database
|
|
//-----------------------------------------------------------------------------
|
|
IMPLEMENT_ELEMENT_FACTORY( DmeBBox, CDmeBBox );
|
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// Purpose:
|
|
//-----------------------------------------------------------------------------
|
|
void CDmeBBox::OnConstruction()
|
|
{
|
|
Vector vMin;
|
|
Vector vMax;
|
|
|
|
ClearBounds( vMin, vMax );
|
|
|
|
m_vMinBounds.InitAndSet( this, "minBounds", vMin );
|
|
m_vMaxBounds.InitAndSet( this, "maxBounds", vMax );
|
|
}
|
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
//
|
|
//-----------------------------------------------------------------------------
|
|
void CDmeBBox::OnDestruction()
|
|
{
|
|
}
|
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
//
|
|
//-----------------------------------------------------------------------------
|
|
void CDmeBBox::Clear()
|
|
{
|
|
Vector vMin;
|
|
Vector vMax;
|
|
|
|
ClearBounds( vMin, vMax );
|
|
|
|
m_vMinBounds = vMin;
|
|
m_vMaxBounds = vMax;
|
|
}
|
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
//
|
|
//-----------------------------------------------------------------------------
|
|
bool CDmeBBox::Empty() const
|
|
{
|
|
const Vector &vMin = m_vMinBounds.Get();
|
|
const Vector &vMax = m_vMaxBounds.Get();
|
|
|
|
return vMin.x > vMax.x || vMin.y > vMax.y || vMin.z > vMax.z;
|
|
}
|
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
//
|
|
//-----------------------------------------------------------------------------
|
|
void CDmeBBox::TransformUsing( const matrix3x4_t &mMatrix )
|
|
{
|
|
Vector vMin;
|
|
Vector vMax;
|
|
|
|
TransformAABB( mMatrix, m_vMinBounds, m_vMaxBounds, vMin, vMax );
|
|
|
|
m_vMinBounds = vMin;
|
|
m_vMaxBounds = vMax;
|
|
}
|
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
//
|
|
//-----------------------------------------------------------------------------
|
|
void CDmeBBox::Expand( const Vector &vPoint )
|
|
{
|
|
Vector vMin = m_vMinBounds;
|
|
Vector vMax = m_vMaxBounds;
|
|
|
|
AddPointToBounds( vPoint, vMin, vMax );
|
|
|
|
m_vMinBounds = vMin;
|
|
m_vMaxBounds = vMax;
|
|
}
|
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
//
|
|
//-----------------------------------------------------------------------------
|
|
void CDmeBBox::Expand( const CDmeBBox &bbox )
|
|
{
|
|
Expand( bbox.m_vMinBounds );
|
|
Expand( bbox.m_vMaxBounds );
|
|
}
|
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
//
|
|
//-----------------------------------------------------------------------------
|
|
bool CDmeBBox::Contains( const Vector &vPoint ) const
|
|
{
|
|
const Vector &vMin = m_vMinBounds.Get();
|
|
const Vector &vMax = m_vMaxBounds.Get();
|
|
|
|
return
|
|
vPoint.x >= vMin.x && vPoint.x <= vMax.x &&
|
|
vPoint.y >= vMin.y && vPoint.y <= vMax.y &&
|
|
vPoint.z >= vMin.z && vPoint.z <= vMax.z;
|
|
}
|
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
//
|
|
//-----------------------------------------------------------------------------
|
|
bool CDmeBBox::Intersects( const CDmeBBox &bbox ) const
|
|
{
|
|
return QuickBoxIntersectTest( m_vMinBounds, m_vMaxBounds, bbox.m_vMinBounds, bbox.m_vMaxBounds );
|
|
}
|
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
//
|
|
//-----------------------------------------------------------------------------
|
|
float CDmeBBox::Width() const
|
|
{
|
|
const float flWidth = m_vMaxBounds.Get().x - m_vMinBounds.Get().x;
|
|
return flWidth > 0.0f ? flWidth : 0.0f;
|
|
}
|
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
//
|
|
//-----------------------------------------------------------------------------
|
|
float CDmeBBox::Height() const
|
|
{
|
|
const float flHeight = m_vMaxBounds.Get().y - m_vMinBounds.Get().y;
|
|
return flHeight > 0.0f ? flHeight : 0.0f;
|
|
}
|
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
//
|
|
//-----------------------------------------------------------------------------
|
|
float CDmeBBox::Depth() const
|
|
{
|
|
const float flDepth = m_vMaxBounds.Get().z - m_vMinBounds.Get().z;
|
|
return flDepth > 0.0f ? flDepth : 0.0f;
|
|
}
|
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
//
|
|
//-----------------------------------------------------------------------------
|
|
Vector CDmeBBox::Center() const
|
|
{
|
|
const Vector &vMin = m_vMinBounds.Get();
|
|
const Vector &vMax = m_vMaxBounds.Get();
|
|
|
|
return Vector(
|
|
( vMax.x + vMin.x ) / 2.0f,
|
|
( vMax.y + vMin.y ) / 2.0f,
|
|
( vMax.z + vMin.z ) / 2.0f );
|
|
}
|
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
//
|
|
//-----------------------------------------------------------------------------
|
|
const Vector &CDmeBBox::Min() const
|
|
{
|
|
return m_vMinBounds.Get();
|
|
}
|
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
//
|
|
//-----------------------------------------------------------------------------
|
|
const Vector &CDmeBBox::Max() const
|
|
{
|
|
return m_vMaxBounds.Get();
|
|
}
|
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
//
|
|
//-----------------------------------------------------------------------------
|
|
void CDmeBBox::Draw( const matrix3x4_t &shapeToWorld, CDmeDrawSettings *pDrawSettings /*= NULL */ )
|
|
{
|
|
static const Color cRenderColor( 0, 192, 0 );
|
|
Vector vOrigin;
|
|
QAngle angles;
|
|
MatrixAngles( shapeToWorld, angles, vOrigin );
|
|
RenderBox( vOrigin, angles, m_vMinBounds, m_vMaxBounds, cRenderColor, true );
|
|
} |