XR_ANDROID_spatial_annotation_tracking

מחרוזת שם

XR_ANDROID_spatial_annotation_tracking

סוג התוסף

הרחבת המכונה

מספר שלוחה רשום

795

Revision

1

סטטוס האישור

לא אושר

תלות בתוסף ובגרסה

XR_EXT_spatial_entity
וגם
XR_EXT_spatial_image_tracking

תאריך השינוי האחרון

2026-01-12

סטטוס כתובת ה-IP

לא ידוע על תלונות על הפרת זכויות יוצרים שקשורות לכתובות IP.

שותפים ביצירת התוכן

Levana Chen, Google
Christopher Feil, Google
Martin Sundermeyer, Google
David Joseph Tan, Google
Jared Finder, Google
Nihav Jain, Google

סקירה כללית

התוסף הזה מספק את היכולת לעקוב אחרי אנוטציות של התוסף XR_EXT_spatial_entity כדי לעקוב אחרי אנוטציות שונות בסצנה. היא מאפשרת לאפליקציות להוסיף שכבות-על לאובייקטים פיזיים או וירטואליים שמוגדרים על ידי הפניות בזמן הריצה.

התוסף הזה מספק סוג בסיסי של אנוטציה, Quad, שהוא פוליגון עם בדיוק 4 צלעות, כלומר מרובע קמור, שמייצג תיבה תוחמת דו-ממדית כללית בהפניה בזמן ריצה. הערה של ריבוע שניתן למעקב מיוצגת כישות מרחבית עם הרכיבים הבאים:

  • XR_SPATIAL_COMPONENT_TYPE_ANNOTATION_QUAD_ANDROID

אפליקציות יכולות בדרך כלל להשתמש בתוסף למעקב אחר הערות מרחביות בדפוסים הבאים:

  • אפליקציה יוצרת קודם כל נקודת אחיזה של XrSpatialReferenceCacheANDROID שמתחילה להקליט הפניות בזמן ריצה מהמקור הנתון.
  • לאחר מכן האפליקציה מתעדת הפניה בזמן ריצה אל XrSpatialReferenceImageEXT ומגדירה הערה רצויה בהפניה במהלך משך הזמן של מטמון ההפניה.
  • לאחר מכן האפליקציה יוצרת נקודת אחיזה של XrSpatialContextEXT על סמך XrSpatialReferenceImageEXT שסופקה על ידי XrSpatialCapabilityConfigurationAnnotationTrackingANDROID .
  • האפליקציה יכולה להרוס את הטיפול ב-XrSpatialReferenceCacheANDROID כדי להפסיק את ההקלטה של הפניות בזמן הריצה, וכך להפחית את השימוש בזיכרון, או להמתין לאירוע XR_TYPE_EVENT_DATA_SPATIAL_ANNOTATION_TRACKING_ANDROID כדי לאשר את תוצאת האתחול.
  • לאחר מכן, האפליקציה שולפת את האירוע XR_TYPE_EVENT_DATA_SPATIAL_ANNOTATION_TRACKING_ANDROID כדי לאשר את תוצאת האתחול של ההערה.
  • אם האתחול מצליח, האפליקציה יכולה לשלוף את אירוע XR_TYPE_EVENT_DATA_SPATIAL_DISCOVERY_RECOMMENDED_EXT כדי לעקוב אחרי ההערה.
  • אם האתחול נכשל, האפליקציה יכולה להשתמש בקוד השגיאה שמוחזר באירוע כדי לקבוע את סיבת הכשל, ולכבות סופית את נקודת האחיזה הקיימת ב-XrSpatialContextEXT כדי להתחיל אנוטציה חדשה.
  • לא משנה מה התוצאה של ההפעלה, האפליקציה יכולה לשחרר את מאגר התמונות כדי לצמצם את השימוש בזיכרון אחרי קבלת האירוע.
  • האפליקציה מגלה הערות ומבצעת עליהן שאילתות בהתאם לדפוסי הגישה לישויות המרחביות.
  • האפליקציה יכולה ליצור נקודת אחיזה נוספת של XrSpatialContextEXT כדי לעקוב אחרי הערות בתוך קובץ עזר חדש במהלך טווח הזמן של XrSpatialReferenceCacheANDROID תקף .
  • האפליקציה יכולה לבצע כיבוי סופי של ה-handle של XrSpatialContextEXT כדי לצמצם באופן דינמי בזמן הריצה את קבוצת האנוטציות שאפשר לזהות ולעקוב אחריהן.

תמיכה בזמן ריצה

חובה לפרסם את התמיכה של זמן הריצה ביכולת המעקב אחר הערות באמצעות xrEnumerateSpatialCapabilitiesEXT על ידי רישום היכולת הבאה:

  • XR_SPATIAL_CAPABILITY_ANNOTATION_TRACKING_ANDROID

כשהסביבה בזמן הריצה תומכת ביכולת מעקב ההערות:

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

XrResult xrEnumerateSpatialAnnotationReferenceSourcesANDROID(
    XrInstance                                  instance,
    XrSystemId                                  systemId,
    XrSpatialCapabilityEXT                      capability,
    uint32_t                                    sourceCapacityInput,
    uint32_t*                                   sourceCountOutput,
    XrSpatialAnnotationReferenceSourceANDROID*  sources);

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

  • instance הוא כינוי ל-XrInstance .
  • systemId הוא XrSystemId שיוצגו המקורות להפניה שלו.
  • capability הוא XrSpatialCapabilityEXT שעבורו יפורטו מקורות ההפניה.
  • sourceCapacityInput הוא הקיבולת של המערך sources, או 0 כדי לציין בקשה לאחזור הקיבולת הנדרשת.
  • sourceCountOutput הוא מספר המקורות או הקיבולת הנדרשת במקרה ש-sourceCapacityInput לא מספיק.
  • sources הוא מערך של XrSpatialAnnotationReferenceSourceANDROID . הערך יכול להיות NULL אם sourceCapacityInput הוא 0.
  • בקטע פרמטרים של גודל המאגר מפורט תיאור של אחזור הגודל הנדרש של sources.

האפליקציה יכולה למנות את רשימת מקורות ההפניה שנתמכים על ידי XrSystemId נתון באמצעות xrEnumerateSpatialAnnotationReferenceSourcesANDROID .

