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/kernel_projection.h')
-rw-r--r--intern/cycles/kernel/kernel_projection.h17
1 files changed, 16 insertions, 1 deletions
diff --git a/intern/cycles/kernel/kernel_projection.h b/intern/cycles/kernel/kernel_projection.h
index c1a359e9269..8be6742699a 100644
--- a/intern/cycles/kernel/kernel_projection.h
+++ b/intern/cycles/kernel/kernel_projection.h
@@ -225,7 +225,7 @@ ccl_device float3 spherical_stereo_position(KernelGlobals *kg,
float3 dir,
float3 pos)
{
- const float interocular_offset = kernel_data.cam.interocular_offset;
+ float interocular_offset = kernel_data.cam.interocular_offset;
/* Interocular offset of zero means either non stereo, or stereo without
* spherical stereo.
@@ -234,6 +234,21 @@ ccl_device float3 spherical_stereo_position(KernelGlobals *kg,
return pos;
}
+ if(kernel_data.cam.pole_merge_angle_to > 0.0f) {
+ float3 normalized_direction = normalize(dir);
+ const float pole_merge_angle_from = kernel_data.cam.pole_merge_angle_from,
+ pole_merge_angle_to = kernel_data.cam.pole_merge_angle_to;
+ float altitude = fabsf(safe_asinf(normalized_direction.z));
+ if(altitude > pole_merge_angle_to) {
+ interocular_offset = 0.0f;
+ }
+ else if(altitude > pole_merge_angle_from) {
+ float fac = (altitude - pole_merge_angle_from) / (pole_merge_angle_to - pole_merge_angle_from);
+ float fade = cosf(fac * M_PI_2_F);
+ interocular_offset *= fade;
+ }
+ }
+
float3 up = make_float3(0.0f, 0.0f, 1.0f);
float3 side = normalize(cross(dir, up));