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 */

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

Reply via email to