Exemple #1
0
        public override bool Intersect(Ray ray, ref DifferentialGeometry dg)
        {
            Point3 p1 = m.P[v[0]];
            Point3 p2 = m.P[v[1]];
            Point3 p3 = m.P[v[2]];

            Vector e1 = p2 - p1;
            Vector e2 = p3 - p1;
            Vector s1 = LR.Cross(ray.d, e2);

            float divisor = LR.Dot(s1, e1);

            if (divisor == 0.0f)
            {
                return(false);
            }
            float invDivisor = 1.0f / divisor;

            // Compute first barycentric coordinate
            Vector s  = ray.o - p1;
            float  b1 = LR.Dot(s, s1) * invDivisor;

            if (b1 < 0.0f || b1 > 1.0f)
            {
                return(false);
            }

            // Compute second barycentric coordinate
            Vector s2 = LR.Cross(s, e1);
            float  b2 = LR.Dot(ray.d, s2) * invDivisor;

            if (b2 < 0.0f || b1 + b2 > 1.0f)
            {
                return(false);
            }

            // Compute _t_ to intersection point
            float t = LR.Dot(e2, s2) * invDivisor;

            if (t < ray.mint || t > ray.maxt)
            {
                return(false);
            }


            return(false);
        }