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_SUCCESS
  • XR_SESSION_LOSS_PENDING

נכשל

  • XR_ERROR_FUNCTION_UNSUPPORTED
  • XR_ERROR_HANDLE_INVALID
  • XR_ERROR_INSTANCE_LOST
  • XR_ERROR_LIMIT_REACHED
  • XR_ERROR_OUT_OF_MEMORY
  • XR_ERROR_RUNTIME_FAILURE
  • XR_ERROR_SESSION_LOST
  • XR_ERROR_SPATIAL_PERSISTENCE_SCOPE_UNSUPPORTED_EXT
  • XR_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.

שימוש תקין (משתמע)

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 חייב להיות מצביע למערך של ערכי persistenceScopeCapacityInput XrSpatialPersistenceScopeEXT

קודי החזרה

הצלחה

  • XR_SUCCESS

נכשל

  • XR_ERROR_FUNCTION_UNSUPPORTED
  • XR_ERROR_HANDLE_INVALID
  • XR_ERROR_INSTANCE_LOST
  • XR_ERROR_RUNTIME_FAILURE
  • XR_ERROR_SIZE_INSUFFICIENT
  • XR_ERROR_SYSTEM_INVALID
  • XR_ERROR_VALIDATION_FAILURE

הפונקציה xrCreateSpatialPersistenceContextCompleteEXT מוגדרת כך:

XrResult xrCreateSpatialPersistenceContextCompleteEXT(
    XrSession                                   session,
    XrFutureEXT                                 future,
    XrCreateSpatialPersistenceContextCompletionEXT* completion);

תיאורי פרמטרים

‫xrCreateSpatialPersistenceContextCompleteEXT משלים את הפעולה האסינכרונית שהתחילה על ידי xrCreateSpatialPersistenceContextAsyncEXT . זמן הריצה חייב להחזיר את הערך XR_ERROR_FUTURE_PENDING_EXT אם future לא במצב מוכן. זמן הריצה חייב להחזיר את הערך XR_ERROR_FUTURE_INVALID_EXT אם הפעולה future כבר הושלמה או בוטלה.

שימוש תקין (משתמע)

קודי החזרה

הצלחה

  • XR_SUCCESS
  • XR_SESSION_LOSS_PENDING

נכשל

  • XR_ERROR_FUNCTION_UNSUPPORTED
  • XR_ERROR_FUTURE_INVALID_EXT
  • XR_ERROR_FUTURE_PENDING_EXT
  • XR_ERROR_HANDLE_INVALID
  • XR_ERROR_INSTANCE_LOST
  • XR_ERROR_LIMIT_REACHED
  • XR_ERROR_OUT_OF_MEMORY
  • XR_ERROR_RUNTIME_FAILURE
  • XR_ERROR_SESSION_LOST
  • XR_ERROR_VALIDATION_FAILURE

המבנה של XrCreateSpatialPersistenceContextCompletionEXT מוגדר כך:

typedef struct XrCreateSpatialPersistenceContextCompletionEXT {
    XrStructureType                         type;
    void*                                   next;
    XrResult                                futureResult;
    XrSpatialPersistenceContextResultEXT    createResult;
    XrSpatialPersistenceContextEXT          persistenceContext;
} XrCreateSpatialPersistenceContextCompletionEXT;

תיאורי חברים

קודי החזרה עתידיים

ערכי futureResult:

הצלחה

  • XR_SUCCESS
  • XR_SESSION_LOSS_PENDING

נכשל

  • XR_ERROR_RUNTIME_FAILURE
  • XR_ERROR_INSTANCE_LOST
  • XR_ERROR_SESSION_LOST
  • XR_ERROR_OUT_OF_MEMORY
  • XR_ERROR_LIMIT_REACHED
  • XR_ERROR_PERMISSION_INSUFFICIENT

