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 .
  • האפליקציה יכולה להרוס את ה-handle של 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 כדי לעקוב אחרי ההערה.
  • אם האתחול נכשל, האפליקציה יכולה להשתמש בקוד השגיאה שמוחזר באירוע כדי לקבוע את סיבת הכשל, ולכבות סופית את ה-handle הקיים של XrSpatialContextEXT כדי להתחיל אנוטציה חדשה.
  • לא משנה מה התוצאה של ההפעלה, האפליקציה יכולה לשחרר את מאגר התמונות כדי לצמצם את השימוש בזיכרון אחרי קבלת האירוע.
  • האפליקציה מגלה הערות ומריצה עליהן שאילתות בהתאם לדפוסי הגישה לישויות המרחביות.
  • האפליקציה יכולה ליצור נקודת אחיזה נוספת של XrSpatialContextEXT כדי לעקוב אחרי אנוטציות בתוך הפניה חדשה במהלך טווח הזמן של XrSpatialReferenceCacheANDROID תקף .
  • האפליקציה יכולה להרוס את נקודות האחיזה של 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 מתארת את מקור ההפניה שמספק את המטא-נתונים של ההערה.

המשמעויות של ה-enums הן:

תיאור של טיפוס בן מנייה (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 מציין את משך הזמן בשניות של נקודת אחיזה תקפה של 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 כדי לשחרר את הטיפול ב-cacheHandle ואת המשאבים הבסיסיים כשמסיימים ליצור את ההקשר המרחבי.

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

Thread Safety

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

קודי החזרה

הצלחה

  • XR_SUCCESS

Failure

  • XR_ERROR_FUNCTION_UNSUPPORTED
  • XR_ERROR_HANDLE_INVALID
  • XR_ERROR_RUNTIME_FAILURE

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

המבנה 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 .

סביבת הריצה חייבת להחזיר את הערך 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) שאליו משויך ה-quad.

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

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 מתארת את היישור של הערת הריבוע.

המשמעויות של ה-enums הן:

תיאור של טיפוס בן מנייה (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 (לבנה חן)

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