[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [57542] trunk/blender/intern/cycles: Cycles: add "Transparent Shadow" option for materials, to disable them per material.

Brecht Van Lommel brechtvanlommel at pandora.be
Tue Jun 18 11:36:01 CEST 2013


Revision: 57542
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=57542
Author:   blendix
Date:     2013-06-18 09:36:00 +0000 (Tue, 18 Jun 2013)
Log Message:
-----------
Cycles: add "Transparent Shadow" option for materials, to disable them per material.

Modified Paths:
--------------
    trunk/blender/intern/cycles/blender/addon/properties.py
    trunk/blender/intern/cycles/blender/addon/ui.py
    trunk/blender/intern/cycles/blender/blender_shader.cpp
    trunk/blender/intern/cycles/kernel/kernel_emission.h
    trunk/blender/intern/cycles/kernel/kernel_shader.h
    trunk/blender/intern/cycles/kernel/kernel_types.h
    trunk/blender/intern/cycles/render/light.cpp
    trunk/blender/intern/cycles/render/object.cpp
    trunk/blender/intern/cycles/render/osl.cpp
    trunk/blender/intern/cycles/render/shader.cpp
    trunk/blender/intern/cycles/render/shader.h
    trunk/blender/intern/cycles/render/svm.cpp

Modified: trunk/blender/intern/cycles/blender/addon/properties.py
===================================================================
--- trunk/blender/intern/cycles/blender/addon/properties.py	2013-06-18 09:02:13 UTC (rev 57541)
+++ trunk/blender/intern/cycles/blender/addon/properties.py	2013-06-18 09:36:00 UTC (rev 57542)
@@ -504,6 +504,12 @@
                             "objects that emit little light compared to other light sources",
                 default=True,
                 )
