[Bf-blender-cvs] [5b16c78] multiview: Viewport 3D: Drawing of Stereo Cameras, Convergence Plane and Volume
Dalai Felinto
noreply at git.blender.org
Mon Sep 22 23:13:08 CEST 2014
Commit: 5b16c78913afb9e0e786f1db373ce1a92adf0b1e
Author: Dalai Felinto
Date: Sun Sep 21 01:47:54 2014 +0200
Branches: multiview
https://developer.blender.org/rB5b16c78913afb9e0e786f1db373ce1a92adf0b1e
Viewport 3D: Drawing of Stereo Cameras, Convergence Plane and Volume
This also includes:
* Unification of the view_matrix and model_matrix functions.
* Fix for Toe-in formula
* Fix for viewport bug when camera scale was not uniform
===================================================================
M release/scripts/startup/bl_ui/space_view3d.py
M source/blender/blenkernel/intern/camera.c
M source/blender/blenloader/intern/versioning_270.c
M source/blender/editors/space_view3d/drawobject.c
M source/blender/editors/space_view3d/space_view3d.c
M source/blender/editors/space_view3d/view3d_draw.c
M source/blender/makesdna/DNA_view3d_types.h
M source/blender/makesrna/intern/rna_space.c
M source/blender/windowmanager/intern/wm_stereo.c
===================================================================
diff --git a/release/scripts/startup/bl_ui/space_view3d.py b/release/scripts/startup/bl_ui/space_view3d.py
index 9a15909..5941c80 100644
--- a/release/scripts/startup/bl_ui/space_view3d.py
+++ b/release/scripts/startup/bl_ui/space_view3d.py
@@ -2853,14 +2853,23 @@ class VIEW3D_PT_view3d_stereo(Panel):
basic_stereo = context.scene.render.views_setup == 'SETUP_BASIC'
col = layout.column()
- col.row().prop(view, "stereoscopy_camera", expand=True)
+ col.row().prop(view, "stereo_3d_camera", expand=True)
col.label(text="Display:")
row = col.row()
row.active = basic_stereo
- row.prop(view, "show_stereoscopy_cameras")
- col.prop(view, "show_stereoscopy_planes")
- col.prop(view, "show_stereoscopy_volume")
+ row.prop(view, "show_stereo_3d_cameras")
+ row = col.row()
+ split = row.split()
+ split.prop(view, "show_stereo_3d_convergence_plane")
+ split = row.split()
+ split.prop(view, "stereo_3d_convergence_plane_alpha", text="Alpha")
+ split.active = view.show_stereo_3d_convergence_plane
+ row = col.row()
+ split = row.split()
+ split.prop(view, "show_stereo_3d_volume")
+ split = row.split()
+ split.prop(view, "stereo_3d_volume_alpha", text="Alpha")
class VIEW3D_PT_view3d_shading(Panel):
diff --git a/source/blender/blenkernel/intern/camera.c b/source/blender/blenkernel/intern/camera.c
index cd967d3..b2001b4 100644
--- a/source/blender/blenkernel/intern/camera.c
+++ b/source/blender/blenkernel/intern/camera.c
@@ -604,65 +604,6 @@ bool BKE_camera_view_frame_fit_to_scene(Scene *scene, struct View3D *v3d, Object
/******************* multiview matrix functions ***********************/
-static void camera_view_matrix(Object *camera, float r_viewmat[4][4])
-{
- invert_m4_m4(r_viewmat, camera->obmat);
-}
-
-static void camera_stereo3d_view_matrix(Object *camera, const bool is_left, float r_viewmat[4][4])
-{
- /* viewmat = MODELVIEW_MATRIX */
- Camera *data = camera->data;
- float interocular_distance, convergence_distance;
- float angle = 0.0f;
- short convergence_mode, pivot;
- float tmpviewmat[4][4];
- float transmat[4][4];
- float fac = 1.0f;
- float fac_signed;
-
- unit_m4(transmat);
-
- interocular_distance = data->stereo.interocular_distance;
- convergence_distance = data->stereo.convergence_distance;
- convergence_mode = data->stereo.convergence_mode;
- pivot = data->stereo.pivot;
-
- if (((pivot == CAM_S3D_PIVOT_LEFT) && is_left) ||
- ((pivot == CAM_S3D_PIVOT_RIGHT) && !is_left))
- {
- return camera_view_matrix(camera, r_viewmat);
- }
-
- invert_m4_m4(tmpviewmat, camera->obmat);
-
- if (pivot == CAM_S3D_PIVOT_CENTER)
- fac = 0.5f;
-
- fac_signed = is_left ? fac : -fac;
-
- /* rotation */
- if (convergence_mode == CAM_S3D_TOE) {
- float angle_sin, angle_cos;
- angle = atanf((interocular_distance * 0.5f) / convergence_distance);
-
- angle_cos = cosf(angle * 2.0f * fac_signed);
- angle_sin = sinf(angle * 2.0f * fac_signed);
-
- transmat[0][0] = angle_cos;
- transmat[2][0] = -angle_sin;
- transmat[0][2] = angle_sin;
- transmat[2][2] = angle_cos;
- }
-
- /* translation */
- transmat[3][0] = cosf(angle) * interocular_distance * fac_signed;
- transmat[3][2] = sinf(angle) * interocular_distance * fac_signed;
-
- /* apply */
- mul_m4_m4m4(r_viewmat, transmat, tmpviewmat);
-}
-
static void camera_model_matrix(Object *camera, float r_modelmat[4][4])
{
copy_m4_m4(r_modelmat, camera->obmat);
@@ -672,16 +613,12 @@ static void camera_stereo3d_model_matrix(Object *camera, const bool is_left, flo
{
Camera *data = (Camera *)camera->data;
float interocular_distance, convergence_distance;
- float angle = 0.0f;
short convergence_mode, pivot;
- float tmpmat[4][4];
+ float sizemat[4][4];
- float rotmat[3][3];
float fac = 1.0f;
float fac_signed;
- unit_m3(rotmat);
-
interocular_distance = data->stereo.interocular_distance;
convergence_distance = data->stereo.convergence_distance;
convergence_mode = data->stereo.convergence_mode;
@@ -692,6 +629,11 @@ static void camera_stereo3d_model_matrix(Object *camera, const bool is_left, flo
{
return camera_model_matrix(camera, r_modelmat);
}
+ else {
+ float size[3];
+ mat4_to_size(size, camera->obmat);
+ size_to_mat4(sizemat, size);
+ }
if (pivot == CAM_S3D_PIVOT_CENTER)
fac = 0.5f;
@@ -700,43 +642,75 @@ static void camera_stereo3d_model_matrix(Object *camera, const bool is_left, flo
/* rotation */
if (convergence_mode == CAM_S3D_TOE) {
+ float angle;
float angle_sin, angle_cos;
- angle = -atanf((interocular_distance * 0.5f) / convergence_distance);
+ float toeinmat[4][4];
+ float rotmat[4][4];
+
+ unit_m4(rotmat);
+
+ if (pivot == CAM_S3D_PIVOT_CENTER) {
+ fac = -fac;
+ fac_signed = -fac_signed;
+ }
- angle_cos = cosf(angle * 2.0f * fac_signed);
- angle_sin = sinf(angle * 2.0f * fac_signed);
+ angle = atanf((interocular_distance * 0.5f) / convergence_distance) / fac;
+
+ angle_cos = cosf(angle * fac_signed);
+ angle_sin = sinf(angle * fac_signed);
rotmat[0][0] = angle_cos;
rotmat[2][0] = -angle_sin;
rotmat[0][2] = angle_sin;
rotmat[2][2] = angle_cos;
+
+ if (pivot == CAM_S3D_PIVOT_CENTER) {
+ /* set the rotation */
+ copy_m4_m4(toeinmat, rotmat);
+ /* set the translation */
+ toeinmat[3][0] = interocular_distance * fac_signed;
+
+ /* transform */
+ normalize_m4_m4(r_modelmat, camera->obmat);
+ mul_m4_m4m4(r_modelmat, r_modelmat, toeinmat);
+
+ /* scale back to the original size */
+ mul_m4_m4m4(r_modelmat, r_modelmat, sizemat);
+ }
+ else { /* CAM_S3D_PIVOT_LEFT, CAM_S3D_PIVOT_RIGHT */
+ /* rotate perpendicular to the interocular line */
+ normalize_m4_m4(r_modelmat, camera->obmat);
+ mul_m4_m4m4(r_modelmat, r_modelmat, rotmat);
+
+ /* translate along the interocular line */
+ unit_m4(toeinmat);
+ toeinmat[3][0] = -interocular_distance * fac_signed;
+ mul_m4_m4m4(r_modelmat, r_modelmat, toeinmat);
+
+ /* rotate to toe-in angle */
+ mul_m4_m4m4(r_modelmat, r_modelmat, rotmat);
+
+ /* scale back to the original size */
+ mul_m4_m4m4(r_modelmat, r_modelmat, sizemat);
+ }
}
+ else {
+ normalize_m4_m4(r_modelmat, camera->obmat);
- copy_m4_m4(tmpmat, camera->obmat);
- /* set the rotation */
- mul_m4_m4m3(r_modelmat, tmpmat, rotmat);
- /* set the translation */
- copy_v4_v4(r_modelmat[3], tmpmat[3]);
+ /* translate - no rotation in CAM_S3D_OFFAXIS, CAM_S3D_PARALLEL */
+ translate_m4(r_modelmat, -interocular_distance * fac_signed, 0.0f, 0.0f);
- /* translation */
- translate_m4(r_modelmat,
- -interocular_distance * cosf(angle) * fac_signed, 0.0f,
- interocular_distance * sinf(angle) * fac_signed);
+ /* scale back to the original size */
+ mul_m4_m4m4(r_modelmat, r_modelmat, sizemat);
+ }
}
+/* the view matrix is used by the viewport drawing, it is basically the inverted model matrix */
void BKE_camera_view_matrix(RenderData *rd, Object *camera, const bool is_left, float r_viewmat[4][4])
{
- const bool is_multiview = (rd->scemode & R_MULTIVIEW);
-
- if (!is_multiview) {
- return camera_view_matrix(camera, r_viewmat);
- }
- else if (rd->views_setup == SCE_VIEWS_SETUP_ADVANCED) {
- return camera_view_matrix(camera, r_viewmat);
- }
- else { /* SCE_VIEWS_SETUP_BASIC */
- return camera_stereo3d_view_matrix(camera, is_left, r_viewmat);
- }
+ BKE_camera_model_matrix(rd, camera, is_left ? STEREO_LEFT_NAME : STEREO_RIGHT_NAME, r_viewmat);
+ normalize_m4(r_viewmat);
+ invert_m4(r_viewmat);
}
/* left is the default */
diff --git a/source/blender/blenloader/intern/versioning_270.c b/source/blender/blenloader/intern/versioning_270.c
index 9845ee6..05dc426 100644
--- a/source/blender/blenloader/intern/versioning_270.c
+++ b/source/blender/blenloader/intern/versioning_270.c
@@ -407,7 +407,10 @@ void blo_do_versions_270(FileData *fd, Library *UNUSED(lib), Main *main)
case SPACE_VIEW3D:
{
View3D *v3d = (View3D *)sl;
- v3d->stereo_camera = STEREO_3D_ID;
+ v3d->stereo3d_camera = STEREO_3D_ID;
+ v3d->stereo3d_flag |= V3D_S3D_DISPPLANE;
+ v3d->stereo3d_convergence_alpha = 0.15f;
+ v3d->stereo3d_volume_alpha = 0.05f;
break;
}
case SPACE_IMAGE:
diff --git a/source/blender/editors/space_view3d/drawobject.c b/source/blender/editors/space_view3d/drawobject.c
index e7b6e50..919d12b 100644
--- a/source/blender/editors/space_view3d/drawobject.c
+++ b/source/blender/editors/space_view3d/drawobject.c
@@ -1742,6 +1742,260 @@ static void draw_viewport_reconstruction(Scene *scene, Base *base, View3D *v3d,
GPU_select_load_id(base->selcol);
}
+static void drawcamera_volume(float near_plane[4][3], float far_plane[4][3], const GLenum mode)
+{
+ glBegin(mode);
+ glVertex3fv(near_plane[0]);
+ glVertex3fv(far_plane[0]);
+ glVertex3fv(far_plane[1]);
+ glVertex3fv(near_plane[1]);
+ glEnd();
+
+ glBegin(mode);
+ glVertex3fv(near_plane[1]);
+ glVertex3fv(far_plane[1]);
+ glVertex3fv(far_plane[2]);
+ glVertex3fv(near_plane[2]);
+ glEnd();
+
+ glBegin(mode);
+ glVertex3fv(near_plane[2]);
+ glVertex3fv(near_plane[1]);
+ glVertex3fv(far_plane[1]);
+ glVertex3fv(far_plane[2]);
+ glEnd();
+
+ glBegin(mode);
+ glVertex3fv(far_plane[0]);
+ glVertex3fv(near_plane[0]);
+ glVertex3fv(near_plane[3]);
+ glVertex3fv(far_plane[3]);
+ glEnd();
+}
+
+/* camera frame */
+static void drawcamera_frame(float vec[4][3], const GLenum mode)
+{
+ glBegin(mode);
+ glVertex3fv(vec[0]);
+ glVertex3fv(vec[1]);
+ glVertex3fv(vec[2]);
+ glVertex3fv(vec[3]);
+ glEnd();
+}
+
+/* center point to camera frame */
+static void drawcamera_framelines(float vec[4][3], float origin[3])
+{
+ glBegin(GL_LINE_STRIP);
+ glVertex3fv(vec[1]);
+ glVertex3fv(origin);
+ glVertex3fv(vec[0]);
+ glVertex3fv(vec[3]);
+ glVertex3fv(origin);
+ glVertex3fv(vec[2]);
+ glEnd();
+}
+
+static bool drawcamera_is_stereo3d(Scene *scene, View3D *v3d, Object *ob)
+{
+ return (ob == v3d->camera) &&
+ (scene->r.scemode & R_MULTIVIEW) != 0 &&
+ (scene->r.views_setup == SCE_VIEWS_SETUP_BASIC) &&
+ (v3d->stereo3d_flag);
+}
+
+static void drawcamera_stereo3d(Scene *scene, View3D *
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list