ソースを参照

Merge pull request #3018 from Ovnuniarchos/DampenIntegrator

Areas now calculate their dampenings the same way as their gravity.
Juan Linietsky 9 年 前
コミット
1bcdea0804

+ 14 - 8
servers/physics/body_sw.cpp

@@ -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->get_gravity_distance_scale() > 0) {
@@ -394,6 +394,9 @@ void BodySW::_compute_area_gravity(const AreaSW *p_area) {
 	} else {
 		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) {
@@ -409,13 +412,15 @@ void BodySW::integrate_forces(real_t p_step) {
 
 	int ac = areas.size();
 	bool replace = false;
-	gravity=Vector3(0,0,0);
+	gravity = Vector3(0,0,0);
+	area_linear_damp = 0;
+	area_angular_damp = 0;
 	if (ac) {
 		areas.sort();
 		const AreaCMP *aa = &areas[0];
 		damp_area = aa[ac-1].area;
 		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) {
 				replace = true;
 				break;
@@ -424,20 +429,21 @@ void BodySW::integrate_forces(real_t p_step) {
 	}
 
 	if( !replace ) {
-		_compute_area_gravity(def_area);
+		_compute_area_gravity_and_dampenings(def_area);
 	}
 
 	gravity*=gravity_scale;
 
+	// If less than 0, override dampenings with that of the Body
 	if (angular_damp>=0)
 		area_angular_damp=angular_damp;
-	else
-		area_angular_damp=damp_area->get_angular_damp();
+	//else
+	//	area_angular_damp=damp_area->get_angular_damp();
 
 	if (linear_damp>=0)
 		area_linear_damp=linear_damp;
-	else
-		area_linear_damp=damp_area->get_linear_damp();
+	//else
+	//	area_linear_damp=damp_area->get_linear_damp();
 
 
 	Vector3 motion;

+ 1 - 1
servers/physics/body_sw.h

@@ -130,7 +130,7 @@ class BodySW : public CollisionObjectSW {
 	BodySW *island_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();
 

+ 15 - 10
servers/physics_2d/body_2d_sw.cpp

@@ -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->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();
 	}
 
+	area_linear_damp += p_area->get_linear_damp();
+	area_angular_damp += p_area->get_angular_damp();
 }
 
 void Body2DSW::integrate_forces(real_t p_step) {
@@ -406,13 +408,15 @@ void Body2DSW::integrate_forces(real_t p_step) {
 
 	int ac = areas.size();
 	bool replace = false;
-	gravity=Vector2(0,0);
+	gravity = Vector2(0,0);
+	area_angular_damp = 0;
+	area_linear_damp = 0;
 	if (ac) {
 		areas.sort();
 		const AreaCMP *aa = &areas[0];
 		damp_area = aa[ac-1].area;
 		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) {
 				replace = true;
 				break;
@@ -420,19 +424,20 @@ void Body2DSW::integrate_forces(real_t p_step) {
 		}
 	}
 	if( !replace ) {
-		_compute_area_gravity(def_area);
+		_compute_area_gravity_and_dampenings(def_area);
 	}
 	gravity*=gravity_scale;
 
+	// If less than 0, override dampenings with that of the Body2D
 	if (angular_damp>=0)
-		area_angular_damp=angular_damp;
-	else
-		area_angular_damp=damp_area->get_angular_damp();
+		area_angular_damp = angular_damp;
+	//else
+	//	area_angular_damp=damp_area->get_angular_damp();
 
 	if (linear_damp>=0)
-		area_linear_damp=linear_damp;
-	else
-		area_linear_damp=damp_area->get_linear_damp();
+		area_linear_damp = linear_damp;
+	//else
+	//	area_linear_damp=damp_area->get_linear_damp();
 
 	Vector2 motion;
 	bool do_motion=false;

+ 1 - 1
servers/physics_2d/body_2d_sw.h

@@ -132,7 +132,7 @@ class Body2DSW : public CollisionObject2DSW {
 	Body2DSW *island_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