זמן הריצה לא יכול למנות את מקורות ההפניה שהתוסף שלהם לא מופעל עבור instance .

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

קודי החזרה

הצלחה

  • XR_SUCCESS

Failure

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

typedef enum XrSpatialAnnotationReferenceSourceANDROID {
    XR_SPATIAL_ANNOTATION_REFERENCE_SOURCE_CAMERA_ANDROID = 0,
    XR_SPATIAL_ANNOTATION_REFERENCE_SOURCE_MEDIA_PROJECTION_ANDROID = 1,
    XR_SPATIAL_ANNOTATION_REFERENCE_SOURCE_MAX_ENUM_ANDROID = 0x7FFFFFFF
} XrSpatialAnnotationReferenceSourceANDROID;

הספירה XrSpatialAnnotationReferenceSourceANDROID מתארת את מקור ההפניה שמספק את המטא-נתונים של הערה.

המשמעויות של סוגי ה-enum הן:

תיאור ה-Enum

XR_SPATIAL_ANNOTATION_REFERENCE_SOURCE_CAMERA_ANDROID

תמונת הדוגמה היא פלט של תמונה לא חתוכה מ-Android Camera API, למשל תמונה מ-ImageReader שמשויכת ל-CameraDevice של Camera2 או ImageProxy מ-ImageAnalysis שמשויכת ל-CameraX. בדרך כלל מדובר באחת ממצלמות ה-RGB שפונות קדימה.

XR_SPATIAL_ANNOTATION_REFERENCE_SOURCE_MEDIA_PROJECTION_ANDROID

תמונת ההפניה היא פלט לא חתוך של תמונה מ-Android MediaProjection API, למשל תמונה מ-ImageReader שמשויכת לתצוגה וירטואלית של MediaProjection. הוא יכול לכלול תוכן וירטואלי ואמיתי.

המבנה XrSystemSpatialAnnotationPropertiesANDROID מוגדר כך:

typedef struct XrSystemSpatialAnnotationPropertiesANDROID {
    XrStructureType    type;
    void*              next;
    uint32_t           referenceCacheTimespan;
    uint32_t           maxReferencePixelWidth;
    uint32_t           maxReferencePixelHeight;
    uint32_t           maxReferenceCount;
    uint32_t           maxAnnotationCount;
} XrSystemSpatialAnnotationPropertiesANDROID;

תיאורי חברים

  • type הוא XrStructureType של המבנה הזה.
  • next הוא NULL או מצביע למבנה הבא בשרשרת מבנים.
  • referenceCacheTimespan מציין את משך הזמן בשניות של נקודת אחיזה (handle) תקינה של XrSpatialReferenceCacheANDROID.
  • maxReferencePixelWidth מציין את הרוחב המקסימלי של קצה תמונות ההפניה בפיקסלים.
  • maxReferencePixelHeight מציין את הגובה המקסימלי של קצה תמונות ההפניה בפיקסלים.
  • maxReferenceCount מציין את המספר המקסימלי של תמונות להשוואה שיוקצו בו-זמנית.
  • maxAnnotationCount מציין את המספר המקסימלי של הערות שאפשר לעקוב אחריהן בו-זמנית.

אם סביבת זמן הריצה תומכת ביכולת מעקב אחר הערות, אפליקציה יכולה לבדוק מאפייני מערכת רלוונטיים על ידי שרשור מבנה XrSystemSpatialAnnotationPropertiesANDROID אל XrSystemProperties כשקוראים ל-xrGetSystemProperties .

אם הערך של XrSpatialReferenceImageEXT :: width מתוך XrSpatialCapabilityConfigurationAnnotationTrackingANDROID :: reference גדול מ-maxReferencePixelWidth , סביבת הריצה חייבת להחזיר את הערך XR_ERROR_VALIDATION_FAILURE כשקוראים ל-xrCreateSpatialContextAsyncEXT .

אם הערך של XrSpatialReferenceImageEXT :: height מתוך XrSpatialCapabilityConfigurationAnnotationTrackingANDROID :: reference גדול מ-maxReferencePixelHeight , סביבת הריצה חייבת להחזיר את הערך XR_ERROR_VALIDATION_FAILURE כשקוראים ל-xrCreateSpatialContextAsyncEXT .

אם XrSpatialCapabilityConfigurationAnnotationTrackingANDROID :: time נמצא מחוץ לטווח הזמן של XrSpatialReferenceCacheANDROID :: cache , סביבת זמן הריצה חייבת להחזיר XR_ERROR_TIME_INVALID כשקוראים ל-xrCreateSpatialContextAsyncEXT . האפליקציה יכולה ליצור מחדש את ה-handle‏ XrSpatialContextEXT עם הפניה חדשה במהלך פרק הזמן של XrSpatialReferenceCacheANDROID .

אם מספר תמונות ההפניה שהוקצו גדול מ-maxReferenceCount , זמן הריצה חייב להחזיר את הערך XR_ERROR_LIMIT_REACHED ולציין את כשל האתחול באמצעות XrEventDataSpatialAnnotationTrackingANDROID :: initializationResult . האפליקציה יכולה להרוס את ה-handle של XrSpatialContextEXT ולנסות שוב אחרי שההמתנה לסיום האתחול תסתיים.

אם מספר ההערות הפעילות גדול מ-maxAnnotationCount , סביבת זמן הריצה חייבת להחזיר XR_ERROR_VALIDATION_FAILURE כשקוראים לפונקציה xrCreateSpatialContextAsyncEXT .

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

מטמון הפניות בזמן ריצה

XR_DEFINE_HANDLE(XrSpatialReferenceCacheANDROID)

ה-handle‏ XrSpatialReferenceCacheANDROID מייצג מטמון של הפניות בזמן ריצה שתועדו ממקור נתון.

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

XrResult xrCreateSpatialReferenceCacheAsyncANDROID(
    XrSession                                   session,
    const XrSpatialReferenceCacheCreateInfoANDROID* createInfo,
    XrFutureEXT*                                future);

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

  • session הוא XrSession שבו מטמון ההפניות יהיה פעיל.
  • createInfo הוא מצביע אל XrSpatialReferenceCacheCreateInfoANDROID שמשמש לציון הפרמטרים של מטמון ההפניות.
  • future הוא מצביע לטיפול בפלט של XrFutureEXT .

