[Bf-blender-cvs] [a913047] multiview: Builtin Stereo Camera: replace hack cameras to a real matrix approach

Dalai Felinto noreply at git.blender.org
Sat Sep 20 15:57:01 CEST 2014


Commit: a913047549fce018ec1830b0cde6b44271ff1725
Author: Dalai Felinto
Date:   Fri Sep 19 15:45:34 2014 +0200
Branches: multiview
https://developer.blender.org/rBa913047549fce018ec1830b0cde6b44271ff1725

Builtin Stereo Camera: replace hack cameras to a real matrix approach

Note: Cycles is not working with this yet

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

M	source/blender/blenkernel/BKE_camera.h
M	source/blender/blenkernel/BKE_scene.h
M	source/blender/blenkernel/intern/camera.c
M	source/blender/blenkernel/intern/scene.c
M	source/blender/blenlib/BLI_threads.h
M	source/blender/blenlib/intern/threads.c
M	source/blender/compositor/operations/COM_OutputFileOperation.cpp
M	source/blender/editors/include/ED_view3d.h
M	source/blender/editors/render/render_internal.c
M	source/blender/editors/render/render_opengl.c
M	source/blender/editors/space_view3d/view3d_draw.c
M	source/blender/makesrna/intern/rna_render.c
M	source/blender/render/extern/include/RE_pipeline.h
M	source/blender/render/intern/include/render_types.h
M	source/blender/render/intern/source/convertblender.c
M	source/blender/render/intern/source/initrender.c
M	source/blender/render/intern/source/pipeline.c
M	source/blender/render/intern/source/render_result.c
M	source/blenderplayer/bad_level_call_stubs/stubs.c

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

diff --git a/source/blender/blenkernel/BKE_camera.h b/source/blender/blenkernel/BKE_camera.h
index 916e494..68ccd24 100644
--- a/source/blender/blenkernel/BKE_camera.h
+++ b/source/blender/blenkernel/BKE_camera.h
@@ -121,10 +121,10 @@ 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_multiview_basic(struct Object *camera, const bool is_left);
-void BKE_camera_stereo_matrices(struct Object *camera, float r_viewmat[4][4], float *r_shift, const bool is_left);
-
+void BKE_camera_view_matrix(struct Scene *scene, struct Object *camera, const bool is_left, float r_viewmat[4][4]);
+void BKE_camera_model_matrix(struct Scene *scene, struct Object *camera, const char *viewname, float r_modelmat[4][4]);
+struct Object *BKE_camera_render(struct Scene *scene, struct Object *camera, const char *viewname);
+float BKE_camera_stereo3d_shift_x(struct RenderData *rd, struct Object *camera, const char *viewname);
 #ifdef __cplusplus
 }
 #endif
diff --git a/source/blender/blenkernel/BKE_scene.h b/source/blender/blenkernel/BKE_scene.h
index 5b4c7ee..4716c69 100644
--- a/source/blender/blenkernel/BKE_scene.h
+++ b/source/blender/blenkernel/BKE_scene.h
@@ -155,7 +155,7 @@ bool BKE_scene_render_view_last(const struct RenderData *rd, const char *viewnam
 struct SceneRenderView *BKE_scene_render_view_findindex(const struct RenderData *rd, const int view_id);
 size_t BKE_scene_view_get_id(const struct RenderData *rd, const char *viewname);
 void BKE_scene_view_get_filepath(const struct RenderData *rd, const char *filepath, const char *view, char *r_filepath);
-void BKE_scene_view_get_suffix(const struct RenderData *rd, const char *viewname, char *r_suffix);
+const char *BKE_scene_view_get_suffix(const struct RenderData *rd, const char *viewname);
 void BKE_scene_videos_dimensions(const struct RenderData *rd, const size_t width, const size_t height, size_t *r_width, size_t *r_height);
 size_t BKE_scene_num_videos(const struct RenderData *rd);
 
diff --git a/source/blender/blenkernel/intern/camera.c b/source/blender/blenkernel/intern/camera.c
index d06ccdc..390f30e 100644
--- a/source/blender/blenkernel/intern/camera.c
+++ b/source/blender/blenkernel/intern/camera.c
@@ -602,21 +602,26 @@ bool BKE_camera_view_frame_fit_to_scene(Scene *scene, struct View3D *v3d, Object
 	}
 }
 
