From d652833a1767500653fcfea5e83ad4e31a0a1c14 Mon Sep 17 00:00:00 2001 From: Sergey Sharybin Date: Fri, 11 Mar 2016 21:58:47 +0500 Subject: Cycles: Support parallel convergence mode for spherical stereo --- intern/cycles/blender/blender_camera.cpp | 7 ++++++- intern/cycles/kernel/kernel_projection.h | 9 +++++++-- 2 files changed, 13 insertions(+), 3 deletions(-) diff --git a/intern/cycles/blender/blender_camera.cpp b/intern/cycles/blender/blender_camera.cpp index 2a7c1d3d943..5bc9dfc7904 100644 --- a/intern/cycles/blender/blender_camera.cpp +++ b/intern/cycles/blender/blender_camera.cpp @@ -175,7 +175,12 @@ static void blender_camera_from_object(BlenderCamera *bcam, bcam->longitude_max = RNA_float_get(&ccamera, "longitude_max"); bcam->interocular_distance = b_camera.stereo().interocular_distance(); - bcam->convergence_distance = b_camera.stereo().convergence_distance(); + if(b_camera.stereo().convergence_mode() == BL::CameraStereoData::convergence_mode_PARALLEL) { + bcam->convergence_distance = FLT_MAX; + } + else { + bcam->convergence_distance = b_camera.stereo().convergence_distance(); + } bcam->use_spherical_stereo = b_engine.use_spherical_stereo(b_ob); bcam->ortho_scale = b_camera.ortho_scale(); diff --git a/intern/cycles/kernel/kernel_projection.h b/intern/cycles/kernel/kernel_projection.h index e561cfaebe0..d042acc76b3 100644 --- a/intern/cycles/kernel/kernel_projection.h +++ b/intern/cycles/kernel/kernel_projection.h @@ -247,15 +247,20 @@ ccl_device float3 spherical_stereo_direction(KernelGlobals *kg, float3 pos, float3 newpos) { + const float convergence_distance = kernel_data.cam.convergence_distance; const float3 normalized_dir = normalize(dir); /* Interocular offset of zero means either no stereo, or stereo without * spherical stereo. + * Convergence distance is FLT_MAX in the case of parallel convergence mode, + * no need to mdify direction in this case either. */ - if(kernel_data.cam.interocular_offset == 0.0f) { + if(kernel_data.cam.interocular_offset == 0.0f || + convergence_distance == FLT_MAX) + { return normalized_dir; } - float3 screenpos = pos + (normalized_dir * kernel_data.cam.convergence_distance); + float3 screenpos = pos + (normalized_dir * convergence_distance); return normalize(screenpos - newpos); } -- cgit v1.2.3