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