[Bf-blender-cvs] [04b98f6] multiview: Multiview Base Commit 2/10: Camera

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


Commit: 04b98f6118db103c9fd715cdd15f348c98433272
Author: Dalai Felinto
Date:   Sat May 10 14:57:58 2014 -0300
https://developer.blender.org/rB04b98f6118db103c9fd715cdd15f348c98433272

Multiview Base Commit 2/10: 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/properties_data_camera.py
M	source/blender/blenkernel/BKE_camera.h
M	source/blender/blenkernel/intern/camera.c
M	source/blender/makesdna/DNA_camera_types.h
M	source/blender/makesrna/intern/rna_camera.c

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

diff --git a/release/scripts/startup/bl_ui/properties_data_camera.py b/release/scripts/startup/bl_ui/properties_data_camera.py
index 0600c87..fbffe98 100644
--- a/release/scripts/startup/bl_ui/properties_data_camera.py
+++ b/release/scripts/startup/bl_ui/properties_data_camera.py
@@ -119,6 +119,38 @@ class DATA_PT_lens(CameraButtonsPanel, Panel):
         col.prop(cam, "clip_end", text="End")
 
 
+class DATA_PT_camera_stereoscopy(CameraButtonsPanel, Panel):
+    bl_label = "Stereoscopy"
+    COMPAT_ENGINES = {'BLENDER_RENDER'}
+
+    @classmethod
+    def poll(cls, context):
+        scene = context.scene
+
+        multiview = scene.render.use_multiple_views
+        engine = scene.render.engine
+
+        return context.camera and multiview and (engine in cls.COMPAT_ENGINES)
+
+    def draw(self, context):
+        layout = self.layout
+        layout.active = context.scene.render.views_setup == 'SETUP_BASIC'
+
+        col = layout.column()
+
+        st = context.camera.stereo
+        row = col.row(align=True)
+        row.prop(st, "interocular_distance")
+
+        if st.convergence_mode == 'PARALLEL':
+            row.prop(st, "convergence_distance", text="Viewport Convergence")
+        else:
+            row.prop(st, "convergence_distance")
+
+        row = col.row()
+        row.prop(st, "convergence_mode", expand=True)
+
+
 class DATA_PT_camera(CameraButtonsPanel, Panel):
     bl_label = "Camera"
     COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_GAME'}
diff --git a/source/blender/blenkernel/BKE_camera.h b/source/blender/blenkernel/BKE_camera.h
index 01b401c..d09fd20 100644
--- a/source/blender/blenkernel/BKE_camera.h
+++ b/source/blender/blenkernel/BKE_camera.h
@@ -36,6 +36,7 @@
 extern "C" {
 #endif
 
+#include "DNA_scene_types.h"
 #include "DNA_vec_types.h"
 
 struct Camera;
@@ -120,6 +121,9 @@ void BKE_camera_view_frame(struct Scene *scene, struct Camera *camera, float r_v
 bool BKE_camera_view_frame_fit_to_scene(struct Scene *scene, struct View3D *v3d, struct Object *camera_ob,
                                         float r_co[3]);
 
+struct Object *BKE_camera_multiview_advanced(struct Scene *scene, struct RenderData *rd, struct Object *camera, const char *suffix);
+void BKE_camera_stereo_matrices(struct Object *camera, float viewmat[4][4], float *shift, bool left);
+
 #ifdef __cplusplus
 }
 #endif
diff --git a/source/blender/blenkernel/intern/camera.c b/source/blender/blenkernel/intern/camera.c
index b20ba40..5257eb9 100644
--- a/source/blender/blenkernel/intern/camera.c
+++ b/source/blender/blenkernel/intern/camera.c
@@ -30,15 +30,18 @@
  */
 
 #include <stdlib.h>
+#include <stddef.h>
 
 #include "DNA_camera_types.h"
 #include "DNA_lamp_types.h"
 #include "DNA_object_types.h"
 #include "DNA_scene_types.h"
 #include "DNA_view3d_types.h"
+#include "DNA_ID.h"
 
 #include "BLI_math.h"
 #include "BLI_utildefines.h"
+#include "BLI_string.h"
 
 #include "BKE_animsys.h"
 #include "BKE_camera.h"
@@ -65,6 +68,10 @@ void *BKE_camera_add(Main *bmain, const char *name)
 	cam->ortho_scale = 6.0;
 	cam->flag |= CAM_SHOWPASSEPARTOUT;
 	cam->passepartalpha = 0.5f;
+
+	/* stereoscopy 3d */
+	cam->stereo.interocular_distance = 0.065;
+	cam->stereo.convergence_distance = 30.f * 0.065;
 	
 	return cam;
 }
