diff options
author | Brecht Van Lommel <brechtvanlommel@pandora.be> | 2012-05-09 03:39:31 +0400 |
---|---|---|
committer | Brecht Van Lommel <brechtvanlommel@pandora.be> | 2012-05-09 03:39:31 +0400 |
commit | c8cbe63947f6ba05584b5dc6d298dd7301e5dbc0 (patch) | |
tree | 6a030c8fb79c0908dc4d94fe3e3cdd5b819faefa /intern | |
parent | f33080532cbefe3837a5dec0613b1fd803ac072e (diff) |
Cycles: fix issues with texture coordinates and object scale. Auto texture
space size and location were outdated often, and already computed on demand
by blender internal, now do that through RNA as well.
Diffstat (limited to 'intern')
-rw-r--r-- | intern/cycles/kernel/kernel_light.h | 2 | ||||
-rw-r--r-- | intern/cycles/kernel/kernel_object.h | 10 | ||||
-rw-r--r-- | intern/cycles/kernel/svm/svm_tex_coord.h | 6 |
3 files changed, 14 insertions, 4 deletions
diff --git a/intern/cycles/kernel/kernel_light.h b/intern/cycles/kernel/kernel_light.h index c2cf293cab3..cd9557bd0bf 100644 --- a/intern/cycles/kernel/kernel_light.h +++ b/intern/cycles/kernel/kernel_light.h @@ -268,7 +268,7 @@ __device void triangle_light_sample(KernelGlobals *kg, int prim, int object, Transform itfm = object_fetch_transform(kg, ls->object, time, OBJECT_INVERSE_TRANSFORM); ls->P = transform_point(&tfm, ls->P); - ls->Ng = transform_direction_transposed(&itfm, ls->Ng); + ls->Ng = normalize(transform_direction_transposed(&itfm, ls->Ng)); } #endif } diff --git a/intern/cycles/kernel/kernel_object.h b/intern/cycles/kernel/kernel_object.h index 4a3ef55e8cb..abe427d8345 100644 --- a/intern/cycles/kernel/kernel_object.h +++ b/intern/cycles/kernel/kernel_object.h @@ -77,6 +77,16 @@ __device_inline void object_position_transform(KernelGlobals *kg, ShaderData *sd #endif } +__device_inline void object_inverse_position_transform(KernelGlobals *kg, ShaderData *sd, float3 *P) +{ +#ifdef __MOTION__ + *P = transform_point(&sd->ob_itfm, *P); +#else + Transform tfm = object_fetch_transform(kg, sd->object, TIME_INVALID, OBJECT_INVERSE_TRANSFORM); + *P = transform_point(&tfm, *P); +#endif +} + __device_inline void object_inverse_normal_transform(KernelGlobals *kg, ShaderData *sd, float3 *N) { #ifdef __MOTION__ diff --git a/intern/cycles/kernel/svm/svm_tex_coord.h b/intern/cycles/kernel/svm/svm_tex_coord.h index 169307574a2..aa924bcc38b 100644 --- a/intern/cycles/kernel/svm/svm_tex_coord.h +++ b/intern/cycles/kernel/svm/svm_tex_coord.h @@ -57,7 +57,7 @@ __device void svm_node_tex_coord(KernelGlobals *kg, ShaderData *sd, float *stack case NODE_TEXCO_OBJECT: { if(sd->object != ~0) { data = sd->P; - object_position_transform(kg, sd, &data); + object_inverse_position_transform(kg, sd, &data); } else data = sd->P; @@ -106,7 +106,7 @@ __device void svm_node_tex_coord_bump_dx(KernelGlobals *kg, ShaderData *sd, floa case NODE_TEXCO_OBJECT: { if(sd->object != ~0) { data = sd->P + sd->dP.dx; - object_position_transform(kg, sd, &data); + object_inverse_position_transform(kg, sd, &data); } else data = sd->P + sd->dP.dx; @@ -158,7 +158,7 @@ __device void svm_node_tex_coord_bump_dy(KernelGlobals *kg, ShaderData *sd, floa case NODE_TEXCO_OBJECT: { if(sd->object != ~0) { data = sd->P + sd->dP.dy; - object_position_transform(kg, sd, &data); + object_inverse_position_transform(kg, sd, &data); } else data = sd->P + sd->dP.dy; |