| 
									
										
										
										
											2006-04-28 00:08:18 +00:00
										 |  |  | /*
 | 
					
						
							|  |  |  | Bullet Continuous Collision Detection and Physics Library | 
					
						
							|  |  |  | Copyright (c) 2003-2006 Erwin Coumans  http://continuousphysics.com/Bullet/
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 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. | 
					
						
							|  |  |  | */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2005-07-18 05:41:00 +00:00
										 |  |  | #include "CcdPhysicsEnvironment.h"
 | 
					
						
							|  |  |  | #include "CcdPhysicsController.h"
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include <algorithm>
 | 
					
						
							|  |  |  | #include "SimdTransform.h"
 | 
					
						
							|  |  |  | #include "Dynamics/RigidBody.h"
 | 
					
						
							| 
									
										
										
										
											2005-08-02 18:54:11 +00:00
										 |  |  | #include "BroadphaseCollision/BroadphaseInterface.h"
 | 
					
						
							| 
									
										
										
										
											2005-07-18 05:41:00 +00:00
										 |  |  | #include "BroadphaseCollision/SimpleBroadphase.h"
 | 
					
						
							| 
									
										
										
										
											2006-03-27 06:37:30 +00:00
										 |  |  | #include "BroadphaseCollision/AxisSweep3.h"
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-02-21 05:36:56 +00:00
										 |  |  | #include "CollisionDispatch/CollisionWorld.h"
 | 
					
						
							| 
									
										
										
										
											2005-07-18 05:41:00 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | #include "CollisionShapes/ConvexShape.h"
 | 
					
						
							| 
									
										
										
										
											2006-02-21 05:36:56 +00:00
										 |  |  | #include "BroadphaseCollision/Dispatcher.h"
 | 
					
						
							| 
									
										
										
										
											2005-07-18 05:41:00 +00:00
										 |  |  | #include "NarrowPhaseCollision/PersistentManifold.h"
 | 
					
						
							|  |  |  | #include "CollisionShapes/TriangleMeshShape.h"
 | 
					
						
							|  |  |  | #include "ConstraintSolver/OdeConstraintSolver.h"
 | 
					
						
							|  |  |  | #include "ConstraintSolver/SimpleConstraintSolver.h"
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-04-28 00:08:18 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-04-13 05:11:34 +00:00
										 |  |  | //profiling/timings
 | 
					
						
							|  |  |  | #include "quickprof.h"
 | 
					
						
							| 
									
										
										
										
											2006-04-28 00:08:18 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-02-21 05:36:56 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2005-07-29 18:14:41 +00:00
										 |  |  | #include "IDebugDraw.h"
 | 
					
						
							| 
									
										
										
										
											2005-07-18 05:41:00 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2005-08-05 17:00:32 +00:00
										 |  |  | #include "NarrowPhaseCollision/VoronoiSimplexSolver.h"
 | 
					
						
							| 
									
										
										
										
											2005-08-18 06:04:50 +00:00
										 |  |  | #include "NarrowPhaseCollision/SubSimplexConvexCast.h"
 | 
					
						
							| 
									
										
										
										
											2006-02-21 05:36:56 +00:00
										 |  |  | #include "NarrowPhaseCollision/GjkConvexCast.h"
 | 
					
						
							| 
									
										
										
										
											2006-04-23 18:42:17 +00:00
										 |  |  | #include "NarrowPhaseCollision/ContinuousConvexCollision.h"
 | 
					
						
							| 
									
										
										
										
											2006-02-21 05:36:56 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2005-07-18 05:41:00 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-02-21 05:36:56 +00:00
										 |  |  | #include "CollisionDispatch/CollisionDispatcher.h"
 | 
					
						
							| 
									
										
										
										
											2006-02-13 06:28:35 +00:00
										 |  |  | #include "PHY_IMotionState.h"
 | 
					
						
							| 
									
										
										
										
											2005-07-18 05:41:00 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | #include "CollisionDispatch/EmptyCollisionAlgorithm.h"
 | 
					
						
							|  |  |  | #include "CollisionDispatch/UnionFind.h"
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-04-28 00:08:18 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2005-08-05 17:00:32 +00:00
										 |  |  | #include "CollisionShapes/SphereShape.h"
 | 
					
						
							| 
									
										
										
										
											2005-07-18 05:41:00 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | bool useIslands = true; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-02-13 06:28:35 +00:00
										 |  |  | #ifdef NEW_BULLET_VEHICLE_SUPPORT
 | 
					
						
							|  |  |  | #include "Vehicle/RaycastVehicle.h"
 | 
					
						
							|  |  |  | #include "Vehicle/VehicleRaycaster.h"
 | 
					
						
							| 
									
										
										
										
											2006-02-21 05:36:56 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | #include "Vehicle/WheelInfo.h"
 | 
					
						
							| 
									
										
										
										
											2006-02-13 06:28:35 +00:00
										 |  |  | #include "PHY_IVehicle.h"
 | 
					
						
							| 
									
										
										
										
											2006-02-21 05:36:56 +00:00
										 |  |  | RaycastVehicle::VehicleTuning	gTuning; | 
					
						
							| 
									
										
										
										
											2006-02-13 06:28:35 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | #endif //NEW_BULLET_VEHICLE_SUPPORT
 | 
					
						
							|  |  |  | #include "AabbUtil2.h"
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2005-07-18 05:41:00 +00:00
										 |  |  | #include "ConstraintSolver/ConstraintSolver.h"
 | 
					
						
							|  |  |  | #include "ConstraintSolver/Point2PointConstraint.h"
 | 
					
						
							| 
									
										
										
										
											2006-04-06 20:37:38 +00:00
										 |  |  | #include "ConstraintSolver/HingeConstraint.h"
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2005-07-18 05:41:00 +00:00
										 |  |  | //#include "BroadphaseCollision/QueryDispatcher.h"
 | 
					
						
							|  |  |  | //#include "BroadphaseCollision/QueryBox.h"
 | 
					
						
							|  |  |  | //todo: change this to allow dynamic registration of types!
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #ifdef WIN32
 | 
					
						
							|  |  |  | void DrawRasterizerLine(const float* from,const float* to,int color); | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include "ConstraintSolver/ContactConstraint.h"
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include <stdio.h>
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-02-13 06:28:35 +00:00
										 |  |  | #ifdef NEW_BULLET_VEHICLE_SUPPORT
 | 
					
						
							|  |  |  | class WrapperVehicle : public PHY_IVehicle | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	RaycastVehicle*	m_vehicle; | 
					
						
							|  |  |  | 	PHY_IPhysicsController*	m_chassis; | 
					
						
							| 
									
										
										
										
											2006-04-28 00:08:18 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-02-13 06:28:35 +00:00
										 |  |  | public: | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	WrapperVehicle(RaycastVehicle* vehicle,PHY_IPhysicsController* chassis) | 
					
						
							|  |  |  | 		:m_vehicle(vehicle), | 
					
						
							|  |  |  | 		m_chassis(chassis) | 
					
						
							|  |  |  | 	{ | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	RaycastVehicle*	GetVehicle() | 
					
						
							|  |  |  | 	{ | 
					
						
							|  |  |  | 		return m_vehicle; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	PHY_IPhysicsController*	GetChassis() | 
					
						
							|  |  |  | 	{ | 
					
						
							|  |  |  | 		return m_chassis; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	virtual void	AddWheel( | 
					
						
							| 
									
										
										
										
											2006-04-28 00:08:18 +00:00
										 |  |  | 		PHY_IMotionState*	motionState, | 
					
						
							|  |  |  | 		PHY__Vector3	connectionPoint, | 
					
						
							|  |  |  | 		PHY__Vector3	downDirection, | 
					
						
							|  |  |  | 		PHY__Vector3	axleDirection, | 
					
						
							|  |  |  | 		float	suspensionRestLength, | 
					
						
							|  |  |  | 		float wheelRadius, | 
					
						
							|  |  |  | 		bool hasSteering | 
					
						
							| 
									
										
										
										
											2006-02-13 06:28:35 +00:00
										 |  |  | 		) | 
					
						
							|  |  |  | 	{ | 
					
						
							|  |  |  | 		SimdVector3 connectionPointCS0(connectionPoint[0],connectionPoint[1],connectionPoint[2]); | 
					
						
							|  |  |  | 		SimdVector3 wheelDirectionCS0(downDirection[0],downDirection[1],downDirection[2]); | 
					
						
							|  |  |  | 		SimdVector3 wheelAxle(axleDirection[0],axleDirection[1],axleDirection[2]); | 
					
						
							| 
									
										
										
										
											2006-04-28 00:08:18 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-02-13 06:28:35 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 		WheelInfo& info = m_vehicle->AddWheel(connectionPointCS0,wheelDirectionCS0,wheelAxle, | 
					
						
							|  |  |  | 			suspensionRestLength,wheelRadius,gTuning,hasSteering); | 
					
						
							|  |  |  | 		info.m_clientInfo = motionState; | 
					
						
							| 
									
										
										
										
											2006-04-28 00:08:18 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-02-13 06:28:35 +00:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	void	SyncWheels() | 
					
						
							|  |  |  | 	{ | 
					
						
							|  |  |  | 		int numWheels = GetNumWheels(); | 
					
						
							|  |  |  | 		int i; | 
					
						
							|  |  |  | 		for (i=0;i<numWheels;i++) | 
					
						
							|  |  |  | 		{ | 
					
						
							|  |  |  | 			WheelInfo& info = m_vehicle->GetWheelInfo(i); | 
					
						
							|  |  |  | 			PHY_IMotionState* motionState = (PHY_IMotionState*)info.m_clientInfo ; | 
					
						
							| 
									
										
										
										
											2006-02-22 06:58:05 +00:00
										 |  |  | 			m_vehicle->UpdateWheelTransform(i); | 
					
						
							| 
									
										
										
										
											2006-02-13 06:28:35 +00:00
										 |  |  | 			SimdTransform trans = m_vehicle->GetWheelTransformWS(i); | 
					
						
							|  |  |  | 			SimdQuaternion orn = trans.getRotation(); | 
					
						
							|  |  |  | 			const SimdVector3& pos = trans.getOrigin(); | 
					
						
							|  |  |  | 			motionState->setWorldOrientation(orn.x(),orn.y(),orn.z(),orn[3]); | 
					
						
							|  |  |  | 			motionState->setWorldPosition(pos.x(),pos.y(),pos.z()); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	virtual	int		GetNumWheels() const | 
					
						
							|  |  |  | 	{ | 
					
						
							|  |  |  | 		return m_vehicle->GetNumWheels(); | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2006-04-28 00:08:18 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-02-13 06:28:35 +00:00
										 |  |  | 	virtual void	GetWheelPosition(int wheelIndex,float& posX,float& posY,float& posZ) const | 
					
						
							|  |  |  | 	{ | 
					
						
							|  |  |  | 		SimdTransform	trans = m_vehicle->GetWheelTransformWS(wheelIndex); | 
					
						
							|  |  |  | 		posX = trans.getOrigin().x(); | 
					
						
							|  |  |  | 		posY = trans.getOrigin().y(); | 
					
						
							|  |  |  | 		posZ = trans.getOrigin().z(); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	virtual void	GetWheelOrientationQuaternion(int wheelIndex,float& quatX,float& quatY,float& quatZ,float& quatW) const | 
					
						
							|  |  |  | 	{ | 
					
						
							|  |  |  | 		SimdTransform	trans = m_vehicle->GetWheelTransformWS(wheelIndex); | 
					
						
							|  |  |  | 		SimdQuaternion quat = trans.getRotation(); | 
					
						
							|  |  |  | 		SimdMatrix3x3 orn2(quat); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		quatX = trans.getRotation().x(); | 
					
						
							|  |  |  | 		quatY = trans.getRotation().y(); | 
					
						
							|  |  |  | 		quatZ = trans.getRotation().z(); | 
					
						
							|  |  |  | 		quatW = trans.getRotation()[3]; | 
					
						
							| 
									
										
										
										
											2006-04-28 00:08:18 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-02-13 06:28:35 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 		//printf("test");
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	virtual float	GetWheelRotation(int wheelIndex) const | 
					
						
							|  |  |  | 	{ | 
					
						
							|  |  |  | 		float rotation = 0.f; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		if ((wheelIndex>=0) && (wheelIndex< m_vehicle->GetNumWheels())) | 
					
						
							|  |  |  | 		{ | 
					
						
							|  |  |  | 			WheelInfo& info = m_vehicle->GetWheelInfo(wheelIndex); | 
					
						
							|  |  |  | 			rotation = info.m_rotation; | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		return rotation; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-04-28 00:08:18 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-02-13 06:28:35 +00:00
										 |  |  | 	virtual int	GetUserConstraintId() const | 
					
						
							|  |  |  | 	{ | 
					
						
							|  |  |  | 		return m_vehicle->GetUserConstraintId(); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	virtual int	GetUserConstraintType() const | 
					
						
							|  |  |  | 	{ | 
					
						
							|  |  |  | 		return m_vehicle->GetUserConstraintType(); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	virtual	void	SetSteeringValue(float steering,int wheelIndex) | 
					
						
							|  |  |  | 	{ | 
					
						
							|  |  |  | 		m_vehicle->SetSteeringValue(steering,wheelIndex); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	virtual	void	ApplyEngineForce(float force,int wheelIndex) | 
					
						
							|  |  |  | 	{ | 
					
						
							|  |  |  | 		m_vehicle->ApplyEngineForce(force,wheelIndex); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	virtual	void	ApplyBraking(float braking,int wheelIndex) | 
					
						
							|  |  |  | 	{ | 
					
						
							|  |  |  | 		if ((wheelIndex>=0) && (wheelIndex< m_vehicle->GetNumWheels())) | 
					
						
							|  |  |  | 		{ | 
					
						
							|  |  |  | 			WheelInfo& info = m_vehicle->GetWheelInfo(wheelIndex); | 
					
						
							|  |  |  | 			info.m_brake = braking; | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-02-21 07:08:23 +00:00
										 |  |  | 	virtual	void	SetWheelFriction(float friction,int wheelIndex) | 
					
						
							|  |  |  | 	{ | 
					
						
							|  |  |  | 		if ((wheelIndex>=0) && (wheelIndex< m_vehicle->GetNumWheels())) | 
					
						
							|  |  |  | 		{ | 
					
						
							|  |  |  | 			WheelInfo& info = m_vehicle->GetWheelInfo(wheelIndex); | 
					
						
							|  |  |  | 			info.m_frictionSlip = friction; | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2006-04-28 00:08:18 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-02-21 07:08:23 +00:00
										 |  |  | 	virtual	void	SetSuspensionStiffness(float suspensionStiffness,int wheelIndex) | 
					
						
							|  |  |  | 	{ | 
					
						
							|  |  |  | 		if ((wheelIndex>=0) && (wheelIndex< m_vehicle->GetNumWheels())) | 
					
						
							|  |  |  | 		{ | 
					
						
							|  |  |  | 			WheelInfo& info = m_vehicle->GetWheelInfo(wheelIndex); | 
					
						
							|  |  |  | 			info.m_suspensionStiffness = suspensionStiffness; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	virtual	void	SetSuspensionDamping(float suspensionDamping,int wheelIndex) | 
					
						
							|  |  |  | 	{ | 
					
						
							|  |  |  | 		if ((wheelIndex>=0) && (wheelIndex< m_vehicle->GetNumWheels())) | 
					
						
							|  |  |  | 		{ | 
					
						
							|  |  |  | 			WheelInfo& info = m_vehicle->GetWheelInfo(wheelIndex); | 
					
						
							|  |  |  | 			info.m_wheelsDampingRelaxation = suspensionDamping; | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	virtual	void	SetSuspensionCompression(float suspensionCompression,int wheelIndex) | 
					
						
							|  |  |  | 	{ | 
					
						
							|  |  |  | 		if ((wheelIndex>=0) && (wheelIndex< m_vehicle->GetNumWheels())) | 
					
						
							|  |  |  | 		{ | 
					
						
							|  |  |  | 			WheelInfo& info = m_vehicle->GetWheelInfo(wheelIndex); | 
					
						
							|  |  |  | 			info.m_wheelsDampingCompression = suspensionCompression; | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-04-28 00:08:18 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-02-21 07:08:23 +00:00
										 |  |  | 	virtual	void	SetRollInfluence(float rollInfluence,int wheelIndex) | 
					
						
							|  |  |  | 	{ | 
					
						
							|  |  |  | 		if ((wheelIndex>=0) && (wheelIndex< m_vehicle->GetNumWheels())) | 
					
						
							|  |  |  | 		{ | 
					
						
							|  |  |  | 			WheelInfo& info = m_vehicle->GetWheelInfo(wheelIndex); | 
					
						
							|  |  |  | 			info.m_rollInfluence = rollInfluence; | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-02-13 06:28:35 +00:00
										 |  |  | }; | 
					
						
							|  |  |  | #endif //NEW_BULLET_VEHICLE_SUPPORT
 | 
					
						
							| 
									
										
										
										
											2005-07-18 05:41:00 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2005-07-27 09:30:53 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2005-07-29 18:14:41 +00:00
										 |  |  | static void DrawAabb(IDebugDraw* debugDrawer,const SimdVector3& from,const SimdVector3& to,const SimdVector3& color) | 
					
						
							| 
									
										
										
										
											2005-07-27 09:30:53 +00:00
										 |  |  | { | 
					
						
							|  |  |  | 	SimdVector3 halfExtents = (to-from)* 0.5f; | 
					
						
							|  |  |  | 	SimdVector3 center = (to+from) *0.5f; | 
					
						
							|  |  |  | 	int i,j; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	SimdVector3 edgecoord(1.f,1.f,1.f),pa,pb; | 
					
						
							|  |  |  | 	for (i=0;i<4;i++) | 
					
						
							|  |  |  | 	{ | 
					
						
							|  |  |  | 		for (j=0;j<3;j++) | 
					
						
							|  |  |  | 		{ | 
					
						
							|  |  |  | 			pa = SimdVector3(edgecoord[0]*halfExtents[0], edgecoord[1]*halfExtents[1],		 | 
					
						
							|  |  |  | 				edgecoord[2]*halfExtents[2]); | 
					
						
							|  |  |  | 			pa+=center; | 
					
						
							| 
									
										
										
										
											2006-04-28 00:08:18 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2005-07-27 09:30:53 +00:00
										 |  |  | 			int othercoord = j%3; | 
					
						
							|  |  |  | 			edgecoord[othercoord]*=-1.f; | 
					
						
							|  |  |  | 			pb = SimdVector3(edgecoord[0]*halfExtents[0], edgecoord[1]*halfExtents[1],	 | 
					
						
							|  |  |  | 				edgecoord[2]*halfExtents[2]); | 
					
						
							|  |  |  | 			pb+=center; | 
					
						
							| 
									
										
										
										
											2006-04-28 00:08:18 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2005-07-27 09:30:53 +00:00
										 |  |  | 			debugDrawer->DrawLine(pa,pb,color); | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		edgecoord = SimdVector3(-1.f,-1.f,-1.f); | 
					
						
							|  |  |  | 		if (i<3) | 
					
						
							|  |  |  | 			edgecoord[i]*=-1.f; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-02-21 05:36:56 +00:00
										 |  |  | CcdPhysicsEnvironment::CcdPhysicsEnvironment(CollisionDispatcher* dispatcher,BroadphaseInterface* broadphase) | 
					
						
							|  |  |  | :m_scalingPropagated(false), | 
					
						
							| 
									
										
										
										
											2006-03-29 03:11:30 +00:00
										 |  |  | m_numIterations(10), | 
					
						
							| 
									
										
										
										
											2005-08-04 19:07:39 +00:00
										 |  |  | m_ccdMode(0), | 
					
						
							| 
									
										
										
										
											2006-04-13 05:11:34 +00:00
										 |  |  | m_solverType(-1), | 
					
						
							|  |  |  | m_profileTimings(0), | 
					
						
							|  |  |  | m_enableSatCollisionDetection(false) | 
					
						
							| 
									
										
										
										
											2005-07-18 05:41:00 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2005-08-04 19:07:39 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-04-17 01:33:10 +00:00
										 |  |  | 	for (int i=0;i<PHY_NUM_RESPONSE;i++) | 
					
						
							|  |  |  | 	{ | 
					
						
							|  |  |  | 		m_triggerCallbacks[i] = 0; | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2006-02-21 05:36:56 +00:00
										 |  |  | 	if (!dispatcher) | 
					
						
							|  |  |  | 		dispatcher = new CollisionDispatcher(); | 
					
						
							| 
									
										
										
										
											2005-08-04 19:07:39 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-04-28 00:08:18 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-02-21 05:36:56 +00:00
										 |  |  | 	if(!broadphase) | 
					
						
							| 
									
										
										
										
											2006-03-27 06:37:30 +00:00
										 |  |  | 	{ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		//todo: calculate/let user specify this world sizes
 | 
					
						
							|  |  |  | 		SimdVector3 worldMin(-10000,-10000,-10000); | 
					
						
							|  |  |  | 		SimdVector3 worldMax(10000,10000,10000); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-04-28 00:08:18 +00:00
										 |  |  | 		//broadphase = new AxisSweep3(worldMin,worldMax);
 | 
					
						
							| 
									
										
										
										
											2006-03-27 06:37:30 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-04-28 00:08:18 +00:00
										 |  |  | 		broadphase = new SimpleBroadphase(); | 
					
						
							| 
									
										
										
										
											2006-03-27 06:37:30 +00:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2006-04-28 00:08:18 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-04-06 20:37:38 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-05-09 01:15:12 +00:00
										 |  |  | 	setSolverType(1);//issues with quickstep and memory allocations
 | 
					
						
							| 
									
										
										
										
											2006-04-28 00:08:18 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-02-21 05:36:56 +00:00
										 |  |  | 	m_collisionWorld = new CollisionWorld(dispatcher,broadphase); | 
					
						
							| 
									
										
										
										
											2006-04-28 00:08:18 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2005-07-18 05:41:00 +00:00
										 |  |  | 	m_debugDrawer = 0; | 
					
						
							|  |  |  | 	m_gravity = SimdVector3(0.f,-10.f,0.f); | 
					
						
							| 
									
										
										
										
											2006-04-28 00:08:18 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2005-07-18 05:41:00 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void	CcdPhysicsEnvironment::addCcdPhysicsController(CcdPhysicsController* ctrl) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2006-02-21 05:36:56 +00:00
										 |  |  | 	RigidBody* body = ctrl->GetRigidBody(); | 
					
						
							| 
									
										
										
										
											2006-04-28 00:08:18 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-04-17 01:33:10 +00:00
										 |  |  | 	//this m_userPointer is just used for triggers, see CallbackTriggers
 | 
					
						
							|  |  |  | 	body->m_userPointer = ctrl; | 
					
						
							| 
									
										
										
										
											2006-02-21 05:36:56 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	body->setGravity( m_gravity ); | 
					
						
							| 
									
										
										
										
											2005-07-18 05:41:00 +00:00
										 |  |  | 	m_controllers.push_back(ctrl); | 
					
						
							| 
									
										
										
										
											2006-04-28 00:08:18 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-02-21 05:36:56 +00:00
										 |  |  | 	m_collisionWorld->AddCollisionObject(body); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	assert(body->m_broadphaseHandle); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	BroadphaseInterface* scene =  GetBroadphase(); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-04-28 00:08:18 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2005-07-18 05:41:00 +00:00
										 |  |  | 	CollisionShape* shapeinterface = ctrl->GetCollisionShape(); | 
					
						
							| 
									
										
										
										
											2006-04-28 00:08:18 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2005-07-18 05:41:00 +00:00
										 |  |  | 	assert(shapeinterface); | 
					
						
							| 
									
										
										
										
											2006-04-28 00:08:18 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2005-07-18 05:41:00 +00:00
										 |  |  | 	const SimdTransform& t = ctrl->GetRigidBody()->getCenterOfMassTransform(); | 
					
						
							| 
									
										
										
										
											2006-04-28 00:08:18 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2005-07-18 05:41:00 +00:00
										 |  |  | 	SimdPoint3 minAabb,maxAabb; | 
					
						
							| 
									
										
										
										
											2006-04-28 00:08:18 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2005-07-18 05:41:00 +00:00
										 |  |  | 	shapeinterface->GetAabb(t,minAabb,maxAabb); | 
					
						
							| 
									
										
										
										
											2006-04-28 00:08:18 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2005-07-18 05:41:00 +00:00
										 |  |  | 	float timeStep = 0.02f; | 
					
						
							| 
									
										
										
										
											2006-04-28 00:08:18 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2005-07-18 05:41:00 +00:00
										 |  |  | 	//extent it with the motion
 | 
					
						
							| 
									
										
										
										
											2006-04-28 00:08:18 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2005-07-18 05:41:00 +00:00
										 |  |  | 	SimdVector3 linMotion = body->getLinearVelocity()*timeStep; | 
					
						
							| 
									
										
										
										
											2006-04-28 00:08:18 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2005-07-18 05:41:00 +00:00
										 |  |  | 	float maxAabbx = maxAabb.getX(); | 
					
						
							|  |  |  | 	float maxAabby = maxAabb.getY(); | 
					
						
							|  |  |  | 	float maxAabbz = maxAabb.getZ(); | 
					
						
							|  |  |  | 	float minAabbx = minAabb.getX(); | 
					
						
							|  |  |  | 	float minAabby = minAabb.getY(); | 
					
						
							|  |  |  | 	float minAabbz = minAabb.getZ(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	if (linMotion.x() > 0.f) | 
					
						
							|  |  |  | 		maxAabbx += linMotion.x();  | 
					
						
							|  |  |  | 	else | 
					
						
							|  |  |  | 		minAabbx += linMotion.x(); | 
					
						
							|  |  |  | 	if (linMotion.y() > 0.f) | 
					
						
							|  |  |  | 		maxAabby += linMotion.y();  | 
					
						
							|  |  |  | 	else | 
					
						
							|  |  |  | 		minAabby += linMotion.y(); | 
					
						
							|  |  |  | 	if (linMotion.z() > 0.f) | 
					
						
							|  |  |  | 		maxAabbz += linMotion.z();  | 
					
						
							|  |  |  | 	else | 
					
						
							|  |  |  | 		minAabbz += linMotion.z(); | 
					
						
							| 
									
										
										
										
											2006-04-28 00:08:18 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2005-07-18 05:41:00 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	minAabb = SimdVector3(minAabbx,minAabby,minAabbz); | 
					
						
							|  |  |  | 	maxAabb = SimdVector3(maxAabbx,maxAabby,maxAabbz); | 
					
						
							| 
									
										
										
										
											2006-04-28 00:08:18 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2005-07-18 05:41:00 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void	CcdPhysicsEnvironment::removeCcdPhysicsController(CcdPhysicsController* ctrl) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2006-04-28 00:08:18 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2005-07-18 05:41:00 +00:00
										 |  |  | 	//also remove constraint
 | 
					
						
							| 
									
										
										
										
											2006-04-28 00:08:18 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2005-07-18 05:41:00 +00:00
										 |  |  | 	{ | 
					
						
							| 
									
										
										
										
											2006-04-06 20:37:38 +00:00
										 |  |  | 		std::vector<TypedConstraint*>::iterator i; | 
					
						
							| 
									
										
										
										
											2006-04-28 00:08:18 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-04-06 20:37:38 +00:00
										 |  |  | 		for (i=m_constraints.begin(); | 
					
						
							| 
									
										
										
										
											2006-04-28 00:08:18 +00:00
										 |  |  | 			!(i==m_constraints.end()); i++) | 
					
						
							| 
									
										
										
										
											2005-07-18 05:41:00 +00:00
										 |  |  | 		{ | 
					
						
							| 
									
										
										
										
											2006-04-06 20:37:38 +00:00
										 |  |  | 			TypedConstraint* constraint = (*i); | 
					
						
							|  |  |  | 			if  ((&constraint->GetRigidBodyA() == ctrl->GetRigidBody() || | 
					
						
							|  |  |  | 				(&constraint->GetRigidBodyB() == ctrl->GetRigidBody()))) | 
					
						
							| 
									
										
										
										
											2005-07-18 05:41:00 +00:00
										 |  |  | 			{ | 
					
						
							| 
									
										
										
										
											2006-04-28 00:08:18 +00:00
										 |  |  | 				removeConstraint(constraint->GetUserConstraintId()); | 
					
						
							| 
									
										
										
										
											2005-07-18 05:41:00 +00:00
										 |  |  | 				//only 1 constraint per constroller
 | 
					
						
							|  |  |  | 				break; | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2006-04-28 00:08:18 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2005-07-18 05:41:00 +00:00
										 |  |  | 	{ | 
					
						
							| 
									
										
										
										
											2006-04-06 20:37:38 +00:00
										 |  |  | 		std::vector<TypedConstraint*>::iterator i; | 
					
						
							| 
									
										
										
										
											2006-04-28 00:08:18 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-04-06 20:37:38 +00:00
										 |  |  | 		for (i=m_constraints.begin(); | 
					
						
							| 
									
										
										
										
											2006-04-28 00:08:18 +00:00
										 |  |  | 			!(i==m_constraints.end()); i++) | 
					
						
							| 
									
										
										
										
											2005-07-18 05:41:00 +00:00
										 |  |  | 		{ | 
					
						
							| 
									
										
										
										
											2006-04-06 20:37:38 +00:00
										 |  |  | 			TypedConstraint* constraint = (*i); | 
					
						
							|  |  |  | 			if  ((&constraint->GetRigidBodyA() == ctrl->GetRigidBody() || | 
					
						
							|  |  |  | 				(&constraint->GetRigidBodyB() == ctrl->GetRigidBody()))) | 
					
						
							| 
									
										
										
										
											2005-07-18 05:41:00 +00:00
										 |  |  | 			{ | 
					
						
							| 
									
										
										
										
											2006-04-06 20:37:38 +00:00
										 |  |  | 				removeConstraint(constraint->GetUserConstraintId()); | 
					
						
							| 
									
										
										
										
											2005-07-18 05:41:00 +00:00
										 |  |  | 				//only 1 constraint per constroller
 | 
					
						
							|  |  |  | 				break; | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2006-04-28 00:08:18 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-02-21 05:36:56 +00:00
										 |  |  | 	m_collisionWorld->RemoveCollisionObject(ctrl->GetRigidBody()); | 
					
						
							| 
									
										
										
										
											2005-12-31 07:20:08 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-04-28 00:08:18 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2005-07-18 05:41:00 +00:00
										 |  |  | 	{ | 
					
						
							|  |  |  | 		std::vector<CcdPhysicsController*>::iterator i = | 
					
						
							|  |  |  | 			std::find(m_controllers.begin(), m_controllers.end(), ctrl); | 
					
						
							|  |  |  | 		if (!(i == m_controllers.end())) | 
					
						
							|  |  |  | 		{ | 
					
						
							|  |  |  | 			std::swap(*i, m_controllers.back()); | 
					
						
							|  |  |  | 			m_controllers.pop_back(); | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2006-04-17 01:33:10 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	//remove it from the triggers
 | 
					
						
							|  |  |  | 	{ | 
					
						
							|  |  |  | 		std::vector<CcdPhysicsController*>::iterator i = | 
					
						
							|  |  |  | 			std::find(m_triggerControllers.begin(), m_triggerControllers.end(), ctrl); | 
					
						
							|  |  |  | 		if (!(i == m_triggerControllers.end())) | 
					
						
							|  |  |  | 		{ | 
					
						
							|  |  |  | 			std::swap(*i, m_triggerControllers.back()); | 
					
						
							|  |  |  | 			m_triggerControllers.pop_back(); | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2006-04-28 00:08:18 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-04-17 01:33:10 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2005-07-18 05:41:00 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-01-01 00:20:50 +00:00
										 |  |  | void	CcdPhysicsEnvironment::beginFrame() | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2005-07-18 05:41:00 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-01-01 00:20:50 +00:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2005-07-18 05:41:00 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-04-13 05:11:34 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2005-07-18 05:41:00 +00:00
										 |  |  | bool	CcdPhysicsEnvironment::proceedDeltaTime(double curTime,float timeStep) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2006-01-15 11:34:55 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-04-28 00:08:18 +00:00
										 |  |  | #ifdef USE_QUICKPROF
 | 
					
						
							| 
									
										
										
										
											2006-04-13 05:11:34 +00:00
										 |  |  | 	//toggle Profiler
 | 
					
						
							|  |  |  | 	if ( m_debugDrawer->GetDebugMode() & IDebugDraw::DBG_ProfileTimings) | 
					
						
							|  |  |  | 	{ | 
					
						
							|  |  |  | 		if (!m_profileTimings) | 
					
						
							|  |  |  | 		{ | 
					
						
							|  |  |  | 			m_profileTimings = 1; | 
					
						
							|  |  |  | 			// To disable profiling, simply comment out the following line.
 | 
					
						
							|  |  |  | 			static int counter = 0; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			char filename[128]; | 
					
						
							|  |  |  | 			sprintf(filename,"quickprof_bullet_timings%i.csv",counter++); | 
					
						
							|  |  |  | 			Profiler::init(filename, Profiler::BLOCK_CYCLE_SECONDS);//BLOCK_TOTAL_MICROSECONDS
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	} else | 
					
						
							|  |  |  | 	{ | 
					
						
							|  |  |  | 		if (m_profileTimings) | 
					
						
							|  |  |  | 		{ | 
					
						
							|  |  |  | 			m_profileTimings = 0; | 
					
						
							|  |  |  | 			Profiler::destroy(); | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2006-04-28 00:08:18 +00:00
										 |  |  | #endif //USE_QUICKPROF
 | 
					
						
							| 
									
										
										
										
											2006-04-13 05:11:34 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-01-15 11:34:55 +00:00
										 |  |  | 	if (!SimdFuzzyZero(timeStep)) | 
					
						
							|  |  |  | 	{ | 
					
						
							| 
									
										
										
										
											2006-04-06 20:37:38 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-04-28 00:08:18 +00:00
										 |  |  | 		// define this in blender, the stepsize is 30 hertz, 60 hertz works much better 
 | 
					
						
							| 
									
										
										
										
											2006-05-10 02:04:21 +00:00
										 |  |  | //#define SPLIT_TIMESTEP 1
 | 
					
						
							| 
									
										
										
										
											2006-04-13 05:11:34 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-04-06 20:37:38 +00:00
										 |  |  | #ifdef SPLIT_TIMESTEP
 | 
					
						
							| 
									
										
										
										
											2006-01-15 11:34:55 +00:00
										 |  |  | 		proceedDeltaTimeOneStep(0.5f*timeStep); | 
					
						
							|  |  |  | 		proceedDeltaTimeOneStep(0.5f*timeStep); | 
					
						
							| 
									
										
										
										
											2006-04-06 20:37:38 +00:00
										 |  |  | #else		
 | 
					
						
							|  |  |  | 		proceedDeltaTimeOneStep(timeStep); | 
					
						
							|  |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2006-01-15 11:34:55 +00:00
										 |  |  | 	} else | 
					
						
							|  |  |  | 	{ | 
					
						
							|  |  |  | 		//todo: interpolate
 | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2006-04-13 05:11:34 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-01-15 11:34:55 +00:00
										 |  |  | 	return true; | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2006-04-28 00:08:18 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-01-15 11:34:55 +00:00
										 |  |  | /// Perform an integration step of duration 'timeStep'.
 | 
					
						
							|  |  |  | bool	CcdPhysicsEnvironment::proceedDeltaTimeOneStep(float timeStep) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2006-04-28 00:08:18 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	//	printf("CcdPhysicsEnvironment::proceedDeltaTime\n");
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-01-12 06:30:01 +00:00
										 |  |  | 	if (SimdFuzzyZero(timeStep)) | 
					
						
							| 
									
										
										
										
											2005-07-18 05:41:00 +00:00
										 |  |  | 		return true; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2005-08-13 08:05:48 +00:00
										 |  |  | 	if (m_debugDrawer) | 
					
						
							|  |  |  | 	{ | 
					
						
							|  |  |  | 		gDisableDeactivation = (m_debugDrawer->GetDebugMode() & IDebugDraw::DBG_NoDeactivation); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-04-28 00:08:18 +00:00
										 |  |  | #ifdef USE_QUICKPROF
 | 
					
						
							| 
									
										
										
										
											2006-04-13 05:11:34 +00:00
										 |  |  | 	Profiler::beginBlock("SyncMotionStates"); | 
					
						
							| 
									
										
										
										
											2006-04-28 00:08:18 +00:00
										 |  |  | #endif //USE_QUICKPROF
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2005-08-08 17:08:42 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2005-07-18 05:41:00 +00:00
										 |  |  | 	//this is needed because scaling is not known in advance, and scaling has to propagate to the shape
 | 
					
						
							|  |  |  | 	if (!m_scalingPropagated) | 
					
						
							|  |  |  | 	{ | 
					
						
							| 
									
										
										
										
											2006-01-01 00:20:50 +00:00
										 |  |  | 		SyncMotionStates(timeStep); | 
					
						
							|  |  |  | 		m_scalingPropagated = true; | 
					
						
							| 
									
										
										
										
											2005-07-18 05:41:00 +00:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-05-11 00:13:42 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-04-28 00:08:18 +00:00
										 |  |  | #ifdef USE_QUICKPROF
 | 
					
						
							| 
									
										
										
										
											2006-04-13 05:11:34 +00:00
										 |  |  | 	Profiler::endBlock("SyncMotionStates"); | 
					
						
							| 
									
										
										
										
											2005-07-18 05:41:00 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-04-13 05:11:34 +00:00
										 |  |  | 	Profiler::beginBlock("predictIntegratedTransform"); | 
					
						
							| 
									
										
										
										
											2006-04-28 00:08:18 +00:00
										 |  |  | #endif //USE_QUICKPROF
 | 
					
						
							| 
									
										
										
										
											2005-07-18 05:41:00 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	{ | 
					
						
							| 
									
										
										
										
											2006-04-28 00:08:18 +00:00
										 |  |  | 		//		std::vector<CcdPhysicsController*>::iterator i;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2005-07-18 05:41:00 +00:00
										 |  |  | 		int k; | 
					
						
							|  |  |  | 		for (k=0;k<GetNumControllers();k++) | 
					
						
							|  |  |  | 		{ | 
					
						
							|  |  |  | 			CcdPhysicsController* ctrl = m_controllers[k]; | 
					
						
							|  |  |  | 			//		SimdTransform predictedTrans;
 | 
					
						
							|  |  |  | 			RigidBody* body = ctrl->GetRigidBody(); | 
					
						
							|  |  |  | 			if (body->GetActivationState() != ISLAND_SLEEPING) | 
					
						
							|  |  |  | 			{ | 
					
						
							| 
									
										
										
										
											2006-05-11 00:13:42 +00:00
										 |  |  | 				if (!body->IsStatic()) | 
					
						
							|  |  |  | 				{ | 
					
						
							|  |  |  | 					body->applyForces( timeStep); | 
					
						
							|  |  |  | 					body->integrateVelocities( timeStep); | 
					
						
							|  |  |  | 					body->predictIntegratedTransform(timeStep,body->m_interpolationWorldTransform); | 
					
						
							|  |  |  | 				} | 
					
						
							| 
									
										
										
										
											2005-07-18 05:41:00 +00:00
										 |  |  | 			} | 
					
						
							| 
									
										
										
										
											2006-04-28 00:08:18 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2005-07-18 05:41:00 +00:00
										 |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2006-04-13 05:11:34 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-04-28 00:08:18 +00:00
										 |  |  | #ifdef USE_QUICKPROF
 | 
					
						
							| 
									
										
										
										
											2006-04-13 05:11:34 +00:00
										 |  |  | 	Profiler::endBlock("predictIntegratedTransform"); | 
					
						
							| 
									
										
										
										
											2006-04-28 00:08:18 +00:00
										 |  |  | #endif //USE_QUICKPROF
 | 
					
						
							| 
									
										
										
										
											2006-04-13 05:11:34 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-02-21 05:36:56 +00:00
										 |  |  | 	BroadphaseInterface*	scene = GetBroadphase(); | 
					
						
							| 
									
										
										
										
											2006-04-28 00:08:18 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2005-07-18 05:41:00 +00:00
										 |  |  | 	//
 | 
					
						
							|  |  |  | 	// collision detection (?)
 | 
					
						
							|  |  |  | 	//
 | 
					
						
							| 
									
										
										
										
											2006-04-28 00:08:18 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #ifdef USE_QUICKPROF
 | 
					
						
							| 
									
										
										
										
											2006-04-13 05:11:34 +00:00
										 |  |  | 	Profiler::beginBlock("DispatchAllCollisionPairs"); | 
					
						
							| 
									
										
										
										
											2006-04-28 00:08:18 +00:00
										 |  |  | #endif //USE_QUICKPROF
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-04-13 05:11:34 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2005-08-03 18:22:30 +00:00
										 |  |  | 	int numsubstep = m_numIterations; | 
					
						
							| 
									
										
										
										
											2006-04-28 00:08:18 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2005-07-18 05:41:00 +00:00
										 |  |  | 	DispatcherInfo dispatchInfo; | 
					
						
							|  |  |  | 	dispatchInfo.m_timeStep = timeStep; | 
					
						
							|  |  |  | 	dispatchInfo.m_stepCount = 0; | 
					
						
							| 
									
										
										
										
											2006-04-13 05:11:34 +00:00
										 |  |  | 	dispatchInfo.m_enableSatConvex = m_enableSatCollisionDetection; | 
					
						
							| 
									
										
										
										
											2005-07-18 05:41:00 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-02-21 05:36:56 +00:00
										 |  |  | 	scene->DispatchAllCollisionPairs(*GetDispatcher(),dispatchInfo);///numsubstep,g);
 | 
					
						
							| 
									
										
										
										
											2005-07-18 05:41:00 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-04-28 00:08:18 +00:00
										 |  |  | #ifdef USE_QUICKPROF
 | 
					
						
							| 
									
										
										
										
											2006-04-13 05:11:34 +00:00
										 |  |  | 	Profiler::endBlock("DispatchAllCollisionPairs"); | 
					
						
							| 
									
										
										
										
											2006-04-28 00:08:18 +00:00
										 |  |  | #endif //USE_QUICKPROF
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2005-07-18 05:41:00 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	int numRigidBodies = m_controllers.size(); | 
					
						
							| 
									
										
										
										
											2006-04-28 00:08:18 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-02-21 05:36:56 +00:00
										 |  |  | 	m_collisionWorld->UpdateActivationState(); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-04-28 00:08:18 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2005-07-18 05:41:00 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	//contacts
 | 
					
						
							| 
									
										
										
										
											2006-04-28 00:08:18 +00:00
										 |  |  | #ifdef USE_QUICKPROF
 | 
					
						
							| 
									
										
										
										
											2006-04-13 05:11:34 +00:00
										 |  |  | 	Profiler::beginBlock("SolveConstraint"); | 
					
						
							| 
									
										
										
										
											2006-04-28 00:08:18 +00:00
										 |  |  | #endif //USE_QUICKPROF
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2005-07-29 18:14:41 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-04-06 20:37:38 +00:00
										 |  |  | 	//solve the regular constraints (point 2 point, hinge, etc)
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	for (int g=0;g<numsubstep;g++) | 
					
						
							|  |  |  | 	{ | 
					
						
							|  |  |  | 		//
 | 
					
						
							|  |  |  | 		// constraint solving
 | 
					
						
							|  |  |  | 		//
 | 
					
						
							| 
									
										
										
										
											2006-04-28 00:08:18 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-04-06 20:37:38 +00:00
										 |  |  | 		int i; | 
					
						
							|  |  |  | 		int numConstraints = m_constraints.size(); | 
					
						
							| 
									
										
										
										
											2006-04-28 00:08:18 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-04-06 20:37:38 +00:00
										 |  |  | 		//point to point constraints
 | 
					
						
							|  |  |  | 		for (i=0;i< numConstraints ; i++ ) | 
					
						
							|  |  |  | 		{ | 
					
						
							|  |  |  | 			TypedConstraint* constraint = m_constraints[i]; | 
					
						
							| 
									
										
										
										
											2006-04-28 00:08:18 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-04-06 20:37:38 +00:00
										 |  |  | 			constraint->BuildJacobian(); | 
					
						
							|  |  |  | 			constraint->SolveConstraint( timeStep ); | 
					
						
							| 
									
										
										
										
											2006-04-28 00:08:18 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-04-06 20:37:38 +00:00
										 |  |  | 		} | 
					
						
							| 
									
										
										
										
											2006-04-28 00:08:18 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-04-06 20:37:38 +00:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2006-04-13 05:11:34 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-04-28 00:08:18 +00:00
										 |  |  | #ifdef USE_QUICKPROF
 | 
					
						
							| 
									
										
										
										
											2006-04-13 05:11:34 +00:00
										 |  |  | 	Profiler::endBlock("SolveConstraint"); | 
					
						
							| 
									
										
										
										
											2006-04-28 00:08:18 +00:00
										 |  |  | #endif //USE_QUICKPROF
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-04-06 20:37:38 +00:00
										 |  |  | 	//solve the vehicles
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-04-28 00:08:18 +00:00
										 |  |  | #ifdef NEW_BULLET_VEHICLE_SUPPORT
 | 
					
						
							|  |  |  | 	//vehicles
 | 
					
						
							|  |  |  | 	int numVehicles = m_wrapperVehicles.size(); | 
					
						
							|  |  |  | 	for (int i=0;i<numVehicles;i++) | 
					
						
							|  |  |  | 	{ | 
					
						
							|  |  |  | 		WrapperVehicle* wrapperVehicle = m_wrapperVehicles[i]; | 
					
						
							|  |  |  | 		RaycastVehicle* vehicle = wrapperVehicle->GetVehicle(); | 
					
						
							|  |  |  | 		vehicle->UpdateVehicle( timeStep); | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2006-04-06 20:37:38 +00:00
										 |  |  | #endif //NEW_BULLET_VEHICLE_SUPPORT
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-04-28 00:08:18 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	struct InplaceSolverIslandCallback : public CollisionDispatcher::IslandCallback | 
					
						
							| 
									
										
										
										
											2006-02-21 05:36:56 +00:00
										 |  |  | 	{ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		ContactSolverInfo& m_solverInfo; | 
					
						
							|  |  |  | 		ConstraintSolver*	m_solver; | 
					
						
							|  |  |  | 		IDebugDraw*	m_debugDrawer; | 
					
						
							| 
									
										
										
										
											2006-04-28 00:08:18 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-02-21 05:36:56 +00:00
										 |  |  | 		InplaceSolverIslandCallback( | 
					
						
							|  |  |  | 			ContactSolverInfo& solverInfo, | 
					
						
							|  |  |  | 			ConstraintSolver*	solver, | 
					
						
							|  |  |  | 			IDebugDraw*	debugDrawer) | 
					
						
							|  |  |  | 			:m_solverInfo(solverInfo), | 
					
						
							|  |  |  | 			m_solver(solver), | 
					
						
							|  |  |  | 			m_debugDrawer(debugDrawer) | 
					
						
							|  |  |  | 		{ | 
					
						
							| 
									
										
										
										
											2006-04-28 00:08:18 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-02-21 05:36:56 +00:00
										 |  |  | 		} | 
					
						
							| 
									
										
										
										
											2006-04-28 00:08:18 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-02-21 05:36:56 +00:00
										 |  |  | 		virtual	void	ProcessIsland(PersistentManifold**	manifolds,int numManifolds) | 
					
						
							|  |  |  | 		{ | 
					
						
							|  |  |  | 			m_solver->SolveGroup( manifolds, numManifolds,m_solverInfo,m_debugDrawer); | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											2006-04-28 00:08:18 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-02-21 05:36:56 +00:00
										 |  |  | 	}; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	m_solverInfo.m_friction = 0.9f; | 
					
						
							|  |  |  | 	m_solverInfo.m_numIterations = m_numIterations; | 
					
						
							|  |  |  | 	m_solverInfo.m_timeStep = timeStep; | 
					
						
							|  |  |  | 	m_solverInfo.m_restitution = 0.f;//m_restitution;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	InplaceSolverIslandCallback	solverCallback( | 
					
						
							| 
									
										
										
										
											2006-04-28 00:08:18 +00:00
										 |  |  | 		m_solverInfo, | 
					
						
							|  |  |  | 		m_solver, | 
					
						
							|  |  |  | 		m_debugDrawer); | 
					
						
							| 
									
										
										
										
											2006-02-21 05:36:56 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-04-28 00:08:18 +00:00
										 |  |  | #ifdef USE_QUICKPROF
 | 
					
						
							| 
									
										
										
										
											2006-04-13 05:11:34 +00:00
										 |  |  | 	Profiler::beginBlock("BuildAndProcessIslands"); | 
					
						
							| 
									
										
										
										
											2006-04-28 00:08:18 +00:00
										 |  |  | #endif //USE_QUICKPROF
 | 
					
						
							| 
									
										
										
										
											2006-04-13 05:11:34 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-04-06 20:37:38 +00:00
										 |  |  | 	/// solve all the contact points and contact friction
 | 
					
						
							| 
									
										
										
										
											2006-02-21 05:36:56 +00:00
										 |  |  | 	GetDispatcher()->BuildAndProcessIslands(numRigidBodies,&solverCallback); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-04-28 00:08:18 +00:00
										 |  |  | #ifdef USE_QUICKPROF
 | 
					
						
							| 
									
										
										
										
											2006-04-13 05:11:34 +00:00
										 |  |  | 	Profiler::endBlock("BuildAndProcessIslands"); | 
					
						
							| 
									
										
										
										
											2006-04-17 01:33:10 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	Profiler::beginBlock("CallbackTriggers"); | 
					
						
							| 
									
										
										
										
											2006-04-28 00:08:18 +00:00
										 |  |  | #endif //USE_QUICKPROF
 | 
					
						
							| 
									
										
										
										
											2006-04-17 01:33:10 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	CallbackTriggers(); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-04-28 00:08:18 +00:00
										 |  |  | #ifdef USE_QUICKPROF
 | 
					
						
							| 
									
										
										
										
											2006-04-17 01:33:10 +00:00
										 |  |  | 	Profiler::endBlock("CallbackTriggers"); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-04-13 05:11:34 +00:00
										 |  |  | 	Profiler::beginBlock("proceedToTransform"); | 
					
						
							| 
									
										
										
										
											2005-07-18 05:41:00 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-04-28 00:08:18 +00:00
										 |  |  | #endif //USE_QUICKPROF
 | 
					
						
							| 
									
										
										
										
											2005-07-18 05:41:00 +00:00
										 |  |  | 	{ | 
					
						
							| 
									
										
										
										
											2005-07-27 09:30:53 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-04-28 00:08:18 +00:00
										 |  |  | 		{ | 
					
						
							| 
									
										
										
										
											2005-08-04 19:07:39 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-04-28 00:08:18 +00:00
										 |  |  | 			 | 
					
						
							|  |  |  | 			 | 
					
						
							|  |  |  | 			UpdateAabbs(timeStep); | 
					
						
							| 
									
										
										
										
											2005-08-04 19:07:39 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2005-07-18 05:41:00 +00:00
										 |  |  | 			float toi = 1.f; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-04-28 00:08:18 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2005-08-03 18:22:30 +00:00
										 |  |  | 			if (m_ccdMode == 3) | 
					
						
							| 
									
										
										
										
											2005-07-18 05:41:00 +00:00
										 |  |  | 			{ | 
					
						
							|  |  |  | 				DispatcherInfo dispatchInfo; | 
					
						
							|  |  |  | 				dispatchInfo.m_timeStep = timeStep; | 
					
						
							|  |  |  | 				dispatchInfo.m_stepCount = 0; | 
					
						
							|  |  |  | 				dispatchInfo.m_dispatchFunc = DispatcherInfo::DISPATCH_CONTINUOUS; | 
					
						
							| 
									
										
										
										
											2006-04-28 00:08:18 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-02-21 05:36:56 +00:00
										 |  |  | 				scene->DispatchAllCollisionPairs( *GetDispatcher(),dispatchInfo);///numsubstep,g);
 | 
					
						
							| 
									
										
										
										
											2005-07-18 05:41:00 +00:00
										 |  |  | 				toi = dispatchInfo.m_timeOfImpact; | 
					
						
							| 
									
										
										
										
											2006-04-28 00:08:18 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2005-07-18 05:41:00 +00:00
										 |  |  | 			} | 
					
						
							| 
									
										
										
										
											2006-04-28 00:08:18 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2005-07-18 05:41:00 +00:00
										 |  |  | 			 | 
					
						
							| 
									
										
										
										
											2006-04-28 00:08:18 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2005-07-18 05:41:00 +00:00
										 |  |  | 			//
 | 
					
						
							|  |  |  | 			// integrating solution
 | 
					
						
							|  |  |  | 			//
 | 
					
						
							| 
									
										
										
										
											2006-04-28 00:08:18 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2005-07-18 05:41:00 +00:00
										 |  |  | 			{ | 
					
						
							|  |  |  | 				 | 
					
						
							| 
									
										
										
										
											2006-04-28 00:08:18 +00:00
										 |  |  | 				std::vector<CcdPhysicsController*>::iterator i; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2005-07-18 05:41:00 +00:00
										 |  |  | 				for (i=m_controllers.begin(); | 
					
						
							| 
									
										
										
										
											2006-04-28 00:08:18 +00:00
										 |  |  | 					!(i==m_controllers.end()); i++) | 
					
						
							| 
									
										
										
										
											2005-07-18 05:41:00 +00:00
										 |  |  | 				{ | 
					
						
							| 
									
										
										
										
											2006-04-28 00:08:18 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2005-07-18 05:41:00 +00:00
										 |  |  | 					CcdPhysicsController* ctrl = *i; | 
					
						
							| 
									
										
										
										
											2006-04-28 00:08:18 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2005-07-18 05:41:00 +00:00
										 |  |  | 					SimdTransform predictedTrans; | 
					
						
							|  |  |  | 					RigidBody* body = ctrl->GetRigidBody(); | 
					
						
							|  |  |  | 					if (body->GetActivationState() != ISLAND_SLEEPING) | 
					
						
							|  |  |  | 					{ | 
					
						
							| 
									
										
										
										
											2006-02-21 05:36:56 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-05-11 00:13:42 +00:00
										 |  |  | 						if (body->IsStatic()) | 
					
						
							|  |  |  | 						{ | 
					
						
							|  |  |  | 							//to calculate velocities next frame
 | 
					
						
							|  |  |  | 							body->saveKinematicState(timeStep); | 
					
						
							|  |  |  | 						} else | 
					
						
							|  |  |  | 						{ | 
					
						
							|  |  |  | 							body->predictIntegratedTransform(timeStep*	toi, predictedTrans); | 
					
						
							|  |  |  | 							body->proceedToTransform( predictedTrans); | 
					
						
							|  |  |  | 						} | 
					
						
							| 
									
										
										
										
											2006-04-28 00:08:18 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2005-07-18 05:41:00 +00:00
										 |  |  | 					} | 
					
						
							|  |  |  | 				} | 
					
						
							| 
									
										
										
										
											2006-04-28 00:08:18 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2005-07-18 05:41:00 +00:00
										 |  |  | 			} | 
					
						
							| 
									
										
										
										
											2006-04-28 00:08:18 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2005-07-18 05:41:00 +00:00
										 |  |  | 			//
 | 
					
						
							|  |  |  | 			// disable sleeping physics objects
 | 
					
						
							|  |  |  | 			//
 | 
					
						
							| 
									
										
										
										
											2006-04-28 00:08:18 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2005-07-18 05:41:00 +00:00
										 |  |  | 			std::vector<CcdPhysicsController*> m_sleepingControllers; | 
					
						
							| 
									
										
										
										
											2006-04-28 00:08:18 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 			std::vector<CcdPhysicsController*>::iterator i; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2005-07-18 05:41:00 +00:00
										 |  |  | 			for (i=m_controllers.begin(); | 
					
						
							| 
									
										
										
										
											2006-04-28 00:08:18 +00:00
										 |  |  | 				!(i==m_controllers.end()); i++) | 
					
						
							| 
									
										
										
										
											2005-07-18 05:41:00 +00:00
										 |  |  | 			{ | 
					
						
							|  |  |  | 				CcdPhysicsController* ctrl = (*i); | 
					
						
							|  |  |  | 				RigidBody* body = ctrl->GetRigidBody(); | 
					
						
							| 
									
										
										
										
											2005-08-04 19:07:39 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 				ctrl->UpdateDeactivation(timeStep); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-04-28 00:08:18 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2005-07-18 05:41:00 +00:00
										 |  |  | 				if (ctrl->wantsSleeping()) | 
					
						
							|  |  |  | 				{ | 
					
						
							|  |  |  | 					if (body->GetActivationState() == ACTIVE_TAG) | 
					
						
							|  |  |  | 						body->SetActivationState( WANTS_DEACTIVATION ); | 
					
						
							|  |  |  | 				} else | 
					
						
							|  |  |  | 				{ | 
					
						
							| 
									
										
										
										
											2006-02-22 06:58:05 +00:00
										 |  |  | 					if (body->GetActivationState() != DISABLE_DEACTIVATION) | 
					
						
							|  |  |  | 						body->SetActivationState( ACTIVE_TAG ); | 
					
						
							| 
									
										
										
										
											2005-07-18 05:41:00 +00:00
										 |  |  | 				} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 				if (useIslands) | 
					
						
							|  |  |  | 				{ | 
					
						
							|  |  |  | 					if (body->GetActivationState() == ISLAND_SLEEPING) | 
					
						
							|  |  |  | 					{ | 
					
						
							|  |  |  | 						m_sleepingControllers.push_back(ctrl); | 
					
						
							|  |  |  | 					} | 
					
						
							|  |  |  | 				} else | 
					
						
							|  |  |  | 				{ | 
					
						
							|  |  |  | 					if (ctrl->wantsSleeping()) | 
					
						
							|  |  |  | 					{ | 
					
						
							|  |  |  | 						m_sleepingControllers.push_back(ctrl); | 
					
						
							|  |  |  | 					} | 
					
						
							|  |  |  | 				} | 
					
						
							|  |  |  | 			} | 
					
						
							| 
									
										
										
										
											2006-02-13 06:28:35 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-04-13 05:11:34 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-02-13 06:28:35 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2005-07-18 05:41:00 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-04-28 00:08:18 +00:00
										 |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #ifdef USE_QUICKPROF
 | 
					
						
							|  |  |  | 		Profiler::endBlock("proceedToTransform"); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		Profiler::beginBlock("SyncMotionStates"); | 
					
						
							|  |  |  | #endif //USE_QUICKPROF
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		SyncMotionStates(timeStep); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #ifdef USE_QUICKPROF
 | 
					
						
							|  |  |  | 		Profiler::endBlock("SyncMotionStates"); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		Profiler::endProfilingCycle(); | 
					
						
							|  |  |  | #endif //USE_QUICKPROF
 | 
					
						
							| 
									
										
										
										
											2006-04-13 05:11:34 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-02-13 06:28:35 +00:00
										 |  |  | #ifdef NEW_BULLET_VEHICLE_SUPPORT
 | 
					
						
							|  |  |  | 		//sync wheels for vehicles
 | 
					
						
							|  |  |  | 		int numVehicles = m_wrapperVehicles.size(); | 
					
						
							|  |  |  | 		for (int i=0;i<numVehicles;i++) | 
					
						
							|  |  |  | 		{ | 
					
						
							|  |  |  | 			WrapperVehicle* wrapperVehicle = m_wrapperVehicles[i]; | 
					
						
							| 
									
										
										
										
											2006-04-28 00:08:18 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-02-13 06:28:35 +00:00
										 |  |  | 			wrapperVehicle->SyncWheels(); | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | #endif //NEW_BULLET_VEHICLE_SUPPORT
 | 
					
						
							| 
									
										
										
										
											2005-07-18 05:41:00 +00:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2006-05-11 00:13:42 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2005-07-18 05:41:00 +00:00
										 |  |  | 	return true; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2005-07-29 18:14:41 +00:00
										 |  |  | void		CcdPhysicsEnvironment::setDebugMode(int debugMode) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	if (m_debugDrawer){ | 
					
						
							|  |  |  | 		m_debugDrawer->SetDebugMode(debugMode); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2005-08-03 18:22:30 +00:00
										 |  |  | void		CcdPhysicsEnvironment::setNumIterations(int numIter) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	m_numIterations = numIter; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | void		CcdPhysicsEnvironment::setDeactivationTime(float dTime) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	gDeactivationTime = dTime; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | void		CcdPhysicsEnvironment::setDeactivationLinearTreshold(float linTresh) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	gLinearSleepingTreshold = linTresh; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | void		CcdPhysicsEnvironment::setDeactivationAngularTreshold(float angTresh)  | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	gAngularSleepingTreshold = angTresh; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | void		CcdPhysicsEnvironment::setContactBreakingTreshold(float contactBreakingTreshold) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	gContactBreakingTreshold = contactBreakingTreshold; | 
					
						
							| 
									
										
										
										
											2006-04-28 00:08:18 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2005-08-03 18:22:30 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void		CcdPhysicsEnvironment::setCcdMode(int ccdMode) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	m_ccdMode = ccdMode; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void		CcdPhysicsEnvironment::setSolverSorConstant(float sor) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2006-02-21 05:36:56 +00:00
										 |  |  | 	m_solverInfo.m_sor = sor; | 
					
						
							| 
									
										
										
										
											2005-08-03 18:22:30 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2005-08-04 19:07:39 +00:00
										 |  |  | void		CcdPhysicsEnvironment::setSolverTau(float tau) | 
					
						
							| 
									
										
										
										
											2005-08-03 18:22:30 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2006-02-21 05:36:56 +00:00
										 |  |  | 	m_solverInfo.m_tau = tau; | 
					
						
							| 
									
										
										
										
											2005-08-03 18:22:30 +00:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2005-08-04 19:07:39 +00:00
										 |  |  | void		CcdPhysicsEnvironment::setSolverDamping(float damping) | 
					
						
							| 
									
										
										
										
											2005-08-03 18:22:30 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2006-02-21 05:36:56 +00:00
										 |  |  | 	m_solverInfo.m_damping = damping; | 
					
						
							| 
									
										
										
										
											2005-08-03 18:22:30 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2005-08-04 19:07:39 +00:00
										 |  |  | void		CcdPhysicsEnvironment::setLinearAirDamping(float damping) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	gLinearAirDamping = damping; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void		CcdPhysicsEnvironment::setUseEpa(bool epa) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	gUseEpa = epa; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void		CcdPhysicsEnvironment::setSolverType(int solverType) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	switch (solverType) | 
					
						
							|  |  |  | 	{ | 
					
						
							|  |  |  | 	case 1: | 
					
						
							|  |  |  | 		{ | 
					
						
							|  |  |  | 			if (m_solverType != solverType) | 
					
						
							|  |  |  | 			{ | 
					
						
							| 
									
										
										
										
											2006-04-28 00:08:18 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-02-21 05:36:56 +00:00
										 |  |  | 				m_solver = new SimpleConstraintSolver(); | 
					
						
							| 
									
										
										
										
											2006-04-28 00:08:18 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2005-08-04 19:07:39 +00:00
										 |  |  | 				break; | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											2006-04-28 00:08:18 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2005-08-04 19:07:39 +00:00
										 |  |  | 	case 0: | 
					
						
							|  |  |  | 	default: | 
					
						
							| 
									
										
										
										
											2006-04-28 00:08:18 +00:00
										 |  |  | 		if (m_solverType != solverType) | 
					
						
							|  |  |  | 		{ | 
					
						
							|  |  |  | 			m_solver = new OdeConstraintSolver(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			break; | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											2005-08-04 19:07:39 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	}; | 
					
						
							| 
									
										
										
										
											2006-04-28 00:08:18 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2005-08-04 19:07:39 +00:00
										 |  |  | 	m_solverType = solverType ; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2005-08-03 18:22:30 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2005-07-29 18:14:41 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2005-07-18 05:41:00 +00:00
										 |  |  | void	CcdPhysicsEnvironment::SyncMotionStates(float timeStep) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	std::vector<CcdPhysicsController*>::iterator i; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	//
 | 
					
						
							|  |  |  | 	// synchronize the physics and graphics transformations
 | 
					
						
							|  |  |  | 	//
 | 
					
						
							| 
									
										
										
										
											2005-08-05 17:00:32 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2005-07-18 05:41:00 +00:00
										 |  |  | 	for (i=m_controllers.begin(); | 
					
						
							| 
									
										
										
										
											2006-04-28 00:08:18 +00:00
										 |  |  | 		!(i==m_controllers.end()); i++) | 
					
						
							| 
									
										
										
										
											2005-07-18 05:41:00 +00:00
										 |  |  | 	{ | 
					
						
							|  |  |  | 		CcdPhysicsController* ctrl = (*i); | 
					
						
							|  |  |  | 		ctrl->SynchronizeMotionStates(timeStep); | 
					
						
							| 
									
										
										
										
											2006-04-28 00:08:18 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2005-07-18 05:41:00 +00:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | void		CcdPhysicsEnvironment::setGravity(float x,float y,float z) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	m_gravity = SimdVector3(x,y,z); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	std::vector<CcdPhysicsController*>::iterator i; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	//todo: review this gravity stuff
 | 
					
						
							|  |  |  | 	for (i=m_controllers.begin(); | 
					
						
							| 
									
										
										
										
											2006-04-28 00:08:18 +00:00
										 |  |  | 		!(i==m_controllers.end()); i++) | 
					
						
							| 
									
										
										
										
											2005-07-18 05:41:00 +00:00
										 |  |  | 	{ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		CcdPhysicsController* ctrl = (*i); | 
					
						
							|  |  |  | 		ctrl->GetRigidBody()->setGravity(m_gravity); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-02-13 06:28:35 +00:00
										 |  |  | #ifdef NEW_BULLET_VEHICLE_SUPPORT
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-04-06 20:37:38 +00:00
										 |  |  | class DefaultVehicleRaycaster : public VehicleRaycaster | 
					
						
							| 
									
										
										
										
											2006-02-13 06:28:35 +00:00
										 |  |  | { | 
					
						
							|  |  |  | 	CcdPhysicsEnvironment* m_physEnv; | 
					
						
							|  |  |  | 	PHY_IPhysicsController*	m_chassis; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | public: | 
					
						
							| 
									
										
										
										
											2006-04-06 20:37:38 +00:00
										 |  |  | 	DefaultVehicleRaycaster(CcdPhysicsEnvironment* physEnv,PHY_IPhysicsController* chassis): | 
					
						
							| 
									
										
										
										
											2006-04-28 00:08:18 +00:00
										 |  |  | 	  m_physEnv(physEnv), | 
					
						
							|  |  |  | 		  m_chassis(chassis) | 
					
						
							|  |  |  | 	  { | 
					
						
							|  |  |  | 	  } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	  /*	struct VehicleRaycasterResult
 | 
					
						
							|  |  |  | 	  { | 
					
						
							|  |  |  | 	  VehicleRaycasterResult() :m_distFraction(-1.f){}; | 
					
						
							|  |  |  | 	  SimdVector3	m_hitPointInWorld; | 
					
						
							|  |  |  | 	  SimdVector3	m_hitNormalInWorld; | 
					
						
							|  |  |  | 	  SimdScalar	m_distFraction; | 
					
						
							|  |  |  | 	  }; | 
					
						
							|  |  |  | 	  */ | 
					
						
							|  |  |  | 	  virtual void* CastRay(const SimdVector3& from,const SimdVector3& to, VehicleRaycasterResult& result) | 
					
						
							|  |  |  | 	  { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		  float hit[3]; | 
					
						
							|  |  |  | 		  float normal[3]; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		  PHY_IPhysicsController*	ignore = m_chassis; | 
					
						
							|  |  |  | 		  void* hitObject = m_physEnv->rayTest(ignore,from.x(),from.y(),from.z(),to.x(),to.y(),to.z(),hit[0],hit[1],hit[2],normal[0],normal[1],normal[2]); | 
					
						
							|  |  |  | 		  if (hitObject) | 
					
						
							|  |  |  | 		  { | 
					
						
							|  |  |  | 			  result.m_hitPointInWorld[0] = hit[0]; | 
					
						
							|  |  |  | 			  result.m_hitPointInWorld[1] = hit[1]; | 
					
						
							|  |  |  | 			  result.m_hitPointInWorld[2] = hit[2]; | 
					
						
							|  |  |  | 			  result.m_hitNormalInWorld[0] = normal[0]; | 
					
						
							|  |  |  | 			  result.m_hitNormalInWorld[1] = normal[1]; | 
					
						
							|  |  |  | 			  result.m_hitNormalInWorld[2] = normal[2]; | 
					
						
							|  |  |  | 			  result.m_hitNormalInWorld.normalize(); | 
					
						
							|  |  |  | 			  //calc fraction? or put it in the interface?
 | 
					
						
							|  |  |  | 			  //calc for now
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			  result.m_distFraction = (result.m_hitPointInWorld-from).length() / (to-from).length(); | 
					
						
							|  |  |  | 			  //some safety for 'explosion' due to sudden penetration of the full 'ray'
 | 
					
						
							|  |  |  | 			  /*			if (result.m_distFraction<0.1)
 | 
					
						
							|  |  |  | 			  { | 
					
						
							|  |  |  | 			  printf("Vehicle Raycast: avoided instability due to penetration. Consider moving the connection points deeper inside vehicle chassis"); | 
					
						
							|  |  |  | 			  result.m_distFraction = 1.f; | 
					
						
							|  |  |  | 			  hitObject = 0; | 
					
						
							|  |  |  | 			  } | 
					
						
							|  |  |  | 			  */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			  /*			if (result.m_distFraction>1.)
 | 
					
						
							|  |  |  | 			  { | 
					
						
							|  |  |  | 			  printf("Vehicle Raycast: avoided instability 1Consider moving the connection points deeper inside vehicle chassis");				 | 
					
						
							|  |  |  | 			  result.m_distFraction = 1.f; | 
					
						
							|  |  |  | 			  hitObject = 0; | 
					
						
							|  |  |  | 			  } | 
					
						
							|  |  |  | 			  */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		  } | 
					
						
							|  |  |  | 		  //?
 | 
					
						
							|  |  |  | 		  return hitObject; | 
					
						
							|  |  |  | 	  } | 
					
						
							| 
									
										
										
										
											2006-02-13 06:28:35 +00:00
										 |  |  | }; | 
					
						
							|  |  |  | #endif //NEW_BULLET_VEHICLE_SUPPORT
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static int gConstraintUid = 1; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2005-07-18 05:41:00 +00:00
										 |  |  | int			CcdPhysicsEnvironment::createConstraint(class PHY_IPhysicsController* ctrl0,class PHY_IPhysicsController* ctrl1,PHY_ConstraintType type, | 
					
						
							| 
									
										
										
										
											2006-04-28 00:08:18 +00:00
										 |  |  | 													float pivotX,float pivotY,float pivotZ, | 
					
						
							|  |  |  | 													float axisX,float axisY,float axisZ) | 
					
						
							| 
									
										
										
										
											2005-07-18 05:41:00 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2006-04-28 00:08:18 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2005-07-18 05:41:00 +00:00
										 |  |  | 	CcdPhysicsController* c0 = (CcdPhysicsController*)ctrl0; | 
					
						
							|  |  |  | 	CcdPhysicsController* c1 = (CcdPhysicsController*)ctrl1; | 
					
						
							| 
									
										
										
										
											2006-04-28 00:08:18 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2005-07-18 05:41:00 +00:00
										 |  |  | 	RigidBody* rb0 = c0 ? c0->GetRigidBody() : 0; | 
					
						
							|  |  |  | 	RigidBody* rb1 = c1 ? c1->GetRigidBody() : 0; | 
					
						
							| 
									
										
										
										
											2006-04-28 00:08:18 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2005-07-18 05:41:00 +00:00
										 |  |  | 	ASSERT(rb0); | 
					
						
							| 
									
										
										
										
											2006-04-28 00:08:18 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2005-07-18 05:41:00 +00:00
										 |  |  | 	SimdVector3 pivotInA(pivotX,pivotY,pivotZ); | 
					
						
							|  |  |  | 	SimdVector3 pivotInB = rb1 ? rb1->getCenterOfMassTransform().inverse()(rb0->getCenterOfMassTransform()(pivotInA)) : pivotInA; | 
					
						
							| 
									
										
										
										
											2006-04-06 20:37:38 +00:00
										 |  |  | 	SimdVector3 axisInA(axisX,axisY,axisZ); | 
					
						
							|  |  |  | 	SimdVector3 axisInB = rb1 ?  | 
					
						
							|  |  |  | 		(rb1->getCenterOfMassTransform().getBasis().inverse()*(rb0->getCenterOfMassTransform().getBasis() * -axisInA)) :  | 
					
						
							|  |  |  | 	rb0->getCenterOfMassTransform().getBasis() * -axisInA; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-04-28 00:08:18 +00:00
										 |  |  | 	bool angularOnly = false; | 
					
						
							| 
									
										
										
										
											2006-04-26 06:01:46 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2005-07-18 05:41:00 +00:00
										 |  |  | 	switch (type) | 
					
						
							|  |  |  | 	{ | 
					
						
							|  |  |  | 	case PHY_POINT2POINT_CONSTRAINT: | 
					
						
							|  |  |  | 		{ | 
					
						
							| 
									
										
										
										
											2006-04-28 00:08:18 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2005-07-18 05:41:00 +00:00
										 |  |  | 			Point2PointConstraint* p2p = 0; | 
					
						
							| 
									
										
										
										
											2006-04-28 00:08:18 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2005-07-18 05:41:00 +00:00
										 |  |  | 			if (rb1) | 
					
						
							|  |  |  | 			{ | 
					
						
							|  |  |  | 				p2p = new Point2PointConstraint(*rb0, | 
					
						
							|  |  |  | 					*rb1,pivotInA,pivotInB); | 
					
						
							|  |  |  | 			} else | 
					
						
							|  |  |  | 			{ | 
					
						
							|  |  |  | 				p2p = new Point2PointConstraint(*rb0, | 
					
						
							|  |  |  | 					pivotInA); | 
					
						
							|  |  |  | 			} | 
					
						
							| 
									
										
										
										
											2006-04-28 00:08:18 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-04-06 20:37:38 +00:00
										 |  |  | 			m_constraints.push_back(p2p); | 
					
						
							| 
									
										
										
										
											2006-02-13 06:28:35 +00:00
										 |  |  | 			p2p->SetUserConstraintId(gConstraintUid++); | 
					
						
							|  |  |  | 			p2p->SetUserConstraintType(type); | 
					
						
							| 
									
										
										
										
											2006-01-15 11:34:55 +00:00
										 |  |  | 			//64 bit systems can't cast pointer to int. could use size_t instead.
 | 
					
						
							| 
									
										
										
										
											2006-02-13 06:28:35 +00:00
										 |  |  | 			return p2p->GetUserConstraintId(); | 
					
						
							| 
									
										
										
										
											2006-04-28 00:08:18 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2005-07-18 05:41:00 +00:00
										 |  |  | 			break; | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											2006-04-06 20:37:38 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-04-26 06:01:46 +00:00
										 |  |  | 	case PHY_ANGULAR_CONSTRAINT: | 
					
						
							| 
									
										
										
										
											2006-04-28 00:08:18 +00:00
										 |  |  | 		angularOnly = true; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-04-06 20:37:38 +00:00
										 |  |  | 	case PHY_LINEHINGE_CONSTRAINT: | 
					
						
							|  |  |  | 		{ | 
					
						
							|  |  |  | 			HingeConstraint* hinge = 0; | 
					
						
							| 
									
										
										
										
											2006-04-28 00:08:18 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-04-06 20:37:38 +00:00
										 |  |  | 			if (rb1) | 
					
						
							|  |  |  | 			{ | 
					
						
							|  |  |  | 				hinge = new HingeConstraint( | 
					
						
							|  |  |  | 					*rb0, | 
					
						
							|  |  |  | 					*rb1,pivotInA,pivotInB,axisInA,axisInB); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			} else | 
					
						
							|  |  |  | 			{ | 
					
						
							|  |  |  | 				hinge = new HingeConstraint(*rb0, | 
					
						
							|  |  |  | 					pivotInA,axisInA); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			} | 
					
						
							| 
									
										
										
										
											2006-04-28 00:08:18 +00:00
										 |  |  | 			hinge->setAngularOnly(angularOnly); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-04-06 20:37:38 +00:00
										 |  |  | 			m_constraints.push_back(hinge); | 
					
						
							|  |  |  | 			hinge->SetUserConstraintId(gConstraintUid++); | 
					
						
							|  |  |  | 			hinge->SetUserConstraintType(type); | 
					
						
							|  |  |  | 			//64 bit systems can't cast pointer to int. could use size_t instead.
 | 
					
						
							|  |  |  | 			return hinge->GetUserConstraintId(); | 
					
						
							|  |  |  | 			break; | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											2006-02-13 06:28:35 +00:00
										 |  |  | #ifdef NEW_BULLET_VEHICLE_SUPPORT
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	case PHY_VEHICLE_CONSTRAINT: | 
					
						
							|  |  |  | 		{ | 
					
						
							| 
									
										
										
										
											2006-02-21 05:36:56 +00:00
										 |  |  | 			RaycastVehicle::VehicleTuning* tuning = new RaycastVehicle::VehicleTuning(); | 
					
						
							| 
									
										
										
										
											2006-02-13 06:28:35 +00:00
										 |  |  | 			RigidBody* chassis = rb0; | 
					
						
							| 
									
										
										
										
											2006-04-06 20:37:38 +00:00
										 |  |  | 			DefaultVehicleRaycaster* raycaster = new DefaultVehicleRaycaster(this,ctrl0); | 
					
						
							| 
									
										
										
										
											2006-02-13 06:28:35 +00:00
										 |  |  | 			RaycastVehicle* vehicle = new RaycastVehicle(*tuning,chassis,raycaster); | 
					
						
							|  |  |  | 			WrapperVehicle* wrapperVehicle = new WrapperVehicle(vehicle,ctrl0); | 
					
						
							|  |  |  | 			m_wrapperVehicles.push_back(wrapperVehicle); | 
					
						
							|  |  |  | 			vehicle->SetUserConstraintId(gConstraintUid++); | 
					
						
							|  |  |  | 			vehicle->SetUserConstraintType(type); | 
					
						
							|  |  |  | 			return vehicle->GetUserConstraintId(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			break; | 
					
						
							|  |  |  | 		}; | 
					
						
							|  |  |  | #endif //NEW_BULLET_VEHICLE_SUPPORT
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2005-07-18 05:41:00 +00:00
										 |  |  | 	default: | 
					
						
							|  |  |  | 		{ | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	}; | 
					
						
							| 
									
										
										
										
											2006-04-28 00:08:18 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2005-07-18 05:41:00 +00:00
										 |  |  | 	//RigidBody& rbA,RigidBody& rbB, const SimdVector3& pivotInA,const SimdVector3& pivotInB
 | 
					
						
							| 
									
										
										
										
											2006-04-28 00:08:18 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2005-07-18 05:41:00 +00:00
										 |  |  | 	return 0; | 
					
						
							| 
									
										
										
										
											2006-04-28 00:08:18 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2005-07-18 05:41:00 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-01-15 11:34:55 +00:00
										 |  |  | void		CcdPhysicsEnvironment::removeConstraint(int	constraintId) | 
					
						
							| 
									
										
										
										
											2005-07-18 05:41:00 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2006-04-06 20:37:38 +00:00
										 |  |  | 	std::vector<TypedConstraint*>::iterator i; | 
					
						
							| 
									
										
										
										
											2006-04-28 00:08:18 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	for (i=m_constraints.begin(); | 
					
						
							| 
									
										
										
										
											2006-04-06 20:37:38 +00:00
										 |  |  | 		!(i==m_constraints.end()); i++) | 
					
						
							| 
									
										
										
										
											2006-04-28 00:08:18 +00:00
										 |  |  | 	{ | 
					
						
							|  |  |  | 		TypedConstraint* constraint = (*i); | 
					
						
							|  |  |  | 		if (constraint->GetUserConstraintId() == constraintId) | 
					
						
							| 
									
										
										
										
											2006-01-15 11:34:55 +00:00
										 |  |  | 		{ | 
					
						
							| 
									
										
										
										
											2006-04-28 00:08:18 +00:00
										 |  |  | 			std::swap(*i, m_constraints.back()); | 
					
						
							|  |  |  | 			m_constraints.pop_back(); | 
					
						
							|  |  |  | 			break; | 
					
						
							| 
									
										
										
										
											2006-01-15 11:34:55 +00:00
										 |  |  | 		} | 
					
						
							| 
									
										
										
										
											2006-04-28 00:08:18 +00:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2005-07-18 05:41:00 +00:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2005-08-05 17:00:32 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-05-09 01:15:12 +00:00
										 |  |  | 	struct	FilterClosestRayResultCallback : public CollisionWorld::ClosestRayResultCallback | 
					
						
							| 
									
										
										
										
											2006-04-28 00:08:18 +00:00
										 |  |  | 	{ | 
					
						
							|  |  |  | 		PHY_IPhysicsController*	m_ignoreClient; | 
					
						
							| 
									
										
										
										
											2005-08-05 17:00:32 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-04-28 00:08:18 +00:00
										 |  |  | 		FilterClosestRayResultCallback (PHY_IPhysicsController* ignoreClient,const SimdVector3& rayFrom,const SimdVector3& rayTo) | 
					
						
							|  |  |  | 			: CollisionWorld::ClosestRayResultCallback(rayFrom,rayTo), | 
					
						
							|  |  |  | 			m_ignoreClient(ignoreClient) | 
					
						
							| 
									
										
										
										
											2006-02-13 06:28:35 +00:00
										 |  |  | 		{ | 
					
						
							| 
									
										
										
										
											2005-08-17 19:52:56 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-04-28 00:08:18 +00:00
										 |  |  | 		} | 
					
						
							| 
									
										
										
										
											2005-08-17 19:52:56 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-05-09 01:15:12 +00:00
										 |  |  | 		virtual ~FilterClosestRayResultCallback() | 
					
						
							|  |  |  | 		{ | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-04-28 00:08:18 +00:00
										 |  |  | 		virtual	float	AddSingleResult(const CollisionWorld::LocalRayResult& rayResult) | 
					
						
							|  |  |  | 		{ | 
					
						
							|  |  |  | 			CcdPhysicsController* curHit = static_cast<CcdPhysicsController*>(rayResult.m_collisionObject->m_userPointer); | 
					
						
							|  |  |  | 			//ignore client...
 | 
					
						
							|  |  |  | 			if (curHit != m_ignoreClient) | 
					
						
							|  |  |  | 			{		 | 
					
						
							|  |  |  | 				//if valid
 | 
					
						
							| 
									
										
										
										
											2006-05-09 01:15:12 +00:00
										 |  |  | 				return ClosestRayResultCallback::AddSingleResult(rayResult); | 
					
						
							| 
									
										
										
										
											2005-08-05 17:00:32 +00:00
										 |  |  | 			} | 
					
						
							| 
									
										
										
										
											2006-05-09 01:15:12 +00:00
										 |  |  | 			return m_closestHitFraction; | 
					
						
							| 
									
										
										
										
											2006-04-28 00:08:18 +00:00
										 |  |  | 		} | 
					
						
							| 
									
										
										
										
											2005-08-17 19:52:56 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-04-28 00:08:18 +00:00
										 |  |  | 	}; | 
					
						
							| 
									
										
										
										
											2005-08-17 19:52:56 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-05-09 01:15:12 +00:00
										 |  |  | PHY_IPhysicsController* CcdPhysicsEnvironment::rayTest(PHY_IPhysicsController* ignoreClient, float fromX,float fromY,float fromZ, float toX,float toY,float toZ,  | 
					
						
							|  |  |  | 													   float& hitX,float& hitY,float& hitZ,float& normalX,float& normalY,float& normalZ) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	float minFraction = 1.f; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	SimdVector3 rayFrom(fromX,fromY,fromZ); | 
					
						
							|  |  |  | 	SimdVector3 rayTo(toX,toY,toZ); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	SimdVector3	hitPointWorld,normalWorld; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	//Either Ray Cast with or without filtering
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	//CollisionWorld::ClosestRayResultCallback rayCallback(rayFrom,rayTo);
 | 
					
						
							|  |  |  | 	FilterClosestRayResultCallback	 rayCallback(ignoreClient,rayFrom,rayTo); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2005-08-17 19:52:56 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-04-28 00:08:18 +00:00
										 |  |  | 	PHY_IPhysicsController* nearestHit = 0; | 
					
						
							| 
									
										
										
										
											2005-08-17 19:52:56 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-04-28 00:08:18 +00:00
										 |  |  | 	m_collisionWorld->RayTest(rayFrom,rayTo,rayCallback); | 
					
						
							|  |  |  | 	if (rayCallback.HasHit()) | 
					
						
							|  |  |  | 	{ | 
					
						
							|  |  |  | 		nearestHit = static_cast<CcdPhysicsController*>(rayCallback.m_collisionObject->m_userPointer); | 
					
						
							|  |  |  | 		hitX = 	rayCallback.m_hitPointWorld.getX(); | 
					
						
							|  |  |  | 		hitY = 	rayCallback.m_hitPointWorld.getY(); | 
					
						
							|  |  |  | 		hitZ = 	rayCallback.m_hitPointWorld.getZ(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		normalX = rayCallback.m_hitNormalWorld.getX(); | 
					
						
							|  |  |  | 		normalY = rayCallback.m_hitNormalWorld.getY(); | 
					
						
							|  |  |  | 		normalZ = rayCallback.m_hitNormalWorld.getZ(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	}	 | 
					
						
							| 
									
										
										
										
											2006-02-21 05:36:56 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2005-08-05 17:00:32 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	return nearestHit; | 
					
						
							| 
									
										
										
										
											2005-07-18 05:41:00 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | int	CcdPhysicsEnvironment::getNumContactPoints() | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	return 0; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void CcdPhysicsEnvironment::getContactPoint(int i,float& hitX,float& hitY,float& hitZ,float& normalX,float& normalY,float& normalZ) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2006-04-28 00:08:18 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2005-07-18 05:41:00 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-02-21 05:36:56 +00:00
										 |  |  | BroadphaseInterface*	CcdPhysicsEnvironment::GetBroadphase() | 
					
						
							|  |  |  | {  | 
					
						
							|  |  |  | 	return m_collisionWorld->GetBroadphase();  | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | const CollisionDispatcher* CcdPhysicsEnvironment::GetDispatcher() const | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	return m_collisionWorld->GetDispatcher(); | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2005-07-18 05:41:00 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-02-21 05:36:56 +00:00
										 |  |  | CollisionDispatcher* CcdPhysicsEnvironment::GetDispatcher() | 
					
						
							| 
									
										
										
										
											2005-07-18 05:41:00 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2006-02-21 05:36:56 +00:00
										 |  |  | 	return m_collisionWorld->GetDispatcher(); | 
					
						
							| 
									
										
										
										
											2005-07-18 05:41:00 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | CcdPhysicsEnvironment::~CcdPhysicsEnvironment() | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2006-04-28 00:08:18 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-02-13 06:28:35 +00:00
										 |  |  | #ifdef NEW_BULLET_VEHICLE_SUPPORT
 | 
					
						
							|  |  |  | 	m_wrapperVehicles.clear(); | 
					
						
							|  |  |  | #endif //NEW_BULLET_VEHICLE_SUPPORT
 | 
					
						
							| 
									
										
										
										
											2006-04-28 00:08:18 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2005-07-18 05:41:00 +00:00
										 |  |  | 	//m_broadphase->DestroyScene();
 | 
					
						
							|  |  |  | 	//delete broadphase ? release reference on broadphase ?
 | 
					
						
							| 
									
										
										
										
											2006-04-28 00:08:18 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2005-07-18 05:41:00 +00:00
										 |  |  | 	//first delete scene, then dispatcher, because pairs have to release manifolds on the dispatcher
 | 
					
						
							| 
									
										
										
										
											2006-02-21 05:36:56 +00:00
										 |  |  | 	//delete m_dispatcher;
 | 
					
						
							|  |  |  | 	delete m_collisionWorld; | 
					
						
							| 
									
										
										
										
											2006-04-28 00:08:18 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2005-07-18 05:41:00 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | int	CcdPhysicsEnvironment::GetNumControllers() | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	return m_controllers.size(); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | CcdPhysicsController* CcdPhysicsEnvironment::GetPhysicsController( int index) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	return m_controllers[index]; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | int	CcdPhysicsEnvironment::GetNumManifolds() const | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2006-02-21 05:36:56 +00:00
										 |  |  | 	return GetDispatcher()->GetNumManifolds(); | 
					
						
							| 
									
										
										
										
											2005-07-18 05:41:00 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | const PersistentManifold*	CcdPhysicsEnvironment::GetManifold(int index) const | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2006-02-21 05:36:56 +00:00
										 |  |  | 	return GetDispatcher()->GetManifoldByIndexInternal(index); | 
					
						
							| 
									
										
										
										
											2005-07-18 05:41:00 +00:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2006-02-13 06:28:35 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-04-06 20:37:38 +00:00
										 |  |  | TypedConstraint*	CcdPhysicsEnvironment::getConstraintById(int constraintId) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	int numConstraint = m_constraints.size(); | 
					
						
							|  |  |  | 	int i; | 
					
						
							|  |  |  | 	for (i=0;i<numConstraint;i++) | 
					
						
							|  |  |  | 	{ | 
					
						
							|  |  |  | 		TypedConstraint* constraint = m_constraints[i]; | 
					
						
							|  |  |  | 		if (constraint->GetUserConstraintId()==constraintId) | 
					
						
							|  |  |  | 		{ | 
					
						
							|  |  |  | 			return constraint; | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	return 0; | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2006-02-13 06:28:35 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-04-17 01:33:10 +00:00
										 |  |  | void CcdPhysicsEnvironment::addSensor(PHY_IPhysicsController* ctrl) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2006-04-17 06:27:57 +00:00
										 |  |  | 	//printf("addSensor\n");
 | 
					
						
							| 
									
										
										
										
											2006-04-17 01:33:10 +00:00
										 |  |  | } | 
					
						
							|  |  |  | void CcdPhysicsEnvironment::removeSensor(PHY_IPhysicsController* ctrl) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2006-04-17 06:27:57 +00:00
										 |  |  | 	//printf("removeSensor\n");
 | 
					
						
							| 
									
										
										
										
											2006-04-17 01:33:10 +00:00
										 |  |  | } | 
					
						
							|  |  |  | void CcdPhysicsEnvironment::addTouchCallback(int response_class, PHY_ResponseCallback callback, void *user) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2006-04-28 00:08:18 +00:00
										 |  |  | 	/*	printf("addTouchCallback\n(response class = %i)\n",response_class);
 | 
					
						
							| 
									
										
										
										
											2006-04-17 01:33:10 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	//map PHY_ convention into SM_ convention
 | 
					
						
							|  |  |  | 	switch (response_class) | 
					
						
							|  |  |  | 	{ | 
					
						
							|  |  |  | 	case	PHY_FH_RESPONSE: | 
					
						
							| 
									
										
										
										
											2006-04-28 00:08:18 +00:00
										 |  |  | 	printf("PHY_FH_RESPONSE\n"); | 
					
						
							|  |  |  | 	break; | 
					
						
							| 
									
										
										
										
											2006-04-17 01:33:10 +00:00
										 |  |  | 	case PHY_SENSOR_RESPONSE: | 
					
						
							| 
									
										
										
										
											2006-04-28 00:08:18 +00:00
										 |  |  | 	printf("PHY_SENSOR_RESPONSE\n"); | 
					
						
							|  |  |  | 	break; | 
					
						
							| 
									
										
										
										
											2006-04-17 01:33:10 +00:00
										 |  |  | 	case PHY_CAMERA_RESPONSE: | 
					
						
							| 
									
										
										
										
											2006-04-28 00:08:18 +00:00
										 |  |  | 	printf("PHY_CAMERA_RESPONSE\n"); | 
					
						
							|  |  |  | 	break; | 
					
						
							| 
									
										
										
										
											2006-04-17 01:33:10 +00:00
										 |  |  | 	case PHY_OBJECT_RESPONSE: | 
					
						
							| 
									
										
										
										
											2006-04-28 00:08:18 +00:00
										 |  |  | 	printf("PHY_OBJECT_RESPONSE\n"); | 
					
						
							|  |  |  | 	break; | 
					
						
							| 
									
										
										
										
											2006-04-17 01:33:10 +00:00
										 |  |  | 	case PHY_STATIC_RESPONSE: | 
					
						
							| 
									
										
										
										
											2006-04-28 00:08:18 +00:00
										 |  |  | 	printf("PHY_STATIC_RESPONSE\n"); | 
					
						
							|  |  |  | 	break; | 
					
						
							| 
									
										
										
										
											2006-04-17 01:33:10 +00:00
										 |  |  | 	default: | 
					
						
							| 
									
										
										
										
											2006-04-28 00:08:18 +00:00
										 |  |  | 	assert(0); | 
					
						
							|  |  |  | 	return; | 
					
						
							| 
									
										
										
										
											2006-04-17 01:33:10 +00:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2006-04-28 00:08:18 +00:00
										 |  |  | 	*/ | 
					
						
							| 
									
										
										
										
											2006-04-17 01:33:10 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	m_triggerCallbacks[response_class] = callback; | 
					
						
							|  |  |  | 	m_triggerCallbacksUserPtrs[response_class] = user; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | void CcdPhysicsEnvironment::requestCollisionCallback(PHY_IPhysicsController* ctrl) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	CcdPhysicsController* ccdCtrl = static_cast<CcdPhysicsController*>(ctrl); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-04-17 06:27:57 +00:00
										 |  |  | 	//printf("requestCollisionCallback\n");
 | 
					
						
							| 
									
										
										
										
											2006-04-17 01:33:10 +00:00
										 |  |  | 	m_triggerControllers.push_back(ccdCtrl); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void	CcdPhysicsEnvironment::CallbackTriggers() | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	CcdPhysicsController* ctrl0=0,*ctrl1=0; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	if (m_triggerCallbacks[PHY_OBJECT_RESPONSE]) | 
					
						
							|  |  |  | 	{ | 
					
						
							| 
									
										
										
										
											2006-04-17 06:27:57 +00:00
										 |  |  | 		//walk over all overlapping pairs, and if one of the involved bodies is registered for trigger callback, perform callback
 | 
					
						
							| 
									
										
										
										
											2006-04-17 01:33:10 +00:00
										 |  |  | 		int numManifolds = m_collisionWorld->GetDispatcher()->GetNumManifolds(); | 
					
						
							|  |  |  | 		for (int i=0;i<numManifolds;i++) | 
					
						
							|  |  |  | 		{ | 
					
						
							|  |  |  | 			PersistentManifold* manifold = m_collisionWorld->GetDispatcher()->GetManifoldByIndexInternal(i); | 
					
						
							|  |  |  | 			int numContacts = manifold->GetNumContacts(); | 
					
						
							|  |  |  | 			if (numContacts) | 
					
						
							|  |  |  | 			{ | 
					
						
							|  |  |  | 				RigidBody* obj0 = static_cast<RigidBody* >(manifold->GetBody0()); | 
					
						
							|  |  |  | 				RigidBody* obj1 = static_cast<RigidBody* >(manifold->GetBody1()); | 
					
						
							| 
									
										
										
										
											2006-04-28 00:08:18 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-04-17 01:33:10 +00:00
										 |  |  | 				//m_userPointer is set in 'addPhysicsController
 | 
					
						
							|  |  |  | 				CcdPhysicsController* ctrl0 = static_cast<CcdPhysicsController*>(obj0->m_userPointer); | 
					
						
							|  |  |  | 				CcdPhysicsController* ctrl1 = static_cast<CcdPhysicsController*>(obj1->m_userPointer); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 				std::vector<CcdPhysicsController*>::iterator i = | 
					
						
							| 
									
										
										
										
											2006-04-28 00:08:18 +00:00
										 |  |  | 					std::find(m_triggerControllers.begin(), m_triggerControllers.end(), ctrl0); | 
					
						
							| 
									
										
										
										
											2006-04-17 01:33:10 +00:00
										 |  |  | 				if (i == m_triggerControllers.end()) | 
					
						
							|  |  |  | 				{ | 
					
						
							|  |  |  | 					i = std::find(m_triggerControllers.begin(), m_triggerControllers.end(), ctrl1); | 
					
						
							|  |  |  | 				} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 				if (!(i == m_triggerControllers.end())) | 
					
						
							|  |  |  | 				{ | 
					
						
							|  |  |  | 					m_triggerCallbacks[PHY_OBJECT_RESPONSE](m_triggerCallbacksUserPtrs[PHY_OBJECT_RESPONSE], | 
					
						
							|  |  |  | 						ctrl0,ctrl1,0); | 
					
						
							|  |  |  | 				} | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-04-28 00:08:18 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-04-17 01:33:10 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2006-04-17 06:27:57 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-04-17 01:33:10 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-02-13 06:28:35 +00:00
										 |  |  | #ifdef NEW_BULLET_VEHICLE_SUPPORT
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | //complex constraint for vehicles
 | 
					
						
							|  |  |  | PHY_IVehicle*	CcdPhysicsEnvironment::getVehicleConstraint(int constraintId) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	int i; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	int numVehicles = m_wrapperVehicles.size(); | 
					
						
							|  |  |  | 	for (i=0;i<numVehicles;i++) | 
					
						
							|  |  |  | 	{ | 
					
						
							|  |  |  | 		WrapperVehicle* wrapperVehicle = m_wrapperVehicles[i]; | 
					
						
							|  |  |  | 		if (wrapperVehicle->GetVehicle()->GetUserConstraintId() == constraintId) | 
					
						
							|  |  |  | 			return wrapperVehicle; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	return 0; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-03-24 16:40:32 +00:00
										 |  |  | #endif //NEW_BULLET_VEHICLE_SUPPORT
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-04-28 00:08:18 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void	CcdPhysicsEnvironment::UpdateAabbs(float	timeStep) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	std::vector<CcdPhysicsController*>::iterator i; | 
					
						
							|  |  |  | 	BroadphaseInterface* scene =  GetBroadphase(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	//
 | 
					
						
							|  |  |  | 			// update aabbs, only for moving objects (!)
 | 
					
						
							|  |  |  | 			//
 | 
					
						
							|  |  |  | 			for (i=m_controllers.begin(); | 
					
						
							|  |  |  | 				!(i==m_controllers.end()); i++) | 
					
						
							|  |  |  | 			{ | 
					
						
							|  |  |  | 				CcdPhysicsController* ctrl = (*i); | 
					
						
							|  |  |  | 				RigidBody* body = ctrl->GetRigidBody(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 				SimdPoint3 minAabb,maxAabb; | 
					
						
							|  |  |  | 				CollisionShape* shapeinterface = ctrl->GetCollisionShape(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 				shapeinterface->CalculateTemporalAabb(body->getCenterOfMassTransform(), | 
					
						
							| 
									
										
										
										
											2006-05-11 17:58:23 +00:00
										 |  |  | 					body->getLinearVelocity(), | 
					
						
							|  |  |  | 					//body->getAngularVelocity(),
 | 
					
						
							|  |  |  | 					SimdVector3(0.f,0.f,0.f),//no angular effect for now //body->getAngularVelocity(),
 | 
					
						
							| 
									
										
										
										
											2006-04-28 00:08:18 +00:00
										 |  |  | 					timeStep,minAabb,maxAabb); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 				SimdVector3 manifoldExtraExtents(gContactBreakingTreshold,gContactBreakingTreshold,gContactBreakingTreshold); | 
					
						
							|  |  |  | 				minAabb -= manifoldExtraExtents; | 
					
						
							|  |  |  | 				maxAabb += manifoldExtraExtents; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 				BroadphaseProxy* bp = body->m_broadphaseHandle; | 
					
						
							|  |  |  | 				if (bp) | 
					
						
							|  |  |  | 				{ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 					SimdVector3 color (1,1,0); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 					if (m_debugDrawer) | 
					
						
							|  |  |  | 					{	 | 
					
						
							|  |  |  | 						//draw aabb
 | 
					
						
							|  |  |  | 						switch (body->GetActivationState()) | 
					
						
							|  |  |  | 						{ | 
					
						
							|  |  |  | 						case ISLAND_SLEEPING: | 
					
						
							|  |  |  | 							{ | 
					
						
							|  |  |  | 								color.setValue(1,1,1); | 
					
						
							|  |  |  | 								break; | 
					
						
							|  |  |  | 							} | 
					
						
							|  |  |  | 						case WANTS_DEACTIVATION: | 
					
						
							|  |  |  | 							{ | 
					
						
							|  |  |  | 								color.setValue(0,0,1); | 
					
						
							|  |  |  | 								break; | 
					
						
							|  |  |  | 							} | 
					
						
							|  |  |  | 						case ACTIVE_TAG: | 
					
						
							|  |  |  | 							{ | 
					
						
							|  |  |  | 								break; | 
					
						
							|  |  |  | 							} | 
					
						
							|  |  |  | 						case DISABLE_DEACTIVATION: | 
					
						
							|  |  |  | 							{ | 
					
						
							|  |  |  | 								color.setValue(1,0,1); | 
					
						
							|  |  |  | 							}; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 						}; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 						if (m_debugDrawer->GetDebugMode() & IDebugDraw::DBG_DrawAabb) | 
					
						
							|  |  |  | 						{ | 
					
						
							|  |  |  | 							DrawAabb(m_debugDrawer,minAabb,maxAabb,color); | 
					
						
							|  |  |  | 						} | 
					
						
							|  |  |  | 					} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 					scene->SetAabb(bp,minAabb,maxAabb); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 				} | 
					
						
							|  |  |  | 			} | 
					
						
							| 
									
										
										
										
											2006-05-09 01:15:12 +00:00
										 |  |  | } |