[Bf-blender-cvs] [bd74c1a] cycles_panorama_experiments: Cycles: Pole merging for spherical stereo
Sergey Sharybin
noreply at git.blender.org
Fri May 6 13:44:32 CEST 2016
Commit: bd74c1a19b05687c9120726876e33e1d0b215f2f
Author: Sergey Sharybin
Date: Fri May 6 13:31:34 2016 +0200
Branches: cycles_panorama_experiments
https://developer.blender.org/rBbd74c1a19b05687c9120726876e33e1d0b215f2f
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.
Not optimal or something, but sohuld be good enough for testing.
===================================================================
M intern/cycles/blender/blender_camera.cpp
M intern/cycles/kernel/kernel_projection.h
M intern/cycles/kernel/kernel_types.h
M intern/cycles/render/camera.cpp
M intern/cycles/render/camera.h
M release/scripts/startup/bl_ui/properties_data_camera.py
M source/blender/makesdna/DNA_camera_types.h
M source/blender/makesrna/intern/rna_camera.c
===================================================================
diff --git a/intern/cycles/blender/blender_camera.cpp b/intern/cycles/blender/blender_camera.cpp
index 6b459ae..16aab18 100644
--- a/intern/cycles/blender/blender_camera.cpp
+++ b/intern/cycles/blender/blender_camera.cpp
@@ -65,6 +65,8 @@ struct BlenderCamera {
bool use_spherical_stereo;
float interocular_distance;
float convergence_distance;
+ bool use_pole_merge;
+ float pole_merge_angle;
enum { AUTO, HORIZONTAL, VERTICAL } sensor_fit;
float sensor_width;
@@ -183,6 +185,9 @@ 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 = b_camera.stereo().pole_merge_angle();
+
bcam->ortho_scale = b_camera.ortho_scale();
bcam->lens = b_camera.lens();
@@ -427,6 +432,9 @@ 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 = bcam->pole_merge_angle;
+
/* 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 6f96042..18209b5 100644
--- a/intern/cycles/kernel/kernel_projection.h
+++ b/intern/cycles/kernel/kernel_projection.h
@@ -450,7 +450,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.
@@ -459,6 +459,16 @@ ccl_device float3 spherical_stereo_position(KernelGlobals *kg,
return pos;
}
+ if(kernel_data.cam.use_pole_merge) {
+ const float pole_merge_angle = kernel_data.cam.pole_merge_angle;
+ float altitude = fabsf(safe_asinf(dir.z));
+ if(altitude > pole_merge_angle) {
+ float fac = (altitude - pole_merge_angle) / (M_PI_2_F - pole_merge_angle);
+ 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 78c665e..dfab775 100644
--- a/intern/cycles/kernel/kernel_types.h
+++ b/intern/cycles/kernel/kernel_types.h
@@ -902,9 +902,10 @@ typedef struct KernelCamera {
float4 equirectangular_range;
/* stereo */
- int pad1, pad2;
float interocular_offset;
float convergence_distance;
+ int use_pole_merge;
+ float pole_merge_angle;
/* matrices */
Transform cameratoworld;
diff --git a/intern/cycles/render/camera.cpp b/intern/cycles/render/camera.cpp
index 028916c..5a95931 100644
--- a/intern/cycles/render/camera.cpp
+++ b/intern/cycles/render/camera.cpp
@@ -76,6 +76,8 @@ Camera::Camera()
stereo_eye = STEREO_NONE;
interocular_distance = 0.065f;
convergence_distance = 30.0f * 0.065f;
+ use_pole_merge = false;
+ pole_merge_angle = M_PI_F / 4.0f;
sensorwidth = 0.036f;
sensorheight = 0.024f;
@@ -370,6 +372,8 @@ void Camera::device_update(Device *device, DeviceScene *dscene, Scene *scene)
}
kcam->convergence_distance = convergence_distance;
+ kcam->use_pole_merge = use_pole_merge;
+ kcam->pole_merge_angle = pole_merge_angle;
/* sensor size */
kcam->sensorwidth = sensorwidth;
diff --git a/intern/cycles/render/camera.h b/intern/cycles/render/camera.h
index 684b445..f5edf6e 100644
--- a/intern/cycles/render/camera.h
+++ b/intern/cycles/render/camera.h
@@ -104,6 +104,8 @@ public:
bool use_spherical_stereo;
float interocular_distance;
float convergence_distance;
+ bool use_pole_merge;
+ float pole_merge_angle;
/* anamorphic lens bokeh */
float aperture_ratio;
diff --git a/release/scripts/startup/bl_ui/properties_data_camera.py b/release/scripts/startup/bl_ui/properties_data_camera.py
index 58a4820..4b121db 100644
--- a/release/scripts/startup/bl_ui/properties_data_camera.py
+++ b/release/scripts/startup/bl_ui/properties_data_camera.py
@@ -166,6 +166,12 @@ class DATA_PT_camera_stereoscopy(CameraButtonsPanel, Panel):
if is_spherical_stereo:
col.separator()
col.prop(st, "use_spherical_stereo")
+ sub = col.column()
+ sub.active = st.use_spherical_stereo
+ sub.prop(st, "use_pole_merge")
+ row = sub.row()
+ row.active = st.use_pole_merge
+ row.prop(st, "pole_merge_angle")
col.label(text="Pivot:")
row = col.row()
diff --git a/source/blender/makesdna/DNA_camera_types.h b/source/blender/makesdna/DNA_camera_types.h
index 7f2e1aa..990202a 100644
--- a/source/blender/makesdna/DNA_camera_types.h
+++ b/source/blender/makesdna/DNA_camera_types.h
@@ -52,7 +52,10 @@ typedef struct CameraStereoSettings {
short convergence_mode;
short pivot;
short flag;
+ /* Cut-off angle at which interocular distance starts to fade to 0. */
short pad;
+ float pole_merge_angle;
+ float pad2;
} CameraStereoSettings;
typedef struct Camera {
@@ -152,6 +155,7 @@ enum {
/* stereo->flag */
enum {
CAM_S3D_SPHERICAL = (1 << 0),
+ CAM_S3D_POLE_MERGE = (1 << 1),
};
#ifdef __cplusplus
diff --git a/source/blender/makesrna/intern/rna_camera.c b/source/blender/makesrna/intern/rna_camera.c
index d5044ec..be2cfbd 100644
--- a/source/blender/makesrna/intern/rna_camera.c
+++ b/source/blender/makesrna/intern/rna_camera.c
@@ -151,6 +151,18 @@ static void rna_def_camera_stereo_data(BlenderRNA *brna)
"Render every pixel rotating the camera around the "
"middle of the interocular distance");
RNA_def_property_update(prop, NC_OBJECT | ND_DRAW, NULL);
+
+ prop = RNA_def_property(srna, "use_pole_merge", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "flag", CAM_S3D_POLE_MERGE);
+ RNA_def_property_ui_text(prop, "Use Pole Merge",
+ "Fade interocular distance to 0 after the given cutoff angle");
+ RNA_def_property_update(prop, NC_OBJECT | ND_DRAW, NULL);
+
+ prop = RNA_def_property(srna, "pole_merge_angle", PROP_FLOAT, PROP_ANGLE);
+ RNA_def_property_range(prop, 0.0f, M_PI / 2.0f);
+ RNA_def_property_ui_text(prop, "Pole Merge Angle",
+ "Angle at which interocular distance starts to fade to 0");
+ RNA_def_property_update(prop, NC_OBJECT | ND_DRAW, NULL);
}
void RNA_def_camera(BlenderRNA *brna)
More information about the Bf-blender-cvs
mailing list