コード例 #1
0
        public static bool Cut(World world, TSVector2 start, TSVector2 end)
        {
            List <Fixture>   fixtures    = new List <Fixture>();
            List <TSVector2> entryPoints = new List <TSVector2>();
            List <TSVector2> exitPoints  = new List <TSVector2>();
            bool             flag        = world.TestPoint(start) != null || world.TestPoint(end) != null;
            bool             result;

            if (flag)
            {
                result = false;
            }
            else
            {
                world.RayCast(delegate(Fixture f, TSVector2 p, TSVector2 n, FP fr)
                {
                    fixtures.Add(f);
                    entryPoints.Add(p);
                    return(1);
                }, start, end);
                world.RayCast(delegate(Fixture f, TSVector2 p, TSVector2 n, FP fr)
                {
                    exitPoints.Add(p);
                    return(1);
                }, end, start);
                bool flag2 = entryPoints.Count + exitPoints.Count < 2;
                if (flag2)
                {
                    result = false;
                }
                else
                {
                    for (int i = 0; i < fixtures.Count; i++)
                    {
                        bool flag3 = fixtures[i].Shape.ShapeType != ShapeType.Polygon;
                        if (!flag3)
                        {
                            bool flag4 = fixtures[i].Body.BodyType > BodyType.Static;
                            if (flag4)
                            {
                                Vertices vertices;
                                Vertices vertices2;
                                CuttingTools.SplitShape(fixtures[i], entryPoints[i], exitPoints[i], out vertices, out vertices2);
                                bool flag5 = vertices.CheckPolygon() == PolygonError.NoError;
                                if (flag5)
                                {
                                    Body body = BodyFactory.CreatePolygon(world, vertices, fixtures[i].Shape.Density, fixtures[i].Body.Position);
                                    body.Rotation        = fixtures[i].Body.Rotation;
                                    body.LinearVelocity  = fixtures[i].Body.LinearVelocity;
                                    body.AngularVelocity = fixtures[i].Body.AngularVelocity;
                                    body.BodyType        = BodyType.Dynamic;
                                }
                                bool flag6 = vertices2.CheckPolygon() == PolygonError.NoError;
                                if (flag6)
                                {
                                    Body body2 = BodyFactory.CreatePolygon(world, vertices2, fixtures[i].Shape.Density, fixtures[i].Body.Position);
                                    body2.Rotation        = fixtures[i].Body.Rotation;
                                    body2.LinearVelocity  = fixtures[i].Body.LinearVelocity;
                                    body2.AngularVelocity = fixtures[i].Body.AngularVelocity;
                                    body2.BodyType        = BodyType.Dynamic;
                                }
                                world.RemoveBody(fixtures[i].Body);
                            }
                        }
                    }
                    result = true;
                }
            }
            return(result);
        }
コード例 #2
0
        /// <summary>
        /// This is a high-level function to cuts fixtures inside the given world, using the start and end points.
        /// Note: We don't support cutting when the start or end is inside a shape.
        /// </summary>
        /// <param name="world">The world.</param>
        /// <param name="start">The startpoint.</param>
        /// <param name="end">The endpoint.</param>
        /// <returns>True if the cut was performed.</returns>
        public static bool Cut(World world, TSVector2 start, TSVector2 end)
        {
            List <Fixture>   fixtures    = new List <Fixture>();
            List <TSVector2> entryPoints = new List <TSVector2>();
            List <TSVector2> exitPoints  = new List <TSVector2>();

            //We don't support cutting when the start or end is inside a shape.
            if (world.TestPoint(start) != null || world.TestPoint(end) != null)
            {
                return(false);
            }

            //Get the entry points
            world.RayCast((f, p, n, fr) =>
            {
                fixtures.Add(f);
                entryPoints.Add(p);
                return(1);
            }, start, end);

            //Reverse the ray to get the exitpoints
            world.RayCast((f, p, n, fr) =>
            {
                exitPoints.Add(p);
                return(1);
            }, end, start);

            //We only have a single point. We need at least 2
            if (entryPoints.Count + exitPoints.Count < 2)
            {
                return(false);
            }

            for (int i = 0; i < fixtures.Count; i++)
            {
                // can't cut circles or edges yet !
                if (fixtures[i].Shape.ShapeType != ShapeType.Polygon)
                {
                    continue;
                }

                if (fixtures[i].Body.BodyType != BodyType.Static)
                {
                    //Split the shape up into two shapes
                    Vertices first;
                    Vertices second;
                    SplitShape(fixtures[i], entryPoints[i], exitPoints[i], out first, out second);

                    //Delete the original shape and create two new. Retain the properties of the body.
                    if (first.CheckPolygon() == PolygonError.NoError)
                    {
                        Body firstFixture = BodyFactory.CreatePolygon(world, first, fixtures[i].Shape.Density, fixtures[i].Body.Position);
                        firstFixture.Rotation        = fixtures[i].Body.Rotation;
                        firstFixture.LinearVelocity  = fixtures[i].Body.LinearVelocity;
                        firstFixture.AngularVelocity = fixtures[i].Body.AngularVelocity;
                        firstFixture.BodyType        = BodyType.Dynamic;
                    }

                    if (second.CheckPolygon() == PolygonError.NoError)
                    {
                        Body secondFixture = BodyFactory.CreatePolygon(world, second, fixtures[i].Shape.Density, fixtures[i].Body.Position);
                        secondFixture.Rotation        = fixtures[i].Body.Rotation;
                        secondFixture.LinearVelocity  = fixtures[i].Body.LinearVelocity;
                        secondFixture.AngularVelocity = fixtures[i].Body.AngularVelocity;
                        secondFixture.BodyType        = BodyType.Dynamic;
                    }

                    world.RemoveBody(fixtures[i].Body);
                }
            }

            return(true);
        }