[Bf-blender-cvs] [d5af5dbcde1] vr_scene_inspection: Refactor how the user region is obtained in quad view

Julian Eisel noreply at git.blender.org
Thu Mar 12 13:13:37 CET 2020


Commit: d5af5dbcde1084ceb8705ea73938df65e73ae7e9
Author: Julian Eisel
Date:   Thu Mar 12 13:06:19 2020 +0100
Branches: vr_scene_inspection
https://developer.blender.org/rBd5af5dbcde1084ceb8705ea73938df65e73ae7e9

Refactor how the user region is obtained in quad view

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

M	source/blender/editors/include/ED_view3d.h
M	source/blender/editors/space_view3d/space_view3d.c
M	source/blender/editors/space_view3d/view3d_utils.c
M	source/blender/makesrna/intern/rna_space.c
M	source/blender/windowmanager/intern/wm_operators.c

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

diff --git a/source/blender/editors/include/ED_view3d.h b/source/blender/editors/include/ED_view3d.h
index a2d36b6c716..a3e9fd5efa5 100644
--- a/source/blender/editors/include/ED_view3d.h
+++ b/source/blender/editors/include/ED_view3d.h
@@ -561,6 +561,9 @@ struct RegionView3D *ED_view3d_context_rv3d(struct bContext *C);
 bool ED_view3d_context_user_region(struct bContext *C,
                                    struct View3D **r_v3d,
                                    struct ARegion **r_ar);
+bool ED_view3d_area_user_region(const struct ScrArea *sa,
+                                const struct View3D *v3d,
+                                struct ARegion **r_ar);
 bool ED_operator_rv3d_user_region_poll(struct bContext *C);
 
 void ED_view3d_init_mats_rv3d(struct Object *ob, struct RegionView3D *rv3d);
diff --git a/source/blender/editors/space_view3d/space_view3d.c b/source/blender/editors/space_view3d/space_view3d.c
index ab9257e8470..10f9106afc6 100644
--- a/source/blender/editors/space_view3d/space_view3d.c
+++ b/source/blender/editors/space_view3d/space_view3d.c
@@ -120,38 +120,55 @@ bool ED_view3d_context_user_region(bContext *C, View3D **r_v3d, ARegion **r_ar)
         return true;
       }
       else {
-        ARegion *ar_unlock_user = NULL;
-        ARegion *ar_unlock = NULL;
-        for (region = sa->regionbase.first; region; region = region->next) {
-          /* find the first unlocked rv3d */
-          if (region->regiondata && region->regiontype == RGN_TYPE_WINDOW) {
-            rv3d = region->regiondata;
-            if ((rv3d->viewlock & RV3D_LOCK_ROTATION) == 0) {
-              ar_unlock = region;
-              if (rv3d->persp == RV3D_PERSP || rv3d->persp == RV3D_CAMOB) {
-                ar_unlock_user = region;
-                break;
-              }
-            }
-          }
-        }
-
-        /* camera/perspective view get priority when the active region is locked */
-        if (ar_unlock_user) {
+        if (ED_view3d_area_user_region(sa, v3d, r_ar)) {
           *r_v3d = v3d;
-          *r_ar = ar_unlock_user;
           return true;
         }
+      }
+    }
+  }
 
-        if (ar_unlock) {
-          *r_v3d = v3d;
-          *r_ar = ar_unlock;
-          return true;
+  return false;
+}
+
+/**
+ * Similar to #ED_view3d_context_user_region() but does not use context. Always performs a lookup.
+ * Also works if \a v3d is not the active space.
+ */
+bool ED_view3d_area_user_region(const ScrArea *sa, const View3D *v3d, ARegion **r_ar)
+{
+  RegionView3D *rv3d = NULL;
+  ARegion *ar_unlock_user = NULL;
+  ARegion *ar_unlock = NULL;
+  const ListBase *region_list = (v3d == sa->spacedata.first) ? &sa->regionbase : &v3d->regionbase;
+
+  BLI_assert(v3d->spacetype == SPACE_VIEW3D);
+
+  for (ARegion *region = region_list->first; region; region = region->next) {
+    /* find the first unlocked rv3d */
+    if (region->regiondata && region->regiontype == RGN_TYPE_WINDOW) {
+      rv3d = region->regiondata;
+      if ((rv3d->viewlock & RV3D_LOCK_ROTATION) == 0) {
+        ar_unlock = region;
+        if (rv3d->persp == RV3D_PERSP || rv3d->persp == RV3D_CAMOB) {
+          ar_unlock_user = region;
+          break;
         }
       }
     }
   }
 
+  /* camera/perspective view get priority when the active region is locked */
+  if (ar_unlock_user) {
+    *r_ar = ar_unlock_user;
+    return true;
+  }
+
+  if (ar_unlock) {
+    *r_ar = ar_unlock;
+    return true;
+  }
+
   return false;
 }
 
