[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [46179] trunk/blender/intern/cycles: Fix #31168: cycles mask layer should only affect objects for camera rays.

Brecht Van Lommel brechtvanlommel at pandora.be
Wed May 2 11:33:45 CEST 2012


Revision: 46179
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=46179
Author:   blendix
Date:     2012-05-02 09:33:45 +0000 (Wed, 02 May 2012)
Log Message:
-----------
Fix #31168: cycles mask layer should only affect objects for camera rays.
Fix: texture coordinate normal output was not correct, still changed under
object transform.

Modified Paths:
--------------
    trunk/blender/intern/cycles/blender/blender_mesh.cpp
    trunk/blender/intern/cycles/blender/blender_object.cpp
    trunk/blender/intern/cycles/blender/blender_sync.h
    trunk/blender/intern/cycles/kernel/kernel_camera.h
    trunk/blender/intern/cycles/kernel/kernel_object.h
    trunk/blender/intern/cycles/kernel/kernel_path.h
    trunk/blender/intern/cycles/kernel/kernel_shader.h
    trunk/blender/intern/cycles/kernel/kernel_textures.h
    trunk/blender/intern/cycles/kernel/kernel_types.h
    trunk/blender/intern/cycles/kernel/svm/svm_tex_coord.h
    trunk/blender/intern/cycles/render/camera.cpp
    trunk/blender/intern/cycles/render/object.cpp
    trunk/blender/intern/cycles/render/object.h
    trunk/blender/intern/cycles/render/scene.h
    trunk/blender/intern/cycles/util/util_math.h
    trunk/blender/intern/cycles/util/util_transform.h

Modified: trunk/blender/intern/cycles/blender/blender_mesh.cpp
===================================================================
--- trunk/blender/intern/cycles/blender/blender_mesh.cpp	2012-05-02 09:03:15 UTC (rev 46178)
+++ trunk/blender/intern/cycles/blender/blender_mesh.cpp	2012-05-02 09:33:45 UTC (rev 46179)
@@ -198,11 +198,11 @@
 
 /* Sync */
 
-Mesh *BlenderSync::sync_mesh(BL::Object b_ob, bool holdout, bool object_updated)
+Mesh *BlenderSync::sync_mesh(BL::Object b_ob, bool object_updated)
 {
 	/* test if we can instance or if the object is modified */
 	BL::ID b_ob_data = b_ob.data();
-	BL::ID key = (object_is_modified(b_ob) || holdout)? b_ob: b_ob_data;
+	BL::ID key = (object_is_modified(b_ob))? b_ob: b_ob_data;
 	BL::Material material_override = render_layer.material_override;
 
 	/* find shader indices */
@@ -212,18 +212,14 @@
 	for(b_ob.material_slots.begin(slot); slot != b_ob.material_slots.end(); ++slot) {
 		BL::Material material_override = render_layer.material_override;
 
-		if(holdout)
-			find_shader(PointerRNA_NULL, used_shaders, scene->default_holdout);
-		else if(material_override)
+		if(material_override)
 			find_shader(material_override, used_shaders, scene->default_surface);
 		else
 			find_shader(slot->material(), used_shaders, scene->default_surface);
 	}
 
 	if(used_shaders.size() == 0) {
-		if(holdout)
-			used_shaders.push_back(scene->default_holdout);
-		else if(material_override)
+		if(material_override)
 			find_shader(material_override, used_shaders, scene->default_surface);
 		else
 			used_shaders.push_back(scene->default_surface);

Modified: trunk/blender/intern/cycles/blender/blender_object.cpp
===================================================================
--- trunk/blender/intern/cycles/blender/blender_object.cpp	2012-05-02 09:03:15 UTC (rev 46178)
+++ trunk/blender/intern/cycles/blender/blender_object.cpp	2012-05-02 09:33:45 UTC (rev 46179)
@@ -232,12 +232,16 @@
 	if(object_map.sync(&object, b_ob, b_parent, key))
 		object_updated = true;
 	
-	/* holdout? */
-	bool holdout = (layer_flag & render_layer.holdout_layer) != 0;
-
+	bool use_holdout = (layer_flag & render_layer.holdout_layer) != 0;
+	
 	/* mesh sync */
-	object->mesh = sync_mesh(b_ob, holdout, object_updated);
+	object->mesh = sync_mesh(b_ob, object_updated);
 
+	if(use_holdout != object->use_holdout) {
+		object->use_holdout = use_holdout;
+		scene->object_manager->tag_update(scene);
+	}
+
 	/* object sync */
 	if(object_updated || (object->mesh && object->mesh->need_update)) {
 		object->name = b_ob.name().c_str();

Modified: trunk/blender/intern/cycles/blender/blender_sync.h
===================================================================
--- trunk/blender/intern/cycles/blender/blender_sync.h	2012-05-02 09:03:15 UTC (rev 46178)
+++ trunk/blender/intern/cycles/blender/blender_sync.h	2012-05-02 09:33:45 UTC (rev 46179)
@@ -79,7 +79,7 @@
 	void sync_shaders();
 
 	void sync_nodes(Shader *shader, BL::ShaderNodeTree b_ntree);
-	Mesh *sync_mesh(BL::Object b_ob, bool holdout, bool object_updated);
+	Mesh *sync_mesh(BL::Object b_ob, bool object_updated);
 	void sync_object(BL::Object b_parent, int b_index, BL::Object b_object, Transform& tfm, uint layer_flag, int motion);
 	void sync_light(BL::Object b_parent, int b_index, BL::Object b_ob, Transform& tfm);
 	void sync_background_light();

Modified: trunk/blender/intern/cycles/kernel/kernel_camera.h
===================================================================
--- trunk/blender/intern/cycles/kernel/kernel_camera.h	2012-05-02 09:03:15 UTC (rev 46178)
+++ trunk/blender/intern/cycles/kernel/kernel_camera.h	2012-05-02 09:33:45 UTC (rev 46179)
@@ -64,7 +64,7 @@
 	Transform cameratoworld = kernel_data.cam.cameratoworld;
 
 #ifdef __MOTION__
-	if(ray->time != TIME_INVALID)
+	if(kernel_data.cam.have_motion)
 		transform_motion_interpolate(&cameratoworld, &kernel_data.cam.motion, ray->time);
 #endif
 
@@ -107,7 +107,7 @@
 	Transform cameratoworld = kernel_data.cam.cameratoworld;
 
 #ifdef __MOTION__
-	if(ray->time != TIME_INVALID)
+	if(kernel_data.cam.have_motion)
 		transform_motion_interpolate(&cameratoworld, &kernel_data.cam.motion, ray->time);
 #endif
 
@@ -147,7 +147,7 @@
 	Transform cameratoworld = kernel_data.cam.cameratoworld;
 
 #ifdef __MOTION__
-	if(ray->time != TIME_INVALID)
+	if(kernel_data.cam.have_motion)
 		transform_motion_interpolate(&cameratoworld, &kernel_data.cam.motion, ray->time);
 #endif
 

Modified: trunk/blender/intern/cycles/kernel/kernel_object.h
===================================================================
--- trunk/blender/intern/cycles/kernel/kernel_object.h	2012-05-02 09:03:15 UTC (rev 46178)
+++ trunk/blender/intern/cycles/kernel/kernel_object.h	2012-05-02 09:33:45 UTC (rev 46179)
@@ -32,34 +32,28 @@
 
 #ifdef __MOTION__
 	/* if we do motion blur */
-	if(time != TIME_INVALID) {
-		int offset = object*OBJECT_SIZE + (int)OBJECT_TRANSFORM_MOTION_PRE;
-		float4 have_motion = kernel_tex_fetch(__objects, offset + 0);
+	if(sd->flag & SD_OBJECT_MOTION) {
+		/* fetch motion transforms */
+		MotionTransform motion;
 
-		/* if this object have motion */
-		if(have_motion.x != FLT_MAX) {
-			/* fetch motion transforms */
-			MotionTransform motion;
+		motion.pre.x = have_motion;
+		motion.pre.y = kernel_tex_fetch(__objects, offset + 1);
+		motion.pre.z = kernel_tex_fetch(__objects, offset + 2);
+		motion.pre.w = kernel_tex_fetch(__objects, offset + 3);
 
-			motion.pre.x = have_motion;
-			motion.pre.y = kernel_tex_fetch(__objects, offset + 1);
-			motion.pre.z = kernel_tex_fetch(__objects, offset + 2);
-			motion.pre.w = kernel_tex_fetch(__objects, offset + 3);
+		motion.post.x = kernel_tex_fetch(__objects, offset + 4);
+		motion.post.y = kernel_tex_fetch(__objects, offset + 5);
+		motion.post.z = kernel_tex_fetch(__objects, offset + 6);
+		motion.post.w = kernel_tex_fetch(__objects, offset + 7);
 
-			motion.post.x = kernel_tex_fetch(__objects, offset + 4);
-			motion.post.y = kernel_tex_fetch(__objects, offset + 5);
-			motion.post.z = kernel_tex_fetch(__objects, offset + 6);
-			motion.post.w = kernel_tex_fetch(__objects, offset + 7);
+		/* interpolate (todo: do only once per object) */
+		transform_motion_interpolate(&tfm, &motion, time);
 
-			/* interpolate (todo: do only once per object) */
-			transform_motion_interpolate(&tfm, &motion, time);
+		/* invert */
+		if(type == OBJECT_INVERSE_TRANSFORM)
+			tfm = transform_quick_inverse(tfm);
 
-			/* invert */
-			if(type == OBJECT_INVERSE_TRANSFORM)
-				tfm = transform_quick_inverse(tfm);
-
-			return tfm;
-		}
+		return tfm;
 	}
 #endif
 
@@ -83,6 +77,16 @@
 #endif
 }
 
+__device_inline void object_inverse_normal_transform(KernelGlobals *kg, ShaderData *sd, float3 *N)
+{
+#ifdef __MOTION__
+	*N = normalize(transform_direction_transposed(&sd->ob_tfm, *N));
+#else
+	Transform tfm = object_fetch_transform(kg, sd->object, TIME_INVALID, OBJECT_TRANSFORM);
+	*N = normalize(transform_direction_transposed(&tfm, *N));
+#endif
+}
+
 __device_inline void object_normal_transform(KernelGlobals *kg, ShaderData *sd, float3 *N)
 {
 #ifdef __MOTION__

Modified: trunk/blender/intern/cycles/kernel/kernel_path.h
===================================================================
--- trunk/blender/intern/cycles/kernel/kernel_path.h	2012-05-02 09:03:15 UTC (rev 46178)
+++ trunk/blender/intern/cycles/kernel/kernel_path.h	2012-05-02 09:33:45 UTC (rev 46179)
@@ -277,12 +277,21 @@
 
 		/* holdout */
 #ifdef __HOLDOUT__
-		if((sd.flag & SD_HOLDOUT) && (state.flag & PATH_RAY_CAMERA)) {
-			float3 holdout_weight = shader_holdout_eval(kg, &sd);
+		if((sd.flag & (SD_HOLDOUT|SD_HOLDOUT_MASK)) && (state.flag & PATH_RAY_CAMERA)) {
+			if(kernel_data.background.transparent) {
+				float3 holdout_weight;
+				
+				if(sd.flag & SD_HOLDOUT_MASK)
+					holdout_weight = make_float3(1.0f, 1.0f, 1.0f);
+				else
+					shader_holdout_eval(kg, &sd);
 
-			if(kernel_data.background.transparent)
 				/* any throughput is ok, should all be identical here */
 				L_transparent += average(holdout_weight*throughput);
+			}
+
+			if(sd.flag & SD_HOLDOUT_MASK)
+				break;
 		}
 #endif
 

Modified: trunk/blender/intern/cycles/kernel/kernel_shader.h
===================================================================
--- trunk/blender/intern/cycles/kernel/kernel_shader.h	2012-05-02 09:03:15 UTC (rev 46178)
+++ trunk/blender/intern/cycles/kernel/kernel_shader.h	2012-05-02 09:33:45 UTC (rev 46179)
@@ -83,6 +83,7 @@
 		sd->N = triangle_smooth_normal(kg, sd->prim, sd->u, sd->v);
 
 	sd->flag = kernel_tex_fetch(__shader_flag, (sd->shader & SHADER_MASK)*2);
+	sd->flag |= kernel_tex_fetch(__object_flag, sd->object);
 
 #ifdef __DPDU__
 	/* dPdu/dPdv */
@@ -177,6 +178,7 @@
 	}
 
 	sd->flag = kernel_tex_fetch(__shader_flag, (sd->shader & SHADER_MASK)*2);
+	sd->flag |= kernel_tex_fetch(__object_flag, sd->object);
 
 #ifdef __DPDU__
 	/* dPdu/dPdv */

Modified: trunk/blender/intern/cycles/kernel/kernel_textures.h
===================================================================
--- trunk/blender/intern/cycles/kernel/kernel_textures.h	2012-05-02 09:03:15 UTC (rev 46178)
+++ trunk/blender/intern/cycles/kernel/kernel_textures.h	2012-05-02 09:33:45 UTC (rev 46179)
@@ -39,6 +39,7 @@
 /* shaders */
 KERNEL_TEX(uint4, texture_uint4, __svm_nodes)
 KERNEL_TEX(uint, texture_uint, __shader_flag)
+KERNEL_TEX(uint, texture_uint, __object_flag)
 
 /* camera/film */
 KERNEL_TEX(float, texture_float, __filter_table)

Modified: trunk/blender/intern/cycles/kernel/kernel_types.h
===================================================================
--- trunk/blender/intern/cycles/kernel/kernel_types.h	2012-05-02 09:03:15 UTC (rev 46178)
+++ trunk/blender/intern/cycles/kernel/kernel_types.h	2012-05-02 09:33:45 UTC (rev 46179)
@@ -38,7 +38,7 @@
 /* device capabilities */
 #ifdef __KERNEL_CPU__
 #define __KERNEL_SHADING__
-#define __KERNEL_ADV_SHADING__
+//#define __KERNEL_ADV_SHADING__
 #endif
 
 #ifdef __KERNEL_CUDA__
@@ -370,7 +370,11 @@
 	SD_SAMPLE_AS_LIGHT = 128,			/* direct light sample */
 	SD_HAS_SURFACE_TRANSPARENT = 256,	/* has surface transparency */
 	SD_HAS_VOLUME = 512,				/* has volume shader */
-	SD_HOMOGENEOUS_VOLUME = 1024		/* has homogeneous volume */
+	SD_HOMOGENEOUS_VOLUME = 1024,		/* has homogeneous volume */
+
+	/* object flags */
+	SD_HOLDOUT_MASK = 2048,				/* holdout for camera rays */
+	SD_OBJECT_MOTION = 4096				/* has object motion blur */
 };
 
 typedef struct ShaderData {
@@ -463,7 +467,7 @@
 
 	/* motion blur */
 	float shuttertime;

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list