From cbe7f9dd03634a29082f51d05a2b1b71c6fc6aef Mon Sep 17 00:00:00 2001 From: Sergey Sharybin Date: Tue, 17 May 2016 14:12:29 +0200 Subject: Cycles: Pole merging for spherical stereo The idea of pole merge is to fade interocular distance after a certain altitude to zero when altitude goes closer to a pole. This should prevent annoyances looking up in the sky or down to the bottom. Works for both panorama and perspective cameras when Spherical Stereo is enabled. Reviewers: dfelinto, brecht Reviewed By: brecht Subscribers: sebastian_k Differential Revision: https://developer.blender.org/D1998 --- intern/cycles/kernel/kernel_projection.h | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) (limited to 'intern/cycles/kernel/kernel_projection.h') 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)); -- cgit v1.2.3