ソースを参照

Fix certain resource previews empty with GL compat

As an additional fix, the preview render request now ignores the main viewport hierarchy so previews don't pay the cost of re-rendering the whole editor and descendant viewports.
Pedro J. Estébanez 1 年間 前
コミット
78ba8b2804
1 ファイル変更13 行追加1 行削除
  1. 13 1
      editor/editor_resource_preview.cpp

+ 13 - 1
editor/editor_resource_preview.cpp

@@ -40,6 +40,7 @@
 #include "editor/editor_settings.h"
 #include "editor/editor_string_names.h"
 #include "editor/themes/editor_scale.h"
+#include "scene/main/window.h"
 #include "scene/resources/image_texture.h"
 #include "servers/rendering/rendering_server_default.h"
 
@@ -96,14 +97,25 @@ EditorResourcePreviewGenerator::EditorResourcePreviewGenerator() {
 }
 
 void EditorResourcePreviewGenerator::DrawRequester::request_and_wait(RID p_viewport) const {
+	Callable request_vp_update_once = callable_mp(RS::get_singleton(), &RS::viewport_set_update_mode).bind(p_viewport, RS::VIEWPORT_UPDATE_ONCE);
+
 	if (EditorResourcePreview::get_singleton()->is_threaded()) {
-		Callable request_vp_update_once = callable_mp(RS::get_singleton(), &RS::viewport_set_update_mode).bind(p_viewport, RS::VIEWPORT_UPDATE_ONCE);
 		RS::get_singleton()->connect(SNAME("frame_pre_draw"), request_vp_update_once, Object::CONNECT_ONE_SHOT);
 		RS::get_singleton()->request_frame_drawn_callback(callable_mp(const_cast<EditorResourcePreviewGenerator::DrawRequester *>(this), &EditorResourcePreviewGenerator::DrawRequester::_post_semaphore));
 
 		semaphore.wait();
 	} else {
+		// Avoid the main viewport and children being redrawn.
+		SceneTree *st = Object::cast_to<SceneTree>(OS::get_singleton()->get_main_loop());
+		ERR_FAIL_NULL_MSG(st, "Editor's MainLoop is not a SceneTree. This is a bug.");
+		RID root_vp = st->get_root()->get_viewport_rid();
+		RenderingServer::get_singleton()->viewport_set_active(root_vp, false);
+
+		request_vp_update_once.call();
 		RS::get_singleton()->draw(false);
+
+		// Let main viewport and children be drawn again.
+		RenderingServer::get_singleton()->viewport_set_active(root_vp, true);
 	}
 }