@@ -593,3 +600,96 @@ bool BKE_camera_view_frame_fit_to_scene(Scene *scene, struct View3D *v3d, Object
 		}
 	}
 }
+
+void BKE_camera_stereo_matrices(Object *camera, float viewmat[4][4], float *shift, bool left)
+{
+	/* viewmat = MODELVIEW_MATRIX */
+	Camera *data = (Camera *)camera->data;
+	float interocular_distance, convergence_distance, angle;
+	short convergence_mode;
+	float tmpviewmat[4][4];
+
+	float transmat[4][4] = {
+	      {1,0,0,0},
+	      {0,1,0,0},
+	      {0,0,1,0},
+	      {0,0,0,1} };
+
+	interocular_distance = data->stereo.interocular_distance;
+	convergence_distance = data->stereo.convergence_distance;
+	convergence_mode = data->stereo.convergence_mode;
+
+	invert_m4_m4(tmpviewmat, camera->obmat);
+
+	/* rotate */
+	if (convergence_mode == CAM_S3D_TOE) {
+		angle = atan((interocular_distance * 0.5) / convergence_distance);
+
+		if (left)
+			angle = -angle;
+
+		transmat[0][0] = cos(angle);
+		transmat[2][0] = -sin(angle);
+		transmat[0][2] = sin(angle);
+		transmat[2][2] = cos(angle);
+	}
+
+	/* move */
+	if (left) {
+		transmat[3][0] = interocular_distance * 0.5 ;
+	}
+	else {
+		transmat[3][0] = interocular_distance * -0.5 ;
+	}
+	
+	/* apply */
+	mul_m4_m4m4( tmpviewmat, transmat, tmpviewmat) ;
+
+	/* copy  */
+	copy_m4_m4(viewmat, tmpviewmat);
+
+	/* prepare the camera shift for the projection matrix */
+	/* Note: in viewport, parallel renders as offaxis, but in render it does parallel */
+	if (ELEM(convergence_mode, CAM_S3D_OFFAXIS, CAM_S3D_PARALLEL)) {
+		if (left)
+			*shift += ((interocular_distance / data->sensor_x) * (data->lens / convergence_distance)) * 0.5;
+		else
+			*shift -= ((interocular_distance / data->sensor_x) * (data->lens / convergence_distance)) * 0.5;
+	}
+}
+
+Object *BKE_camera_multiview_advanced(Scene *scene, RenderData *rd, Object *camera, const char *suffix)
+{
+	SceneRenderView *srv;
+	char name[MAX_NAME];
+	int len_name, len_suffix;
+
+	len_name = BLI_strnlen(camera->id.name, sizeof(camera->id.name));
+
+	for (srv = rd->views.first; srv; srv = srv->next)
+	{
+		len_suffix = BLI_strnlen(srv->suffix, sizeof(srv->suffix));
+
+		if (len_name < len_suffix)
+			continue;
+
+		if (strcmp(camera->id.name + (len_name - len_suffix), srv->suffix) == 0) {
+			BLI_snprintf(name, sizeof(name), "%.*s%s", (len_name - len_suffix), camera->id.name, suffix);
+			break;
+		}
+	}
+
+	if (name[0] != '\0') {
+		Base *base;
+		Object *ob;
+		for (base = scene->base.first; base; base = base->next) {
+			ob = base->object;
+			if (strcmp(ob->id.name, name) == 0) {
+				return ob;
+			}
+		}
+	}
+
+	return camera;
+}
+
diff --git a/source/blender/makesdna/DNA_camera_types.h b/source/blender/makesdna/DNA_camera_types.h
index c99494c..eb44f2e 100644
--- a/source/blender/makesdna/DNA_camera_types.h
+++ b/source/blender/makesdna/DNA_camera_types.h
@@ -44,6 +44,15 @@ struct Object;
 struct AnimData;
 struct Ipo;
 
