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); }
/// <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); }