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_EXT_spatial_persistenceباید قبلاز فراخوانی xrCreateSpatialPersistenceContextAsyncEXT فعال شود -
sessionباید یک دسته XrSession معتبر باشد -
createInfoباید اشارهگری به ساختار XrSpatialPersistenceContextCreateInfoEXT معتبر باشد -
futureباید اشارهگری به مقدارXrFutureEXTباشد
کدهای برگشتی
XR_SUCCESSXR_SESSION_LOSS_PENDING
XR_ERROR_FUNCTION_UNSUPPORTEDXR_ERROR_HANDLE_INVALIDXR_ERROR_INSTANCE_LOSTXR_ERROR_LIMIT_REACHEDXR_ERROR_OUT_OF_MEMORYXR_ERROR_RUNTIME_FAILUREXR_ERROR_SESSION_LOSTXR_ERROR_SPATIAL_PERSISTENCE_SCOPE_UNSUPPORTED_EXTXR_ERROR_VALIDATION_FAILURE
ساختار XrSpatialPersistenceContextCreateInfoEXT بهصورت زیر تعریف میشود:
typedef struct XrSpatialPersistenceContextCreateInfoEXT {
XrStructureType type;
const void* next;
XrSpatialPersistenceScopeEXT scope;
} XrSpatialPersistenceContextCreateInfoEXT;
توضیحات عضو
typeXrStructureType این ساختار است.-
nextبرابر باNULLیا اشارهگری به ساختار بعدی در زنجیره ساختار است. چنین ساختارهایی در OpenXR اصلی یا این افزونه تعریف نشده است. -
scopeیک XrSpatialPersistenceScopeEXT است که دامنه ذخیرهسازی بافت پایداری را تعریف میکند.
ساختار XrSpatialPersistenceContextCreateInfoEXT اطلاعات لازم برای ایجاد دسته XrSpatialPersistenceContextEXT را شرح میدهد.
استفاده معتبر (ضمنی)
- افزونه
XR_EXT_spatial_persistenceباید قبلاز استفاده از XrSpatialPersistenceContextCreateInfoEXT فعال شود -
typeبایدXR_TYPE_SPATIAL_PERSISTENCE_CONTEXT_CREATE_INFO_EXTباشد -
nextبایدNULLیا اشارهگر معتبری به ساختار بعدی در زنجیره ساختار باشد -
scopeباید مقدار XrSpatialPersistenceScopeEXT معتبری باشد
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 است. systemIdXrSystemIdاست که دامنههای پایداری فضایی آن شمارش خواهد شد.persistenceScopeCapacityInputظرفیت آرایهpersistenceScopesاست، یا ۰ برای نشان دادن درخواست بازیابی ظرفیت موردنیاز.persistenceScopeCountOutputتعداد دامنههای پایداری یا ظرفیت موردنیاز درصورتی است کهpersistenceScopeCapacityInputکافی نباشد.-
persistenceScopesآرایهای از XrSpatialPersistenceScopeEXT است. اگرpersistenceScopeCapacityInputبرابر با ۰ باشد، میتواندNULLباشد. - برای شرح دقیق بازیابی اندازه
persistenceScopesموردنیاز، فصل پارامترهای اندازه میانگیر را ببینید.
برنامه میتواند فهرست دامنههای پایداری فضایی پشتیبانیشده توسط XrSystemId دادهشده را بااستفاده از xrEnumerateSpatialPersistenceScopesEXT شمارش کند.
استفاده معتبر (ضمنی)
- افزونه
XR_EXT_spatial_persistenceباید قبلاز فراخوانی xrEnumerateSpatialPersistenceScopesEXT فعال شود -
instanceباید شناسه XrInstance معتبری باشد -
persistenceScopeCountOutputباید اشارهگری به مقدارuint32_tباشد - اگر
persistenceScopeCapacityInput0نباشد،persistenceScopesباید اشارهگری به آرایهای از مقادیرpersistenceScopeCapacityInputXrSpatialPersistenceScopeEXT باشد
کدهای برگشتی
XR_SUCCESS
XR_ERROR_FUNCTION_UNSUPPORTEDXR_ERROR_HANDLE_INVALIDXR_ERROR_INSTANCE_LOSTXR_ERROR_RUNTIME_FAILUREXR_ERROR_SIZE_INSUFFICIENTXR_ERROR_SYSTEM_INVALIDXR_ERROR_VALIDATION_FAILURE
تابع xrCreateSpatialPersistenceContextCompleteEXT بهصورت زیر تعریف میشود:
XrResult xrCreateSpatialPersistenceContextCompleteEXT(
XrSession session,
XrFutureEXT future,
XrCreateSpatialPersistenceContextCompletionEXT* completion);
شرح پارامترها
-
sessionهمان XrSession است که قبلاً به xrCreateSpatialPersistenceContextAsyncEXT ::sessionارسال شده است. -
futureهمانXrFutureEXTاست که از xrCreateSpatialPersistenceContextAsyncEXT دریافت شده است. -
completionاشارهگری به XrCreateSpatialPersistenceContextCompletionEXT است.
xrCreateSpatialPersistenceContextCompleteEXT عملیات ناهمگام شروعشده توسط xrCreateSpatialPersistenceContextAsyncEXT را تکمیل میکند. اگر future در وضعیت آماده نباشد، زمان اجرا باید XR_ERROR_FUTURE_PENDING_EXT را برگرداند. اگر future قبلاً تکمیل یا لغو شده باشد، زمان اجرا باید XR_ERROR_FUTURE_INVALID_EXT را برگرداند.
استفاده معتبر (ضمنی)
- افزونه
XR_EXT_spatial_persistenceباید قبلاز فراخوانی xrCreateSpatialPersistenceContextCompleteEXT فعال شود -
sessionباید یک دسته XrSession معتبر باشد -
completionباید اشارهگری به ساختار XrCreateSpatialPersistenceContextCompletionEXT باشد
کدهای برگشتی
XR_SUCCESSXR_SESSION_LOSS_PENDING
XR_ERROR_FUNCTION_UNSUPPORTEDXR_ERROR_FUTURE_INVALID_EXTXR_ERROR_FUTURE_PENDING_EXTXR_ERROR_HANDLE_INVALIDXR_ERROR_INSTANCE_LOSTXR_ERROR_LIMIT_REACHEDXR_ERROR_OUT_OF_MEMORYXR_ERROR_RUNTIME_FAILUREXR_ERROR_SESSION_LOSTXR_ERROR_VALIDATION_FAILURE
ساختار XrCreateSpatialPersistenceContextCompletionEXT بهصورت زیر تعریف میشود:
typedef struct XrCreateSpatialPersistenceContextCompletionEXT {
XrStructureType type;
void* next;
XrResult futureResult;
XrSpatialPersistenceContextResultEXT createResult;
XrSpatialPersistenceContextEXT persistenceContext;
} XrCreateSpatialPersistenceContextCompletionEXT;
توضیحات عضو
typeXrStructureType این ساختار است.-
nextبرابر باNULLیا اشارهگری به ساختار بعدی در زنجیره ساختار است. -
futureResultعبارت است از XrResult عملیات ایجاد بافت پایداری فضایی. -
createResultعبارت است از XrSpatialPersistenceContextResultEXT عملیات ایجاد بافت پایداری فضایی. -
persistenceContextیک XrSpatialPersistenceContextEXT است که بااستفاده از دادهها و پیکربندی در xrCreateSpatialPersistenceContextAsyncEXT ::createInfoایجاد شده است.
کدهای برگشتی آتی
مقادیر futureResult:
XR_SUCCESSXR_SESSION_LOSS_PENDING
XR_ERROR_RUNTIME_FAILUREXR_ERROR_INSTANCE_LOSTXR_ERROR_SESSION_LOSTXR_ERROR_OUT_OF_MEMORYXR_ERROR_LIMIT_REACHEDXR_ERROR_PERMISSION_INSUFFICIENT
اگر futureResult و createResult هر دو کدهای موفقیت باشند، persistenceContext باید معتبر باشد. اگر persistenceContext معتبر باشد، باید در چرخه حیات xrCreateSpatialPersistenceContextAsyncEXT :: session یا تا زمانی که برنامه از xrDestroySpatialPersistenceContextEXT با persistenceContext استفاده کند (هرکدام که زودتر اتفاق بیفتد) معتبر باقی بماند.
زمان اجرا باید createResult را فقط درصورتی تنظیم کند که futureResult کد موفقیت باشد.
استفاده معتبر (ضمنی)
- افزونه
XR_EXT_spatial_persistenceباید قبلاز استفاده از XrCreateSpatialPersistenceContextCompletionEXT فعال شود -
typeبایدXR_TYPE_CREATE_SPATIAL_PERSISTENCE_CONTEXT_COMPLETION_EXTباشد -
nextبایدNULLیا اشارهگر معتبری به ساختار بعدی در زنجیره ساختار باشد -
futureResultباید مقدار XrResult معتبری باشد -
createResultباید مقدار XrSpatialPersistenceContextResultEXT معتبری باشد -
persistenceContextباید شناسه مجازی XrSpatialPersistenceContextEXT معتبری باشد
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);
شرح پارامترها
-
persistenceContextیک XrSpatialPersistenceContextEXT است که قبلاً توسط xrCreateSpatialPersistenceContextAsyncEXT ایجاد شده است.
برنامه میتواند از xrDestroySpatialPersistenceContextEXT برای رها کردن دسته persistenceContext پساز اتمام کارهای پایداری فضایی استفاده کند.
اگر دستههای XrSpatialContextEXT معتبری وجود داشته باشد که persistenceContext ازطریق XrSpatialContextPersistenceConfigEXT به آنها پیوند داده شده باشد، زمان اجرا نباید منابع اساسی persistenceContext را هنگام فراخوانی xrDestroySpatialPersistenceContextEXT ازبین ببرد. دلیلش این است که منابع بافت پایداری هنوز توسط بافت فضایی برای کشف نهادهای پایدار استفاده میشود. ازبین بردن دسته بافت پایداری در چنین شرایطی فقط دسترسی برنامه به این منابع را حذف میکند.
منابع XrSpatialPersistenceContextEXT تخریبشده باید زمانی آزاد شوند که همه دستههای XrSpatialContextEXT که بافت پایداری به آنها پیوند داده شده بود تخریب شوند.
استفاده معتبر (ضمنی)
- افزونه
XR_EXT_spatial_persistenceباید قبلاز فراخوانی xrDestroySpatialPersistenceContextEXT فعال شود -
persistenceContextباید شناسه مجازی XrSpatialPersistenceContextEXT معتبری باشد
ایمنی رشتهای
- دسترسی به
persistenceContextو هرگونه دسته فرزند باید بهصورت خارجی همگامسازی شود
کدهای برگشتی
XR_SUCCESS
XR_ERROR_FUNCTION_UNSUPPORTEDXR_ERROR_HANDLE_INVALIDXR_ERROR_RUNTIME_FAILURE
کاوش نهادهای پایدار
مؤلفه پایداری
نهادهای فضایی پایدار دارای مؤلفه پایداری هستند که زمان اجرا باید آن را در عکسهای آنی اکتشاف و بهروزرسانی لحاظ کند، اگر XR_SPATIAL_COMPONENT_TYPE_PERSISTENCE_EXT درطول ایجاد XrSpatialContextEXT فعال شده باشد و در XrSpatialDiscoverySnapshotCreateInfoEXT :: componentTypes یا XrSpatialUpdateSnapshotCreateInfoEXT :: componentTypes لحاظ شده باشد.
دادههای مؤلفه
ساختار XrSpatialPersistenceDataEXT بهصورت زیر تعریف میشود:
typedef struct XrSpatialPersistenceDataEXT {
XrUuid persistUuid;
XrSpatialPersistenceStateEXT persistState;
} XrSpatialPersistenceDataEXT;
توضیحات عضو
-
persistUuidیک XrUuid است. -
persistStateیک XrSpatialPersistenceStateEXT است که وضعیت پایداریpersistUuidرا نشان میدهد
استفاده معتبر (ضمنی)
- افزونه
XR_EXT_spatial_persistenceباید قبلاز استفاده از XrSpatialPersistenceDataEXT فعال شود -
persistStateباید مقدار XrSpatialPersistenceStateEXT معتبری باشد
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;
توضیحات عضو
typeXrStructureType این ساختار است.-
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_EXT_spatial_persistenceباید قبلاز استفاده از XrSpatialComponentPersistenceListEXT فعال شود -
typeبایدXR_TYPE_SPATIAL_COMPONENT_PERSISTENCE_LIST_EXTباشد -
nextبایدNULLیا اشارهگر معتبری به ساختار بعدی در زنجیره ساختار باشد -
persistDataباید اشارهگری به آرایهای از ساختارهایpersistDataCountXrSpatialPersistenceDataEXT باشد - پارامتر
persistDataCountباید بزرگتر از0باشد
پیکربندی
اگر 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;
توضیحات عضو
typeXrStructureType این ساختار است.-
nextبرابر باNULLیا اشارهگری به ساختار بعدی در زنجیره ساختار است. چنین ساختارهایی در OpenXR اصلی یا این افزونه تعریف نشده است. persistenceContextCountیکuint32_tاست که تعداد عناصر را در آرایهpersistenceContextsتوصیف میکند.persistenceContextsآرایهای از XrSpatialPersistenceContextEXT است.
برنامه میتواند XrSpatialContextPersistenceConfigEXT را به زنجیره بعدی XrSpatialContextCreateInfoEXT اضافه کند. این کار XrSpatialContextEXT ایجادشده را با persistenceContexts پیکربندی میکند و به برنامه اجازه میدهد موجودیتهای فضایی را که در فضای ذخیرهسازی نشاندادهشده توسط دستههای XrSpatialPersistenceContextEXT در persistenceContexts حفظ شدهاند کاوش کند.
استفاده معتبر (ضمنی)
- افزونه
XR_EXT_spatial_persistenceباید قبلاز استفاده از XrSpatialContextPersistenceConfigEXT فعال شود -
typeبایدXR_TYPE_SPATIAL_CONTEXT_PERSISTENCE_CONFIG_EXTباشد -
nextبایدNULLیا اشارهگر معتبری به ساختار بعدی در زنجیره ساختار باشد -
persistenceContextsباید اشارهگری به آرایهای از دستههایpersistenceContextCountمعتبر XrSpatialPersistenceContextEXT باشد - پارامتر
persistenceContextCountباید بزرگتر از0باشد
ایجاد عکس آنی کاوش
کاوش نهادها با UUIDهای خاص
ساختار XrSpatialDiscoveryPersistenceUuidFilterEXT بهصورت زیر تعریف میشود:
typedef struct XrSpatialDiscoveryPersistenceUuidFilterEXT {
XrStructureType type;
const void* next;
uint32_t persistedUuidCount;
const XrUuid* persistedUuids;
} XrSpatialDiscoveryPersistenceUuidFilterEXT;
توضیحات عضو
typeXrStructureType این ساختار است.-
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تنظیم کند.
- زمان اجرا باید XrSpatialPersistenceStateEXT را در XrSpatialPersistenceDataEXT این نهاد روی
اگر زمان اجرا تشخیص دهد که 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تنظیم کند تا به برنامه نشان دهد که این نهاد هرگز ردیابی نخواهد شد.
- زمان اجرا باید XrSpatialPersistenceStateEXT را در XrSpatialPersistenceDataEXT این موجودیت روی
اگر زمان اجرا نتواند وجود 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باید اشارهگری به آرایهای از ساختارهایpersistedUuidCountXrUuid باشد - پارامتر
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تنظیم کند.
انواع شیء جدید
فرمانهای جدید
- xrCreateSpatialPersistenceContextAsyncEXT
- xrCreateSpatialPersistenceContextCompleteEXT
- xrDestroySpatialPersistenceContextEXT
- xrEnumerateSpatialPersistenceScopesEXT
سازههای جدید
- XrCreateSpatialPersistenceContextCompletionEXT
- XrSpatialPersistenceContextCreateInfoEXT
- XrSpatialPersistenceDataEXT
درحال گسترش دادن XrSpatialComponentDataQueryResultEXT :
درحال گسترش دادن XrSpatialContextCreateInfoEXT :
گسترش دادن XrSpatialDiscoverySnapshotCreateInfoEXT ، XrSpatialComponentDataQueryConditionEXT :
Enums جدید
ثابتهای شمارشی جدید
XR_EXT_SPATIAL_PERSISTENCE_EXTENSION_NAMEXR_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_EXTXR_TYPE_SPATIAL_COMPONENT_PERSISTENCE_LIST_EXTXR_TYPE_SPATIAL_CONTEXT_PERSISTENCE_CONFIG_EXTXR_TYPE_SPATIAL_DISCOVERY_PERSISTENCE_UUID_FILTER_EXTXR_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)
- شرح اولیه افزونه