Merge pull request #69823 from madmiraal/fix-65773

[3.x] Store Bullet total gravity, linear damp and angular damp calculations
This commit is contained in:
Rémi Verschelde 2022-12-11 13:38:56 +01:00
commit 25f02bf920
No known key found for this signature in database
GPG key ID: C3336907360768E1
2 changed files with 34 additions and 35 deletions

View file

@ -49,17 +49,15 @@
*/
Vector3 BulletPhysicsDirectBodyState::get_total_gravity() const {
Vector3 gVec;
B_TO_G(body->btBody->getGravity(), gVec);
return gVec;
return body->total_gravity;
}
float BulletPhysicsDirectBodyState::get_total_angular_damp() const {
return body->btBody->getAngularDamping();
return body->total_angular_damp;
}
float BulletPhysicsDirectBodyState::get_total_linear_damp() const {
return body->btBody->getLinearDamping();
return body->total_linear_damp;
}
Vector3 BulletPhysicsDirectBodyState::get_center_of_mass() const {
@ -917,16 +915,9 @@ void RigidBodyBullet::reload_space_override_modificator() {
return;
}
if (omit_forces_integration) {
// Custom behaviour.
btBody->setGravity(btVector3(0, 0, 0));
btBody->setDamping(0, 0);
return;
}
Vector3 newGravity(0.0, 0.0, 0.0);
real_t newLinearDamp = MAX(0.0, linearDamp);
real_t newAngularDamp = MAX(0.0, angularDamp);
total_gravity = Vector3(0.0, 0.0, 0.0);
total_linear_damp = MAX(0.0, linearDamp);
total_angular_damp = MAX(0.0, angularDamp);
AreaBullet *currentArea;
// Variable used to calculate new gravity for gravity point areas, it is pointed by currentGravity pointer
@ -977,49 +968,54 @@ void RigidBodyBullet::reload_space_override_modificator() {
/// This area adds its gravity/damp values to whatever has been
/// calculated so far. This way, many overlapping areas can combine
/// their physics to make interesting
newGravity += support_gravity;
newLinearDamp += currentArea->get_spOv_linearDamp();
newAngularDamp += currentArea->get_spOv_angularDamp();
total_gravity += support_gravity;
total_linear_damp += currentArea->get_spOv_linearDamp();
total_angular_damp += currentArea->get_spOv_angularDamp();
break;
case PhysicsServer::AREA_SPACE_OVERRIDE_COMBINE_REPLACE:
/// This area adds its gravity/damp values to whatever has been calculated
/// so far. Then stops taking into account the rest of the areas, even the
/// default one.
newGravity += support_gravity;
newLinearDamp += currentArea->get_spOv_linearDamp();
newAngularDamp += currentArea->get_spOv_angularDamp();
total_gravity += support_gravity;
total_linear_damp += currentArea->get_spOv_linearDamp();
total_angular_damp += currentArea->get_spOv_angularDamp();
stopped = true;
break;
case PhysicsServer::AREA_SPACE_OVERRIDE_REPLACE:
/// This area replaces any gravity/damp, even the default one, and
/// stops taking into account the rest of the areas.
newGravity = support_gravity;
newLinearDamp = currentArea->get_spOv_linearDamp();
newAngularDamp = currentArea->get_spOv_angularDamp();
total_gravity = support_gravity;
total_linear_damp = currentArea->get_spOv_linearDamp();
total_angular_damp = currentArea->get_spOv_angularDamp();
stopped = true;
break;
case PhysicsServer::AREA_SPACE_OVERRIDE_REPLACE_COMBINE:
/// This area replaces any gravity/damp calculated so far, but keeps
/// calculating the rest of the areas, down to the default one.
newGravity = support_gravity;
newLinearDamp = currentArea->get_spOv_linearDamp();
newAngularDamp = currentArea->get_spOv_angularDamp();
total_gravity = support_gravity;
total_linear_damp = currentArea->get_spOv_linearDamp();
total_angular_damp = currentArea->get_spOv_angularDamp();
break;
}
}
// Add default gravity and damping from space.
if (!stopped) {
newGravity += space->get_gravity_direction() * space->get_gravity_magnitude();
newLinearDamp += space->get_linear_damp();
newAngularDamp += space->get_angular_damp();
total_gravity += space->get_gravity_direction() * space->get_gravity_magnitude();
total_linear_damp += space->get_linear_damp();
total_angular_damp += space->get_angular_damp();
}
btVector3 newBtGravity;
G_TO_B(newGravity * gravity_scale, newBtGravity);
btBody->setGravity(newBtGravity);
btBody->setDamping(newLinearDamp, newAngularDamp);
if (omit_forces_integration) {
// Don't apply gravity or damping.
btBody->setGravity(btVector3(0, 0, 0));
btBody->setDamping(0, 0);
} else {
btVector3 newBtGravity;
G_TO_B(total_gravity * gravity_scale, newBtGravity);
btBody->setGravity(newBtGravity);
btBody->setDamping(total_linear_damp, total_angular_damp);
}
}
void RigidBodyBullet::reload_kinematic_shapes() {

View file

@ -168,6 +168,9 @@ private:
real_t gravity_scale;
real_t linearDamp;
real_t angularDamp;
Vector3 total_gravity;
real_t total_linear_damp;
real_t total_angular_damp;
bool can_sleep;
bool omit_forces_integration;
bool can_integrate_forces;