|
@@ -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);
|
|
|
}
|