XR_EXT_spatial_persistence

رشته نام

XR_EXT_spatial_persistence

نوع افزونه

افزونه نمونه

شماره داخلی ثبت‌شده

764

بازبینی

1

وضعیت تصویب

تصویب‌شده

وابستگی‌های افزونه و نسخه

XR_EXT_spatial_entity
و
XR_EXT_future

همیاران

Nihav Jain،‏ Google
Jared Finder،‏ Google
Natalie Fleury،‏ Meta
Yuichi Taguchi،‏ Meta
Ron Bessems،‏ Meta
Yin Li،‏ Microsoft
Jimmy Alamparambil،‏ ByteDance
Zhipeng Liu،‏ ByteDance
Jun Yan،‏ ByteDance

نمای کلی

این افزونه به برنامه‌ها اجازه می‌دهد تا موجودیت‌های فضایی را در جلسه‌های برنامه، جلسه‌های OpenXR، و زمینه‌های فضایی متعدد OpenXR در یک جلسه کشف و مرتبط کنند. افزونه XR_EXT_spatial_entity مشخص کرد که موجودیت درون XrSpatialContextEXT با XrSpatialEntityIdEXT نشان داده می‌شود. این افزونه با تعیین اینکه یک موجودیت، درصورت ماندگار بودن، با XrUuid در سراسر جلسات برنامه و OpenXR نشان داده می‌شود، این مفهوم را گسترش می‌دهد، یعنی یک برنامه می‌تواند از XrUuid ارائه‌شده توسط این افزونه برای شناسایی یک موجودیت در سراسر جلسات استفاده کند. این افزونه همچنین هم‌پوشانی‌های مفیدی با افزونه XR_EXT_spatial_entity برای کشف نهادهای پایدار در محیط کاربر و توانایی پرسمان داده‌های مؤلفه آن‌ها ارائه می‌دهد.

زمینه پایداری فضایی

ایجاد بافت پایداری فضایی

XR_DEFINE_HANDLE(XrSpatialPersistenceContextEXT)

دستگیره XrSpatialPersistenceContextEXT نشان‌دهنده اتصال به فضای ذخیره‌سازی موجودیت فضایی پایا است.

تابع xrCreateSpatialPersistenceContextAsyncEXT به‌صورت زیر تعریف می‌شود:

XrResult xrCreateSpatialPersistenceContextAsyncEXT(
    XrSession                                   session,
    const XrSpatialPersistenceContextCreateInfoEXT* createInfo,
    XrFutureEXT*                                future);

شرح پارامترها

  • ‫session یک XrSession است که در آن بافت تداوم فضایی فعال خواهد بود.
  • ‫createInfo همان XrSpatialPersistenceContextCreateInfoEXT است که برای مشخص کردن پارامترهای بافت پایداری فضایی استفاده می‌شود.
  • ‫future اشاره‌گری به XrFutureEXT است.

برنامه می‌تواند بااستفاده از تابع xrCreateSpatialPersistenceContextAsyncEXT یک دسته XrSpatialPersistenceContextEXT ایجاد کند و دامنه بافت پایداری را در createInfo پیکربندی کند.

اگر XrSpatialPersistenceContextCreateInfoEXT :: scope توسط xrEnumerateSpatialPersistenceScopesEXT شمارش نشده باشد، زمان اجرا باید XR_ERROR_SPATIAL_PERSISTENCE_SCOPE_UNSUPPORTED_EXT را برگرداند.

اگر زمان اجرا سیستم اجازه‌ای را برای کنترل دسترسی برنامه به فضای ذخیره‌سازی پایداری که با XrSpatialPersistenceContextEXT نشان داده می‌شود اعمال کند، درصورتی‌که این اجازه‌ها به این برنامه اعطا نشده باشد، زمان اجرا باید XR_ERROR_PERMISSION_INSUFFICIENT را برگرداند.

استفاده معتبر (ضمنی)

کدهای برگشتی

موفقیت‌آمیز بود

  • XR_SUCCESS
  • XR_SESSION_LOSS_PENDING

ناموفق

  • XR_ERROR_FUNCTION_UNSUPPORTED
  • XR_ERROR_HANDLE_INVALID
  • XR_ERROR_INSTANCE_LOST
  • XR_ERROR_LIMIT_REACHED
  • XR_ERROR_OUT_OF_MEMORY
  • XR_ERROR_RUNTIME_FAILURE
  • XR_ERROR_SESSION_LOST
  • XR_ERROR_SPATIAL_PERSISTENCE_SCOPE_UNSUPPORTED_EXT
  • XR_ERROR_VALIDATION_FAILURE

ساختار XrSpatialPersistenceContextCreateInfoEXT به‌صورت زیر تعریف می‌شود:

typedef struct XrSpatialPersistenceContextCreateInfoEXT {
    XrStructureType                 type;
    const void*                     next;
    XrSpatialPersistenceScopeEXT    scope;
} XrSpatialPersistenceContextCreateInfoEXT;

توضیحات عضو

  • type XrStructureType این ساختار است.
  • ‫next برابر با NULL یا اشاره‌گری به ساختار بعدی در زنجیره ساختار است. چنین ساختارهایی در OpenXR اصلی یا این افزونه تعریف نشده است.
  • ‫scope یک XrSpatialPersistenceScopeEXT است که دامنه ذخیره‌سازی بافت پایداری را تعریف می‌کند.

ساختار XrSpatialPersistenceContextCreateInfoEXT اطلاعات لازم برای ایجاد دسته XrSpatialPersistenceContextEXT را شرح می‌دهد.

استفاده معتبر (ضمنی)

typedef enum XrSpatialPersistenceScopeEXT {
    XR_SPATIAL_PERSISTENCE_SCOPE_SYSTEM_MANAGED_EXT = 1,
    XR_SPATIAL_PERSISTENCE_SCOPE_LOCAL_ANCHORS_EXT = 1000781000,
    XR_SPATIAL_PERSISTENCE_SCOPE_ANCHORS_FOR_CLOUD_SHARING_ANDROIDX1 = 1000808000,
    XR_SPATIAL_PERSISTENCE_SCOPE_MAX_ENUM_EXT = 0x7FFFFFFF
} XrSpatialPersistenceScopeEXT;

