Exemple #1
0
        /// <summary>
        /// Checks whether the current BoundingFrustumD intersects a BoundingSphere.
        /// </summary>
        /// <param name="sphere">The BoundingSphere to check for intersection with.</param><param name="result">[OutAttribute] true if the BoundingFrustumD and BoundingSphere intersect; false otherwise.</param>
        public void Intersects(ref BoundingSphereD sphere, out bool result)
        {
            if (this.gjk == null)
            {
                this.gjk = new GjkD();
            }
            this.gjk.Reset();
            Vector3D result1;

            Vector3D.Subtract(ref this.cornerArray[0], ref sphere.Center, out result1);
            if ((double)result1.LengthSquared() < 9.99999974737875E-06)
            {
                result1 = Vector3D.UnitX;
            }
            double num1 = double.MaxValue;

            result = false;
            double num2;

            do
            {
                Vector3D v;
                v.X = -result1.X;
                v.Y = -result1.Y;
                v.Z = -result1.Z;
                Vector3D result2;
                this.SupportMapping(ref v, out result2);
                Vector3D result3;
                sphere.SupportMapping(ref result1, out result3);
                Vector3D result4;
                Vector3D.Subtract(ref result2, ref result3, out result4);
                if ((double)result1.X * (double)result4.X + (double)result1.Y * (double)result4.Y + (double)result1.Z * (double)result4.Z > 0.0)
                {
                    return;
                }
                this.gjk.AddSupportPoint(ref result4);
                result1 = this.gjk.ClosestPoint;
                double num3 = num1;
                num1 = result1.LengthSquared();
                if ((double)num3 - (double)num1 <= 9.99999974737875E-06 * (double)num3)
                {
                    return;
                }
                num2 = 4E-05f * this.gjk.MaxLengthSquared;
            }while (!this.gjk.FullSimplex && (double)num1 >= (double)num2);
            result = true;
        }
Exemple #2
0
        public void Intersects(ref BoundingSphereD sphere, out bool result)
        {
            Vector3D unitX;
            Vector3D vectord2;
            Vector3D vectord3;
            Vector3D vectord4;
            Vector3D vectord5;

            if (this.gjk == null)
            {
                this.gjk = new GjkD();
            }
            this.gjk.Reset();
            Vector3D.Subtract(ref this.cornerArray[0], ref sphere.Center, out unitX);
            if (unitX.LengthSquared() < 9.99999974737875E-06)
            {
                unitX = Vector3D.UnitX;
            }
            double maxValue = double.MaxValue;

            result = false;
Label_005D:
            vectord2.X = -unitX.X;
            vectord2.Y = -unitX.Y;
            vectord2.Z = -unitX.Z;
            this.SupportMapping(ref vectord2, out vectord3);
            sphere.SupportMapping(ref unitX, out vectord4);
            Vector3D.Subtract(ref vectord3, ref vectord4, out vectord5);
            if ((((unitX.X * vectord5.X) + (unitX.Y * vectord5.Y)) + (unitX.Z * vectord5.Z)) <= 0.0)
            {
                this.gjk.AddSupportPoint(ref vectord5);
                unitX = this.gjk.ClosestPoint;
                double num3 = maxValue;
                maxValue = unitX.LengthSquared();
                if ((num3 - maxValue) > (9.99999974737875E-06 * num3))
                {
                    double num2 = 3.9999998989515007E-05 * this.gjk.MaxLengthSquared;
                    if (!this.gjk.FullSimplex && (maxValue >= num2))
                    {
                        goto Label_005D;
                    }
                    result = true;
                }
            }
        }