ソースを参照

Merge pull request #14965 from AndreaCatania/intshap

Fixed bullet intersect_shape crash, Fixed bullet sleeping
Rémi Verschelde 7 年 前
コミット
5463b5e348

+ 4 - 1
modules/bullet/godot_result_callbacks.cpp

@@ -142,6 +142,9 @@ bool GodotAllContactResultCallback::needsCollision(btBroadphaseProxy *proxy0) co
 
 btScalar GodotAllContactResultCallback::addSingleResult(btManifoldPoint &cp, const btCollisionObjectWrapper *colObj0Wrap, int partId0, int index0, const btCollisionObjectWrapper *colObj1Wrap, int partId1, int index1) {
 
+	if (m_count >= m_resultMax)
+		return cp.getDistance();
+
 	if (cp.getDistance() <= 0) {
 
 		PhysicsDirectSpaceState::ShapeResult &result = m_results[m_count];
@@ -165,7 +168,7 @@ btScalar GodotAllContactResultCallback::addSingleResult(btManifoldPoint &cp, con
 		++m_count;
 	}
 
-	return m_count < m_resultMax;
+	return cp.getDistance();
 }
 
 bool GodotContactPairContactResultCallback::needsCollision(btBroadphaseProxy *proxy0) const {

+ 28 - 11
modules/bullet/rigid_body_bullet.cpp

@@ -264,6 +264,7 @@ RigidBodyBullet::RigidBodyBullet() :
 		can_sleep(true),
 		force_integration_callback(NULL),
 		isTransformChanged(false),
+		previousActiveState(true),
 		maxCollisionsDetection(0),
 		collisionsCount(0),
 		maxAreasWhereIam(10),
@@ -287,6 +288,7 @@ RigidBodyBullet::RigidBodyBullet() :
 	for (int i = areasWhereIam.size() - 1; 0 <= i; --i) {
 		areasWhereIam[i] = NULL;
 	}
+	btBody->setSleepingThresholds(0.2, 0.2);
 }
 
 RigidBodyBullet::~RigidBodyBullet() {
@@ -337,7 +339,7 @@ void RigidBodyBullet::set_space(SpaceBullet *p_space) {
 
 void RigidBodyBullet::dispatch_callbacks() {
 	/// The check isTransformChanged is necessary in order to call integrated forces only when the first transform is sent
-	if (btBody->isActive() && force_integration_callback && isTransformChanged) {
+	if (previousActiveState != btBody->isActive() && force_integration_callback && isTransformChanged) {
 
 		BulletPhysicsDirectBodyState *bodyDirect = BulletPhysicsDirectBodyState::get_singleton(this);
 
@@ -364,6 +366,8 @@ void RigidBodyBullet::dispatch_callbacks() {
 	/// Lock axis
 	btBody->setLinearVelocity(btBody->getLinearVelocity() * btBody->getLinearFactor());
 	btBody->setAngularVelocity(btBody->getAngularVelocity() * btBody->getAngularFactor());
+
+	previousActiveState = btBody->isActive();
 }
 
 void RigidBodyBullet::set_force_integration_callback(ObjectID p_id, const StringName &p_method, const Variant &p_udata) {
@@ -580,7 +584,8 @@ Variant RigidBodyBullet::get_state(PhysicsServer::BodyState p_state) const {
 void RigidBodyBullet::apply_central_impulse(const Vector3 &p_impulse) {
 	btVector3 btImpu;
 	G_TO_B(p_impulse, btImpu);
-	btBody->activate();
+	if (Vector3() != p_impulse)
+		btBody->activate();
 	btBody->applyCentralImpulse(btImpu);
 }
 
@@ -589,14 +594,16 @@ void RigidBodyBullet::apply_impulse(const Vector3 &p_pos, const Vector3 &p_impul
 	btVector3 btPos;
 	G_TO_B(p_impulse, btImpu);
 	G_TO_B(p_pos, btPos);
-	btBody->activate();
+	if (Vector3() != p_impulse)
+		btBody->activate();
 	btBody->applyImpulse(btImpu, btPos);
 }
 
 void RigidBodyBullet::apply_torque_impulse(const Vector3 &p_impulse) {
 	btVector3 btImp;
 	G_TO_B(p_impulse, btImp);
-	btBody->activate();
+	if (Vector3() != p_impulse)
+		btBody->activate();
 	btBody->applyTorqueImpulse(btImp);
 }
 
@@ -605,28 +612,32 @@ void RigidBodyBullet::apply_force(const Vector3 &p_force, const Vector3 &p_pos)
 	btVector3 btPos;
 	G_TO_B(p_force, btForce);
 	G_TO_B(p_pos, btPos);
-	btBody->activate();
+	if (Vector3() != p_force)
+		btBody->activate();
 	btBody->applyForce(btForce, btPos);
 }
 
 void RigidBodyBullet::apply_central_force(const Vector3 &p_force) {
 	btVector3 btForce;
 	G_TO_B(p_force, btForce);
-	btBody->activate();
+	if (Vector3() != p_force)
+		btBody->activate();
 	btBody->applyCentralForce(btForce);
 }
 
 void RigidBodyBullet::apply_torque(const Vector3 &p_torque) {
 	btVector3 btTorq;
 	G_TO_B(p_torque, btTorq);
-	btBody->activate();
+	if (Vector3() != p_torque)
+		btBody->activate();
 	btBody->applyTorque(btTorq);
 }
 
 void RigidBodyBullet::set_applied_force(const Vector3 &p_force) {
 	btVector3 btVec = btBody->getTotalTorque();
 
-	btBody->activate();
+	if (Vector3() != p_force)
+		btBody->activate();
 
 	btBody->clearForces();
 	btBody->applyTorque(btVec);
@@ -644,7 +655,8 @@ Vector3 RigidBodyBullet::get_applied_force() const {
 void RigidBodyBullet::set_applied_torque(const Vector3 &p_torque) {
 	btVector3 btVec = btBody->getTotalForce();
 
-	btBody->activate();
+	if (Vector3() != p_torque)
+		btBody->activate();
 
 	btBody->clearForces();
 	btBody->applyCentralForce(btVec);
@@ -711,7 +723,8 @@ bool RigidBodyBullet::is_continuous_collision_detection_enabled() const {
 void RigidBodyBullet::set_linear_velocity(const Vector3 &p_velocity) {
 	btVector3 btVec;
 	G_TO_B(p_velocity, btVec);
-	btBody->activate();
+	if (Vector3() != p_velocity)
+		btBody->activate();
 	btBody->setLinearVelocity(btVec);
 }
 
@@ -724,7 +737,8 @@ Vector3 RigidBodyBullet::get_linear_velocity() const {
 void RigidBodyBullet::set_angular_velocity(const Vector3 &p_velocity) {
 	btVector3 btVec;
 	G_TO_B(p_velocity, btVec);
-	btBody->activate();
+	if (Vector3() != p_velocity)
+		btBody->activate();
 	btBody->setAngularVelocity(btVec);
 }
 
@@ -833,6 +847,9 @@ void RigidBodyBullet::on_exit_area(AreaBullet *p_area) {
 
 void RigidBodyBullet::reload_space_override_modificator() {
 
+	if (!is_active())
+		return;
+
 	Vector3 newGravity(space->get_gravity_direction() * space->get_gravity_magnitude());
 	real_t newLinearDamp(linearDamp);
 	real_t newAngularDamp(angularDamp);

+ 1 - 0
modules/bullet/rigid_body_bullet.h

@@ -207,6 +207,7 @@ private:
 	bool isScratchedSpaceOverrideModificator;
 
 	bool isTransformChanged;
+	bool previousActiveState; // Last check state
 
 	ForceIntegrationCallback *force_integration_callback;