האפליקציה יכולה ליצור נקודת אחיזה של XrSpatialReferenceCacheANDROID על ידי קריאה ל-xrCreateSpatialReferenceCacheAsyncANDROID . יכול להיות שיעבור זמן מה עד שסביבת זמן הריצה תאתחל את שירותי המעקב. אחרי כן, האפליקציה יכולה לקרוא שוב ושוב לפונקציה xrCreateSpatialReferenceCacheCompleteANDROID כדי לבדוק אם הפעולה האסינכרונית הזו הושלמה.

סביבת זמן הריצה חייבת להחזיר את הערך XR_ERROR_SPATIAL_CAPABILITY_UNSUPPORTED_EXT אם XrSpatialReferenceCacheCreateInfoANDROID :: capability לא מופיע ברשימה של xrEnumerateSpatialCapabilitiesEXT .

סביבת זמן הריצה צריכה להחזיר XR_ERROR_FEATURE_UNSUPPORTED אם XrSpatialReferenceCacheCreateInfoANDROID :: source לא מופיע ב-xrEnumerateSpatialAnnotationReferenceSourcesANDROID עבור היכולת הנתונה.

האפליקציה יכולה ליצור רק שם אחד לכל מקור עבור יכולת נתונה. אחרת, סביבת זמן הריצה חייבת להחזיר XR_ERROR_LIMIT_REACHED .

האפליקציה יכולה לתעד הפניות בזמן ריצה במהלך טווח הזמן של נקודת האחיזה XrSpatialReferenceCacheANDROID כדי להגדיר נקודת אחיזה חדשה של XrSpatialContextEXT.

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

קודי החזרה

הצלחה

  • XR_SUCCESS
  • XR_SESSION_LOSS_PENDING

Failure

  • XR_ERROR_FEATURE_UNSUPPORTED
  • 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_CAPABILITY_UNSUPPORTED_EXT
  • XR_ERROR_VALIDATION_FAILURE

המבנה XrSpatialReferenceCacheCreateInfoANDROID מוגדר כך:

typedef struct XrSpatialReferenceCacheCreateInfoANDROID {
    XrStructureType                              type;
    const void*                                  next;
    XrSpatialCapabilityEXT                       capability;
    XrSpatialAnnotationReferenceSourceANDROID    source;
} XrSpatialReferenceCacheCreateInfoANDROID;

תיאורי חברים

  • type הוא XrStructureType של המבנה הזה.
  • next הוא NULL או מצביע למבנה הבא בשרשרת מבנים. לא מוגדרים מבנים כאלה ב-OpenXR או בתוסף הזה.
  • capability הוא XrSpatialCapabilityEXT שמתאר עבור איזו יכולת נוצר מטמון ההפניות.
  • source הוא XrSpatialAnnotationReferenceSourceANDROID שמתאר את המקור של מטמון ההפניות.

המבנה XrSpatialReferenceCacheCreateInfoANDROID מתאר את המידע ליצירת נקודת אחיזה XrSpatialReferenceCacheANDROID.

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

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

XrResult xrCreateSpatialReferenceCacheCompleteANDROID(
    XrSession                                   session,
    XrFutureEXT                                 future,
    XrCreateSpatialReferenceCacheCompletionANDROID* completion);

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

האפליקציה יכולה לקרוא ל-xrCreateSpatialReferenceCacheCompleteANDROID כדי להמתין להשלמת הפעולה האסינכרונית שהופעלה על ידי xrCreateSpatialReferenceCacheAsyncANDROID .

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

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

קודי החזרה

הצלחה

  • XR_SUCCESS
  • XR_SESSION_LOSS_PENDING

Failure

  • XR_ERROR_FEATURE_UNSUPPORTED
  • 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

המבנה XrCreateSpatialReferenceCacheCompletionANDROID מוגדר כך:

typedef struct XrCreateSpatialReferenceCacheCompletionANDROID {
    XrStructureType                   type;
    void*                             next;
    XrResult                          futureResult;
    XrSpatialReferenceCacheANDROID    referenceCache;
} XrCreateSpatialReferenceCacheCompletionANDROID;

תיאורי חברים

  • type הוא XrStructureType של המבנה הזה.
  • next הוא NULL או מצביע למבנה הבא בשרשרת מבנים. לא מוגדרים מבנים כאלה ב-OpenXR או בתוסף הזה.
  • futureResult הוא XrResult של פעולת יצירת מטמון ההפניות.
  • referenceCache הוא ה-handle של XrSpatialReferenceCacheANDROID אם הפעולה מצליחה.

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

ערכים של futureResult:

הצלחה

  • XR_SUCCESS
  • XR_SESSION_LOSS_PENDING

Failure

  • XR_ERROR_FEATURE_UNSUPPORTED
  • XR_ERROR_RUNTIME_FAILURE
  • XR_ERROR_INSTANCE_LOST
  • XR_ERROR_SESSION_LOST
  • XR_ERROR_OUT_OF_MEMORY
  • XR_ERROR_LIMIT_REACHED

אם futureResult הוא קוד הצלחה, זמן הריצה חייב להחזיר נקודת אחיזה (handle) תקפה של referenceCache. אם referenceCache תקף, הוא יישאר תקף רק למשך חייו של xrCreateSpatialReferenceCacheAsyncANDROID :: session או עד שהאפליקציה תהרוס את ה-handle באמצעות xrDestroySpatialReferenceCacheANDROID, לפי המוקדם מביניהם.

כשהערך referenceCache תקין, הוא מתעד מטמונים ב-XrSystemSpatialAnnotationPropertiesANDROID :: referenceCacheTimespan .

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

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

XrResult xrDestroySpatialReferenceCacheANDROID(
    XrSpatialReferenceCacheANDROID              cacheHandle);

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

האפליקציה יכולה לקרוא לפונקציה xrDestroySpatialReferenceCacheANDROID כדי לשחרר את ה-handle של cacheHandle ואת המשאבים הבסיסיים כשמסיימים ליצור את ההקשר המרחבי.

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

Thread Safety

  • הגישה אל cacheHandle ואל כל הכינויים של הילדים חייבת להיות מסונכרנת חיצונית

