[Bf-blender-cvs] [9bdf0cc] soc-2016-cycles_denoising: Cycles: Implement Postprocessing API

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


Commit: 9bdf0cc5ac4640020338e3da7364edd3340801e6
Author: Lukas Stockner
Date:   Tue Jun 21 19:27:29 2016 +0200
Branches: soc-2016-cycles_denoising
https://developer.blender.org/rB9bdf0cc5ac4640020338e3da7364edd3340801e6

Cycles: Implement Postprocessing API

This commit implements the Postprocessing API in the Cycles Python bindings
and the poll function in the actual Cycles code.
The actual postprocessing doesn't do any processing yet.

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

M	intern/cycles/blender/addon/__init__.py
M	intern/cycles/blender/addon/engine.py
M	intern/cycles/blender/blender_python.cpp
M	intern/cycles/blender/blender_session.cpp
M	intern/cycles/blender/blender_session.h

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

diff --git a/intern/cycles/blender/addon/__init__.py b/intern/cycles/blender/addon/__init__.py
index 2938831..ef4342a 100644
--- a/intern/cycles/blender/addon/__init__.py
+++ b/intern/cycles/blender/addon/__init__.py
@@ -44,6 +44,7 @@ class CyclesRender(bpy.types.RenderEngine):
     bl_use_exclude_layers = True
     bl_use_save_buffers = True
     bl_use_spherical_stereo = True
+    bl_use_result_postprocess = True
 
     def __init__(self):
         self.session = None
@@ -88,6 +89,12 @@ class CyclesRender(bpy.types.RenderEngine):
         else:
             self.report({'ERROR'}, "OSL support disabled in this build.")
 
+    def can_postprocess(self, result):
+        return engine.can_postprocess(result)
+
+    def postprocess(self, scene, result):
+        engine.postprocess(scene, result);
+
 
 def engine_exit():
     engine.exit()
diff --git a/intern/cycles/blender/addon/engine.py b/intern/cycles/blender/addon/engine.py
index d4b7535..61eb891 100644
--- a/intern/cycles/blender/addon/engine.py
+++ b/intern/cycles/blender/addon/engine.py
@@ -189,3 +189,11 @@ def with_network():
 def system_info():
     import _cycles
     return _cycles.system_info()
+
+def can_postprocess(result):
+    import _cycles
+    return _cycles.can_postprocess(result.as_pointer())
+
+def postprocess(scene, result):
+    import _cycles
+    _cycles.postprocess(scene.as_pointer(), result.as_pointer())
diff --git a/intern/cycles/blender/blender_python.cpp b/intern/cycles/blender/blender_python.cpp
index 0161b5b..e501941 100644
--- a/intern/cycles/blender/blender_python.cpp
+++ b/intern/cycles/blender/blender_python.cpp
@@ -675,6 +675,42 @@ static PyObject *set_resumable_chunks_func(PyObject * /*self*/, PyObject *args)
 	Py_RETURN_NONE;
 }
 
+static PyObject *can_postprocess_func(PyObject * /*self*/, PyObject *args)
+{
+	PyObject *pyresult;
+
+	if(!PyArg_ParseTuple(args, "O", &pyresult))
+		return NULL;
+
+	/* RNA */
+	PointerRNA resultptr;
+	RNA_pointer_create(NULL, &RNA_RenderResult, (void*)PyLong_AsVoidPtr(pyresult), &resultptr);
+	BL::RenderResult b_rr(resultptr);
+
+	bool can_denoise = can_denoise_render_result(b_rr);
+
+	return Py_BuildValue("i", can_denoise? 1: 0);
+}
+
+static PyObject *postprocess_func(PyObject * /*self*/, PyObject *args)
+{
+	PyObject *pyresult, *pyscene;
+
+	if(!PyArg_ParseTuple(args, "OO", &pyscene, &pyresult))
+		return NULL;
+
+	/* RNA */
+	PointerRNA sceneptr;
+	RNA_id_pointer_create((ID*)PyLong_AsVoidPtr(pyscene), &sceneptr);
+	BL::Scene scene(sceneptr);
+
+	PointerRNA resultptr;
+	RNA_pointer_create(NULL, &RNA_RenderResult, (void*)PyLong_AsVoidPtr(pyresult), &resultptr);
+	BL::RenderResult b_rr(resultptr);
+
+	Py_RETURN_NONE;
+}
+
 static PyMethodDef methods[] = {
 	{"init", init_func, METH_VARARGS, ""},
 	{"exit", exit_func, METH_VARARGS, ""},
@@ -695,6 +731,9 @@ static PyMethodDef methods[] = {
 	{"opencl_disable", opencl_disable_func, METH_NOARGS, ""},
 #endif
 
+	{"can_postprocess", can_postprocess_func, METH_VARARGS, ""},
+	{"postprocess", postprocess_func, METH_VARARGS, ""},
+
 	/* Debugging routines */
 	{"debug_flags_update", debug_flags_update_func, METH_VARARGS, ""},
 	{"debug_flags_reset", debug_flags_reset_func, METH_NOARGS, ""},
diff --git a/intern/cycles/blender/blender_session.cpp b/intern/cycles/blender/blender_session.cpp
index a201c38..0987d74 100644
--- a/intern/cycles/blender/blender_session.cpp
+++ b/intern/cycles/blender/blender_session.cpp
@@ -1402,4 +1402,22 @@ void BlenderSession::update_resumable_tile_manager(int num_samples)
 	session->tile_manager.range_num_samples = range_num_samples;
 }
 
+bool can_denoise_render_result(BL::RenderResult& b_rr)
+{
+	/* Since the RenderResult may contain multiple layers,
+	 * this function returns true if at least one of them can be denoised. */
+	BL::RenderResult::layers_iterator b_layer_iter;
+	BL::RenderLayer::passes_iterator b_pass_iter;
+	for(b_rr.layers.begin(b_layer_iter); b_layer_iter != b_rr.layers.end(); ++b_layer_iter) {
+		int extended_types = 0;
+		for(b_layer_iter->passes.begin(b_pass_iter); b_pass_iter != b_layer_iter->passes.end(); ++b_pass_iter) {
+			extended_types |= b_pass_iter->extended_type();
+		}
+		if((~extended_types & EX_TYPE_DENOISE_REQUIRED) == 0) {
+			return true;
+		}
+	}
+	return false;
+}
+
 CCL_NAMESPACE_END
diff --git a/intern/cycles/blender/blender_session.h b/intern/cycles/blender/blender_session.h
index 3fe5cb6..32093d9 100644
--- a/intern/cycles/blender/blender_session.h
+++ b/intern/cycles/blender/blender_session.h
@@ -153,6 +153,8 @@ protected:
 	void update_resumable_tile_manager(int num_samples);
 };
 
+bool can_denoise_render_result(BL::RenderResult& b_rr);
+
 CCL_NAMESPACE_END
 
 #endif /* __BLENDER_SESSION_H__ */




More information about the Bf-blender-cvs mailing list