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
path: root/intern
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
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')
-rw-r--r--intern/cycles/blender/blender_camera.cpp11
-rw-r--r--intern/cycles/kernel/kernel_projection.h17
-rw-r--r--intern/cycles/kernel/kernel_types.h3
-rw-r--r--intern/cycles/render/camera.cpp11
-rw-r--r--intern/cycles/render/camera.h3
5 files changed, 43 insertions, 2 deletions
diff --git a/intern/cycles/blender/blender_camera.cpp b/intern/cycles/blender/blender_camera.cpp
index 6b459ae575f..9dec489ce33 100644
--- a/intern/cycles/blender/blender_camera.cpp
+++ b/intern/cycles/blender/blender_camera.cpp
@@ -65,6 +65,9 @@ struct BlenderCamera {
bool use_spherical_stereo;
float interocular_distance;
float convergence_distance;
+ bool use_pole_merge;
+ float pole_merge_angle_from;
+ float pole_merge_angle_to;
enum { AUTO, HORIZONTAL, VERTICAL } sensor_fit;
float sensor_width;
@@ -183,6 +186,10 @@ static void blender_camera_from_object(BlenderCamera *bcam,
}
bcam->use_spherical_stereo = b_engine.use_spherical_stereo(b_ob);
+ bcam->use_pole_merge = b_camera.stereo().use_pole_merge();
+ bcam->pole_merge_angle_from = b_camera.stereo().pole_merge_angle_from();
+ bcam->pole_merge_angle_to = b_camera.stereo().pole_merge_angle_to();
+
bcam->ortho_scale = b_camera.ortho_scale();
bcam->lens = b_camera.lens();
@@ -427,6 +434,10 @@ static void blender_camera_sync(Camera *cam, BlenderCamera *bcam, int width, int
cam->stereo_eye = Camera::STEREO_NONE;
}
+ cam->use_pole_merge = bcam->use_pole_merge;
+ cam->pole_merge_angle_from = bcam->pole_merge_angle_from;
+ cam->pole_merge_angle_to = bcam->pole_merge_angle_to;
+
/* anamorphic lens bokeh */
cam->aperture_ratio = bcam->aperture_ratio;
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));
diff --git a/intern/cycles/kernel/kernel_types.h b/intern/cycles/kernel/kernel_types.h
index 02e69c7d75f..cc261ed37f8 100644
--- a/intern/cycles/kernel/kernel_types.h
+++ b/intern/cycles/kernel/kernel_types.h
@@ -909,9 +909,10 @@ typedef struct KernelCamera {
float4 equirectangular_range;
/* stereo */
- int pad1, pad2;
float interocular_offset;
float convergence_distance;
+ float pole_merge_angle_from;
+ float pole_merge_angle_to;
/* matrices */
Transform cameratoworld;
diff --git a/intern/cycles/render/camera.cpp b/intern/cycles/render/camera.cpp
index ad96473e5d2..d992cac5312 100644
--- a/intern/cycles/render/camera.cpp
+++ b/intern/cycles/render/camera.cpp
@@ -76,6 +76,9 @@ Camera::Camera()
stereo_eye = STEREO_NONE;
interocular_distance = 0.065f;
convergence_distance = 30.0f * 0.065f;
+ use_pole_merge = false;
+ pole_merge_angle_from = 60.0f * M_PI_F / 180.0f;
+ pole_merge_angle_to = 75.0f * M_PI_F / 180.0f;
sensorwidth = 0.036f;
sensorheight = 0.024f;
@@ -367,6 +370,14 @@ void Camera::device_update(Device *device, DeviceScene *dscene, Scene *scene)
}
kcam->convergence_distance = convergence_distance;
+ if(use_pole_merge) {
+ kcam->pole_merge_angle_from = pole_merge_angle_from;
+ kcam->pole_merge_angle_to = pole_merge_angle_to;
+ }
+ else {
+ kcam->pole_merge_angle_from = -1.0f;
+ kcam->pole_merge_angle_to = -1.0f;
+ }
/* sensor size */
kcam->sensorwidth = sensorwidth;
diff --git a/intern/cycles/render/camera.h b/intern/cycles/render/camera.h
index 684b4458dfc..57b9960e70b 100644
--- a/intern/cycles/render/camera.h
+++ b/intern/cycles/render/camera.h
@@ -104,6 +104,9 @@ public:
bool use_spherical_stereo;
float interocular_distance;
float convergence_distance;
+ bool use_pole_merge;
+ float pole_merge_angle_from;
+ float pole_merge_angle_to;
/* anamorphic lens bokeh */
float aperture_ratio;