[Bf-blender-cvs] [c167e5d] soc-2016-cycles_denoising: Render API/Image Editor: Add postprocessing operator that calls the render engine when executed

Lukas Stockner noreply at git.blender.org
Fri Jun 24 23:33:10 CEST 2016


Commit: c167e5d7237848bfd2d15ae0ab6432a27b7015d3
Author: Lukas Stockner
Date:   Tue Jun 21 19:23:25 2016 +0200
Branches: soc-2016-cycles_denoising
https://developer.blender.org/rBc167e5d7237848bfd2d15ae0ab6432a27b7015d3

Render API/Image Editor: Add postprocessing operator that calls the render engine when executed

This commit adds a general operator for postprocessing render results in the Image editor.
To do so, the render API is extended by two functions:
 - can_postprocess checks whether the current render result can be postprocessed by the engine.
   For the denoiser, this will check whether the required passes have been rendered.
 - postprocess is executed when the user runs the operator. For the denoiser, this will do the actual denoising.

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

M	release/scripts/startup/bl_ui/space_image.py
M	source/blender/blenkernel/BKE_scene.h
M	source/blender/blenkernel/intern/scene.c
M	source/blender/editors/space_image/image_intern.h
M	source/blender/editors/space_image/image_ops.c
M	source/blender/editors/space_image/space_image.c
M	source/blender/makesrna/intern/rna_render.c
M	source/blender/makesrna/intern/rna_scene.c
M	source/blender/render/extern/include/RE_engine.h
M	source/blender/render/intern/source/external_engine.c

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

diff --git a/release/scripts/startup/bl_ui/space_image.py b/release/scripts/startup/bl_ui/space_image.py
index fbea07a..b98e72c 100644
--- a/release/scripts/startup/bl_ui/space_image.py
+++ b/release/scripts/startup/bl_ui/space_image.py
@@ -1202,6 +1202,26 @@ class IMAGE_PT_tools_grease_pencil_edit(GreasePencilStrokeEditPanel, Panel):
 class IMAGE_PT_tools_grease_pencil_sculpt(GreasePencilStrokeSculptPanel, Panel):
     bl_space_type = 'IMAGE_EDITOR'
 
+class IMAGE_PT_tools_post_process(Panel):
+    bl_space_type = 'IMAGE_EDITOR'
+    bl_region_type = 'UI'
+    bl_label = "Post-processing"
+
+    @classmethod
+    def poll(cls, context):
+        rd = context.scene.render
+        sima = context.space_data
+
+        return sima.show_render and rd.use_result_postprocess
+
+    def draw(self, context):
+        layout = self.layout
+
+        sima = context.space_data
+        ima = sima.image
+
+        layout.operator("image.postprocess");
+
 
 if __name__ == "__main__":  # only for live edit.
     bpy.utils.register_module(__name__)
diff --git a/source/blender/blenkernel/BKE_scene.h b/source/blender/blenkernel/BKE_scene.h
index a4c44b9..8882f23 100644
--- a/source/blender/blenkernel/BKE_scene.h
+++ b/source/blender/blenkernel/BKE_scene.h
@@ -136,6 +136,7 @@ float get_render_aosss_error(const struct RenderData *r, float error);
 bool BKE_scene_use_new_shading_nodes(const struct Scene *scene);
 bool BKE_scene_use_shading_nodes_custom(struct Scene *scene);
 bool BKE_scene_use_spherical_stereo(struct Scene *scene);
+bool BKE_scene_use_result_postprocess(struct Scene *scene);
 
 bool BKE_scene_uses_blender_internal(const struct Scene *scene);
 bool BKE_scene_uses_blender_game(const struct Scene *scene);
diff --git a/source/blender/blenkernel/intern/scene.c b/source/blender/blenkernel/intern/scene.c
index 6fda425..621d693 100644
--- a/source/blender/blenkernel/intern/scene.c
+++ b/source/blender/blenkernel/intern/scene.c
@@ -2203,6 +2203,12 @@ bool BKE_scene_use_spherical_stereo(Scene *scene)
 	return (type && type->flag & RE_USE_SPHERICAL_STEREO);
 }
 