אם futureResult ו-createResult הם קודי הצלחה, persistenceContext חייב להיות חוקי. אם persistenceContext תקין, הוא חייב להישאר תקין במהלך מחזור החיים של xrCreateSpatialPersistenceContextAsyncEXT :: session או עד שהאפליקציה משתמשת ב-xrDestroySpatialPersistenceContextEXT עם persistenceContext , מה שקורה קודם.

זמן הריצה חייב להגדיר את createResult רק אם futureResult הוא קוד הצלחה.

שימוש תקין (משתמע)

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);

תיאורי פרמטרים

האפליקציה יכולה להשתמש ב-xrDestroySpatialPersistenceContextEXT כדי לשחרר את נקודת האחיזה (handle) של persistenceContext כשהיא מסיימת את המשימות של השמירה המרחבית.

סביבת זמן הריצה לא צריכה להרוס את המשאבים הבסיסיים של persistenceContext כשמתבצעת קריאה ל-xrDestroySpatialPersistenceContextEXT אם יש נקודות אחיזה חוקיות של XrSpatialContextEXT ש-persistenceContext קושר אליהן באמצעות XrSpatialContextPersistenceConfigEXT . הסיבה לכך היא שהמשאבים של הקשר השמירה עדיין משמשים את ההקשר המרחבי כדי לגלות ישויות שנשמרו. במצב כזה, השמדת נקודת האחיזה של הקשר ההתמדה רק מסירה את הגישה של האפליקציה למשאבים האלה.

צריך לשחרר את המשאבים של XrSpatialPersistenceContextEXT שנהרס רק כשכל נקודות האחיזה של XrSpatialContextEXT שהוקשר אליהן הקשר ההתמדה נהרסות.

שימוש תקין (משתמע)

Thread Safety

  • הגישה אל persistenceContext , ואל כל נקודות האחיזה הצאצאות, חייבת להיות מסונכרנת באופן חיצוני

קודי החזרה

הצלחה

  • XR_SUCCESS

נכשל

  • XR_ERROR_FUNCTION_UNSUPPORTED
  • XR_ERROR_HANDLE_INVALID
  • XR_ERROR_RUNTIME_FAILURE

גילוי ישויות קבועות

רכיב ההתמדה

לישויות מרחביות קבועות יש רכיב קביעות שזמן הריצה חייב לכלול בתמונות המצב של הגילוי והעדכון אם XR_SPATIAL_COMPONENT_TYPE_PERSISTENCE_EXT מופעל במהלך היצירה של XrSpatialContextEXT ונכלל ב-XrSpatialDiscoverySnapshotCreateInfoEXT :: componentTypes או ב-XrSpatialUpdateSnapshotCreateInfoEXT :: componentTypes .

נתוני רכיבים

המבנה של XrSpatialPersistenceDataEXT מוגדר כך:

typedef struct XrSpatialPersistenceDataEXT {
    XrUuid                          persistUuid;
    XrSpatialPersistenceStateEXT    persistState;
} XrSpatialPersistenceDataEXT;

תיאורי חברים

שימוש תקין (משתמע)

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_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 .
  • אם סביבת זמן הריצה קבעה שה-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 כדי לציין לאפליקציה שהישות הזו לא תהיה במעקב אף פעם.
  • אם סביבת זמן הריצה לא הצליחה לקבוע אם ה-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 חייב להיות מצביע למערך של מבני persistedUuidCount XrUuid
  • ‫ הפרמטר 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 .

סוגי אובייקטים חדשים

פקודות חדשות

מבנים חדשים

ערכי Enums חדשים

קבועי Enum חדשים

  • XR_EXT_SPATIAL_PERSISTENCE_EXTENSION_NAME
  • XR_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_EXT
    • XR_TYPE_SPATIAL_COMPONENT_PERSISTENCE_LIST_EXT
    • XR_TYPE_SPATIAL_CONTEXT_PERSISTENCE_CONFIG_EXT
    • XR_TYPE_SPATIAL_DISCOVERY_PERSISTENCE_UUID_FILTER_EXT
    • XR_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)

    • תיאור התוסף הראשוני