شمارش XrSpatialPersistenceScopeEXT انواع مختلف دامنه‌های بافت پایداری را شناسایی می‌کند.

مقادیر شمارشی معانی زیر را دارند:

شرح شمارشی

XR_SPATIAL_PERSISTENCE_SCOPE_SYSTEM_MANAGED_EXT

دسترسی فقط خواندنی (یعنی برنامه نمی‌تواند فروشگاه مرتبط با این محدوده را اصلاح کند) به نهادهای فضایی که توسط سیستم حفظ و مدیریت می‌شوند، برای برنامه فراهم می‌کند. برنامه می‌تواند از UUID در مؤلفه پایداری برای این دامنه استفاده کند تا موجودیت‌ها را در بافت‌های فضایی و بازراه‌اندازی‌های دستگاه همبسته کند.

XR_SPATIAL_PERSISTENCE_SCOPE_LOCAL_ANCHORS_EXT

عملیات‌های پایداری و دسترسی به داده‌ها به لنگرهای فضایی، در همان دستگاه، برای همان کاربر و همان برنامه محدود است (افزوده‌شده توسط افزونه XR_EXT_spatial_persistence_operations)

XR_SPATIAL_PERSISTENCE_SCOPE_ANCHORS_FOR_CLOUD_SHARING_ANDROIDX1

عملیات پایداری و دسترسی به داده‌ها به لنگرهای فضایی محدود است که تحت مالکیت و مدیریت همان پروژه ابری است. (افزوده‌شده توسط افزونه XR_ANDROIDX1_spatial_anchor_cloud_sharing)

تابع xrEnumerateSpatialPersistenceScopesEXT به‌صورت زیر تعریف می‌شود:

XrResult xrEnumerateSpatialPersistenceScopesEXT(
    XrInstance                                  instance,
    XrSystemId                                  systemId,
    uint32_t                                    persistenceScopeCapacityInput,
    uint32_t*                                   persistenceScopeCountOutput,
    XrSpatialPersistenceScopeEXT*               persistenceScopes);

شرح پارامترها

  • ‫instance دسته‌ای برای XrInstance است.
  • systemId XrSystemId است که دامنه‌های پایداری فضایی آن شمارش خواهد شد.
  • persistenceScopeCapacityInput ظرفیت آرایه persistenceScopes است، یا ۰ برای نشان دادن درخواست بازیابی ظرفیت موردنیاز.
  • persistenceScopeCountOutput تعداد دامنه‌های پایداری یا ظرفیت موردنیاز درصورتی است که persistenceScopeCapacityInput کافی نباشد.
  • ‫persistenceScopes آرایه‌ای از XrSpatialPersistenceScopeEXT است. اگر persistenceScopeCapacityInput برابر با ۰ باشد، می‌تواند NULL باشد.
  • برای شرح دقیق بازیابی اندازه persistenceScopes موردنیاز، فصل پارامترهای اندازه میان‌گیر را ببینید.

برنامه می‌تواند فهرست دامنه‌های پایداری فضایی پشتیبانی‌شده توسط XrSystemId داده‌شده را بااستفاده از xrEnumerateSpatialPersistenceScopesEXT شمارش کند.

استفاده معتبر (ضمنی)

  • افزونه XR_EXT_spatial_persistence باید قبل‌از فراخوانی xrEnumerateSpatialPersistenceScopesEXT فعال شود
  • instance باید شناسه XrInstance معتبری باشد
  • persistenceScopeCountOutput باید اشاره‌گری به مقدار uint32_t باشد
  • اگر persistenceScopeCapacityInput 0 نباشد، persistenceScopes باید اشاره‌گری به آرایه‌ای از مقادیر persistenceScopeCapacityInput XrSpatialPersistenceScopeEXT باشد

کدهای برگشتی

موفقیت‌آمیز بود

  • XR_SUCCESS

ناموفق

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

تابع xrCreateSpatialPersistenceContextCompleteEXT به‌صورت زیر تعریف می‌شود:

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

شرح پارامترها

xrCreateSpatialPersistenceContextCompleteEXT عملیات ناهمگام شروع‌شده توسط xrCreateSpatialPersistenceContextAsyncEXT را تکمیل می‌کند. اگر future در وضعیت آماده نباشد، زمان اجرا باید XR_ERROR_FUTURE_PENDING_EXT را برگرداند. اگر future قبلاً تکمیل یا لغو شده باشد، زمان اجرا باید XR_ERROR_FUTURE_INVALID_EXT را برگرداند.

استفاده معتبر (ضمنی)

کدهای برگشتی

موفقیت‌آمیز بود

  • XR_SUCCESS
  • XR_SESSION_LOSS_PENDING

ناموفق

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

ساختار XrCreateSpatialPersistenceContextCompletionEXT به‌صورت زیر تعریف می‌شود:

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

توضیحات عضو

کدهای برگشتی آتی

مقادیر futureResult:

موفقیت‌آمیز بود

  • XR_SUCCESS
  • XR_SESSION_LOSS_PENDING

ناموفق

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

اگر futureResult و createResult هر دو کدهای موفقیت باشند، persistenceContext باید معتبر باشد. اگر persistenceContext معتبر باشد، باید در چرخه حیات xrCreateSpatialPersistenceContextAsyncEXT :: session یا تا زمانی که برنامه از xrDestroySpatialPersistenceContextEXT با persistenceContext استفاده کند (هرکدام که زودتر اتفاق بیفتد) معتبر باقی بماند.

زمان اجرا باید createResult را فقط درصورتی تنظیم کند که futureResult کد موفقیت باشد.

استفاده معتبر (ضمنی)

