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. @@

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
https://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to