Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSergey Sharybin <sergey.vfx@gmail.com>2012-02-17 20:06:32 +0400
committerSergey Sharybin <sergey.vfx@gmail.com>2012-02-17 20:06:32 +0400
commit8f97f3ed2961dcd03ca3d5aeb314cfdf2d0dc58e (patch)
tree9e46e337d60016a49cc8e92acfa94a4c59f6b282 /source/blender/editors/render/render_preview.c
parent17f6f7e2af6d725522176d9c665cd220ede3e6ca (diff)
Fix #25649: Image editor paint icon missing until enter weight paint
Issue was caused by starting Icon Preview render job from two places: - Texture buttons for small icon preview - Properties panel in image editor for large icon of texture This preview job is starting in suspended mode and if new instance of the same job is starting, suspended job will be totally stopped. This is normally for cases when you're changing different settings -- in this case you'd wouldn't want re-render be triggered on every slide change. But what we've have with brush preview is that two instances of this job were creating for large and small icon separately, but because of described policy only one icon was rendered. If suspended job is getting to be stopped, check if it was started for the same icon resolution and if not, that resolution will be also rendered in new job. So it'll be still minimal re-rendering happens, but in cases when job was started from two places for different icon sizes it'll work just fine.
Diffstat (limited to 'source/blender/editors/render/render_preview.c')
-rw-r--r--source/blender/editors/render/render_preview.c103
1 files changed, 87 insertions, 16 deletions
diff --git a/source/blender/editors/render/render_preview.c b/source/blender/editors/render/render_preview.c
index 3e34a55a3d9..3eda30e1554 100644
--- a/source/blender/editors/render/render_preview.c
+++ b/source/blender/editors/render/render_preview.c
@@ -164,6 +164,19 @@ typedef struct ShaderPreview {
} ShaderPreview;
+typedef struct IconPreviewSize {
+ struct IconPreviewSize *next, *prev;
+ int sizex, sizey;
+ unsigned int *rect;
+} IconPreviewSize;
+
+typedef struct IconPreview {
+ Scene *scene;
+ void *owner;
+ ID *id;
+ ListBase sizes;
+} IconPreview;
+
/* *************************** Preview for buttons *********************** */
static Main *pr_main= NULL;
@@ -944,38 +957,96 @@ static void common_preview_startjob(void *customdata, short *stop, short *do_upd
shader_preview_startjob(customdata, stop, do_update);
}
-static void common_preview_endjob(void *customdata)
+/* exported functions */
+
+static void icon_preview_add_size(IconPreview *ip, unsigned int *rect, int sizex, int sizey)
{
- ShaderPreview *sp= customdata;
+ IconPreviewSize *cur_size = ip->sizes.first, *new_size;
- if(sp->id && GS(sp->id->name) == ID_BR)
- WM_main_add_notifier(NC_BRUSH|NA_EDITED, sp->id);
+ while (cur_size) {
+ if (cur_size->sizex == sizex && cur_size->sizey == sizey) {
+ /* requested size is already in list, no need to add it again */
+ return;
+ }
+
+ cur_size = cur_size->next;
+ }
+
+ new_size = MEM_callocN(sizeof(IconPreviewSize), "IconPreviewSize");
+ new_size->sizex = sizex;
+ new_size->sizey = sizey;
+ new_size->rect = rect;
+
+ BLI_addtail(&ip->sizes, new_size);
}
-/* exported functions */
+static void icon_preview_startjob_all_sizes(void *customdata, short *stop, short *do_update, float *progress)
+{
+ IconPreview *ip = (IconPreview *)customdata;
+ IconPreviewSize *cur_size = ip->sizes.first;
+
+ while (cur_size) {
+ ShaderPreview sp;
+
+ memset(&sp, 0, sizeof(ShaderPreview));
+
+ /* construct shader preview from image size and previewcustomdata */
+ sp.scene= ip->scene;
+ sp.owner= ip->owner;
+ sp.sizex= cur_size->sizex;
+ sp.sizey= cur_size->sizey;
+ sp.pr_method= PR_ICON_RENDER;
+ sp.pr_rect= cur_size->rect;
+ sp.id = ip->id;
+
+ common_preview_startjob(&sp, stop, do_update, progress);
+
+ cur_size = cur_size->next;
+ }
+}
+
+static void icon_preview_endjob(void *customdata)
+{
+ IconPreview *ip = customdata;
+
+ if (ip->id && GS(ip->id->name) == ID_BR)
+ WM_main_add_notifier(NC_BRUSH|NA_EDITED, ip->id);
+}
+
+static void icon_preview_free(void *customdata)
+{
+ IconPreview *ip = (IconPreview *)customdata;
+
+ BLI_freelistN(&ip->sizes);
+ MEM_freeN(ip);
+}
void ED_preview_icon_job(const bContext *C, void *owner, ID *id, unsigned int *rect, int sizex, int sizey)
{
wmJob *steve;
- ShaderPreview *sp;
+ IconPreview *ip, *old_ip;
/* suspended start means it starts after 1 timer step, see WM_jobs_timer below */
steve= WM_jobs_get(CTX_wm_manager(C), CTX_wm_window(C), owner, "Icon Preview", WM_JOB_EXCL_RENDER|WM_JOB_SUSPEND);
- sp= MEM_callocN(sizeof(ShaderPreview), "shader preview");
+
+ ip= MEM_callocN(sizeof(IconPreview), "icon preview");
+
+ /* render all resolutions from suspended job too */
+ old_ip= WM_jobs_get_customdata(steve);
+ if (old_ip)
+ BLI_movelisttolist(&ip->sizes, &old_ip->sizes);
/* customdata for preview thread */
- sp->scene= CTX_data_scene(C);
- sp->owner= id;
- sp->sizex= sizex;
- sp->sizey= sizey;
- sp->pr_method= PR_ICON_RENDER;
- sp->pr_rect= rect;
- sp->id = id;
+ ip->scene= CTX_data_scene(C);
+ ip->owner= id;
+ ip->id= id;
+
+ icon_preview_add_size(ip, rect, sizex, sizey);
/* setup job */
- WM_jobs_customdata(steve, sp, shader_preview_free);
+ WM_jobs_customdata(steve, ip, icon_preview_free);
WM_jobs_timer(steve, 0.25, NC_MATERIAL, NC_MATERIAL);
- WM_jobs_callbacks(steve, common_preview_startjob, NULL, NULL, common_preview_endjob);
+ WM_jobs_callbacks(steve, icon_preview_startjob_all_sizes, NULL, NULL, icon_preview_endjob);
WM_jobs_start(CTX_wm_manager(C), steve);
}