typedef enum XrSpatialPersistenceContextResultEXT {
    XR_SPATIAL_PERSISTENCE_CONTEXT_RESULT_SUCCESS_EXT = 0,
    XR_SPATIAL_PERSISTENCE_CONTEXT_RESULT_ENTITY_NOT_TRACKING_EXT = -1000781001,
    XR_SPATIAL_PERSISTENCE_CONTEXT_RESULT_PERSIST_UUID_NOT_FOUND_EXT = -1000781002,
    XR_SPATIAL_PERSISTENCE_CONTEXT_RESULT_LOCALIZATION_FAILURE_ANDROIDX1 = -1000808000,
    XR_SPATIAL_PERSISTENCE_CONTEXT_RESULT_MAP_FEATURE_INSUFFICIENT_ANDROIDX1 = -1000808001,
    XR_SPATIAL_PERSISTENCE_CONTEXT_RESULT_NETWORK_FAILURE_ANDROIDX1 = -1000808002,
    XR_SPATIAL_PERSISTENCE_CONTEXT_RESULT_NETWORK_TIMEOUT_ANDROIDX1 = -1000808003,
    XR_SPATIAL_PERSISTENCE_CONTEXT_RESULT_MAX_ENUM_EXT = 0x7FFFFFFF
} XrSpatialPersistenceContextResultEXT;

شمارش XrSpatialPersistenceContextResultEXT انواع مختلف کدهای نتیجه را برای عملیات پایداری شناسایی می‌کند. خطاها درطول عملیات پایداری همیشه تحت کنترل برنامه نیستند و از این شمارش برای انتقال چنین مواردی استفاده می‌شود. مشابه XrResult، کدهای موفقیت در شمارش XrSpatialPersistenceContextResultEXT مقادیر غیرمنفی هستند و کدهای شکست مقادیر منفی هستند.

مقادیر شمارشی معانی زیر را دارند:

شرح شمارشی

XR_SPATIAL_PERSISTENCE_CONTEXT_RESULT_SUCCESS_EXT

عملیات زمینه پایداری موفقیت‌آمیز بود.

XR_SPATIAL_PERSISTENCE_CONTEXT_RESULT_ENTITY_NOT_TRACKING_EXT

عملیات پایداری ناموفق بود زیرا نهاد توسط زمان اجرا قابل‌ردیابی نبود. (افزوده‌شده توسط افزونه XR_EXT_spatial_persistence_operations)

XR_SPATIAL_PERSISTENCE_CONTEXT_RESULT_PERSIST_UUID_NOT_FOUND_EXT

شناسه UUID ماندگار ارائه‌شده در فضای ذخیره‌سازی پیدا نشد. (افزوده‌شده توسط افزونه XR_EXT_spatial_persistence_operations)

XR_SPATIAL_PERSISTENCE_CONTEXT_RESULT_LOCALIZATION_FAILURE_ANDROIDX1

عملیات پایداری ناموفق بود زیرا بومی‌سازی ناموفق بود. (افزوده‌شده توسط افزونه XR_ANDROIDX1_spatial_anchor_cloud_sharing)

XR_SPATIAL_PERSISTENCE_CONTEXT_RESULT_MAP_FEATURE_INSUFFICIENT_ANDROIDX1

عملیات پایداری ناموفق بود زیرا ویژگی نقشه بومی‌سازی کافی نیست. (افزوده‌شده توسط افزونه XR_ANDROIDX1_spatial_anchor_cloud_sharing)

XR_SPATIAL_PERSISTENCE_CONTEXT_RESULT_NETWORK_FAILURE_ANDROIDX1

عملیات پایداری ناموفق بود زیرا اتصال شبکه برقرار نشد. (افزوده‌شده توسط افزونه XR_ANDROIDX1_spatial_anchor_cloud_sharing)

XR_SPATIAL_PERSISTENCE_CONTEXT_RESULT_NETWORK_TIMEOUT_ANDROIDX1

عملیات پایداری به‌دلیل اتمام مهلت شبکه ناموفق بود. (افزوده‌شده توسط افزونه XR_ANDROIDX1_spatial_anchor_cloud_sharing)

ازبین بردن بافت پایداری فضایی

تابع xrDestroySpatialPersistenceContextEXT به‌صورت زیر تعریف می‌شود:

XrResult xrDestroySpatialPersistenceContextEXT(
    XrSpatialPersistenceContextEXT              persistenceContext);

شرح پارامترها

برنامه می‌تواند از xrDestroySpatialPersistenceContextEXT برای رها کردن دسته persistenceContext پس‌از اتمام کارهای پایداری فضایی استفاده کند.

اگر دسته‌های XrSpatialContextEXT معتبری وجود داشته باشد که persistenceContext ازطریق XrSpatialContextPersistenceConfigEXT به آن‌ها پیوند داده شده باشد، زمان اجرا نباید منابع اساسی persistenceContext را هنگام فراخوانی xrDestroySpatialPersistenceContextEXT ازبین ببرد. دلیلش این است که منابع بافت پایداری هنوز توسط بافت فضایی برای کشف نهادهای پایدار استفاده می‌شود. ازبین بردن دسته بافت پایداری در چنین شرایطی فقط دسترسی برنامه به این منابع را حذف می‌کند.

منابع XrSpatialPersistenceContextEXT تخریب‌شده باید زمانی آزاد شوند که همه دسته‌های XrSpatialContextEXT که بافت پایداری به آن‌ها پیوند داده شده بود تخریب شوند.

استفاده معتبر (ضمنی)

ایمنی رشته‌ای

  • دسترسی به persistenceContext و هرگونه دسته فرزند باید به‌صورت خارجی همگام‌سازی شود

کدهای برگشتی

موفقیت‌آمیز بود

  • XR_SUCCESS

ناموفق

  • XR_ERROR_FUNCTION_UNSUPPORTED
  • XR_ERROR_HANDLE_INVALID
  • XR_ERROR_RUNTIME_FAILURE

کاوش نهادهای پایدار

مؤلفه پایداری

نهادهای فضایی پایدار دارای مؤلفه پایداری هستند که زمان اجرا باید آن را در عکس‌های آنی اکتشاف و به‌روزرسانی لحاظ کند، اگر XR_SPATIAL_COMPONENT_TYPE_PERSISTENCE_EXT درطول ایجاد XrSpatialContextEXT فعال شده باشد و در XrSpatialDiscoverySnapshotCreateInfoEXT :: componentTypes یا XrSpatialUpdateSnapshotCreateInfoEXT :: componentTypes لحاظ شده باشد.

داده‌های مؤلفه

