[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