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