Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'intern/cycles/kernel/svm/svm_tex_coord.h')
-rw-r--r--intern/cycles/kernel/svm/svm_tex_coord.h46
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: {