-/* transforms the camera matrix to the correct stereo eye to be rendered */
-void BKE_camera_multiview_basic(Object *camera, const bool is_left)
+/******************* 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 *r_shift = &data->shiftx;
 	float interocular_distance, convergence_distance;
-	float angle;
+	float angle = 0.0f;
 	short convergence_mode, pivot;
-	float tmpmat[4][4];
-
-	float rotmat[3][3];
+	float tmpviewmat[4][4];
+	float transmat[4][4];
 	float fac = 1.0f;
 	float fac_signed;
 
-	unit_m3(rotmat);
+	unit_m4(transmat);
 
 	interocular_distance = data->stereo.interocular_distance;
 	convergence_distance = data->stereo.convergence_distance;
@@ -626,9 +631,11 @@ void BKE_camera_multiview_basic(Object *camera, const bool is_left)
 	if (((pivot == CAM_S3D_PIVOT_LEFT)  &&  is_left) ||
 	    ((pivot == CAM_S3D_PIVOT_RIGHT) && !is_left))
 	{
-		return;
+		return camera_view_matrix(camera, r_viewmat);
 	}
 
+	invert_m4_m4(tmpviewmat, camera->obmat);
+
 	if (pivot == CAM_S3D_PIVOT_CENTER)
 		fac = 0.5f;
 
@@ -637,61 +644,53 @@ void BKE_camera_multiview_basic(Object *camera, const bool is_left)
 	/* rotation */
 	if (convergence_mode == CAM_S3D_TOE) {
 		float angle_sin, angle_cos;
-		angle = -atanf((interocular_distance * 0.5f) / convergence_distance);
+		angle = atanf((interocular_distance * 0.5f) / convergence_distance);
 
 		angle_cos = cosf(angle * 2.0f * fac_signed);
 		angle_sin = sinf(angle * 2.0f * fac_signed);
 
-		rotmat[0][0] =  angle_cos;
-		rotmat[2][0] = -angle_sin;
-		rotmat[0][2] =  angle_sin;
-		rotmat[2][2] =  angle_cos;
-	}
-	else {
-		angle = 0.0f;
+		transmat[0][0] =  angle_cos;
+		transmat[2][0] = -angle_sin;
+		transmat[0][2] =  angle_sin;
+		transmat[2][2] =  angle_cos;
 	}
 
-	copy_m4_m4(tmpmat, camera->obmat);
-	mul_m4_m4m3(camera->obmat, tmpmat, rotmat);
-
 	/* translation */
-	translate_m4(camera->obmat,
-	             -interocular_distance * cosf(angle) * fac_signed, 0.0f,
-	             interocular_distance  * sinf(angle) * fac_signed);
+	transmat[3][0] = cosf(angle) * interocular_distance * fac_signed;
+	transmat[3][2] = sinf(angle) * interocular_distance * fac_signed;
 
-	/* prepare the camera shift for the projection matrix */
-	/* Note: in viewport, parallel renders as offaxis, but in render it does parallel */
-	if (convergence_mode == CAM_S3D_OFFAXIS) {
-		*r_shift += ((interocular_distance / data->sensor_x) * (data->lens / convergence_distance)) * fac_signed;
-	}
+	/* apply */
+	mul_m4_m4m4(r_viewmat, transmat, tmpviewmat);
 }
 
