[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