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:
authorSergey Sharybin <sergey.vfx@gmail.com>2016-05-17 15:12:29 +0300
committerSergey Sharybin <sergey.vfx@gmail.com>2016-05-18 11:56:57 +0300
commitcbe7f9dd03634a29082f51d05a2b1b71c6fc6aef (patch)
treec078fa28ca7fd0484076e4d7bd0a61924ee7d248 /intern/cycles/kernel/kernel_projection.h
parent7b356a856540a1affa5dc85360183418e6337a5a (diff)
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
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));