[Bf-blender-cvs] [506dfd6] HMD_viewport: Only allow using Device IPD if it's available

Julian Eisel noreply at git.blender.org
Wed Jun 8 19:44:56 CEST 2016


Commit: 506dfd65eb95f6bcae434505dc0ade43ebe82120
Author: Julian Eisel
Date:   Wed Jun 8 19:42:03 2016 +0200
Branches: HMD_viewport
https://developer.blender.org/rB506dfd65eb95f6bcae434505dc0ade43ebe82120

Only allow using Device IPD if it's available

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

M	intern/ghost/intern/GHOST_OpenHMDManager.cpp
M	source/blender/blenkernel/intern/camera.c
M	source/blender/makesrna/intern/rna_camera.c

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

diff --git a/intern/ghost/intern/GHOST_OpenHMDManager.cpp b/intern/ghost/intern/GHOST_OpenHMDManager.cpp
index fd103a0..5228bf4 100644
--- a/intern/ghost/intern/GHOST_OpenHMDManager.cpp
+++ b/intern/ghost/intern/GHOST_OpenHMDManager.cpp
@@ -402,6 +402,9 @@ float GHOST_OpenHMDManager::getRightEyeAspectRatio() const
 	return val;
 }
 
+/**
+ * \returns -1 if not found.
+ */
 float GHOST_OpenHMDManager::getEyeIPD() const
 {
 	if (!m_device) {
diff --git a/source/blender/blenkernel/intern/camera.c b/source/blender/blenkernel/intern/camera.c
index 23a8cea..b733460 100644
--- a/source/blender/blenkernel/intern/camera.c
+++ b/source/blender/blenkernel/intern/camera.c
@@ -719,7 +719,9 @@ static void camera_model_matrix(Object *camera, float r_modelmat[4][4])
 	copy_m4_m4(r_modelmat, camera->obmat);
 }
 
-static void camera_stereo3d_model_matrix(Object *camera, const bool is_left, float r_modelmat[4][4])
+static void camera_stereo3d_model_matrix(
+        Object *camera, const bool is_left, const bool is_hmd,
+        float r_modelmat[4][4])
 {
 	Camera *data = (Camera *)camera->data;
 	float sizemat[4][4];
@@ -727,16 +729,21 @@ static void camera_stereo3d_model_matrix(Object *camera, const bool is_left, flo
 	float fac = 1.0f;
 	float fac_signed;
 
-	const float interocular_distance =
-#ifdef WITH_INPUT_HMD
-	        (data->stereo.flag & CAM_S3D_CUSTOM_IPD) ? WM_device_HMD_IPD_get() : data->stereo.interocular_distance;
-#else
-	        data->stereo.interocular_distance;
-#endif
+	float interocular_distance = data->stereo.interocular_distance;
 	const float convergence_distance = data->stereo.convergence_distance;
 	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 && 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;
+		}
+	}
+#endif
+
 	if (((pivot == CAM_S3D_PIVOT_LEFT) && is_left) ||
 	    ((pivot == CAM_S3D_PIVOT_RIGHT) && !is_left))
 	{
@@ -847,7 +854,7 @@ void BKE_camera_multiview_model_matrix(RenderData *rd, Object *camera, const cha
 	}
 	else { /* SCE_VIEWS_SETUP_BASIC */
 		const bool is_left = camera_is_left(viewname);
-		camera_stereo3d_model_matrix(camera, is_left, r_modelmat);
+		camera_stereo3d_model_matrix(camera, is_left, rd->views_format == SCE_VIEWS_FORMAT_HMD, r_modelmat);
 	}
 	normalize_m4(r_modelmat);
 }
diff --git a/source/blender/makesrna/intern/rna_camera.c b/source/blender/makesrna/intern/rna_camera.c
index c544449..54df6bc 100644
--- a/source/blender/makesrna/intern/rna_camera.c
+++ b/source/blender/makesrna/intern/rna_camera.c
@@ -42,6 +42,20 @@
 #include "BKE_object.h"
 #include "BKE_depsgraph.h"
 
+#include "WM_api.h"
+
+static int rna_camera_stereo_use_device_ipd_editeable(PointerRNA *ptr)
+{
+#ifdef WITH_INPUT_HMD
+	if (U.hmd_device == -1 || WM_device_HMD_IPD_get() == -1) {
+		Camera *cam = ptr->id.data;
+		cam->stereo.flag |= CAM_S3D_CUSTOM_IPD;
+		return false;
+	}
+#endif
+	return PROP_EDITABLE;
+}
+
 static float rna_Camera_angle_get(PointerRNA *ptr)
 {
 	Camera *cam = ptr->id.data;
@@ -134,6 +148,7 @@ static void rna_def_camera_stereo_data(BlenderRNA *brna)
 	RNA_def_property_boolean_negative_sdna(prop, NULL, "flag", CAM_S3D_CUSTOM_IPD);
 	RNA_def_property_ui_text(prop, "Interocular Distance from HMD",
 	                         "Request the interocular distance (distance between eyes) from the HMD driver");
+	RNA_def_property_editable_func(prop, "rna_camera_stereo_use_device_ipd_editeable");
 	RNA_def_property_update(prop, NC_OBJECT | ND_DRAW, NULL);
 
 	prop = RNA_def_property(srna, "interocular_distance", PROP_FLOAT, PROP_DISTANCE);




More information about the Bf-blender-cvs mailing list