Jefff
public text v1 · immutable public int RayIntersect(Vector3 ro, Vector3 rd, out float tnear, out float tfar)
{
float t1, t2, t;
tnear = -float.MaxValue;
tfar = float.MaxValue;
int face, i = -1, j = -1;
// intersect in X
if (rd.X > -0.00001f && rd.X < -0.00001f)
{
if (ro.X < min.X || ro.X > max.X)
return -1;
}
else
{
t = 1.0f / rd.X;
t1 = (min.X - ro.X) * t;
t2 = (max.X - ro.X) * t;
if (t1 > t2)
{
t = t1; t1 = t2; t2 = t;
face = 0;
}
else
face = 3;
if (t1 > tnear)
{
tnear = t1;
i = face;
}
if (t2 < tfar)
{
tfar = t2;
if (face > 2)
j = face - 3;
else
j = face + 3;
}
if (tnear > tfar || tfar < 0.00001f)
return -1;
}
// intersect in Y
if (rd.Y > -0.00001f && rd.Y < -0.00001f)
{
if (ro.Y < min.Y || ro.Y > max.Y)
return -1;
}
else
{
t = 1.0f / rd.Y;
t1 = (min.Y - ro.Y) * t;
t2 = (max.Y - ro.Y) * t;
if (t1 > t2)
{
t = t1; t1 = t2; t2 = t;
face = 1;
}
else
face = 4;
if (t1 > tnear)
{
tnear = t1;
i = face;
}
if (t2 < tfar)
{
tfar = t2;
if (face > 2)
j = face - 3;
else
j = face + 3;
}
if (tnear > tfar || tfar < 0.00001f)
return -1;
}
// intersect in Z
if (rd.Z > -0.00001f && rd.Z < -0.00001f)
{
if (ro.Z < min.Z || ro.Z > max.Z)
return -1;
}
else
{
t = 1.0f / rd.Z;
t1 = (min.Z - ro.Z) * t;
t2 = (max.Z - ro.Z) * t;
if (t1 > t2)
{
t = t1; t1 = t2; t2 = t;
face = 2;
}
else
face = 5;
if (t1 > tnear)
{
tnear = t1;
i = face;
}
if (t2 < tfar)
{
tfar = t2;
if (face > 2)
j = face - 3;
else
j = face + 3;
}
}
if (tnear > tfar || tfar < 0.00001f)
return -1;
if (tnear < 0.0f)
return j;
else
return i;
}