From 0eaa89971f4760a5ead86cf2abd247f6b9eabd02 Mon Sep 17 00:00:00 2001 From: Brecht Van Lommel Date: Sun, 28 Mar 2010 14:45:09 +0000 Subject: [PATCH] External render engines now have option bl_postprocess to determine if compositing, sequencer, fields, etc should be rendered, or if the render does that itself. The weak point is that this only applies to rendering, so if you open the compositor, it will still run on the rendered result. Enabled by default, set to False to disable. --- source/blender/makesrna/intern/rna_render.c | 6 ++++-- .../blender/render/extern/include/RE_pipeline.h | 7 ++++--- source/blender/render/intern/source/pipeline.c | 17 ++++++++++++----- 3 files changed, 20 insertions(+), 10 deletions(-) diff --git a/source/blender/makesrna/intern/rna_render.c b/source/blender/makesrna/intern/rna_render.c index 28d309c2d37..d00507e8bcf 100644 --- a/source/blender/makesrna/intern/rna_render.c +++ b/source/blender/makesrna/intern/rna_render.c @@ -207,14 +207,12 @@ static int rna_RenderPass_rect_get_length(PointerRNA *ptr, int length[RNA_MAX_AR static void rna_RenderPass_rect_get(PointerRNA *ptr, float *values) { RenderPass *rpass= (RenderPass*)ptr->data; - printf("rect get\n"); memcpy(values, rpass->rect, sizeof(float)*rpass->rectx*rpass->recty*rpass->channels); } static void rna_RenderPass_rect_set(PointerRNA *ptr, const float *values) { RenderPass *rpass= (RenderPass*)ptr->data; - printf("rect set\n"); memcpy(rpass->rect, values, sizeof(float)*rpass->rectx*rpass->recty*rpass->channels); } @@ -283,6 +281,10 @@ static void rna_def_render_engine(BlenderRNA *brna) RNA_def_property_boolean_sdna(prop, NULL, "type->flag", RE_DO_PREVIEW); RNA_def_property_flag(prop, PROP_REGISTER_OPTIONAL); + prop= RNA_def_property(srna, "bl_postprocess", PROP_BOOLEAN, PROP_NONE); + RNA_def_property_boolean_negative_sdna(prop, NULL, "type->flag", RE_DO_ALL); + RNA_def_property_flag(prop, PROP_REGISTER_OPTIONAL); + RNA_define_verify_sdna(1); } diff --git a/source/blender/render/extern/include/RE_pipeline.h b/source/blender/render/extern/include/RE_pipeline.h index 9373b3e20c9..c0d1d251356 100644 --- a/source/blender/render/extern/include/RE_pipeline.h +++ b/source/blender/render/extern/include/RE_pipeline.h @@ -253,9 +253,10 @@ struct Scene *RE_GetScene(struct Render *re); /* External Engine */ -#define RE_INTERNAL 1 -#define RE_GAME 2 -#define RE_DO_PREVIEW 4 +#define RE_INTERNAL 1 +#define RE_GAME 2 +#define RE_DO_PREVIEW 4 +#define RE_DO_ALL 8 extern ListBase R_engines; diff --git a/source/blender/render/intern/source/pipeline.c b/source/blender/render/intern/source/pipeline.c index f2b58c5dc0f..2d7b724d893 100644 --- a/source/blender/render/intern/source/pipeline.c +++ b/source/blender/render/intern/source/pipeline.c @@ -1736,12 +1736,12 @@ void RE_TileProcessor(Render *re) /* ************ This part uses API, for rendering Blender scenes ********** */ -static int external_render_3d(Render *re); +static int external_render_3d(Render *re, int do_all); static void do_render_3d(Render *re) { /* try external */ - if(external_render_3d(re)) + if(external_render_3d(re, 0)) return; /* internal */ @@ -2479,8 +2479,11 @@ static void do_render_all_options(Render *re) /* ensure no images are in memory from previous animated sequences */ BKE_image_all_free_anim_ibufs(re->r.cfra); - - if((re->r.scemode & R_DOSEQ) && re->scene->ed && re->scene->ed->seqbase.first) { + + if(external_render_3d(re, 1)) { + /* in this case external render overrides all */ + } + else if((re->r.scemode & R_DOSEQ) && re->scene->ed && re->scene->ed->seqbase.first) { /* note: do_render_seq() frees rect32 when sequencer returns float images */ if(!re->test_break(re->tbh)) do_render_seq(re); @@ -3132,7 +3135,7 @@ void RE_result_load_from_file(RenderResult *result, ReportList *reports, char *f } } -static int external_render_3d(Render *re) +static int external_render_3d(Render *re, int do_all) { RenderEngineType *type; RenderEngine engine; @@ -3145,6 +3148,10 @@ static int external_render_3d(Render *re) return 0; if((re->r.scemode & R_PREVIEWBUTS) && !(type->flag & RE_DO_PREVIEW)) return 0; + if(do_all && !(type->flag & RE_DO_ALL)) + return 0; + if(!do_all && (type->flag & RE_DO_ALL)) + return 0; BLI_rw_mutex_lock(&re->resultmutex, THREAD_LOCK_WRITE); if(re->result==NULL || !(re->r.scemode & R_PREVIEWBUTS)) {