#include "aabb.h"
#include "math_internal.h"
#include "box3d/math_functions.h"
#include <float.h>
bool b3RayCastAABB( b3AABB a, b3Vec3 p1, b3Vec3 p2, float* minFraction, float* maxFraction )
{
b3Vec3 d = b3Sub( p2, p1 );
float rayLength = b3Length( d );
if ( rayLength < FLT_EPSILON )
{
if ( p1.x >= a.lowerBound.x && p1.x <= a.upperBound.x && p1.y >= a.lowerBound.y && p1.y <= a.upperBound.y &&
p1.z >= a.lowerBound.z && p1.z <= a.upperBound.z )
{
*minFraction = 0.0f;
*maxFraction = 0.0f;
return true;
}
return false;
}
b3Vec3 rayDir = b3MulSV( 1.0f / rayLength, d );
float tMin = 0.0f;
float tMax = rayLength;
{
float rayComponent = rayDir.x;
float rayStart = p1.x;
float boxMin = a.lowerBound.x;
float boxMax = a.upperBound.x;
if ( b3AbsFloat( rayComponent ) < FLT_EPSILON )
{
if ( rayStart < boxMin || rayStart > boxMax )
{
return false;
}
}
else
{
float t1 = ( boxMin - rayStart ) / rayComponent;
float t2 = ( boxMax - rayStart ) / rayComponent;
if ( t1 > t2 )
{
float temp = t1;
t1 = t2;
t2 = temp;
}
tMin = b3MaxFloat( tMin, t1 );
tMax = b3MinFloat( tMax, t2 );
if ( tMin > tMax )
{
return false;
}
}
}
{
float rayComponent = rayDir.y;
float rayStart = p1.y;
float boxMin = a.lowerBound.y;
float boxMax = a.upperBound.y;
if ( b3AbsFloat( rayComponent ) < FLT_EPSILON )
{
if ( rayStart < boxMin || rayStart > boxMax )
{
return false;
}
}
else
{
float t1 = ( boxMin - rayStart ) / rayComponent;
float t2 = ( boxMax - rayStart ) / rayComponent;
if ( t1 > t2 )
{
float temp = t1;
t1 = t2;
t2 = temp;
}
tMin = b3MaxFloat( tMin, t1 );
tMax = b3MinFloat( tMax, t2 );
if ( tMin > tMax )
{
return false;
}
}
}
{
float rayComponent = rayDir.z;
float rayStart = p1.z;
float boxMin = a.lowerBound.z;
float boxMax = a.upperBound.z;
if ( b3AbsFloat( rayComponent ) < FLT_EPSILON )
{
if ( rayStart < boxMin || rayStart > boxMax )
{
return false;
}
}
else
{
float t1 = ( boxMin - rayStart ) / rayComponent;
float t2 = ( boxMax - rayStart ) / rayComponent;
if ( t1 > t2 )
{
float temp = t1;
t1 = t2;
t2 = temp;
}
tMin = b3MaxFloat( tMin, t1 );
tMax = b3MinFloat( tMax, t2 );
if ( tMin > tMax )
{
return false;
}
}
}
if ( tMax < 0.0f )
{
return false;
}
*minFraction = b3ClampFloat( tMin / rayLength, 0.0f, 1.0f );
*maxFraction = b3ClampFloat( tMax / rayLength, 0.0f, 1.0f );
return true;
}