XR_ANDROID_spatial_annotation_tracking

מחרוזת שם

XR_ANDROID_spatial_annotation_tracking

סוג התוסף

תוסף למכונה

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

795

גרסה

1

סטטוס האישור

לא אושר

תלויות של תוספים וגרסאות

XR_EXT_spatial_entity
וגם
XR_EXT_spatial_image_tracking

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

2026-01-12

סטטוס IP

אין תלונות ידועות על הפרת קניין רוחני.

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

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

נכשל

  • 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

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

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

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

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

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

XR_DEFINE_HANDLE(XrSpatialReferenceCacheANDROID)

הכינוי 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

נכשל

  • 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 מתאר את המידע ליצירת נקודת אחיזה (handle) מסוג 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

נכשל

  • 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 הוא נקודת האחיזה של XrSpatialReferenceCacheANDROID אם הפעולה מצליחה.

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

ערכי futureResult:

הצלחה

  • XR_SUCCESS
  • XR_SESSION_LOSS_PENDING

נכשל

  • 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 הוא קוד הצלחה, זמן הריצה חייב להחזיר נקודת אחיזה חוקית של referenceCache. אם referenceCache תקין, הוא נשאר תקין רק במהלך משך החיים של xrCreateSpatialReferenceCacheAsyncANDROID :: session או עד שהאפליקציה משמידה את נקודת האחיזה באמצעות xrDestroySpatialReferenceCacheANDROID, המוקדם מביניהם.

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

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

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

XrResult xrDestroySpatialReferenceCacheANDROID(
    XrSpatialReferenceCacheANDROID              cacheHandle);

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

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

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

Thread Safety

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

קודי החזרה

הצלחה

  • XR_SUCCESS

נכשל

  • 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 ממפה לאינדקס ממערך ההערות שמשויך ל-XrSpatialCapabilityConfigurationAnnotationTrackingANDROID :: reference .
  • ‫initializationResult מציין את תוצאת האתחול של ההערה. אם הוא לא XR_SUCCESS , האפליקציה יכולה להרוס וליצור מחדש את נקודת האחיזה XrSpatialContextEXT כדי להפעיל מחדש את ההערה, או להמשיך להשתמש ב-spatialContext כדי לעקוב אחרי הערות אחרות.

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

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

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

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

הערה מרובעת

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

  • XR_SPATIAL_COMPONENT_TYPE_ANNOTATION_QUAD_ANDROID

קובץ עזר של ארבעה תדרים

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

זמן הריצה חייב להחזיר את הערך XR_ERROR_SPATIAL_CAPABILITY_CONFIGURATION_INVALID_EXT מ-xrCreateSpatialContextAsyncEXT אם הערך של quadCount הוא 0.

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

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

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

תיאורי חברים

  • ‫alignment הוא ה-XrSpatialAnnotationQuadAlignmentANDROID של ה-quad.
  • ‫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_SURFACE_ANDROID = 2,
    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

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

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

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

פקודות חדשות

מבנים חדשים

ערכי Enums חדשים

קבועי Enum חדשים

  • 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, 17 בספטמבר 2025 (לבנה חן)

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