Merge pull request #54011 from nekomatata/center-of-mass-2d-transform
This commit is contained in:
commit
194b72821d
@ -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() {
|
||||||
|
@ -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
|
||||||
|
|
||||||
|
@ -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() {
|
||||||
|
@ -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
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user