ساختار XrSpatialPersistenceDataEXT به‌صورت زیر تعریف می‌شود:

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

توضیحات عضو

استفاده معتبر (ضمنی)

typedef enum XrSpatialPersistenceStateEXT {
    XR_SPATIAL_PERSISTENCE_STATE_LOADED_EXT = 1,
    XR_SPATIAL_PERSISTENCE_STATE_NOT_FOUND_EXT = 2,
    XR_SPATIAL_PERSISTENCE_STATE_MAX_ENUM_EXT = 0x7FFFFFFF
} XrSpatialPersistenceStateEXT;

شمارش XrSpatialPersistenceStateEXT حالت‌های مختلف uuid پایدار را شناسایی می‌کند.

مقادیر شمارشی معانی زیر را دارند:

شرح شمارشی

XR_SPATIAL_PERSISTENCE_STATE_LOADED_EXT

UUID پایدار باموفقیت از فضای ذخیره‌سازی بار شد.

XR_SPATIAL_PERSISTENCE_STATE_NOT_FOUND_EXT

UUID پایدار در فضای ذخیره‌سازی پیدا نشد و یا از آن برداشته شده است یا هرگز در آن نبوده است.

ساختار فهرست مؤلفه برای پرسمان داده‌ها

ساختار XrSpatialComponentPersistenceListEXT به‌صورت زیر تعریف می‌شود:

typedef struct XrSpatialComponentPersistenceListEXT {
    XrStructureType                 type;
    void*                           next;
    uint32_t                        persistDataCount;
    XrSpatialPersistenceDataEXT*    persistData;
} XrSpatialComponentPersistenceListEXT;

توضیحات عضو

  • type XrStructureType این ساختار است.
  • ‫next برابر با NULL یا اشاره‌گری به ساختار بعدی در زنجیره ساختار است. چنین ساختارهایی در OpenXR اصلی یا این افزونه تعریف نشده است.
  • persistDataCount یک uint32_t است که تعداد عناصر را در آرایه persistData توصیف می‌کند.
  • persistData آرایه‌ای از XrSpatialPersistenceDataEXT است.

اگر XrSpatialComponentPersistenceListEXT در زنجیره بعدی XrSpatialComponentDataQueryResultEXT :: next باشد اما XR_SPATIAL_COMPONENT_TYPE_PERSISTENCE_EXT در XrSpatialComponentDataQueryConditionEXT :: componentTypes گنجانده نشده باشد، زمان اجرا باید XR_ERROR_VALIDATION_FAILURE را از xrQuerySpatialComponentDataEXT برگرداند.

اگر persistDataCount کمتر از XrSpatialComponentDataQueryResultEXT :: entityIdCountOutput باشد، زمان اجرا باید XR_ERROR_SIZE_INSUFFICIENT را از xrQuerySpatialComponentDataEXT برگرداند.

برخلاف مؤلفه‌های دیگر، زمان اجرا باید داده‌ها را برای XR_SPATIAL_COMPONENT_TYPE_PERSISTENCE_EXT بدون درنظر گرفتن XrSpatialEntityTrackingStateEXT تنظیم کند.

استفاده معتبر (ضمنی)

پیکربندی

اگر XR_SPATIAL_COMPONENT_TYPE_PERSISTENCE_EXT در XrSpatialCapabilityComponentTypesEXT :: componentTypes برای برخی قابلیت‌ها شمارش شده باشد، برنامه می‌تواند آن را با گنجاندن enum در فهرست XrSpatialCapabilityConfigurationBaseHeaderEXT :: enabledComponents فعال کند. این مؤلفه برای گنجانده شدن در زنجیره بعدی XrSpatialCapabilityConfigurationBaseHeaderEXT به پیکربندی خاصی نیاز ندارد. اگر برنامه XR_SPATIAL_COMPONENT_TYPE_PERSISTENCE_EXT را در فهرست مؤلفه‌های فعال‌شده لحاظ می‌کند، باید XrSpatialContextPersistenceConfigEXT را نیز در زنجیره بعدی XrSpatialContextCreateInfoEXT لحاظ کند، درغیراین‌صورت زمان اجرا باید XR_ERROR_SPATIAL_CAPABILITY_CONFIGURATION_INVALID_EXT را از xrCreateSpatialContextAsyncEXT برگرداند.

پیکربندی بافت فضایی با بافت‌های پایداری

ساختار XrSpatialContextPersistenceConfigEXT به‌صورت زیر تعریف می‌شود:

typedef struct XrSpatialContextPersistenceConfigEXT {
    XrStructureType                          type;
    const void*                              next;
    uint32_t                                 persistenceContextCount;
    const XrSpatialPersistenceContextEXT*    persistenceContexts;
} XrSpatialContextPersistenceConfigEXT;

توضیحات عضو

  • type XrStructureType این ساختار است.
  • ‫next برابر با NULL یا اشاره‌گری به ساختار بعدی در زنجیره ساختار است. چنین ساختارهایی در OpenXR اصلی یا این افزونه تعریف نشده است.
  • persistenceContextCount یک uint32_t است که تعداد عناصر را در آرایه persistenceContexts توصیف می‌کند.
  • persistenceContexts آرایه‌ای از XrSpatialPersistenceContextEXT است.

برنامه می‌تواند XrSpatialContextPersistenceConfigEXT را به زنجیره بعدی XrSpatialContextCreateInfoEXT اضافه کند. این کار XrSpatialContextEXT ایجادشده را با persistenceContexts پیکربندی می‌کند و به برنامه اجازه می‌دهد موجودیت‌های فضایی را که در فضای ذخیره‌سازی نشان‌داده‌شده توسط دسته‌های XrSpatialPersistenceContextEXT در persistenceContexts حفظ شده‌اند کاوش کند.

استفاده معتبر (ضمنی)

ایجاد عکس آنی کاوش

کاوش نهادها با UUIDهای خاص

ساختار XrSpatialDiscoveryPersistenceUuidFilterEXT به‌صورت زیر تعریف می‌شود:

