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-03-11 19:58:47 +0300
committerSergey Sharybin <sergey.vfx@gmail.com>2016-03-12 13:01:20 +0300
commitd652833a1767500653fcfea5e83ad4e31a0a1c14 (patch)
tree72b2a57b698c29a747ad4f0f69fd220e5c39ccb9
parent7d82de9e849e66e0e3f85445beb61fae1eecbcce (diff)
Cycles: Support parallel convergence mode for spherical stereo
-rw-r--r--intern/cycles/blender/blender_camera.cpp7
-rw-r--r--intern/cycles/kernel/kernel_projection.h9
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);
}