[Bf-blender-cvs] [297decbe1f5] xr-actions-D9124: XR: Add input threshold for float actions

Peter Kim noreply at git.blender.org
Mon Oct 19 17:59:59 CEST 2020


Commit: 297decbe1f5c605182ca57d1dccec2c90c3af431
Author: Peter Kim
Date:   Tue Oct 20 00:52:49 2020 +0900
Branches: xr-actions-D9124
https://developer.blender.org/rB297decbe1f5c605182ca57d1dccec2c90c3af431

XR: Add input threshold for float actions

Fixes button release events not being sent due to non-zero state.

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

M	intern/ghost/GHOST_Types.h
M	source/blender/makesrna/intern/rna_xr.c
M	source/blender/windowmanager/xr/intern/wm_xr_actions.c
M	source/blender/windowmanager/xr/intern/wm_xr_intern.h
M	source/blender/windowmanager/xr/intern/wm_xr_session.c

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

diff --git a/intern/ghost/GHOST_Types.h b/intern/ghost/GHOST_Types.h
index 822da627e74..8c3efa33b03 100644
--- a/intern/ghost/GHOST_Types.h
+++ b/intern/ghost/GHOST_Types.h
@@ -712,6 +712,9 @@ typedef struct GHOST_XrActionInfo {
   /* Previous states, stored to determine XR events. */
   void *states_prev;
 
+  /* Input threshold for float actions. */
+  float threshold;
+
   /* wmOperatorType and wmXrOpFlag, only used by wm. */
   void *ot;
   char op_flag;
diff --git a/source/blender/makesrna/intern/rna_xr.c b/source/blender/makesrna/intern/rna_xr.c
index 56b7c7f3031..857d95901e6 100644
--- a/source/blender/makesrna/intern/rna_xr.c
+++ b/source/blender/makesrna/intern/rna_xr.c
@@ -82,6 +82,7 @@ static bool rna_XrSessionState_action_create(bContext *C,
                                              int type,
                                              const char *user_path0,
                                              const char *user_path1,
+                                             float threshold,
                                              const char *op,
                                              int op_flag)
 {
@@ -91,6 +92,7 @@ static bool rna_XrSessionState_action_create(bContext *C,
       .name = name,
       .type = type,
       .count_subaction_paths = 0,
+      .threshold = threshold,
       .ot = NULL,
       .op_flag = 0,
   };
@@ -651,6 +653,16 @@ static void rna_def_xr_session_state(BlenderRNA *brna)
   RNA_def_parameter_flags(parm, PROP_NEVER_NULL, PARM_REQUIRED);
   parm = RNA_def_string(func, "user_path1", NULL, 64, "User Path 1", "User path 1");
   RNA_def_parameter_flags(parm, PROP_NEVER_NULL, PARM_REQUIRED);
+  parm = RNA_def_float(func,
+                       "threshold",
+                       0.3f,
+                       0.0f,
+                       1.0f,
+                       "Threshold",
+                       "Input threshold for button actions",
+                       0.0f,
+                       1.0f);
+  RNA_def_parameter_flags(parm, 0, PARM_REQUIRED);
   parm = RNA_def_string(func, "op", NULL, OP_MAX_TYPENAME, "Operator", "Operator to execute");
   RNA_def_parameter_flags(parm, PROP_NEVER_NULL, PARM_REQUIRED);
   parm = RNA_def_enum(func,
diff --git a/source/blender/windowmanager/xr/intern/wm_xr_actions.c b/source/blender/windowmanager/xr/intern/wm_xr_actions.c
index c7dafcf19ab..5d0ccaa7526 100644
--- a/source/blender/windowmanager/xr/intern/wm_xr_actions.c
+++ b/source/blender/windowmanager/xr/intern/wm_xr_actions.c
@@ -115,6 +115,9 @@ static wmXrAction *action_create(const GHOST_XrActionInfo *info)
   action->states = MEM_calloc_arrayN(count, size, __func__);
   action->states_prev = MEM_calloc_arrayN(count, size, __func__);
 
+  action->threshold = info->threshold;
+  CLAMP(action->threshold, 0.0f, 1.0f);
+
   action->ot = info->ot;
   action->op_flag = info->op_flag;
 
diff --git a/source/blender/windowmanager/xr/intern/wm_xr_intern.h b/source/blender/windowmanager/xr/intern/wm_xr_intern.h
index 31ad0bf3a03..c00b8f30424 100644
--- a/source/blender/windowmanager/xr/intern/wm_xr_intern.h
+++ b/source/blender/windowmanager/xr/intern/wm_xr_intern.h
@@ -131,6 +131,9 @@ typedef struct wmXrAction {
   /** Previous states, stored to determine XR events. */
   void *states_prev;
 
+  /** Input threshold for float actions. */
+  float threshold;
+
   /** Operator to be called on XR events. */
   struct wmOperatorType *ot;
   char op_flag; /* wmXrOpFlag */
diff --git a/source/blender/windowmanager/xr/intern/wm_xr_session.c b/source/blender/windowmanager/xr/intern/wm_xr_session.c
index 180c0513910..412502ca972 100644
--- a/source/blender/windowmanager/xr/intern/wm_xr_session.c
+++ b/source/blender/windowmanager/xr/intern/wm_xr_session.c
@@ -587,8 +587,8 @@ static void wm_xr_session_events_dispatch(const XrSessionSettings *settings,
           case GHOST_kXrActionTypeFloatInput: {
             const float *state = &((float *)action->states)[i];
             float *state_prev = &((float *)action->states_prev)[i];
-            if (*state) {
-              if (!*state_prev) {
+            if (*state > action->threshold) {
+              if (*state_prev <= action->threshold) {
                 if (modal || action->op_flag == XR_OP_PRESS) {
                   val = KM_PRESS;
                   press_start = true;
@@ -599,7 +599,7 @@ static void wm_xr_session_events_dispatch(const XrSessionSettings *settings,
                 press_start = false;
               }
             }
-            else if (*state_prev) {
+            else if (*state_prev > action->threshold) {
               if (modal || action->op_flag == XR_OP_RELEASE) {
                 val = KM_RELEASE;
                 press_start = false;
@@ -611,8 +611,8 @@ static void wm_xr_session_events_dispatch(const XrSessionSettings *settings,
           case GHOST_kXrActionTypeVector2fInput: {
             const float(*state)[2] = &((float(*)[2])action->states)[i];
             float(*state_prev)[2] = &((float(*)[2])action->states_prev)[i];
-            if (*state[0] || *state[1]) {
-              if (!*state_prev[0] && !*state_prev[1]) {
+            if ((*state)[0] > action->threshold || (*state)[1] > action->threshold) {
+              if ((*state_prev)[0] <= action->threshold && (*state_prev)[1] <= action->threshold) {
                 if (modal || action->op_flag == XR_OP_PRESS) {
                   val = KM_PRESS;
                   press_start = true;
@@ -623,7 +623,8 @@ static void wm_xr_session_events_dispatch(const XrSessionSettings *settings,
                 press_start = false;
               }
             }
-            else if (*state_prev[0] || *state_prev[1]) {
+            else if ((*state_prev)[0] > action->threshold ||
+                     (*state_prev)[1] > action->threshold) {
               if (modal || action->op_flag == XR_OP_RELEASE) {
                 val = KM_RELEASE;
                 press_start = false;



More information about the Bf-blender-cvs mailing list