Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPeter Kim <pk15950@gmail.com>2021-10-05 09:55:57 +0300
committerPeter Kim <pk15950@gmail.com>2021-10-05 10:05:12 +0300
commit08511b1c3de0338314940397083adaba4e9cf492 (patch)
tree879ddffecd08dd9315847fdcffb0b2d76cee8637 /source/blender/editors/screen
parent300403a38b8ed7f0f84125ca9a82264757ae704a (diff)
XR: Add runtime window area for XR events
This adds an offscreen View3D window area for the VR view in order to execute XR events/operators in the proper context. The area is created as runtime data before XR events are dispatched and set as the active area during XR event handling. Since the area is runtime-only, it will not be saved in files and since the area is offscreen, it will not interfere with regular window areas. The area is removed with the rest of the XR runtime data on exit, file read, or when stopping the VR session. Note: This also adds internal types (EVT_DATA_XR, EVT_XR_ACTION) and structs (wmXrActionData) for XR events. Reviewed By: Severin Differential Revision: https://developer.blender.org/D12472
Diffstat (limited to 'source/blender/editors/screen')
-rw-r--r--source/blender/editors/screen/area.c62
-rw-r--r--source/blender/editors/screen/screen_edit.c19
-rw-r--r--source/blender/editors/screen/screen_intern.h1
3 files changed, 75 insertions, 7 deletions
diff --git a/source/blender/editors/screen/area.c b/source/blender/editors/screen/area.c
index 833c9accf95..d5456482d67 100644
--- a/source/blender/editors/screen/area.c
+++ b/source/blender/editors/screen/area.c
@@ -2001,6 +2001,68 @@ void ED_area_init(wmWindowManager *wm, wmWindow *win, ScrArea *area)
}
}
+static void area_offscreen_init(wmWindowManager *wm, ScrArea *area)
+{
+ area->type = BKE_spacetype_from_id(area->spacetype);
+
+ if (area->type == NULL) {
+ area->spacetype = SPACE_VIEW3D;
+ area->type = BKE_spacetype_from_id(area->spacetype);
+ }
+
+ LISTBASE_FOREACH (ARegion *, region, &area->regionbase) {
+ region->type = BKE_regiontype_from_id_or_first(area->type, region->regiontype);
+ }
+}
+
+ScrArea *ED_area_offscreen_create(wmWindowManager *wm, wmWindow *win, eSpace_Type space_type)
+{
+ ScrArea *area = MEM_callocN(sizeof(*area), __func__);
+ area->spacetype = space_type;
+
+ screen_area_spacelink_add(WM_window_get_active_scene(win), area, space_type);
+ area_offscreen_init(wm, area);
+
+ return area;
+}
+
+static void area_offscreen_exit(wmWindowManager *wm, wmWindow *win, ScrArea *area)
+{
+ if (area->type && area->type->exit) {
+ area->type->exit(wm, area);
+ }
+
+ LISTBASE_FOREACH (ARegion *, region, &area->regionbase) {
+ if (region->type && region->type->exit) {
+ region->type->exit(wm, region);
+ }
+
+ WM_event_modal_handler_region_replace(win, region, NULL);
+ WM_draw_region_free(region, true);
+
+ MEM_SAFE_FREE(region->headerstr);
+
+ if (region->regiontimer) {
+ WM_event_remove_timer(wm, win, region->regiontimer);
+ region->regiontimer = NULL;
+ }
+
+ if (wm->message_bus) {
+ WM_msgbus_clear_by_owner(wm->message_bus, region);
+ }
+ }
+
+ WM_event_modal_handler_area_replace(win, area, NULL);
+}
+
+void ED_area_offscreen_free(wmWindowManager *wm, wmWindow *win, ScrArea *area)
+{
+ area_offscreen_exit(wm, win, area);
+
+ BKE_screen_area_free(area);
+ MEM_freeN(area);
+}
+
static void region_update_rect(ARegion *region)
{
region->winx = BLI_rcti_size_x(&region->winrct) + 1;
diff --git a/source/blender/editors/screen/screen_edit.c b/source/blender/editors/screen/screen_edit.c
index 1c068fdd6e4..02b1e002d86 100644
--- a/source/blender/editors/screen/screen_edit.c
+++ b/source/blender/editors/screen/screen_edit.c
@@ -574,6 +574,17 @@ bool screen_area_close(struct bContext *C, bScreen *screen, ScrArea *area)
return screen_area_join_ex(C, screen, sa2, area, true);
}
+void screen_area_spacelink_add(Scene *scene, ScrArea *area, eSpace_Type space_type)
+{
+ SpaceType *stype = BKE_spacetype_from_id(space_type);
+ SpaceLink *slink = stype->create(area, scene);
+
+ area->regionbase = slink->regionbase;
+
+ BLI_addhead(&area->spacedata, slink);
+ BLI_listbase_clear(&slink->regionbase);
+}
+
/* ****************** EXPORTED API TO OTHER MODULES *************************** */
/* screen sets cursor based on active region */
@@ -1023,13 +1034,7 @@ static void screen_global_area_refresh(wmWindow *win,
}
else {
area = screen_area_create_with_geometry(&win->global_areas, rect, space_type);
- SpaceType *stype = BKE_spacetype_from_id(space_type);
- SpaceLink *slink = stype->create(area, WM_window_get_active_scene(win));
-
- area->regionbase = slink->regionbase;
-
- BLI_addhead(&area->spacedata, slink);
- BLI_listbase_clear(&slink->regionbase);
+ screen_area_spacelink_add(WM_window_get_active_scene(win), area, space_type);
/* Data specific to global areas. */
area->global = MEM_callocN(sizeof(*area->global), __func__);
diff --git a/source/blender/editors/screen/screen_intern.h b/source/blender/editors/screen/screen_intern.h
index 04ee62b1631..47229e5e2b5 100644
--- a/source/blender/editors/screen/screen_intern.h
+++ b/source/blender/editors/screen/screen_intern.h
@@ -94,6 +94,7 @@ eScreenDir area_getorientation(ScrArea *sa_a, ScrArea *sa_b);
void area_getoffsets(
ScrArea *sa_a, ScrArea *sa_b, const eScreenDir dir, int *r_offset1, int *r_offset2);
bool screen_area_close(struct bContext *C, bScreen *screen, ScrArea *area);
+void screen_area_spacelink_add(struct Scene *scene, ScrArea *area, eSpace_Type space_type);
struct AZone *ED_area_actionzone_find_xy(ScrArea *area, const int xy[2]);
/* screen_geometry.c */