Areas now calculate their dampenings the same way as their gravity.
This commit is contained in:
parent
ecad3a285f
commit
43b2c9c7a4
4 changed files with 31 additions and 20 deletions
|
@ -382,7 +382,7 @@ void BodySW::set_space(SpaceSW *p_space){
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void BodySW::_compute_area_gravity(const AreaSW *p_area) {
|
void BodySW::_compute_area_gravity_and_dampenings(const AreaSW *p_area) {
|
||||||
|
|
||||||
if (p_area->is_gravity_point()) {
|
if (p_area->is_gravity_point()) {
|
||||||
if(p_area->get_gravity_distance_scale() > 0) {
|
if(p_area->get_gravity_distance_scale() > 0) {
|
||||||
|
@ -394,6 +394,9 @@ void BodySW::_compute_area_gravity(const AreaSW *p_area) {
|
||||||
} else {
|
} else {
|
||||||
gravity += p_area->get_gravity_vector() * p_area->get_gravity();
|
gravity += p_area->get_gravity_vector() * p_area->get_gravity();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
area_linear_damp += p_area->get_linear_damp();
|
||||||
|
area_angular_damp += p_area->get_angular_damp();
|
||||||
}
|
}
|
||||||
|
|
||||||
void BodySW::integrate_forces(real_t p_step) {
|
void BodySW::integrate_forces(real_t p_step) {
|
||||||
|
@ -409,13 +412,15 @@ void BodySW::integrate_forces(real_t p_step) {
|
||||||
|
|
||||||
int ac = areas.size();
|
int ac = areas.size();
|
||||||
bool replace = false;
|
bool replace = false;
|
||||||
gravity=Vector3(0,0,0);
|
gravity = Vector3(0,0,0);
|
||||||
|
area_linear_damp = 0;
|
||||||
|
area_angular_damp = 0;
|
||||||
if (ac) {
|
if (ac) {
|
||||||
areas.sort();
|
areas.sort();
|
||||||
const AreaCMP *aa = &areas[0];
|
const AreaCMP *aa = &areas[0];
|
||||||
damp_area = aa[ac-1].area;
|
damp_area = aa[ac-1].area;
|
||||||
for(int i=ac-1;i>=0;i--) {
|
for(int i=ac-1;i>=0;i--) {
|
||||||
_compute_area_gravity(aa[i].area);
|
_compute_area_gravity_and_dampenings(aa[i].area);
|
||||||
if (aa[i].area->get_space_override_mode() == PhysicsServer::AREA_SPACE_OVERRIDE_REPLACE) {
|
if (aa[i].area->get_space_override_mode() == PhysicsServer::AREA_SPACE_OVERRIDE_REPLACE) {
|
||||||
replace = true;
|
replace = true;
|
||||||
break;
|
break;
|
||||||
|
@ -424,20 +429,21 @@ void BodySW::integrate_forces(real_t p_step) {
|
||||||
}
|
}
|
||||||
|
|
||||||
if( !replace ) {
|
if( !replace ) {
|
||||||
_compute_area_gravity(def_area);
|
_compute_area_gravity_and_dampenings(def_area);
|
||||||
}
|
}
|
||||||
|
|
||||||
gravity*=gravity_scale;
|
gravity*=gravity_scale;
|
||||||
|
|
||||||
|
// If less than 0, override dampenings with that of the Body
|
||||||
if (angular_damp>=0)
|
if (angular_damp>=0)
|
||||||
area_angular_damp=angular_damp;
|
area_angular_damp=angular_damp;
|
||||||
else
|
//else
|
||||||
area_angular_damp=damp_area->get_angular_damp();
|
// area_angular_damp=damp_area->get_angular_damp();
|
||||||
|
|
||||||
if (linear_damp>=0)
|
if (linear_damp>=0)
|
||||||
area_linear_damp=linear_damp;
|
area_linear_damp=linear_damp;
|
||||||
else
|
//else
|
||||||
area_linear_damp=damp_area->get_linear_damp();
|
// area_linear_damp=damp_area->get_linear_damp();
|
||||||
|
|
||||||
|
|
||||||
Vector3 motion;
|
Vector3 motion;
|
||||||
|
|
|
@ -130,7 +130,7 @@ class BodySW : public CollisionObjectSW {
|
||||||
BodySW *island_next;
|
BodySW *island_next;
|
||||||
BodySW *island_list_next;
|
BodySW *island_list_next;
|
||||||
|
|
||||||
_FORCE_INLINE_ void _compute_area_gravity(const AreaSW *p_area);
|
_FORCE_INLINE_ void _compute_area_gravity_and_dampenings(const AreaSW *p_area);
|
||||||
|
|
||||||
_FORCE_INLINE_ void _update_inertia_tensor();
|
_FORCE_INLINE_ void _update_inertia_tensor();
|
||||||
|
|
||||||
|
|
|
@ -380,7 +380,7 @@ void Body2DSW::set_space(Space2DSW *p_space){
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void Body2DSW::_compute_area_gravity(const Area2DSW *p_area) {
|
void Body2DSW::_compute_area_gravity_and_dampenings(const Area2DSW *p_area) {
|
||||||
|
|
||||||
if (p_area->is_gravity_point()) {
|
if (p_area->is_gravity_point()) {
|
||||||
if(p_area->get_gravity_distance_scale() > 0) {
|
if(p_area->get_gravity_distance_scale() > 0) {
|
||||||
|
@ -393,6 +393,8 @@ void Body2DSW::_compute_area_gravity(const Area2DSW *p_area) {
|
||||||
gravity += p_area->get_gravity_vector() * p_area->get_gravity();
|
gravity += p_area->get_gravity_vector() * p_area->get_gravity();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
area_linear_damp += p_area->get_linear_damp();
|
||||||
|
area_angular_damp += p_area->get_angular_damp();
|
||||||
}
|
}
|
||||||
|
|
||||||
void Body2DSW::integrate_forces(real_t p_step) {
|
void Body2DSW::integrate_forces(real_t p_step) {
|
||||||
|
@ -406,13 +408,15 @@ void Body2DSW::integrate_forces(real_t p_step) {
|
||||||
|
|
||||||
int ac = areas.size();
|
int ac = areas.size();
|
||||||
bool replace = false;
|
bool replace = false;
|
||||||
gravity=Vector2(0,0);
|
gravity = Vector2(0,0);
|
||||||
|
area_angular_damp = 0;
|
||||||
|
area_linear_damp = 0;
|
||||||
if (ac) {
|
if (ac) {
|
||||||
areas.sort();
|
areas.sort();
|
||||||
const AreaCMP *aa = &areas[0];
|
const AreaCMP *aa = &areas[0];
|
||||||
damp_area = aa[ac-1].area;
|
damp_area = aa[ac-1].area;
|
||||||
for(int i=ac-1;i>=0;i--) {
|
for(int i=ac-1;i>=0;i--) {
|
||||||
_compute_area_gravity(aa[i].area);
|
_compute_area_gravity_and_dampenings(aa[i].area);
|
||||||
if (aa[i].area->get_space_override_mode() == Physics2DServer::AREA_SPACE_OVERRIDE_REPLACE) {
|
if (aa[i].area->get_space_override_mode() == Physics2DServer::AREA_SPACE_OVERRIDE_REPLACE) {
|
||||||
replace = true;
|
replace = true;
|
||||||
break;
|
break;
|
||||||
|
@ -420,19 +424,20 @@ void Body2DSW::integrate_forces(real_t p_step) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if( !replace ) {
|
if( !replace ) {
|
||||||
_compute_area_gravity(def_area);
|
_compute_area_gravity_and_dampenings(def_area);
|
||||||
}
|
}
|
||||||
gravity*=gravity_scale;
|
gravity*=gravity_scale;
|
||||||
|
|
||||||
|
// If less than 0, override dampenings with that of the Body2D
|
||||||
if (angular_damp>=0)
|
if (angular_damp>=0)
|
||||||
area_angular_damp=angular_damp;
|
area_angular_damp = angular_damp;
|
||||||
else
|
//else
|
||||||
area_angular_damp=damp_area->get_angular_damp();
|
// area_angular_damp=damp_area->get_angular_damp();
|
||||||
|
|
||||||
if (linear_damp>=0)
|
if (linear_damp>=0)
|
||||||
area_linear_damp=linear_damp;
|
area_linear_damp = linear_damp;
|
||||||
else
|
//else
|
||||||
area_linear_damp=damp_area->get_linear_damp();
|
// area_linear_damp=damp_area->get_linear_damp();
|
||||||
|
|
||||||
Vector2 motion;
|
Vector2 motion;
|
||||||
bool do_motion=false;
|
bool do_motion=false;
|
||||||
|
|
|
@ -132,7 +132,7 @@ class Body2DSW : public CollisionObject2DSW {
|
||||||
Body2DSW *island_next;
|
Body2DSW *island_next;
|
||||||
Body2DSW *island_list_next;
|
Body2DSW *island_list_next;
|
||||||
|
|
||||||
_FORCE_INLINE_ void _compute_area_gravity(const Area2DSW *p_area);
|
_FORCE_INLINE_ void _compute_area_gravity_and_dampenings(const Area2DSW *p_area);
|
||||||
|
|
||||||
friend class Physics2DDirectBodyStateSW; // i give up, too many functions to expose
|
friend class Physics2DDirectBodyStateSW; // i give up, too many functions to expose
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue