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:
Diffstat (limited to 'source/blender/windowmanager/intern/wm.c')
-rw-r--r--source/blender/windowmanager/intern/wm.c122
1 files changed, 122 insertions, 0 deletions
diff --git a/source/blender/windowmanager/intern/wm.c b/source/blender/windowmanager/intern/wm.c
index 0b7d5e5f1f4..27fe0d1c7b5 100644
--- a/source/blender/windowmanager/intern/wm.c
+++ b/source/blender/windowmanager/intern/wm.c
@@ -106,6 +106,32 @@ static void window_manager_foreach_id(ID *id, LibraryForeachIDData *data)
static void write_wm_xr_data(BlendWriter *writer, wmXrData *xr_data)
{
BKE_screen_view3d_shading_blend_write(writer, &xr_data->session_settings.shading);
+
+ LISTBASE_FOREACH (XrActionConfig *, ac, &xr_data->session_settings.actionconfigs) {
+ BLO_write_struct(writer, XrActionConfig, ac);
+
+ /* Only write actionmaps for user configs. */
+ if ((ac->flag & XR_ACTIONCONF_USER) != 0) {
+ LISTBASE_FOREACH (XrActionMap *, am, &ac->actionmaps) {
+ BLO_write_struct(writer, XrActionMap, am);
+
+ LISTBASE_FOREACH (XrActionMapItem *, ami, &am->items) {
+ BLO_write_struct(writer, XrActionMapItem, ami);
+ if (ami->op[0] && ami->op_properties) {
+ IDP_BlendWrite(writer, ami->op_properties);
+ }
+
+ LISTBASE_FOREACH (XrActionMapBinding *, amb, &ami->bindings) {
+ BLO_write_struct(writer, XrActionMapBinding, amb);
+ }
+ }
+ }
+ }
+ }
+
+ LISTBASE_FOREACH (XrMotionCaptureObject *, mocap_ob, &xr_data->session_settings.mocap_objects) {
+ BLO_write_struct(writer, XrMotionCaptureObject, mocap_ob);
+ }
}
static void window_manager_blend_write(BlendWriter *writer, ID *id, const void *id_address)
@@ -134,6 +160,39 @@ static void window_manager_blend_write(BlendWriter *writer, ID *id, const void *
static void direct_link_wm_xr_data(BlendDataReader *reader, wmXrData *xr_data)
{
BKE_screen_view3d_shading_blend_read_data(reader, &xr_data->session_settings.shading);
+
+ BLO_read_list(reader, &xr_data->session_settings.actionconfigs);
+
+ LISTBASE_FOREACH (XrActionConfig *, ac, &xr_data->session_settings.actionconfigs) {
+ BLO_read_list(reader, &ac->actionmaps);
+
+ LISTBASE_FOREACH (XrActionMap *, am, &ac->actionmaps) {
+ BLO_read_list(reader, &am->items);
+
+ LISTBASE_FOREACH (XrActionMapItem *, ami, &am->items) {
+ if (ami->op[0] && ami->op_properties) {
+ BLO_read_data_address(reader, &ami->op_properties);
+ IDP_BlendDataRead(reader, &ami->op_properties);
+
+ ami->op_properties_ptr = MEM_callocN(sizeof(PointerRNA), "wmOpItemPtr");
+ WM_operator_properties_create(ami->op_properties_ptr, ami->op);
+ ami->op_properties_ptr->data = ami->op_properties;
+ }
+ else {
+ ami->op_properties = NULL;
+ ami->op_properties_ptr = NULL;
+ }
+
+ BLO_read_list(reader, &ami->bindings);
+ }
+ }
+ }
+
+ BLO_read_data_address(reader, &xr_data->session_settings.defaultconf);
+ BLO_read_data_address(reader, &xr_data->session_settings.addonconf);
+ BLO_read_data_address(reader, &xr_data->session_settings.userconf);
+
+ BLO_read_list(reader, &xr_data->session_settings.mocap_objects);
}
static void window_manager_blend_read_data(BlendDataReader *reader, ID *id)
@@ -227,6 +286,10 @@ static void window_manager_blend_read_data(BlendDataReader *reader, ID *id)
static void lib_link_wm_xr_data(BlendLibReader *reader, ID *parent_id, wmXrData *xr_data)
{
BLO_read_id_address(reader, parent_id->lib, &xr_data->session_settings.base_pose_object);
+
+ LISTBASE_FOREACH (XrMotionCaptureObject *, mocap_ob, &xr_data->session_settings.mocap_objects) {
+ BLO_read_id_address(reader, parent_id->lib, &mocap_ob->ob);
+ }
}
static void lib_link_workspace_instance_hook(BlendLibReader *reader,
@@ -433,6 +496,55 @@ void WM_operator_handlers_clear(wmWindowManager *wm, wmOperatorType *ot)
}
}
+void WM_xr_actionmap_item_bindings_clear(XrActionMapItem *ami)
+{
+ BLI_freelistN(&ami->bindings);
+
+ ami->selbinding = 0;
+}
+
+void WM_xr_actionmap_item_properties_free(XrActionMapItem *ami)
+{
+ if (ami->op_properties_ptr) {
+ WM_operator_properties_free(ami->op_properties_ptr);
+ MEM_freeN(ami->op_properties_ptr);
+ ami->op_properties_ptr = NULL;
+ ami->op_properties = NULL;
+ }
+ else {
+ BLI_assert(ami->op_properties == NULL);
+ }
+}
+
+void WM_xr_actionmap_clear(XrActionMap *actionmap)
+{
+ LISTBASE_FOREACH (XrActionMapItem *, ami, &actionmap->items) {
+ WM_xr_actionmap_item_bindings_clear(ami);
+ WM_xr_actionmap_item_properties_free(ami);
+ }
+
+ BLI_freelistN(&actionmap->items);
+
+ actionmap->selitem = 0;
+}
+
+void WM_xr_actionconfig_clear(XrActionConfig *actionconf)
+{
+ LISTBASE_FOREACH (XrActionMap *, am, &actionconf->actionmaps) {
+ WM_xr_actionmap_clear(am);
+ }
+
+ BLI_freelistN(&actionconf->actionmaps);
+
+ actionconf->selactionmap = actionconf->actactionmap = 0;
+}
+
+void WM_xr_actionconfig_free(XrActionConfig *actionconf)
+{
+ WM_xr_actionconfig_clear(actionconf);
+ MEM_freeN(actionconf);
+}
+
/* ****************************************** */
void WM_keyconfig_reload(bContext *C)
@@ -507,6 +619,9 @@ void WM_check(bContext *C)
/* Case: fileread. */
if ((wm->initialized & WM_WINDOW_IS_INIT) == 0) {
WM_keyconfig_init(C);
+#ifdef WITH_XR_OPENXR
+ WM_xr_actionconfig_init(C);
+#endif
WM_autosave_init(wm);
}
@@ -595,6 +710,13 @@ void wm_close_and_free(bContext *C, wmWindowManager *wm)
WM_keyconfig_free(keyconf);
}
+ XrActionConfig *actionconf;
+ while ((actionconf = BLI_pophead(&wm->xr.session_settings.actionconfigs))) {
+ WM_xr_actionconfig_free(actionconf);
+ }
+
+ BLI_freelistN(&wm->xr.session_settings.mocap_objects);
+
BLI_freelistN(&wm->notifier_queue);
if (wm->message_bus != NULL) {