Create default World physics spaces on demand only
Changes that the default physics spaces of World resources are only created on first use.
This commit is contained in:
parent
2b710bc336
commit
026549db2e
|
@ -43,6 +43,14 @@ RID World2D::get_canvas() const {
|
||||||
}
|
}
|
||||||
|
|
||||||
RID World2D::get_space() 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;
|
return space;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -71,19 +79,11 @@ void World2D::_bind_methods() {
|
||||||
}
|
}
|
||||||
|
|
||||||
PhysicsDirectSpaceState2D *World2D::get_direct_space_state() {
|
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() {
|
World2D::World2D() {
|
||||||
canvas = RenderingServer::get_singleton()->canvas_create();
|
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() {
|
World2D::~World2D() {
|
||||||
|
@ -91,7 +91,9 @@ World2D::~World2D() {
|
||||||
ERR_FAIL_NULL(PhysicsServer2D::get_singleton());
|
ERR_FAIL_NULL(PhysicsServer2D::get_singleton());
|
||||||
ERR_FAIL_NULL(NavigationServer2D::get_singleton());
|
ERR_FAIL_NULL(NavigationServer2D::get_singleton());
|
||||||
RenderingServer::get_singleton()->free(canvas);
|
RenderingServer::get_singleton()->free(canvas);
|
||||||
PhysicsServer2D::get_singleton()->free(space);
|
if (space.is_valid()) {
|
||||||
|
PhysicsServer2D::get_singleton()->free(space);
|
||||||
|
}
|
||||||
if (navigation_map.is_valid()) {
|
if (navigation_map.is_valid()) {
|
||||||
NavigationServer2D::get_singleton()->free(navigation_map);
|
NavigationServer2D::get_singleton()->free(navigation_map);
|
||||||
}
|
}
|
||||||
|
|
|
@ -43,7 +43,7 @@ class World2D : public Resource {
|
||||||
GDCLASS(World2D, Resource);
|
GDCLASS(World2D, Resource);
|
||||||
|
|
||||||
RID canvas;
|
RID canvas;
|
||||||
RID space;
|
mutable RID space;
|
||||||
mutable RID navigation_map;
|
mutable RID navigation_map;
|
||||||
|
|
||||||
HashSet<Viewport *> viewports;
|
HashSet<Viewport *> viewports;
|
||||||
|
|
|
@ -51,6 +51,14 @@ void World3D::_remove_camera(Camera3D *p_camera) {
|
||||||
}
|
}
|
||||||
|
|
||||||
RID World3D::get_space() const {
|
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;
|
return space;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -121,7 +129,7 @@ Ref<CameraAttributes> World3D::get_camera_attributes() const {
|
||||||
}
|
}
|
||||||
|
|
||||||
PhysicsDirectSpaceState3D *World3D::get_direct_space_state() {
|
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() {
|
void World3D::_bind_methods() {
|
||||||
|
@ -145,22 +153,18 @@ void World3D::_bind_methods() {
|
||||||
}
|
}
|
||||||
|
|
||||||
World3D::World3D() {
|
World3D::World3D() {
|
||||||
space = PhysicsServer3D::get_singleton()->space_create();
|
|
||||||
scenario = RenderingServer::get_singleton()->scenario_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() {
|
World3D::~World3D() {
|
||||||
ERR_FAIL_NULL(PhysicsServer3D::get_singleton());
|
|
||||||
ERR_FAIL_NULL(RenderingServer::get_singleton());
|
ERR_FAIL_NULL(RenderingServer::get_singleton());
|
||||||
|
ERR_FAIL_NULL(PhysicsServer3D::get_singleton());
|
||||||
ERR_FAIL_NULL(NavigationServer3D::get_singleton());
|
ERR_FAIL_NULL(NavigationServer3D::get_singleton());
|
||||||
PhysicsServer3D::get_singleton()->free(space);
|
|
||||||
RenderingServer::get_singleton()->free(scenario);
|
RenderingServer::get_singleton()->free(scenario);
|
||||||
|
if (space.is_valid()) {
|
||||||
|
PhysicsServer3D::get_singleton()->free(space);
|
||||||
|
}
|
||||||
if (navigation_map.is_valid()) {
|
if (navigation_map.is_valid()) {
|
||||||
NavigationServer3D::get_singleton()->free(navigation_map);
|
NavigationServer3D::get_singleton()->free(navigation_map);
|
||||||
}
|
}
|
||||||
|
|
|
@ -45,8 +45,8 @@ class World3D : public Resource {
|
||||||
GDCLASS(World3D, Resource);
|
GDCLASS(World3D, Resource);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
RID space;
|
|
||||||
RID scenario;
|
RID scenario;
|
||||||
|
mutable RID space;
|
||||||
mutable RID navigation_map;
|
mutable RID navigation_map;
|
||||||
|
|
||||||
Ref<Environment> environment;
|
Ref<Environment> environment;
|
||||||
|
|
|
@ -1216,15 +1216,15 @@ GodotPhysicsDirectSpaceState2D *GodotSpace2D::get_direct_state() {
|
||||||
}
|
}
|
||||||
|
|
||||||
GodotSpace2D::GodotSpace2D() {
|
GodotSpace2D::GodotSpace2D() {
|
||||||
body_linear_velocity_sleep_threshold = GLOBAL_DEF("physics/2d/sleep_threshold_linear", 2.0);
|
body_linear_velocity_sleep_threshold = GLOBAL_GET("physics/2d/sleep_threshold_linear");
|
||||||
body_angular_velocity_sleep_threshold = GLOBAL_DEF("physics/2d/sleep_threshold_angular", Math::deg_to_rad(8.0));
|
body_angular_velocity_sleep_threshold = GLOBAL_GET("physics/2d/sleep_threshold_angular");
|
||||||
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);
|
body_time_to_sleep = GLOBAL_GET("physics/2d/time_before_sleep");
|
||||||
solver_iterations = GLOBAL_DEF(PropertyInfo(Variant::INT, "physics/2d/solver/solver_iterations", PROPERTY_HINT_RANGE, "1,32,1,or_greater"), 16);
|
solver_iterations = GLOBAL_GET("physics/2d/solver/solver_iterations");
|
||||||
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_recycle_radius = GLOBAL_GET("physics/2d/solver/contact_recycle_radius");
|
||||||
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_separation = GLOBAL_GET("physics/2d/solver/contact_max_separation");
|
||||||
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_max_allowed_penetration = GLOBAL_GET("physics/2d/solver/contact_max_allowed_penetration");
|
||||||
contact_bias = GLOBAL_DEF(PropertyInfo(Variant::FLOAT, "physics/2d/solver/default_contact_bias", PROPERTY_HINT_RANGE, "0,1,0.01"), 0.8);
|
contact_bias = GLOBAL_GET("physics/2d/solver/default_contact_bias");
|
||||||
constraint_bias = GLOBAL_DEF(PropertyInfo(Variant::FLOAT, "physics/2d/solver/default_constraint_bias", PROPERTY_HINT_RANGE, "0,1,0.01"), 0.2);
|
constraint_bias = GLOBAL_GET("physics/2d/solver/default_constraint_bias");
|
||||||
|
|
||||||
broadphase = GodotBroadPhase2D::create_func();
|
broadphase = GodotBroadPhase2D::create_func();
|
||||||
broadphase->set_pair_callback(_broadphase_pair, this);
|
broadphase->set_pair_callback(_broadphase_pair, this);
|
||||||
|
|
|
@ -1250,14 +1250,14 @@ GodotPhysicsDirectSpaceState3D *GodotSpace3D::get_direct_state() {
|
||||||
}
|
}
|
||||||
|
|
||||||
GodotSpace3D::GodotSpace3D() {
|
GodotSpace3D::GodotSpace3D() {
|
||||||
body_linear_velocity_sleep_threshold = GLOBAL_DEF("physics/3d/sleep_threshold_linear", 0.1);
|
body_linear_velocity_sleep_threshold = GLOBAL_GET("physics/3d/sleep_threshold_linear");
|
||||||
body_angular_velocity_sleep_threshold = GLOBAL_DEF("physics/3d/sleep_threshold_angular", Math::deg_to_rad(8.0));
|
body_angular_velocity_sleep_threshold = GLOBAL_GET("physics/3d/sleep_threshold_angular");
|
||||||
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);
|
body_time_to_sleep = GLOBAL_GET("physics/3d/time_before_sleep");
|
||||||
solver_iterations = GLOBAL_DEF(PropertyInfo(Variant::INT, "physics/3d/solver/solver_iterations", PROPERTY_HINT_RANGE, "1,32,1,or_greater"), 16);
|
solver_iterations = GLOBAL_GET("physics/3d/solver/solver_iterations");
|
||||||
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_recycle_radius = GLOBAL_GET("physics/3d/solver/contact_recycle_radius");
|
||||||
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_separation = GLOBAL_GET("physics/3d/solver/contact_max_separation");
|
||||||
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_max_allowed_penetration = GLOBAL_GET("physics/3d/solver/contact_max_allowed_penetration");
|
||||||
contact_bias = GLOBAL_DEF(PropertyInfo(Variant::FLOAT, "physics/3d/solver/default_contact_bias", PROPERTY_HINT_RANGE, "0,1,0.01"), 0.8);
|
contact_bias = GLOBAL_GET("physics/3d/solver/default_contact_bias");
|
||||||
|
|
||||||
broadphase = GodotBroadPhase3D::create_func();
|
broadphase = GodotBroadPhase3D::create_func();
|
||||||
broadphase->set_pair_callback(_broadphase_pair, this);
|
broadphase->set_pair_callback(_broadphase_pair, this);
|
||||||
|
|
|
@ -879,6 +879,23 @@ void PhysicsServer2D::_bind_methods() {
|
||||||
|
|
||||||
PhysicsServer2D::PhysicsServer2D() {
|
PhysicsServer2D::PhysicsServer2D() {
|
||||||
singleton = this;
|
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() {
|
PhysicsServer2D::~PhysicsServer2D() {
|
||||||
|
|
|
@ -1047,6 +1047,22 @@ void PhysicsServer3D::_bind_methods() {
|
||||||
|
|
||||||
PhysicsServer3D::PhysicsServer3D() {
|
PhysicsServer3D::PhysicsServer3D() {
|
||||||
singleton = this;
|
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() {
|
PhysicsServer3D::~PhysicsServer3D() {
|
||||||
|
|
Loading…
Reference in New Issue