/// <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, Vector2 start, Vector2 end ) { var fixtures = new List<Fixture>(); var entryPoints = new List<Vector2>(); var exitPoints = new List<Vector2>(); //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; }