[Bf-blender-cvs] [03e8afd] HMD_viewport: Option to request interocular distance from HMD driver

Julian Eisel noreply at git.blender.org
Mon Mar 28 12:43:33 CEST 2016


Commit: 03e8afdb8d93fca90ce2c5137aa67f01f301746c
Author: Julian Eisel
Date:   Mon Mar 28 12:27:13 2016 +0200
Branches: HMD_viewport
https://developer.blender.org/rB03e8afdb8d93fca90ce2c5137aa67f01f301746c

Option to request interocular distance from HMD driver

Adds a new camera option to request the interocular distance (IPD) from the HMD device/driver. It's still an open design question if it's even worth to support a custom distance though.

Also hides convergence options for HMD mode, not sure if those are needed.

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

M	intern/ghost/GHOST_C-api.h
M	intern/ghost/intern/GHOST_C-api.cpp
M	release/scripts/startup/bl_ui/properties_data_camera.py
M	source/blender/blenkernel/intern/camera.c
M	source/blender/makesdna/DNA_camera_types.h
M	source/blender/makesrna/intern/rna_camera.c
M	source/blender/windowmanager/WM_api.h
M	source/blender/windowmanager/intern/wm_stereo.c

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

diff --git a/intern/ghost/GHOST_C-api.h b/intern/ghost/GHOST_C-api.h
index adeea2b..73a2e3e 100644
--- a/intern/ghost/GHOST_C-api.h
+++ b/intern/ghost/GHOST_C-api.h
@@ -930,8 +930,9 @@ extern void GHOST_BeginIME(GHOST_WindowHandle windowhandle,
  */
 extern void GHOST_EndIME(GHOST_WindowHandle windowhandle);
 
-extern void GHOST_HMDopenDevice(int index);
-extern void GHOST_HMDcloseDevice(void);
+extern void  GHOST_HMDopenDevice(int index);
+extern void  GHOST_HMDcloseDevice(void);
+extern float GHOST_HMDgetDeviceIPD(void);
 
 #ifdef __cplusplus
 }
diff --git a/intern/ghost/intern/GHOST_C-api.cpp b/intern/ghost/intern/GHOST_C-api.cpp
index 1e725d7..13abbdd 100644
--- a/intern/ghost/intern/GHOST_C-api.cpp
+++ b/intern/ghost/intern/GHOST_C-api.cpp
@@ -949,4 +949,11 @@ void GHOST_HMDcloseDevice()
 	ohmd->closeDevice();
 }
 
-#endif
\ No newline at end of file
+float GHOST_HMDgetDeviceIPD()
+{
+	GHOST_ISystem *system = GHOST_ISystem::getSystem();
+	GHOST_OpenHMDManager *ohmd = system->getOpenHMDManager();
+	return ohmd->getEyeIPD();
+}
+
+#endif
diff --git a/release/scripts/startup/bl_ui/properties_data_camera.py b/release/scripts/startup/bl_ui/properties_data_camera.py
index 471adf2..d5ece91 100644
--- a/release/scripts/startup/bl_ui/properties_data_camera.py
+++ b/release/scripts/startup/bl_ui/properties_data_camera.py
@@ -151,21 +151,28 @@ class DATA_PT_camera_stereoscopy(CameraButtonsPanel, Panel):
         st = context.camera.stereo
         cam = context.camera
 
+        col = layout.column()
+
         is_spherical_stereo = cam.type != 'ORTHO' and render.use_spherical_stereo
         use_spherical_stereo = is_spherical_stereo and st.use_spherical_stereo
 
-        col = layout.column()
-        col.row().prop(st, "convergence_mode", expand=True)
+        if render.views_format == 'HMD':
+            col.prop(st, "use_device_ipd")
+            subcol = col.column()
+            subcol.active = not st.use_device_ipd
+            subcol.prop(st, "interocular_distance")
+        else:
+            col.row().prop(st, "convergence_mode", expand=True)
 
-        sub = col.column()
-        sub.active = st.convergence_mode != 'PARALLEL'
-        sub.prop(st, "convergence_distance")
+            sub = col.column()
+            sub.active = st.convergence_mode != 'PARALLEL'
+            sub.prop(st, "convergence_distance")
 
-        col.prop(st, "interocular_distance")
+            col.prop(st, "interocular_distance")
 
-        if is_spherical_stereo:
-            col.separator()
-            col.prop(st, "use_spherical_stereo")
+            if is_spherical_stereo:
+                col.separator()
+                col.prop(st, "use_spherical_stereo")
 
         col.label(text="Pivot:")
         row = col.row()
