[Bf-blender-cvs] [ed34f17] HMD_viewport: Refactor HMD->Camera relation, avoid low-level call

Julian Eisel noreply at git.blender.org
Tue Oct 11 18:07:15 CEST 2016


Commit: ed34f176042acd114a403e60197f467f43563b68
Author: Julian Eisel
Date:   Tue Oct 11 18:05:11 2016 +0200
Branches: HMD_viewport
https://developer.blender.org/rBed34f176042acd114a403e60197f467f43563b68

Refactor HMD->Camera relation, avoid low-level call

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

M	intern/ghost/intern/GHOST_C-api.cpp
M	source/blender/blenkernel/BKE_camera.h
M	source/blender/blenkernel/CMakeLists.txt
M	source/blender/blenkernel/intern/camera.c
M	source/blender/editors/space_view3d/view3d_draw.c
M	source/blender/makesdna/DNA_camera_types.h
M	source/blender/windowmanager/WM_api.h
M	source/blender/windowmanager/intern/wm_device.c

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

diff --git a/intern/ghost/intern/GHOST_C-api.cpp b/intern/ghost/intern/GHOST_C-api.cpp
index 544ce04..df31127 100644
--- a/intern/ghost/intern/GHOST_C-api.cpp
+++ b/intern/ghost/intern/GHOST_C-api.cpp
@@ -1009,7 +1009,7 @@ float GHOST_HMDgetDeviceIPD()
 	GHOST_OpenHMDManager *ohmd = system->getOpenHMDManager();
 	return ohmd->getEyeIPD();
 #else
-	return 0.0f;
+	return -1.0f;
 #endif
 }
 