+        cls.use_transparent_shadow = BoolProperty(
+                name="Transparent Shadows",
+                description="Use transparent shadows for this material if it contains a Transparent BSDF"
+                            "disabling will render faster but not give accurate shadows",
+                default=True,
+                )
         cls.homogeneous_volume = BoolProperty(
                 name="Homogeneous Volume",
                 description="When using volume rendering, assume volume has the same density everywhere, "

Modified: trunk/blender/intern/cycles/blender/addon/ui.py
===================================================================
--- trunk/blender/intern/cycles/blender/addon/ui.py	2013-06-18 09:02:13 UTC (rev 57541)
+++ trunk/blender/intern/cycles/blender/addon/ui.py	2013-06-18 09:36:00 UTC (rev 57542)
@@ -919,6 +919,7 @@
 
         col = split.column()
         col.prop(mat, "pass_index")
+        col.prop(cmat, "use_transparent_shadow")
 
         layout.prop(cmat, "sample_as_light")
 

Modified: trunk/blender/intern/cycles/blender/blender_shader.cpp
===================================================================
--- trunk/blender/intern/cycles/blender/blender_shader.cpp	2013-06-18 09:02:13 UTC (rev 57541)
+++ trunk/blender/intern/cycles/blender/blender_shader.cpp	2013-06-18 09:36:00 UTC (rev 57542)
@@ -860,7 +860,8 @@
 
 			/* settings */
 			PointerRNA cmat = RNA_pointer_get(&b_mat->ptr, "cycles");
-			shader->sample_as_light = get_boolean(cmat, "sample_as_light");
+			shader->use_mis = get_boolean(cmat, "sample_as_light");
+			shader->use_transparent_shadow = get_boolean(cmat, "use_transparent_shadow");
 			shader->homogeneous_volume = get_boolean(cmat, "homogeneous_volume");
 
 			shader->set_graph(graph);

Modified: trunk/blender/intern/cycles/kernel/kernel_emission.h
===================================================================
--- trunk/blender/intern/cycles/kernel/kernel_emission.h	2013-06-18 09:02:13 UTC (rev 57541)
+++ trunk/blender/intern/cycles/kernel/kernel_emission.h	2013-06-18 09:36:00 UTC (rev 57542)
@@ -168,9 +168,9 @@
 	float3 L = shader_emissive_eval(kg, sd);
 
 #ifdef __HAIR__
-	if(!(path_flag & PATH_RAY_MIS_SKIP) && (sd->flag & SD_SAMPLE_AS_LIGHT) && (sd->segment == ~0)) {
+	if(!(path_flag & PATH_RAY_MIS_SKIP) && (sd->flag & SD_USE_MIS) && (sd->segment == ~0)) {
 #else
-	if(!(path_flag & PATH_RAY_MIS_SKIP) && (sd->flag & SD_SAMPLE_AS_LIGHT)) {
+	if(!(path_flag & PATH_RAY_MIS_SKIP) && (sd->flag & SD_USE_MIS)) {
 #endif
 		/* multiple importance sampling, get triangle light pdf,
 		 * and compute weight with respect to BSDF pdf */

Modified: trunk/blender/intern/cycles/kernel/kernel_shader.h
===================================================================
--- trunk/blender/intern/cycles/kernel/kernel_shader.h	2013-06-18 09:02:13 UTC (rev 57541)
+++ trunk/blender/intern/cycles/kernel/kernel_shader.h	2013-06-18 09:36:00 UTC (rev 57542)
@@ -891,7 +891,7 @@
 #endif
 	int flag = kernel_tex_fetch(__shader_flag, (shader & SHADER_MASK)*2);
 
-	return (flag & SD_HAS_SURFACE_TRANSPARENT) != 0;
+	return (flag & SD_HAS_TRANSPARENT_SHADOW) != 0;
 }
 #endif
 

Modified: trunk/blender/intern/cycles/kernel/kernel_types.h
===================================================================
--- trunk/blender/intern/cycles/kernel/kernel_types.h	2013-06-18 09:02:13 UTC (rev 57541)
+++ trunk/blender/intern/cycles/kernel/kernel_types.h	2013-06-18 09:36:00 UTC (rev 57542)
@@ -492,8 +492,8 @@
 	SD_CLOSURE_FLAGS = (SD_EMISSION|SD_BSDF|SD_BSDF_HAS_EVAL|SD_BSDF_GLOSSY|SD_BSSRDF|SD_HOLDOUT|SD_VOLUME|SD_AO),
 
 	/* shader flags */
-	SD_SAMPLE_AS_LIGHT = 512,			/* direct light sample */
-	SD_HAS_SURFACE_TRANSPARENT = 1024,	/* has surface transparency */
+	SD_USE_MIS = 512,					/* direct light sample */
+	SD_HAS_TRANSPARENT_SHADOW = 1024,	/* has transparent shadow */
 	SD_HAS_VOLUME = 2048,				/* has volume shader */
 	SD_HOMOGENEOUS_VOLUME = 4096,		/* has homogeneous volume */
 

Modified: trunk/blender/intern/cycles/render/light.cpp
===================================================================
--- trunk/blender/intern/cycles/render/light.cpp	2013-06-18 09:02:13 UTC (rev 57541)
+++ trunk/blender/intern/cycles/render/light.cpp	2013-06-18 09:36:00 UTC (rev 57542)
@@ -164,7 +164,7 @@
 		foreach(uint sindex, mesh->used_shaders) {
 			Shader *shader = scene->shaders[sindex];
 
-			if(shader->sample_as_light && shader->has_surface_emission) {
+			if(shader->use_mis && shader->has_surface_emission) {
 				have_emission = true;
 				break;
 			}
@@ -175,7 +175,7 @@
 			for(size_t i = 0; i < mesh->triangles.size(); i++) {
 				Shader *shader = scene->shaders[mesh->shader[i]];
 
-				if(shader->sample_as_light && shader->has_surface_emission)
+				if(shader->use_mis && shader->has_surface_emission)
 					num_triangles++;
 			}
 
@@ -184,7 +184,7 @@
 			foreach(Mesh::Curve& curve, mesh->curves) {
 				Shader *shader = scene->shaders[curve.shader];
 
-				if(shader->sample_as_light && shader->has_surface_emission)
+				if(shader->use_mis && shader->has_surface_emission)
 					num_curve_segments += curve.num_segments();
 #endif
 		}
@@ -215,7 +215,7 @@
 		foreach(uint sindex, mesh->used_shaders) {
 			Shader *shader = scene->shaders[sindex];
 
-			if(shader->sample_as_light && shader->has_surface_emission) {
+			if(shader->use_mis && shader->has_surface_emission) {
 				have_emission = true;
 				break;
 			}
@@ -247,7 +247,7 @@
 			for(size_t i = 0; i < mesh->triangles.size(); i++) {
 				Shader *shader = scene->shaders[mesh->shader[i]];
 
-				if(shader->sample_as_light && shader->has_surface_emission) {
+				if(shader->use_mis && shader->has_surface_emission) {
 					distribution[offset].x = totarea;
 					distribution[offset].y = __int_as_float(i + mesh->tri_offset);
 					distribution[offset].z = __int_as_float(shader_id);
@@ -277,7 +277,7 @@
 				Shader *shader = scene->shaders[curve.shader];
 				int first_key = curve.first_key;
 
-				if(shader->sample_as_light && shader->has_surface_emission) {
+				if(shader->use_mis && shader->has_surface_emission) {
 					for(int j = 0; j < curve.num_segments(); j++) {
 						distribution[offset].x = totarea;
 						distribution[offset].y = __int_as_float(i + mesh->curve_offset); // XXX fix kernel code

Modified: trunk/blender/intern/cycles/render/object.cpp
===================================================================
--- trunk/blender/intern/cycles/render/object.cpp	2013-06-18 09:02:13 UTC (rev 57541)
+++ trunk/blender/intern/cycles/render/object.cpp	2013-06-18 09:36:00 UTC (rev 57542)
@@ -127,7 +127,7 @@
 		foreach(uint sindex, mesh->used_shaders) {
 			Shader *shader = scene->shaders[sindex];
 
-			if(shader->sample_as_light && shader->has_surface_emission)
+			if(shader->use_mis && shader->has_surface_emission)
 				scene->light_manager->need_update = true;
 		}
 	}

Modified: trunk/blender/intern/cycles/render/osl.cpp
===================================================================
--- trunk/blender/intern/cycles/render/osl.cpp	2013-06-18 09:02:13 UTC (rev 57541)
+++ trunk/blender/intern/cycles/render/osl.cpp	2013-06-18 09:36:00 UTC (rev 57542)
@@ -100,7 +100,7 @@
 		compiler.background = (shader == scene->shaders[scene->default_background]);
 		compiler.compile(og, shader);
 
-		if(shader->sample_as_light && shader->has_surface_emission)
+		if(shader->use_mis && shader->has_surface_emission)
 			scene->light_manager->need_update = true;
 	}
 

Modified: trunk/blender/intern/cycles/render/shader.cpp
===================================================================
--- trunk/blender/intern/cycles/render/shader.cpp	2013-06-18 09:02:13 UTC (rev 57541)
+++ trunk/blender/intern/cycles/render/shader.cpp	2013-06-18 09:36:00 UTC (rev 57542)
@@ -42,7 +42,8 @@
 	graph = NULL;
 	graph_bump = NULL;
 
-	sample_as_light = true;
+	use_mis = true;
+	use_transparent_shadow = true;
 	homogeneous_volume = false;
 
 	has_surface = false;
@@ -88,7 +89,7 @@
 	/* if the shader previously was emissive, update light distribution,
 	 * if the new shader is emissive, a light manager update tag will be
 	 * done in the shader manager device update. */
-	if(sample_as_light && has_surface_emission)
+	if(use_mis && has_surface_emission)
 		scene->light_manager->need_update = true;
 
 	/* get requested attributes. this could be optimized by pruning unused
@@ -220,10 +221,10 @@
 	foreach(Shader *shader, scene->shaders) {
 		uint flag = 0;
 
-		if(shader->sample_as_light)
-			flag |= SD_SAMPLE_AS_LIGHT;
-		if(shader->has_surface_transparent)
-			flag |= SD_HAS_SURFACE_TRANSPARENT;
+		if(shader->use_mis)
+			flag |= SD_USE_MIS;
+		if(shader->has_surface_transparent && shader->use_transparent_shadow)
+			flag |= SD_HAS_TRANSPARENT_SHADOW;
 		if(shader->has_volume)
 			flag |= SD_HAS_VOLUME;
 		if(shader->homogeneous_volume)

Modified: trunk/blender/intern/cycles/render/shader.h
===================================================================
--- trunk/blender/intern/cycles/render/shader.h	2013-06-18 09:02:13 UTC (rev 57541)
+++ trunk/blender/intern/cycles/render/shader.h	2013-06-18 09:36:00 UTC (rev 57542)
@@ -62,7 +62,8 @@
 	ShaderGraph *graph_bump;
 
 	/* sampling */
-	bool sample_as_light;
+	bool use_mis;
+	bool use_transparent_shadow;
 	bool homogeneous_volume;
 
 	/* synchronization */

Modified: trunk/blender/intern/cycles/render/svm.cpp
===================================================================
--- trunk/blender/intern/cycles/render/svm.cpp	2013-06-18 09:02:13 UTC (rev 57541)
+++ trunk/blender/intern/cycles/render/svm.cpp	2013-06-18 09:36:00 UTC (rev 57542)
@@ -74,7 +74,7 @@
 
 		assert(shader->graph);
 
-		if(shader->sample_as_light && shader->has_surface_emission)
+		if(shader->use_mis && shader->has_surface_emission)
 			scene->light_manager->need_update = true;
 
 		SVMCompiler compiler(scene->shader_manager, scene->image_manager,




More information about the Bf-blender-cvs mailing list