156 lines
		
	
	
		
			5.7 KiB
		
	
	
	
		
			C
		
	
	
	
		
		
			
		
	
	
			156 lines
		
	
	
		
			5.7 KiB
		
	
	
	
		
			C
		
	
	
	
|  | /*
 | ||
|  | * Copyright (c) 2006-2009 Erin Catto http://www.box2d.org
 | ||
|  | * | ||
|  | * This software is provided 'as-is', without any express or implied | ||
|  | * warranty.  In no event will the authors be held liable for any damages | ||
|  | * arising from the use of this software. | ||
|  | * Permission is granted to anyone to use this software for any purpose, | ||
|  | * including commercial applications, and to alter it and redistribute it | ||
|  | * freely, subject to the following restrictions: | ||
|  | * 1. The origin of this software must not be misrepresented; you must not | ||
|  | * claim that you wrote the original software. If you use this software | ||
|  | * in a product, an acknowledgment in the product documentation would be | ||
|  | * appreciated but is not required. | ||
|  | * 2. Altered source versions must be plainly marked as such, and must not be | ||
|  | * misrepresented as being the original software. | ||
|  | * 3. This notice may not be removed or altered from any source distribution. | ||
|  | */ | ||
|  | 
 | ||
|  | #ifndef B2_WORLD_CALLBACKS_H
 | ||
|  | #define B2_WORLD_CALLBACKS_H
 | ||
|  | 
 | ||
|  | #include "Box2D/Common/b2Settings.h"
 | ||
|  | 
 | ||
|  | struct b2Vec2; | ||
|  | struct b2Transform; | ||
|  | class b2Fixture; | ||
|  | class b2Body; | ||
|  | class b2Joint; | ||
|  | class b2Contact; | ||
|  | struct b2ContactResult; | ||
|  | struct b2Manifold; | ||
|  | 
 | ||
|  | /// Joints and fixtures are destroyed when their associated
 | ||
|  | /// body is destroyed. Implement this listener so that you
 | ||
|  | /// may nullify references to these joints and shapes.
 | ||
|  | class b2DestructionListener | ||
|  | { | ||
|  | public: | ||
|  | 	virtual ~b2DestructionListener() {} | ||
|  | 
 | ||
|  | 	/// Called when any joint is about to be destroyed due
 | ||
|  | 	/// to the destruction of one of its attached bodies.
 | ||
|  | 	virtual void SayGoodbye(b2Joint* joint) = 0; | ||
|  | 
 | ||
|  | 	/// Called when any fixture is about to be destroyed due
 | ||
|  | 	/// to the destruction of its parent body.
 | ||
|  | 	virtual void SayGoodbye(b2Fixture* fixture) = 0; | ||
|  | }; | ||
|  | 
 | ||
|  | /// Implement this class to provide collision filtering. In other words, you can implement
 | ||
|  | /// this class if you want finer control over contact creation.
 | ||
|  | class b2ContactFilter | ||
|  | { | ||
|  | public: | ||
|  | 	virtual ~b2ContactFilter() {} | ||
|  | 
 | ||
|  | 	/// Return true if contact calculations should be performed between these two shapes.
 | ||
|  | 	/// @warning for performance reasons this is only called when the AABBs begin to overlap.
 | ||
|  | 	virtual bool ShouldCollide(b2Fixture* fixtureA, b2Fixture* fixtureB); | ||
|  | }; | ||
|  | 
 | ||
|  | /// Contact impulses for reporting. Impulses are used instead of forces because
 | ||
|  | /// sub-step forces may approach infinity for rigid body collisions. These
 | ||
|  | /// match up one-to-one with the contact points in b2Manifold.
 | ||
|  | struct b2ContactImpulse | ||
|  | { | ||
|  | 	float32 normalImpulses[b2_maxManifoldPoints]; | ||
|  | 	float32 tangentImpulses[b2_maxManifoldPoints]; | ||
|  | 	int32 count; | ||
|  | }; | ||
|  | 
 | ||
|  | /// Implement this class to get contact information. You can use these results for
 | ||
|  | /// things like sounds and game logic. You can also get contact results by
 | ||
|  | /// traversing the contact lists after the time step. However, you might miss
 | ||
|  | /// some contacts because continuous physics leads to sub-stepping.
 | ||
|  | /// Additionally you may receive multiple callbacks for the same contact in a
 | ||
|  | /// single time step.
 | ||
|  | /// You should strive to make your callbacks efficient because there may be
 | ||