typedef struct XrSpatialDiscoveryPersistenceUuidFilterEXT {
    XrStructureType    type;
    const void*        next;
    uint32_t           persistedUuidCount;
    const XrUuid*      persistedUuids;
} XrSpatialDiscoveryPersistenceUuidFilterEXT;

توضیحات عضو

  • type XrStructureType این ساختار است.
  • ‫next برابر با NULL یا اشاره‌گری به ساختار بعدی در زنجیره ساختار است. چنین ساختارهایی در OpenXR اصلی یا این افزونه تعریف نشده است.
  • persistedUuidCount یک uint32_t است که تعداد عناصر را در آرایه persistedUuids توصیف می‌کند
  • ‫persistedUuids آرایه‌ای از XrUuid است.

برنامه می‌تواند از XrSpatialDiscoveryPersistenceUuidFilterEXT در زنجیره بعدی XrSpatialDiscoverySnapshotCreateInfoEXT استفاده کند تا عملیات کاوش را فقط به موجودیت‌هایی محدود کند که UUIDهای پایدارشده آن‌ها در مجموعه UUIDهای ارائه‌شده در persistedUuids قرار دارد.

اگر برنامه XrSpatialDiscoveryPersistenceUuidFilterEXT را در زنجیره بعدی XrSpatialDiscoverySnapshotCreateInfoEXT اضافه کند اما xrCreateSpatialDiscoverySnapshotAsyncEXT :: spatialContext با هیچ XrSpatialPersistenceContextEXT بااستفاده از XrSpatialContextPersistenceConfigEXT پیکربندی نشده باشد، زمان اجرا باید XR_ERROR_VALIDATION_FAILURE را از xrCreateSpatialDiscoverySnapshotAsyncEXT برگرداند.

زمان اجرا باید فیلتر XrSpatialDiscoveryPersistenceUuidFilterEXT را به‌عنوان شرط «AND» با هر فیلتر دیگری که در XrSpatialDiscoverySnapshotCreateInfoEXT یا زنجیره بعدی آن ارائه شده است درنظر بگیرد. زمان اجرا باید خود آرایه persistedUuids را به‌عنوان شرط «OR» درنظر بگیرد، یعنی فیلتر کردن برای نهادهایی که هرکدام از UUIDهای ارائه‌شده در آن آرایه را دارند.

زمان اجرا باید شامل یک ورودی در عکس آنی ایجادشده برای هریک از UUIDها در persistedUuids باشد که توانسته است وضعیت XrSpatialPersistenceStateEXT را در این زمان تعیین کند.

  • اگر زمان اجرا UUID را با موفقیت در فضای ذخیره‌سازی خود پیدا کرده باشد، -

    • زمان اجرا باید XrSpatialPersistenceStateEXT را در XrSpatialPersistenceDataEXT این نهاد روی XR_SPATIAL_PERSISTENCE_STATE_LOADED_EXT تنظیم کند.
    • زمان اجرا باید شامل یک XrSpatialEntityIdEXT معتبر برای این نهاد در عکس آنی ایجادشده باشد.
    • زمان اجرا باید XrSpatialEntityTrackingStateEXT آن نهاد را روی XR_SPATIAL_ENTITY_TRACKING_STATE_TRACKING_EXT تنظیم کند اگر به‌طور فعال نهاد را ردیابی می‌کند و داده‌های معتبری برای مؤلفه‌های آن دارد. درغیراین‌صورت، زمان اجرا باید XrSpatialEntityTrackingStateEXT را روی XR_SPATIAL_ENTITY_TRACKING_STATE_PAUSED_EXT تنظیم کند.
  • اگر زمان اجرا تشخیص دهد که UUID در فضای ذخیره‌سازی آن وجود ندارد (صرف‌نظر از اینکه UUID هرگز در فضای ذخیره‌سازی نبوده است یا یک‌بار وجود داشته اما از آن زمان حذف شده است)، دراین‌صورت -

    • زمان اجرا باید XrSpatialPersistenceStateEXT را در XrSpatialPersistenceDataEXT این موجودیت روی XR_SPATIAL_PERSISTENCE_STATE_NOT_FOUND_EXT تنظیم کند تا به برنامه نشان دهد که این UUID دیگر در فضای ذخیره‌سازی وجود ندارد.
    • زمان اجرا باید XrSpatialEntityIdEXT را برای این نهاد در عکس آنی ایجادشده روی XR_NULL_SPATIAL_ENTITY_ID_EXT تنظیم کند.
    • زمان اجرا باید XrSpatialEntityTrackingStateEXT آن نهاد را روی XR_SPATIAL_ENTITY_TRACKING_STATE_STOPPED_EXT تنظیم کند تا به برنامه نشان دهد که این نهاد هرگز ردیابی نخواهد شد.
  • اگر زمان اجرا نتواند وجود UUID را در فضای ذخیره‌سازی‌اش تعیین کند، نباید آن را در عکس آنی لحاظ کند.

برنامه می‌تواند از XrSpatialDiscoveryPersistenceUuidFilterEXT در زنجیره بعدی XrSpatialComponentDataQueryConditionEXT نیز استفاده کند تا برای موجودیت‌های UUIDهای خاص در عکس‌های آنی موجود پُرسمان کند. هنگام استفاده با XrSpatialComponentDataQueryConditionEXT ، اگر XrSpatialDiscoveryPersistenceUuidFilterEXT :: persistedUuids حاوی هر XrUuid باشد که در XrSpatialSnapshotEXT نیست، زمان اجرا نباید ورودی برای آن XrUuid در نتیجه پُرسمان داشته باشد. همچنین، ترتیب (توالی) نهادها در نتیجه پُرسمان ممکن است با ترتیب UUIDهای ارائه‌شده در XrSpatialDiscoveryPersistenceUuidFilterEXT :: persistedUuids مطابقت نداشته باشد. برنامه باید XR_SPATIAL_COMPONENT_TYPE_PERSISTENCE_EXT را در XrSpatialComponentDataQueryConditionEXT :: componentTypes و XrSpatialComponentPersistenceListEXT در زنجیره بعدی XrSpatialComponentDataQueryResultEXT اضافه کند و سپس XrSpatialPersistenceDataEXT :: persistUuid را برای هر نمایه نتیجه پُرسمان بررسی کند تا متوجه شود نمایه نتیجه فعلی با کدام UUID مطابقت دارد.

