diff options
Diffstat (limited to 'intern/cycles/kernel/svm/svm_tex_coord.h')
-rw-r--r-- | intern/cycles/kernel/svm/svm_tex_coord.h | 46 |
1 files changed, 27 insertions, 19 deletions
diff --git a/intern/cycles/kernel/svm/svm_tex_coord.h b/intern/cycles/kernel/svm/svm_tex_coord.h index 3b73cac5430..169307574a2 100644 --- a/intern/cycles/kernel/svm/svm_tex_coord.h +++ b/intern/cycles/kernel/svm/svm_tex_coord.h @@ -20,12 +20,35 @@ CCL_NAMESPACE_BEGIN /* Texture Coordinate Node */ -__device float3 svm_background_offset(KernelGlobals *kg) +__device_inline float3 svm_background_offset(KernelGlobals *kg) { Transform cameratoworld = kernel_data.cam.cameratoworld; return make_float3(cameratoworld.x.w, cameratoworld.y.w, cameratoworld.z.w); } +__device_inline float3 svm_world_to_ndc(KernelGlobals *kg, ShaderData *sd, float3 P) +{ + if(kernel_data.cam.type != CAMERA_PANORAMA) { + if(sd->object != ~0) + P += svm_background_offset(kg); + + Transform tfm = kernel_data.cam.worldtondc; + return transform_perspective(&tfm, P); + } + else { + Transform tfm = kernel_data.cam.worldtocamera; + + if(sd->object != ~0) + P = normalize(transform_point(&tfm, P)); + else + P = normalize(transform_direction(&tfm, P)); + + float2 uv = direction_to_panorama(kg, P);; + + return make_float3(uv.x, uv.y, 0.0f); + } +} + __device void svm_node_tex_coord(KernelGlobals *kg, ShaderData *sd, float *stack, uint type, uint out_offset) { float3 data; @@ -59,12 +82,7 @@ __device void svm_node_tex_coord(KernelGlobals *kg, ShaderData *sd, float *stack break; } case NODE_TEXCO_WINDOW: { - Transform tfm = kernel_data.cam.worldtondc; - - if(sd->object != ~0) - data = transform_perspective(&tfm, sd->P); - else - data = transform_perspective(&tfm, sd->P + svm_background_offset(kg)); + data = svm_world_to_ndc(kg, sd, sd->P); break; } case NODE_TEXCO_REFLECTION: { @@ -113,12 +131,7 @@ __device void svm_node_tex_coord_bump_dx(KernelGlobals *kg, ShaderData *sd, floa break; } case NODE_TEXCO_WINDOW: { - Transform tfm = kernel_data.cam.worldtondc; - - if(sd->object != ~0) - data = transform_perspective(&tfm, sd->P + sd->dP.dx); - else - data = transform_perspective(&tfm, sd->P + sd->dP.dx + svm_background_offset(kg)); + data = svm_world_to_ndc(kg, sd, sd->P + sd->dP.dx); break; } case NODE_TEXCO_REFLECTION: { @@ -170,12 +183,7 @@ __device void svm_node_tex_coord_bump_dy(KernelGlobals *kg, ShaderData *sd, floa break; } case NODE_TEXCO_WINDOW: { - Transform tfm = kernel_data.cam.worldtondc; - - if(sd->object != ~0) - data = transform_perspective(&tfm, sd->P + sd->dP.dy); - else - data = transform_perspective(&tfm, sd->P + sd->dP.dy + svm_background_offset(kg)); + data = svm_world_to_ndc(kg, sd, sd->P + sd->dP.dy); break; } case NODE_TEXCO_REFLECTION: { |