[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