[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