Changeset View
Changeset View
Standalone View
Standalone View
source/blender/editors/render/render_preview.c
| Show First 20 Lines • Show All 167 Lines • ▼ Show 20 Lines | typedef struct ShaderPreview { | ||||
| float col[4]; /* active object color */ | float col[4]; /* active object color */ | ||||
| int sizex, sizey; | int sizex, sizey; | ||||
| unsigned int *pr_rect; | unsigned int *pr_rect; | ||||
| int pr_method; | int pr_method; | ||||
| Main *bmain; | Main *bmain; | ||||
| Main *pr_main; | Main *pr_main; | ||||
| const char *engine; | |||||
| } ShaderPreview; | } ShaderPreview; | ||||
| typedef struct IconPreviewSize { | typedef struct IconPreviewSize { | ||||
| struct IconPreviewSize *next, *prev; | struct IconPreviewSize *next, *prev; | ||||
| int sizex, sizey; | int sizex, sizey; | ||||
| unsigned int *rect; | unsigned int *rect; | ||||
| } IconPreviewSize; | } IconPreviewSize; | ||||
| typedef struct IconPreview { | typedef struct IconPreview { | ||||
| Main *bmain; | Main *bmain; | ||||
| Scene *scene; | Scene *scene; | ||||
| void *owner; | void *owner; | ||||
| ID *id; | ID *id; | ||||
| ListBase sizes; | ListBase sizes; | ||||
| const char *engine; | |||||
| } IconPreview; | } IconPreview; | ||||
| /* *************************** Preview for buttons *********************** */ | /* *************************** Preview for buttons *********************** */ | ||||
| static Main *G_pr_main = NULL; | static Main *G_pr_main = NULL; | ||||
| static Main *G_pr_main_cycles = NULL; | static Main *G_pr_main_cycles = NULL; | ||||
| #ifndef WITH_HEADLESS | #ifndef WITH_HEADLESS | ||||
| ▲ Show 20 Lines • Show All 652 Lines • ▼ Show 20 Lines | static void shader_preview_render(ShaderPreview *sp, ID *id, int split, int first) | ||||
| RE_test_break_cb(re, sp, shader_preview_break); | RE_test_break_cb(re, sp, shader_preview_break); | ||||
| /* lens adjust */ | /* lens adjust */ | ||||
| oldlens = ((Camera *)sce->camera->data)->lens; | oldlens = ((Camera *)sce->camera->data)->lens; | ||||
| if (sizex > sp->sizey) | if (sizex > sp->sizey) | ||||
| ((Camera *)sce->camera->data)->lens *= (float)sp->sizey / (float)sizex; | ((Camera *)sce->camera->data)->lens *= (float)sp->sizey / (float)sizex; | ||||
| /* entire cycle for render engine */ | /* entire cycle for render engine */ | ||||
| RE_PreviewRender(re, pr_main, sce); | RE_PreviewRender(re, pr_main, sce, sp->engine); | ||||
| ((Camera *)sce->camera->data)->lens = oldlens; | ((Camera *)sce->camera->data)->lens = oldlens; | ||||
| /* handle results */ | /* handle results */ | ||||
| if (sp->pr_method == PR_ICON_RENDER) { | if (sp->pr_method == PR_ICON_RENDER) { | ||||
| // char *rct= (char *)(sp->pr_rect + 32*16 + 16); | // char *rct= (char *)(sp->pr_rect + 32*16 + 16); | ||||
| if (sp->pr_rect) | if (sp->pr_rect) | ||||
| ▲ Show 20 Lines • Show All 310 Lines • ▼ Show 20 Lines | if (prv->tag & PRV_TAG_DEFFERED_DELETE) { | ||||
| continue; | continue; | ||||
| } | } | ||||
| ShaderPreview *sp = MEM_callocN(sizeof(ShaderPreview), "Icon ShaderPreview"); | ShaderPreview *sp = MEM_callocN(sizeof(ShaderPreview), "Icon ShaderPreview"); | ||||
| const bool is_render = !(prv->tag & PRV_TAG_DEFFERED); | const bool is_render = !(prv->tag & PRV_TAG_DEFFERED); | ||||
| /* construct shader preview from image size and previewcustomdata */ | /* construct shader preview from image size and previewcustomdata */ | ||||
| sp->scene = ip->scene; | sp->scene = ip->scene; | ||||
| sp->engine = ip->engine; | |||||
| sp->owner = ip->owner; | sp->owner = ip->owner; | ||||
| sp->sizex = cur_size->sizex; | sp->sizex = cur_size->sizex; | ||||
| sp->sizey = cur_size->sizey; | sp->sizey = cur_size->sizey; | ||||
| sp->pr_method = is_render ? PR_ICON_RENDER : PR_ICON_DEFERRED; | sp->pr_method = is_render ? PR_ICON_RENDER : PR_ICON_DEFERRED; | ||||
| sp->pr_rect = cur_size->rect; | sp->pr_rect = cur_size->rect; | ||||
| sp->id = ip->id; | sp->id = ip->id; | ||||
| sp->bmain = ip->bmain; | sp->bmain = ip->bmain; | ||||
| ▲ Show 20 Lines • Show All 58 Lines • ▼ Show 20 Lines | |||||
| static void icon_preview_free(void *customdata) | static void icon_preview_free(void *customdata) | ||||
| { | { | ||||
| IconPreview *ip = (IconPreview *)customdata; | IconPreview *ip = (IconPreview *)customdata; | ||||
| BLI_freelistN(&ip->sizes); | BLI_freelistN(&ip->sizes); | ||||
| MEM_freeN(ip); | MEM_freeN(ip); | ||||
| } | } | ||||
| void ED_preview_icon_render(Main *bmain, Scene *scene, ID *id, unsigned int *rect, int sizex, int sizey) | void ED_preview_icon_render(Main *bmain, Scene *scene, WorkSpace *workspace, ID *id, unsigned int *rect, int sizex, int sizey) | ||||
| { | { | ||||
| IconPreview ip = {NULL}; | IconPreview ip = {NULL}; | ||||
| short stop = false, update = false; | short stop = false, update = false; | ||||
| float progress = 0.0f; | float progress = 0.0f; | ||||
| ED_preview_ensure_dbase(); | ED_preview_ensure_dbase(); | ||||
| ip.bmain = bmain; | ip.bmain = bmain; | ||||
| ip.scene = scene; | ip.scene = scene; | ||||
| ip.engine = BKE_render_engine_get(scene, workspace); | |||||
| ip.owner = BKE_previewimg_id_ensure(id); | ip.owner = BKE_previewimg_id_ensure(id); | ||||
| ip.id = id; | ip.id = id; | ||||
| icon_preview_add_size(&ip, rect, sizex, sizey); | icon_preview_add_size(&ip, rect, sizex, sizey); | ||||
| icon_preview_startjob_all_sizes(&ip, &stop, &update, &progress); | icon_preview_startjob_all_sizes(&ip, &stop, &update, &progress); | ||||
| icon_preview_endjob(&ip); | icon_preview_endjob(&ip); | ||||
| Show All 17 Lines | void ED_preview_icon_job(const bContext *C, void *owner, ID *id, unsigned int *rect, int sizex, int sizey) | ||||
| /* render all resolutions from suspended job too */ | /* render all resolutions from suspended job too */ | ||||
| old_ip = WM_jobs_customdata_get(wm_job); | old_ip = WM_jobs_customdata_get(wm_job); | ||||
| if (old_ip) | if (old_ip) | ||||
| BLI_movelisttolist(&ip->sizes, &old_ip->sizes); | BLI_movelisttolist(&ip->sizes, &old_ip->sizes); | ||||
| /* customdata for preview thread */ | /* customdata for preview thread */ | ||||
| ip->bmain = CTX_data_main(C); | ip->bmain = CTX_data_main(C); | ||||
| ip->scene = CTX_data_scene(C); | ip->scene = CTX_data_scene(C); | ||||
| ip->engine = BKE_render_engine_get(ip->scene, CTX_wm_workspace(C)); | |||||
| ip->owner = owner; | ip->owner = owner; | ||||
| ip->id = id; | ip->id = id; | ||||
| icon_preview_add_size(ip, rect, sizex, sizey); | icon_preview_add_size(ip, rect, sizex, sizey); | ||||
| /* Special threading hack: warn main code that this preview is being rendered and cannot be freed... */ | /* Special threading hack: warn main code that this preview is being rendered and cannot be freed... */ | ||||
| { | { | ||||
| PreviewImage *prv_img = owner; | PreviewImage *prv_img = owner; | ||||
| Show All 11 Lines | |||||
| } | } | ||||
| void ED_preview_shader_job(const bContext *C, void *owner, ID *id, ID *parent, MTex *slot, int sizex, int sizey, int method) | void ED_preview_shader_job(const bContext *C, void *owner, ID *id, ID *parent, MTex *slot, int sizex, int sizey, int method) | ||||
| { | { | ||||
| Object *ob = CTX_data_active_object(C); | Object *ob = CTX_data_active_object(C); | ||||
| wmJob *wm_job; | wmJob *wm_job; | ||||
| ShaderPreview *sp; | ShaderPreview *sp; | ||||
| Scene *scene = CTX_data_scene(C); | Scene *scene = CTX_data_scene(C); | ||||
| WorkSpace *workspace = CTX_wm_workspace(C); | |||||
| short id_type = GS(id->name); | short id_type = GS(id->name); | ||||
| bool use_new_shading = BKE_scene_use_new_shading_nodes(scene); | bool use_new_shading = BKE_render_use_new_shading_nodes(scene, workspace); | ||||
| /* Only texture node preview is supported with Cycles. */ | /* Only texture node preview is supported with Cycles. */ | ||||
| if (use_new_shading && method == PR_NODE_RENDER && id_type != ID_TE) { | if (use_new_shading && method == PR_NODE_RENDER && id_type != ID_TE) { | ||||
| return; | return; | ||||
| } | } | ||||
| ED_preview_ensure_dbase(); | ED_preview_ensure_dbase(); | ||||
| wm_job = WM_jobs_get(CTX_wm_manager(C), CTX_wm_window(C), owner, "Shader Preview", | wm_job = WM_jobs_get(CTX_wm_manager(C), CTX_wm_window(C), owner, "Shader Preview", | ||||
| WM_JOB_EXCL_RENDER, WM_JOB_TYPE_RENDER_PREVIEW); | WM_JOB_EXCL_RENDER, WM_JOB_TYPE_RENDER_PREVIEW); | ||||
| sp = MEM_callocN(sizeof(ShaderPreview), "shader preview"); | sp = MEM_callocN(sizeof(ShaderPreview), "shader preview"); | ||||
| /* customdata for preview thread */ | /* customdata for preview thread */ | ||||
| sp->scene = scene; | sp->scene = scene; | ||||
| sp->engine = BKE_render_engine_get(scene, workspace); | |||||
| sp->owner = owner; | sp->owner = owner; | ||||
| sp->sizex = sizex; | sp->sizex = sizex; | ||||
| sp->sizey = sizey; | sp->sizey = sizey; | ||||
| sp->pr_method = method; | sp->pr_method = method; | ||||
| sp->id = id; | sp->id = id; | ||||
| sp->parent = parent; | sp->parent = parent; | ||||
| sp->slot = slot; | sp->slot = slot; | ||||
| sp->bmain = CTX_data_main(C); | sp->bmain = CTX_data_main(C); | ||||
| Show All 29 Lines | |||||