[Bf-blender-cvs] [2d0bfbd] soc-2016-cycles_denoising: Cycles Denoising: Add RenderLayer options

Lukas Stockner noreply at git.blender.org
Fri May 27 21:47:20 CEST 2016


Commit: 2d0bfbd6f628cc80c777f81832f5011f419d870a
Author: Lukas Stockner
Date:   Fri May 27 18:46:21 2016 +0200
Branches: soc-2016-cycles_denoising
https://developer.blender.org/rB2d0bfbd6f628cc80c777f81832f5011f419d870a

Cycles Denoising: Add RenderLayer options

This commit adds the necessary parameters to the RenderLayer panel and syncs them to Cycles.
It would be nicer to define the RNA properties from Cycles Python code like most other ones, but
since that's not possible for RenderLayers, it has to be added in the DNA :/

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

M	intern/cycles/blender/addon/ui.py
M	intern/cycles/blender/blender_session.cpp
M	source/blender/makesdna/DNA_scene_types.h
M	source/blender/makesrna/intern/rna_scene.c

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

diff --git a/intern/cycles/blender/addon/ui.py b/intern/cycles/blender/addon/ui.py
index 023841a..d15accf 100644
--- a/intern/cycles/blender/addon/ui.py
+++ b/intern/cycles/blender/addon/ui.py
@@ -543,6 +543,44 @@ class CyclesRender_PT_views(CyclesButtonsPanel, Panel):
             row.prop(rv, "camera_suffix", text="")
 
 
+class CyclesRender_PT_denoising(CyclesButtonsPanel, Panel):
+    bl_label = "Denoising"
+    bl_context = "render_layer"
+    bl_options = {'DEFAULT_CLOSED'}
+
+    def draw_header(self, context):
+        rd = context.scene.render
+        rl = rd.layers.active
+        self.layout.prop(rl, "denoise_result", text="")
+
+    def draw(self, context):
+        layout = self.layout
+
+        scene = context.scene
+        rd = scene.render
+        rl = rd.layers.active
+
+        col = layout.column()
+
+        col.prop(rl, "keep_denoise_data")
+
+        sub = col.column(align=True)
+        sub.prop(rl, "half_window")
+        sub.prop(rl, "filter_strength", slider=True)
+
+        sub = col.column(align=True)
+        row = sub.row(align=True)
+        row.prop(rl, "denoise_diffuse_direct", toggle=True)
+        row.prop(rl, "denoise_glossy_direct", toggle=True)
+        row.prop(rl, "denoise_transmission_direct", toggle=True)
+        row.prop(rl, "denoise_subsurface_direct", toggle=True)
+        row = sub.row(align=True)
+        row.prop(rl, "denoise_diffuse_indirect", toggle=True)
+        row.prop(rl, "denoise_glossy_indirect", toggle=True)
+        row.prop(rl, "denoise_transmission_indirect", toggle=True)
+        row.prop(rl, "denoise_subsurface_indirect", toggle=True)
+
+
 class Cycles_PT_post_processing(CyclesButtonsPanel, Panel):
     bl_label = "Post Processing"
     bl_options = {'DEFAULT_CLOSED'}
diff --git a/intern/cycles/blender/blender_session.cpp b/intern/cycles/blender/blender_session.cpp
index 14f6e36..842d082 100644
--- a/intern/cycles/blender/blender_session.cpp
+++ b/intern/cycles/blender/blender_session.cpp
@@ -493,10 +493,16 @@ void BlenderSession::render()
 		}
 
 		buffer_params.passes = passes;
+		buffer_params.denoising_passes = b_layer_iter->keep_denoise_data() || b_layer_iter->denoise_result();
+		buffer_params.selective_denoising = !(b_layer_iter->denoise_diffuse_direct() && b_layer_iter->denoise_glossy_direct() && b_layer_iter->denoise_transmission_direct() && b_layer_iter->denoise_subsurface_direct() &&
+		                                      b_layer_iter->denoise_diffuse_indirect() && b_layer_iter->denoise_glossy_indirect() && b_layer_iter->denoise_transmission_indirect() && b_layer_iter->denoise_subsurface_indirect());
+		scene->film->denoising_passes = buffer_params.denoising_passes;
+		scene->film->selective_denoising = buffer_params.selective_denoising;
 		scene->film->pass_alpha_threshold = b_layer_iter->pass_alpha_threshold();
 		scene->film->tag_passes_update(scene, passes);
 		scene->film->tag_update(scene);
 		scene->integrator->tag_update(scene);
