浏览代码

Merge pull request #102281 from ryevdokimov/selection-box-color-no-restart

Do not require editor restart when changing selection box color
Thaddeus Crews 5 月之前
父节点
当前提交
3c03566d2e
共有 3 个文件被更改,包括 43 次插入29 次删除
  1. 2 2
      editor/editor_settings.cpp
  2. 36 27
      editor/plugins/node_3d_editor_plugin.cpp
  3. 5 0
      editor/plugins/node_3d_editor_plugin.h

+ 2 - 2
editor/editor_settings.cpp

@@ -789,8 +789,8 @@ void EditorSettings::_load_defaults(Ref<ConfigFile> p_extra_config) {
 	EDITOR_SETTING_BASIC(Variant::COLOR, PROPERTY_HINT_NONE, "editors/3d/secondary_grid_color", Color(0.38, 0.38, 0.38, 0.5), "")
 
 	// Use a similar color to the 2D editor selection.
-	EDITOR_SETTING_USAGE(Variant::COLOR, PROPERTY_HINT_NONE, "editors/3d/selection_box_color", Color(1.0, 0.5, 0), "", PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_RESTART_IF_CHANGED)
-	EDITOR_SETTING_USAGE(Variant::COLOR, PROPERTY_HINT_NONE, "editors/3d/active_selection_box_color", Color(1.5, 0.75, 0, 1.0), "", PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_RESTART_IF_CHANGED)
+	EDITOR_SETTING_USAGE(Variant::COLOR, PROPERTY_HINT_NONE, "editors/3d/selection_box_color", Color(1.0, 0.5, 0), "", PROPERTY_USAGE_DEFAULT)
+	EDITOR_SETTING_USAGE(Variant::COLOR, PROPERTY_HINT_NONE, "editors/3d/active_selection_box_color", Color(1.5, 0.75, 0, 1.0), "", PROPERTY_USAGE_DEFAULT)
 	EDITOR_SETTING_USAGE(Variant::COLOR, PROPERTY_HINT_NONE, "editors/3d_gizmos/gizmo_colors/instantiated", Color(0.7, 0.7, 0.7, 0.6), "", PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_RESTART_IF_CHANGED)
 	EDITOR_SETTING_USAGE(Variant::COLOR, PROPERTY_HINT_NONE, "editors/3d_gizmos/gizmo_colors/joint", Color(0.5, 0.8, 1), "", PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_RESTART_IF_CHANGED)
 	EDITOR_SETTING_USAGE(Variant::COLOR, PROPERTY_HINT_NONE, "editors/3d_gizmos/gizmo_colors/aabb", Color(0.28, 0.8, 0.82), "", PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_RESTART_IF_CHANGED)

+ 36 - 27
editor/plugins/node_3d_editor_plugin.cpp

@@ -6426,38 +6426,34 @@ void Node3DEditor::_generate_selection_boxes() {
 	const Color selection_box_color = EDITOR_GET("editors/3d/selection_box_color");
 	const Color active_selection_box_color = EDITOR_GET("editors/3d/active_selection_box_color");
 
-	Ref<StandardMaterial3D> mat = memnew(StandardMaterial3D);
-	mat->set_shading_mode(StandardMaterial3D::SHADING_MODE_UNSHADED);
-	mat->set_flag(StandardMaterial3D::FLAG_DISABLE_FOG, true);
-	mat->set_albedo(selection_box_color);
-	mat->set_transparency(StandardMaterial3D::TRANSPARENCY_ALPHA);
-	st->set_material(mat);
+	selection_box_mat->set_shading_mode(StandardMaterial3D::SHADING_MODE_UNSHADED);
+	selection_box_mat->set_flag(StandardMaterial3D::FLAG_DISABLE_FOG, true);
+	selection_box_mat->set_albedo(selection_box_color);
+	selection_box_mat->set_transparency(StandardMaterial3D::TRANSPARENCY_ALPHA);
+	st->set_material(selection_box_mat);
 	selection_box = st->commit();
 
-	Ref<StandardMaterial3D> mat_xray = memnew(StandardMaterial3D);
-	mat_xray->set_shading_mode(StandardMaterial3D::SHADING_MODE_UNSHADED);
-	mat_xray->set_flag(StandardMaterial3D::FLAG_DISABLE_FOG, true);
-	mat_xray->set_flag(StandardMaterial3D::FLAG_DISABLE_DEPTH_TEST, true);
-	mat_xray->set_albedo(selection_box_color * Color(1, 1, 1, 0.15));
-	mat_xray->set_transparency(StandardMaterial3D::TRANSPARENCY_ALPHA);
-	st_xray->set_material(mat_xray);
+	selection_box_mat_xray->set_shading_mode(StandardMaterial3D::SHADING_MODE_UNSHADED);
+	selection_box_mat_xray->set_flag(StandardMaterial3D::FLAG_DISABLE_FOG, true);
+	selection_box_mat_xray->set_flag(StandardMaterial3D::FLAG_DISABLE_DEPTH_TEST, true);
+	selection_box_mat_xray->set_albedo(selection_box_color * Color(1, 1, 1, 0.15));
+	selection_box_mat_xray->set_transparency(StandardMaterial3D::TRANSPARENCY_ALPHA);
+	st_xray->set_material(selection_box_mat_xray);
 	selection_box_xray = st_xray->commit();
 
-	Ref<StandardMaterial3D> active_mat = memnew(StandardMaterial3D);
-	active_mat->set_shading_mode(StandardMaterial3D::SHADING_MODE_UNSHADED);
-	active_mat->set_flag(StandardMaterial3D::FLAG_DISABLE_FOG, true);
-	active_mat->set_albedo(active_selection_box_color);
-	active_mat->set_transparency(StandardMaterial3D::TRANSPARENCY_ALPHA);
-	active_st->set_material(active_mat);
+	active_selection_box_mat->set_shading_mode(StandardMaterial3D::SHADING_MODE_UNSHADED);
+	active_selection_box_mat->set_flag(StandardMaterial3D::FLAG_DISABLE_FOG, true);
+	active_selection_box_mat->set_albedo(active_selection_box_color);
+	active_selection_box_mat->set_transparency(StandardMaterial3D::TRANSPARENCY_ALPHA);
+	active_st->set_material(active_selection_box_mat);
 	active_selection_box = active_st->commit();
 
-	Ref<StandardMaterial3D> active_mat_xray = memnew(StandardMaterial3D);
-	active_mat_xray->set_shading_mode(StandardMaterial3D::SHADING_MODE_UNSHADED);
-	active_mat_xray->set_flag(StandardMaterial3D::FLAG_DISABLE_FOG, true);
-	active_mat_xray->set_flag(StandardMaterial3D::FLAG_DISABLE_DEPTH_TEST, true);
-	active_mat_xray->set_albedo(active_selection_box_color * Color(1, 1, 1, 0.15));
-	active_mat_xray->set_transparency(StandardMaterial3D::TRANSPARENCY_ALPHA);
-	active_st_xray->set_material(active_mat_xray);
+	active_selection_box_mat_xray->set_shading_mode(StandardMaterial3D::SHADING_MODE_UNSHADED);
+	active_selection_box_mat_xray->set_flag(StandardMaterial3D::FLAG_DISABLE_FOG, true);
+	active_selection_box_mat_xray->set_flag(StandardMaterial3D::FLAG_DISABLE_DEPTH_TEST, true);
+	active_selection_box_mat_xray->set_albedo(active_selection_box_color * Color(1, 1, 1, 0.15));
+	active_selection_box_mat_xray->set_transparency(StandardMaterial3D::TRANSPARENCY_ALPHA);
+	active_st_xray->set_material(active_selection_box_mat_xray);
 	active_selection_box_xray = active_st_xray->commit();
 }
 
@@ -8313,8 +8309,21 @@ void Node3DEditor::_notification(int p_what) {
 		} break;
 
 		case EditorSettings::NOTIFICATION_EDITOR_SETTINGS_CHANGED: {
-			// Update grid color by rebuilding grid.
 			if (EditorSettings::get_singleton()->check_changed_settings_in_group("editors/3d")) {
+				const Color selection_box_color = EDITOR_GET("editors/3d/selection_box_color");
+				const Color active_selection_box_color = EDITOR_GET("editors/3d/active_selection_box_color");
+
+				if (selection_box_color != selection_box_mat->get_albedo()) {
+					selection_box_mat->set_albedo(selection_box_color);
+					selection_box_mat_xray->set_albedo(selection_box_color * Color(1, 1, 1, 0.15));
+				}
+
+				if (active_selection_box_color != active_selection_box_mat->get_albedo()) {
+					active_selection_box_mat->set_albedo(active_selection_box_color);
+					active_selection_box_mat_xray->set_albedo(active_selection_box_color * Color(1, 1, 1, 0.15));
+				}
+
+				// Update grid color by rebuilding grid.
 				_finish_grid();
 				_init_grid();
 			}

+ 5 - 0
editor/plugins/node_3d_editor_plugin.h

@@ -706,6 +706,11 @@ private:
 	Ref<ArrayMesh> selection_box_xray;
 	Ref<ArrayMesh> selection_box;
 
+	Ref<StandardMaterial3D> selection_box_mat = memnew(StandardMaterial3D);
+	Ref<StandardMaterial3D> selection_box_mat_xray = memnew(StandardMaterial3D);
+	Ref<StandardMaterial3D> active_selection_box_mat = memnew(StandardMaterial3D);
+	Ref<StandardMaterial3D> active_selection_box_mat_xray = memnew(StandardMaterial3D);
+
 	RID indicators;
 	RID indicators_instance;
 	RID cursor_mesh;