استفاده معتبر (ضمنی)

  • افزونه XR_EXT_spatial_persistence باید قبل‌از استفاده از XrSpatialDiscoveryPersistenceUuidFilterEXT فعال شود
  • type باید XR_TYPE_SPATIAL_DISCOVERY_PERSISTENCE_UUID_FILTER_EXT باشد
  • ‫ next باید NULL یا اشاره‌گر معتبری به ساختار بعدی در زنجیره ساختار باشد
  • persistedUuids باید اشاره‌گری به آرایه‌ای از ساختارهای persistedUuidCount XrUuid باشد
  • پارامتر persistedUuidCount باید بزرگ‌تر از 0 باشد
کاوش همه نهادهای پایدار

اگر برنامه از xrCreateSpatialDiscoverySnapshotAsyncEXT بدون XrSpatialDiscoveryPersistenceUuidFilterEXT و با XrSpatialContextEXT که با XrSpatialPersistenceContextEXT پیکربندی شده است استفاده کند، زمان اجرا باید آن نهادها را در عکس آنی ایجادشده که در فضای ذخیره‌سازی نشان‌داده‌شده توسط XrSpatialPersistenceContextEXT ماندگار شده‌اند اضافه کند و فیلترهای ارائه‌شده در XrSpatialDiscoverySnapshotCreateInfoEXT را برآورده کند. برای آن نهادها -

  • زمان اجرا باید XrSpatialPersistenceStateEXT را در XrSpatialPersistenceDataEXT این نهاد روی XR_SPATIAL_PERSISTENCE_STATE_LOADED_EXT تنظیم کند.
  • زمان اجرا باید شامل یک XrSpatialEntityIdEXT معتبر برای این نهاد در عکس آنی ایجادشده باشد.
  • زمان اجرا باید XrSpatialEntityTrackingStateEXT آن نهاد را روی XR_SPATIAL_ENTITY_TRACKING_STATE_TRACKING_EXT تنظیم کند اگر به‌طور فعال نهاد را ردیابی می‌کند و داده‌های معتبری برای مؤلفه‌های آن دارد. درغیراین‌صورت، زمان اجرا باید XrSpatialEntityTrackingStateEXT را روی XR_SPATIAL_ENTITY_TRACKING_STATE_PAUSED_EXT تنظیم کند.

انواع شیء جدید

فرمان‌های جدید

سازه‌های جدید

Enums جدید

ثابت‌های شمارشی جدید

  • XR_EXT_SPATIAL_PERSISTENCE_EXTENSION_NAME
  • XR_EXT_spatial_persistence_SPEC_VERSION
  • درحال گسترش دادن XrObjectType :

    • XR_OBJECT_TYPE_SPATIAL_PERSISTENCE_CONTEXT_EXT
  • درحال گسترش دادن XrResult :

    • XR_ERROR_SPATIAL_PERSISTENCE_SCOPE_UNSUPPORTED_EXT
  • درحال گسترش دادن XrSpatialComponentTypeEXT :

    • XR_SPATIAL_COMPONENT_TYPE_PERSISTENCE_EXT
  • درحال گسترش دادن XrStructureType :

    • XR_TYPE_CREATE_SPATIAL_PERSISTENCE_CONTEXT_COMPLETION_EXT
    • XR_TYPE_SPATIAL_COMPONENT_PERSISTENCE_LIST_EXT
    • XR_TYPE_SPATIAL_CONTEXT_PERSISTENCE_CONFIG_EXT
    • XR_TYPE_SPATIAL_DISCOVERY_PERSISTENCE_UUID_FILTER_EXT
    • XR_TYPE_SPATIAL_PERSISTENCE_CONTEXT_CREATE_INFO_EXT

کد نمونه

ایجاد بافت پایداری

// Check if the required persistence scope supported
uint32_t scopeCount;
CHK_XR(xrEnumerateSpatialPersistenceScopesEXT(instance, systemId, 0, &scopeCount, nullptr));
std::vector<XrSpatialPersistenceScopeEXT> persistenceScopes(scopeCount);
CHK_XR(xrEnumerateSpatialPersistenceScopesEXT(instance, systemId, scopeCount, &scopeCount, persistenceScopes.data()));

if (std::find(persistenceScopes.begin(), persistenceScopes.end(), XR_SPATIAL_PERSISTENCE_SCOPE_SYSTEM_MANAGED_EXT) == persistenceScopes.end()) {
  return;
}

XrSpatialPersistenceContextEXT persistenceContext{};

XrSpatialPersistenceContextCreateInfoEXT persistenceContextCreateInfo{XR_TYPE_SPATIAL_PERSISTENCE_CONTEXT_CREATE_INFO_EXT};
persistenceContextCreateInfo.scope = XR_SPATIAL_PERSISTENCE_SCOPE_SYSTEM_MANAGED_EXT;
XrFutureEXT createContextFuture;
CHK_XR(xrCreateSpatialPersistenceContextAsyncEXT(session, &persistenceContextCreateInfo, &createContextFuture));

waitUntilReady(createContextFuture);

XrCreateSpatialPersistenceContextCompletionEXT completion{XR_TYPE_CREATE_SPATIAL_PERSISTENCE_CONTEXT_COMPLETION_EXT};
CHK_XR(xrCreateSpatialPersistenceContextCompleteEXT(session, createContextFuture, &completion));
if (completion.futureResult != XR_SUCCESS || completion.createResult != XR_SPATIAL_PERSISTENCE_CONTEXT_RESULT_SUCCESS_EXT) {
  return;
}

persistenceContext = completion.persistenceContext;

// ...
// Connect persistence context to a spatial context and discover persisted entities.
// ...

CHK_XR(xrDestroySpatialPersistenceContextEXT(persistenceContext));

اتصال «بافت پایداری» به «بافت فضایی»

// Note: Anchor capability is just used as an example here. Persistence can be
// supported by other capabilities too. xrEnumerateSpatialCapabilityComponentTypesEXT() can
// be used to check if a certain capability supports persistence.
if (!isSpatialCapabilitySupported(instance, systemId, XR_SPATIAL_CAPABILITY_ANCHOR_EXT)) {
  return;
}

