[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