Merge pull request #54011 from nekomatata/center-of-mass-2d-transform

This commit is contained in:
Rémi Verschelde 2021-10-21 11:41:56 +02:00 committed by GitHub
commit 194b72821d
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
4 changed files with 26 additions and 12 deletions

View file

@ -119,6 +119,8 @@ void GodotBody2D::update_mass_properties() {
} break; } break;
} }
_update_transform_dependent();
} }
void GodotBody2D::reset_mass_properties() { void GodotBody2D::reset_mass_properties() {
@ -179,7 +181,8 @@ void GodotBody2D::set_param(PhysicsServer2D::BodyParameter p_param, const Varian
} break; } break;
case PhysicsServer2D::BODY_PARAM_CENTER_OF_MASS: { case PhysicsServer2D::BODY_PARAM_CENTER_OF_MASS: {
calculate_center_of_mass = false; calculate_center_of_mass = false;
center_of_mass = p_value; center_of_mass_local = p_value;
_update_transform_dependent();
} break; } break;
case PhysicsServer2D::BODY_PARAM_GRAVITY_SCALE: { case PhysicsServer2D::BODY_PARAM_GRAVITY_SCALE: {
gravity_scale = p_value; gravity_scale = p_value;
@ -301,6 +304,7 @@ void GodotBody2D::set_state(PhysicsServer2D::BodyState p_state, const Variant &p
} }
_set_transform(t); _set_transform(t);
_set_inv_transform(get_transform().inverse()); _set_inv_transform(get_transform().inverse());
_update_transform_dependent();
} }
wakeup(); wakeup();
@ -400,6 +404,10 @@ void GodotBody2D::_compute_area_gravity_and_damping(const GodotArea2D *p_area) {
area_angular_damp += p_area->get_angular_damp(); area_angular_damp += p_area->get_angular_damp();
} }
void GodotBody2D::_update_transform_dependent() {
center_of_mass = get_transform().basis_xform(center_of_mass_local);
}
void GodotBody2D::integrate_forces(real_t p_step) { void GodotBody2D::integrate_forces(real_t p_step) {
if (mode == PhysicsServer2D::BODY_MODE_STATIC) { if (mode == PhysicsServer2D::BODY_MODE_STATIC) {
return; return;
@ -568,6 +576,8 @@ void GodotBody2D::integrate_velocities(real_t p_step) {
if (continuous_cd_mode != PhysicsServer2D::CCD_MODE_DISABLED) { if (continuous_cd_mode != PhysicsServer2D::CCD_MODE_DISABLED) {
new_transform = get_transform(); new_transform = get_transform();
} }
_update_transform_dependent();
} }
void GodotBody2D::wakeup_neighbours() { void GodotBody2D::wakeup_neighbours() {

View file

@ -66,6 +66,7 @@ class GodotBody2D : public GodotCollisionObject2D {
real_t inertia = 0.0; real_t inertia = 0.0;
real_t _inv_inertia = 0.0; real_t _inv_inertia = 0.0;
Vector2 center_of_mass_local;
Vector2 center_of_mass; Vector2 center_of_mass;
bool calculate_inertia = true; bool calculate_inertia = true;
@ -139,7 +140,9 @@ class GodotBody2D : public GodotCollisionObject2D {
uint64_t island_step = 0; uint64_t island_step = 0;
_FORCE_INLINE_ void _compute_area_gravity_and_damping(const GodotArea2D *p_area); void _compute_area_gravity_and_damping(const GodotArea2D *p_area);
void _update_transform_dependent();
friend class GodotPhysicsDirectBodyState2D; // i give up, too many functions to expose friend class GodotPhysicsDirectBodyState2D; // i give up, too many functions to expose

View file

@ -40,7 +40,7 @@ void GodotBody3D::_mass_properties_changed() {
} }
} }
void GodotBody3D::_update_transform_dependant() { void GodotBody3D::_update_transform_dependent() {
center_of_mass = get_transform().basis.xform(center_of_mass_local); center_of_mass = get_transform().basis.xform(center_of_mass_local);
principal_inertia_axes = get_transform().basis * principal_inertia_axes_local; principal_inertia_axes = get_transform().basis * principal_inertia_axes_local;
@ -161,7 +161,7 @@ void GodotBody3D::update_mass_properties() {
} break; } break;
} }
_update_transform_dependant(); _update_transform_dependent();
} }
void GodotBody3D::reset_mass_properties() { void GodotBody3D::reset_mass_properties() {
@ -217,14 +217,14 @@ void GodotBody3D::set_param(PhysicsServer3D::BodyParameter p_param, const Varian
if (mode == PhysicsServer3D::BODY_MODE_DYNAMIC) { if (mode == PhysicsServer3D::BODY_MODE_DYNAMIC) {
principal_inertia_axes_local = Basis(); principal_inertia_axes_local = Basis();
_inv_inertia = inertia.inverse(); _inv_inertia = inertia.inverse();
_update_transform_dependant(); _update_transform_dependent();
} }
} }
} break; } break;
case PhysicsServer3D::BODY_PARAM_CENTER_OF_MASS: { case PhysicsServer3D::BODY_PARAM_CENTER_OF_MASS: {
calculate_center_of_mass = false; calculate_center_of_mass = false;
center_of_mass_local = p_value; center_of_mass_local = p_value;
_update_transform_dependant(); _update_transform_dependent();
} break; } break;
case PhysicsServer3D::BODY_PARAM_GRAVITY_SCALE: { case PhysicsServer3D::BODY_PARAM_GRAVITY_SCALE: {
gravity_scale = p_value; gravity_scale = p_value;
@ -295,7 +295,7 @@ void GodotBody3D::set_mode(PhysicsServer3D::BodyMode p_mode) {
if (mode == PhysicsServer3D::BODY_MODE_KINEMATIC && prev != mode) { if (mode == PhysicsServer3D::BODY_MODE_KINEMATIC && prev != mode) {
first_time_kinematic = true; first_time_kinematic = true;
} }
_update_transform_dependant(); _update_transform_dependent();
} break; } break;
case PhysicsServer3D::BODY_MODE_DYNAMIC: { case PhysicsServer3D::BODY_MODE_DYNAMIC: {
@ -303,7 +303,7 @@ void GodotBody3D::set_mode(PhysicsServer3D::BodyMode p_mode) {
if (!calculate_inertia) { if (!calculate_inertia) {
principal_inertia_axes_local = Basis(); principal_inertia_axes_local = Basis();
_inv_inertia = inertia.inverse(); _inv_inertia = inertia.inverse();
_update_transform_dependant(); _update_transform_dependent();
} }
_mass_properties_changed(); _mass_properties_changed();
_set_static(false); _set_static(false);
@ -314,7 +314,7 @@ void GodotBody3D::set_mode(PhysicsServer3D::BodyMode p_mode) {
_inv_mass = mass > 0 ? (1.0 / mass) : 0; _inv_mass = mass > 0 ? (1.0 / mass) : 0;
_inv_inertia = Vector3(); _inv_inertia = Vector3();
angular_velocity = Vector3(); angular_velocity = Vector3();
_update_transform_dependant(); _update_transform_dependent();
_set_static(false); _set_static(false);
set_active(true); set_active(true);
} }
@ -355,6 +355,7 @@ void GodotBody3D::set_state(PhysicsServer3D::BodyState p_state, const Variant &p
} }
_set_transform(t); _set_transform(t);
_set_inv_transform(get_transform().inverse()); _set_inv_transform(get_transform().inverse());
_update_transform_dependent();
} }
wakeup(); wakeup();
@ -651,7 +652,7 @@ void GodotBody3D::integrate_velocities(real_t p_step) {
_set_transform(transform); _set_transform(transform);
_set_inv_transform(get_transform().inverse()); _set_inv_transform(get_transform().inverse());
_update_transform_dependant(); _update_transform_dependent();
} }
void GodotBody3D::wakeup_neighbours() { void GodotBody3D::wakeup_neighbours() {

View file

@ -135,9 +135,9 @@ class GodotBody3D : public GodotCollisionObject3D {
uint64_t island_step = 0; uint64_t island_step = 0;
_FORCE_INLINE_ void _compute_area_gravity_and_damping(const GodotArea3D *p_area); void _compute_area_gravity_and_damping(const GodotArea3D *p_area);
_FORCE_INLINE_ void _update_transform_dependant(); void _update_transform_dependent();
friend class GodotPhysicsDirectBodyState3D; // i give up, too many functions to expose friend class GodotPhysicsDirectBodyState3D; // i give up, too many functions to expose