קודי החזרה

הצלחה

  • XR_SUCCESS

Failure

  • XR_ERROR_FUNCTION_UNSUPPORTED
  • XR_ERROR_HANDLE_INVALID

הגדרות אישיות

המבנה XrSpatialCapabilityConfigurationAnnotationTrackingANDROID מוגדר באופן הבא:

typedef struct XrSpatialCapabilityConfigurationAnnotationTrackingANDROID {
    XrStructureType                     type;
    const void*                         next;
    XrSpatialCapabilityEXT              capability;
    uint32_t                            enabledComponentCount;
    const XrSpatialComponentTypeEXT*    enabledComponents;
    XrSpatialReferenceCacheANDROID      cache;
    XrTime                              time;
    XrSpatialReferenceImageEXT          reference;
} XrSpatialCapabilityConfigurationAnnotationTrackingANDROID;

תיאורי חברים

  • type הוא XrStructureType של המבנה הזה.
  • next הוא NULL או מצביע למבנה הבא בשרשרת מבנים.
  • capability הוא XrSpatialCapabilityEXT וחייב להיות XR_SPATIAL_CAPABILITY_ANNOTATION_TRACKING_ANDROID .
  • enabledComponentCount הוא uint32_t שמתאר את מספר האלמנטים במערך enabledComponents.
  • enabledComponents הוא מצביע למערך של XrSpatialComponentTypeEXT .
  • cache הוא XrSpatialReferenceCacheANDROID שנוצר קודם לכן כדי לתעד הפניות בזמן ריצה להגדרה reference.
  • time הוא XrTime שבו מתועד reference.
  • reference הוא XrSpatialReferenceImageEXT עם הערות שמשורשרות למצביע הבא שלו.

אפליקציות יכולות להפעיל את היכולת המרחבית XR_SPATIAL_CAPABILITY_ANNOTATION_TRACKING_ANDROID על ידי הוספת מצביע למבנה XrSpatialCapabilityConfigurationAnnotationTrackingANDROID ב-XrSpatialContextCreateInfoEXT :: capabilityConfigs .

זמן הריצה חייב להחזיר XR_ERROR_VALIDATION_FAILURE אם capability הוא לא XR_SPATIAL_CAPABILITY_ANNOTATION_TRACKING_ANDROID .

סביבת זמן הריצה חייבת להחזיר את הערך XR_ERROR_SPATIAL_CAPABILITY_CONFIGURATION_INVALID_EXT אם reference לא מכיל הערות.

זמן הריצה חייב להחזיר XR_ERROR_SPATIAL_CAPABILITY_CONFIGURATION_INVALID_EXT אם רכיב ההערה מופיע ב-enabledComponents אבל לא משויכות אליו הערות תואמות ב-reference .

הפונקציה runtime חייבת להחזיר את הערך XR_ERROR_VALIDATION_FAILURE אם cache לא בבעלות אותו XrSession שעובר אל xrCreateSpatialContextAsyncEXT .

סביבת זמן הריצה חייבת להחזיר XR_ERROR_TIME_INVALID אם time נמצא מחוץ לטווח הזמן של cache .

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

אירועים של מעקב אחר הערות

המבנה XrEventDataSpatialAnnotationTrackingANDROID מוגדר כך:

typedef struct XrEventDataSpatialAnnotationTrackingANDROID {
    XrStructureType        type;
    const void*            next;
    XrSpatialContextEXT    spatialContext;
    uint32_t               annotationIndex;
    XrResult               initializationResult;
} XrEventDataSpatialAnnotationTrackingANDROID;

תיאורי חברים

  • type הוא XrStructureType של המבנה הזה.
  • next הוא NULL או מצביע למבנה הבא בשרשרת מבנים.
  • spatialContext הוא XrSpatialContextEXT שהופעל בו מעקב אחר הערות.
  • annotationIndex maps to the index from the annotation array associated with XrSpatialCapabilityConfigurationAnnotationTrackingANDROID :: reference .
  • initializationResult מציין את תוצאת האתחול של ההערה. אם הערך הוא לא XR_SUCCESS , האפליקציה יכולה להרוס וליצור מחדש את ה-handle של XrSpatialContextEXT כדי לאתחל מחדש את ההערה, או להמשיך להשתמש ב-spatialContext כדי לעקוב אחרי הערות אחרות.

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

בזמן הריצה חובה לאכלס את XrEventDataSpatialAnnotationTrackingANDROID לכל הערה כדי לציין שההפעלה שלה הושלמה. לא משנה מה התוצאה של האתחול, האפליקציה יכולה לשחרר את מאגר התמונות כדי לצמצם את השימוש בזיכרון אחרי קבלת האירוע.

בזמן הריצה, אם ההערה מאותחלת בהצלחה, חובה לאכלס את initializationResult ב-XR_SUCCESS. אחרי כן, האפליקציה יכולה לשלוף את אירוע XR_TYPE_EVENT_DATA_SPATIAL_DISCOVERY_RECOMMENDED_EXT כדי לעקוב אחרי ההערה.

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

הערה מרובעת

סביבת ריצה חייבת לפרסם את התמיכה שלה בהערות מרובעות באמצעות xrEnumerateSpatialCapabilityComponentTypesEXT על ידי רישום סוג הרכיב הבא:

  • XR_SPATIAL_COMPONENT_TYPE_ANNOTATION_QUAD_ANDROID

Quad Reference

המבנה XrSpatialAnnotationQuadReferenceANDROID מוגדר כך:

typedef struct XrSpatialAnnotationQuadReferenceANDROID {
    XrStructureType                          type;
    const void*                              next;
    uint32_t                                 quadCount;
    const XrSpatialAnnotationQuadANDROID*    quads;
} XrSpatialAnnotationQuadReferenceANDROID;

תיאורי חברים

  • type הוא XrStructureType של המבנה הזה.
  • next הוא NULL או מצביע למבנה הבא בשרשרת מבנים.
  • quadCount הוא uint32_t שמתאר את מספר האלמנטים במערך quads.
  • quads הוא המצביע למערך של XrSpatialAnnotationQuadANDROID .