const bool supportsPersistenceComponent = isSpatialComponentSupported(instance, systemId, XR_SPATIAL_CAPABILITY_ANCHOR_EXT, XR_SPATIAL_COMPONENT_TYPE_PERSISTENCE_EXT);

// Create a spatial spatial context
XrSpatialContextEXT spatialContext{};
{

  std::vector<XrSpatialComponentTypeEXT> enabledComponents = {
    XR_SPATIAL_COMPONENT_TYPE_ANCHOR_EXT,
  };

  if (supportsPersistenceComponent) {
    enabledComponents.push_back(XR_SPATIAL_COMPONENT_TYPE_PERSISTENCE_EXT);
  }

  XrSpatialCapabilityConfigurationAnchorEXT anchorConfig{XR_TYPE_SPATIAL_CAPABILITY_CONFIGURATION_ANCHOR_EXT};
  anchorConfig.capability = XR_SPATIAL_CAPABILITY_ANCHOR_EXT;
  anchorConfig.enabledComponentCount = enabledComponents.size();
  anchorConfig.enabledComponents = enabledComponents.data();

  std::array<XrSpatialCapabilityConfigurationBaseHeaderEXT*, 1> capabilityConfigs = {
    reinterpret_cast<XrSpatialCapabilityConfigurationBaseHeaderEXT*>(&anchorConfig),
  };

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

  XrSpatialContextPersistenceConfigEXT persistenceConfig{XR_TYPE_SPATIAL_CONTEXT_PERSISTENCE_CONFIG_EXT};
  persistenceConfig.persistenceContextCount = 1;
  persistenceConfig.persistenceContexts = &persistenceContext;

  if (supportsPersistenceComponent) {
    spatialContextCreateInfo.next = &persistenceConfig;
  }

  XrFutureEXT createContextFuture;
  CHK_XR(xrCreateSpatialContextAsyncEXT(session, &spatialContextCreateInfo, &createContextFuture));

  waitUntilReady(createContextFuture);

  XrCreateSpatialContextCompletionEXT completion{XR_TYPE_CREATE_SPATIAL_CONTEXT_COMPLETION_EXT};
  CHK_XR(xrCreateSpatialContextCompleteEXT(session, createContextFuture, &completion));
  if (completion.futureResult != XR_SUCCESS) {
    return;
  }

  spatialContext = completion.spatialContext;
}

// ...
// Discover persisted anchors.
// ...

CHK_XR(xrDestroySpatialContextEXT(spatialContext));

کاوش همه نهادهای پایدار

XrFutureEXT future = XR_NULL_FUTURE_EXT;

// We want to look for entities that have the following components.
std::vector<XrSpatialComponentTypeEXT> snapshotComponents = {
  XR_SPATIAL_COMPONENT_TYPE_PERSISTENCE_EXT,
};

