[Bf-blender-cvs] [7a7ee11f13d] xr-controller-support: XR: Direction lock, frame based speed fly options
Peter Kim
noreply at git.blender.org
Sat Jul 3 06:08:18 CEST 2021
Commit: 7a7ee11f13d06ebf688e7060fcdde0257a229ecf
Author: Peter Kim
Date: Sat Jul 3 13:05:10 2021 +0900
Branches: xr-controller-support
https://developer.blender.org/rB7a7ee11f13d06ebf688e7060fcdde0257a229ecf
XR: Direction lock, frame based speed fly options
===================================================================
M source/blender/windowmanager/xr/intern/wm_xr_operators.c
===================================================================
diff --git a/source/blender/windowmanager/xr/intern/wm_xr_operators.c b/source/blender/windowmanager/xr/intern/wm_xr_operators.c
index 365537b5cf6..195860da221 100644
--- a/source/blender/windowmanager/xr/intern/wm_xr_operators.c
+++ b/source/blender/windowmanager/xr/intern/wm_xr_operators.c
@@ -53,6 +53,8 @@
#include "MEM_guardedalloc.h"
+#include "PIL_time.h"
+
#include "RNA_access.h"
#include "RNA_define.h"
@@ -759,6 +761,26 @@ typedef enum eXrFlyMode {
XR_FLY_CONTROLLER_FORWARD = 12,
} eXrFlyMode;
+typedef struct XrFlyData {
+ float viewer_rot[4];
+ double time_prev;
+} XrFlyData;
+
+static void wm_xr_fly_init(wmOperator *op, const wmXrData *xr)
+{
+ BLI_assert(op->customdata == NULL);
+
+ XrFlyData *data = op->customdata = MEM_callocN(sizeof(XrFlyData), __func__);
+
+ WM_xr_session_state_viewer_pose_rotation_get(xr, data->viewer_rot);
+ data->time_prev = PIL_check_seconds_timer();
+}
+
+static void wm_xr_fly_uninit(wmOperator *op)
+{
+ MEM_SAFE_FREE(op->customdata);
+}
+
static void wm_xr_fly_compute_move(eXrFlyMode mode,
float speed,
const float ref_quat[4],
@@ -869,13 +891,13 @@ static int wm_xr_navigation_fly_invoke_3d(bContext *C, wmOperator *op, const wmE
return OPERATOR_PASS_THROUGH;
}
- int retval = op->type->modal_3d(C, op, event);
+ wmWindowManager *wm = CTX_wm_manager(C);
- if ((retval & OPERATOR_RUNNING_MODAL) != 0) {
- WM_event_add_modal_handler(C, op);
- }
+ wm_xr_fly_init(op, &wm->xr);
- return retval;
+ WM_event_add_modal_handler(C, op);
+
+ return OPERATOR_RUNNING_MODAL;
}
static int wm_xr_navigation_fly_exec(bContext *UNUSED(C), wmOperator *UNUSED(op))
@@ -890,19 +912,23 @@ static int wm_xr_navigation_fly_modal_3d(bContext *C, wmOperator *op, const wmEv
}
if (event->val == KM_RELEASE) {
+ wm_xr_fly_uninit(op);
return OPERATOR_FINISHED;
}
const wmXrActionData *actiondata = event->customdata;
+ XrFlyData *data = op->customdata;
wmWindowManager *wm = CTX_wm_manager(C);
wmXrData *xr = &wm->xr;
eXrFlyMode mode;
- bool locz_lock, turn;
+ bool turn, locz_lock, dir_lock, speed_frame_based;
bool speed_interp_cubic = false;
float speed, speed_max, speed_p0[2], speed_p1[2];
GHOST_XrPose nav_pose;
float nav_mat[4][4], delta[4][4], m[4][4];
+ const float time_now = PIL_check_seconds_timer();
+
PropertyRNA *prop = RNA_struct_find_property(op->ptr, "mode");
mode = prop ? RNA_property_enum_get(op->ptr, prop) : XR_FLY_VIEWER_FORWARD;
@@ -911,13 +937,21 @@ static int wm_xr_navigation_fly_modal_3d(bContext *C, wmOperator *op, const wmEv
prop = RNA_struct_find_property(op->ptr, "lock_location_z");
locz_lock = prop ? RNA_property_boolean_get(op->ptr, prop) : false;
+ prop = RNA_struct_find_property(op->ptr, "lock_direction");
+ dir_lock = prop ? RNA_property_boolean_get(op->ptr, prop) : false;
+
+ prop = RNA_struct_find_property(op->ptr, "speed_frame_based");
+ speed_frame_based = prop ? RNA_property_boolean_get(op->ptr, prop) : true;
+
prop = RNA_struct_find_property(op->ptr, "speed_min");
speed = prop ? RNA_property_float_get(op->ptr, prop) :
- (turn ? XR_DEFAULT_FLY_SPEED_TURN : XR_DEFAULT_FLY_SPEED_MOVE) / 3.0f;
+ (turn ? XR_DEFAULT_FLY_SPEED_TURN : XR_DEFAULT_FLY_SPEED_MOVE) /
+ (speed_frame_based ? 3.0f : 0.03f);
prop = RNA_struct_find_property(op->ptr, "speed_max");
speed_max = prop ? RNA_property_float_get(op->ptr, prop) :
- (turn ? XR_DEFAULT_FLY_SPEED_TURN : XR_DEFAULT_FLY_SPEED_MOVE);
+ (turn ? XR_DEFAULT_FLY_SPEED_TURN : XR_DEFAULT_FLY_SPEED_MOVE) /
+ (speed_frame_based ? 1.0f : 0.01f);
prop = RNA_struct_find_property(op->ptr, "speed_interpolation0");
if (prop && RNA_property_is_set(op->ptr, prop)) {
@@ -949,13 +983,12 @@ static int wm_xr_navigation_fly_modal_3d(bContext *C, wmOperator *op, const wmEv
break;
case XR_FLOAT_INPUT:
case XR_VECTOR2F_INPUT: {
- const float state = (actiondata->type == XR_FLOAT_INPUT) ? fabsf(actiondata->state[0]) :
- len_v2(actiondata->state);
- const float speed_t = (actiondata->float_threshold < 1.0f) ?
- (state - actiondata->float_threshold) /
- (1.0f - actiondata->float_threshold) :
- 1.0f;
-
+ float state = (actiondata->type == XR_FLOAT_INPUT) ? fabsf(actiondata->state[0]) :
+ len_v2(actiondata->state);
+ float speed_t = (actiondata->float_threshold < 1.0f) ?
+ (state - actiondata->float_threshold) /
+ (1.0f - actiondata->float_threshold) :
+ 1.0f;
if (speed_interp_cubic) {
float start[2], end[2], out[2];
@@ -980,20 +1013,31 @@ static int wm_xr_navigation_fly_modal_3d(bContext *C, wmOperator *op, const wmEv
break;
}
+ if (!speed_frame_based) {
+ /* Adjust speed based on last update time. */
+ speed *= time_now - data->time_prev;
+ }
+ data->time_prev = time_now;
+
WM_xr_session_state_nav_location_get(xr, nav_pose.position);
WM_xr_session_state_nav_rotation_get(xr, nav_pose.orientation_quat);
wm_xr_pose_to_mat(&nav_pose, nav_mat);
if (turn) {
- GHOST_XrPose viewer_pose;
- float viewer_mat[4][4], nav_inv[4][4];
+ if (dir_lock) {
+ unit_m4(delta);
+ }
+ else {
+ GHOST_XrPose viewer_pose;
+ float viewer_mat[4][4], nav_inv[4][4];
- WM_xr_session_state_viewer_pose_location_get(xr, viewer_pose.position);
- WM_xr_session_state_viewer_pose_rotation_get(xr, viewer_pose.orientation_quat);
- wm_xr_pose_to_mat(&viewer_pose, viewer_mat);
- wm_xr_pose_to_imat(&nav_pose, nav_inv);
+ WM_xr_session_state_viewer_pose_location_get(xr, viewer_pose.position);
+ WM_xr_session_state_viewer_pose_rotation_get(xr, viewer_pose.orientation_quat);
+ wm_xr_pose_to_mat(&viewer_pose, viewer_mat);
+ wm_xr_pose_to_imat(&nav_pose, nav_inv);
- wm_xr_fly_compute_turn(mode, speed, viewer_mat, nav_mat, nav_inv, delta);
+ wm_xr_fly_compute_turn(mode, speed, viewer_mat, nav_mat, nav_inv, delta);
+ }
}
else {
float nav_scale, ref_quat[4];
@@ -1017,7 +1061,12 @@ static int wm_xr_navigation_fly_modal_3d(bContext *C, wmOperator *op, const wmEv
case XR_FLY_VIEWER_BACK:
case XR_FLY_VIEWER_LEFT:
case XR_FLY_VIEWER_RIGHT:
- WM_xr_session_state_viewer_pose_rotation_get(xr, ref_quat);
+ if (dir_lock) {
+ copy_qt_qt(ref_quat, data->viewer_rot);
+ }
+ else {
+ WM_xr_session_state_viewer_pose_rotation_get(xr, ref_quat);
+ }
break;
/* Move relative to controller. */
case XR_FLY_CONTROLLER_FORWARD:
@@ -1047,6 +1096,7 @@ static int wm_xr_navigation_fly_modal_3d(bContext *C, wmOperator *op, const wmEv
/* XR events currently only support press and release. */
BLI_assert(false);
+ wm_xr_fly_uninit(op);
return OPERATOR_CANCELLED;
}
@@ -1099,13 +1149,23 @@ static void WM_OT_xr_navigation_fly(wmOperatorType *ot)
RNA_def_enum(ot->srna, "mode", fly_modes, XR_FLY_VIEWER_FORWARD, "Mode", "Fly mode");
RNA_def_boolean(
ot->srna, "lock_location_z", false, "Lock Elevation", "Prevent changes to viewer elevation");
+ RNA_def_boolean(ot->srna,
+ "lock_direction",
+ false,
+ "Lock Direction",
+ "Limit movement to viewer's intial direction");
+ RNA_def_boolean(ot->srna,
+ "speed_frame_based",
+ true,
+ "Frame Based Speed",
+ "Apply fixed movement deltas every update");
RNA_def_float(ot->srna,
"speed_min",
XR_DEFAULT_FLY_SPEED_MOVE / 3.0f,
0.0f,
1000.0f,
"Minimum Speed",
- "Minimum move/turn speed",
+ "Minimum move (turn) speed in meters (radians) per second or frame",
0.0f,
1000.0f);
RNA_def_float(ot->srna,
@@ -1114,7 +1174,7 @@ static void WM_OT_xr_navigation_fly(wmOperatorType *ot)
0.0f,
1000.0f,
"Maximum Speed",
- "Maximum move/turn speed",
+ "Maximum move (turn) speed in meters (radians) per second or frame",
0.0f,
1000.0f);
RNA_def_float_vector(ot->srna,
More information about the Bf-blender-cvs
mailing list