-void BKE_camera_stereo_matrices(Object *camera, float r_viewmat[4][4], float *r_shift, const bool is_left)
+static void camera_model_matrix(Object *camera, float r_modelmat[4][4])
 {
-	/* viewmat = MODELVIEW_MATRIX */
-	Camera *data = camera->data;
+	copy_m4_m4(r_modelmat, camera->obmat);
+}
+
+static void camera_stereo3d_model_matrix(Object *camera, const bool is_left, float r_modelmat[4][4])
+{
+	Camera *data = (Camera *)camera->data;
 	float interocular_distance, convergence_distance;
-	float angle;
+	float angle = 0.0f;
 	short convergence_mode, pivot;
-	float tmpviewmat[4][4];
-	float transmat[4][4];
+	float tmpmat[4][4];
+
+	float rotmat[3][3];
 	float fac = 1.0f;
 	float fac_signed;
 
-	unit_m4(transmat);
+	unit_m3(rotmat);
 
 	interocular_distance = data->stereo.interocular_distance;
 	convergence_distance = data->stereo.convergence_distance;
 	convergence_mode = data->stereo.convergence_mode;
 	pivot = data->stereo.pivot;
 
-	invert_m4_m4(tmpviewmat, camera->obmat);
-
-	if (((pivot == CAM_S3D_PIVOT_LEFT)  &&  is_left) ||
+	if (((pivot == CAM_S3D_PIVOT_LEFT) && is_left) ||
 	    ((pivot == CAM_S3D_PIVOT_RIGHT) && !is_left))
 	{
-		copy_m4_m4(r_viewmat, tmpviewmat);
-		return;
+		return camera_model_matrix(camera, r_modelmat);
 	}
 
 	if (pivot == CAM_S3D_PIVOT_CENTER)
@@ -702,35 +701,70 @@ void BKE_camera_stereo_matrices(Object *camera, float r_viewmat[4][4], float *r_
 	/* rotation */
 	if (convergence_mode == CAM_S3D_TOE) {
 		float angle_sin, angle_cos;
-		angle = atanf((interocular_distance * 0.5f) / convergence_distance);
+		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;
-	}
-	else {
-		angle = 0.0f;
+		rotmat[0][0] =  angle_cos;
+		rotmat[2][0] = -angle_sin;
+		rotmat[0][2] =  angle_sin;
+		rotmat[2][2] =  angle_cos;
 	}
 
+	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]);
+
 	/* translation */
-	transmat[3][0] = cosf(angle) * interocular_distance * fac_signed;
-	transmat[3][2] = sinf(angle) * interocular_distance * fac_signed;
+	translate_m4(r_modelmat,
+	             -interocular_distance * cosf(angle) * fac_signed, 0.0f,
+	             interocular_distance  * sinf(angle) * fac_signed);
+}
 
-	/* apply */
-	mul_m4_m4m4(r_viewmat, transmat, tmpviewmat);
+void BKE_camera_view_matrix(Scene *scene, Object *camera, const bool is_left, float r_viewmat[4][4])
+{
+	const bool is_multiview = (scene->r.scemode & R_MULTIVIEW);
 
-	/* 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)) {
-		*r_shift += (interocular_distance / data->sensor_x) * (data->lens / convergence_distance) * fac_signed;
+	if (!is_multiview) {
+		return camera_view_matrix(camera, r_viewmat);
+	}
+	else if (scene->r.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);
+	}
+}
+
+/* left is the default */
+static bool camera_is_left(const char *viewname)
+{
+	if (viewname && viewname[0] != '\0') {
+		return !STREQ(viewname, STEREO_RIGHT_NAME);
+	}
+	return true;
+}
+
+void BKE_camera_model_matrix(Scene *scene, Object *camera, const char *viewname, float r_modelmat[4][4])
+{
+	const bool is_multiview = (scene->r.scemode & R_MULTIVIEW);
+
+	if (!is_multiview) {
+		return camera_model_matrix(camera, r_modelmat);
+	}
+	else if (scene->r.views_setup == SCE_VIEWS_SETUP_ADVANCED) {
+		return camera_model_matrix(camera, r_modelmat);
+	}
+	else { /* SCE_VIEWS_SETUP_BASIC */
+		const bool is_left = camera_is_left(viewname);
+		return camera_stereo3d_model_matrix(camera, is_left, r_modelmat);
 	}
 }
 
-Object *BKE_camera_multiview_advanced(Scene *scene, RenderData *rd, Object *camera, const char *suffix)
+static Object *camera_multiview_advanced(Scene *scene, Object *camera, const char *suffix)
 {
 	SceneRenderView *srv;
 	char name[MAX_NAME];
@@ -739,7 +773,7 @@ Object *BKE_camera_multiview_advanced(Scene *scene, RenderData *rd, Object *came
 
 	name[0] = '\0';
 
-	for (srv = rd->views.first; srv; srv = srv->next) {
+	for (srv = scene->r.views.first; srv; srv = srv->next) {
 		const int len_suffix = strlen(srv->suffix);
 
 		if (len_name < len_suffix)
@@ -761,3 +795,75 @@ Object *BKE_camera_multiview_advanced(Scene *scene, RenderData *rd, Object *came
 	return camera;
 }

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list