From b2950de4a2a7ebee058ee3b202b1c4998ed032ec Mon Sep 17 00:00:00 2001 From: Pratik Borhade Date: Thu, 3 Apr 2025 19:12:54 +0200 Subject: [PATCH] Fix #136645: Regression: Preview generation fails for multiple IDs Fixes: #136842, #136645 Caused by 76d6d169ba When multiple objects are selected to mark as assets, preview generation job of previous ID in the for loop is cleared by `ED_preview_kill_jobs` inside `generate_preview`. To fix this, check if `id->preview` exists then clear the preview job if exists inside the new function `ED_preview_kill_jobs_for_id`. Solution proposed by @JulianEisel. I came up with idea to use `wm_job_find` Pull Request: https://projects.blender.org/blender/blender/pulls/136918 --- source/blender/editors/asset/intern/asset_mark_clear.cc | 2 +- source/blender/editors/include/ED_render.hh | 1 + source/blender/editors/render/render_preview.cc | 8 ++++++++ 3 files changed, 10 insertions(+), 1 deletion(-) diff --git a/source/blender/editors/asset/intern/asset_mark_clear.cc b/source/blender/editors/asset/intern/asset_mark_clear.cc index 3b48c741dda..f80bd7b262b 100644 --- a/source/blender/editors/asset/intern/asset_mark_clear.cc +++ b/source/blender/editors/asset/intern/asset_mark_clear.cc @@ -61,7 +61,7 @@ void generate_preview(const bContext *C, ID *id) return; } - ED_preview_kill_jobs(CTX_wm_manager(C), CTX_data_main(C)); + ED_preview_kill_jobs_for_id(CTX_wm_manager(C), id); PreviewImage *preview = BKE_previewimg_id_get(id); if (preview) { diff --git a/source/blender/editors/include/ED_render.hh b/source/blender/editors/include/ED_render.hh index 753321eebdc..2b986b1f25b 100644 --- a/source/blender/editors/include/ED_render.hh +++ b/source/blender/editors/include/ED_render.hh @@ -113,6 +113,7 @@ void ED_preview_restart_queue_add(ID *id, enum eIconSizes size); void ED_preview_restart_queue_work(const bContext *C); void ED_preview_kill_jobs(wmWindowManager *wm, Main *bmain); +void ED_preview_kill_jobs_for_id(wmWindowManager *wm, const ID *id); void ED_preview_draw( const bContext *C, void *idp, void *parentp, void *slotp, uiPreview *ui_preview, rcti *rect); diff --git a/source/blender/editors/render/render_preview.cc b/source/blender/editors/render/render_preview.cc index a9cd70c757b..de533b0e81c 100644 --- a/source/blender/editors/render/render_preview.cc +++ b/source/blender/editors/render/render_preview.cc @@ -2171,6 +2171,14 @@ void ED_preview_kill_jobs(wmWindowManager *wm, Main * /*bmain*/) } } +void ED_preview_kill_jobs_for_id(wmWindowManager *wm, const ID *id) +{ + const PreviewImage *preview = BKE_previewimg_id_get(id); + if (wm && preview) { + WM_jobs_kill_type(wm, preview, WM_JOB_TYPE_RENDER_PREVIEW); + } +} + struct PreviewRestartQueueEntry { PreviewRestartQueueEntry *next, *prev;