diff options
author | Campbell Barton <ideasman42@gmail.com> | 2012-02-18 00:56:25 +0400 |
---|---|---|
committer | Campbell Barton <ideasman42@gmail.com> | 2012-02-18 00:56:25 +0400 |
commit | 48006292d8b3c6c8dd4bfe87bdbe271db93cffff (patch) | |
tree | ca98c07367717703c5a8801063cc42e0aff5b855 /source/blender/editors/render | |
parent | 4c66e696fbcaefe40f0394fea8fc4a55bb7d6994 (diff) | |
parent | 61596d5bb365a96b4b19adf0ef72ec1ea47212aa (diff) |
svn merge ^/trunk/blender -r44189:44204
Diffstat (limited to 'source/blender/editors/render')
-rw-r--r-- | source/blender/editors/render/render_intern.h | 6 | ||||
-rw-r--r-- | source/blender/editors/render/render_preview.c | 103 |
2 files changed, 90 insertions, 19 deletions
diff --git a/source/blender/editors/render/render_intern.h b/source/blender/editors/render/render_intern.h index 08001688e3f..18ba2b5abf9 100644 --- a/source/blender/editors/render/render_intern.h +++ b/source/blender/editors/render/render_intern.h @@ -29,8 +29,8 @@ */ -#ifndef RENDER_INTERN_H -#define RENDER_INTERN_H +#ifndef __RENDER_INTERN_H__ +#define __RENDER_INTERN_H__ struct wmOperatorType; struct RenderResult; @@ -77,5 +77,5 @@ void RENDER_OT_view_cancel(struct wmOperatorType *ot); /* render_opengl.c */ void RENDER_OT_opengl(struct wmOperatorType *ot); -#endif /* RENDER_INTERN_H */ +#endif /* __RENDER_INTERN_H__ */ 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); } |