diff options
| -rw-r--r-- | modules/bullet/SCsub | 2 | ||||
| -rw-r--r-- | modules/bullet/rigid_body_bullet.cpp | 40 | ||||
| -rw-r--r-- | modules/bullet/space_bullet.cpp | 10 | ||||
| -rw-r--r-- | modules/bullet/space_bullet.h | 6 | 
4 files changed, 36 insertions, 22 deletions
diff --git a/modules/bullet/SCsub b/modules/bullet/SCsub index 6f64edce3d..b853ebfc63 100644 --- a/modules/bullet/SCsub +++ b/modules/bullet/SCsub @@ -204,6 +204,8 @@ if env["builtin_bullet"]:      # if env['target'] == "debug" or env['target'] == "release_debug":      #     env_bullet.Append(CPPDEFINES=['BT_DEBUG']) +    env_bullet.Append(CPPDEFINES=["BT_USE_OLD_DAMPING_METHOD"]) +      env_thirdparty = env_bullet.Clone()      env_thirdparty.disable_warnings()      env_thirdparty.add_source_files(env.modules_sources, thirdparty_sources) diff --git a/modules/bullet/rigid_body_bullet.cpp b/modules/bullet/rigid_body_bullet.cpp index a4f9affa95..e393396713 100644 --- a/modules/bullet/rigid_body_bullet.cpp +++ b/modules/bullet/rigid_body_bullet.cpp @@ -503,15 +503,18 @@ void RigidBodyBullet::set_param(PhysicsServer3D::BodyParameter p_param, real_t p  		}  		case PhysicsServer3D::BODY_PARAM_LINEAR_DAMP:  			linearDamp = p_value; -			btBody->setDamping(linearDamp, angularDamp); +			// Mark for updating total linear damping. +			scratch_space_override_modificator();  			break;  		case PhysicsServer3D::BODY_PARAM_ANGULAR_DAMP:  			angularDamp = p_value; -			btBody->setDamping(linearDamp, angularDamp); +			// Mark for updating total angular damping. +			scratch_space_override_modificator();  			break;  		case PhysicsServer3D::BODY_PARAM_GRAVITY_SCALE:  			gravity_scale = p_value; -			/// The Bullet gravity will be is set by reload_space_override_modificator +			// The Bullet gravity will be is set by reload_space_override_modificator. +			// Mark for updating total gravity scale.  			scratch_space_override_modificator();  			break;  		default: @@ -902,21 +905,20 @@ void RigidBodyBullet::on_exit_area(AreaBullet *p_area) {  }  void RigidBodyBullet::reload_space_override_modificator() { -  	// Make sure that kinematic bodies have their total gravity calculated  	if (!is_active() && PhysicsServer3D::BODY_MODE_KINEMATIC != mode)  		return; -	Vector3 newGravity(space->get_gravity_direction() * space->get_gravity_magnitude()); -	real_t newLinearDamp(linearDamp); -	real_t newAngularDamp(angularDamp); +	Vector3 newGravity(0.0, 0.0, 0.0); +	real_t newLinearDamp = MAX(0.0, linearDamp); +	real_t newAngularDamp = MAX(0.0, angularDamp);  	AreaBullet *currentArea;  	// Variable used to calculate new gravity for gravity point areas, it is pointed by currentGravity pointer  	Vector3 support_gravity(0, 0, 0); -	int countCombined(0); -	for (int i = areaWhereIamCount - 1; 0 <= i; --i) { +	bool stopped = false; +	for (int i = areaWhereIamCount - 1; (0 <= i) && !stopped; --i) {  		currentArea = areasWhereIam[i]; @@ -965,7 +967,6 @@ void RigidBodyBullet::reload_space_override_modificator() {  				newGravity += support_gravity;  				newLinearDamp += currentArea->get_spOv_linearDamp();  				newAngularDamp += currentArea->get_spOv_angularDamp(); -				++countCombined;  				break;  			case PhysicsServer3D::AREA_SPACE_OVERRIDE_COMBINE_REPLACE:  				/// This area adds its gravity/damp values to whatever has been calculated @@ -974,32 +975,31 @@ void RigidBodyBullet::reload_space_override_modificator() {  				newGravity += support_gravity;  				newLinearDamp += currentArea->get_spOv_linearDamp();  				newAngularDamp += currentArea->get_spOv_angularDamp(); -				++countCombined; -				goto endAreasCycle; +				stopped = true; +				break;  			case PhysicsServer3D::AREA_SPACE_OVERRIDE_REPLACE:  				/// This area replaces any gravity/damp, even the default one, and  				/// stops taking into account the rest of the areas.  				newGravity = support_gravity;  				newLinearDamp = currentArea->get_spOv_linearDamp();  				newAngularDamp = currentArea->get_spOv_angularDamp(); -				countCombined = 1; -				goto endAreasCycle; +				stopped = true; +				break;  			case PhysicsServer3D::AREA_SPACE_OVERRIDE_REPLACE_COMBINE:  				/// This area replaces any gravity/damp calculated so far, but keeps  				/// calculating the rest of the areas, down to the default one.  				newGravity = support_gravity;  				newLinearDamp = currentArea->get_spOv_linearDamp();  				newAngularDamp = currentArea->get_spOv_angularDamp(); -				countCombined = 1;  				break;  		}  	} -endAreasCycle: -	if (1 < countCombined) { -		newGravity /= countCombined; -		newLinearDamp /= countCombined; -		newAngularDamp /= countCombined; +	// Add default gravity and damping from space. +	if (!stopped) { +		newGravity += space->get_gravity_direction() * space->get_gravity_magnitude(); +		newLinearDamp += space->get_linear_damp(); +		newAngularDamp += space->get_angular_damp();  	}  	btVector3 newBtGravity; diff --git a/modules/bullet/space_bullet.cpp b/modules/bullet/space_bullet.cpp index 1659664ff9..d49e635fd5 100644 --- a/modules/bullet/space_bullet.cpp +++ b/modules/bullet/space_bullet.cpp @@ -342,6 +342,8 @@ SpaceBullet::SpaceBullet() :  		godotFilterCallback(nullptr),  		gravityDirection(0, -1, 0),  		gravityMagnitude(10), +		linear_damp(0.0), +		angular_damp(0.0),  		contactDebugCount(0),  		delta_time(0.) { @@ -379,8 +381,11 @@ void SpaceBullet::set_param(PhysicsServer3D::AreaParameter p_param, const Varian  			update_gravity();  			break;  		case PhysicsServer3D::AREA_PARAM_LINEAR_DAMP: +			linear_damp = p_value; +			break;  		case PhysicsServer3D::AREA_PARAM_ANGULAR_DAMP: -			break; // No damp +			angular_damp = p_value; +			break;  		case PhysicsServer3D::AREA_PARAM_PRIORITY:  			// Priority is always 0, the lower  			break; @@ -401,8 +406,9 @@ Variant SpaceBullet::get_param(PhysicsServer3D::AreaParameter p_param) {  		case PhysicsServer3D::AREA_PARAM_GRAVITY_VECTOR:  			return gravityDirection;  		case PhysicsServer3D::AREA_PARAM_LINEAR_DAMP: +			return linear_damp;  		case PhysicsServer3D::AREA_PARAM_ANGULAR_DAMP: -			return 0; // No damp +			return angular_damp;  		case PhysicsServer3D::AREA_PARAM_PRIORITY:  			return 0; // Priority is always 0, the lower  		case PhysicsServer3D::AREA_PARAM_GRAVITY_IS_POINT: diff --git a/modules/bullet/space_bullet.h b/modules/bullet/space_bullet.h index f9a8c063fd..3d4a2aeceb 100644 --- a/modules/bullet/space_bullet.h +++ b/modules/bullet/space_bullet.h @@ -108,6 +108,9 @@ class SpaceBullet : public RIDBullet {  	Vector3 gravityDirection;  	real_t gravityMagnitude; +	real_t linear_damp; +	real_t angular_damp; +  	Vector<AreaBullet *> areas;  	Vector<Vector3> contactDebug; @@ -177,6 +180,9 @@ public:  	void update_gravity(); +	real_t get_linear_damp() const { return linear_damp; } +	real_t get_angular_damp() const { return angular_damp; } +  	bool test_body_motion(RigidBodyBullet *p_body, const Transform &p_from, const Vector3 &p_motion, bool p_infinite_inertia, PhysicsServer3D::MotionResult *r_result, bool p_exclude_raycast_shapes);  	int test_ray_separation(RigidBodyBullet *p_body, const Transform &p_transform, bool p_infinite_inertia, Vector3 &r_recover_motion, PhysicsServer3D::SeparationResult *r_results, int p_result_max, float p_margin);  |