testPoint() public method

public testPoint ( Vector2 point ) : Fixture
point Vector2
return Fixture
Ejemplo n.º 1
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, 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;
		}