[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