Editor separate physics fallback
This commit is contained in:
parent
b3bcb2dc14
commit
be0ad401bb
4 changed files with 54 additions and 30 deletions
|
@ -1504,8 +1504,10 @@ ProjectSettings::ProjectSettings() {
|
|||
// Keep the enum values in sync with the `DisplayServer::VSyncMode` enum.
|
||||
custom_prop_info["display/window/vsync/vsync_mode"] = PropertyInfo(Variant::INT, "display/window/vsync/vsync_mode", PROPERTY_HINT_ENUM, "Disabled,Enabled,Adaptive,Mailbox");
|
||||
custom_prop_info["rendering/driver/threads/thread_model"] = PropertyInfo(Variant::INT, "rendering/driver/threads/thread_model", PROPERTY_HINT_ENUM, "Single-Unsafe,Single-Safe,Multi-Threaded");
|
||||
GLOBAL_DEF("physics/2d/run_on_separate_thread", false);
|
||||
GLOBAL_DEF("physics/3d/run_on_separate_thread", false);
|
||||
GLOBAL_DEF_RST("physics/2d/run_on_separate_thread", false);
|
||||
GLOBAL_DEF_RST("physics/2d/run_on_separate_thread.editor", false);
|
||||
GLOBAL_DEF_RST("physics/3d/run_on_separate_thread", false);
|
||||
GLOBAL_DEF_RST("physics/3d/run_on_separate_thread.editor", false);
|
||||
|
||||
GLOBAL_DEF_BASIC(PropertyInfo(Variant::STRING, "display/window/stretch/mode", PROPERTY_HINT_ENUM, "disabled,canvas_items,viewport"), "disabled");
|
||||
GLOBAL_DEF_BASIC(PropertyInfo(Variant::STRING, "display/window/stretch/aspect", PROPERTY_HINT_ENUM, "ignore,keep,keep_width,keep_height,expand"), "keep");
|
||||
|
|
|
@ -2224,6 +2224,9 @@
|
|||
<member name="physics/2d/run_on_separate_thread" type="bool" setter="" getter="" default="false">
|
||||
If [code]true[/code], the 2D physics server runs on a separate thread, making better use of multi-core CPUs. If [code]false[/code], the 2D physics server runs on the main thread. Running the physics server on a separate thread can increase performance, but restricts API access to only physics process.
|
||||
</member>
|
||||
<member name="physics/2d/run_on_separate_thread.editor" type="bool" setter="" getter="" default="false">
|
||||
Editor override for [member physics/2d/run_on_separate_thread] to specify whether the editor's 2D physics server should run on a separate thread or not.
|
||||
</member>
|
||||
<member name="physics/2d/sleep_threshold_angular" type="float" setter="" getter="" default="0.139626">
|
||||
Threshold angular velocity under which a 2D physics body will be considered inactive. See [constant PhysicsServer2D.SPACE_PARAM_BODY_ANGULAR_VELOCITY_SLEEP_THRESHOLD].
|
||||
</member>
|
||||
|
@ -2303,6 +2306,9 @@
|
|||
<member name="physics/3d/run_on_separate_thread" type="bool" setter="" getter="" default="false">
|
||||
If [code]true[/code], the 3D physics server runs on a separate thread, making better use of multi-core CPUs. If [code]false[/code], the 3D physics server runs on the main thread. Running the physics server on a separate thread can increase performance, but restricts API access to only physics process.
|
||||
</member>
|
||||
<member name="physics/3d/run_on_separate_thread.editor" type="bool" setter="" getter="" default="false">
|
||||
Editor override for [member physics/3d/run_on_separate_thread] to specify whether the editor's 3D physics server should run on a separate thread or not.
|
||||
</member>
|
||||
<member name="physics/3d/sleep_threshold_angular" type="float" setter="" getter="" default="0.139626">
|
||||
Threshold angular velocity under which a 3D physics body will be considered inactive. See [constant PhysicsServer3D.SPACE_PARAM_BODY_ANGULAR_VELOCITY_SLEEP_THRESHOLD].
|
||||
</member>
|
||||
|
|
|
@ -917,6 +917,38 @@ void Node3DEditorViewport::_find_items_at_pos(const Point2 &p_pos, Vector<_RayRe
|
|||
r_results.sort();
|
||||
}
|
||||
|
||||
void Node3DEditorViewport::_reposition_selected_nodes() {
|
||||
if (collision_reposition) {
|
||||
List<Node *> &selection = editor_selection->get_selected_node_list();
|
||||
|
||||
if (selection.size() == 1) {
|
||||
Node3D *first_selected_node = Object::cast_to<Node3D>(selection.front()->get());
|
||||
double snap = EDITOR_GET("interface/inspector/default_float_step");
|
||||
int snap_step_decimals = Math::range_step_decimals(snap);
|
||||
set_message(TTR("Translating:") + " (" + String::num(first_selected_node->get_global_position().x, snap_step_decimals) + ", " +
|
||||
String::num(first_selected_node->get_global_position().y, snap_step_decimals) + ", " + String::num(first_selected_node->get_global_position().z, snap_step_decimals) + ")");
|
||||
first_selected_node->set_global_position(spatial_editor->snap_point(_get_instance_position(_edit.mouse_pos, first_selected_node)));
|
||||
}
|
||||
}
|
||||
|
||||
if (!update_preview_node) {
|
||||
return;
|
||||
}
|
||||
if (preview_node->is_inside_tree()) {
|
||||
preview_node_pos = spatial_editor->snap_point(_get_instance_position(preview_node_viewport_pos, preview_node));
|
||||
double snap = EDITOR_GET("interface/inspector/default_float_step");
|
||||
int snap_step_decimals = Math::range_step_decimals(snap);
|
||||
set_message(TTR("Instantiating:") + " (" + String::num(preview_node_pos.x, snap_step_decimals) + ", " +
|
||||
String::num(preview_node_pos.y, snap_step_decimals) + ", " + String::num(preview_node_pos.z, snap_step_decimals) + ")");
|
||||
Transform3D preview_gl_transform = Transform3D(Basis(), preview_node_pos);
|
||||
preview_node->set_global_transform(preview_gl_transform);
|
||||
if (!preview_node->is_visible()) {
|
||||
preview_node->show();
|
||||
}
|
||||
}
|
||||
update_preview_node = false;
|
||||
}
|
||||
|
||||
Vector3 Node3DEditorViewport::_get_screen_to_space(const Vector3 &p_vector3) {
|
||||
Projection cm;
|
||||
if (orthogonal) {
|
||||
|
@ -2850,6 +2882,8 @@ void Node3DEditorViewport::_project_settings_changed() {
|
|||
|
||||
const float texture_mipmap_bias = GLOBAL_GET("rendering/textures/default_filters/texture_mipmap_bias");
|
||||
viewport->set_texture_mipmap_bias(texture_mipmap_bias);
|
||||
|
||||
is_3d_editor_using_separate_physics_thread = GLOBAL_GET("physics/3d/run_on_separate_thread");
|
||||
}
|
||||
|
||||
void Node3DEditorViewport::_notification(int p_what) {
|
||||
|
@ -3082,38 +3116,16 @@ void Node3DEditorViewport::_notification(int p_what) {
|
|||
float locked_half_width = locked_label->get_size().width / 2.0f;
|
||||
locked_label->set_anchor_and_offset(SIDE_LEFT, 0.5f, -locked_half_width);
|
||||
}
|
||||
|
||||
if (!is_3d_editor_using_separate_physics_thread) {
|
||||
_reposition_selected_nodes();
|
||||
}
|
||||
} break;
|
||||
|
||||
case NOTIFICATION_PHYSICS_PROCESS: {
|
||||
if (collision_reposition) {
|
||||
List<Node *> &selection = editor_selection->get_selected_node_list();
|
||||
|
||||
if (selection.size() == 1) {
|
||||
Node3D *first_selected_node = Object::cast_to<Node3D>(selection.front()->get());
|
||||
double snap = EDITOR_GET("interface/inspector/default_float_step");
|
||||
int snap_step_decimals = Math::range_step_decimals(snap);
|
||||
set_message(TTR("Translating:") + " (" + String::num(first_selected_node->get_global_position().x, snap_step_decimals) + ", " +
|
||||
String::num(first_selected_node->get_global_position().y, snap_step_decimals) + ", " + String::num(first_selected_node->get_global_position().z, snap_step_decimals) + ")");
|
||||
first_selected_node->set_global_position(spatial_editor->snap_point(_get_instance_position(_edit.mouse_pos, first_selected_node)));
|
||||
if (is_3d_editor_using_separate_physics_thread) {
|
||||
_reposition_selected_nodes();
|
||||
}
|
||||
}
|
||||
|
||||
if (!update_preview_node) {
|
||||
return;
|
||||
}
|
||||
if (preview_node->is_inside_tree()) {
|
||||
preview_node_pos = spatial_editor->snap_point(_get_instance_position(preview_node_viewport_pos, preview_node));
|
||||
double snap = EDITOR_GET("interface/inspector/default_float_step");
|
||||
int snap_step_decimals = Math::range_step_decimals(snap);
|
||||
set_message(TTR("Instantiating:") + " (" + String::num(preview_node_pos.x, snap_step_decimals) + ", " +
|
||||
String::num(preview_node_pos.y, snap_step_decimals) + ", " + String::num(preview_node_pos.z, snap_step_decimals) + ")");
|
||||
Transform3D preview_gl_transform = Transform3D(Basis(), preview_node_pos);
|
||||
preview_node->set_global_transform(preview_gl_transform);
|
||||
if (!preview_node->is_visible()) {
|
||||
preview_node->show();
|
||||
}
|
||||
}
|
||||
update_preview_node = false;
|
||||
} break;
|
||||
|
||||
case NOTIFICATION_APPLICATION_FOCUS_OUT:
|
||||
|
@ -5707,6 +5719,8 @@ Node3DEditorViewport::Node3DEditorViewport(Node3DEditor *p_spatial_editor, int p
|
|||
freelook_active = false;
|
||||
freelook_speed = EDITOR_GET("editors/3d/freelook/freelook_base_speed");
|
||||
|
||||
is_3d_editor_using_separate_physics_thread = GLOBAL_GET("physics/3d/run_on_separate_thread");
|
||||
|
||||
selection_menu = memnew(PopupMenu);
|
||||
add_child(selection_menu);
|
||||
selection_menu->set_min_size(Size2(100, 0) * EDSCALE);
|
||||
|
|
|
@ -246,6 +246,7 @@ private:
|
|||
bool lock_rotation;
|
||||
bool transform_gizmo_visible = true;
|
||||
bool collision_reposition = false;
|
||||
bool is_3d_editor_using_separate_physics_thread = false;
|
||||
real_t gizmo_scale;
|
||||
|
||||
bool freelook_active;
|
||||
|
@ -285,6 +286,7 @@ private:
|
|||
void _select_clicked(bool p_allow_locked);
|
||||
ObjectID _select_ray(const Point2 &p_pos) const;
|
||||
void _find_items_at_pos(const Point2 &p_pos, Vector<_RayResult> &r_results, bool p_include_locked);
|
||||
void _reposition_selected_nodes();
|
||||
|
||||
Transform3D _get_camera_transform() const;
|
||||
int get_selected_count() const;
|
||||
|
|
Loading…
Reference in a new issue