[Bf-blender-cvs] [c6e9ff6] soc-2016-cycles_denoising: Render API: Allow renderers to allocate additional passes

Lukas Stockner noreply at git.blender.org
Sat Jun 4 22:03:08 CEST 2016


Commit: c6e9ff6ec63f6d65d7271e8f4d83b4f67c6bcf05
Author: Lukas Stockner
Date:   Sat Jun 4 21:24:49 2016 +0200
Branches: soc-2016-cycles_denoising
https://developer.blender.org/rBc6e9ff6ec63f6d65d7271e8f4d83b4f67c6bcf05

Render API: Allow renderers to allocate additional passes

This commit adds the add_pass function to the renderer API, which allows a renderer
to add a pass to a certain or all render layers. Since the RNA only has 32bit integers as
argument types, the position of the passtype bit is passed instead of the actual passtype.
When additional RenderResults are allocated, all additional passes added to the main result
are added to it as well.

===================================================================

M	source/blender/makesrna/intern/rna_render.c
M	source/blender/render/extern/include/RE_engine.h
M	source/blender/render/intern/include/render_result.h
M	source/blender/render/intern/source/external_engine.c
M	source/blender/render/intern/source/render_result.c

===================================================================

diff --git a/source/blender/makesrna/intern/rna_render.c b/source/blender/makesrna/intern/rna_render.c
index 2870a66..0c7c115 100644
--- a/source/blender/makesrna/intern/rna_render.c
+++ b/source/blender/makesrna/intern/rna_render.c
@@ -523,6 +523,15 @@ static void rna_def_render_engine(BlenderRNA *brna)
 	RNA_def_boolean(func, "cancel", 0, "Cancel", "Don't mark tile as done, don't merge results unless forced");
 	RNA_def_boolean(func, "do_merge_results", 0, "Merge Results", "Merge results even if cancel=true");
 
+	func = RNA_def_function(srna, "add_pass", "RE_engine_add_pass");
+	RNA_def_function_ui_description(func, "Add a pass to the render layer");
+	prop = RNA_def_int(func, "type", 0, 0, INT_MAX, "Pass Type", "", 0, INT_MAX);
+	RNA_def_property_flag(prop, PROP_REQUIRED);
+	prop = RNA_def_int(func, "channels", 0, 0, INT_MAX, "Channels", "", 0, INT_MAX);
+	RNA_def_property_flag(prop, PROP_REQUIRED);
+	RNA_def_string(func, "layer", NULL, 0, "Layer", "Single layer to add render pass to");  /* NULL ok here */
+	RNA_def_string(func, "view", NULL, 0, "View", "Single view to add render pass to");  /* NULL ok here */
+
 	func = RNA_def_function(srna, "test_break", "RE_engine_test_break");
 	RNA_def_function_ui_description(func, "Test if the render operation should been canceled, this is a fast call that should be used regularly for responsiveness");
 	prop = RNA_def_boolean(func, "do_break", 0, "Break", "");