diff --git a/source/blender/editors/space_view3d/view3d_utils.c b/source/blender/editors/space_view3d/view3d_utils.c
index 4db84dd12f2..8cae29db6ca 100644
--- a/source/blender/editors/space_view3d/view3d_utils.c
+++ b/source/blender/editors/space_view3d/view3d_utils.c
@@ -880,11 +880,6 @@ void ED_view3d_quadview_update(ScrArea *sa, ARegion *region, bool do_clip)
   }
 
   for (; region; region = region->prev) {
-    /* Skip the user region (always last). */
-    if (!region->next) {
-      continue;
-    }
-
     if (region->alignment == RGN_ALIGN_QSPLIT) {
       rv3d = region->regiondata;
       rv3d->viewlock = viewlock;
diff --git a/source/blender/makesrna/intern/rna_space.c b/source/blender/makesrna/intern/rna_space.c
index 72dd0f422c0..7e49965b24f 100644
--- a/source/blender/makesrna/intern/rna_space.c
+++ b/source/blender/makesrna/intern/rna_space.c
@@ -1338,14 +1338,10 @@ static void rna_SpaceView3D_mirror_xr_session_update(Main *main,
                                                      PointerRNA *ptr)
 {
 #  ifdef WITH_XR_OPENXR
-  View3D *v3d = ptr->data;
-  PointerRNA rv3d_ptr = RNA_pointer_get(ptr, "region_3d");
-  RegionView3D *rv3d = rv3d_ptr.data;
   wmWindowManager *wm = main->wm.first;
-
-  /* Handle mirror toggling while a VR session runs. */
-
-  BLI_assert(rv3d_ptr.type == &RNA_RegionView3D);
+  ScrArea *area = rna_area_from_space(ptr);
+  View3D *v3d = ptr->data;
+  ARegion *region_rv3d = NULL;
 
   /* The VR session may not have been started yet, so the view should only be tagged to
    * let the VR code manage the call to ED_view3d_xr_mirror_begin/end(). */
@@ -1353,12 +1349,17 @@ static void rna_SpaceView3D_mirror_xr_session_update(Main *main,
     return;
   }
 
-  if (v3d->flag & V3D_XR_SESSION_MIRROR) {
-    ED_view3d_xr_mirror_begin(rv3d);
-  }
-  else {
-    ED_view3d_xr_mirror_end(rv3d);
+  /* Handle mirror toggling while a VR session runs. */
+
+  if (ED_view3d_area_user_region(area, v3d, &region_rv3d)) {
+    if (v3d->flag & V3D_XR_SESSION_MIRROR) {
+      ED_view3d_xr_mirror_begin(region_rv3d->regiondata);
+    }
+    else {
+      ED_view3d_xr_mirror_end(region_rv3d->regiondata);
+    }
   }
+
 #  else
   UNUSED_VARS(main, scene, ptr);
 #  endif
diff --git a/source/blender/windowmanager/intern/wm_operators.c b/source/blender/windowmanager/intern/wm_operators.c
index ed975490d1d..bb4b99e2f28 100644
--- a/source/blender/windowmanager/intern/wm_operators.c
+++ b/source/blender/windowmanager/intern/wm_operators.c
@@ -3656,18 +3656,17 @@ static void wm_xr_session_update_mirror_views(Main *bmain, wmWindowManager *wm)
       for (SpaceLink *slink = area->spacedata.first; slink; slink = slink->next) {
         if (slink->spacetype == SPACE_VIEW3D) {
           View3D *v3d = (View3D *)slink;
+
           if (v3d->flag & V3D_XR_SESSION_MIRROR) {
-            ListBase *region_list = (slink == area->spacedata.first) ? &area->regionbase :
-                                                                       &slink->regionbase;
-            /* The free main region (e.g. the unlocked one in quad-view) is always the last one,
-             * see rna_SpaceView3D_region_3d_get(). */
-            ARegion *region = region_list->last;
-
-            if (enable) {
-              ED_view3d_xr_mirror_begin(region->regiondata);
-            }
-            else {
-              ED_view3d_xr_mirror_end(region->regiondata);
+            ARegion *region_rv3d;
+
+            if (ED_view3d_area_user_region(area, (View3D *)slink, &region_rv3d)) {
+              if (enable) {
+                ED_view3d_xr_mirror_begin(region_rv3d->regiondata);
+              }
+              else {
+                ED_view3d_xr_mirror_end(region_rv3d->regiondata);
+              }
             }
           }
         }



More information about the Bf-blender-cvs mailing list