[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, ®ion_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, ®ion_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