Commit: 517dc644f1204e58ea80331edf1d4fe79033a039 Author: Peter Kim Date: Sun Feb 20 15:00:10 2022 +0900 Branches: xr-dev https://developer.blender.org/rB517dc644f1204e58ea80331edf1d4fe79033a039
XR: Customizable Actions https://developer.blender.org/D13420 =================================================================== M source/blender/editors/include/UI_interface.h M source/blender/editors/interface/CMakeLists.txt M source/blender/editors/interface/interface_templates.c M source/blender/makesdna/DNA_xr_types.h M source/blender/makesrna/intern/rna_ui_api.c M source/blender/makesrna/intern/rna_xr.c M source/blender/windowmanager/WM_api.h M source/blender/windowmanager/intern/wm.c M source/blender/windowmanager/intern/wm_files.c M source/blender/windowmanager/xr/intern/wm_xr.c M source/blender/windowmanager/xr/intern/wm_xr_actionmap.c M source/blender/windowmanager/xr/intern/wm_xr_intern.h =================================================================== diff --git a/source/blender/editors/include/UI_interface.h b/source/blender/editors/include/UI_interface.h index 7bbc8249a97..0bdce504946 100644 --- a/source/blender/editors/include/UI_interface.h +++ b/source/blender/editors/include/UI_interface.h @@ -2365,6 +2365,7 @@ void uiTemplateEditModeSelection(uiLayout *layout, struct bContext *C); void uiTemplateReportsBanner(uiLayout *layout, struct bContext *C); void uiTemplateInputStatus(uiLayout *layout, struct bContext *C); void uiTemplateKeymapItemProperties(uiLayout *layout, struct PointerRNA *ptr); +void uiTemplateXrActionmapItemProperties(uiLayout *layout, struct PointerRNA *ptr); bool uiTemplateEventFromKeymapItem(struct uiLayout *layout, const char *text, diff --git a/source/blender/editors/interface/CMakeLists.txt b/source/blender/editors/interface/CMakeLists.txt index 6033aaf9105..3e10d808058 100644 --- a/source/blender/editors/interface/CMakeLists.txt +++ b/source/blender/editors/interface/CMakeLists.txt @@ -102,5 +102,8 @@ if(WIN32 OR APPLE) endif() endif() +if(WITH_XR_OPENXR) + add_definitions(-DWITH_XR_OPENXR) +endif() blender_add_lib(bf_editor_interface "${SRC}" "${INC}" "${INC_SYS}" "${LIB}") diff --git a/source/blender/editors/interface/interface_templates.c b/source/blender/editors/interface/interface_templates.c index f8fbc2d01a6..e3396d14779 100644 --- a/source/blender/editors/interface/interface_templates.c +++ b/source/blender/editors/interface/interface_templates.c @@ -6151,6 +6151,44 @@ void uiTemplateKeymapItemProperties(uiLayout *layout, PointerRNA *ptr) /** \} */ +/* -------------------------------------------------------------------- */ +/** \name XR Actionmap Template + * \{ */ + +#ifdef WITH_XR_OPENXR +static void xr_actionmap_item_modified(bContext *UNUSED(C), + void *UNUSED(ami_p), + void *UNUSED(unused)) +{ +} +#endif + +void uiTemplateXrActionmapItemProperties(uiLayout *layout, PointerRNA *ptr) +{ +#ifdef WITH_XR_OPENXR + PointerRNA propptr = RNA_pointer_get(ptr, "op_properties"); + + if (propptr.data) { + uiBut *but = uiLayoutGetBlock(layout)->buttons.last; + + WM_operator_properties_sanitize(&propptr, false); + /* Use same template as keymap item properties. */ + template_keymap_item_properties(layout, NULL, &propptr); + + for (; but; but = but->next) { + if (but->rnaprop) { + UI_but_func_set(but, xr_actionmap_item_modified, ptr->data, NULL); + UI_but_flag_enable(but, UI_BUT_UPDATE_DELAY); + } + } + } +#else + UNUSED_VARS(layout, ptr); +#endif +} + +/** \} */ + /* -------------------------------------------------------------------- */ /** \name Event Icon Template * \{ */ diff --git a/source/blender/makesdna/DNA_xr_types.h b/source/blender/makesdna/DNA_xr_types.h index 09eab0d7bf7..92f5ff3ccc3 100644 --- a/source/blender/makesdna/DNA_xr_types.h +++ b/source/blender/makesdna/DNA_xr_types.h @@ -36,6 +36,11 @@ typedef struct XrSessionSettings { float clip_start, clip_end; int flag; + + ListBase actionmaps; /* XrActionMap */ + short actactionmap; + short selactionmap; + char _pad3[4]; } XrSessionSettings; typedef enum eXrSessionFlag { @@ -137,7 +142,8 @@ typedef struct XrActionMapBinding { /** Input threshold/region. */ float float_threshold; short axis_flag; /* eXrAxisFlag */ - char _pad[2]; + + short sel_component_path; /** Pose action properties. */ float pose_location[3]; @@ -183,8 +189,8 @@ typedef struct XrActionMapItem { float haptic_frequency; float haptic_amplitude; - short selbinding; - char _pad3[2]; + short sel_user_path; + short sel_binding; ListBase bindings; /* XrActionMapBinding */ } XrActionMapItem; @@ -197,7 +203,7 @@ typedef struct XrActionMap { char name[64]; /* MAX_NAME */ ListBase items; /* XrActionMapItem */ - short selitem; + short sel_item; char _pad[6]; } XrActionMap; diff --git a/source/blender/makesrna/intern/rna_ui_api.c b/source/blender/makesrna/intern/rna_ui_api.c index c4396719bb9..8f12e3fa581 100644 --- a/source/blender/makesrna/intern/rna_ui_api.c +++ b/source/blender/makesrna/intern/rna_ui_api.c @@ -1789,6 +1789,11 @@ void RNA_api_ui_layout(StructRNA *srna) parm = RNA_def_pointer(func, "item", "KeyMapItem", "", ""); RNA_def_parameter_flags(parm, PROP_NEVER_NULL, PARM_REQUIRED | PARM_RNAPTR); + func = RNA_def_function( + srna, "template_xr_actionmap_item_properties", "uiTemplateXrActionmapItemProperties"); + parm = RNA_def_pointer(func, "item", "XrActionMapItem", "", ""); + RNA_def_parameter_flags(parm, PROP_NEVER_NULL, PARM_REQUIRED | PARM_RNAPTR); + func = RNA_def_function(srna, "template_component_menu", "uiTemplateComponentMenu"); RNA_def_function_ui_description(func, "Item. Display expanded property in a popup menu"); parm = RNA_def_pointer(func, "data", "AnyType", "", "Data from which to take property"); diff --git a/source/blender/makesrna/intern/rna_xr.c b/source/blender/makesrna/intern/rna_xr.c index 9fe3153eb1e..83eb92e6533 100644 --- a/source/blender/makesrna/intern/rna_xr.c +++ b/source/blender/makesrna/intern/rna_xr.c @@ -66,6 +66,12 @@ static void rna_XrComponentPath_remove(XrActionMapBinding *amb, PointerRNA *comp int idx = BLI_findindex(&amb->component_paths, component_path); if (idx != -1) { BLI_freelinkN(&amb->component_paths, component_path); + + if (idx <= amb->sel_component_path) { + if (--amb->sel_component_path < 0) { + amb->sel_component_path = 0; + } + } } RNA_POINTER_INVALIDATE(component_path_ptr); # else @@ -216,12 +222,11 @@ static void rna_XrActionMapBinding_name_update(Main *bmain, Scene *UNUSED(scene) { # ifdef WITH_XR_OPENXR wmWindowManager *wm = bmain->wm.first; - if (wm && wm->xr.runtime) { - ListBase *actionmaps = WM_xr_actionmaps_get(wm->xr.runtime); - short idx = WM_xr_actionmap_selected_index_get(wm->xr.runtime); - XrActionMap *actionmap = BLI_findlink(actionmaps, idx); + if (wm) { + XrActionMap *actionmap = BLI_findlink(&wm->xr.session_settings.actionmaps, + wm->xr.session_settings.selactionmap); if (actionmap) { - XrActionMapItem *ami = BLI_findlink(&actionmap->items, actionmap->selitem); + XrActionMapItem *ami = BLI_findlink(&actionmap->items, actionmap->sel_item); if (ami) { XrActionMapBinding *amb = ptr->data; WM_xr_actionmap_binding_ensure_unique(ami, amb); @@ -253,6 +258,12 @@ static void rna_XrUserPath_remove(XrActionMapItem *ami, PointerRNA *user_path_pt int idx = BLI_findindex(&ami->user_paths, user_path); if (idx != -1) { BLI_freelinkN(&ami->user_paths, user_path); + + if (idx <= ami->sel_user_path) { + if (--ami->sel_user_path < 0) { + ami->sel_user_path = 0; + } + } } RNA_POINTER_INVALIDATE(user_path_ptr); # else @@ -537,10 +548,9 @@ static void rna_XrActionMapItem_name_update(Main *bmain, Scene *UNUSED(scene), P { # ifdef WITH_XR_OPENXR wmWindowManager *wm = bmain->wm.first; - if (wm && wm->xr.runtime) { - ListBase *actionmaps = WM_xr_actionmaps_get(wm->xr.runtime); - short idx = WM_xr_actionmap_selected_index_get(wm->xr.runtime); - XrActionMap *actionmap = BLI_findlink(actionmaps, idx); + if (wm) { + XrActionMap *actionmap = BLI_findlink(&wm->xr.session_settings.actionmaps, + wm->xr.session_settings.selactionmap); if (actionmap) { XrActionMapItem *ami = ptr->data; WM_xr_actionmap_item_ensure_unique(actionmap, ami); @@ -561,50 +571,51 @@ static void rna_XrActionMapItem_update(Main *UNUSED(bmain), Scene *UNUSED(scene) # endif } -static XrActionMap *rna_XrActionMap_new(PointerRNA *ptr, const char *name, bool replace_existing) +static XrActionMap *rna_XrActionMap_new(XrSessionSettings *settings, + const char *name, + bool replace_existing) { # ifdef WITH_XR_OPENXR - wmXrData *xr = rna_XrSession_wm_xr_data_get(ptr); - return WM_xr_actionmap_new(xr->runtime, name, replace_existing); + return WM_xr_actionmap_new(settings, name, replace_existing); # else - UNUSED_VARS(ptr, name, replace_existing); + UNUSED_VARS(settings, name, replace_existing); return NULL; # endif } -static XrActionMap *rna_XrActionMap_new_from_actionmap(PointerRNA *ptr, XrActionMap *am_src) +static XrActionMap *rna_XrActionMap_new_from_actionmap(XrSessionSettings *settings, + XrActionMap *am_src) { # ifdef WITH_XR_OPENXR - wmXrData *xr = rna_XrSession_wm_xr_data_get(ptr); - return WM_xr_actionmap_add_copy(xr->runtime, am_src); + return WM_xr_actionmap_add_copy(settings, am_src); # else - UNUSED_VARS(ptr, am_src); + UNUSED_VARS(settings, am_src); return NULL; # endif } -static void rna_XrActionMap_remove(ReportList *reports, PointerRNA *ptr, PointerRNA *actionmap_ptr) +static void rna_XrActionMap_remove(XrSessionSettings *settings, + ReportList *reports, + PointerRNA *actionmap_ptr) { # ifdef WITH_XR_OPENXR - wmXrData *xr = rna_XrSession_wm_xr_data_get(ptr); XrActionMap *actionmap = actionmap_ptr->data; - if (WM_xr_actionmap_remove(xr->runtime, actionmap) == false) { + if (WM_xr_actionmap_remove(settings, actionmap) == false) { BKE_reportf(reports, RPT_ERROR, "ActionMap '%s' cannot be removed", actionmap->name); return; } RNA_POINTER_INVALIDATE(actionmap_ptr); # else - UNUSED_VARS(ptr, reports, actionmap_ptr); + UNUSED_VARS(settings, reports, actionmap_ptr); # endif } -static XrActionMap *rna_XrActionMap_find(PointerRNA *ptr, const char *name) +static XrActionMap *rna_XrActionMap_find(XrSessionSettings *settings, const char *name) { # ifdef WITH_XR_OPENXR - wmXrData *xr = rna_XrSession_wm_xr_data_get(ptr); - return WM_xr_actionmap_find(xr->runtime, name); + return WM_xr_actionmap_find(settings, name); # else - UNUSED_VARS(ptr, name); + UNUSED_VARS(settings, name); return NULL; # endif } @@ -634,9 +645,9 @@ Diff output truncated at 10240 characters. @@ _______________________________________________ Bf-blender-cvs mailing list [email protected] List details, subscription details or unsubscribe: https://lists.blender.org/mailman/listinfo/bf-blender-cvs
