Rework viewport capture in preview generation
This commit is contained in:
@ -95,8 +95,35 @@ void EditorResourcePreviewGenerator::_bind_methods() {
|
||||
EditorResourcePreviewGenerator::EditorResourcePreviewGenerator() {
|
||||
}
|
||||
|
||||
void EditorResourcePreviewGenerator::DrawRequester::request_and_wait(RID p_viewport) const {
|
||||
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 {
|
||||
RS::get_singleton()->draw(false);
|
||||
}
|
||||
}
|
||||
|
||||
void EditorResourcePreviewGenerator::DrawRequester::abort() const {
|
||||
if (EditorResourcePreview::get_singleton()->is_threaded()) {
|
||||
semaphore.post();
|
||||
}
|
||||
}
|
||||
|
||||
Variant EditorResourcePreviewGenerator::DrawRequester::_post_semaphore() const {
|
||||
semaphore.post();
|
||||
return Variant(); // Needed because of how the callback is used.
|
||||
}
|
||||
|
||||
EditorResourcePreview *EditorResourcePreview::singleton = nullptr;
|
||||
|
||||
bool EditorResourcePreview::is_threaded() const {
|
||||
return RSG::texture_storage->can_create_resources_async();
|
||||
}
|
||||
|
||||
void EditorResourcePreview::_thread_func(void *ud) {
|
||||
EditorResourcePreview *erp = (EditorResourcePreview *)ud;
|
||||
erp->_thread();
|
||||
@ -470,7 +497,7 @@ void EditorResourcePreview::start() {
|
||||
return;
|
||||
}
|
||||
|
||||
if (RSG::texture_storage->can_create_resources_async()) {
|
||||
if (is_threaded()) {
|
||||
ERR_FAIL_COND_MSG(thread.is_started(), "Thread already started.");
|
||||
thread.start(_thread_func, this);
|
||||
} else {
|
||||
@ -481,7 +508,7 @@ void EditorResourcePreview::start() {
|
||||
}
|
||||
|
||||
void EditorResourcePreview::stop() {
|
||||
if (RSG::texture_storage->can_create_resources_async()) {
|
||||
if (is_threaded()) {
|
||||
if (thread.is_started()) {
|
||||
exiting.set();
|
||||
preview_sem.post();
|
||||
|
||||
Reference in New Issue
Block a user