diff options
Diffstat (limited to 'source/blender/render/intern/source/pipeline.c')
-rw-r--r-- | source/blender/render/intern/source/pipeline.c | 55 |
1 files changed, 44 insertions, 11 deletions
diff --git a/source/blender/render/intern/source/pipeline.c b/source/blender/render/intern/source/pipeline.c index 2131b820bd4..8469d8c74f0 100644 --- a/source/blender/render/intern/source/pipeline.c +++ b/source/blender/render/intern/source/pipeline.c @@ -728,6 +728,7 @@ static void render_result_rescale(Render *re) void RE_ChangeResolution(Render *re, int winx, int winy, rcti *disprect) { re_init_resolution(re, NULL, winx, winy, disprect); + RE_parts_clamp(re); if (re->result) { BLI_rw_mutex_lock(&re->resultmutex, THREAD_LOCK_WRITE); @@ -736,6 +737,20 @@ void RE_ChangeResolution(Render *re, int winx, int winy, rcti *disprect) } } +/* TODO(sergey): This is a bit hackish, used to temporary disable freestyle when + * doing viewport render. Needs some better integration of BI viewport rendering + * into the pipeline. + */ +void RE_ChangeModeFlag(Render *re, int flag, bool clear) +{ + if (clear) { + re->r.mode &= ~flag; + } + else { + re->r.mode |= flag; + } +} + /* update some variables that can be animated, and otherwise wouldn't be due to * RenderData getting copied once at the start of animation render */ void render_update_anim_renderdata(Render *re, RenderData *rd) @@ -1713,7 +1728,7 @@ static int composite_needs_render(Scene *sce, int this_scene) if ((sce->r.scemode & R_DOCOMP) == 0) return 1; for (node = ntree->nodes.first; node; node = node->next) { - if (node->type == CMP_NODE_R_LAYERS) + if (node->type == CMP_NODE_R_LAYERS && (node->flag & NODE_MUTED) == 0) if (this_scene == 0 || node->id == NULL || node->id == &sce->id) return 1; } @@ -1852,7 +1867,7 @@ static void tag_scenes_for_render(Render *re) /* check for render-layers nodes using other scenes, we tag them LIB_DOIT */ for (node = re->scene->nodetree->nodes.first; node; node = node->next) { node->flag &= ~NODE_TEST; - if (node->type == CMP_NODE_R_LAYERS) { + if (node->type == CMP_NODE_R_LAYERS && (node->flag & NODE_MUTED) == 0) { if (node->id) { if (!MAIN_VERSION_ATLEAST(re->main, 265, 5)) { if (rlayer_node_uses_alpha(re->scene->nodetree, node)) { @@ -1901,7 +1916,7 @@ static void ntree_render_scenes(Render *re) /* now foreach render-result node tagged we do a full render */ /* results are stored in a way compisitor will find it */ for (node = re->scene->nodetree->nodes.first; node; node = node->next) { - if (node->type == CMP_NODE_R_LAYERS) { + if (node->type == CMP_NODE_R_LAYERS && (node->flag & NODE_MUTED) == 0) { if (node->id && node->id != (ID *)re->scene) { if (node->flag & NODE_TEST) { Scene *scene = (Scene *)node->id; @@ -1935,6 +1950,8 @@ static void add_freestyle(Render *re, int render) { SceneRenderLayer *srl, *actsrl; LinkData *link; + Render *r; + const bool do_link = (re->r.mode & R_MBLUR) == 0 || re->i.curblur == re->r.mblur_samples; actsrl = BLI_findlink(&re->r.layers, re->r.actlay); @@ -1951,15 +1968,17 @@ static void add_freestyle(Render *re, int render) FRS_init_stroke_rendering(re); - for (srl= (SceneRenderLayer *)re->r.layers.first; srl; srl= srl->next) { - - link = (LinkData *)MEM_callocN(sizeof(LinkData), "LinkData to Freestyle render"); - BLI_addtail(&re->freestyle_renders, link); - + for (srl = (SceneRenderLayer *)re->r.layers.first; srl; srl = srl->next) { + if (do_link) { + link = (LinkData *)MEM_callocN(sizeof(LinkData), "LinkData to Freestyle render"); + BLI_addtail(&re->freestyle_renders, link); + } if ((re->r.scemode & R_SINGLE_LAYER) && srl != actsrl) continue; if (FRS_is_freestyle_enabled(srl)) { - link->data = (void *)FRS_do_stroke_rendering(re, srl, render); + r = FRS_do_stroke_rendering(re, srl, render); + if (do_link) + link->data = (void *)r; } } @@ -2183,7 +2202,7 @@ void RE_MergeFullSample(Render *re, Main *bmain, Scene *sce, bNodeTree *ntree) #endif for (node = ntree->nodes.first; node; node = node->next) { - if (node->type == CMP_NODE_R_LAYERS) { + if (node->type == CMP_NODE_R_LAYERS && (node->flag & NODE_MUTED) == 0) { Scene *nodescene = (Scene *)node->id; if (nodescene == NULL) nodescene = sce; @@ -2478,7 +2497,7 @@ static bool check_valid_compositing_camera(Scene *scene, Object *camera_override bNode *node = scene->nodetree->nodes.first; while (node) { - if (node->type == CMP_NODE_R_LAYERS) { + if (node->type == CMP_NODE_R_LAYERS && (node->flag & NODE_MUTED) == 0) { Scene *sce = node->id ? (Scene *)node->id : scene; if (!sce->camera && !BKE_scene_camera_find(sce)) { @@ -2760,6 +2779,8 @@ void RE_SetReports(Render *re, ReportList *reports) void RE_BlenderFrame(Render *re, Main *bmain, Scene *scene, SceneRenderLayer *srl, Object *camera_override, unsigned int lay_override, int frame, const bool write_still) { + BLI_callback_exec(re->main, (ID *)scene, BLI_CB_EVT_RENDER_INIT); + /* ugly global still... is to prevent preview events and signal subsurfs etc to make full resol */ G.is_rendering = true; @@ -2806,6 +2827,16 @@ void RE_RenderFreestyleStrokes(Render *re, Main *bmain, Scene *scene, int render } re->result_ok = 1; } + +void RE_RenderFreestyleExternal(Render *re) +{ + if (!re->test_break(re->tbh)) { + RE_Database_FromScene(re, re->main, re->scene, re->lay, 1); + RE_Database_Preprocess(re); + add_freestyle(re, 1); + RE_Database_Free(re); + } +} #endif static int do_write_image_or_movie(Render *re, Main *bmain, Scene *scene, bMovieHandle *mh, const char *name_override) @@ -2924,6 +2955,8 @@ void RE_BlenderAnim(Render *re, Main *bmain, Scene *scene, Object *camera_overri int cfrao = scene->r.cfra; int nfra, totrendered = 0, totskipped = 0; + BLI_callback_exec(re->main, (ID *)scene, BLI_CB_EVT_RENDER_INIT); + /* do not fully call for each frame, it initializes & pops output window */ if (!render_initialize_from_main(re, &rd, bmain, scene, NULL, camera_override, lay_override, 0, 1)) return; |