diff options
Diffstat (limited to 'source/blender/windowmanager/intern/wm.c')
-rw-r--r-- | source/blender/windowmanager/intern/wm.c | 122 |
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) { |