diff options
author | Mai Lavelle <mai.lavelle@gmail.com> | 2016-09-03 04:37:17 +0300 |
---|---|---|
committer | Mai Lavelle <mai.lavelle@gmail.com> | 2016-09-11 20:49:05 +0300 |
commit | 013b46d6bda4388736d7953746d6b335ce495b16 (patch) | |
tree | 59f8974ed14e7cf3e01ea369590da326dd9a6ed0 /intern/cycles/kernel/svm | |
parent | 92a2c49aab55a2c459a8f6d50e730bdcda966eb5 (diff) |
Cycles: Replace object index hack with actual checks for SD_TRANSFORM_APPLIED
Using ones complement for detecting if transform has been applied was confusing
and led to several bugs. With this proper checks are made.
Also added a few transforms where they were missing, mostly affecting baking
and displacement when `P` is used in the shader (previously `P` was in the
wrong space for these shaders)
Also removed `TIME_INVALID` as this may have resulted in incorrect
transforms in some cases.
Reviewed By: brecht
Differential Revision: https://developer.blender.org/D2192
Diffstat (limited to 'intern/cycles/kernel/svm')
-rw-r--r-- | intern/cycles/kernel/svm/svm.h | 2 | ||||
-rw-r--r-- | intern/cycles/kernel/svm/svm_displace.h | 12 |
2 files changed, 11 insertions, 3 deletions
diff --git a/intern/cycles/kernel/svm/svm.h b/intern/cycles/kernel/svm/svm.h index 9ca8917d327..88ec7fe6fcc 100644 --- a/intern/cycles/kernel/svm/svm.h +++ b/intern/cycles/kernel/svm/svm.h @@ -261,7 +261,7 @@ ccl_device_noinline void svm_eval_nodes(KernelGlobals *kg, ShaderData *sd, ccl_a svm_node_geometry_bump_dy(kg, sd, stack, node.y, node.z); break; case NODE_SET_DISPLACEMENT: - svm_node_set_displacement(sd, stack, node.y); + svm_node_set_displacement(kg, sd, stack, node.y); break; # endif /* NODES_FEATURE(NODE_FEATURE_BUMP) */ # ifdef __TEXTURES__ diff --git a/intern/cycles/kernel/svm/svm_displace.h b/intern/cycles/kernel/svm/svm_displace.h index 12a6f9a7d18..890ab41aaaa 100644 --- a/intern/cycles/kernel/svm/svm_displace.h +++ b/intern/cycles/kernel/svm/svm_displace.h @@ -76,10 +76,18 @@ ccl_device void svm_node_set_bump(KernelGlobals *kg, ShaderData *sd, float *stac /* Displacement Node */ -ccl_device void svm_node_set_displacement(ShaderData *sd, float *stack, uint fac_offset) +ccl_device void svm_node_set_displacement(KernelGlobals *kg, ShaderData *sd, float *stack, uint fac_offset) { float d = stack_load_float(stack, fac_offset); - ccl_fetch(sd, P) += ccl_fetch(sd, N)*d*0.1f; /* todo: get rid of this factor */ + + float3 dP = ccl_fetch(sd, N); + object_inverse_normal_transform(kg, sd, &dP); + + dP *= d*0.1f; /* todo: get rid of this factor */ + + object_dir_transform(kg, sd, &dP); + + ccl_fetch(sd, P) += dP; } CCL_NAMESPACE_END |