diff --git a/source/blender/render/extern/include/RE_engine.h b/source/blender/render/extern/include/RE_engine.h
index f83a210..0da06a1 100644
--- a/source/blender/render/extern/include/RE_engine.h
+++ b/source/blender/render/extern/include/RE_engine.h
@@ -141,6 +141,8 @@ struct RenderResult *RE_engine_begin_result(RenderEngine *engine, int x, int y,
 void RE_engine_update_result(RenderEngine *engine, struct RenderResult *result);
 void RE_engine_end_result(RenderEngine *engine, struct RenderResult *result, int cancel, int merge_results);
 
+void RE_engine_add_pass(RenderEngine *engine, int passtype, int channels, const char *layername, const char *viewname);
+
 const char *RE_engine_active_view_get(RenderEngine *engine);
 void RE_engine_active_view_set(RenderEngine *engine, const char *viewname);
 float RE_engine_get_camera_shift_x(RenderEngine *engine, struct Object *camera, int use_spherical_stereo);
diff --git a/source/blender/render/intern/include/render_result.h b/source/blender/render/intern/include/render_result.h
index 2619ac7..4e26571 100644
--- a/source/blender/render/intern/include/render_result.h
+++ b/source/blender/render/intern/include/render_result.h
@@ -67,6 +67,11 @@ void render_result_views_new(struct RenderResult *rr, struct RenderData *rd);
 
 void render_result_merge(struct RenderResult *rr, struct RenderResult *rrpart);
 
+/* Add Pass */
+
+void render_result_clone_passes(struct Render *re, struct RenderResult *rr, const char *viewname);
+void render_result_add_pass(struct RenderResult *rr, uint64_t passtype, int channels, const char *layername, const char *viewname);
+
 /* Free */
 
 void render_result_free(struct RenderResult *rr);
diff --git a/source/blender/render/intern/source/external_engine.c b/source/blender/render/intern/source/external_engine.c
index fd9d95c..9e7266f0 100644
--- a/source/blender/render/intern/source/external_engine.c
+++ b/source/blender/render/intern/source/external_engine.c
@@ -212,6 +212,8 @@ RenderResult *RE_engine_begin_result(RenderEngine *engine, int x, int y, int w,
 
 	/* can be NULL if we CLAMP the width or height to 0 */
 	if (result) {
+		render_result_clone_passes(re, result, viewname);
+
 		RenderPart *pa;
 
 		/* Copy EXR tile settings, so pipeline knows whether this is a result
@@ -245,6 +247,17 @@ void RE_engine_update_result(RenderEngine *engine, RenderResult *result)
 	}
 }
 
+void RE_engine_add_pass(RenderEngine *engine, int passtype, int channels, const char *layername, const char *viewname)
+{
+	Render *re = engine->re;
+
+	if(!re || !re->result) {
+		return;
+	}
+
+	render_result_add_pass(re->result, 1UL << passtype, channels, layername, viewname);
+}
+
 void RE_engine_end_result(RenderEngine *engine, RenderResult *result, int cancel, int merge_results)
 {
 	Render *re = engine->re;
diff --git a/source/blender/render/intern/source/render_result.c b/source/blender/render/intern/source/render_result.c
index a8791d7..ded6267 100644
--- a/source/blender/render/intern/source/render_result.c
+++ b/source/blender/render/intern/source/render_result.c
@@ -799,6 +799,64 @@ RenderResult *render_result_new(Render *re, rcti *partrct, int crop, int savebuf
 	return rr;
 }
 
+void render_result_clone_passes(Render *re, RenderResult *rr, const char *viewname)
+{
+	RenderLayer *rl, *main_rl;
+	RenderPass *rp, *main_rp;
+	RenderView *rv;
+
+	for(rl = rr->layers.first; rl; rl = rl->next) {
+		/* Find corresponding layer in main result */
+		for(main_rl = re->result->layers.first; main_rl; main_rl = main_rl->next) {
+			if(strcmp(main_rl->name, rl->name) == 0)
+				break;
+		}
+
+		if(!main_rl)
+			continue;
+
+		for (rv = rr->views.first; rv; rv = rv->next) {
+			const char *view = rv->name;
+
+			if (viewname && viewname[0])
+				if (!STREQ(view, viewname))
+					continue;
+
+			/* Skip all common passes */
+			for(rp = rl->passes.first, main_rp = main_rl->passes.first; rp && main_rp; rp = rp->next)
+				main_rp = main_rp->next;
+			/* Add the missing passes */
+			for(; main_rp; main_rp = main_rp->next) {
+				render_layer_add_pass(rr, rl, main_rp->channels, main_rp->passtype, view);
+			}
+		}
+	}
+}
+
+
+/* allocate new pass in an existing render result */
+void render_result_add_pass(RenderResult *rr, uint64_t passtype, int channels, const char *layername, const char *viewname)
+{
+	RenderLayer *rl;
+	RenderView *rv;
+
+	for (rl = rr->layers.first; rl; rl = rl->next) {
+		if (layername && layername[0])
+			if (!STREQ(rl->name, layername))
+				continue;
+
+		for (rv = rr->views.first; rv; rv = rv->next) {
+			const char *view = rv->name;
+
+			if (viewname && viewname[0])
+				if (!STREQ(view, viewname))
+					continue;
+
+			render_layer_add_pass(rr, rl, channels, passtype, view);
+		}
+	}
+}
+
 /* allocate osa new results for samples */
 RenderResult *render_result_new_full_sample(Render *re, ListBase *lb, rcti *partrct, int crop, int savebuffers, const char *viewname)
 {




More information about the Bf-blender-cvs mailing list