|  | /// many callbacks per time step.
 | ||
|  | /// @warning You cannot create/destroy Box2D entities inside these callbacks.
 | ||
|  | class b2ContactListener | ||
|  | { | ||
|  | public: | ||
|  | 	virtual ~b2ContactListener() {} | ||
|  | 
 | ||
|  | 	/// Called when two fixtures begin to touch.
 | ||
|  | 	virtual void BeginContact(b2Contact* contact) { B2_NOT_USED(contact); } | ||
|  | 
 | ||
|  | 	/// Called when two fixtures cease to touch.
 | ||
|  | 	virtual void EndContact(b2Contact* contact) { B2_NOT_USED(contact); } | ||
|  | 
 | ||
|  | 	/// This is called after a contact is updated. This allows you to inspect a
 | ||
|  | 	/// contact before it goes to the solver. If you are careful, you can modify the
 | ||
|  | 	/// contact manifold (e.g. disable contact).
 | ||
|  | 	/// A copy of the old manifold is provided so that you can detect changes.
 | ||
|  | 	/// Note: this is called only for awake bodies.
 | ||
|  | 	/// Note: this is called even when the number of contact points is zero.
 | ||
|  | 	/// Note: this is not called for sensors.
 | ||
|  | 	/// Note: if you set the number of contact points to zero, you will not
 | ||
|  | 	/// get an EndContact callback. However, you may get a BeginContact callback
 | ||
|  | 	/// the next step.
 | ||
|  | 	virtual void PreSolve(b2Contact* contact, const b2Manifold* oldManifold) | ||
|  | 	{ | ||
|  | 		B2_NOT_USED(contact); | ||
|  | 		B2_NOT_USED(oldManifold); | ||
|  | 	} | ||
|  | 
 | ||
|  | 	/// This lets you inspect a contact after the solver is finished. This is useful
 | ||
|  | 	/// for inspecting impulses.
 | ||
|  | 	/// Note: the contact manifold does not include time of impact impulses, which can be
 | ||
|  | 	/// arbitrarily large if the sub-step is small. Hence the impulse is provided explicitly
 | ||
|  | 	/// in a separate data structure.
 | ||
|  | 	/// Note: this is only called for contacts that are touching, solid, and awake.
 | ||
|  | 	virtual void PostSolve(b2Contact* contact, const b2ContactImpulse* impulse) | ||
|  | 	{ | ||
|  | 		B2_NOT_USED(contact); | ||
|  | 		B2_NOT_USED(impulse); | ||
|  | 	} | ||
|  | }; | ||
|  | 
 | ||
|  | /// Callback class for AABB queries.
 | ||
|  | /// See b2World::Query
 | ||
|  | class b2QueryCallback | ||
|  | { | ||
|  | public: | ||
|  | 	virtual ~b2QueryCallback() {} | ||
|  | 
 | ||
|  | 	/// Called for each fixture found in the query AABB.
 | ||
|  | 	/// @return false to terminate the query.
 | ||
|  | 	virtual bool ReportFixture(b2Fixture* fixture) = 0; | ||
|  | }; | ||
|  | 
 | ||
|  | /// Callback class for ray casts.
 | ||
|  | /// See b2World::RayCast
 | ||
|  | class b2RayCastCallback | ||
|  | { | ||
|  | public: | ||
|  | 	virtual ~b2RayCastCallback() {} | ||
|  | 
 | ||
|  | 	/// Called for each fixture found in the query. You control how the ray cast
 | ||
|  | 	/// proceeds by returning a float:
 | ||
|  | 	/// return -1: ignore this fixture and continue
 | ||
|  | 	/// return 0: terminate the ray cast
 | ||
|  | 	/// return fraction: clip the ray to this point
 | ||
|  | 	/// return 1: don't clip the ray and continue
 | ||
|  | 	/// @param fixture the fixture hit by the ray
 | ||
|  | 	/// @param point the point of initial intersection
 | ||
|  | 	/// @param normal the normal vector at the point of intersection
 | ||
|  | 	/// @return -1 to filter, 0 to terminate, fraction to clip the ray for
 | ||
|  | 	/// closest hit, 1 to continue
 | ||
|  | 	virtual float32 ReportFixture(	b2Fixture* fixture, const b2Vec2& point, | ||
|  | 									const b2Vec2& normal, float32 fraction) = 0; | ||
|  | }; | ||
|  | 
 | ||
|  | #endif
 |