restore a function

This commit is contained in:
Irlan 2018-10-06 00:26:53 -03:00
parent 6b95a04a09
commit 41e036f268
3 changed files with 62 additions and 32 deletions

View File

@ -146,40 +146,70 @@ struct b3AABB3
}
// Test if a ray intersects this AABB.
// Output the minimum and maximum intersection fractions to derive the minimum and maximum intersection points.
bool TestRay(const b3Vec3& p1, const b3Vec3& p2, float32& min_t, float32& max_t) const
bool TestRay(float32& minFraction, const b3Vec3& p1, const b3Vec3& p2, float32 maxFraction) const
{
b3Vec3 d = p2 - p1;
float32 t = d.Normalize();
B3_ASSERT(t > B3_EPSILON);
b3Vec3 inv_d;
inv_d.x = 1.0f / d.x;
inv_d.y = 1.0f / d.y;
inv_d.z = 1.0f / d.z;
b3Vec3 t1;
t1.x = (m_lower.x - p1.x) * inv_d.x;
t1.y = (m_lower.y - p1.y) * inv_d.y;
t1.z = (m_lower.z - p1.z) * inv_d.z;
b3Vec3 t2;
t2.x = (m_upper.x - p1.x) * inv_d.x;
t2.y = (m_upper.y - p1.y) * inv_d.y;
t2.z = (m_upper.z - p1.z) * inv_d.z;
float32 lower = 0.0f;
float32 upper = maxFraction;
for (u32 i = 0; i < 3; ++i)
{
min_t = b3Max(min_t, b3Min(t1[i], t2[i]));
max_t = b3Min(max_t, b3Max(t1[i], t2[i]));
float32 numerators[2], denominators[2];
numerators[0] = p1[i] - m_lower[i];
numerators[1] = m_upper[i] - p1[i];
denominators[0] = -d[i];
denominators[1] = d[i];
for (u32 j = 0; j < 2; ++j)
{
float32 numerator = numerators[j];
float32 denominator = denominators[j];
if (denominator == 0.0f)
{
// s is parallel to this half-space.
if (numerator < 0.0f)
{
// s is outside of this half-space.
// dot(n, p1) and dot(n, p2) < 0.
return false;
}
}
else
{
if (denominator < 0.0f)
{
// s enters this half-space.
if (numerator < lower * denominator)
{
// Increase lower.
lower = numerator / denominator;
}
}
else
{
// s exits the half-space.
if (numerator < upper * denominator)
{
// Decrease upper.
upper = numerator / denominator;
}
}
// Exit if intersection becomes empty.
if (upper < lower)
{
return false;
}
}
}
}
if (min_t >= 0.0f && min_t >= max_t && max_t <= t)
{
return true;
}
return false;
B3_ASSERT(lower >= 0.0f && lower <= maxFraction);
minFraction = lower;
return true;
}
};

View File

@ -211,8 +211,8 @@ inline void b3DynamicTree::RayCast(T* callback, const b3RayCastInput& input) con
const b3Node* node = m_nodes + nodeIndex;
float32 minFraction = 0.0f;
if (node->aabb.TestRay(p1, p2, maxFraction, minFraction) == true)
float32 minFraction;
if (node->aabb.TestRay(minFraction, p1, p2, maxFraction) == true)
{
if (node->IsLeaf() == true)
{

View File

@ -174,8 +174,8 @@ inline void b3StaticTree::RayCast(T* callback, const b3RayCastInput& input) cons
const b3Node* node = m_nodes + nodeIndex;
float32 minFraction = 0.0f;
if (node->aabb.TestRay(p1, p2, maxFraction, minFraction) == true)
float32 minFraction;
if (node->aabb.TestRay(minFraction, p1, p2, maxFraction) == true)
{
if (node->IsLeaf() == true)
{