diff options
| author | smix8 <52464204+smix8@users.noreply.github.com> | 2023-01-31 00:01:21 +0100 | 
|---|---|---|
| committer | smix8 <52464204+smix8@users.noreply.github.com> | 2023-01-31 18:26:52 +0100 | 
| commit | 026549db2eee3e5b356304e910e15e416f330c5e (patch) | |
| tree | dbe8084a518c750b1ba3957e3d837cd124561d47 | |
| parent | 2b710bc336a02ace95eb0588f3b0744923faf004 (diff) | |
Create default World physics spaces on demand only
Changes that the default physics spaces of World resources are only created on first use.
| -rw-r--r-- | scene/resources/world_2d.cpp | 22 | ||||
| -rw-r--r-- | scene/resources/world_2d.h | 2 | ||||
| -rw-r--r-- | scene/resources/world_3d.cpp | 24 | ||||
| -rw-r--r-- | scene/resources/world_3d.h | 2 | ||||
| -rw-r--r-- | servers/physics_2d/godot_space_2d.cpp | 18 | ||||
| -rw-r--r-- | servers/physics_3d/godot_space_3d.cpp | 16 | ||||
| -rw-r--r-- | servers/physics_server_2d.cpp | 17 | ||||
| -rw-r--r-- | servers/physics_server_3d.cpp | 16 | 
8 files changed, 78 insertions, 39 deletions
diff --git a/scene/resources/world_2d.cpp b/scene/resources/world_2d.cpp index 2a70139bcb..c7304da358 100644 --- a/scene/resources/world_2d.cpp +++ b/scene/resources/world_2d.cpp @@ -43,6 +43,14 @@ RID World2D::get_canvas() const {  }  RID World2D::get_space() const { +	if (space.is_null()) { +		space = PhysicsServer2D::get_singleton()->space_create(); +		PhysicsServer2D::get_singleton()->space_set_active(space, true); +		PhysicsServer2D::get_singleton()->area_set_param(space, PhysicsServer2D::AREA_PARAM_GRAVITY, GLOBAL_GET("physics/2d/default_gravity")); +		PhysicsServer2D::get_singleton()->area_set_param(space, PhysicsServer2D::AREA_PARAM_GRAVITY_VECTOR, GLOBAL_GET("physics/2d/default_gravity_vector")); +		PhysicsServer2D::get_singleton()->area_set_param(space, PhysicsServer2D::AREA_PARAM_LINEAR_DAMP, GLOBAL_GET("physics/2d/default_linear_damp")); +		PhysicsServer2D::get_singleton()->area_set_param(space, PhysicsServer2D::AREA_PARAM_ANGULAR_DAMP, GLOBAL_GET("physics/2d/default_angular_damp")); +	}  	return space;  } @@ -71,19 +79,11 @@ void World2D::_bind_methods() {  }  PhysicsDirectSpaceState2D *World2D::get_direct_space_state() { -	return PhysicsServer2D::get_singleton()->space_get_direct_state(space); +	return PhysicsServer2D::get_singleton()->space_get_direct_state(get_space());  }  World2D::World2D() {  	canvas = RenderingServer::get_singleton()->canvas_create(); - -	// Create and configure space2D to be more friendly with pixels than meters -	space = PhysicsServer2D::get_singleton()->space_create(); -	PhysicsServer2D::get_singleton()->space_set_active(space, true); -	PhysicsServer2D::get_singleton()->area_set_param(space, PhysicsServer2D::AREA_PARAM_GRAVITY, GLOBAL_DEF_BASIC("physics/2d/default_gravity", 980.0)); -	PhysicsServer2D::get_singleton()->area_set_param(space, PhysicsServer2D::AREA_PARAM_GRAVITY_VECTOR, GLOBAL_DEF_BASIC("physics/2d/default_gravity_vector", Vector2(0, 1))); -	PhysicsServer2D::get_singleton()->area_set_param(space, PhysicsServer2D::AREA_PARAM_LINEAR_DAMP, GLOBAL_DEF(PropertyInfo(Variant::FLOAT, "physics/2d/default_linear_damp", PROPERTY_HINT_RANGE, "-1,100,0.001,or_greater"), 0.1)); -	PhysicsServer2D::get_singleton()->area_set_param(space, PhysicsServer2D::AREA_PARAM_ANGULAR_DAMP, GLOBAL_DEF(PropertyInfo(Variant::FLOAT, "physics/2d/default_angular_damp", PROPERTY_HINT_RANGE, "-1,100,0.001,or_greater"), 1.0));  }  World2D::~World2D() { @@ -91,7 +91,9 @@ World2D::~World2D() {  	ERR_FAIL_NULL(PhysicsServer2D::get_singleton());  	ERR_FAIL_NULL(NavigationServer2D::get_singleton());  	RenderingServer::get_singleton()->free(canvas); -	PhysicsServer2D::get_singleton()->free(space); +	if (space.is_valid()) { +		PhysicsServer2D::get_singleton()->free(space); +	}  	if (navigation_map.is_valid()) {  		NavigationServer2D::get_singleton()->free(navigation_map);  	} diff --git a/scene/resources/world_2d.h b/scene/resources/world_2d.h index f02dddd2fe..0b3b9df7dc 100644 --- a/scene/resources/world_2d.h +++ b/scene/resources/world_2d.h @@ -43,7 +43,7 @@ class World2D : public Resource {  	GDCLASS(World2D, Resource);  	RID canvas; -	RID space; +	mutable RID space;  	mutable RID navigation_map;  	HashSet<Viewport *> viewports; diff --git a/scene/resources/world_3d.cpp b/scene/resources/world_3d.cpp index cc4d261c0d..82c056d5ee 100644 --- a/scene/resources/world_3d.cpp +++ b/scene/resources/world_3d.cpp @@ -51,6 +51,14 @@ void World3D::_remove_camera(Camera3D *p_camera) {  }  RID World3D::get_space() const { +	if (space.is_null()) { +		space = PhysicsServer3D::get_singleton()->space_create(); +		PhysicsServer3D::get_singleton()->space_set_active(space, true); +		PhysicsServer3D::get_singleton()->area_set_param(space, PhysicsServer3D::AREA_PARAM_GRAVITY, GLOBAL_GET("physics/3d/default_gravity")); +		PhysicsServer3D::get_singleton()->area_set_param(space, PhysicsServer3D::AREA_PARAM_GRAVITY_VECTOR, GLOBAL_GET("physics/3d/default_gravity_vector")); +		PhysicsServer3D::get_singleton()->area_set_param(space, PhysicsServer3D::AREA_PARAM_LINEAR_DAMP, GLOBAL_GET("physics/3d/default_linear_damp")); +		PhysicsServer3D::get_singleton()->area_set_param(space, PhysicsServer3D::AREA_PARAM_ANGULAR_DAMP, GLOBAL_GET("physics/3d/default_angular_damp")); +	}  	return space;  } @@ -121,7 +129,7 @@ Ref<CameraAttributes> World3D::get_camera_attributes() const {  }  PhysicsDirectSpaceState3D *World3D::get_direct_space_state() { -	return PhysicsServer3D::get_singleton()->space_get_direct_state(space); +	return PhysicsServer3D::get_singleton()->space_get_direct_state(get_space());  }  void World3D::_bind_methods() { @@ -145,22 +153,18 @@ void World3D::_bind_methods() {  }  World3D::World3D() { -	space = PhysicsServer3D::get_singleton()->space_create();  	scenario = RenderingServer::get_singleton()->scenario_create(); - -	PhysicsServer3D::get_singleton()->space_set_active(space, true); -	PhysicsServer3D::get_singleton()->area_set_param(space, PhysicsServer3D::AREA_PARAM_GRAVITY, GLOBAL_DEF_BASIC("physics/3d/default_gravity", 9.8)); -	PhysicsServer3D::get_singleton()->area_set_param(space, PhysicsServer3D::AREA_PARAM_GRAVITY_VECTOR, GLOBAL_DEF_BASIC("physics/3d/default_gravity_vector", Vector3(0, -1, 0))); -	PhysicsServer3D::get_singleton()->area_set_param(space, PhysicsServer3D::AREA_PARAM_LINEAR_DAMP, GLOBAL_DEF(PropertyInfo(Variant::FLOAT, "physics/3d/default_linear_damp", PROPERTY_HINT_RANGE, "0,100,0.001,or_greater"), 0.1)); -	PhysicsServer3D::get_singleton()->area_set_param(space, PhysicsServer3D::AREA_PARAM_ANGULAR_DAMP, GLOBAL_DEF(PropertyInfo(Variant::FLOAT, "physics/3d/default_angular_damp", PROPERTY_HINT_RANGE, "0,100,0.001,or_greater"), 0.1));  }  World3D::~World3D() { -	ERR_FAIL_NULL(PhysicsServer3D::get_singleton());  	ERR_FAIL_NULL(RenderingServer::get_singleton()); +	ERR_FAIL_NULL(PhysicsServer3D::get_singleton());  	ERR_FAIL_NULL(NavigationServer3D::get_singleton()); -	PhysicsServer3D::get_singleton()->free(space); +  	RenderingServer::get_singleton()->free(scenario); +	if (space.is_valid()) { +		PhysicsServer3D::get_singleton()->free(space); +	}  	if (navigation_map.is_valid()) {  		NavigationServer3D::get_singleton()->free(navigation_map);  	} diff --git a/scene/resources/world_3d.h b/scene/resources/world_3d.h index ad17daf466..518fff64e2 100644 --- a/scene/resources/world_3d.h +++ b/scene/resources/world_3d.h @@ -45,8 +45,8 @@ class World3D : public Resource {  	GDCLASS(World3D, Resource);  private: -	RID space;  	RID scenario; +	mutable RID space;  	mutable RID navigation_map;  	Ref<Environment> environment; diff --git a/servers/physics_2d/godot_space_2d.cpp b/servers/physics_2d/godot_space_2d.cpp index 0a5a7c93cc..1d1f1ba054 100644 --- a/servers/physics_2d/godot_space_2d.cpp +++ b/servers/physics_2d/godot_space_2d.cpp @@ -1216,15 +1216,15 @@ GodotPhysicsDirectSpaceState2D *GodotSpace2D::get_direct_state() {  }  GodotSpace2D::GodotSpace2D() { -	body_linear_velocity_sleep_threshold = GLOBAL_DEF("physics/2d/sleep_threshold_linear", 2.0); -	body_angular_velocity_sleep_threshold = GLOBAL_DEF("physics/2d/sleep_threshold_angular", Math::deg_to_rad(8.0)); -	body_time_to_sleep = GLOBAL_DEF(PropertyInfo(Variant::FLOAT, "physics/2d/time_before_sleep", PROPERTY_HINT_RANGE, "0,5,0.01,or_greater"), 0.5); -	solver_iterations = GLOBAL_DEF(PropertyInfo(Variant::INT, "physics/2d/solver/solver_iterations", PROPERTY_HINT_RANGE, "1,32,1,or_greater"), 16); -	contact_recycle_radius = GLOBAL_DEF(PropertyInfo(Variant::FLOAT, "physics/2d/solver/contact_recycle_radius", PROPERTY_HINT_RANGE, "0,10,0.01,or_greater"), 1.0); -	contact_max_separation = GLOBAL_DEF(PropertyInfo(Variant::FLOAT, "physics/2d/solver/contact_max_separation", PROPERTY_HINT_RANGE, "0,10,0.01,or_greater"), 1.5); -	contact_max_allowed_penetration = GLOBAL_DEF(PropertyInfo(Variant::FLOAT, "physics/2d/solver/contact_max_allowed_penetration", PROPERTY_HINT_RANGE, "0,10,0.01,or_greater"), 0.3); -	contact_bias = GLOBAL_DEF(PropertyInfo(Variant::FLOAT, "physics/2d/solver/default_contact_bias", PROPERTY_HINT_RANGE, "0,1,0.01"), 0.8); -	constraint_bias = GLOBAL_DEF(PropertyInfo(Variant::FLOAT, "physics/2d/solver/default_constraint_bias", PROPERTY_HINT_RANGE, "0,1,0.01"), 0.2); +	body_linear_velocity_sleep_threshold = GLOBAL_GET("physics/2d/sleep_threshold_linear"); +	body_angular_velocity_sleep_threshold = GLOBAL_GET("physics/2d/sleep_threshold_angular"); +	body_time_to_sleep = GLOBAL_GET("physics/2d/time_before_sleep"); +	solver_iterations = GLOBAL_GET("physics/2d/solver/solver_iterations"); +	contact_recycle_radius = GLOBAL_GET("physics/2d/solver/contact_recycle_radius"); +	contact_max_separation = GLOBAL_GET("physics/2d/solver/contact_max_separation"); +	contact_max_allowed_penetration = GLOBAL_GET("physics/2d/solver/contact_max_allowed_penetration"); +	contact_bias = GLOBAL_GET("physics/2d/solver/default_contact_bias"); +	constraint_bias = GLOBAL_GET("physics/2d/solver/default_constraint_bias");  	broadphase = GodotBroadPhase2D::create_func();  	broadphase->set_pair_callback(_broadphase_pair, this); diff --git a/servers/physics_3d/godot_space_3d.cpp b/servers/physics_3d/godot_space_3d.cpp index 93572965d2..35f6fa023d 100644 --- a/servers/physics_3d/godot_space_3d.cpp +++ b/servers/physics_3d/godot_space_3d.cpp @@ -1250,14 +1250,14 @@ GodotPhysicsDirectSpaceState3D *GodotSpace3D::get_direct_state() {  }  GodotSpace3D::GodotSpace3D() { -	body_linear_velocity_sleep_threshold = GLOBAL_DEF("physics/3d/sleep_threshold_linear", 0.1); -	body_angular_velocity_sleep_threshold = GLOBAL_DEF("physics/3d/sleep_threshold_angular", Math::deg_to_rad(8.0)); -	body_time_to_sleep = GLOBAL_DEF(PropertyInfo(Variant::FLOAT, "physics/3d/time_before_sleep", PROPERTY_HINT_RANGE, "0,5,0.01,or_greater"), 0.5); -	solver_iterations = GLOBAL_DEF(PropertyInfo(Variant::INT, "physics/3d/solver/solver_iterations", PROPERTY_HINT_RANGE, "1,32,1,or_greater"), 16); -	contact_recycle_radius = GLOBAL_DEF(PropertyInfo(Variant::FLOAT, "physics/3d/solver/contact_recycle_radius", PROPERTY_HINT_RANGE, "0,0.1,0.01,or_greater"), 0.01); -	contact_max_separation = GLOBAL_DEF(PropertyInfo(Variant::FLOAT, "physics/3d/solver/contact_max_separation", PROPERTY_HINT_RANGE, "0,0.1,0.01,or_greater"), 0.05); -	contact_max_allowed_penetration = GLOBAL_DEF(PropertyInfo(Variant::FLOAT, "physics/3d/solver/contact_max_allowed_penetration", PROPERTY_HINT_RANGE, "0,0.1,0.01,or_greater"), 0.01); -	contact_bias = GLOBAL_DEF(PropertyInfo(Variant::FLOAT, "physics/3d/solver/default_contact_bias", PROPERTY_HINT_RANGE, "0,1,0.01"), 0.8); +	body_linear_velocity_sleep_threshold = GLOBAL_GET("physics/3d/sleep_threshold_linear"); +	body_angular_velocity_sleep_threshold = GLOBAL_GET("physics/3d/sleep_threshold_angular"); +	body_time_to_sleep = GLOBAL_GET("physics/3d/time_before_sleep"); +	solver_iterations = GLOBAL_GET("physics/3d/solver/solver_iterations"); +	contact_recycle_radius = GLOBAL_GET("physics/3d/solver/contact_recycle_radius"); +	contact_max_separation = GLOBAL_GET("physics/3d/solver/contact_max_separation"); +	contact_max_allowed_penetration = GLOBAL_GET("physics/3d/solver/contact_max_allowed_penetration"); +	contact_bias = GLOBAL_GET("physics/3d/solver/default_contact_bias");  	broadphase = GodotBroadPhase3D::create_func();  	broadphase->set_pair_callback(_broadphase_pair, this); diff --git a/servers/physics_server_2d.cpp b/servers/physics_server_2d.cpp index 15c2749484..f9a8d5f156 100644 --- a/servers/physics_server_2d.cpp +++ b/servers/physics_server_2d.cpp @@ -879,6 +879,23 @@ void PhysicsServer2D::_bind_methods() {  PhysicsServer2D::PhysicsServer2D() {  	singleton = this; + +	// World2D physics space +	GLOBAL_DEF_BASIC("physics/2d/default_gravity", 980.0); +	GLOBAL_DEF_BASIC("physics/2d/default_gravity_vector", Vector2(0, 1)); +	GLOBAL_DEF(PropertyInfo(Variant::FLOAT, "physics/2d/default_linear_damp", PROPERTY_HINT_RANGE, "-1,100,0.001,or_greater"), 0.1); +	GLOBAL_DEF(PropertyInfo(Variant::FLOAT, "physics/2d/default_angular_damp", PROPERTY_HINT_RANGE, "-1,100,0.001,or_greater"), 1.0); + +	// PhysicsServer2D +	GLOBAL_DEF("physics/2d/sleep_threshold_linear", 2.0); +	GLOBAL_DEF("physics/2d/sleep_threshold_angular", Math::deg_to_rad(8.0)); +	GLOBAL_DEF(PropertyInfo(Variant::FLOAT, "physics/2d/time_before_sleep", PROPERTY_HINT_RANGE, "0,5,0.01,or_greater"), 0.5); +	GLOBAL_DEF(PropertyInfo(Variant::INT, "physics/2d/solver/solver_iterations", PROPERTY_HINT_RANGE, "1,32,1,or_greater"), 16); +	GLOBAL_DEF(PropertyInfo(Variant::FLOAT, "physics/2d/solver/contact_recycle_radius", PROPERTY_HINT_RANGE, "0,10,0.01,or_greater"), 1.0); +	GLOBAL_DEF(PropertyInfo(Variant::FLOAT, "physics/2d/solver/contact_max_separation", PROPERTY_HINT_RANGE, "0,10,0.01,or_greater"), 1.5); +	GLOBAL_DEF(PropertyInfo(Variant::FLOAT, "physics/2d/solver/contact_max_allowed_penetration", PROPERTY_HINT_RANGE, "0,10,0.01,or_greater"), 0.3); +	GLOBAL_DEF(PropertyInfo(Variant::FLOAT, "physics/2d/solver/default_contact_bias", PROPERTY_HINT_RANGE, "0,1,0.01"), 0.8); +	GLOBAL_DEF(PropertyInfo(Variant::FLOAT, "physics/2d/solver/default_constraint_bias", PROPERTY_HINT_RANGE, "0,1,0.01"), 0.2);  }  PhysicsServer2D::~PhysicsServer2D() { diff --git a/servers/physics_server_3d.cpp b/servers/physics_server_3d.cpp index 864774374b..6a163c86d2 100644 --- a/servers/physics_server_3d.cpp +++ b/servers/physics_server_3d.cpp @@ -1047,6 +1047,22 @@ void PhysicsServer3D::_bind_methods() {  PhysicsServer3D::PhysicsServer3D() {  	singleton = this; + +	// World3D physics space +	GLOBAL_DEF_BASIC("physics/3d/default_gravity", 9.8); +	GLOBAL_DEF_BASIC("physics/3d/default_gravity_vector", Vector3(0, -1, 0)); +	GLOBAL_DEF(PropertyInfo(Variant::FLOAT, "physics/3d/default_linear_damp", PROPERTY_HINT_RANGE, "0,100,0.001,or_greater"), 0.1); +	GLOBAL_DEF(PropertyInfo(Variant::FLOAT, "physics/3d/default_angular_damp", PROPERTY_HINT_RANGE, "0,100,0.001,or_greater"), 0.1); + +	// PhysicsServer3D +	GLOBAL_DEF("physics/3d/sleep_threshold_linear", 0.1); +	GLOBAL_DEF("physics/3d/sleep_threshold_angular", Math::deg_to_rad(8.0)); +	GLOBAL_DEF(PropertyInfo(Variant::FLOAT, "physics/3d/time_before_sleep", PROPERTY_HINT_RANGE, "0,5,0.01,or_greater"), 0.5); +	GLOBAL_DEF(PropertyInfo(Variant::INT, "physics/3d/solver/solver_iterations", PROPERTY_HINT_RANGE, "1,32,1,or_greater"), 16); +	GLOBAL_DEF(PropertyInfo(Variant::FLOAT, "physics/3d/solver/contact_recycle_radius", PROPERTY_HINT_RANGE, "0,0.1,0.01,or_greater"), 0.01); +	GLOBAL_DEF(PropertyInfo(Variant::FLOAT, "physics/3d/solver/contact_max_separation", PROPERTY_HINT_RANGE, "0,0.1,0.01,or_greater"), 0.05); +	GLOBAL_DEF(PropertyInfo(Variant::FLOAT, "physics/3d/solver/contact_max_allowed_penetration", PROPERTY_HINT_RANGE, "0,0.1,0.01,or_greater"), 0.01); +	GLOBAL_DEF(PropertyInfo(Variant::FLOAT, "physics/3d/solver/default_contact_bias", PROPERTY_HINT_RANGE, "0,1,0.01"), 0.8);  }  PhysicsServer3D::~PhysicsServer3D() {  |