[Bf-blender-cvs] [a0b49f3] multiview: Multiview Base Commit 8/10: Viewport 3D (camera)

Dalai Felinto noreply at git.blender.org
Sat May 10 20:18:15 CEST 2014


Commit: a0b49f357aa87dcd4b459a6280259db06d3ea115
Author: Dalai Felinto
Date:   Sat May 10 14:58:28 2014 -0300
https://developer.blender.org/rBa0b49f357aa87dcd4b459a6280259db06d3ea115

Multiview Base Commit 8/10: Viewport 3D (camera)

This is part of the multiview rebase from a github to git.blender.org
repository. The rebase was made based on file areas, so build is likely
broken in some of those parts, but it bulds fine in the end.

The documentation and sample files were removed and now live in:
https://github.com/dfelinto/multiview-samples

The original git history can be found in:
https://github.com/dfelinto/blender/tree/multiview-pre-b3d

Code contributors of the original branch in github:
* Alexey Akishin
* Gabriel Caraballo

Original design made in contribution with Francesco Siddi
Original branch and design partially reviewed by Brecht Van Lommel

===================================================================

M	release/scripts/startup/bl_ui/space_view3d.py
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

===================================================================

diff --git a/release/scripts/startup/bl_ui/space_view3d.py b/release/scripts/startup/bl_ui/space_view3d.py
index a7856b3..7ec78ef 100644
--- a/release/scripts/startup/bl_ui/space_view3d.py
+++ b/release/scripts/startup/bl_ui/space_view3d.py
@@ -2828,16 +2828,42 @@ class VIEW3D_PT_view3d_display(Panel):
             row.prop(region, "use_box_clip")
 
 
-class VIEW3D_PT_view3d_shading(Panel):
+class VIEW3D_PT_view3d_stereo(Panel):
     bl_space_type = 'VIEW_3D'
     bl_region_type = 'UI'
-    bl_label = "Shading"
+    bl_label = "Stereoscopy"
     bl_options = {'DEFAULT_CLOSED'}
 
     @classmethod
     def poll(cls, context):
+        scene = context.scene
+
+        multiview = scene.render.use_multiple_views
+        engine = scene.render.engine
+
+        return context.space_data and multiview
+
+    def draw(self, context):
+        layout = self.layout
         view = context.space_data
-        return (view)
+
+        basic_stereo = context.scene.render.views_setup == 'SETUP_BASIC'
+
+        col = layout.column()
+        col.row().prop(view, "stereoscopy_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")
+
+
+class VIEW3D_PT_view3d_shading(Panel):
+    bl_space_type = 'VIEW_3D'
+    bl_region_type = 'UI'
+    bl_label = "Shading"
 
     def draw(self, context):
         layout = self.layout
diff --git a/source/blender/editors/space_view3d/space_view3d.c b/source/blender/editors/space_view3d/space_view3d.c
index 4d958a5..9701dbb 100644
--- a/source/blender/editors/space_view3d/space_view3d.c
+++ b/source/blender/editors/space_view3d/space_view3d.c
@@ -325,7 +325,7 @@ static SpaceLink *view3d_new(const bContext *C)
 	v3d->gridflag = V3D_SHOW_X | V3D_SHOW_Y | V3D_SHOW_FLOOR;
 	
 	v3d->flag = V3D_SELECT_OUTLINE;
-	v3d->flag2 = V3D_SHOW_RECONSTRUCTION | V3D_SHOW_GPENCIL;
+	v3d->flag2 = V3D_SHOW_GPENCIL;
 	
 	v3d->lens = 35.0f;
 	v3d->near = 0.01f;
@@ -337,6 +337,9 @@ static SpaceLink *view3d_new(const bContext *C)
 	
 	v3d->bundle_size = 0.2f;
 	v3d->bundle_drawtype = OB_PLAINAXES;
+
+	/* stereo */
+	v3d->stereo_camera = STEREO_3D_ID;
 	
 	/* header */
 	ar = MEM_callocN(sizeof(ARegion), "header for view3d");
diff --git a/source/blender/editors/space_view3d/view3d_draw.c b/source/blender/editors/space_view3d/view3d_draw.c
index 9ce6bf5..c92fd4d 100644
--- a/source/blender/editors/space_view3d/view3d_draw.c
+++ b/source/blender/editors/space_view3d/view3d_draw.c
@@ -3323,6 +3323,60 @@ static void view3d_main_area_clear(Scene *scene, View3D *v3d, ARegion *ar)
 	}
 }
 
