[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