Ejemplo n.º 1
0
        protected bool _perInstanceIntersectionTest(SSAbstractMesh abstrMesh, int i,
                                                    ref SSRay localRay, out float localContact)
        {
            var pos         = instanceData.readPosition(i);
            var masterScale = instanceData.readMasterScale(i);
            var scale       = instanceData.readComponentScale(i) * masterScale;

            if (abstrMesh == null)
            {
                // no way to be any more precise except hitting a generic sphere
                float radius = Math.Max(scale.Z, Math.Max(scale.X, scale.Y));
                var   sphere = new SSSphere(pos, radius);
                return(sphere.IntersectsRay(ref localRay, out localContact));
            }
            else
            {
                // When using SSAbstractMesh we can invoke its preciseIntersect()
                Matrix4 instanceMat = Matrix4.CreateScale(scale) * Matrix4.CreateTranslation(pos);

                SSRay instanceRay = localRay.Transformed(instanceMat.Inverted());
                float instanceContact;
                if (abstrMesh.preciseIntersect(ref instanceRay, out instanceContact))
                {
                    Vector3 instanceContactPt = instanceRay.pos + instanceContact * instanceRay.dir;
                    Vector3 localContactPt    = Vector3.Transform(instanceContactPt, instanceMat);
                    localContact = (localContactPt - localRay.pos).Length;
                    return(true);
                }
                else
                {
                    localContact = float.PositiveInfinity;
                    return(false);
                }
            }
        }