csgo-2018-source/mdlobjects/dmebbox.cpp
2021-07-24 21:11:47 -07:00

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 );
}