Fix: Incorrect declaration of XrActionMaps RNA

This fixes a mistake in the XrActionMaps RNA struct declaration.

Originally, the XrActionMaps struct SDNA was set as wmXrData to get
access to wmXrRuntimeData. However, this doesn't give a valid pointer
and the XrSessionState RNA pointer needs to be passed instead.

Since XrSessionState itself does not have SDNA, it is necessary to
pass the XrSessionState pointer to the XrActionMaps struct functions
(new(), new_from_actionmap(), ...) instead of simply using
RNA_def_struct_sdna().
This commit is contained in:
Peter Kim 2021-08-25 20:39:01 +09:00
parent 452cc01932
commit a34652d6f8
1 changed files with 41 additions and 27 deletions

View File

@ -39,6 +39,23 @@
# include "WM_api.h"
/* -------------------------------------------------------------------- */
# ifdef WITH_XR_OPENXR
static wmXrData *rna_XrSession_wm_xr_data_get(PointerRNA *ptr)
{
/* Callers could also get XrSessionState pointer through ptr->data, but prefer if we just
* consistently pass wmXrData pointers to the WM_xr_xxx() API. */
BLI_assert((ptr->type == &RNA_XrSessionSettings) || (ptr->type == &RNA_XrSessionState));
wmWindowManager *wm = (wmWindowManager *)ptr->owner_id;
BLI_assert(wm && (GS(wm->id.name) == ID_WM));
return &wm->xr;
}
# endif
/* -------------------------------------------------------------------- */
/** \name XR Action Map
* \{ */
@ -420,29 +437,32 @@ static void rna_XrActionMapItem_update(Main *UNUSED(bmain), Scene *UNUSED(scene)
# endif
}
static XrActionMap *rna_XrActionMap_new(wmXrData *xr, const char *name, bool replace_existing)
static XrActionMap *rna_XrActionMap_new(PointerRNA *ptr, 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);
# else
UNUSED_VARS(xr, name, replace_existing);
UNUSED_VARS(ptr, name, replace_existing);
return NULL;
# endif
}
static XrActionMap *rna_XrActionMap_new_from_actionmap(wmXrData *xr, XrActionMap *am_src)
static XrActionMap *rna_XrActionMap_new_from_actionmap(PointerRNA *ptr, 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);
# else
UNUSED_VARS(xr, am_src);
UNUSED_VARS(ptr, am_src);
return NULL;
# endif
}
static void rna_XrActionMap_remove(wmXrData *xr, ReportList *reports, PointerRNA *actionmap_ptr)
static void rna_XrActionMap_remove(ReportList *reports, PointerRNA *ptr, 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) {
BKE_reportf(reports, RPT_ERROR, "ActionMap '%s' cannot be removed", actionmap->name);
@ -450,16 +470,17 @@ static void rna_XrActionMap_remove(wmXrData *xr, ReportList *reports, PointerRNA
}
RNA_POINTER_INVALIDATE(actionmap_ptr);
# else
UNUSED_VARS(xr, reports, actionmap_ptr);
UNUSED_VARS(ptr, reports, actionmap_ptr);
# endif
}
static XrActionMap *rna_XrActionMap_find(wmXrData *xr, const char *name)
static XrActionMap *rna_XrActionMap_find(PointerRNA *ptr, const char *name)
{
# ifdef WITH_XR_OPENXR
wmXrData *xr = rna_XrSession_wm_xr_data_get(ptr);
return WM_xr_actionmap_find(xr->runtime, name);
# else
UNUSED_VARS(xr, name);
UNUSED_VARS(ptr, name);
return NULL;
# endif
}
@ -479,23 +500,6 @@ static void rna_XrActionMap_name_update(Main *bmain, Scene *UNUSED(scene), Point
/** \} */
/* -------------------------------------------------------------------- */
# ifdef WITH_XR_OPENXR
static wmXrData *rna_XrSession_wm_xr_data_get(PointerRNA *ptr)
{
/* Callers could also get XrSessionState pointer through ptr->data, but prefer if we just
* consistently pass wmXrData pointers to the WM_xr_xxx() API. */
BLI_assert((ptr->type == &RNA_XrSessionSettings) || (ptr->type == &RNA_XrSessionState));
wmWindowManager *wm = (wmWindowManager *)ptr->owner_id;
BLI_assert(wm && (GS(wm->id.name) == ID_WM));
return &wm->xr;
}
# endif
/* -------------------------------------------------------------------- */
/** \name XR Session Settings
* \{ */
@ -1136,10 +1140,12 @@ static void rna_def_xr_actionmaps(BlenderRNA *brna, PropertyRNA *cprop)
RNA_def_property_srna(cprop, "XrActionMaps");
srna = RNA_def_struct(brna, "XrActionMaps", NULL);
RNA_def_struct_sdna(srna, "wmXrData");
RNA_def_struct_ui_text(srna, "XR Action Maps", "Collection of XR action maps");
func = RNA_def_function(srna, "new", "rna_XrActionMap_new");
RNA_def_function_flag(func, FUNC_NO_SELF);
parm = RNA_def_pointer(func, "xr_session_state", "XrSessionState", "XR Session State", "");
RNA_def_parameter_flags(parm, PROP_NEVER_NULL, PARM_REQUIRED | PARM_RNAPTR);
parm = RNA_def_string(func, "name", NULL, MAX_NAME, "Name", "");
RNA_def_parameter_flags(parm, 0, PARM_REQUIRED);
parm = RNA_def_boolean(func,
@ -1152,6 +1158,9 @@ static void rna_def_xr_actionmaps(BlenderRNA *brna, PropertyRNA *cprop)
RNA_def_function_return(func, parm);
func = RNA_def_function(srna, "new_from_actionmap", "rna_XrActionMap_new_from_actionmap");
RNA_def_function_flag(func, FUNC_NO_SELF);
parm = RNA_def_pointer(func, "xr_session_state", "XrSessionState", "XR Session State", "");
RNA_def_parameter_flags(parm, PROP_NEVER_NULL, PARM_REQUIRED | PARM_RNAPTR);
parm = RNA_def_pointer(
func, "actionmap", "XrActionMap", "Action Map", "Action map to use as a reference");
RNA_def_parameter_flags(parm, PROP_NEVER_NULL, PARM_REQUIRED);
@ -1159,12 +1168,17 @@ static void rna_def_xr_actionmaps(BlenderRNA *brna, PropertyRNA *cprop)
RNA_def_function_return(func, parm);
func = RNA_def_function(srna, "remove", "rna_XrActionMap_remove");
RNA_def_function_flag(func, FUNC_USE_REPORTS);
RNA_def_function_flag(func, FUNC_NO_SELF | FUNC_USE_REPORTS);
parm = RNA_def_pointer(func, "xr_session_state", "XrSessionState", "XR Session State", "");
RNA_def_parameter_flags(parm, PROP_NEVER_NULL, PARM_REQUIRED | PARM_RNAPTR);
parm = RNA_def_pointer(func, "actionmap", "XrActionMap", "Action Map", "Removed action map");
RNA_def_parameter_flags(parm, PROP_NEVER_NULL, PARM_REQUIRED | PARM_RNAPTR);
RNA_def_parameter_clear_flags(parm, PROP_THICK_WRAP, 0);
func = RNA_def_function(srna, "find", "rna_XrActionMap_find");
RNA_def_function_flag(func, FUNC_NO_SELF);
parm = RNA_def_pointer(func, "xr_session_state", "XrSessionState", "XR Session State", "");
RNA_def_parameter_flags(parm, PROP_NEVER_NULL, PARM_REQUIRED | PARM_RNAPTR);
parm = RNA_def_string(func, "name", NULL, MAX_NAME, "Name", "");
RNA_def_parameter_flags(parm, 0, PARM_REQUIRED);
parm = RNA_def_pointer(