示例#1
0
        public static void SphereCloud(int pointLimit, Vector3D[] physicsArray, MyEntity shieldEnt, bool transformAndScale, bool debug, Random rnd = null)
        {
            if (pointLimit > 10000)
            {
                pointLimit = 10000;
            }
            if (rnd == null)
            {
                rnd = new Random(0);
            }

            var sPosComp = shieldEnt.PositionComp;
            var unscaledPosWorldMatrix = MatrixD.Rescale(MatrixD.CreateTranslation(sPosComp.WorldAABB.Center), sPosComp.WorldVolume.Radius);
            var radius = sPosComp.WorldVolume.Radius;

            for (int i = 0; i < pointLimit; i++)
            {
                var value = rnd.Next(0, physicsArray.Length - 1);
                var phi   = 2 * Math.PI * i / pointLimit;
                var x     = (float)(radius * Math.Sin(phi) * Math.Cos(value));
                var z     = (float)(radius * Math.Sin(phi) * Math.Sin(value));
                var y     = (float)(radius * Math.Cos(phi));
                var v     = new Vector3D(x, y, z);

                if (transformAndScale)
                {
                    v = Vector3D.Transform(Vector3D.Normalize(v), unscaledPosWorldMatrix);
                }
                if (debug)
                {
                    DsDebugDraw.DrawX(v, sPosComp.LocalMatrix, 0.5);
                }
                physicsArray[i] = v;
            }
        }
示例#2
0
        public static void UnitSphereTranslateScale(int pointLimit, ref Vector3D[] physicsArray, ref Vector3D[] scaledCloudArray, MyEntity shieldEnt, bool debug)
        {
            var sPosComp = shieldEnt.PositionComp;
            var radius   = sPosComp.WorldVolume.Radius;
            var center   = sPosComp.WorldAABB.Center;

            for (int i = 0; i < pointLimit; i++)
            {
                var v = physicsArray[i];
                scaledCloudArray[i] = v = center + (radius * v);
                if (debug)
                {
                    DsDebugDraw.DrawX(v, sPosComp.LocalMatrix, 0.5);
                }
            }
        }
示例#3
0
        public static void UnitSphereCloudQuick(int pointLimit, ref Vector3D[] physicsArray, MyEntity shieldEnt, bool translateAndScale, bool debug, Random rnd = null)
        {
            if (pointLimit > 10000)
            {
                pointLimit = 10000;
            }
            if (rnd == null)
            {
                rnd = new Random(0);
            }

            var sPosComp = shieldEnt.PositionComp;
            var radius   = sPosComp.WorldVolume.Radius;
            var center   = sPosComp.WorldAABB.Center;
            var v        = Vector3D.Zero;

            for (int i = 0; i < pointLimit; i++)
            {
                while (true)
                {
                    v.X = (rnd.NextDouble() * 2) - 1;
                    v.Y = (rnd.NextDouble() * 2) - 1;
                    v.Z = (rnd.NextDouble() * 2) - 1;
                    var len2 = v.LengthSquared();
                    if (len2 < .0001)
                    {
                        continue;
                    }
                    v *= radius / Math.Sqrt(len2);
                    break;
                }

                if (translateAndScale)
                {
                    physicsArray[i] = v += center;
                }
                else
                {
                    physicsArray[i] = v;
                }
                if (debug)
                {
                    DsDebugDraw.DrawX(v, sPosComp.LocalMatrix, 0.5);
                }
            }
        }
示例#4
0
        public static void SmallIntersectDebugDraw(Vector3D[] physicsOutside, int face, int[][] vertLines, int[] rangedVert, Vector3D bWorldCenter, List <Vector3D> intersections)
        {
            //DrawNums(_physicsOutside,zone, Color.AntiqueWhite);
            DsDebugDraw.DrawLineToNum(physicsOutside, rangedVert[0], bWorldCenter, Color.Red);
            DsDebugDraw.DrawLineToNum(physicsOutside, rangedVert[1], bWorldCenter, Color.Green);
            DsDebugDraw.DrawLineToNum(physicsOutside, rangedVert[2], bWorldCenter, Color.Gold);

            int[] closestLineFace;
            switch (face)
            {
            case 0:
                closestLineFace = vertLines[rangedVert[0]];
                break;

            case 1:
                closestLineFace = vertLines[rangedVert[1]];
                break;

            default:
                closestLineFace = vertLines[rangedVert[2]];
                break;
            }

            var c1 = Color.Black;
            var c2 = Color.Black;

            //if (checkBackupFace1) c1 = Color.Green;
            //if (checkBackupFace2) c2 = Color.Gold;
            c1 = Color.Green;
            c2 = Color.Gold;

            DsDebugDraw.DrawLineNums(physicsOutside, closestLineFace, Color.Red);
            //DrawLineNums(_physicsOutside, closestLineFace1, c1);
            //DrawLineNums(_physicsOutside, closestLineFace2, c2);

            DsDebugDraw.DrawTriVertList(intersections);

            //DrawLineToNum(_physicsOutside, rootVerts, bWorldCenter, Color.HotPink);
            //DrawLineToNum(_physicsOutside, rootVerts[1], bWorldCenter, Color.Green);
            //DrawLineToNum(_physicsOutside, rootVerts[2], bWorldCenter, Color.Gold);
        }
示例#5
0
        public static void UnitSphereTranslateScaleList(int pointLimit, ref Vector3D[] physicsArray, ref List <Vector3D> scaledCloudList, MyEntity shieldEnt, bool debug, MyEntity grid, bool rotate = true)
        {
            var sPosComp = shieldEnt.PositionComp;
            var radius   = sPosComp.WorldVolume.Radius;
            var center   = sPosComp.WorldAABB.Center;
            var gMatrix  = grid.PositionComp.WorldMatrixRef;

            for (int i = 0; i < pointLimit; i++)
            {
                var v = physicsArray[i];
                if (rotate)
                {
                    Vector3D.Rotate(ref v, ref gMatrix, out v);
                }
                v = center + (radius * v);
                scaledCloudList.Add(v);
                if (debug)
                {
                    DsDebugDraw.DrawX(v, sPosComp.LocalMatrixRef, 0.5);
                }
            }
        }