diff options
author | Tamito Kajiyama <rd6t-kjym@asahi-net.or.jp> | 2013-06-11 06:32:01 +0400 |
---|---|---|
committer | Tamito Kajiyama <rd6t-kjym@asahi-net.or.jp> | 2013-06-11 06:32:01 +0400 |
commit | 5520331215ffec52cd518f30bdf6e6276840e290 (patch) | |
tree | 77a5df7b902cb05a3780dd0aff46f851d514c45c /source/blender/render | |
parent | 9020df976ca37104a36a90d43c6e5b33c24cdbd2 (diff) |
Fix #35561: freestyle + read full sample layers = crash.
Now add_freestyle() in pipeline.c takes a second argument to enable/disable
stroke rendering. When stroke rendering is disabled, the function allocates
data structures but does not perform stroke rendering. The allocated data
structures (mostly left unpopulated with data elements) are intended to allow
for the Read Full Sample Layers (Shift-R) command in the compositor.
Diffstat (limited to 'source/blender/render')
-rw-r--r-- | source/blender/render/extern/include/RE_pipeline.h | 2 | ||||
-rw-r--r-- | source/blender/render/intern/source/pipeline.c | 29 |
2 files changed, 23 insertions, 8 deletions
diff --git a/source/blender/render/extern/include/RE_pipeline.h b/source/blender/render/extern/include/RE_pipeline.h index 52d42cd20a4..118d0036464 100644 --- a/source/blender/render/extern/include/RE_pipeline.h +++ b/source/blender/render/extern/include/RE_pipeline.h @@ -226,7 +226,7 @@ void RE_TileProcessor(struct Render *re); void RE_BlenderFrame(struct Render *re, struct Main *bmain, struct Scene *scene, struct SceneRenderLayer *srl, struct Object *camera_override, unsigned int lay, int frame, const short write_still); void RE_BlenderAnim(struct Render *re, struct Main *bmain, struct Scene *scene, struct Object *camera_override, unsigned int lay, int sfra, int efra, int tfra); #ifdef WITH_FREESTYLE -void RE_RenderFreestyleStrokes(struct Render *re, struct Main *bmain, struct Scene *scene); +void RE_RenderFreestyleStrokes(struct Render *re, struct Main *bmain, struct Scene *scene, int render); #endif /* error reporting */ diff --git a/source/blender/render/intern/source/pipeline.c b/source/blender/render/intern/source/pipeline.c index c8f8f844e5f..068df215edb 100644 --- a/source/blender/render/intern/source/pipeline.c +++ b/source/blender/render/intern/source/pipeline.c @@ -1081,7 +1081,7 @@ static void threaded_tile_processor(Render *re) } #ifdef WITH_FREESTYLE -static void add_freestyle(Render *re); +static void add_freestyle(Render *re, int render); static void free_all_freestyle_renders(void); #endif @@ -1097,7 +1097,7 @@ void RE_TileProcessor(Render *re) /* Freestyle */ if (re->r.mode & R_EDGE_FRS) { if (!re->test_break(re->tbh)) { - add_freestyle(re); + add_freestyle(re, 1); free_all_freestyle_renders(); @@ -1150,7 +1150,7 @@ static void do_render_3d(Render *re) /* Freestyle */ if (re->r.mode & R_EDGE_FRS) if (!re->test_break(re->tbh)) - add_freestyle(re); + add_freestyle(re, 1); #endif /* do left-over 3d post effects (flares) */ @@ -1633,7 +1633,7 @@ static void render_composit_stats(void *UNUSED(arg), char *str) #ifdef WITH_FREESTYLE /* invokes Freestyle stroke rendering */ -static void add_freestyle(Render *re) +static void add_freestyle(Render *re, int render) { SceneRenderLayer *srl, *actsrl; LinkData *link; @@ -1659,7 +1659,7 @@ static void add_freestyle(Render *re) 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); + link->data = (void *)FRS_do_stroke_rendering(re, srl, render); } } @@ -1853,6 +1853,11 @@ void RE_MergeFullSample(Render *re, Main *bmain, Scene *sce, bNodeTree *ntree) for (scene = re->main->scene.first; scene; scene = scene->id.next) scene->id.flag |= LIB_DOIT; +#ifdef WITH_FREESTYLE + for (scene = re->freestyle_bmain.scene.first; scene; scene = scene->id.next) + scene->id.flag &= ~LIB_DOIT; +#endif + for (node = ntree->nodes.first; node; node = node->next) { if (node->type == CMP_NODE_R_LAYERS) { Scene *nodescene = (Scene *)node->id; @@ -1876,7 +1881,16 @@ void RE_MergeFullSample(Render *re, Main *bmain, Scene *sce, bNodeTree *ntree) re->display_init(re->dih, re->result); re->display_clear(re->dch, re->result); +#ifdef WITH_FREESTYLE + if (re->r.mode & R_EDGE_FRS) + add_freestyle(re, 0); +#endif + do_merge_fullsample(re, ntree); + +#ifdef WITH_FREESTYLE + free_all_freestyle_renders(); +#endif } /* returns fully composited render-result on given time step (in RenderData) */ @@ -2445,11 +2459,12 @@ void RE_BlenderFrame(Render *re, Main *bmain, Scene *scene, SceneRenderLayer *sr } #ifdef WITH_FREESTYLE -void RE_RenderFreestyleStrokes(Render *re, Main *bmain, Scene *scene) +void RE_RenderFreestyleStrokes(Render *re, Main *bmain, Scene *scene, int render) { re->result_ok= 0; if (render_initialize_from_main(re, bmain, scene, NULL, NULL, scene->lay, 0, 0)) { - do_render_fields_blur_3d(re); + if (render) + do_render_fields_blur_3d(re); } re->result_ok = 1; } |