+static bool view3d_stereo_active(const bContext *C, Scene *scene)
+{
+	wmWindow *win = CTX_wm_window(C);
+
+	if ((scene->r.scemode & R_MULTIVIEW) == 0)
+		return false;
+
+	if (WM_stereo_enabled(win, true) == false)
+		return false;
+
+	return true;
+}
+
+static void view3d_stereo_setup(Scene *scene, View3D *v3d, ARegion *ar)
+{
+	bool left;
+
+	/* show only left or right camera */
+	if (v3d->stereo_camera != STEREO_3D_ID)
+		v3d->eye = v3d->stereo_camera;
+
+	left = v3d->eye == STEREO_LEFT_ID;
+
+	/* update the viewport matrices with the new camera */
+	if (scene->r.views_setup == SCE_VIEWS_SETUP_BASIC) {
+		Camera *data;
+		float viewmat[4][4];
+		float orig_shift;
+
+		data = (Camera *)v3d->camera->data;
+		orig_shift = data->shiftx;
+
+		BKE_camera_stereo_matrices(v3d->camera, viewmat, &data->shiftx, left);
+		view3d_main_area_setup_view(scene, v3d, ar, viewmat, NULL);
+
+		/* restore the original shift */
+		data->shiftx = orig_shift;
+	}
+	else { /* SCE_VIEWS_SETUP_ADVANCED */
+		Object *orig_cam = v3d->camera;
+		SceneRenderView *srv;
+
+		if (left)
+			srv = BLI_findstring(&scene->r.views, STEREO_LEFT_NAME, offsetof(SceneRenderView, name));
+		else
+			srv = BLI_findstring(&scene->r.views, STEREO_RIGHT_NAME, offsetof(SceneRenderView, name));
+
+		v3d->camera = BKE_camera_multiview_advanced(scene, &scene->r, v3d->camera, srv->suffix);
+		view3d_main_area_setup_view(scene, v3d, ar, NULL, NULL);
+
+		/* restore the original camera */
+		v3d->camera = orig_cam;
+	}
+}
 
 #ifdef WITH_GAMEENGINE
 static void update_lods(Scene *scene, float camera_pos[3])
@@ -3371,6 +3425,10 @@ static void view3d_main_area_draw_objects(const bContext *C, Scene *scene, View3
 	/* clear the background */
 	view3d_main_area_clear(scene, v3d, ar);
 
+	/* change view according to stereo eye */
+	if (view3d_stereo_active(C, scene))
+		view3d_stereo_setup(scene, v3d, ar);
+
 	/* enables anti-aliasing for 3D view drawing */
 	if (U.ogl_multisamples != USER_MULTISAMPLE_NONE) {
 		glEnable(GL_MULTISAMPLE_ARB);
diff --git a/source/blender/makesdna/DNA_view3d_types.h b/source/blender/makesdna/DNA_view3d_types.h
index 98c12e9..c714f09 100644
--- a/source/blender/makesdna/DNA_view3d_types.h
+++ b/source/blender/makesdna/DNA_view3d_types.h
@@ -212,7 +212,9 @@ typedef struct View3D {
 	
 	/* drawflags, denoting state */
 	char zbuf, transp, xray;
-	char pad3[5];
+
+	char eye;				/* multiview current eye - for internal use */
+	char pad3[4];
 
 	void *properties_storage;		/* Nkey panel stores stuff here (runtime only!) */
 	struct Material *defmaterial;	/* used by matcap now */
@@ -220,9 +222,21 @@ typedef struct View3D {
 	/* XXX deprecated? */
 	struct bGPdata *gpd  DNA_DEPRECATED;		/* Grease-Pencil Data (annotation layers) */
 
+	 /* stereo */
+	short stereo_flag;
+	char stereo_camera;
+	char pad4;
+	short pad5, pad6;
+	float stereo_convergence_factor;
+	float pad7;
 } View3D;
 
 
+/* View3D->stereo_flag (short) */
+#define V3D_S3D_DISPCAMERAS		(1 << 0)
+#define V3D_S3D_DISPPLANES		(1 << 1)
+#define V3D_S3D_DISPVOLUME		(1 << 2)
+
 /* View3D->flag (short) */
 /*#define V3D_DISPIMAGE		1*/ /*UNUSED*/
 #define V3D_DISPBGPICS		2
@@ -284,7 +298,6 @@ typedef struct View3D {
 #define V3D_OCCLUDE_WIRE		16384
 #define V3D_SHADELESS_TEX		32768
 
-
 /* View3D->around */
 #define V3D_CENTER		 0
 #define V3D_CENTROID	 3




More information about the Bf-blender-cvs mailing list