The-Simpsons-Hit-and-Run/game/code/render/Culling/Bounds.h

171 lines
2.9 KiB
C++

#ifndef __BOUNDS_H__
#define __BOUNDS_H__
#include <render/culling/Vector3f.h>
#include <render/culling/Vector3i.h>
class Bounds3f
{
public:
Bounds3f(){}
~Bounds3f(){}
void Accumulate( float iX, float iY, float iZ )
{
if( iX < mMin[0])
{
mMin[0] = iX;
}
else
{
if( iX > mMax[0])
{
mMax[0] = iX;
}
}
if( iY < mMin[1])
{
mMin[1] = iY;
}
else
{
if( iY > mMax[1])
{
mMax[1] = iY;
}
}
if( iZ < mMin[2])
{
mMin[2] = iZ;
}
else
{
if( iZ > mMax[2])
{
mMax[2] = iZ;
}
}
}
void Accumulate( float* ipPoint )
{
for( int i=0; i<3; i++ )
{
if( ipPoint[i] < mMin[i])
{
mMin[i] = ipPoint[i];
}
else
{
if( ipPoint[i] > mMax[i])
{
mMax[i] = ipPoint[i];
}
}
}
}
void Accumulate( Vector3f& irPoint )
{
for( int i=0; i<3; i++ )
{
if( irPoint[i] < mMin[i])
{
mMin[i] = irPoint[i];
}
else
{
if( irPoint[i] > mMax[i])
{
mMax[i] = irPoint[i];
}
}
}
}
//////////////////////////////////////////////////////////////////////////
// Taken & Tailored
// from http://www.gamasutra.com/features/19991018/Gomez_4.htm
//////////////////////////////////////////////////////////////////////////
bool IntersectsSphere( Vector3f& irCenter, float iRadius )
{
float s, d = 0;
//find the square of the distance
//from the sphere to the box
for( int i=0 ; i<3 ; i++ )
{
if( irCenter[i] < mMin[i] )
{
s = irCenter[i] - mMin[i];
d += s*s;
}
else if( irCenter[i] > mMax[i] )
{
s = irCenter[i] - mMax[i];
d += s*s;
}
}
return d <= iRadius*iRadius;
}
Vector3f mMin, mMax;
};
class MinBound : public Vector3f
{
public:
MinBound(){}
~MinBound(){}
void Accumulate( Vector3f& irPoint )
{
if( irPoint.x < x)
{
x = irPoint.x;
}
if( irPoint.y < y)
{
y = irPoint.y;
}
if( irPoint.z < z)
{
z = irPoint.z;
}
}
};
class Bounds3i
{
public:
Bounds3i(){}
~Bounds3i(){}
void Accumulate( Vector3i& irPoint )
{
for( int i=0; i<3; i++ )
{
if( irPoint[i] < mMin[i])
{
mMin[i] = irPoint[i];
}
else
{
if( irPoint[i] > mMax[i])
{
mMax[i] = irPoint[i];
}
}
}
}
Vector3i mMin, mMax;
};
#endif