[Bf-blender-cvs] [dc0b81bc99c] xr-actions-D9124: XR: Add XR region type to View3D space type

Peter Kim noreply at git.blender.org
Sun Nov 8 14:56:03 CET 2020


Commit: dc0b81bc99c05c995b977c84d05d56e63eaa952d
Author: Peter Kim
Date:   Sat Nov 7 19:04:36 2020 +0900
Branches: xr-actions-D9124
https://developer.blender.org/rBdc0b81bc99c05c995b977c84d05d56e63eaa952d

XR: Add XR region type to View3D space type

Enables add-ons to draw to the XR surface and mirror window by
adding a View3D draw handler of region type 'XR' and draw type
'POST_VIEW'. Also allows individual toggling of controller drawing
and custom overlays.

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

M	source/blender/draw/intern/draw_manager.c
M	source/blender/editors/space_view3d/space_view3d.c
M	source/blender/editors/space_view3d/view3d_draw.c
M	source/blender/makesdna/DNA_view3d_enums.h
M	source/blender/makesdna/DNA_view3d_types.h
M	source/blender/makesrna/intern/rna_xr.c
M	source/blender/windowmanager/WM_api.h
M	source/blender/windowmanager/xr/intern/wm_xr_intern.h
M	source/blender/windowmanager/xr/intern/wm_xr_operators.c
M	source/blender/windowmanager/xr/intern/wm_xr_session.c

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

diff --git a/source/blender/draw/intern/draw_manager.c b/source/blender/draw/intern/draw_manager.c
index c9f31ba8eff..1f5956e08d3 100644
--- a/source/blender/draw/intern/draw_manager.c
+++ b/source/blender/draw/intern/draw_manager.c
@@ -1413,13 +1413,26 @@ void DRW_draw_callbacks_post_scene(void)
 
     ED_region_draw_cb_draw(DST.draw_ctx.evil_C, DST.draw_ctx.region, REGION_DRAW_POST_VIEW);
 