+bool BKE_scene_use_result_postprocess(Scene *scene)
+{
+	RenderEngineType *type = RE_engines_find(scene->r.engine);
+	return (type && type->flag & RE_USE_RESULT_POSTPROCESS);
+}
+
 bool BKE_scene_uses_blender_internal(const  Scene *scene)
 {
 	return STREQ(scene->r.engine, RE_engine_id_BLENDER_RENDER);
diff --git a/source/blender/editors/space_image/image_intern.h b/source/blender/editors/space_image/image_intern.h
index 69993c3..66776d9 100644
--- a/source/blender/editors/space_image/image_intern.h
+++ b/source/blender/editors/space_image/image_intern.h
@@ -92,6 +92,8 @@ void IMAGE_OT_read_renderlayers(struct wmOperatorType *ot);
 void IMAGE_OT_render_border(struct wmOperatorType *ot);
 void IMAGE_OT_clear_render_border(struct wmOperatorType *ot);
 
+void IMAGE_OT_postprocess(struct wmOperatorType *ot);
+
 /* image_panels.c */
 struct ImageUser *ntree_get_active_iuser(struct bNodeTree *ntree);
 void image_buttons_register(struct ARegionType *art);
diff --git a/source/blender/editors/space_image/image_ops.c b/source/blender/editors/space_image/image_ops.c
index 8db5a8f..17dbc4c 100644
--- a/source/blender/editors/space_image/image_ops.c
+++ b/source/blender/editors/space_image/image_ops.c
@@ -3662,3 +3662,63 @@ void IMAGE_OT_clear_render_border(wmOperatorType *ot)
 	/* flags */
 	ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
 }
+
+static int postprocess_poll(bContext *C)
+{
+	Scene *scene = CTX_data_scene(C);
+	Image *ima = CTX_data_edit_image(C);
+	RenderResult *rr = BKE_image_acquire_renderresult(scene, ima);
+	RenderEngineType *type = RE_engines_find(scene->r.engine);
+	RenderEngine *engine;
+	int can_postprocess;
+
+	if (!(ima && ima->type == IMA_TYPE_R_RESULT && rr &&
+	      BKE_scene_use_result_postprocess(scene) &&
+	      type->can_postprocess && type->postprocess)) {
+		if (rr) {
+			BKE_image_release_renderresult(scene, ima);
+		}
+		return 0;
+	}
+
+	/* this is probably a bit slow, but how else to check for passes etc. in a flexible way? */
+	engine = RE_engine_create(type);
+
+	can_postprocess = type->can_postprocess(engine, rr);
+
+	BKE_image_release_renderresult(scene, ima);
+	RE_engine_free(engine);
+
+	return can_postprocess;
+}
+
+static int postprocess_exec(bContext *C, wmOperator *UNUSED(op))
+{
+	Scene *scene = CTX_data_scene(C);
+	Image *ima = CTX_data_edit_image(C);
+	RenderResult *rr = BKE_image_acquire_renderresult(scene, ima);
+	RenderEngineType *type = RE_engines_find(scene->r.engine);
+	RenderEngine *engine = RE_engine_create(type);
+
+	type->postprocess(engine, scene, rr);
+
+	BKE_image_release_renderresult(scene, ima);
+	RE_engine_free(engine);
+
+	return OPERATOR_FINISHED;
+}
+
+void IMAGE_OT_postprocess(wmOperatorType *ot)
+{
+	/* identifiers */
+	ot->name = "Postprocess Render Result";
+	ot->description = "Call the render engine to post-process the render result";
+	ot->idname = "IMAGE_OT_postprocess";
+
+	/* api callbacks */
+	ot->exec = postprocess_exec;
+	ot->poll = postprocess_poll;
+
+	/* flags */
+	ot->flag = OPTYPE_REGISTER;
+}
diff --git a/source/blender/editors/space_image/space_image.c b/source/blender/editors/space_image/space_image.c
index 168f9c0..3b40428 100644
--- a/source/blender/editors/space_image/space_image.c
+++ b/source/blender/editors/space_image/space_image.c
@@ -262,6 +262,8 @@ static void image_operatortypes(void)
 	WM_operatortype_append(IMAGE_OT_read_renderlayers);
 	WM_operatortype_append(IMAGE_OT_render_border);
 	WM_operatortype_append(IMAGE_OT_clear_render_border);
+
+	WM_operatortype_append(IMAGE_OT_postprocess);
 }
 
 static void image_keymap(struct wmKeyConfig *keyconf)
diff --git a/source/blender/makesrna/intern/rna_render.c b/source/blender/makesrna/intern/rna_render.c
index 0c7c115..51315f3 100644
--- a/source/blender/makesrna/intern/rna_render.c
+++ b/source/blender/makesrna/intern/rna_render.c
@@ -256,6 +256,47 @@ static void engine_update_script_node(RenderEngine *engine, struct bNodeTree *nt
 	RNA_parameter_list_free(&list);
 }
 
