[Bf-blender-cvs] [247267dee4c] xr-actions-D9124: XR: Use common functions for modal_3d operators

Peter Kim noreply at git.blender.org
Mon Feb 8 16:45:13 CET 2021


Commit: 247267dee4c4b33a41c95805ea41393135482766
Author: Peter Kim
Date:   Tue Feb 9 00:11:49 2021 +0900
Branches: xr-actions-D9124
https://developer.blender.org/rB247267dee4c4b33a41c95805ea41393135482766

XR: Use common functions for modal_3d operators

Reduces the amount of similar code for XR invoke_3d/modal_3d
operators that manipulate view3d params.

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

M	source/blender/editors/include/ED_view3d.h
M	source/blender/editors/space_view3d/view3d_select.c
M	source/blender/editors/space_view3d/view3d_view.c
M	source/blender/editors/transform/transform_ops.c
M	source/blender/windowmanager/intern/wm_gesture_ops.c

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

diff --git a/source/blender/editors/include/ED_view3d.h b/source/blender/editors/include/ED_view3d.h
index fd4c6385b5d..90b90e6463e 100644
--- a/source/blender/editors/include/ED_view3d.h
+++ b/source/blender/editors/include/ED_view3d.h
@@ -725,6 +725,21 @@ void ED_view3d_buttons_region_layout_ex(const struct bContext *C,
 bool ED_view3d_local_collections_set(struct Main *bmain, struct View3D *v3d);
 void ED_view3d_local_collections_reset(struct bContext *C, const bool reset_all);
 
+void ED_view3d_view_params_get(const struct View3D *v3d,
+                               const struct RegionView3D *rv3d,
+                               float *r_lens,
+                               float *r_clip_start,
+                               float *r_clip_end,
+                               float r_viewmat[4][4]);
+void ED_view3d_view_params_set(struct Depsgraph *depsgraph,
+                               struct Scene *scene,
+                               struct View3D *v3d,
+                               struct ARegion *region,
+                               const float lens,
+                               const float clip_start,
+                               const float clip_end,
+                               const float viewmat[4][4]);
+
 #ifdef WITH_XR_OPENXR
 void ED_view3d_xr_mirror_update(const struct ScrArea *area,
                                 const struct View3D *v3d,
diff --git a/source/blender/editors/space_view3d/view3d_select.c b/source/blender/editors/space_view3d/view3d_select.c
index 8745846d74b..f32e51e266e 100644
--- a/source/blender/editors/space_view3d/view3d_select.c
+++ b/source/blender/editors/space_view3d/view3d_select.c
@@ -2532,16 +2532,15 @@ static int view3d_select_invoke_3d(bContext *C, wmOperator *op, const wmEvent *e
   /* Since this function is called in a window context, we need to replace the
    * window view parameters with the XR surface counterparts to get a correct
    * result for GPU select. */
-  lens_prev = v3d->lens;
-  clip_start_prev = v3d->clip_start;
-  clip_end_prev = v3d->clip_end;
-  copy_m4_m4(viewmat_prev, rv3d->viewmat);
-
-  v3d->lens = actiondata->eye_lens;
-  v3d->clip_start = xr->session_settings.clip_start;
-  v3d->clip_end = xr->session_settings.clip_end;
-  ED_view3d_update_viewmat(
-      depsgraph, scene, v3d, region, actiondata->eye_viewmat, NULL, NULL, false);
+  ED_view3d_view_params_get(v3d, rv3d, &lens_prev, &clip_start_prev, &clip_end_prev, viewmat_prev);
+  ED_view3d_view_params_set(depsgraph,
+                            scene,
+                            v3d,
+                            region,
+                            actiondata->eye_lens,
+                            xr->session_settings.clip_start,
+                            xr->session_settings.clip_end,
+                            actiondata->eye_viewmat);
 
   map_to_pixel(mval,
                actiondata->controller_loc,
@@ -2555,10 +2554,8 @@ static int view3d_select_invoke_3d(bContext *C, wmOperator *op, const wmEvent *e
   retval = view3d_select_exec(C, op);
 
   /* Restore window view. */
-  v3d->lens = lens_prev;
-  v3d->clip_start = clip_start_prev;
-  v3d->clip_end = clip_end_prev;
-  ED_view3d_update_viewmat(depsgraph, scene, v3d, region, viewmat_prev, NULL, NULL, false);
+  ED_view3d_view_params_set(
+      depsgraph, scene, v3d, region, lens_prev, clip_start_prev, clip_end_prev, viewmat_prev);
 
   return retval;
 }
diff --git a/source/blender/editors/space_view3d/view3d_view.c b/source/blender/editors/space_view3d/view3d_view.c
index 9d947384bf0..4405fd9abc3 100644
--- a/source/blender/editors/space_view3d/view3d_view.c
+++ b/source/blender/editors/space_view3d/view3d_view.c
@@ -1693,6 +1693,44 @@ void ED_view3d_local_collections_reset(struct bContext *C, const bool reset_all)
 /** \name XR Functionality
  * \{ */
 
+/* Used for invoke_3d/modal_3d (XR) operators. */
+void ED_view3d_view_params_get(const struct View3D *v3d,
+                               const struct RegionView3D *rv3d,
+                               float *r_lens,
+                               float *r_clip_start,
+                               float *r_clip_end,
+                               float r_viewmat[4][4])
+{
+  *r_lens = v3d->lens;
+  *r_clip_start = v3d->clip_start;
+  *r_clip_end = v3d->clip_end;
+
+  if (r_viewmat) {
+    copy_m4_m4(r_viewmat, rv3d->viewmat);
+  }
+}
+
+void ED_view3d_view_params_set(struct Depsgraph *depsgraph,
+                               struct Scene *scene,
+                               struct View3D *v3d,
+                               struct ARegion *region,
+                               const float lens,
+                               const float clip_start,
+                               const float clip_end,
+                               const float viewmat[4][4])
+{
+  v3d->lens = lens;
+  v3d->clip_start = clip_start;
+  v3d->clip_end = clip_end;
+
+  if (viewmat) {
+    ED_view3d_update_viewmat(depsgraph, scene, v3d, region, viewmat, NULL, NULL, false);
+  }
+  else {
+    view3d_winmatrix_set(depsgraph, region, v3d, NULL);
+  }
+}
+
 #ifdef WITH_XR_OPENXR
 
 static void view3d_xr_mirror_begin(RegionView3D *rv3d)
diff --git a/source/blender/editors/transform/transform_ops.c b/source/blender/editors/transform/transform_ops.c
index 50fc2553962..e4bc48508c4 100644
--- a/source/blender/editors/transform/transform_ops.c
+++ b/source/blender/editors/transform/transform_ops.c
@@ -496,15 +496,16 @@ static int transform_modal_3d(bContext *C, wmOperator *op, const wmEvent *event)
   memcpy(&event_mut, event, sizeof(wmEvent));
 
   /* Replace window view parameters with XR surface counterparts. */
-  lens_prev = v3d->lens;
-  clip_start_prev = v3d->clip_start;
-  clip_end_prev = v3d->clip_end;
-  copy_m4_m4(viewmat_prev, rv3d->viewmat);
-
-  v3d->lens = actiondata->eye_lens;
-  v3d->clip_start = xr->session_settings.clip_start;
-  v3d->clip_end = xr->session_settings.clip_end;
-  ED_view3d_update_viewmat(depsgraph, scene, v3d, region, t->viewmat, NULL, NULL, false);
+  ED_view3d_view_params_get(v3d, rv3d, &lens_prev, &clip_start_prev, &clip_end_prev, viewmat_prev);
+  ED_view3d_view_params_set(
+      depsgraph,
+      scene,
+      v3d,
+      region,
+      actiondata->eye_lens,
+      xr->session_settings.clip_start,
+      xr->session_settings.clip_end,
+      t->viewmat); /* Use viewmat from when transform was invoked instead of latest XR viewmat. */
 
   map_to_pixel(event_mut.mval,
                actiondata->controller_loc,
@@ -527,10 +528,8 @@ static int transform_modal_3d(bContext *C, wmOperator *op, const wmEvent *event)
   retval = transform_modal(C, op, &event_mut);
 
   /* Restore window view. */
-  v3d->lens = lens_prev;
-  v3d->clip_start = clip_start_prev;
-  v3d->clip_end = clip_end_prev;
-  ED_view3d_update_viewmat(depsgraph, scene, v3d, region, viewmat_prev, NULL, NULL, false);
+  ED_view3d_view_params_set(
+      depsgraph, scene, v3d, region, lens_prev, clip_start_prev, clip_end_prev, viewmat_prev);
 
   return retval;
 }
@@ -618,16 +617,15 @@ static int transform_invoke_3d(bContext *C, wmOperator *op, const wmEvent *event
   event_mut.type = LEFTMOUSE;
 
   /* Replace window view parameters with XR surface counterparts. */
-  lens_prev = v3d->lens;
-  clip_start_prev = v3d->clip_start;
-  clip_end_prev = v3d->clip_end;
-  copy_m4_m4(viewmat_prev, rv3d->viewmat);
-
-  v3d->lens = actiondata->eye_lens;
-  v3d->clip_start = xr->session_settings.clip_start;
-  v3d->clip_end = xr->session_settings.clip_end;
-  ED_view3d_update_viewmat(
-      depsgraph, scene, v3d, region, actiondata->eye_viewmat, NULL, NULL, false);
+  ED_view3d_view_params_get(v3d, rv3d, &lens_prev, &clip_start_prev, &clip_end_prev, viewmat_prev);
+  ED_view3d_view_params_set(depsgraph,
+                            scene,
+                            v3d,
+                            region,
+                            actiondata->eye_lens,
+                            xr->session_settings.clip_start,
+                            xr->session_settings.clip_end,
+                            actiondata->eye_viewmat);
 
   map_to_pixel(event_mut.mval,
                actiondata->controller_loc,
@@ -639,10 +637,8 @@ static int transform_invoke_3d(bContext *C, wmOperator *op, const wmEvent *event
   retval = transform_invoke(C, op, &event_mut);
 
   /* Restore window view. */
-  v3d->lens = lens_prev;
-  v3d->clip_start = clip_start_prev;
-  v3d->clip_end = clip_end_prev;
-  ED_view3d_update_viewmat(depsgraph, scene, v3d, region, viewmat_prev, NULL, NULL, false);
+  ED_view3d_view_params_set(
+      depsgraph, scene, v3d, region, lens_prev, clip_start_prev, clip_end_prev, viewmat_prev);
 
   return retval;
 }
diff --git a/source/blender/windowmanager/intern/wm_gesture_ops.c b/source/blender/windowmanager/intern/wm_gesture_ops.c
index a0a923ffa54..112512b3649 100644
--- a/source/blender/windowmanager/intern/wm_gesture_ops.c
+++ b/source/blender/windowmanager/intern/wm_gesture_ops.c
@@ -214,6 +214,7 @@ int WM_gesture_box_invoke_3d(bContext *C, wmOperator *op, const wmEvent *event)
 
   const wmXrActionData *actiondata = event->customdata;
   Depsgraph *depsgraph = CTX_data_ensure_evaluated_depsgraph(C);
+  Scene *scene = CTX_data_scene(C);
   View3D *v3d = CTX_wm_view3d(C);
   ARegion *region = CTX_wm_region(C);
   RegionView3D *rv3d = region->regiondata;
@@ -228,14 +229,15 @@ int WM_gesture_box_invoke_3d(bContext *C, wmOperator *op, const wmEvent *event)
   memcpy(&event_mut, event, sizeof(wmEvent));
 
   /* Replace window view parameters with XR surface counterparts. */
-  lens_prev = v3d->lens;
-  clip_start_prev = v3d->clip_start;
-  clip_end_prev = v3d->clip_end;
-
-  v3d->lens = actiondata->eye_lens;
-  v3d->clip_start = xr->session_settings.clip_start;
-  v3d->clip_end = xr->session_settings.clip_end;
-  view3d_winmatrix_set(depsgraph, region, v3d, NULL);
+  ED_view3d_view_params_get(v3d, rv3d, &lens_prev, &clip_start_prev, &clip_end_prev, NULL);
+  ED_view3d_view_params_set(depsgraph,
+                            scene,
+                            v3d,
+                            region,
+                            actiondata->eye_lens,
+                            xr->session_settings.

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list