-    if (((v3d->flag & V3D_XR_SESSION_MIRROR) != 0) &&
-        ((v3d->flag2 & V3D_XR_SHOW_CONTROLLERS) != 0)) {
-      ARegionType *art = WM_xr_surface_region_type_get();
-      if (art) {
-        ED_region_surface_draw_cb_draw(art, REGION_DRAW_POST_VIEW);
+#ifdef WITH_XR_OPENXR
+    /* XR callbacks (controllers, custom draw functions). */
+    if ((v3d->flag & V3D_XR_SESSION_MIRROR) != 0) {
+      if ((v3d->flag2 & V3D_XR_SHOW_CONTROLLERS) != 0) {
+        ARegionType *art = WM_xr_surface_controller_region_type_get();
+        if (art) {
+          ED_region_surface_draw_cb_draw(art, REGION_DRAW_POST_VIEW);
+        }
+      }
+      if ((v3d->flag2 & V3D_XR_SHOW_CUSTOM_OVERLAYS) != 0) {
+        SpaceType *st = BKE_spacetype_from_id(SPACE_VIEW3D);
+        if (st) {
+          ARegionType *art = BKE_regiontype_from_id(st, RGN_TYPE_XR);
+          if (art) {
+            ED_region_surface_draw_cb_draw(art, REGION_DRAW_POST_VIEW);
+          }
+        }
       }
     }
+#endif
 
     /* Callback can be nasty and do whatever they want with the state.
      * Don't trust them! */
@@ -1478,16 +1491,28 @@ void DRW_draw_callbacks_post_scene(void)
     }
 
     /* Callbacks (controllers, custom draw functions). */
-    if ((v3d->flag2 & V3D_XR_SHOW_CONTROLLERS) != 0) {
-      ARegionType *art = WM_xr_surface_region_type_get();
-      if (art) {
-        GPU_depth_test(GPU_DEPTH_NONE);
-        GPU_apply_state();
-
-        ED_region_surface_draw_cb_draw(art, REGION_DRAW_POST_VIEW);
+    if (((v3d->flag2 & V3D_XR_SHOW_CONTROLLERS) != 0) ||
+        ((v3d->flag2 & V3D_XR_SHOW_CUSTOM_OVERLAYS) != 0)) {
+      GPU_depth_test(GPU_DEPTH_NONE);
+      GPU_apply_state();
 
-        DRW_state_reset();
+      if ((v3d->flag2 & V3D_XR_SHOW_CONTROLLERS) != 0) {
+        ARegionType *art = WM_xr_surface_controller_region_type_get();
+        if (art) {
+          ED_region_surface_draw_cb_draw(art, REGION_DRAW_POST_VIEW);
+        }
+      }
+      if ((v3d->flag2 & V3D_XR_SHOW_CUSTOM_OVERLAYS) != 0) {
+        SpaceType *st = BKE_spacetype_from_id(SPACE_VIEW3D);
+        if (st) {
+          ARegionType *art = BKE_regiontype_from_id(st, RGN_TYPE_XR);
+          if (art) {
+            ED_region_surface_draw_cb_draw(art, REGION_DRAW_POST_VIEW);
+          }
+        }
       }
+
+      DRW_state_reset();
     }
 
     GPU_depth_test(GPU_DEPTH_LESS_EQUAL);
diff --git a/source/blender/editors/space_view3d/space_view3d.c b/source/blender/editors/space_view3d/space_view3d.c
index 5ae012ce5dd..fd384cc14bb 100644
--- a/source/blender/editors/space_view3d/space_view3d.c
+++ b/source/blender/editors/space_view3d/space_view3d.c
@@ -1727,5 +1727,10 @@ void ED_spacetype_view3d(void)
   art = ED_area_type_hud(st->spaceid);
   BLI_addhead(&st->regiontypes, art);
 
+  /* regions: xr */
+  art = MEM_callocN(sizeof(ARegionType), "spacetype view3d xr region");
+  art->regionid = RGN_TYPE_XR;
+  BLI_addhead(&st->regiontypes, art);
+
   BKE_spacetype_register(st);
 }
diff --git a/source/blender/editors/space_view3d/view3d_draw.c b/source/blender/editors/space_view3d/view3d_draw.c
index 00f6d3f4478..42a37d461c7 100644
--- a/source/blender/editors/space_view3d/view3d_draw.c
+++ b/source/blender/editors/space_view3d/view3d_draw.c
@@ -350,6 +350,15 @@ static void view3d_xr_mirror_setup(const wmWindowManager *wm,
   if ((wm->xr.session_settings.draw_flags & V3D_OFSDRAW_XR_SHOW_CONTROLLERS) != 0) {
     v3d->flag2 |= V3D_XR_SHOW_CONTROLLERS;
   }
+  else {
+    v3d->flag2 &= ~V3D_XR_SHOW_CONTROLLERS;
+  }
+  if ((wm->xr.session_settings.draw_flags & V3D_OFSDRAW_XR_SHOW_CUSTOM_OVERLAYS) != 0) {
+    v3d->flag2 |= V3D_XR_SHOW_CUSTOM_OVERLAYS;
+  }
+  else {
+    v3d->flag2 &= ~V3D_XR_SHOW_CUSTOM_OVERLAYS;
+  }
 
   /* Reset overridden View3D data */
   v3d->lens = lens_old;
@@ -1804,8 +1813,7 @@ void ED_view3d_draw_offscreen_simple(Depsgraph *depsgraph,
     v3d.shading.flag = V3D_SHADING_SCENE_WORLD | V3D_SHADING_SCENE_LIGHTS;
   }
 
-  if ((draw_flags & (V3D_OFSDRAW_SHOW_ANNOTATION | V3D_OFSDRAW_SHOW_GRIDFLOOR |
-                     V3D_OFSDRAW_SHOW_SELECTION | V3D_OFSDRAW_XR_SHOW_CONTROLLERS)) == 0) {
+  if ((draw_flags & ~V3D_OFSDRAW_OVERRIDE_SCENE_SETTINGS) == V3D_OFSDRAW_NONE) {
     v3d.flag2 = V3D_HIDE_OVERLAYS;
   }
   else {
@@ -1824,6 +1832,9 @@ void ED_view3d_draw_offscreen_simple(Depsgraph *depsgraph,
     if (draw_flags & V3D_OFSDRAW_XR_SHOW_CONTROLLERS) {
       v3d.flag2 |= V3D_XR_SHOW_CONTROLLERS;
     }
+    if (draw_flags & V3D_OFSDRAW_XR_SHOW_CUSTOM_OVERLAYS) {
+      v3d.flag2 |= V3D_XR_SHOW_CUSTOM_OVERLAYS;
+    }
     /* Disable other overlays (set all available _HIDE_ flags). */
     v3d.overlay.flag |= V3D_OVERLAY_HIDE_CURSOR | V3D_OVERLAY_HIDE_TEXT |
                         V3D_OVERLAY_HIDE_MOTION_PATHS | V3D_OVERLAY_HIDE_BONES |
diff --git a/source/blender/makesdna/DNA_view3d_enums.h b/source/blender/makesdna/DNA_view3d_enums.h
index 7f79be1df8e..adcc72aa6f5 100644
--- a/source/blender/makesdna/DNA_view3d_enums.h
+++ b/source/blender/makesdna/DNA_view3d_enums.h
@@ -28,6 +28,7 @@ typedef enum eV3DOffscreenDrawFlag {
   V3D_OFSDRAW_SHOW_GRIDFLOOR = (1 << 2),
   V3D_OFSDRAW_SHOW_SELECTION = (1 << 3),
   V3D_OFSDRAW_XR_SHOW_CONTROLLERS = (1 << 4),
+  V3D_OFSDRAW_XR_SHOW_CUSTOM_OVERLAYS = (1 << 5),
 } eV3DOffscreenDrawFlag;
 
 /** #View3DShading.light */
diff --git a/source/blender/makesdna/DNA_view3d_types.h b/source/blender/makesdna/DNA_view3d_types.h
index 925b1e508be..48cc8b5d3c2 100644
--- a/source/blender/makesdna/DNA_view3d_types.h
+++ b/source/blender/makesdna/DNA_view3d_types.h
@@ -456,6 +456,7 @@ enum {
 #define V3D_FLAG2_UNUSED_14 (1 << 14) /* cleared */
 #define V3D_FLAG2_UNUSED_15 (1 << 15) /* cleared */
 #define V3D_XR_SHOW_CONTROLLERS (1 << 16)
+#define V3D_XR_SHOW_CUSTOM_OVERLAYS (1 << 17)
 
 /** #View3D.gp_flag (short) */
 #define V3D_GP_FADE_OBJECTS (1 << 0) /* Fade all non GP objects */
diff --git a/source/blender/makesrna/intern/rna_xr.c b/source/blender/makesrna/intern/rna_xr.c
index 43ff53ba5ad..edfd024cb77 100644
--- a/source/blender/makesrna/intern/rna_xr.c
+++ b/source/blender/makesrna/intern/rna_xr.c
@@ -753,6 +753,11 @@ static void rna_def_xr_session_settings(BlenderRNA *brna)
       prop, "Show Controllers", "Show VR controllers (requires VR action for controller poses)");
   RNA_def_property_update(prop, NC_WM | ND_XR_DATA_CHANGED, NULL);
 
+  prop = RNA_def_property(srna, "show_custom_overlays", PROP_BOOLEAN, PROP_NONE);
+  RNA_def_property_boolean_sdna(prop, NULL, "draw_flags", V3D_OFSDRAW_XR_SHOW_CUSTOM_OVERLAYS);
+  RNA_def_property_ui_text(prop, "Show Custom Overlays", "Show custom VR overlays");
+  RNA_def_property_update(prop, NC_WM | ND_XR_DATA_CHANGED, NULL);
+
   prop = RNA_def_property(srna, "selection_eye", PROP_ENUM, PROP_NONE);
   RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
   RNA_def_property_enum_items(prop, selection_eyes);
diff --git a/source/blender/windowmanager/WM_api.h b/source/blender/windowmanager/WM_api.h
index e1c69062ecc..e6044a668fb 100644
--- a/source/blender/windowmanager/WM_api.h
+++ b/source/blender/windowmanager/WM_api.h
@@ -943,7 +943,7 @@ bool WM_xr_session_state_controller_pose_rotation_get(const wmXrData *xr,
                                                       unsigned int subaction_idx,
                                                       float r_rotation[4]);
 
-struct ARegionType *WM_xr_surface_region_type_get(void);
+struct ARegionType *WM_xr_surface_controller_region_type_get(void);
 
 /* wm_xr_actions.c */
 /* XR action functions to be called pre-XR session start.
diff --git a/source/blender/windowmanager/xr/intern/wm_xr_intern.h b/source/blender/windowmanager/xr/intern/wm_xr_intern.h
index 55d2d77f6d3..4a3a29b1a0a 100644
--- a/source/blender/windowmanager/xr/intern/wm_xr_intern.h
+++ b/source/blender/windowmanager/xr/intern/wm_xr_intern.h
@@ -102,8 +102,8 @@ typedef struct {
   /** XR events. */
   ListBase events;
 
-  /** Dummy region type. Used to add draw callbacks. */
-  struct ARegionType *art;
+  /** Dummy region type for controller draw callback. */
+  struct ARegionType *controller_art;
   /** Controller draw callback handle. */
   void *controller_draw_handle;
 } wmXrSurfaceData;
diff --git a/source/blender/windowmanager/xr/intern/wm_xr_operators.c b/source/blender/windowmanager/xr/intern/wm_xr_operators.c
index 72da37db7c7..23859f4c417 100644
--- a/source/blender/windowmanager/xr/intern/wm_xr_operators.c
+++ b/source/blender/windowmanager/xr/intern/wm_xr_operators.c
@@ -203,19 +203,25 @@ static void wm_xr_select_raycast_init(wmOperator *op)
 
   op->customdata = MEM_callocN(sizeof(XrRaycastSelectData), __func__);
 
-  ARegionType *art = WM_xr_surface_region_type_get();
-  if (art) {
-    ((XrRaycastSelectData *)op->customdata)->draw_handle = ED_region_draw_cb_activate(
-        art, wm_xr_select_raycast_draw, op->customdata, REGION_DRAW_POST_VIEW);
+  SpaceType *st = BKE_spacetype_from_id(SPACE_VIEW3D);
+  if (st) {
+    ARegionType *art = BKE_regiontype_from_id(st, RGN_TYPE_XR);
+    if (art) {
+      ((XrRaycastSelectData *)op->customdata)->draw_handle = ED_region_draw_cb_activate(
+          art, wm_xr_select_raycast_draw, op->customdata, REGION_DRAW_POST_VIEW);
+    }
   }
 }
 
 static void wm_xr_select_raycast_uninit(wmOperator *op)
 {
   if (op->customdata) {
-    ARegionType *art = WM_xr_surface_region_type_get();
-    if (art) {
-      ED_region_draw_cb_exit(art, ((XrRaycastSelectData *)op->customdata)->draw_handle);
+    SpaceType *st = BKE_spacetype_from_id(SPACE_VIEW3D);
+    if (st) {
+      ARegionType *art = BKE_regiontype_from_id(st, RGN_TYPE_XR);
+      if (art) {
+        ED_region_draw_cb_exit(art, ((XrRaycastSelectData *)op->customdata)->draw_handle);
+      }
     }
 
     MEM_freeN(op->customdata);
diff --git a/source/blender/windowmanager/xr/intern/wm_xr_ses

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list