diff --git a/source/blender/blenkernel/intern/camera.c b/source/blender/blenkernel/intern/camera.c
index 6fd756e..679342a 100644
--- a/source/blender/blenkernel/intern/camera.c
+++ b/source/blender/blenkernel/intern/camera.c
@@ -55,6 +55,8 @@
 
 #include "GPU_compositing.h"
 
+#include "WM_api.h"
+
 /****************************** Camera Datablock *****************************/
 
 void BKE_camera_init(Camera *cam)
@@ -718,17 +720,16 @@ static void camera_model_matrix(Object *camera, float r_modelmat[4][4])
 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;
-	short convergence_mode, pivot;
 	float sizemat[4][4];
 
 	float fac = 1.0f;
 	float fac_signed;
 
-	interocular_distance = data->stereo.interocular_distance;
-	convergence_distance = data->stereo.convergence_distance;
-	convergence_mode = data->stereo.convergence_mode;
-	pivot = data->stereo.pivot;
+	const bool use_device_ipd = data->stereo.flag & CAM_S3D_CUSTOM_IPD;
+	float interocular_distance = use_device_ipd ? WM_HMD_device_IPD_get() : data->stereo.interocular_distance;
+	float convergence_distance = data->stereo.convergence_distance;
+	short convergence_mode = data->stereo.convergence_mode;
+	short pivot = data->stereo.pivot;
 
 	if (((pivot == CAM_S3D_PIVOT_LEFT) && is_left) ||
 	    ((pivot == CAM_S3D_PIVOT_RIGHT) && !is_left))
diff --git a/source/blender/makesdna/DNA_camera_types.h b/source/blender/makesdna/DNA_camera_types.h
index 7f2e1aa..bb6447d 100644
--- a/source/blender/makesdna/DNA_camera_types.h
+++ b/source/blender/makesdna/DNA_camera_types.h
@@ -152,6 +152,7 @@ enum {
 /* stereo->flag */
 enum {
 	CAM_S3D_SPHERICAL       = (1 << 0),
+	CAM_S3D_CUSTOM_IPD      = (1 << 1),
 };
 
 #ifdef __cplusplus
diff --git a/source/blender/makesrna/intern/rna_camera.c b/source/blender/makesrna/intern/rna_camera.c
index d5044ec..5fa997d 100644
--- a/source/blender/makesrna/intern/rna_camera.c
+++ b/source/blender/makesrna/intern/rna_camera.c
@@ -130,6 +130,12 @@ static void rna_def_camera_stereo_data(BlenderRNA *brna)
 	RNA_def_property_ui_text(prop, "Pivot", "");
 	RNA_def_property_update(prop, NC_OBJECT | ND_DRAW, NULL);
 
+	prop = RNA_def_property(srna, "use_device_ipd", PROP_BOOLEAN, PROP_NONE);
+	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_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);
diff --git a/source/blender/windowmanager/WM_api.h b/source/blender/windowmanager/WM_api.h
index 6ce9da7..7df4182 100644
--- a/source/blender/windowmanager/WM_api.h
+++ b/source/blender/windowmanager/WM_api.h
@@ -108,6 +108,8 @@ bool		WM_is_draw_triple(struct wmWindow *win);
 
 bool		WM_stereo3d_enabled(const struct bContext *C, struct wmWindow *win, bool only_fullscreen_test);
 
+float		WM_HMD_device_IPD_get(void);
+
 
 			/* files */
 void		WM_file_autoexec_init(const char *filepath);
diff --git a/source/blender/windowmanager/intern/wm_stereo.c b/source/blender/windowmanager/intern/wm_stereo.c
index 4d6c3ed..0c8a530 100644
--- a/source/blender/windowmanager/intern/wm_stereo.c
+++ b/source/blender/windowmanager/intern/wm_stereo.c
@@ -395,6 +395,20 @@ bool WM_stereo3d_enabled(const bContext *C, wmWindow *win, bool skip_stereo3d_ch
 	return true;
 }
 
+/**
+ * Wrapper around ghost function to get IPD from currently opened HMD.
+ *
+ * Review note: Maybe worth adding wm_device.c?
+ */
+float WM_HMD_device_IPD_get()
+{
+#ifdef WITH_OPENHMD
+	return GHOST_HMDgetDeviceIPD();
+#else
+	return 0.0f;
+#endif
+}
+
 /************************** Stereo 3D operator **********************************/
 typedef struct Stereo3dData {
 	Stereo3dFormat stereo3d_format;




More information about the Bf-blender-cvs mailing list