|
@@ -506,10 +506,14 @@ void RigidBody3D::_body_state_changed(PhysicsDirectBodyState3D *p_state) {
|
|
if (GDVIRTUAL_IS_OVERRIDDEN(_integrate_forces)) {
|
|
if (GDVIRTUAL_IS_OVERRIDDEN(_integrate_forces)) {
|
|
_sync_body_state(p_state);
|
|
_sync_body_state(p_state);
|
|
|
|
|
|
|
|
+ Transform3D old_transform = get_global_transform();
|
|
GDVIRTUAL_CALL(_integrate_forces, p_state);
|
|
GDVIRTUAL_CALL(_integrate_forces, p_state);
|
|
|
|
+ Transform3D new_transform = get_global_transform();
|
|
|
|
|
|
- // Update the physics server with any new transform, to prevent it from being overwritten at the sync below.
|
|
|
|
- force_update_transform();
|
|
|
|
|
|
+ if (new_transform != old_transform) {
|
|
|
|
+ // Update the physics server with the new transform, to prevent it from being overwritten at the sync below.
|
|
|
|
+ PhysicsServer3D::get_singleton()->body_set_state(get_rid(), PhysicsServer3D::BODY_STATE_TRANSFORM, new_transform);
|
|
|
|
+ }
|
|
}
|
|
}
|
|
|
|
|
|
_sync_body_state(p_state);
|
|
_sync_body_state(p_state);
|
|
@@ -2945,10 +2949,14 @@ void PhysicalBone3D::_body_state_changed(PhysicsDirectBodyState3D *p_state) {
|
|
if (GDVIRTUAL_IS_OVERRIDDEN(_integrate_forces)) {
|
|
if (GDVIRTUAL_IS_OVERRIDDEN(_integrate_forces)) {
|
|
_sync_body_state(p_state);
|
|
_sync_body_state(p_state);
|
|
|
|
|
|
|
|
+ Transform3D old_transform = get_global_transform();
|
|
GDVIRTUAL_CALL(_integrate_forces, p_state);
|
|
GDVIRTUAL_CALL(_integrate_forces, p_state);
|
|
|
|
+ Transform3D new_transform = get_global_transform();
|
|
|
|
|
|
- // Update the physics server with any new transform, to prevent it from being overwritten at the sync below.
|
|
|
|
- force_update_transform();
|
|
|
|
|
|
+ if (new_transform != old_transform) {
|
|
|
|
+ // Update the physics server with the new transform, to prevent it from being overwritten at the sync below.
|
|
|
|
+ PhysicsServer3D::get_singleton()->body_set_state(get_rid(), PhysicsServer3D::BODY_STATE_TRANSFORM, new_transform);
|
|
|
|
+ }
|
|
}
|
|
}
|
|
|
|
|
|
_sync_body_state(p_state);
|
|
_sync_body_state(p_state);
|