+		session->tile_manager.denoise = b_layer_iter->denoise_result();
 
 		for(b_rr.views.begin(b_view_iter); b_view_iter != b_rr.views.end(); ++b_view_iter) {
 			b_rview_name = b_view_iter->name();
diff --git a/source/blender/makesdna/DNA_scene_types.h b/source/blender/makesdna/DNA_scene_types.h
index 39508e1..d7a949d 100644
--- a/source/blender/makesdna/DNA_scene_types.h
+++ b/source/blender/makesdna/DNA_scene_types.h
@@ -190,6 +190,11 @@ typedef struct SceneRenderLayer {
 	int passflag;			/* pass_xor has to be after passflag */
 	int pass_xor;
 
+	int denoiseflag;
+	int denoise_half_window;
+	float denoise_strength;
+	int pad;
+
 	int samples;
 	float pass_alpha_threshold;
 	
@@ -213,6 +218,19 @@ typedef struct SceneRenderLayer {
 #define SCE_LAY_ZMASK		0x40000
 #define SCE_LAY_NEG_ZMASK	0x80000
 
+typedef enum SceneDenoiseFlag {
+	SCE_DENOISE_RESULT                = (1 << 0),
+	SCE_DENOISE_PASSES                = (1 << 1),
+	SCE_DENOISE_DIFFDIR               = (1 << 2),
+	SCE_DENOISE_DIFFIND               = (1 << 3),
+	SCE_DENOISE_GLOSSDIR              = (1 << 4),
+	SCE_DENOISE_GLOSSIND              = (1 << 5),
+	SCE_DENOISE_TRANSDIR              = (1 << 6),
+	SCE_DENOISE_TRANSIND              = (1 << 7),
+	SCE_DENOISE_SUBDIR                = (1 << 8),
+	SCE_DENOISE_SUBIND                = (1 << 9),
+} SceneDenoiseFlag;
+
 /* srl->passflag */
 typedef enum ScenePassType {
 	SCE_PASS_COMBINED                 = (1 << 0),
diff --git a/source/blender/makesrna/intern/rna_scene.c b/source/blender/makesrna/intern/rna_scene.c
index e89edaf..aa04ebe 100644
--- a/source/blender/makesrna/intern/rna_scene.c
+++ b/source/blender/makesrna/intern/rna_scene.c
@@ -4579,6 +4579,69 @@ static void rna_def_scene_render_layer(BlenderRNA *brna)
 	RNA_def_property_pointer_sdna(prop, NULL, "freestyleConfig");
 	RNA_def_property_struct_type(prop, "FreestyleSettings");
 	RNA_def_property_ui_text(prop, "Freestyle Settings", "");
+
+	/* Cycles denoising */
+	prop = RNA_def_property(srna, "denoise_result", PROP_BOOLEAN, PROP_NONE);
+	RNA_def_property_boolean_sdna(prop, NULL, "denoiseflag", SCE_DENOISE_RESULT);
+	RNA_def_property_ui_text(prop, "Denoise Render Result", "Denoise the rendered image during rendering");
+	RNA_def_property_update(prop, NC_SCENE | ND_RENDER_OPTIONS, NULL);
+
+	prop = RNA_def_property(srna, "keep_denoise_data", PROP_BOOLEAN, PROP_NONE);
+	RNA_def_property_boolean_sdna(prop, NULL, "denoiseflag", SCE_DENOISE_PASSES);
+	RNA_def_property_ui_text(prop, "Keep denoising data", "Store the denoising data so that the image can be denoised later");
+	RNA_def_property_update(prop, NC_SCENE | ND_RENDER_OPTIONS, NULL);
+
+	prop = RNA_def_property(srna, "denoise_diffuse_direct", PROP_BOOLEAN, PROP_NONE);
+	RNA_def_property_boolean_sdna(prop, NULL, "denoiseflag", SCE_DENOISE_DIFFDIR);
+	RNA_def_property_ui_text(prop, "Diffuse Direct", "Denoise the direct diffuse lighting");
+	RNA_def_property_update(prop, NC_SCENE | ND_RENDER_OPTIONS, NULL);
+
+	prop = RNA_def_property(srna, "denoise_diffuse_indirect", PROP_BOOLEAN, PROP_NONE);
+	RNA_def_property_boolean_sdna(prop, NULL, "denoiseflag", SCE_DENOISE_DIFFIND);
+	RNA_def_property_ui_text(prop, "Diffuse Indirect", "Denoise the indirect diffuse lighting");
+	RNA_def_property_update(prop, NC_SCENE | ND_RENDER_OPTIONS, NULL);
+
+	prop = RNA_def_property(srna, "denoise_glossy_direct", PROP_BOOLEAN, PROP_NONE);
+	RNA_def_property_boolean_sdna(prop, NULL, "denoiseflag", SCE_DENOISE_GLOSSDIR);
+	RNA_def_property_ui_text(prop, "Glossy Direct", "Denoise the direct glossy lighting");
+	RNA_def_property_update(prop, NC_SCENE | ND_RENDER_OPTIONS, NULL);
+
+	prop = RNA_def_property(srna, "denoise_glossy_indirect", PROP_BOOLEAN, PROP_NONE);
+	RNA_def_property_boolean_sdna(prop, NULL, "denoiseflag", SCE_DENOISE_GLOSSIND);
+	RNA_def_property_ui_text(prop, "Glossy Indirect", "Denoise the indirect glossy lighting");
+	RNA_def_property_update(prop, NC_SCENE | ND_RENDER_OPTIONS, NULL);
+
+	prop = RNA_def_property(srna, "denoise_transmission_direct", PROP_BOOLEAN, PROP_NONE);
+	RNA_def_property_boolean_sdna(prop, NULL, "denoiseflag", SCE_DENOISE_TRANSDIR);
+	RNA_def_property_ui_text(prop, "Transmission Direct", "Denoise the direct transmission lighting");
+	RNA_def_property_update(prop, NC_SCENE | ND_RENDER_OPTIONS, NULL);
+
+	prop = RNA_def_property(srna, "denoise_transmission_indirect", PROP_BOOLEAN, PROP_NONE);
+	RNA_def_property_boolean_sdna(prop, NULL, "denoiseflag", SCE_DENOISE_TRANSIND);
+	RNA_def_property_ui_text(prop, "Transmission Indirect", "Denoise the indirect transmission lighting");
+	RNA_def_property_update(prop, NC_SCENE | ND_RENDER_OPTIONS, NULL);
+
+	prop = RNA_def_property(srna, "denoise_subsurface_direct", PROP_BOOLEAN, PROP_NONE);
+	RNA_def_property_boolean_sdna(prop, NULL, "denoiseflag", SCE_DENOISE_SUBDIR);
+	RNA_def_property_ui_text(prop, "Subsurface Direct", "Denoise the direct subsurface lighting");
+	RNA_def_property_update(prop, NC_SCENE | ND_RENDER_OPTIONS, NULL);
+
+	prop = RNA_def_property(srna, "denoise_subsurface_indirect", PROP_BOOLEAN, PROP_NONE);
+	RNA_def_property_boolean_sdna(prop, NULL, "denoiseflag", SCE_DENOISE_SUBIND);
+	RNA_def_property_ui_text(prop, "Subsurface Indirect", "Denoise the indirect subsurface lighting");
+	RNA_def_property_update(prop, NC_SCENE | ND_RENDER_OPTIONS, NULL);
+
+	prop = RNA_def_property(srna, "filter_strength", PROP_FLOAT, PROP_NONE);
+	RNA_def_property_float_sdna(prop, NULL, "denoise_strength");
+	RNA_def_property_range(prop, -2.0, 2.0);
+	RNA_def_property_ui_text(prop, "Filter strength", "Strength of the denoising filter (0 = average, higher is stronger)");
+	RNA_def_property_update(prop, NC_SCENE | ND_RENDER_OPTIONS, NULL);
+
+	prop = RNA_def_property(srna, "half_window", PROP_INT, PROP_NONE);
+	RNA_def_property_int_sdna(prop, NULL, "denoise_half_window");
+	RNA_def_property_range(prop, 1, 50);
+	RNA_def_property_ui_text(prop, "Half window", "Size of the filter window (the pixel area used for denoising one pixel). Higher values get rid of more noise, but might lose detail and are slower.");
+	RNA_def_property_update(prop, NC_SCENE | ND_RENDER_OPTIONS, NULL);
 }
 
 /* Render Layers */




More information about the Bf-blender-cvs mailing list