diff options
author | Thomas Dinges <blender@dingto.org> | 2013-07-02 03:17:24 +0400 |
---|---|---|
committer | Thomas Dinges <blender@dingto.org> | 2013-07-02 03:17:24 +0400 |
commit | 3a6e382d4aef6ad4bcba8a482d6d5fb5f96a6618 (patch) | |
tree | 649cf61ca52a5b493652be68a3256922e96a0ddb /intern/cycles/kernel | |
parent | 7f1005cd6a97f9ae44ee2b2243da66b91bffb7a1 (diff) |
Cycles / Vector Transform Node:
* After some more thinking, solved the remaining ToDos. :)
* Added is_object check to check if we have a valid object.
* If we operate on the world, and try to convert from/to object space, we now assume world space instead, same as OSL.
Diffstat (limited to 'intern/cycles/kernel')
-rw-r--r-- | intern/cycles/kernel/svm/svm_vector_transform.h | 12 |
1 files changed, 4 insertions, 8 deletions
diff --git a/intern/cycles/kernel/svm/svm_vector_transform.h b/intern/cycles/kernel/svm/svm_vector_transform.h index aa2c30a4831..8b5369ab626 100644 --- a/intern/cycles/kernel/svm/svm_vector_transform.h +++ b/intern/cycles/kernel/svm/svm_vector_transform.h @@ -18,11 +18,6 @@ CCL_NAMESPACE_BEGIN -/* ToDo -* if (object != ~0) null check? -* differs from OSL when used for the world -*/ - /* Vector Transform */ __device void svm_node_vector_transform(KernelGlobals *kg, ShaderData *sd, float *stack, uint4 node) @@ -40,6 +35,7 @@ __device void svm_node_vector_transform(KernelGlobals *kg, ShaderData *sd, float NodeVectorTransformConvertTo to = (NodeVectorTransformConvertTo)ito; Transform tfm; + int is_object = (sd->object != ~0); /* From world */ if(from == NODE_VECTOR_TRANSFORM_CONVERT_FROM_WORLD) { @@ -50,7 +46,7 @@ __device void svm_node_vector_transform(KernelGlobals *kg, ShaderData *sd, float else in = transform_point(&tfm, in); } - else if (to == NODE_VECTOR_TRANSFORM_CONVERT_TO_OBJECT) { + else if (to == NODE_VECTOR_TRANSFORM_CONVERT_TO_OBJECT && is_object) { if(type == NODE_VECTOR_TRANSFORM_TYPE_VECTOR) object_inverse_dir_transform(kg, sd, &in); else @@ -67,7 +63,7 @@ __device void svm_node_vector_transform(KernelGlobals *kg, ShaderData *sd, float else in = transform_point(&tfm, in); } - if(to == NODE_VECTOR_TRANSFORM_CONVERT_TO_OBJECT) { + if(to == NODE_VECTOR_TRANSFORM_CONVERT_TO_OBJECT && is_object) { if(type == NODE_VECTOR_TRANSFORM_TYPE_VECTOR) object_inverse_dir_transform(kg, sd, &in); else @@ -77,7 +73,7 @@ __device void svm_node_vector_transform(KernelGlobals *kg, ShaderData *sd, float /* From object */ else if(from == NODE_VECTOR_TRANSFORM_CONVERT_FROM_OBJECT) { - if(to == NODE_VECTOR_TRANSFORM_CONVERT_TO_WORLD || to == NODE_VECTOR_TRANSFORM_CONVERT_TO_CAMERA) { + if((to == NODE_VECTOR_TRANSFORM_CONVERT_TO_WORLD || to == NODE_VECTOR_TRANSFORM_CONVERT_TO_CAMERA) && is_object) { if(type == NODE_VECTOR_TRANSFORM_TYPE_VECTOR) object_dir_transform(kg, sd, &in); else |