+/* ------------------------------------------- */
+/* Stereo Settings */
+typedef struct CameraStereoSettings {
+	 float interocular_distance;
+	 float convergence_distance;
+	 short convergence_mode;
+	 short pad, pad2, pad3;
+} CameraStereoSettings;
+
 typedef struct Camera {
 	ID id;
 	struct AnimData *adt;	/* animation data (must be immediately after id for utilities to use it) */ 
@@ -68,6 +77,9 @@ typedef struct Camera {
 
 	char sensor_fit;
 	char pad[7];
+
+	 /* Stereo settings */
+	 struct CameraStereoSettings stereo;
 } Camera;
 
 /* **************** CAMERA ********************* */
@@ -121,6 +133,11 @@ enum {
 #define DEFAULT_SENSOR_WIDTH	32.0f
 #define DEFAULT_SENSOR_HEIGHT	18.0f
 
+/* stereo->convergence_mode */
+#define CAM_S3D_OFFAXIS	0
+#define CAM_S3D_PARALLEL	1
+#define CAM_S3D_TOE	2
+
 #ifdef __cplusplus
 }
 #endif
diff --git a/source/blender/makesrna/intern/rna_camera.c b/source/blender/makesrna/intern/rna_camera.c
index be973ab..ba3d1fa 100644
--- a/source/blender/makesrna/intern/rna_camera.c
+++ b/source/blender/makesrna/intern/rna_camera.c
@@ -89,6 +89,41 @@ static void rna_Camera_update(Main *UNUSED(bmain), Scene *UNUSED(scene), Pointer
 
 #else
 
+static void rna_def_camera_stereo_data(BlenderRNA *brna)
+{
+	StructRNA *srna;
+	PropertyRNA *prop;
+
+	static EnumPropertyItem convergence_mode_items[] = {
+		{CAM_S3D_OFFAXIS, "OFFAXIS", 0, "Off-Axis", ""},
+		{CAM_S3D_PARALLEL, "PARALLEL", 0, "Parallel", ""},
+		{CAM_S3D_TOE, "TOE", 0, "Toe-in", ""},
+		{0, NULL, 0, NULL, NULL}
+	};
+
+	srna = RNA_def_struct(brna, "CameraStereoData", NULL);
+	RNA_def_struct_sdna(srna, "CameraStereoSettings");
+	RNA_def_struct_nested(brna, srna, "Camera");
+	RNA_def_struct_ui_text(srna, "Stereo", "Stereoscopy settings for a Camera datablock");
+
+	prop = RNA_def_property(srna, "convergence_mode", PROP_ENUM, PROP_NONE);
+	RNA_def_property_enum_items(prop, convergence_mode_items);
+	RNA_def_property_ui_text(prop, "Mode", "");
+	RNA_def_property_update(prop, NC_OBJECT | ND_DRAW, NULL);
+
+	prop = RNA_def_property(srna, "interocular_distance", PROP_FLOAT, PROP_DISTANCE);
+	RNA_def_property_range(prop, 0.0f, 100.0f);
+	RNA_def_property_ui_range(prop, 0.0f, 1.f, 1, 2);
+	RNA_def_property_ui_text(prop, "Interocular Distance", "Set the distance between the eyes - the stereo plane distance / 30 should be fine");
+	RNA_def_property_update(prop, NC_OBJECT | ND_DRAW, NULL);
+
+	prop = RNA_def_property(srna, "convergence_distance", PROP_FLOAT, PROP_DISTANCE);
+	RNA_def_property_range(prop, 0.00001f, FLT_MAX);
+	RNA_def_property_ui_range(prop, 0.0f, 15.f, 1, 2);
+	RNA_def_property_ui_text(prop, "Convergence Plane Distance", "The converge point for the stereo cameras (often the distance between a projector and the projection screen)");
+	RNA_def_property_update(prop, NC_OBJECT | ND_DRAW, NULL);
+}
+
 void RNA_def_camera(BlenderRNA *brna)
 {
 	StructRNA *srna;
@@ -241,6 +276,13 @@ void RNA_def_camera(BlenderRNA *brna)
 	RNA_def_property_ui_text(prop, "DOF Distance", "Distance to the focus point for depth of field");
 	RNA_def_property_update(prop, NC_OBJECT | ND_DRAW, NULL);
 
+	/* Stereo Settings */
+	prop = RNA_def_property(srna, "stereo", PROP_POINTER, PROP_NONE);
+	RNA_def_property_flag(prop, PROP_NEVER_NULL);
+	RNA_def_property_pointer_sdna(prop, NULL, "stereo");
+	RNA_def_property_struct_type(prop, "CameraStereoData");
+	RNA_def_property_ui_text(prop, "Stereo", "");
+
 	/* flag */
 	prop = RNA_def_property(srna, "show_limits", PROP_BOOLEAN, PROP_NONE);
 	RNA_def_property_boolean_sdna(prop, NULL, "flag", CAM_SHOWLIMITS);
@@ -288,6 +330,11 @@ void RNA_def_camera(BlenderRNA *brna)
 	RNA_def_property_ui_text(prop, "DOF Object", "Use this object to define the depth of field focal point");
 	RNA_def_property_update(prop, NC_OBJECT | ND_DRAW, NULL);
 
+	/* Nested Data  */
+	RNA_define_animate_sdna(true);
+	/* *** Animated *** */
+	rna_def_camera_stereo_data(brna);
+
 	/* Camera API */
 	RNA_api_camera(srna);
 }




More information about the Bf-blender-cvs mailing list