[Bf-blender-cvs] [1184da29747] xr-controller-support: XR: Add cubic interpolation option for fly speed

Peter Kim noreply at git.blender.org
Fri Jul 2 11:18:50 CEST 2021


Commit: 1184da29747cc92d54f0c275e8be8927dae328fc
Author: Peter Kim
Date:   Fri Jul 2 18:09:46 2021 +0900
Branches: xr-controller-support
https://developer.blender.org/rB1184da29747cc92d54f0c275e8be8927dae328fc

XR: Add cubic interpolation option for fly speed

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

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 94fd5d74285..365537b5cf6 100644
--- a/source/blender/windowmanager/xr/intern/wm_xr_operators.c
+++ b/source/blender/windowmanager/xr/intern/wm_xr_operators.c
@@ -898,7 +898,8 @@ static int wm_xr_navigation_fly_modal_3d(bContext *C, wmOperator *op, const wmEv
   wmXrData *xr = &wm->xr;
   eXrFlyMode mode;
   bool locz_lock, turn;
-  float speed, speed_max;
+  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];
 
@@ -918,25 +919,59 @@ static int wm_xr_navigation_fly_modal_3d(bContext *C, wmOperator *op, const wmEv
   speed_max = prop ? RNA_property_float_get(op->ptr, prop) :
                      (turn ? XR_DEFAULT_FLY_SPEED_TURN : XR_DEFAULT_FLY_SPEED_MOVE);
 
+  prop = RNA_struct_find_property(op->ptr, "speed_interpolation0");
+  if (prop && RNA_property_is_set(op->ptr, prop)) {
+    RNA_property_float_get_array(op->ptr, prop, speed_p0);
+    speed_interp_cubic = true;
+  }
+  else {
+    speed_p0[0] = speed_p0[1] = 0.0f;
+  }
+
+  prop = RNA_struct_find_property(op->ptr, "speed_interpolation1");
+  if (prop && RNA_property_is_set(op->ptr, prop)) {
+    RNA_property_float_get_array(op->ptr, prop, speed_p1);
+    speed_interp_cubic = true;
+  }
+  else {
+    speed_p1[0] = speed_p1[1] = 1.0f;
+  }
+
   /* Ensure valid interpolation. */
   if (speed_max < speed) {
     speed_max = speed;
   }
 
-  /* Lerp between min/max speeds based on button state. */
+  /* Interpolate between min/max speeds based on button state. */
   switch (actiondata->type) {
     case XR_BOOLEAN_INPUT:
       speed = speed_max;
       break;
     case XR_FLOAT_INPUT:
     case XR_VECTOR2F_INPUT: {
-      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;
-      speed += speed_t * (speed_max - speed);
+      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;
+
+      if (speed_interp_cubic) {
+        float start[2], end[2], out[2];
+
+        start[0] = 0.0f;
+        start[1] = speed;
+        speed_p0[1] = speed + speed_p0[1] * (speed_max - speed);
+        speed_p1[1] = speed + speed_p1[1] * (speed_max - speed);
+        end[0] = 1.0f;
+        end[1] = speed_max;
+
+        interp_v2_v2v2v2v2_cubic(out, start, speed_p0, speed_p1, end, speed_t);
+        speed = out[1];
+      }
+      else {
+        speed += speed_t * (speed_max - speed);
+      }
       break;
     }
     case XR_POSE_INPUT:
@@ -1058,6 +1093,9 @@ static void WM_OT_xr_navigation_fly(wmOperatorType *ot)
       {0, NULL, 0, NULL, NULL},
   };
 
+  static const float default_speed_p0[2] = {0.0f, 0.0f};
+  static const float default_speed_p1[2] = {1.0f, 1.0f};
+
   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");
@@ -1079,6 +1117,26 @@ static void WM_OT_xr_navigation_fly(wmOperatorType *ot)
                 "Maximum move/turn speed",
                 0.0f,
                 1000.0f);
+  RNA_def_float_vector(ot->srna,
+                       "speed_interpolation0",
+                       2,
+                       default_speed_p0,
+                       0.0f,
+                       1.0f,
+                       "Speed Interpolation 0",
+                       "First cubic spline control point between min/max speeds",
+                       0.0f,
+                       1.0f);
+  RNA_def_float_vector(ot->srna,
+                       "speed_interpolation1",
+                       2,
+                       default_speed_p1,
+                       0.0f,
+                       1.0f,
+                       "Speed Interpolation 1",
+                       "Second cubic spline control point between min/max speeds",
+                       0.0f,
+                       1.0f);
 }
 
 /** \} */



More information about the Bf-blender-cvs mailing list