כשסביבת זמן הריצה תומכת בהערות מרובעות, אפליקציה יכולה להגדיר הערות על ידי שרשור מבנה XrSpatialAnnotationQuadReferenceANDROID אל XrSpatialReferenceImageEXT :: next והגדרת ההפניה ב-XrSpatialCapabilityConfigurationAnnotationTrackingANDROID :: reference כשיוצרים את נקודת האחיזה XrSpatialContextEXT.

אם הערך של quadCount הוא 0, סביבת זמן הריצה חייבת להחזיר את הערך XR_ERROR_SPATIAL_CAPABILITY_CONFIGURATION_INVALID_EXT מהפונקציה xrCreateSpatialContextAsyncEXT.

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

המבנה XrSpatialAnnotationQuadANDROID מוגדר כך:

typedef struct XrSpatialAnnotationQuadANDROID {
    XrSpatialAnnotationQuadAlignmentANDROID    alignment;
    XrVector2f                                 upperLeft;
    XrVector2f                                 upperRight;
    XrVector2f                                 lowerRight;
    XrVector2f                                 lowerLeft;
} XrSpatialAnnotationQuadANDROID;

תיאורי חברים

  • alignment הוא XrSpatialAnnotationQuadAlignmentANDROID של הריבוע.
  • upperLeft הוא XrVector2f שמתאר את הקואורדינטה של הפינה השמאלית העליונה של הריבוע שקשורה לנקודת המוצא.
  • upperRight הוא XrVector2f שמתאר את הקואורדינטה של הפינה השמאלית העליונה של הריבוע ביחס לנקודת האפס.
  • lowerRight הוא XrVector2f שמתאר את הקואורדינטה של הפינה השמאלית התחתונה של המרובע ביחס לנקודת המוצא.
  • lowerLeft הוא XrVector2f שמתאר את הקואורדינטה של הפינה השמאלית התחתונה של הריבוע שקשורה לנקודת האפס.

מרובע במרחב דו-ממדי הוא מרובע קמור עם סדר בכיוון השעון. הערך של 4 הפינות קשור למקור (0, 0) שאליו משויך הריבוע.

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

typedef enum XrSpatialAnnotationQuadAlignmentANDROID {
    XR_SPATIAL_ANNOTATION_QUAD_ALIGNMENT_SCREEN_ANDROID = 0,
    XR_SPATIAL_ANNOTATION_QUAD_ALIGNMENT_OBJECT_ANDROID = 1,
    XR_SPATIAL_ANNOTATION_QUAD_ALIGNMENT_MAX_ENUM_ANDROID = 0x7FFFFFFF
} XrSpatialAnnotationQuadAlignmentANDROID;

הספירה XrSpatialAnnotationQuadAlignmentANDROID מתארת את היישור של הערת הריבוע.

המשמעויות של סוגי ה-enum הן:

תיאור ה-Enum

XR_SPATIAL_ANNOTATION_QUAD_ALIGNMENT_SCREEN_ANDROID

הריבוע של ההערה מקביל למישור המסך, והסיבוב שלו במישור נשאר נעול לכוח המשיכה של העולם. הפלט מופיע כתיבת תוחמת רגילה וזקופה.

XR_SPATIAL_ANNOTATION_QUAD_ALIGNMENT_OBJECT_ANDROID

הריבוע של ההערה מעוגן ישירות לאובייקט, בהתאם ליישור שהוגדר בתמונה לדוגמה. הפלט הוא מרובע קמור, והצורה שלו מותאמת לפרספקטיבה של האובייקט.

רכיבים של Quad

המבנה XrSpatialAnnotationQuadDataANDROID מוגדר כך:

typedef struct XrSpatialAnnotationQuadDataANDROID {
    uint32_t                          annotationIndex;
    XrSpaceLocationData               origin;
    XrSpatialAnnotationQuadANDROID    quad;
} XrSpatialAnnotationQuadDataANDROID;

תיאורי חברים

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

המבנה XrSpatialComponentAnnotationQuadListANDROID מוגדר כך:

typedef struct XrSpatialComponentAnnotationQuadListANDROID {
    XrStructureType                        type;
    void*                                  next;
    uint32_t                               quadCount;
    XrSpatialAnnotationQuadDataANDROID*    quads;
} XrSpatialComponentAnnotationQuadListANDROID;

תיאורי חברים

  • type הוא XrStructureType של המבנה הזה.
  • next הוא NULL או מצביע למבנה הבא בשרשרת מבנים.
  • quadCount הוא uint32_t שמתאר את מספר האלמנטים במערך quads.
  • quads הוא מערך של XrSpatialAnnotationQuadDataANDROID .

האפליקציה יכולה לשלוח שאילתה לרכיב ההערות של הריבועים של הישויות המרחביות ב-XrSpatialSnapshotEXT על ידי הוספת XR_SPATIAL_COMPONENT_TYPE_ANNOTATION_QUAD_ANDROID ב-XrSpatialComponentDataQueryConditionEXT :: componentTypes והוספת XrSpatialComponentAnnotationQuadListANDROID לשרשרת המצביעים הבאה של XrSpatialComponentDataQueryResultEXT .

זמן הריצה חייב להחזיר XR_ERROR_VALIDATION_FAILURE מ-xrQuerySpatialComponentDataEXT אם XrSpatialComponentAnnotationQuadListANDROID נמצא בשרשרת הבאה של XrSpatialComponentDataQueryResultEXT :: next אבל XR_SPATIAL_COMPONENT_TYPE_ANNOTATION_QUAD_ANDROID לא נכלל ב-XrSpatialComponentDataQueryConditionEXT :: componentTypes .

סביבת זמן הריצה חייבת להחזיר XR_ERROR_SIZE_INSUFFICIENT מ-xrQuerySpatialComponentDataEXT אם quadCount קטן מ-XrSpatialComponentDataQueryResultEXT :: entityIdCountOutput .

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

קוד לדוגמה

בדיקת התמיכה בסביבת זמן הריצה

בדוגמת הקוד הבאה אפשר לראות איך בודקים אם סביבת זמן הריצה תומכת ביכולת מעקב אחר הערות.

XrInstance instance;  // previously initialized
XrSystemId systemId;  // previously initialized
XrSession session;    // previously initialized
XrSpace localSpace;   // previously initialized, e.g. from
                      // XR_REFERENCE_SPACE_TYPE_LOCAL