auto discoverSpatialEntities = [&](XrSpatialContextEXT spatialContext, XrTime time) {
  XrSpatialDiscoverySnapshotCreateInfoEXT snapshotCreateInfo{XR_TYPE_SPATIAL_DISCOVERY_SNAPSHOT_CREATE_INFO_EXT};
  snapshotCreateInfo.componentTypeCount = snapshotComponents.size();
  snapshotCreateInfo.componentTypes = snapshotComponents.data();
  CHK_XR(xrCreateSpatialDiscoverySnapshotAsyncEXT(spatialContext, &snapshotCreateInfo, &future));

  waitUntilReady(future);

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

  XrCreateSpatialDiscoverySnapshotCompletionEXT completion{XR_TYPE_CREATE_SPATIAL_DISCOVERY_SNAPSHOT_COMPLETION_EXT};
  CHK_XR(xrCreateSpatialDiscoverySnapshotCompleteEXT(spatialContext, &completionInfo, &completion));
  if (completion.futureResult == XR_SUCCESS) {

    // Query for the semantic label component data
    XrSpatialComponentDataQueryConditionEXT queryCond{XR_TYPE_SPATIAL_COMPONENT_DATA_QUERY_CONDITION_EXT};
    queryCond.componentTypeCount = snapshotComponents.size();
    queryCond.componentTypes = snapshotComponents.data();

    XrSpatialComponentDataQueryResultEXT queryResult{XR_TYPE_SPATIAL_COMPONENT_DATA_QUERY_RESULT_EXT};
    CHK_XR(xrQuerySpatialComponentDataEXT(completion.snapshot, &queryCond, &queryResult));

    std::vector<XrSpatialEntityIdEXT> entityIds(queryResult.entityIdCountOutput);
    std::vector<XrSpatialEntityTrackingStateEXT> entityStates(queryResult.entityIdCountOutput);
    queryResult.entityIdCapacityInput = entityIds.size();
    queryResult.entityIds = entityIds.data();
    queryResult.entityStateCapacityInput = entityStates.size();
    queryResult.entityStates = entityStates.data();

    std::vector<XrSpatialPersistenceDataEXT> persistenceData(queryResult.entityIdCountOutput);
    XrSpatialComponentPersistenceListEXT persistenceDataList{XR_TYPE_SPATIAL_COMPONENT_PERSISTENCE_LIST_EXT};
    persistenceDataList.persistDataCount = persistenceData.size();
    persistenceDataList.persistData = persistenceData.data();
    queryResult.next = &persistenceDataList;

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

    for (int32_t i = 0; i < queryResult.entityIdCountOutput; ++i) {
      // persistenceData[i].persistUuid is the UUID of the persisted entity whose entity ID is entityIds[i].
      // The persistenceData array is essentially the uuids persisted in the scope that the current
      // XrSpatialPersistenceContextEXT is configured with.
    }

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

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

  XrFrameState frameState;  // previously returned from xrWaitFrame
  const XrTime time = frameState.predictedDisplayTime;

  // Poll for the XR_TYPE_EVENT_DATA_SPATIAL_DISCOVERY_RECOMMENDED_EXT event
  XrEventDataBuffer event = {XR_TYPE_EVENT_DATA_BUFFER};
  XrResult result = xrPollEvent(instance, &event);
  if (result == XR_SUCCESS) {
      switch (event.type) {
          case XR_TYPE_EVENT_DATA_SPATIAL_DISCOVERY_RECOMMENDED_EXT: {
              const XrEventDataSpatialDiscoveryRecommendedEXT& eventdata =
                  *reinterpret_cast<XrEventDataSpatialDiscoveryRecommendedEXT*>(&event);
              // Discover spatial entities for the context that we received the "discovery
              // recommended" event for.
              discoverSpatialEntities(eventdata.spatialContext, time);
              break;
          }
      }
  }

  // ...
  // Finish frame loop
  // ...
}

کاوش نهادها با UUIDهای خاص

XrFutureEXT future = XR_NULL_FUTURE_EXT;

// Load up the uuids that the app has stored on its own i.e. the uuids it is interested in.
std::vector<XrUuid> uuidsStoredByApp = loadPersistedUuids();

// We want to look for entities that have the following components.
std::vector<XrSpatialComponentTypeEXT> snapshotComponents = {
  XR_SPATIAL_COMPONENT_TYPE_PERSISTENCE_EXT,
};

auto discoverSpatialEntities = [&](XrSpatialContextEXT spatialContext, XrTime time) {
  XrSpatialDiscoveryPersistenceUuidFilterEXT persistenceFilter{XR_TYPE_SPATIAL_DISCOVERY_PERSISTENCE_UUID_FILTER_EXT};
  persistenceFilter.persistedUuidCount = uuidsStoredByApp.size();
  persistenceFilter.persistedUuids = uuidsStoredByApp.data();

  XrSpatialDiscoverySnapshotCreateInfoEXT snapshotCreateInfo{XR_TYPE_SPATIAL_DISCOVERY_SNAPSHOT_CREATE_INFO_EXT};
  snapshotCreateInfo.componentTypeCount = snapshotComponents.size();
  snapshotCreateInfo.componentTypes = snapshotComponents.data();
  snapshotCreateInfo.next = &persistenceFilter;

  CHK_XR(xrCreateSpatialDiscoverySnapshotAsyncEXT(spatialContext, &snapshotCreateInfo, &future));

  waitUntilReady(future);

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

  XrCreateSpatialDiscoverySnapshotCompletionEXT completion{XR_TYPE_CREATE_SPATIAL_DISCOVERY_SNAPSHOT_COMPLETION_EXT};
  CHK_XR(xrCreateSpatialDiscoverySnapshotCompleteEXT(spatialContext, &completionInfo, &completion));
  if (completion.futureResult == XR_SUCCESS) {

    // Query for the semantic label component data
    XrSpatialComponentDataQueryConditionEXT queryCond{XR_TYPE_SPATIAL_COMPONENT_DATA_QUERY_CONDITION_EXT};
    queryCond.componentTypeCount = snapshotComponents.size();
    queryCond.componentTypes = snapshotComponents.data();

    XrSpatialComponentDataQueryResultEXT queryResult{XR_TYPE_SPATIAL_COMPONENT_DATA_QUERY_RESULT_EXT};
    CHK_XR(xrQuerySpatialComponentDataEXT(completion.snapshot, &queryCond, &queryResult));

    std::vector<XrSpatialEntityIdEXT> entityIds(queryResult.entityIdCountOutput);
    std::vector<XrSpatialEntityTrackingStateEXT> entityStates(queryResult.entityIdCountOutput);
    queryResult.entityIdCapacityInput = entityIds.size();
    queryResult.entityIds = entityIds.data();
    queryResult.entityStateCapacityInput = entityStates.size();
    queryResult.entityStates = entityStates.data();

    std::vector<XrSpatialPersistenceDataEXT> persistenceData(queryResult.entityIdCountOutput);
    XrSpatialComponentPersistenceListEXT persistenceDataList{XR_TYPE_SPATIAL_COMPONENT_PERSISTENCE_LIST_EXT};
    persistenceDataList.persistDataCount = persistenceData.size();
    persistenceDataList.persistData = persistenceData.data();
    queryResult.next = &persistenceDataList;

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

    for (int32_t i = 0; i < queryResult.entityIdCountOutput; ++i) {
      if (persistenceData[i].persistState == XR_SPATIAL_PERSISTENCE_STATE_LOADED_EXT) {
        // persistenceData[i].persistUuid, requested by the app, is present in the persistence scope
        // and its corresponding entity ID and state are entityIds[i] & entityStates[i] respectively.
      } else if (persistenceData[i].persistState == XR_SPATIAL_PERSISTENCE_STATE_NOT_FOUND_EXT) {
        // persistenceData[i].persistUuid, requested by the app, is NOT present in the persistence scope
        // and its corresponding entity ID (entityIds[i]) would be XR_NULL_SPATIAL_ENTITY_ID_EXT
        // and tracking state (entityStates[i]) would be XR_SPATIAL_ENTITY_TRACKING_STATE_STOPPED_EXT.
      }
    }

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

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

  XrFrameState frameState;  // previously returned from xrWaitFrame
  const XrTime time = frameState.predictedDisplayTime;

  // Poll for the XR_TYPE_EVENT_DATA_SPATIAL_DISCOVERY_RECOMMENDED_EXT event
  XrEventDataBuffer event = {XR_TYPE_EVENT_DATA_BUFFER};
  XrResult result = xrPollEvent(instance, &event);
  if (result == XR_SUCCESS) {
      switch (event.type) {
          case XR_TYPE_EVENT_DATA_SPATIAL_DISCOVERY_RECOMMENDED_EXT: {
              const XrEventDataSpatialDiscoveryRecommendedEXT& eventdata =
                  *reinterpret_cast<XrEventDataSpatialDiscoveryRecommendedEXT*>(&event);
              // Discover spatial entities for the context that we received the "discovery
              // recommended" event for.
              discoverSpatialEntities(eventdata.spatialContext, time);
              break;
          }
      }
  }

  // ...
  // Finish frame loop
  // ...
}

مشکلات

سابقه نسخه

  • نسخه ۱، ۲۰۲۴/۰۸/۲۹ (Nihav Jain،‏ Google)

    • شرح اولیه افزونه