+static int engine_can_postprocess(RenderEngine *engine, struct RenderResult *result)
+{
+	extern FunctionRNA rna_RenderEngine_can_postprocess_func;
+	PointerRNA ptr;
+	ParameterList list;
+	FunctionRNA *func;
+	void *ret;
+	int can_postprocess;
+
+	RNA_pointer_create(NULL, engine->type->ext.srna, engine, &ptr);
+	func = &rna_RenderEngine_can_postprocess_func;
+
+	RNA_parameter_list_create(&list, &ptr, func);
+	RNA_parameter_set_lookup(&list, "result", &result);
+	engine->type->ext.call(NULL, &ptr, func, &list);
+	RNA_parameter_get_lookup(&list, "can_postprocess", &ret);
+	can_postprocess = *(int *)ret;
+
+	RNA_parameter_list_free(&list);
+
+	return can_postprocess;
+}
+
+static void engine_postprocess(RenderEngine *engine, struct Scene *scene, struct RenderResult *result)
+{
+	extern FunctionRNA rna_RenderEngine_postprocess_func;
+	PointerRNA ptr;
+	ParameterList list;
+	FunctionRNA *func;
+
+	RNA_pointer_create(NULL, engine->type->ext.srna, engine, &ptr);
+	func = &rna_RenderEngine_postprocess_func;
+
+	RNA_parameter_list_create(&list, &ptr, func);
+	RNA_parameter_set_lookup(&list, "scene", &scene);
+	RNA_parameter_set_lookup(&list, "result", &result);
+	engine->type->ext.call(NULL, &ptr, func, &list);
+
+	RNA_parameter_list_free(&list);
+}
+
 /* RenderEngine registration */
 
 static void rna_RenderEngine_unregister(Main *UNUSED(bmain), StructRNA *type)
@@ -276,7 +317,7 @@ static StructRNA *rna_RenderEngine_register(Main *bmain, ReportList *reports, vo
 	RenderEngineType *et, dummyet = {NULL};
 	RenderEngine dummyengine = {NULL};
 	PointerRNA dummyptr;
-	int have_function[6];
+	int have_function[8];
 
 	/* setup dummy engine & engine type to store static properties in */
 	dummyengine.type = &dummyet;
@@ -318,6 +359,8 @@ static StructRNA *rna_RenderEngine_register(Main *bmain, ReportList *reports, vo
 	et->view_update = (have_function[3]) ? engine_view_update : NULL;
 	et->view_draw = (have_function[4]) ? engine_view_draw : NULL;
 	et->update_script_node = (have_function[5]) ? engine_update_script_node : NULL;
+	et->can_postprocess = (have_function[6]) ? engine_can_postprocess : NULL;
+	et->postprocess = (have_function[7]) ? engine_postprocess : NULL;
 
 	BLI_addtail(&R_engines, et);
 
@@ -488,6 +531,23 @@ static void rna_def_render_engine(BlenderRNA *brna)
 	prop = RNA_def_pointer(func, "node", "Node", "", "");
 	RNA_def_property_flag(prop, PROP_RNAPTR);
 
+	/* result postprocessing callbacks */
+	func = RNA_def_function(srna, "can_postprocess", NULL);
+	RNA_def_function_ui_description(func, "Pool whether a render result can be postprocessed");
+	RNA_def_function_flag(func, FUNC_REGISTER_OPTIONAL | FUNC_ALLOW_WRITE);
+	prop = RNA_def_pointer(func, "result", "RenderResult", "Result", "");
+	RNA_def_property_flag(prop, PROP_REQUIRED);
+	prop = RNA_def_boolean(func, "can_postprocess", 0, "Can post-process", "Whether the render result can be postprocessed or not");
+	RNA_def_function_return(func, prop);
+
+	func = RNA_def_function(srna, "postprocess", NULL);
+	RNA_def_function_ui_description(func, "Postprocess the given render result");
+	RNA_def_function_flag(func, FUNC_REGISTER_OPTIONAL | FUNC_ALLOW_WRITE);
+	prop = RNA_def_pointer(func, "scene", "Scene", "Scene", "");
+	RNA_def_property_flag(prop, PROP_REQUIRED);
+	prop = RNA_def_pointer(func, "result", "RenderResult", "Result", "");
+	RNA_def_property_flag(prop, PROP_REQUIRED);
+
 	/* tag for redraw */
 	func = RNA_def_function(srna, "tag_redraw", "engine_tag_redraw");
 	RNA_def_function_ui_description(func, "Request redraw for viewport rendering");
@@ -698,6 +758,10 @@ static void rna_def_render_engine(BlenderRNA *brna)
 	RNA_def_property_boolean_sdna(prop, NULL, "type->flag", RE_USE_SPHERICAL_STEREO);
 	RNA_def_property_flag(prop, PROP_REGISTER_OPTIONAL);
 
+	prop = RNA_def_property(srna, "bl_use_result_postprocess", PROP_BOOLEAN, PROP_NONE);
+	RNA_def_property_boolean_sdna(prop, NULL, "type->flag", RE_USE_RESULT_POSTPROCESS);
+	RNA_def_property_flag(prop, PROP_REGISTER_OPTIONAL);
+
 	RNA_define_verify_sdna(1);
 }
 
diff --git a/source/blender/makesrna/intern/rna_scene.c b/source/blender/makesrna/intern/rna_scene.c
index aa04ebe..73aeec4 100644
--

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list