Cycles: Support parallel convergence mode for spherical stereo

This commit is contained in:
Sergey Sharybin 2016-03-11 21:58:47 +05:00
parent 7d82de9e84
commit d652833a17
2 changed files with 13 additions and 3 deletions

@ -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();

@ -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);
}