Commit: 12076595992d706e05341fe99df3e298fe940f6a
Author: Lukas Stockner
Date:   Wed Jan 4 21:48:28 2017 +0100
Branches: temp_cryptomatte
https://developer.blender.org/rB12076595992d706e05341fe99df3e298fe940f6a

Cycles: Implement AOV passes

Missing: Specifying the passes in the UI

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

M       intern/cycles/blender/blender_session.cpp
M       intern/cycles/blender/blender_shader.cpp
M       intern/cycles/blender/blender_sync.cpp
M       intern/cycles/blender/blender_sync.h
M       intern/cycles/kernel/CMakeLists.txt
M       intern/cycles/kernel/kernel_bake.h
M       intern/cycles/kernel/kernel_emission.h
M       intern/cycles/kernel/kernel_passes.h
M       intern/cycles/kernel/kernel_path.h
M       intern/cycles/kernel/kernel_path_branched.h
M       intern/cycles/kernel/kernel_path_state.h
M       intern/cycles/kernel/kernel_shader.h
M       intern/cycles/kernel/kernel_shadow.h
M       intern/cycles/kernel/kernel_subsurface.h
M       intern/cycles/kernel/kernel_types.h
M       intern/cycles/kernel/osl/osl_services.cpp
M       
intern/cycles/kernel/split/kernel_holdout_emission_blurring_pathtermination_ao.h
M       intern/cycles/kernel/split/kernel_indirect_background.h
M       intern/cycles/kernel/split/kernel_shader_eval.h
M       intern/cycles/kernel/svm/svm.h
A       intern/cycles/kernel/svm/svm_aov.h
M       intern/cycles/kernel/svm/svm_types.h
M       intern/cycles/render/buffers.cpp
M       intern/cycles/render/buffers.h
M       intern/cycles/render/film.cpp
M       intern/cycles/render/film.h
M       intern/cycles/render/graph.cpp
M       intern/cycles/render/graph.h
M       intern/cycles/render/integrator.cpp
M       intern/cycles/render/nodes.cpp
M       intern/cycles/render/nodes.h
M       intern/cycles/render/osl.cpp
M       intern/cycles/render/osl.h
M       intern/cycles/render/scene.cpp
M       intern/cycles/render/session.cpp
M       intern/cycles/render/svm.cpp
M       intern/cycles/render/svm.h
M       source/blender/blenkernel/BKE_node.h
M       source/blender/blenkernel/intern/node.c
M       source/blender/editors/space_node/drawnode.c
M       source/blender/makesdna/DNA_node_types.h
M       source/blender/makesrna/RNA_access.h
M       source/blender/makesrna/intern/rna_nodetree.c
M       source/blender/nodes/CMakeLists.txt
M       source/blender/nodes/NOD_shader.h
M       source/blender/nodes/NOD_static_types.h
A       source/blender/nodes/shader/nodes/node_shader_aov_output.c

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

diff --git a/intern/cycles/blender/blender_session.cpp 
b/intern/cycles/blender/blender_session.cpp
index dfd6dc8db34..3a847022350 100644
--- a/intern/cycles/blender/blender_session.cpp
+++ b/intern/cycles/blender/blender_session.cpp
@@ -397,19 +397,9 @@ void BlenderSession::render()
 
                BL::RenderLayer b_rlay = *b_single_rlay;
 
-               /* add passes */
-               array<Pass> passes;
-               if(session_params.device.advanced_shading) {
-                       passes = sync->sync_render_passes(b_rlay, 
*b_layer_iter);
-               }
-               else {
-                       Pass::add(PASS_COMBINED, passes);
-               }
+               sync->sync_film(b_rlay, *b_layer_iter, 
session_params.device.advanced_shading);
 
-               buffer_params.passes = passes;
-               scene->film->pass_alpha_threshold = 
b_layer_iter->pass_alpha_threshold();
-               scene->film->tag_passes_update(scene, passes);
-               scene->film->tag_update(scene);
+               buffer_params.passes = scene->film->passes;
                scene->integrator->tag_update(scene);
 
                int view_index = 0;