PFN_xrEnumerateSpatialCapabilitiesEXT xrEnumerateSpatialCapabilitiesEXT;
PFN_xrEnumerateSpatialAnnotationReferenceSourcesANDROID xrEnumerateSpatialAnnotationReferenceSourcesANDROID;
PFN_xrEnumerateSpatialReferenceImageFormatsEXT xrEnumerateSpatialReferenceImageFormatsEXT;
PFN_xrEnumerateSpatialCapabilityComponentTypesEXT xrEnumerateSpatialCapabilityComponentTypesEXT;

// Check spatial annotation tracking capability
uint32_t capabilityCount;
CHK_XR(xrEnumerateSpatialCapabilitiesEXT(instance, systemId, 0,
                                         &capabilityCount, nullptr));
std::vector<XrSpatialCapabilityEXT> capabilities(capabilityCount);
CHK_XR(xrEnumerateSpatialCapabilitiesEXT(instance, systemId, capabilityCount,
                                         &capabilityCount,
                                         capabilities.data()));
if (std::find(capabilities.begin(), capabilities.end(),
              XR_SPATIAL_CAPABILITY_ANNOTATION_TRACKING_ANDROID) ==
    capabilities.end()) {
  // System does not support spatial annotation tracking.
  return;
}

// Inspect system properties for annotation tracking variables
XrSystemSpatialAnnotationPropertiesANDROID annotationSystemProperties{
    XR_TYPE_SYSTEM_SPATIAL_ANNOTATION_PROPERTIES_ANDROID};
XrSystemProperties systemProperties{.type = XR_TYPE_SYSTEM_PROPERTIES,
                                    .next = &annotationSystemProperties,
                                    .systemId = systemId};
CHK_XR(xrGetSystemProperties(instance, systemId, &systemProperties));
if (annotationSystemProperties.maxAnnotationCount == 0) {
  // System does not support any active annotations.
  return;
}

// Enumerate supported reference sources
uint32_t sourceCountOutput = 0;
XrSpatialAnnotationReferenceSourceANDROID desiredSource =
    XR_SPATIAL_ANNOTATION_REFERENCE_SOURCE_CAMERA_ANDROID;
CHK_XR(xrEnumerateSpatialAnnotationReferenceSourcesANDROID(
    instance, systemId, XR_SPATIAL_CAPABILITY_ANNOTATION_TRACKING_ANDROID,
    0, &sourceCountOutput, nullptr));
std::vector<XrSpatialAnnotationReferenceSourceANDROID> sources(sourceCountOutput);
CHK_XR(xrEnumerateSpatialAnnotationReferenceSourcesANDROID(
    instance, systemId, XR_SPATIAL_CAPABILITY_ANNOTATION_TRACKING_ANDROID,
    sourceCountOutput, &sourceCountOutput, sources.data()));
if (std::find(sources.begin(), sources.end(), desiredSource) == sources.end()) {
  // The desired source is not supported.
  return;
}

// Enumerate supported reference image formats, provided by XR_EXT_spatial_image_tracking.
uint32_t formatCountOutput = 0;
XrSpatialReferenceImageFormatEXT desiredFormat =
    XR_SPATIAL_REFERENCE_IMAGE_FORMAT_YUV_420_888_EXT; // Or XR_SPATIAL_REFERENCE_IMAGE_FORMAT_RGBA_8888_EXT for screenshot.
CHK_XR(xrEnumerateSpatialReferenceImageFormatsEXT(
    instance, systemId, XR_SPATIAL_CAPABILITY_ANNOTATION_TRACKING_ANDROID, 0,
    &formatCountOutput, nullptr));
std::vector<XrSpatialReferenceImageFormatEXT> formats(formatCountOutput);
CHK_XR(xrEnumerateSpatialReferenceImageFormatsEXT(
    instance, systemId, XR_SPATIAL_CAPABILITY_ANNOTATION_TRACKING_ANDROID,
    formats.size(), &formatCountOutput, formats.data()));
if (std::find(formats.begin(), formats.end(), desiredFormat) == formats.end()) {
  // The desired format is not supported
  return;
}

// Enumerate supported components for annotation tracking capability.
XrSpatialCapabilityComponentTypesEXT capabilityComponentTypes{
    XR_TYPE_SPATIAL_CAPABILITY_COMPONENT_TYPES_EXT};
CHK_XR(xrEnumerateSpatialCapabilityComponentTypesEXT(
    instance, systemId, XR_SPATIAL_CAPABILITY_ANNOTATION_TRACKING_ANDROID,
    &capabilityComponentTypes));
std::vector<XrSpatialComponentTypeEXT>
    annotationTypes(capabilityComponentTypes.componentTypeCountOutput);
capabilityComponentTypes.componentTypeCapacityInput = annotationTypes.size();
capabilityComponentTypes.componentTypes = annotationTypes.data();
CHK_XR(xrEnumerateSpatialCapabilityComponentTypesEXT(
    instance, systemId, XR_SPATIAL_CAPABILITY_ANNOTATION_TRACKING_ANDROID,
    &capabilityComponentTypes));

// Check supported annotation components.
XrSpatialComponentTypeEXT desiredComponent =
    XR_SPATIAL_COMPONENT_TYPE_ANNOTATION_QUAD_ANDROID;
const auto supportedComponent = [&annotationTypes](
                                    XrSpatialComponentTypeEXT component) {
  return std::find(annotationTypes.begin(), annotationTypes.end(), component) !=
         annotationTypes.end();
};
if (!supportedComponent(desiredComponent)) {
  // The desired annotation is not supported.
  return;
}

הגדרת הערה מרובעת

בדוגמת הקוד הבאה אפשר לראות איך מגדירים הערה מרובעת.

XrInstance instance;  // previously initialized
XrSystemId systemId;  // previously initialized
XrSession session;    // previously initialized
XrSpace localSpace;   // previously initialized, e.g. from
                      // XR_REFERENCE_SPACE_TYPE_LOCAL

PFN_xrCreateSpatialReferenceCacheAsyncANDROID xrCreateSpatialReferenceCacheAsyncANDROID;
PFN_xrCreateSpatialReferenceCacheCompleteANDROID xrCreateSpatialReferenceCacheCompleteANDROID;
PFN_xrDestroySpatialReferenceCacheANDROID xrDestroySpatialReferenceCacheANDROID;
PFN_xrCreateSpatialContextAsyncEXT xrCreateSpatialContextAsyncEXT;
PFN_xrCreateSpatialContextCompleteEXT xrCreateSpatialContextCompleteEXT;
void (*waitUntilReady)(XrFutureEXT);

