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:
authorBrecht Van Lommel <brechtvanlommel@pandora.be>2012-05-07 14:53:09 +0400
committerBrecht Van Lommel <brechtvanlommel@pandora.be>2012-05-07 14:53:09 +0400
commit022d12a721b04799423edf646b2a08bd48edfe6a (patch)
treed5eb7265e0a142708f8de1d05b6e4f4ec34e5604 /intern/cycles/kernel/svm/svm_tex_coord.h
parent69fc654f94cc16176248aeeef89dddd03ffebdc8 (diff)
Fix most of #31307: cycles panorama camera not working correct with speed
vectors and window texture coordinates. Only for Fisheye Equisolid it's still not working correct yet. Patch from Dalai with modifications.
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: {