[Bf-blender-cvs] [12076595992] temp_cryptomatte: Cycles: Implement AOV passes
Lukas Stockner
noreply at git.blender.org
Fri Nov 3 21:09:34 CET 2017
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. @@
More information about the Bf-blender-cvs
mailing list