XrSpatialReferenceImageFormatEXT desiredFormat;
XrSpatialAnnotationReferenceSourceANDROID desiredSource;
XrSpatialComponentTypeEXT desiredComponent;

// Create and start reference cache to prepare for capturing reference images.
XrSpatialReferenceCacheANDROID referenceCache;
XrSpatialReferenceCacheCreateInfoANDROID cacheCreateInfo{
  .type = XR_TYPE_SPATIAL_REFERENCE_CACHE_CREATE_INFO_ANDROID,
  .next = nullptr,
  .capability = XR_SPATIAL_CAPABILITY_ANNOTATION_TRACKING_ANDROID,
  .source = desiredSource,
};
XrFutureEXT cacheFuture = XR_NULL_FUTURE_EXT;
CHK_XR(xrCreateSpatialReferenceCacheAsyncANDROID(session, &cacheCreateInfo, &cacheFuture));

waitUntilReady(cacheFuture);

XrCreateSpatialReferenceCacheCompletionANDROID cacheCompletion{
    XR_TYPE_CREATE_SPATIAL_REFERENCE_CACHE_COMPLETION_ANDROID};
CHK_XR(xrCreateSpatialReferenceCacheCompleteANDROID(session, cacheFuture,
                                                     &cacheCompletion));
if (cacheCompletion.futureResult != XR_SUCCESS) {
  // Error, reference cache creation failed
  return;
}

referenceCache = cacheCompletion.referenceCache;

// Create the reference image with quad annotations

//  YUV 4:2:0 Planar:
// ----------------------
// |     Y      |Cb |Cr |
// ----------------------
XrSpatialReferenceImagePlaneEXT cameraImagePlanes[3];
// for each plane (0=Y, 1=U(cb), 2=V(Cr)) return by Image#getPlanes().
for (int i = 0; i < 3; ++i) {
  cameraImagePlanes[i].buffer; // read from Plane#getBuffer().
  cameraImagePlanes[i].bufferSize; // set each buffer size. Y = width * height (bytes); U = Y / 4 (bytes); V = Y / 4 (bytes).
  cameraImagePlanes[i].rowStride; // read from Plane#getRowStride().
  cameraImagePlanes[i].pixelStride; // read from Plane#getPixelStride().
}
XrSpatialReferenceImageEXT referenceImage{
      XR_TYPE_SPATIAL_REFERENCE_IMAGE_EXT};
referenceImage.width = 640;
referenceImage.height = 480;
referenceImage.format = desiredFormat;
referenceImage.planeCount = 3;
referenceImage.planes = cameraImagePlanes;

XrSpatialAnnotationQuadANDROID
    quad; // quad coordinates within the reference image.
quad.alignment = XR_SPATIAL_ANNOTATION_QUAD_ALIGNMENT_OBJECT_ANDROID;
// Set unnormalized pixel coordinates of 4 corners.
quad.upperLeft = {0.0, 0.0};
quad.upperRight = {0.0, 100.0};
quad.lowerRight = {100.0, 100.0};
quad.lowerLeft = {0.0, 100.0};

XrSpatialAnnotationQuadReferenceANDROID quadReference{
    XR_TYPE_SPATIAL_ANNOTATION_QUAD_REFERENCE_ANDROID};
quadReference.quads = &quad;
quadReference.quadCount = 1;
referenceImage.next = &quadReference;

// Create the spatial context with annotation configuration.
XrSpatialContextEXT spatialContext{};
{
  const std::array<XrSpatialComponentTypeEXT, 1> enabledComponents = {
      desiredComponent,
  };

  // Configure annotation tracking
  XrSpatialCapabilityConfigurationAnnotationTrackingANDROID annotationConfig{
      XR_TYPE_SPATIAL_CAPABILITY_CONFIGURATION_ANNOTATION_TRACKING_ANDROID};
  annotationConfig.capability =
      XR_SPATIAL_CAPABILITY_ANNOTATION_TRACKING_ANDROID;
  annotationConfig.enabledComponentCount = enabledComponents.size();
  annotationConfig.enabledComponents = enabledComponents.data();
  annotationConfig.cache = referenceCache;
  annotationConfig.time; // The time when this reference image is captured.
  annotationConfig.reference = referenceImage;

  std::vector<XrSpatialCapabilityConfigurationBaseHeaderEXT *>
      capabilityConfigs;
  capabilityConfigs.push_back(
      reinterpret_cast<XrSpatialCapabilityConfigurationBaseHeaderEXT *>(
          &annotationConfig));

  XrSpatialContextCreateInfoEXT spatialContextCreateInfo{
      XR_TYPE_SPATIAL_CONTEXT_CREATE_INFO_EXT};
  spatialContextCreateInfo.capabilityConfigCount = capabilityConfigs.size();
  spatialContextCreateInfo.capabilityConfigs = capabilityConfigs.data();

  XrFutureEXT createContextFuture = XR_NULL_FUTURE_EXT;
  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) {
    // Error, spatial context creation failed
    return;
  }

  spatialContext = completion.spatialContext;
  CHK_XR(xrDestroySpatialReferenceCacheANDROID(referenceCache));
}

מידע נוסף על הערות פעילות

בדוגמת הקוד הבאה אפשר לראות איך לגלות הערות ולשלוח לגביהן שאילתות.

XrInstance instance;  // previously initialized
XrSession session;    // previously initialized
XrSpace localSpace;   // previously initialized, e.g. from
                      // XR_REFERENCE_SPACE_TYPE_LOCAL
XrSpatialContextEXT spatialContext; // previously created

PFN_xrCreateSpatialDiscoverySnapshotAsyncEXT xrCreateSpatialDiscoverySnapshotAsyncEXT;
PFN_xrCreateSpatialDiscoverySnapshotCompleteEXT xrCreateSpatialDiscoverySnapshotCompleteEXT;
PFN_xrQuerySpatialComponentDataEXT xrQuerySpatialComponentDataEXT;
PFN_xrDestroySpatialSnapshotEXT xrDestroySpatialSnapshotEXT;
PFN_xrPollEvent xrPollEvent;
PFN_xrDestroySpatialContextEXT xrDestroySpatialContextEXT;
void (*waitUntilReady)(XrFutureEXT);

