|
@@ -379,17 +379,10 @@ void Body3DSW::set_space(Space3DSW *p_space) {
|
|
|
first_integration = true;
|
|
|
}
|
|
|
|
|
|
-void Body3DSW::_compute_area_gravity_and_dampenings(const Area3DSW *p_area) {
|
|
|
- if (p_area->is_gravity_point()) {
|
|
|
- if (p_area->get_gravity_distance_scale() > 0) {
|
|
|
- Vector3 v = p_area->get_transform().xform(p_area->get_gravity_vector()) - get_transform().get_origin();
|
|
|
- gravity += v.normalized() * (p_area->get_gravity() / Math::pow(v.length() * p_area->get_gravity_distance_scale() + 1, 2));
|
|
|
- } else {
|
|
|
- gravity += (p_area->get_transform().xform(p_area->get_gravity_vector()) - get_transform().get_origin()).normalized() * p_area->get_gravity();
|
|
|
- }
|
|
|
- } else {
|
|
|
- gravity += p_area->get_gravity_vector() * p_area->get_gravity();
|
|
|
- }
|
|
|
+void Body3DSW::_compute_area_gravity_and_damping(const Area3DSW *p_area) {
|
|
|
+ Vector3 area_gravity;
|
|
|
+ p_area->compute_gravity(get_transform().get_origin(), area_gravity);
|
|
|
+ gravity += area_gravity;
|
|
|
|
|
|
area_linear_damp += p_area->get_linear_damp();
|
|
|
area_angular_damp += p_area->get_angular_damp();
|
|
@@ -431,7 +424,7 @@ void Body3DSW::integrate_forces(real_t p_step) {
|
|
|
switch (mode) {
|
|
|
case PhysicsServer3D::AREA_SPACE_OVERRIDE_COMBINE:
|
|
|
case PhysicsServer3D::AREA_SPACE_OVERRIDE_COMBINE_REPLACE: {
|
|
|
- _compute_area_gravity_and_dampenings(aa[i].area);
|
|
|
+ _compute_area_gravity_and_damping(aa[i].area);
|
|
|
stopped = mode == PhysicsServer3D::AREA_SPACE_OVERRIDE_COMBINE_REPLACE;
|
|
|
} break;
|
|
|
case PhysicsServer3D::AREA_SPACE_OVERRIDE_REPLACE:
|
|
@@ -439,7 +432,7 @@ void Body3DSW::integrate_forces(real_t p_step) {
|
|
|
gravity = Vector3(0, 0, 0);
|
|
|
area_angular_damp = 0;
|
|
|
area_linear_damp = 0;
|
|
|
- _compute_area_gravity_and_dampenings(aa[i].area);
|
|
|
+ _compute_area_gravity_and_damping(aa[i].area);
|
|
|
stopped = mode == PhysicsServer3D::AREA_SPACE_OVERRIDE_REPLACE;
|
|
|
} break;
|
|
|
default: {
|
|
@@ -449,7 +442,7 @@ void Body3DSW::integrate_forces(real_t p_step) {
|
|
|
}
|
|
|
|
|
|
if (!stopped) {
|
|
|
- _compute_area_gravity_and_dampenings(def_area);
|
|
|
+ _compute_area_gravity_and_damping(def_area);
|
|
|
}
|
|
|
|
|
|
gravity *= gravity_scale;
|