@@ -557,7 +547,7 @@ void BlenderSession::bake(BL::Object& b_object,
 
        if(shader_type == SHADER_EVAL_UV) {
                /* force UV to be available */
-               Pass::add(PASS_UV, scene->film->passes);
+               scene->film->passes.add(PASS_UV);
        }
 
        int bake_pass_filter = bake_pass_filter_get(pass_filter);
@@ -565,7 +555,7 @@ void BlenderSession::bake(BL::Object& b_object,
 
        /* force use_light_pass to be true if we bake more than just colors */
        if(bake_pass_filter & ~BAKE_FILTER_COLOR) {
-               Pass::add(PASS_LIGHT, scene->film->passes);
+               scene->film->passes.add(PASS_LIGHT);
        }
 
        /* create device and update scene */
@@ -666,6 +656,9 @@ void 
BlenderSession::do_write_update_render_result(BL::RenderResult& b_rr,
                                /* copy pixels */
                                read = buffers->get_pass_rect(pass_type, 
exposure, sample, components, &pixels[0]);
                        }
+                       else if (b_pass.name().substr(0, 4) == "AOV ") {
+                               read = 
buffers->get_aov_rect(ustring(b_pass.name().substr(4)), exposure, sample, 
components, &pixels[0]);
+                       }
 
                        if(!read) {
                                memset(&pixels[0], 0, 
pixels.size()*sizeof(float));
diff --git a/intern/cycles/blender/blender_shader.cpp 
b/intern/cycles/blender/blender_shader.cpp
index bdbab1006c0..861f0e06aef 100644
--- a/intern/cycles/blender/blender_shader.cpp
+++ b/intern/cycles/blender/blender_shader.cpp
@@ -825,6 +825,12 @@ static ShaderNode *add_node(Scene *scene,
                uvm->from_dupli = b_uvmap_node.from_dupli();
                node = uvm;
        }
+       else if(b_node.is_a(&RNA_ShaderNodeAOVOutput)) {
+               BL::ShaderNodeAOVOutput b_aovout_node(b_node);
+               AOVOutputNode *aov = new AOVOutputNode();
+               aov->name = ustring(b_aovout_node.aov());
+               node = aov;
+       }
        else if(b_node.is_a(&RNA_ShaderNodeTexPointDensity)) {
                BL::ShaderNodeTexPointDensity b_point_density_node(b_node);
                PointDensityTextureNode *point_density = new 
PointDensityTextureNode();
diff --git a/intern/cycles/blender/blender_sync.cpp 
b/intern/cycles/blender/blender_sync.cpp
index 7dd168a6a3d..b133f4dbf8e 100644
--- a/intern/cycles/blender/blender_sync.cpp
+++ b/intern/cycles/blender/blender_sync.cpp
@@ -525,55 +525,59 @@ PassType BlenderSync::get_pass_type(BL::RenderPass& 
b_pass)
        return PASS_NONE;
 }
 
-array<Pass> BlenderSync::sync_render_passes(BL::RenderLayer& b_rlay,
-                                               BL::SceneRenderLayer& b_srlay)
+void BlenderSync::sync_film(BL::RenderLayer& b_rlay,
+                               BL::SceneRenderLayer& b_srlay,
+                               bool advanced_shading)
 {
-       array<Pass> passes;
-       Pass::add(PASS_COMBINED, passes);
+       PassSettings passes;
 
-       /* loop over passes */
-       BL::RenderLayer::passes_iterator b_pass_iter;
+       if(advanced_shading) {
+               /* loop over passes */
+               BL::RenderLayer::passes_iterator b_pass_iter;
 
-       for(b_rlay.passes.begin(b_pass_iter); b_pass_iter != 
b_rlay.passes.end(); ++b_pass_iter) {
-               BL::RenderPass b_pass(*b_pass_iter);
-               PassType pass_type = get_pass_type(b_pass);
+               for(b_rlay.passes.begin(b_pass_iter); b_pass_iter != 
b_rlay.passes.end(); ++b_pass_iter) {
+                       BL::RenderPass b_pass(*b_pass_iter);
+                       PassType pass_type = get_pass_type(b_pass);
 
-               if(pass_type == PASS_MOTION && scene->integrator->motion_blur)
-                       continue;
-               if(pass_type != PASS_NONE)
-                       Pass::add(pass_type, passes);
-       }
+                       if(pass_type == PASS_MOTION && 
scene->integrator->motion_blur)
+                               continue;
+                       if(pass_type != PASS_NONE)
+                               passes.add(pass_type);
+               }
 
-       PointerRNA crp = RNA_pointer_get(&b_srlay.ptr, "cycles");
+               PointerRNA crp = RNA_pointer_get(&b_srlay.ptr, "cycles");
 #ifdef __KERNEL_DEBUG__
-       if(get_boolean(crp, "pass_debug_bvh_traversed_nodes")) {
-               b_engine.add_pass("Debug BVH Traversed Nodes", 1, "X", 
b_srlay.name().c_str());
-               Pass::add(PASS_BVH_TRAVERSED_NODES, passes);
-       }
-       if(get_boolean(crp, "pass_debug_bvh_traversed_instances")) {
-               b_engine.add_pass("Debug BVH Traversed Instances", 1, "X", 
b_srlay.name().c_str());
-               Pass::add(PASS_BVH_TRAVERSED_INSTANCES, passes);
-       }
-       if(get_boolean(crp, "pass_debug_bvh_intersections")) {
-               b_engine.add_pass("Debug BVH Intersections", 1, "X", 
b_srlay.name().c_str());
-               Pass::add(PASS_BVH_INTERSECTIONS, passes);
-       }
-       if(get_boolean(crp, "pass_debug_ray_bounces")) {
-               b_engine.add_pass("Debug Ray Bounces", 1, "X", 
b_srlay.name().c_str());
-               Pass::add(PASS_RAY_BOUNCES, passes);
-       }
+               if(get_boolean(crp, "pass_debug_bvh_traversed_nodes")) {
+                       b_engine.add_pass("Debug BVH Traversed Nodes", 1, "X", 
b_srlay.name().c_str());
+                       Pass::add(PASS_BVH_TRAVERSED_NODES, passes);
+               }
+               if(get_boolean(crp, "pass_debug_bvh_traversed_instances")) {
+                       b_engine.add_pass("Debug BVH Traversed Instances", 1, 
"X", b_srlay.name().c_str());
+                       Pass::add(PASS_BVH_TRAVERSED_INSTANCES, passes);
+               }
+               if(get_boolean(crp, "pass_debug_bvh_intersections")) {
+                       b_engine.add_pass("Debug BVH Intersections", 1, "X", 
b_srlay.name().c_str());
+                       Pass::add(PASS_BVH_INTERSECTIONS, passes);
+               }
+               if(get_boolean(crp, "pass_debug_ray_bounces")) {
+                       b_engine.add_pass("Debug Ray Bounces", 1, "X", 
b_srlay.name().c_str());
+                       Pass::add(PASS_RAY_BOUNCES, passes);
+               }
 #endif
 
-       RNA_BEGIN(&crp, b_aov, "aovs") {
-               bool is_color = RNA_enum_get(&b_aov, "type");
-               string name = get_string(b_aov, "name");
-               AOV aov = { ustring(name), 9999, is_color };
-               passes.add(aov);
-               string passname = string_printf("AOV %s", name.c_str());
-               b_engine.add_pass(is_color ? 3 : 1, passname.c_str(), 
b_srlay.name().c_str(), NULL, is_color ? "RGB" : "X");
-       } RNA_END
+               RNA_BEGIN(&crp, b_aov, "aovs") {
+                       bool is_color = RNA_enum_get(&b_aov, "type");
+                       string name = get_string(b_aov, "name");
+                       AOV aov = { ustring(name), 9999, is_color };
+                       passes.add(aov);
+                       string passname = string_printf("AOV %s", name.c_str());
+                       b_engine.add_pass(passname.c_str(), is_color ? 3 : 1, 
is_color ? "RGB" : "X", b_srlay.name().c_str());
+               } RNA_END
 
-       return passes;
+               scene->film->pass_alpha_threshold = 
b_srlay.pass_alpha_threshold();
+               scene->film->tag_passes_update(scene, passes);
+               scene->film->tag_update(scene);
+       }
 }
 
 /* Scene Parameters */
diff --git a/intern/cycles/blender/blender_sync.h 
b/intern/cycles/blender/blender_sync.h
index aee39a5652a..304052bbeed 100644
--- a/intern/cycles/blender/blender_sync.h
+++ b/intern/cycles/blender/blender_sync.h
@@ -67,8 +67,9 @@ public:
                       void **python_thread_state,
                       const char *layer = 0);
        void sync_render_layers(BL::SpaceView3D& b_v3d, const char *layer);
-       array<Pass> sync_render_passes(BL::RenderLayer& b_rlay,
-                                      BL::SceneRenderLayer& b_srlay);
+       void sync_film(BL::RenderLayer& b_rlay,
+                      BL::SceneRenderLayer& b_srlay,
+                      bool advanced_shading);
        void sync_integrator();
        void sync_camera(BL::RenderSettings& b_render,
                         BL::Object& b_override,
diff --git a/intern/cycles/kernel/CMakeLists.txt 
b/intern/cycles/kernel/CMakeLists.txt
index 9bb0455b9d5..2ed180486d8 100644
--- a/intern/cycles/kernel/CMakeLists.txt
+++ b/intern/cycles/kernel/CMakeLists.txt
@@ -129,6 +129,7 @@ set(SRC_CLOSURE_HEADERS
 set(SRC_SVM_HEADERS
        svm/svm.h
        svm/svm_attribute.h
+       svm/svm_aov.h
        svm/svm_blackbody.h
        svm/svm_bump.h
        svm/svm_camera.h
diff --git a/intern/cycles/kernel/kernel_bake.h 
b/intern/cycles/kernel/kernel_bake.h
index f18d145f7cf..1dca3ccaead 100644
--- a/intern/cycles/kernel/kernel_bake.h
+++ b/intern/cycles/kernel/kernel_bake.h
@@ -52,7 +52,7 @@ ccl_device_inline void compute_light_pass(KernelGlobals *kg,
 
        /* evaluate surface shader */
        float rbsdf = path_state_rng_1D(kg, &rng, &state, PRNG_BSDF);
-       shader_eval_surface(kg, sd, &rng, &state, rbsdf, state.flag, 
SHADER_CONTEXT_MAIN);
+       shader_eval_surface(kg, sd, &rng, &state, rbsdf, state.flag, 
SHADER_CONTEXT_MAIN, NULL, 0);
 
        /* TODO, disable more closures we don't need besides transparent */
        shader_bsdf_disable_transparency(kg, sd);
@@ -245,12 +245,12 @@ ccl_device float3 
kernel_bake_evaluate_direct_indirect(KernelGlobals *kg,
                }
                else {
                        /* surface color of the pass only */
-                       shader_eval_surface(kg, sd, rng, state, 0.0f, 0, 
SHADER_CONTEXT_MAIN);
+                       shader_eval_surface(kg, sd, rng, state, 0.0f, 0, 
SHADER_CONTEXT_MAIN, NULL, 0);
                        return kernel_bake_shader_bsdf(kg, sd, type);
                }
        }
        else {
-               shader_eval_surface(kg, sd, rng, state, 0.0f, 0, 
SHADER_CONTEXT_MAIN);
+               shader_eval_surface(kg, sd, rng, state, 0.0f, 0, 
SHADER_CONTEXT_MAIN, NULL, 0);
                color = kernel_bake_shader_bsdf(kg, sd, type);
        }
 
@@ -342,7 +342,7 @@ ccl_device void kernel_bake_evaluate(KernelGlobals *kg, 
ccl_global uint4 *input,
                case SHADER_EVAL_NORMAL:
                {
                        if((sd.flag & SD_HAS_BUMP)) {
-                               shader_eval_surface(kg, &sd, &rng, &state, 0.f, 
0, SHADER_CONTEXT_MAIN);
+                               shader_eval_surface(kg, &sd, &rng, &state, 0.f, 
0, SHADER_CONTEXT_MAIN, NULL, 0);
                        }
 
                        /* compression: normal = (2 * color) - 1 */
@@ -356,7 +356,7 @@ ccl_device void kernel_bake_evaluate(KernelGlobals *kg, 
ccl_global uint4 *input,
                }
                case SHADER_EVAL_EMISSION:
                {
-                       shader_eval_surface(kg, &sd, &rng, &state, 0.f, 0, 
SHADER_CONTEXT_EMISSION);
+                       shader_eval_surface(kg, &sd, &rng, &state, 0.f, 0, 
SHADER_CONTEXT_EMISSION, NULL, 0);
                        out = shader_emissive_eval(kg, &sd);
                        break;
                }
@@ -480,7 +480,7 @@ ccl_device void kernel_bake_evaluate(KernelGlobals *kg, 
ccl_glob

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