XrSpatialComponentTypeEXT desiredComponent; // e.g. XR_SPATIAL_COMPONENT_TYPE_ANNOTATION_QUAD_ANDROID

auto discoverAnnotations = [&](XrSpatialContextEXT spatialContext, XrTime time,
                               XrSpace baseSpace) {
  std::array<XrSpatialComponentTypeEXT, 1> snapshotComponents{desiredComponent};
  XrSpatialDiscoverySnapshotCreateInfoEXT snapshotCreateInfo{
      XR_TYPE_SPATIAL_DISCOVERY_SNAPSHOT_CREATE_INFO_EXT};
  snapshotCreateInfo.componentTypeCount = snapshotComponents.size();
  snapshotCreateInfo.componentTypes = snapshotComponents.data();
  XrFutureEXT discoveryFuture = XR_NULL_FUTURE_EXT;
  CHK_XR(xrCreateSpatialDiscoverySnapshotAsyncEXT(
      spatialContext, &snapshotCreateInfo, &discoveryFuture));

  waitUntilReady(discoveryFuture);

  XrCreateSpatialDiscoverySnapshotCompletionInfoEXT completionInfo{
      XR_TYPE_CREATE_SPATIAL_DISCOVERY_SNAPSHOT_COMPLETION_INFO_EXT};
  completionInfo.baseSpace = baseSpace;
  completionInfo.time = time;
  completionInfo.future = discoveryFuture;

  XrCreateSpatialDiscoverySnapshotCompletionEXT completion{
      XR_TYPE_CREATE_SPATIAL_DISCOVERY_SNAPSHOT_COMPLETION_EXT};
  CHK_XR(xrCreateSpatialDiscoverySnapshotCompleteEXT(
      spatialContext, &completionInfo, &completion));
  if (completion.futureResult == XR_SUCCESS) {
    // Query for desired annotation data, e.g. quad.
    XrSpatialComponentTypeEXT componentsToQuery[] = {
        XR_SPATIAL_COMPONENT_TYPE_ANNOTATION_QUAD_ANDROID};
    XrSpatialComponentDataQueryConditionEXT queryCond{
        XR_TYPE_SPATIAL_COMPONENT_DATA_QUERY_CONDITION_EXT};
    queryCond.componentTypeCount = 1;
    queryCond.componentTypes = componentsToQuery;
    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.entityStateCountOutput);
    queryResult.entityIdCapacityInput = entityIds.size();
    queryResult.entityIds = entityIds.data();
    queryResult.entityStateCapacityInput = entityStates.size();
    queryResult.entityStates = entityStates.data();

    std::vector<XrSpatialAnnotationQuadDataANDROID> quads(
        queryResult.entityIdCountOutput);
    XrSpatialComponentAnnotationQuadListANDROID quadList{
        XR_TYPE_SPATIAL_COMPONENT_ANNOTATION_QUAD_LIST_ANDROID};
    quadList.quadCount = quads.size();
    quadList.quads = quads.data();
    queryResult.next = &quadList;

    CHK_XR(xrQuerySpatialComponentDataEXT(completion.snapshot, &queryCond,
                                          &queryResult));

    for (int32_t i = 0; i < queryResult.entityIdCountOutput; ++i) {
      if (entityStates[i] == XR_SPATIAL_ENTITY_TRACKING_STATE_TRACKING_EXT) {
        const XrSpatialAnnotationQuadDataANDROID &currentQuad = quads[i];
        // Rendering quad in the view.
      }
    }

    CHK_XR(xrDestroySpatialSnapshotEXT(completion.snapshot));
  }
};

while (1) {
  // For every frame in frame loop

  XrSpace space;           // Application's play space.
  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_ANNOTATION_TRACKING_ANDROID: {
      const XrEventDataSpatialAnnotationTrackingANDROID &eventdata =
          *reinterpret_cast<XrEventDataSpatialAnnotationTrackingANDROID *>(
              &event);
      if (eventdata.initializationResult != XR_SUCCESS) {
        // handle initialization failure.
        // e.g. CHK_XR(xrDestroySpatialContextEXT(spatialContext));
      }
      break;
    }
    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, space);
      break;
    }
    }
  }

  // Finish frame loop
}

CHK_XR(xrDestroySpatialContextEXT(spatialContext));

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

פקודות חדשות

מבנים חדשים

New Enums

New Enum Constants

  • XR_ANDROID_SPATIAL_ANNOTATION_TRACKING_EXTENSION_NAME
  • XR_ANDROID_spatial_annotation_tracking_SPEC_VERSION
  • הרחבה של XrObjectType :

    • XR_OBJECT_TYPE_SPATIAL_REFERENCE_CACHE_ANDROID
  • הרחבה של XrSpatialCapabilityEXT :

    • XR_SPATIAL_CAPABILITY_ANNOTATION_TRACKING_ANDROID
  • הארכה של XrSpatialComponentTypeEXT :

    • XR_SPATIAL_COMPONENT_TYPE_ANNOTATION_QUAD_ANDROID
  • הרחבה של XrStructureType :

    • XR_TYPE_CREATE_SPATIAL_REFERENCE_CACHE_COMPLETION_ANDROID
    • XR_TYPE_EVENT_DATA_SPATIAL_ANNOTATION_TRACKING_ANDROID
    • XR_TYPE_SPATIAL_ANNOTATION_QUAD_REFERENCE_ANDROID
    • XR_TYPE_SPATIAL_CAPABILITY_CONFIGURATION_ANNOTATION_TRACKING_ANDROID
    • XR_TYPE_SPATIAL_COMPONENT_ANNOTATION_QUAD_LIST_ANDROID
    • XR_TYPE_SPATIAL_REFERENCE_CACHE_CREATE_INFO_ANDROID
    • XR_TYPE_SYSTEM_SPATIAL_ANNOTATION_PROPERTIES_ANDROID

בעיות

היסטוריית גרסאות

  • גרסה 1, ‏2025-09-17 (לבנה חן)

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