All pastes #766727 Raw Edit

Jefff

public text v1 · immutable
·published 2007-11-09 02:41 UTC
rendered paste body
        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;
        }