XR_EXT_spatial_persistence
מחרוזת שם
XR_EXT_spatial_persistence
סוג התוסף
תוסף למכונה
מספר השלוחה הרשום
764
גרסה
1
סטטוס האישור
אושר
תלויות של תוספים וגרסאות
XR_EXT_spatial_entity
וגם
XR_EXT_future
שותפים ביצירת התוכן
Nihav Jain, Google
Jared Finder, Google
Natalie Fleury, Meta
Yuichi Taguchi, Meta
Ron Bessems, Meta
Yin Li, Microsoft
Jimmy Alamparambil, ByteDance
Zhipeng Liu, ByteDance
Jun Yan, ByteDance
סקירה כללית
התוסף הזה מאפשר לאפליקציות לגלות ישויות מרחביות ולקשר ביניהן בסשנים של אפליקציות, בסשנים של OpenXR ובהקשרים מרחביים מרובים של OpenXR בסשן. התוסף XR_EXT_spatial_entity קבע שישות בתוך XrSpatialContextEXT מיוצגת על ידי XrSpatialEntityIdEXT . התוסף הזה מרחיב את הקונספט הזה וקובע שישות, אם היא נשמרת, מיוצגת על ידי XrUuid באפליקציה ובסשנים של OpenXR. כלומר, אפליקציה יכולה להשתמש ב-XrUuid שסופק על ידי התוסף הזה כדי לזהות ישות בסשנים שונים. התוסף הזה גם מספק חפיפות שימושיות עם התוסף XR_EXT_spatial_entity כדי לגלות ישויות שנשמרו בסביבה של המשתמש, ואת היכולת לשלוח שאילתות לגבי נתוני הרכיבים שלהן.
הקשר של שמירת נתונים מרחביים
יצירת הקשר של שמירת נתונים מרחביים
XR_DEFINE_HANDLE(XrSpatialPersistenceContextEXT)
הכינוי XrSpatialPersistenceContextEXT מייצג את החיבור לאחסון קבוע של ישויות מרחביות.
הפונקציה xrCreateSpatialPersistenceContextAsyncEXT מוגדרת כך:
XrResult xrCreateSpatialPersistenceContextAsyncEXT(
XrSession session,
const XrSpatialPersistenceContextCreateInfoEXT* createInfo,
XrFutureEXT* future);
תיאורי פרמטרים
-
sessionהוא XrSession שבו ההקשר של ההתמדה המרחבית יהיה פעיל. -
createInfoהוא XrSpatialPersistenceContextCreateInfoEXT שמשמש לציון הפרמטרים של ההקשר של השמירה המרחבית. -
futureהוא מצביע ל-XrFutureEXT.
אפליקציה יכולה ליצור נקודת אחיזה מסוג XrSpatialPersistenceContextEXT באמצעות הפונקציה xrCreateSpatialPersistenceContextAsyncEXT ולהגדיר את היקף ההקשר של השמירה ב-createInfo .
חובה שזמן הריצה יחזיר את הערך XR_ERROR_SPATIAL_PERSISTENCE_SCOPE_UNSUPPORTED_EXT אם XrSpatialPersistenceContextCreateInfoEXT :: scope לא נספר על ידי xrEnumerateSpatialPersistenceScopesEXT .
אם סביבת זמן ריצה אוכפת מערכת הרשאות כדי לשלוט בגישה של האפליקציה לאחסון המתמיד שמיוצג על ידי XrSpatialPersistenceContextEXT , אז סביבת זמן הריצה חייבת להחזיר את הערך XR_ERROR_PERMISSION_INSUFFICIENT אם ההרשאות האלה לא ניתנו לאפליקציה הזו.
שימוש תקין (משתמע)
- חובה להפעיל את התוסף
XR_EXT_spatial_persistenceלפני שקוראים ל-xrCreateSpatialPersistenceContextAsyncEXT -
sessionחייב להיות כינוי תקין של XrSession -
createInfoחייב להיות מצביע למבנה XrSpatialPersistenceContextCreateInfoEXT תקין -
futureחייב להיות מצביע לערךXrFutureEXT
קודי החזרה
XR_SUCCESSXR_SESSION_LOSS_PENDING
XR_ERROR_FUNCTION_UNSUPPORTEDXR_ERROR_HANDLE_INVALIDXR_ERROR_INSTANCE_LOSTXR_ERROR_LIMIT_REACHEDXR_ERROR_OUT_OF_MEMORYXR_ERROR_RUNTIME_FAILUREXR_ERROR_SESSION_LOSTXR_ERROR_SPATIAL_PERSISTENCE_SCOPE_UNSUPPORTED_EXTXR_ERROR_VALIDATION_FAILURE
המבנה של XrSpatialPersistenceContextCreateInfoEXT מוגדר כך:
typedef struct XrSpatialPersistenceContextCreateInfoEXT {
XrStructureType type;
const void* next;
XrSpatialPersistenceScopeEXT scope;
} XrSpatialPersistenceContextCreateInfoEXT;
תיאורי חברים
-
typeהוא ה-XrStructureType של המבנה הזה. -
nextהואNULLאו מצביע למבנה הבא בשרשרת מבנים. מבנים כאלה לא מוגדרים ב-OpenXR או בתוסף הזה. -
scopeהוא XrSpatialPersistenceScopeEXT שמגדיר את היקף האחסון של הקשר השמירה.
המבנה XrSpatialPersistenceContextCreateInfoEXT מתאר את המידע ליצירת נקודת אחיזה (handle) של XrSpatialPersistenceContextEXT.
שימוש תקין (משתמע)
- חובה להפעיל את התוסף
XR_EXT_spatial_persistenceלפני שמשתמשים ב-XrSpatialPersistenceContextCreateInfoEXT -
typeחייב להיותXR_TYPE_SPATIAL_PERSISTENCE_CONTEXT_CREATE_INFO_EXT -
nextחייב להיותNULLאו מצביע תקין למבנה הבא בשרשרת מבנים -
scopeחייב להיות ערך XrSpatialPersistenceScopeEXT תקין
typedef enum XrSpatialPersistenceScopeEXT {
XR_SPATIAL_PERSISTENCE_SCOPE_SYSTEM_MANAGED_EXT = 1,
XR_SPATIAL_PERSISTENCE_SCOPE_LOCAL_ANCHORS_EXT = 1000781000,
XR_SPATIAL_PERSISTENCE_SCOPE_ANCHORS_FOR_CLOUD_SHARING_ANDROIDX1 = 1000808000,
XR_SPATIAL_PERSISTENCE_SCOPE_MAX_ENUM_EXT = 0x7FFFFFFF
} XrSpatialPersistenceScopeEXT;
הספירה XrSpatialPersistenceScopeEXT מזהה את הסוגים השונים של היקפי ההקשר של השמירה.
אלה המשמעויות של ה-enums:
תיאור הטיפוס בן המנייה (enum)
XR_SPATIAL_PERSISTENCE_SCOPE_SYSTEM_MANAGED_EXT
מספק לאפליקציה גישה לקריאה בלבד (כלומר, האפליקציה לא יכולה לשנות את החנות שמשויכת להיקף ההרשאות הזה) לישויות מרחביות שנשמרות ומנוהלות על ידי המערכת. האפליקציה יכולה להשתמש במזהה הייחודי האוניברסלי ברכיב השמירה של ההיקף הזה כדי לקשר בין ישויות בהקשרים מרחביים שונים ובהפעלות מחדש של המכשיר.
XR_SPATIAL_PERSISTENCE_SCOPE_LOCAL_ANCHORS_EXT
פעולות שמירה וגישה לנתונים מוגבלות לעוגנים מרחביים, באותו מכשיר, לאותו משתמש ולאותה אפליקציה (נוספו על ידי התוסף XR_EXT_spatial_persistence_operations)
XR_SPATIAL_PERSISTENCE_SCOPE_ANCHORS_FOR_CLOUD_SHARING_ANDROIDX1
פעולות השמירה והגישה לנתונים מוגבלות לעוגנים מרחביים, שנמצאים בבעלות ובניהול של אותו פרויקט בענן. (נוסף על ידי התוסף XR_ANDROIDX1_spatial_anchor_cloud_sharing)
הפונקציה xrEnumerateSpatialPersistenceScopesEXT מוגדרת כך:
XrResult xrEnumerateSpatialPersistenceScopesEXT(
XrInstance instance,
XrSystemId systemId,
uint32_t persistenceScopeCapacityInput,
uint32_t* persistenceScopeCountOutput,
XrSpatialPersistenceScopeEXT* persistenceScopes);
תיאורי פרמטרים
-
instanceהוא כינוי ל-XrInstance . -
systemIdהוא ה-XrSystemIdשהיקפי ההתמדה המרחבית שלו יפורטו. -
persistenceScopeCapacityInputהוא הקיבולת של המערךpersistenceScopes, או 0 כדי לציין בקשה לאחזור הקיבולת הנדרשת. -
persistenceScopeCountOutputהוא מספר היקפי ההרשאות לשמירת נתונים, או הקיבולת הנדרשת במקרה ש-persistenceScopeCapacityInputלא מספיק. -
persistenceScopesהוא מערך של XrSpatialPersistenceScopeEXT . הערך שלNULLיכול להיותpersistenceScopeCapacityInputאם הוא 0. - בפרק Buffer Size Parameters יש תיאור מפורט של אחזור הגודל הנדרש של
persistenceScopes.
האפליקציה יכולה למנות את רשימת היקפי ההתמדה המרחבית שנתמכים על ידי XrSystemId נתון באמצעות xrEnumerateSpatialPersistenceScopesEXT .
שימוש תקין (משתמע)
- חובה להפעיל את התוסף
XR_EXT_spatial_persistenceלפני שקוראים ל-xrEnumerateSpatialPersistenceScopesEXT -
instanceחייב להיות כינוי תקין של XrInstance -
persistenceScopeCountOutputחייב להיות מצביע לערךuint32_t - אם
persistenceScopeCapacityInputהוא לא0, אזpersistenceScopesחייב להיות מצביע למערך של ערכיpersistenceScopeCapacityInputXrSpatialPersistenceScopeEXT
קודי החזרה
XR_SUCCESS
XR_ERROR_FUNCTION_UNSUPPORTEDXR_ERROR_HANDLE_INVALIDXR_ERROR_INSTANCE_LOSTXR_ERROR_RUNTIME_FAILUREXR_ERROR_SIZE_INSUFFICIENTXR_ERROR_SYSTEM_INVALIDXR_ERROR_VALIDATION_FAILURE
הפונקציה xrCreateSpatialPersistenceContextCompleteEXT מוגדרת כך:
XrResult xrCreateSpatialPersistenceContextCompleteEXT(
XrSession session,
XrFutureEXT future,
XrCreateSpatialPersistenceContextCompletionEXT* completion);
תיאורי פרמטרים
-
sessionהוא ה-XrSession שהועבר קודם ל-xrCreateSpatialPersistenceContextAsyncEXT ::session. -
futureהוא הערך שלXrFutureEXTשהתקבל מ-xrCreateSpatialPersistenceContextAsyncEXT . -
completionהוא מצביע אל XrCreateSpatialPersistenceContextCompletionEXT .
xrCreateSpatialPersistenceContextCompleteEXT משלים את הפעולה האסינכרונית שהתחילה על ידי xrCreateSpatialPersistenceContextAsyncEXT . זמן הריצה חייב להחזיר את הערך XR_ERROR_FUTURE_PENDING_EXT אם future לא במצב מוכן. זמן הריצה חייב להחזיר את הערך XR_ERROR_FUTURE_INVALID_EXT אם הפעולה future כבר הושלמה או בוטלה.
שימוש תקין (משתמע)
- חובה להפעיל את התוסף
XR_EXT_spatial_persistenceלפני שקוראים לפונקציה xrCreateSpatialPersistenceContextCompleteEXT -
sessionחייב להיות כינוי תקין של XrSession -
completionחייב להיות מצביע למבנה XrCreateSpatialPersistenceContextCompletionEXT
קודי החזרה
XR_SUCCESSXR_SESSION_LOSS_PENDING
XR_ERROR_FUNCTION_UNSUPPORTEDXR_ERROR_FUTURE_INVALID_EXTXR_ERROR_FUTURE_PENDING_EXTXR_ERROR_HANDLE_INVALIDXR_ERROR_INSTANCE_LOSTXR_ERROR_LIMIT_REACHEDXR_ERROR_OUT_OF_MEMORYXR_ERROR_RUNTIME_FAILUREXR_ERROR_SESSION_LOSTXR_ERROR_VALIDATION_FAILURE
המבנה של XrCreateSpatialPersistenceContextCompletionEXT מוגדר כך:
typedef struct XrCreateSpatialPersistenceContextCompletionEXT {
XrStructureType type;
void* next;
XrResult futureResult;
XrSpatialPersistenceContextResultEXT createResult;
XrSpatialPersistenceContextEXT persistenceContext;
} XrCreateSpatialPersistenceContextCompletionEXT;
תיאורי חברים
-
typeהוא ה-XrStructureType של המבנה הזה. -
nextהואNULLאו מצביע למבנה הבא בשרשרת מבנים. -
futureResultהוא הערך של XrResult של פעולת היצירה של הקשר ההתמדה המרחבית. -
createResultהוא הערך של XrSpatialPersistenceContextResultEXT של פעולת היצירה של הקשר ההתמדה המרחבית. -
persistenceContextהוא XrSpatialPersistenceContextEXT שנוצר באמצעות הנתונים וההגדרות ב-xrCreateSpatialPersistenceContextAsyncEXT ::createInfo.
קודי החזרה עתידיים
ערכי futureResult:
XR_SUCCESSXR_SESSION_LOSS_PENDING
XR_ERROR_RUNTIME_FAILUREXR_ERROR_INSTANCE_LOSTXR_ERROR_SESSION_LOSTXR_ERROR_OUT_OF_MEMORYXR_ERROR_LIMIT_REACHEDXR_ERROR_PERMISSION_INSUFFICIENT
אם futureResult ו-createResult הם קודי הצלחה, persistenceContext חייב להיות חוקי. אם persistenceContext תקין, הוא חייב להישאר תקין במהלך מחזור החיים של xrCreateSpatialPersistenceContextAsyncEXT :: session או עד שהאפליקציה משתמשת ב-xrDestroySpatialPersistenceContextEXT עם persistenceContext , מה שקורה קודם.
זמן הריצה חייב להגדיר את createResult רק אם futureResult הוא קוד הצלחה.
שימוש תקין (משתמע)
- חובה להפעיל את התוסף
XR_EXT_spatial_persistenceלפני שמשתמשים ב-XrCreateSpatialPersistenceContextCompletionEXT -
typeחייב להיותXR_TYPE_CREATE_SPATIAL_PERSISTENCE_CONTEXT_COMPLETION_EXT -
nextחייב להיותNULLאו מצביע תקין למבנה הבא בשרשרת מבנים -
futureResultחייב להיות ערך XrResult תקין -
createResultחייב להיות ערך XrSpatialPersistenceContextResultEXT תקין -
persistenceContextחייב להיות כינוי תקין של XrSpatialPersistenceContextEXT
typedef enum XrSpatialPersistenceContextResultEXT {
XR_SPATIAL_PERSISTENCE_CONTEXT_RESULT_SUCCESS_EXT = 0,
XR_SPATIAL_PERSISTENCE_CONTEXT_RESULT_ENTITY_NOT_TRACKING_EXT = -1000781001,
XR_SPATIAL_PERSISTENCE_CONTEXT_RESULT_PERSIST_UUID_NOT_FOUND_EXT = -1000781002,
XR_SPATIAL_PERSISTENCE_CONTEXT_RESULT_LOCALIZATION_FAILURE_ANDROIDX1 = -1000808000,
XR_SPATIAL_PERSISTENCE_CONTEXT_RESULT_MAP_FEATURE_INSUFFICIENT_ANDROIDX1 = -1000808001,
XR_SPATIAL_PERSISTENCE_CONTEXT_RESULT_NETWORK_FAILURE_ANDROIDX1 = -1000808002,
XR_SPATIAL_PERSISTENCE_CONTEXT_RESULT_NETWORK_TIMEOUT_ANDROIDX1 = -1000808003,
XR_SPATIAL_PERSISTENCE_CONTEXT_RESULT_MAX_ENUM_EXT = 0x7FFFFFFF
} XrSpatialPersistenceContextResultEXT;
הספירה XrSpatialPersistenceContextResultEXT מזהה את הסוגים השונים של קודי התוצאות לפעולת שמירה. לא תמיד האפליקציה שולטת בכשלים במהלך פעולות שמירה, והספירה הזו משמשת להעברת מקרים כאלה. בדומה ל-XrResult , קודי הצלחה בספירה של XrSpatialPersistenceContextResultEXT הם ערכים לא שליליים, וקודי כישלון הם ערכים שליליים.
אלה המשמעויות של ה-enums:
תיאור הטיפוס בן המנייה (enum)
XR_SPATIAL_PERSISTENCE_CONTEXT_RESULT_SUCCESS_EXT
הפעולה של הקשר ההתמדה הצליחה.
XR_SPATIAL_PERSISTENCE_CONTEXT_RESULT_ENTITY_NOT_TRACKING_EXT
פעולת השמירה נכשלה כי לא ניתן היה לעקוב אחרי הישות בזמן הריצה. (נוסף על ידי התוסף XR_EXT_spatial_persistence_operations)
XR_SPATIAL_PERSISTENCE_CONTEXT_RESULT_PERSIST_UUID_NOT_FOUND_EXT
ה-UUID הקבוע שצוין לא נמצא באחסון. (נוסף על ידי התוסף XR_EXT_spatial_persistence_operations)
XR_SPATIAL_PERSISTENCE_CONTEXT_RESULT_LOCALIZATION_FAILURE_ANDROIDX1
פעולת השמירה נכשלה כי הלוקליזציה נכשלה. (נוסף על ידי התוסף XR_ANDROIDX1_spatial_anchor_cloud_sharing)
XR_SPATIAL_PERSISTENCE_CONTEXT_RESULT_MAP_FEATURE_INSUFFICIENT_ANDROIDX1
פעולת השמירה נכשלה כי תכונת מפת המיקום לא מספיקה. (נוסף על ידי התוסף XR_ANDROIDX1_spatial_anchor_cloud_sharing)
XR_SPATIAL_PERSISTENCE_CONTEXT_RESULT_NETWORK_FAILURE_ANDROIDX1
פעולת השמירה נכשלה כי החיבור לרשת נכשל. (נוסף על ידי התוסף XR_ANDROIDX1_spatial_anchor_cloud_sharing)
XR_SPATIAL_PERSISTENCE_CONTEXT_RESULT_NETWORK_TIMEOUT_ANDROIDX1
פעולת השמירה נכשלה כי הזמן הקצוב לתפוגה של הרשת חלף. (נוסף על ידי התוסף XR_ANDROIDX1_spatial_anchor_cloud_sharing)
השמדת ההקשר של ההתמדה המרחבית
הפונקציה xrDestroySpatialPersistenceContextEXT מוגדרת כך:
XrResult xrDestroySpatialPersistenceContextEXT(
XrSpatialPersistenceContextEXT persistenceContext);
תיאורי פרמטרים
-
persistenceContextהוא XrSpatialPersistenceContextEXT שנוצר בעבר על ידי xrCreateSpatialPersistenceContextAsyncEXT .
האפליקציה יכולה להשתמש ב-xrDestroySpatialPersistenceContextEXT כדי לשחרר את נקודת האחיזה (handle) של persistenceContext כשהיא מסיימת את המשימות של השמירה המרחבית.
סביבת זמן הריצה לא צריכה להרוס את המשאבים הבסיסיים של persistenceContext כשמתבצעת קריאה ל-xrDestroySpatialPersistenceContextEXT אם יש נקודות אחיזה חוקיות של XrSpatialContextEXT ש-persistenceContext קושר אליהן באמצעות XrSpatialContextPersistenceConfigEXT . הסיבה לכך היא שהמשאבים של הקשר השמירה עדיין משמשים את ההקשר המרחבי כדי לגלות ישויות שנשמרו. במצב כזה, השמדת נקודת האחיזה של הקשר ההתמדה רק מסירה את הגישה של האפליקציה למשאבים האלה.
צריך לשחרר את המשאבים של XrSpatialPersistenceContextEXT שנהרס רק כשכל נקודות האחיזה של XrSpatialContextEXT שהוקשר אליהן הקשר ההתמדה נהרסות.
שימוש תקין (משתמע)
- חובה להפעיל את התוסף
XR_EXT_spatial_persistenceלפני שקוראים ל-xrDestroySpatialPersistenceContextEXT -
persistenceContextחייב להיות כינוי תקין של XrSpatialPersistenceContextEXT
Thread Safety
- הגישה אל
persistenceContext, ואל כל נקודות האחיזה הצאצאות, חייבת להיות מסונכרנת באופן חיצוני
קודי החזרה
XR_SUCCESS
XR_ERROR_FUNCTION_UNSUPPORTEDXR_ERROR_HANDLE_INVALIDXR_ERROR_RUNTIME_FAILURE
גילוי ישויות קבועות
רכיב ההתמדה
לישויות מרחביות קבועות יש רכיב קביעות שזמן הריצה חייב לכלול בתמונות המצב של הגילוי והעדכון אם XR_SPATIAL_COMPONENT_TYPE_PERSISTENCE_EXT מופעל במהלך היצירה של XrSpatialContextEXT ונכלל ב-XrSpatialDiscoverySnapshotCreateInfoEXT :: componentTypes או ב-XrSpatialUpdateSnapshotCreateInfoEXT :: componentTypes .
נתוני רכיבים
המבנה של XrSpatialPersistenceDataEXT מוגדר כך:
typedef struct XrSpatialPersistenceDataEXT {
XrUuid persistUuid;
XrSpatialPersistenceStateEXT persistState;
} XrSpatialPersistenceDataEXT;
תיאורי חברים
-
persistUuidהוא XrUuid . -
persistStateהוא XrSpatialPersistenceStateEXT שמייצג את מצב השמירה שלpersistUuid
שימוש תקין (משתמע)
- חובה להפעיל את התוסף
XR_EXT_spatial_persistenceלפני שמשתמשים ב-XrSpatialPersistenceDataEXT -
persistStateחייב להיות ערך XrSpatialPersistenceStateEXT תקין
typedef enum XrSpatialPersistenceStateEXT {
XR_SPATIAL_PERSISTENCE_STATE_LOADED_EXT = 1,
XR_SPATIAL_PERSISTENCE_STATE_NOT_FOUND_EXT = 2,
XR_SPATIAL_PERSISTENCE_STATE_MAX_ENUM_EXT = 0x7FFFFFFF
} XrSpatialPersistenceStateEXT;
הספירה XrSpatialPersistenceStateEXT מזהה את המצבים השונים של ה-UUID הקבוע.
אלה המשמעויות של ה-enums:
תיאור הטיפוס בן המנייה (enum)
XR_SPATIAL_PERSISTENCE_STATE_LOADED_EXT
ה-UUID הקבוע נטען מהאחסון.
XR_SPATIAL_PERSISTENCE_STATE_NOT_FOUND_EXT
ה-UUID הקבוע לא נמצא באחסון, והוא הוסר ממנו או שמעולם לא היה בו.
מבנה רשימת הרכיבים לשליפת נתונים
המבנה של XrSpatialComponentPersistenceListEXT מוגדר כך:
typedef struct XrSpatialComponentPersistenceListEXT {
XrStructureType type;
void* next;
uint32_t persistDataCount;
XrSpatialPersistenceDataEXT* persistData;
} XrSpatialComponentPersistenceListEXT;
תיאורי חברים
-
typeהוא ה-XrStructureType של המבנה הזה. -
nextהואNULLאו מצביע למבנה הבא בשרשרת מבנים. מבנים כאלה לא מוגדרים ב-OpenXR או בתוסף הזה. -
persistDataCountהואuint32_tשמתאר את מספר הרכיבים במערךpersistData. -
persistDataהוא מערך של XrSpatialPersistenceDataEXT .
זמן הריצה חייב להחזיר את הערך XR_ERROR_VALIDATION_FAILURE מ-xrQuerySpatialComponentDataEXT אם XrSpatialComponentPersistenceListEXT נמצא בשרשרת הבאה של XrSpatialComponentDataQueryResultEXT :: next אבל XR_SPATIAL_COMPONENT_TYPE_PERSISTENCE_EXT לא נכלל ב-XrSpatialComponentDataQueryConditionEXT :: componentTypes .
זמן הריצה חייב להחזיר את הערך XR_ERROR_SIZE_INSUFFICIENT מ-xrQuerySpatialComponentDataEXT אם persistDataCount קטן מ-XrSpatialComponentDataQueryResultEXT :: entityIdCountOutput .
בניגוד לרכיבים האחרים, זמן הריצה חייב להגדיר את הנתונים של XR_SPATIAL_COMPONENT_TYPE_PERSISTENCE_EXT בלי קשר ל-XrSpatialEntityTrackingStateEXT .
שימוש תקין (משתמע)
- חובה להפעיל את התוסף
XR_EXT_spatial_persistenceלפני שמשתמשים ב-XrSpatialComponentPersistenceListEXT -
typeחייב להיותXR_TYPE_SPATIAL_COMPONENT_PERSISTENCE_LIST_EXT -
nextחייב להיותNULLאו מצביע תקין למבנה הבא בשרשרת מבנים -
persistDataחייב להיות מצביע למערך של מבניpersistDataCountXrSpatialPersistenceDataEXT - הפרמטר
persistDataCountחייב להיות גדול מ-0
הגדרות אישיות
אם XR_SPATIAL_COMPONENT_TYPE_PERSISTENCE_EXT מופיע ב-XrSpatialCapabilityComponentTypesEXT :: componentTypes עבור יכולת מסוימת, האפליקציה יכולה להפעיל אותה על ידי הכללת ה-enum ברשימה XrSpatialCapabilityConfigurationBaseHeaderEXT :: enabledComponents. הרכיב הזה לא דורש הגדרה מיוחדת כדי להיכלל בשרשרת הבאה של XrSpatialCapabilityConfigurationBaseHeaderEXT . אם האפליקציה כוללת את XR_SPATIAL_COMPONENT_TYPE_PERSISTENCE_EXT ברשימת הרכיבים המופעלים, היא חייבת לכלול גם את XrSpatialContextPersistenceConfigEXT בשרשרת הבאה של XrSpatialContextCreateInfoEXT. אחרת, זמן הריצה חייב להחזיר את XR_ERROR_SPATIAL_CAPABILITY_CONFIGURATION_INVALID_EXT מ-xrCreateSpatialContextAsyncEXT.
הגדרת הקשר מרחבי באמצעות הקשרים של שמירת נתונים
המבנה של XrSpatialContextPersistenceConfigEXT מוגדר כך:
typedef struct XrSpatialContextPersistenceConfigEXT {
XrStructureType type;
const void* next;
uint32_t persistenceContextCount;
const XrSpatialPersistenceContextEXT* persistenceContexts;
} XrSpatialContextPersistenceConfigEXT;
תיאורי חברים
-
typeהוא ה-XrStructureType של המבנה הזה. -
nextהואNULLאו מצביע למבנה הבא בשרשרת מבנים. מבנים כאלה לא מוגדרים ב-OpenXR או בתוסף הזה. -
persistenceContextCountהואuint32_tשמתאר את מספר הרכיבים במערךpersistenceContexts. -
persistenceContextsהוא מערך של XrSpatialPersistenceContextEXT .
אפליקציה יכולה להוסיף את XrSpatialContextPersistenceConfigEXT לשרשרת הבאה של XrSpatialContextCreateInfoEXT . הפעולה הזו תגדיר את XrSpatialContextEXT שנוצר באמצעות persistenceContexts ותאפשר לאפליקציה לגלות את הישויות המרחביות שנשמרו באחסון שמיוצג על ידי נקודות האחיזה של XrSpatialPersistenceContextEXT ב-persistenceContexts .
שימוש תקין (משתמע)
- חובה להפעיל את התוסף
XR_EXT_spatial_persistenceלפני שמשתמשים ב-XrSpatialContextPersistenceConfigEXT -
typeחייב להיותXR_TYPE_SPATIAL_CONTEXT_PERSISTENCE_CONFIG_EXT -
nextחייב להיותNULLאו מצביע תקין למבנה הבא בשרשרת מבנים -
persistenceContextsחייב להיות מצביע למערך שלpersistenceContextCountנקודות אחיזה חוקיות של XrSpatialPersistenceContextEXT - הפרמטר
persistenceContextCountחייב להיות גדול מ-0
יצירת תמונת מצב של הגילוי
חיפוש ישויות עם מזהי UUID ספציפיים
המבנה של XrSpatialDiscoveryPersistenceUuidFilterEXT מוגדר כך:
typedef struct XrSpatialDiscoveryPersistenceUuidFilterEXT {
XrStructureType type;
const void* next;
uint32_t persistedUuidCount;
const XrUuid* persistedUuids;
} XrSpatialDiscoveryPersistenceUuidFilterEXT;
תיאורי חברים
-
typeהוא ה-XrStructureType של המבנה הזה. -
nextהואNULLאו מצביע למבנה הבא בשרשרת מבנים. מבנים כאלה לא מוגדרים ב-OpenXR או בתוסף הזה. -
persistedUuidCountהואuint32_tשמתאר את מספר הרכיבים במערךpersistedUuids -
persistedUuidsהוא מערך של XrUuid .
האפליקציה יכולה להשתמש ב-XrSpatialDiscoveryPersistenceUuidFilterEXT בשרשרת הבאה של XrSpatialDiscoverySnapshotCreateInfoEXT כדי להגביל את פעולת הגילוי רק לישויות שהמזהים הייחודיים האוניברסליים (UUID) הקבועים שלהן נמצאים בקבוצת המזהים הייחודיים האוניברסליים שסופקו ב-persistedUuids .
אם האפליקציה מוסיפה את XrSpatialDiscoveryPersistenceUuidFilterEXT בשרשרת הבאה של XrSpatialDiscoverySnapshotCreateInfoEXT אבל xrCreateSpatialDiscoverySnapshotAsyncEXT :: spatialContext לא הוגדר עם XrSpatialPersistenceContextEXT באמצעות XrSpatialContextPersistenceConfigEXT , זמן הריצה חייב להחזיר את XR_ERROR_VALIDATION_FAILURE מ-xrCreateSpatialDiscoverySnapshotAsyncEXT .
זמן הריצה חייב להתייחס למסנן XrSpatialDiscoveryPersistenceUuidFilterEXT כתנאי AND עם כל מסנן אחר שסופק ב-XrSpatialDiscoverySnapshotCreateInfoEXT או בשרשרת הבאה שלו. סביבת זמן הריצה חייבת להתייחס למערך persistedUuids עצמו כתנאי OR, כלומר לסנן ישויות שיש להן אחד ממזהי ה-UUID שסופקו במערך הזה.
זמן הריצה חייב לכלול רשומה אחת בתמונת המצב שנוצרה לכל אחד מהמזהים הייחודיים האוניברסליים (UUID) ב-persistedUuids, שעבורם הוא הצליח לקבוע את המצב XrSpatialPersistenceStateEXT בשלב הזה.
אם סביבת זמן הריצה מצאה את ה-UUID באחסון שלה, אז:
- זמן הריצה חייב להגדיר את XrSpatialPersistenceStateEXT ב-XrSpatialPersistenceDataEXT של הישות הזו ל-
XR_SPATIAL_PERSISTENCE_STATE_LOADED_EXT. - סביבת זמן הריצה חייבת לכלול
XrSpatialEntityIdEXTתקין של הישות הזו בתמונת המצב שנוצרה. - זמן הריצה חייב להגדיר את XrSpatialEntityTrackingStateEXT של הישות הזו ל-
XR_SPATIAL_ENTITY_TRACKING_STATE_TRACKING_EXTאם הוא עוקב באופן פעיל אחרי הישות ויש לו נתונים תקינים לרכיבים שלה. אחרת, סביבת זמן הריצה חייבת להגדיר את XrSpatialEntityTrackingStateEXT לערךXR_SPATIAL_ENTITY_TRACKING_STATE_PAUSED_EXT.
- זמן הריצה חייב להגדיר את XrSpatialPersistenceStateEXT ב-XrSpatialPersistenceDataEXT של הישות הזו ל-
אם סביבת זמן הריצה קבעה שה-UUID לא נמצא באחסון שלה (בין אם ה-UUID הזה אף פעם לא היה באחסון ובין אם הוא היה קיים פעם אבל מאז הוא לא נשמר), אז:
- זמן הריצה חייב להגדיר את XrSpatialPersistenceStateEXT ב-XrSpatialPersistenceDataEXT של הישות הזו ל-
XR_SPATIAL_PERSISTENCE_STATE_NOT_FOUND_EXTכדי לציין לאפליקציה שה-UUID הזה כבר לא קיים באחסון. - זמן הריצה חייב להגדיר את
XrSpatialEntityIdEXTשל הישות הזו בתמונת המצב שנוצרה ל-XR_NULL_SPATIAL_ENTITY_ID_EXT . - סביבת זמן הריצה חייבת להגדיר את XrSpatialEntityTrackingStateEXT של הישות הזו לערך
XR_SPATIAL_ENTITY_TRACKING_STATE_STOPPED_EXTכדי לציין לאפליקציה שהישות הזו לא תהיה במעקב אף פעם.
- זמן הריצה חייב להגדיר את XrSpatialPersistenceStateEXT ב-XrSpatialPersistenceDataEXT של הישות הזו ל-
אם סביבת זמן הריצה לא הצליחה לקבוע אם ה-UUID נמצא באחסון שלה או לא, היא לא צריכה לכלול אותו בתמונת המצב.
האפליקציה יכולה גם להשתמש ב-XrSpatialDiscoveryPersistenceUuidFilterEXT בשרשרת הבאה של XrSpatialComponentDataQueryConditionEXT כדי לשלוח שאילתות לגבי ישויות של מזהי UUID ספציפיים בתמונות מצב קיימות. כשמשתמשים ב-XrSpatialComponentDataQueryConditionEXT , אם XrSpatialDiscoveryPersistenceUuidFilterEXT :: persistedUuids מכיל XrUuid שלא נמצא ב-XrSpatialSnapshotEXT , זמן הריצה לא יכול לכלול רשומה של XrUuid בתוצאת השאילתה. בנוסף, יכול להיות שסדר (רצף) הישויות בתוצאת השאילתה לא יתאים לסדר של מזהי ה-UUID שסופקו ב-XrSpatialDiscoveryPersistenceUuidFilterEXT :: persistedUuids . האפליקציה צריכה לכלול את XR_SPATIAL_COMPONENT_TYPE_PERSISTENCE_EXT ב-XrSpatialComponentDataQueryConditionEXT :: componentTypes ואת XrSpatialComponentPersistenceListEXT בשרשרת הבאה של XrSpatialComponentDataQueryResultEXT, ואז לבדוק את XrSpatialPersistenceDataEXT :: persistUuid של כל אינדקס של תוצאת שאילתה כדי להבין לאיזה UUID אינדקס התוצאה הנוכחי תואם.
שימוש תקין (משתמע)
- חובה להפעיל את התוסף
XR_EXT_spatial_persistenceלפני שמשתמשים ב-XrSpatialDiscoveryPersistenceUuidFilterEXT -
typeחייב להיותXR_TYPE_SPATIAL_DISCOVERY_PERSISTENCE_UUID_FILTER_EXT -
nextחייב להיותNULLאו מצביע תקין למבנה הבא בשרשרת מבנים -
persistedUuidsחייב להיות מצביע למערך של מבניpersistedUuidCountXrUuid - הפרמטר
persistedUuidCountחייב להיות גדול מ-0
לגלות את כל הישויות שנשמרו
אם האפליקציה משתמשת ב-xrCreateSpatialDiscoverySnapshotAsyncEXT בלי XrSpatialDiscoveryPersistenceUuidFilterEXT ועם XrSpatialContextEXT שהוגדר עם XrSpatialPersistenceContextEXT, אז זמן הריצה חייב לכלול את הישויות האלה בתמונת המצב שנוצרה, שנשמרות באחסון שמיוצג על ידי XrSpatialPersistenceContextEXT ועומדות בדרישות של המסננים שסופקו ב-XrSpatialDiscoverySnapshotCreateInfoEXT . עבור הישויות האלה –
- זמן הריצה חייב להגדיר את XrSpatialPersistenceStateEXT ב-XrSpatialPersistenceDataEXT של הישות הזו ל-
XR_SPATIAL_PERSISTENCE_STATE_LOADED_EXT. - סביבת זמן הריצה חייבת לכלול
XrSpatialEntityIdEXTתקין של הישות הזו בתמונת המצב שנוצרה. - זמן הריצה חייב להגדיר את XrSpatialEntityTrackingStateEXT של הישות הזו ל-
XR_SPATIAL_ENTITY_TRACKING_STATE_TRACKING_EXTאם הוא עוקב באופן פעיל אחרי הישות ויש לו נתונים תקינים לרכיבים שלה. אחרת, סביבת זמן הריצה חייבת להגדיר את XrSpatialEntityTrackingStateEXT לערךXR_SPATIAL_ENTITY_TRACKING_STATE_PAUSED_EXT.
סוגי אובייקטים חדשים
פקודות חדשות
- xrCreateSpatialPersistenceContextAsyncEXT
- xrCreateSpatialPersistenceContextCompleteEXT
- xrDestroySpatialPersistenceContextEXT
- xrEnumerateSpatialPersistenceScopesEXT
מבנים חדשים
- XrCreateSpatialPersistenceContextCompletionEXT
- XrSpatialPersistenceContextCreateInfoEXT
- XrSpatialPersistenceDataEXT
הרחבה של XrSpatialComponentDataQueryResultEXT :
הרחבה של XrSpatialContextCreateInfoEXT :
הרחבה של XrSpatialDiscoverySnapshotCreateInfoEXT , XrSpatialComponentDataQueryConditionEXT :
ערכי Enums חדשים
קבועי Enum חדשים
XR_EXT_SPATIAL_PERSISTENCE_EXTENSION_NAMEXR_EXT_spatial_persistence_SPEC_VERSIONהרחבה של XrObjectType :
XR_OBJECT_TYPE_SPATIAL_PERSISTENCE_CONTEXT_EXT
הרחבת XrResult :
XR_ERROR_SPATIAL_PERSISTENCE_SCOPE_UNSUPPORTED_EXT
הרחבה של XrSpatialComponentTypeEXT :
XR_SPATIAL_COMPONENT_TYPE_PERSISTENCE_EXT
הרחבה של XrStructureType :
XR_TYPE_CREATE_SPATIAL_PERSISTENCE_CONTEXT_COMPLETION_EXTXR_TYPE_SPATIAL_COMPONENT_PERSISTENCE_LIST_EXTXR_TYPE_SPATIAL_CONTEXT_PERSISTENCE_CONFIG_EXTXR_TYPE_SPATIAL_DISCOVERY_PERSISTENCE_UUID_FILTER_EXTXR_TYPE_SPATIAL_PERSISTENCE_CONTEXT_CREATE_INFO_EXT
קוד לדוגמה
יצירת הקשר של שמירת נתונים
// Check if the required persistence scope supported
uint32_t scopeCount;
CHK_XR(xrEnumerateSpatialPersistenceScopesEXT(instance, systemId, 0, &scopeCount, nullptr));
std::vector<XrSpatialPersistenceScopeEXT> persistenceScopes(scopeCount);
CHK_XR(xrEnumerateSpatialPersistenceScopesEXT(instance, systemId, scopeCount, &scopeCount, persistenceScopes.data()));
if (std::find(persistenceScopes.begin(), persistenceScopes.end(), XR_SPATIAL_PERSISTENCE_SCOPE_SYSTEM_MANAGED_EXT) == persistenceScopes.end()) {
return;
}
XrSpatialPersistenceContextEXT persistenceContext{};
XrSpatialPersistenceContextCreateInfoEXT persistenceContextCreateInfo{XR_TYPE_SPATIAL_PERSISTENCE_CONTEXT_CREATE_INFO_EXT};
persistenceContextCreateInfo.scope = XR_SPATIAL_PERSISTENCE_SCOPE_SYSTEM_MANAGED_EXT;
XrFutureEXT createContextFuture;
CHK_XR(xrCreateSpatialPersistenceContextAsyncEXT(session, &persistenceContextCreateInfo, &createContextFuture));
waitUntilReady(createContextFuture);
XrCreateSpatialPersistenceContextCompletionEXT completion{XR_TYPE_CREATE_SPATIAL_PERSISTENCE_CONTEXT_COMPLETION_EXT};
CHK_XR(xrCreateSpatialPersistenceContextCompleteEXT(session, createContextFuture, &completion));
if (completion.futureResult != XR_SUCCESS || completion.createResult != XR_SPATIAL_PERSISTENCE_CONTEXT_RESULT_SUCCESS_EXT) {
return;
}
persistenceContext = completion.persistenceContext;
// ...
// Connect persistence context to a spatial context and discover persisted entities.
// ...
CHK_XR(xrDestroySpatialPersistenceContextEXT(persistenceContext));
חיבור של הקשר ההתמדה להקשר המרחבי
// Note: Anchor capability is just used as an example here. Persistence can be
// supported by other capabilities too. xrEnumerateSpatialCapabilityComponentTypesEXT() can
// be used to check if a certain capability supports persistence.
if (!isSpatialCapabilitySupported(instance, systemId, XR_SPATIAL_CAPABILITY_ANCHOR_EXT)) {
return;
}
const bool supportsPersistenceComponent = isSpatialComponentSupported(instance, systemId, XR_SPATIAL_CAPABILITY_ANCHOR_EXT, XR_SPATIAL_COMPONENT_TYPE_PERSISTENCE_EXT);
// Create a spatial spatial context
XrSpatialContextEXT spatialContext{};
{
std::vector<XrSpatialComponentTypeEXT> enabledComponents = {
XR_SPATIAL_COMPONENT_TYPE_ANCHOR_EXT,
};
if (supportsPersistenceComponent) {
enabledComponents.push_back(XR_SPATIAL_COMPONENT_TYPE_PERSISTENCE_EXT);
}
XrSpatialCapabilityConfigurationAnchorEXT anchorConfig{XR_TYPE_SPATIAL_CAPABILITY_CONFIGURATION_ANCHOR_EXT};
anchorConfig.capability = XR_SPATIAL_CAPABILITY_ANCHOR_EXT;
anchorConfig.enabledComponentCount = enabledComponents.size();
anchorConfig.enabledComponents = enabledComponents.data();
std::array<XrSpatialCapabilityConfigurationBaseHeaderEXT*, 1> capabilityConfigs = {
reinterpret_cast<XrSpatialCapabilityConfigurationBaseHeaderEXT*>(&anchorConfig),
};
XrSpatialContextCreateInfoEXT spatialContextCreateInfo{XR_TYPE_SPATIAL_CONTEXT_CREATE_INFO_EXT};
spatialContextCreateInfo.capabilityConfigCount = capabilityConfigs.size();
spatialContextCreateInfo.capabilityConfigs = capabilityConfigs.data();
XrSpatialContextPersistenceConfigEXT persistenceConfig{XR_TYPE_SPATIAL_CONTEXT_PERSISTENCE_CONFIG_EXT};
persistenceConfig.persistenceContextCount = 1;
persistenceConfig.persistenceContexts = &persistenceContext;
if (supportsPersistenceComponent) {
spatialContextCreateInfo.next = &persistenceConfig;
}
XrFutureEXT createContextFuture;
CHK_XR(xrCreateSpatialContextAsyncEXT(session, &spatialContextCreateInfo, &createContextFuture));
waitUntilReady(createContextFuture);
XrCreateSpatialContextCompletionEXT completion{XR_TYPE_CREATE_SPATIAL_CONTEXT_COMPLETION_EXT};
CHK_XR(xrCreateSpatialContextCompleteEXT(session, createContextFuture, &completion));
if (completion.futureResult != XR_SUCCESS) {
return;
}
spatialContext = completion.spatialContext;
}
// ...
// Discover persisted anchors.
// ...
CHK_XR(xrDestroySpatialContextEXT(spatialContext));
לגלות את כל הישויות שנשמרו
XrFutureEXT future = XR_NULL_FUTURE_EXT;
// We want to look for entities that have the following components.
std::vector<XrSpatialComponentTypeEXT> snapshotComponents = {
XR_SPATIAL_COMPONENT_TYPE_PERSISTENCE_EXT,
};
auto discoverSpatialEntities = [&](XrSpatialContextEXT spatialContext, XrTime time) {
XrSpatialDiscoverySnapshotCreateInfoEXT snapshotCreateInfo{XR_TYPE_SPATIAL_DISCOVERY_SNAPSHOT_CREATE_INFO_EXT};
snapshotCreateInfo.componentTypeCount = snapshotComponents.size();
snapshotCreateInfo.componentTypes = snapshotComponents.data();
CHK_XR(xrCreateSpatialDiscoverySnapshotAsyncEXT(spatialContext, &snapshotCreateInfo, &future));
waitUntilReady(future);
XrCreateSpatialDiscoverySnapshotCompletionInfoEXT completionInfo{XR_TYPE_CREATE_SPATIAL_DISCOVERY_SNAPSHOT_COMPLETION_INFO_EXT};
completionInfo.baseSpace = localSpace;
completionInfo.time = time;
completionInfo.future = future;
XrCreateSpatialDiscoverySnapshotCompletionEXT completion{XR_TYPE_CREATE_SPATIAL_DISCOVERY_SNAPSHOT_COMPLETION_EXT};
CHK_XR(xrCreateSpatialDiscoverySnapshotCompleteEXT(spatialContext, &completionInfo, &completion));
if (completion.futureResult == XR_SUCCESS) {
// Query for the semantic label component data
XrSpatialComponentDataQueryConditionEXT queryCond{XR_TYPE_SPATIAL_COMPONENT_DATA_QUERY_CONDITION_EXT};
queryCond.componentTypeCount = snapshotComponents.size();
queryCond.componentTypes = snapshotComponents.data();
XrSpatialComponentDataQueryResultEXT queryResult{XR_TYPE_SPATIAL_COMPONENT_DATA_QUERY_RESULT_EXT};
CHK_XR(xrQuerySpatialComponentDataEXT(completion.snapshot, &queryCond, &queryResult));
std::vector<XrSpatialEntityIdEXT> entityIds(queryResult.entityIdCountOutput);
std::vector<XrSpatialEntityTrackingStateEXT> entityStates(queryResult.entityIdCountOutput);
queryResult.entityIdCapacityInput = entityIds.size();
queryResult.entityIds = entityIds.data();
queryResult.entityStateCapacityInput = entityStates.size();
queryResult.entityStates = entityStates.data();
std::vector<XrSpatialPersistenceDataEXT> persistenceData(queryResult.entityIdCountOutput);
XrSpatialComponentPersistenceListEXT persistenceDataList{XR_TYPE_SPATIAL_COMPONENT_PERSISTENCE_LIST_EXT};
persistenceDataList.persistDataCount = persistenceData.size();
persistenceDataList.persistData = persistenceData.data();
queryResult.next = &persistenceDataList;
CHK_XR(xrQuerySpatialComponentDataEXT(completion.snapshot, &queryCond, &queryResult));
for (int32_t i = 0; i < queryResult.entityIdCountOutput; ++i) {
// persistenceData[i].persistUuid is the UUID of the persisted entity whose entity ID is entityIds[i].
// The persistenceData array is essentially the uuids persisted in the scope that the current
// XrSpatialPersistenceContextEXT is configured with.
}
CHK_XR(xrDestroySpatialSnapshotEXT(completion.snapshot));
}
};
while (1) {
// ...
// For every frame in frame loop
// ...
XrFrameState frameState; // previously returned from xrWaitFrame
const XrTime time = frameState.predictedDisplayTime;
// Poll for the XR_TYPE_EVENT_DATA_SPATIAL_DISCOVERY_RECOMMENDED_EXT event
XrEventDataBuffer event = {XR_TYPE_EVENT_DATA_BUFFER};
XrResult result = xrPollEvent(instance, &event);
if (result == XR_SUCCESS) {
switch (event.type) {
case XR_TYPE_EVENT_DATA_SPATIAL_DISCOVERY_RECOMMENDED_EXT: {
const XrEventDataSpatialDiscoveryRecommendedEXT& eventdata =
*reinterpret_cast<XrEventDataSpatialDiscoveryRecommendedEXT*>(&event);
// Discover spatial entities for the context that we received the "discovery
// recommended" event for.
discoverSpatialEntities(eventdata.spatialContext, time);
break;
}
}
}
// ...
// Finish frame loop
// ...
}
חיפוש ישויות עם מזהי UUID ספציפיים
XrFutureEXT future = XR_NULL_FUTURE_EXT;
// Load up the uuids that the app has stored on its own i.e. the uuids it is interested in.
std::vector<XrUuid> uuidsStoredByApp = loadPersistedUuids();
// We want to look for entities that have the following components.
std::vector<XrSpatialComponentTypeEXT> snapshotComponents = {
XR_SPATIAL_COMPONENT_TYPE_PERSISTENCE_EXT,
};
auto discoverSpatialEntities = [&](XrSpatialContextEXT spatialContext, XrTime time) {
XrSpatialDiscoveryPersistenceUuidFilterEXT persistenceFilter{XR_TYPE_SPATIAL_DISCOVERY_PERSISTENCE_UUID_FILTER_EXT};
persistenceFilter.persistedUuidCount = uuidsStoredByApp.size();
persistenceFilter.persistedUuids = uuidsStoredByApp.data();
XrSpatialDiscoverySnapshotCreateInfoEXT snapshotCreateInfo{XR_TYPE_SPATIAL_DISCOVERY_SNAPSHOT_CREATE_INFO_EXT};
snapshotCreateInfo.componentTypeCount = snapshotComponents.size();
snapshotCreateInfo.componentTypes = snapshotComponents.data();
snapshotCreateInfo.next = &persistenceFilter;
CHK_XR(xrCreateSpatialDiscoverySnapshotAsyncEXT(spatialContext, &snapshotCreateInfo, &future));
waitUntilReady(future);
XrCreateSpatialDiscoverySnapshotCompletionInfoEXT completionInfo{XR_TYPE_CREATE_SPATIAL_DISCOVERY_SNAPSHOT_COMPLETION_INFO_EXT};
completionInfo.baseSpace = localSpace;
completionInfo.time = time;
completionInfo.future = future;
XrCreateSpatialDiscoverySnapshotCompletionEXT completion{XR_TYPE_CREATE_SPATIAL_DISCOVERY_SNAPSHOT_COMPLETION_EXT};
CHK_XR(xrCreateSpatialDiscoverySnapshotCompleteEXT(spatialContext, &completionInfo, &completion));
if (completion.futureResult == XR_SUCCESS) {
// Query for the semantic label component data
XrSpatialComponentDataQueryConditionEXT queryCond{XR_TYPE_SPATIAL_COMPONENT_DATA_QUERY_CONDITION_EXT};
queryCond.componentTypeCount = snapshotComponents.size();
queryCond.componentTypes = snapshotComponents.data();
XrSpatialComponentDataQueryResultEXT queryResult{XR_TYPE_SPATIAL_COMPONENT_DATA_QUERY_RESULT_EXT};
CHK_XR(xrQuerySpatialComponentDataEXT(completion.snapshot, &queryCond, &queryResult));
std::vector<XrSpatialEntityIdEXT> entityIds(queryResult.entityIdCountOutput);
std::vector<XrSpatialEntityTrackingStateEXT> entityStates(queryResult.entityIdCountOutput);
queryResult.entityIdCapacityInput = entityIds.size();
queryResult.entityIds = entityIds.data();
queryResult.entityStateCapacityInput = entityStates.size();
queryResult.entityStates = entityStates.data();
std::vector<XrSpatialPersistenceDataEXT> persistenceData(queryResult.entityIdCountOutput);
XrSpatialComponentPersistenceListEXT persistenceDataList{XR_TYPE_SPATIAL_COMPONENT_PERSISTENCE_LIST_EXT};
persistenceDataList.persistDataCount = persistenceData.size();
persistenceDataList.persistData = persistenceData.data();
queryResult.next = &persistenceDataList;
CHK_XR(xrQuerySpatialComponentDataEXT(completion.snapshot, &queryCond, &queryResult));
for (int32_t i = 0; i < queryResult.entityIdCountOutput; ++i) {
if (persistenceData[i].persistState == XR_SPATIAL_PERSISTENCE_STATE_LOADED_EXT) {
// persistenceData[i].persistUuid, requested by the app, is present in the persistence scope
// and its corresponding entity ID and state are entityIds[i] & entityStates[i] respectively.
} else if (persistenceData[i].persistState == XR_SPATIAL_PERSISTENCE_STATE_NOT_FOUND_EXT) {
// persistenceData[i].persistUuid, requested by the app, is NOT present in the persistence scope
// and its corresponding entity ID (entityIds[i]) would be XR_NULL_SPATIAL_ENTITY_ID_EXT
// and tracking state (entityStates[i]) would be XR_SPATIAL_ENTITY_TRACKING_STATE_STOPPED_EXT.
}
}
CHK_XR(xrDestroySpatialSnapshotEXT(completion.snapshot));
}
};
while (1) {
// ...
// For every frame in frame loop
// ...
XrFrameState frameState; // previously returned from xrWaitFrame
const XrTime time = frameState.predictedDisplayTime;
// Poll for the XR_TYPE_EVENT_DATA_SPATIAL_DISCOVERY_RECOMMENDED_EXT event
XrEventDataBuffer event = {XR_TYPE_EVENT_DATA_BUFFER};
XrResult result = xrPollEvent(instance, &event);
if (result == XR_SUCCESS) {
switch (event.type) {
case XR_TYPE_EVENT_DATA_SPATIAL_DISCOVERY_RECOMMENDED_EXT: {
const XrEventDataSpatialDiscoveryRecommendedEXT& eventdata =
*reinterpret_cast<XrEventDataSpatialDiscoveryRecommendedEXT*>(&event);
// Discover spatial entities for the context that we received the "discovery
// recommended" event for.
discoverSpatialEntities(eventdata.spatialContext, time);
break;
}
}
}
// ...
// Finish frame loop
// ...
}
בעיות
היסטוריית הגרסאות
גרסה 1, 29.08.2024 (Nihav Jain, Google)
- תיאור התוסף הראשוני