[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