diff --git a/source/blender/blenkernel/BKE_camera.h b/source/blender/blenkernel/BKE_camera.h
index eee7271..3015b46 100644
--- a/source/blender/blenkernel/BKE_camera.h
+++ b/source/blender/blenkernel/BKE_camera.h
@@ -140,9 +140,9 @@ void BKE_camera_to_gpu_dof(struct Object *camera, struct GPUFXSettings *r_fx_set
 /* Camera multi-view API */
 
 struct Object *BKE_camera_multiview_render(struct Scene *scene, struct Object *camera, const char *viewname);
-void           BKE_camera_multiview_view_matrix(struct RenderData *rd, struct Object *camera, const bool is_left, const bool is_hmd_view, float r_viewmat[4][4]);
+void           BKE_camera_multiview_view_matrix(struct RenderData *rd, struct Object *camera, const bool is_left, const float interocular_distance_override, float r_viewmat[4][4]);
 void           BKE_camera_multiview_proj_matrix(const bool is_left, float r_projmat[4][4]);
-void           BKE_camera_multiview_model_matrix_ex(struct RenderData *rd, struct Object *camera, const char *viewname, const bool is_hmd_view, float r_modelmat[4][4]);
+void           BKE_camera_multiview_model_matrix_ex(struct RenderData *rd, struct Object *camera, const char *viewname, const float interocular_distance_override, float r_modelmat[4][4]);
 void           BKE_camera_multiview_model_matrix(struct RenderData *rd, struct Object *camera, const char *viewname, float r_modelmat[4][4]);
 float          BKE_camera_multiview_shift_x(struct RenderData *rd, struct Object *camera, const char *viewname);
 void           BKE_camera_multiview_params(struct RenderData *rd, struct CameraParams *params, struct Object *camera, const char *viewname);
diff --git a/source/blender/blenkernel/CMakeLists.txt b/source/blender/blenkernel/CMakeLists.txt
index e683af7..87244a7 100644
--- a/source/blender/blenkernel/CMakeLists.txt
+++ b/source/blender/blenkernel/CMakeLists.txt
@@ -40,7 +40,6 @@ set(INC
 	../nodes
 	../physics
 	../render/extern/include
-	../windowmanager # XXX
 	../../../intern/ghost
 	../../../intern/guardedalloc
 	../../../intern/glew-mx
diff --git a/source/blender/blenkernel/intern/camera.c b/source/blender/blenkernel/intern/camera.c
index 860ff3a..2aff9bd 100644
--- a/source/blender/blenkernel/intern/camera.c
+++ b/source/blender/blenkernel/intern/camera.c
@@ -57,8 +57,6 @@
 
 #include "GPU_compositing.h"
 
-#include "WM_api.h" /* XXX */
-
 /****************************** Camera Datablock *****************************/
 
 void BKE_camera_init(Camera *cam)
@@ -677,7 +675,7 @@ static void camera_model_matrix(Object *camera, float r_modelmat[4][4])
 }
 
 static void camera_stereo3d_model_matrix(
-        Object *camera, const bool is_left, const bool is_hmd_view,
+        Object *camera, const bool is_left, const float interocular_distance_override,
         float r_modelmat[4][4])
 {
 	Camera *data = (Camera *)camera->data;
@@ -686,23 +684,11 @@ static void camera_stereo3d_model_matrix(
 	float fac = 1.0f;
 	float fac_signed;
 
-	float interocular_distance = data->stereo.interocular_distance;
-	const float convergence_distance = data->stereo.convergence_distance;
+	const float interocular_distance = interocular_distance_override == -1.0f ?
+	                                       data->stereo.interocular_distance : interocular_distance_override;
 	const short convergence_mode = data->stereo.convergence_mode;
 	const short pivot = data->stereo.pivot;
 
-#ifdef WITH_INPUT_HMD
-	/* Try to get the interocular distance from the HMD */
-	if (is_hmd_view && U.hmd_device != -1 && !(data->stereo.flag & CAM_S3D_CUSTOM_IPD)) {
-		const float device_ipd = WM_device_HMD_IPD_get();
-		if (device_ipd != -1) {
-			interocular_distance = device_ipd;
-		}
-	}
-#else
-	UNUSED_VARS(is_hmd_view);
-#endif
-
 	if (((pivot == CAM_S3D_PIVOT_LEFT) && is_left) ||
 	    ((pivot == CAM_S3D_PIVOT_RIGHT) && !is_left))
 	{
@@ -721,12 +707,8 @@ static void camera_stereo3d_model_matrix(
 	fac_signed = is_left ? fac : -fac;
 
 	/* rotation */
-	if (convergence_mode == CAM_S3D_TOE
-#ifdef WITH_INPUT_HMD
-	    && !is_hmd_view
-#endif
-	    )
-	{
+	if (convergence_mode == CAM_S3D_TOE) {
+		const float convergence_distance = data->stereo.convergence_distance;
 		float angle;
 		float angle_sin, angle_cos;
 		float toeinmat[4][4];
@@ -792,33 +774,14 @@ static void camera_stereo3d_model_matrix(
 
 /* the view matrix is used by the viewport drawing, it is basically the inverted model matrix */
 void BKE_camera_multiview_view_matrix(
-        RenderData *rd, Object *camera, const bool is_left, const bool is_hmd_view,
+        RenderData *rd, Object *camera, const bool is_left, const float interocular_distance_override,
         float r_viewmat[4][4])
 {
 	BKE_camera_multiview_model_matrix_ex(rd, camera, is_left ? STEREO_LEFT_NAME : STEREO_RIGHT_NAME,
-	                                     is_hmd_view, r_viewmat);
+	                                     interocular_distance_override, r_viewmat);
 	invert_m4(r_viewmat);
 }
 
-/* get the projection matrix for HMD */
-void BKE_camera_multiview_proj_matrix(const bool is_left, float r_projmat[4][4])
-{
-#ifdef WITH_INPUT_HMD
-	/* set projection matrix from hmd */
-	if (U.hmd_device != -1) {
-		if (is_left) {
-			WM_device_HMD_left_projection_matrix_get(r_projmat);
-		}
-		else {
-			WM_device_HMD_right_projection_matrix_get(r_projmat);
-		}
-		//transpose_m4(r_projmat);
-	}
-#else
-	UNUSED_VARS(is_left, r_projmat);
-#endif
-}
-
 /* left is the default */
 static bool camera_is_left(const char *viewname)
 {
@@ -829,7 +792,7 @@ static bool camera_is_left(const char *viewname)
 }
 
 void BKE_camera_multiview_model_matrix_ex(
-        RenderData *rd, Object *camera, const char *viewname, const bool is_hmd_view,
+        RenderData *rd, Object *camera, const char *viewname, const float interocular_distance_override,
         float r_modelmat[4][4])
 {
 	const bool is_multiview = (rd && rd->scemode & R_MULTIVIEW) != 0;
@@ -842,14 +805,14 @@ void BKE_camera_multiview_model_matrix_ex(
 	}
 	else { /* SCE_VIEWS_SETUP_BASIC */
 		const bool is_left = camera_is_left(viewname);
-		camera_stereo3d_model_matrix(camera, is_left, is_hmd_view, r_modelmat);
+		camera_stereo3d_model_matrix(camera, is_left, interocular_distance_override, r_modelmat);
 	}
 	normalize_m4(r_modelmat);
 }
 
 void BKE_camera_multiview_model_matrix(RenderData *rd, Object *camera, const char *viewname, float r_modelmat[4][4])
 {
-	BKE_camera_multiview_model_matrix_ex(rd, camera, viewname, false, r_modelmat);
+	BKE_camera_multiview_model_matrix_ex(rd, camera, viewname, -1.0f, r_modelmat);
 }
 
 bool BKE_camera_multiview_spherical_stereo(RenderData *rd, Object *camera)
diff --git a/source/blender/editors/space_view3d/view3d_draw.c b/source/blender/editors/space_view3d/view3d_draw.c
index 7f8c139..bd2fe7d 100644
--- a/source/blender/editors/space_view3d/view3d_draw.c
+++ b/source/blender/editors/space_view3d/view3d_draw.c
@@ -3770,20 +3770,29 @@ static void view3d_stereo3d_setup(Scene *scene, View3D *v3d, ARegion *ar, const
 	viewname = names[is_left ? STEREO_LEFT_ID : STEREO_RIGHT_ID];
 
 	/* update the viewport matrices with the new camera */
+#ifdef WITH_INPUT_HMD
 	if (is_hmd_view) {
+		Camera *data = v3d->camera->data;
+		short convergence_mode = data->stereo.convergence_mode;
+		float ipd_override = (U.hmd_device != -1 && (scene->hmd_settings.flag & HMDVIEW_USE_DEVICE_IPD)) ?
+		                         WM_device_HMD_IPD_get() : scene->hmd_settings.interocular_distance;
 		float viewmat[4][4];
 		float projmat[4][4];
 
 		BLI_lock_thread(LOCK_VIEW3D);
+		data->stereo.convergence_mode = CAM_S3D_PARALLEL;
 
-		BKE_camera_multiview_view_matrix(&scene->r, v3d->camera, is_left, is_hmd_view, viewmat);
-		BKE_camera_multiview_proj_matrix(is_left, projmat);
+		BKE_camera_multiview_view_matrix(&scene->r, v3d->camera, is_left, ipd_override, viewmat);
+		WM_device_HMD_projection_matrix_get(is_left, projmat);
 
 		view3d_main_region_setup_view(scene, v3d, ar, viewmat, projmat);
 
+		data->stereo.convergence_mode = convergence_mode;
 		BLI_unlock_thread(LOCK_VIEW3D);
 	}
-	else if (scene->r.views_format == SCE_VIEWS_FORMAT_STEREO_3D) {
+	else
+#endif
+	if (scene->r.views_format == SCE_VIEWS_FORMAT_STEREO_3D) {
 		Camera *data;
 		float viewmat[4][4];
 		float shiftx;
@@ -3794,7 +3803,7 @@ static void view3d_stereo3d_setup(Scene *scene, View3D *v3d, ARegion *ar, const
 		BLI_lock_thread(LOCK_VIEW3D);
 		data->shiftx = BKE_camera_multiview_shift_x(&scene->r, v3d->camera, viewname);
 
-		BKE_camera_multiview_view_matrix(&scene->r, v3d->camera, is_left, is_hmd_view, viewmat);
+		BKE_camera_multiview_view_matrix(&scene->r, v3d->camera, is_left, -1.0f, viewmat);
 
 		view3d_main_region_setup_view(scene, v3d, ar, viewmat, NULL);
 
@@ -3809,7 +3818,7 @@ static void view3d_stereo3d_setup(Scene *scene, View3D *v3d, ARegion *ar, const
 		BLI_lock_thread(LOCK_VIEW3D);
 		v3d->camera = camera;
 
-		BKE_camera_multiview_view_matrix(&scene->r, camera, false, is_hmd_view, viewmat);
+		BKE_camera_multiview_view_matrix(&scene->r, camera, false, -1.0f, viewmat);
 		view3d_main_region_setup_view(scene, v3d, ar, viewmat, NULL);
 
 		v3d->camera = view_ob;
@@ -3825,15 +3834,14 @@ static void view3d_stereo3d_setup_offscreen(Scene *scene, View3D *v3d, ARegion *
 		float viewmat[4][4];
 		const bool is_left = STREQ(viewname, STEREO_LEFT_NAME);
 
-		BKE_camera_multiview_view_matrix(&scene->r, v3d->camera, is_left, false, viewmat);
-		BKE_camera_multiview_proj_matrix(is_left, winmat);
+		BKE_camera_multiview_view_matrix(&scene->r, v3d->camera, is_left, -1.0f, viewmat);
 		view3d_main_region_setup_view(scene, v3d, ar, viewmat, winmat);
 	}
 	else { /* SCE_VIEWS_FORMAT_MULTIVIEW */
 		float viewmat[4][4];
 		Object *camera = BKE_camera_multiview_render(scene, v3d->camera, viewname);
 
-		BKE_camera_multiview_view_matrix(&scene->r, camera, false, false, viewm

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list