XR_EXT_spatial_persistence
String Nama
XR_EXT_spatial_persistence
Jenis Ekstensi
Ekstensi instance
Nomor Ekstensi Terdaftar
764
Revisi
1
Status Ratifikasi
Diratifikasi
Dependensi Ekstensi dan Versi
XR_EXT_spatial_entity
dan
XR_EXT_future
Kontributor
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
Ringkasan
Ekstensi ini memungkinkan aplikasi menemukan dan menghubungkan entity spasial di seluruh sesi aplikasi, sesi OpenXR, dan beberapa konteks spasial OpenXR dalam satu sesi. Ekstensi XR_EXT_spatial_entity menetapkan bahwa entity dalam XrSpatialContextEXT direpresentasikan oleh XrSpatialEntityIdEXT . Ekstensi ini memperluas konsep tersebut dengan menetapkan bahwa suatu entity, jika dipertahankan, akan direpresentasikan oleh XrUuid di seluruh sesi aplikasi dan OpenXR, yaitu aplikasi dapat menggunakan XrUuid yang disediakan oleh ekstensi ini untuk mengidentifikasi entity di seluruh sesi. Ekstensi ini juga memberikan tumpang-tindih yang berguna dengan ekstensi XR_EXT_spatial_entity untuk menemukan entity yang dipertahankan di lingkungan pengguna dan kemampuan untuk mengkueri data komponennya.
Konteks Persistensi Spasial
Membuat konteks persistensi spasial
XR_DEFINE_HANDLE(XrSpatialPersistenceContextEXT)
Handle XrSpatialPersistenceContextEXT mewakili koneksi ke penyimpanan entity spasial persisten.
Fungsi xrCreateSpatialPersistenceContextAsyncEXT didefinisikan sebagai:
XrResult xrCreateSpatialPersistenceContextAsyncEXT(
XrSession session,
const XrSpatialPersistenceContextCreateInfoEXT* createInfo,
XrFutureEXT* future);
Deskripsi Parameter
sessionadalah XrSession tempat konteks persistensi spasial akan aktif.createInfoadalah XrSpatialPersistenceContextCreateInfoEXT yang digunakan untuk menentukan parameter konteks persistensi spasial.futureadalah pointer keXrFutureEXT.
Aplikasi dapat membuat handle XrSpatialPersistenceContextEXT menggunakan fungsi xrCreateSpatialPersistenceContextAsyncEXT dan mengonfigurasi cakupan konteks persistensi di createInfo .
Runtime harus menampilkan XR_ERROR_SPATIAL_PERSISTENCE_SCOPE_UNSUPPORTED_EXT jika XrSpatialPersistenceContextCreateInfoEXT :: scope tidak dihitung oleh xrEnumerateSpatialPersistenceScopesEXT .
Jika runtime menerapkan sistem izin untuk mengontrol akses aplikasi ke penyimpanan persistensi yang diwakili oleh XrSpatialPersistenceContextEXT , runtime harus menampilkan XR_ERROR_PERMISSION_INSUFFICIENT jika izin tersebut belum diberikan ke aplikasi ini.
Penggunaan yang Valid (Implisit)
- Ekstensi
XR_EXT_spatial_persistenceharus diaktifkan sebelum memanggil xrCreateSpatialPersistenceContextAsyncEXT -
sessionharus berupa handle XrSession yang valid -
createInfoharus berupa pointer ke struktur XrSpatialPersistenceContextCreateInfoEXT yang valid -
futureharus berupa pointer ke nilaiXrFutureEXT
Kode Status
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
Struktur XrSpatialPersistenceContextCreateInfoEXT didefinisikan sebagai:
typedef struct XrSpatialPersistenceContextCreateInfoEXT {
XrStructureType type;
const void* next;
XrSpatialPersistenceScopeEXT scope;
} XrSpatialPersistenceContextCreateInfoEXT;
Deskripsi Anggota
typeadalah XrStructureType dari struktur ini.nextadalahNULLatau pointer ke struktur berikutnya dalam rantai struktur. Tidak ada struktur seperti itu yang ditentukan dalam OpenXR inti atau ekstensi ini.scopeadalah XrSpatialPersistenceScopeEXT yang menentukan cakupan penyimpanan konteks persistensi.
Struktur XrSpatialPersistenceContextCreateInfoEXT menjelaskan informasi untuk membuat handle XrSpatialPersistenceContextEXT.
Penggunaan yang Valid (Implisit)
- Ekstensi
XR_EXT_spatial_persistenceharus diaktifkan sebelum menggunakan XrSpatialPersistenceContextCreateInfoEXT -
typeharus berupaXR_TYPE_SPATIAL_PERSISTENCE_CONTEXT_CREATE_INFO_EXT -
nextharus berupaNULLatau pointer yang valid ke struktur berikutnya dalam rantai struktur -
scopeharus berupa nilai XrSpatialPersistenceScopeEXT yang valid
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;
Enumerasi XrSpatialPersistenceScopeEXT mengidentifikasi berbagai jenis cakupan konteks persistensi.
Enum memiliki arti berikut:
Deskripsi Enum
XR_SPATIAL_PERSISTENCE_SCOPE_SYSTEM_MANAGED_EXT
Memberikan akses hanya baca kepada aplikasi (yaitu, aplikasi tidak dapat mengubah penyimpanan yang terkait dengan cakupan ini) ke entity spasial yang dipertahankan dan dikelola oleh sistem. Aplikasi dapat menggunakan UUID dalam komponen persistensi untuk cakupan ini guna menghubungkan entity di seluruh konteks spasial dan mulai ulang perangkat.
XR_SPATIAL_PERSISTENCE_SCOPE_LOCAL_ANCHORS_EXT
Operasi persistensi dan akses data dibatasi untuk anchor spasial, di perangkat yang sama, untuk pengguna yang sama dan aplikasi yang sama (Ditambahkan oleh ekstensi XR_EXT_spatial_persistence_operations)
XR_SPATIAL_PERSISTENCE_SCOPE_ANCHORS_FOR_CLOUD_SHARING_ANDROIDX1
Operasi persistensi dan akses data dibatasi untuk anchor spasial, yang dimiliki dan dikelola oleh project cloud yang sama. (Ditambahkan oleh ekstensi XR_ANDROIDX1_spatial_anchor_cloud_sharing)
Fungsi xrEnumerateSpatialPersistenceScopesEXT didefinisikan sebagai:
XrResult xrEnumerateSpatialPersistenceScopesEXT(
XrInstance instance,
XrSystemId systemId,
uint32_t persistenceScopeCapacityInput,
uint32_t* persistenceScopeCountOutput,
XrSpatialPersistenceScopeEXT* persistenceScopes);
Deskripsi Parameter
instanceadalah handle ke XrInstance .systemIdadalahXrSystemIdyang cakupan persistensi spasialnya akan dihitung.persistenceScopeCapacityInputadalah kapasitas arraypersistenceScopes, atau 0 untuk menunjukkan permintaan guna mengambil kapasitas yang diperlukan.persistenceScopeCountOutputadalah jumlah cakupan persistensi, atau kapasitas yang diperlukan jikapersistenceScopeCapacityInputtidak mencukupi.persistenceScopesadalah array XrSpatialPersistenceScopeEXT . Nilainya bisaNULLjikapersistenceScopeCapacityInputadalah 0.- Lihat bab Parameter Ukuran Buffer untuk mengetahui deskripsi mendetail tentang cara mengambil ukuran
persistenceScopesyang diperlukan.
Aplikasi dapat menghitung daftar cakupan persistensi spasial yang didukung oleh XrSystemId tertentu menggunakan xrEnumerateSpatialPersistenceScopesEXT .
Penggunaan yang Valid (Implisit)
- Ekstensi
XR_EXT_spatial_persistenceharus diaktifkan sebelum memanggil xrEnumerateSpatialPersistenceScopesEXT -
instanceharus berupa handle XrInstance yang valid -
persistenceScopeCountOutputharus berupa pointer ke nilaiuint32_t - Jika
persistenceScopeCapacityInputbukan0,persistenceScopesharus berupa pointer ke array nilaipersistenceScopeCapacityInputXrSpatialPersistenceScopeEXT
Kode Status
XR_SUCCESS
XR_ERROR_FUNCTION_UNSUPPORTEDXR_ERROR_HANDLE_INVALIDXR_ERROR_INSTANCE_LOSTXR_ERROR_RUNTIME_FAILUREXR_ERROR_SIZE_INSUFFICIENTXR_ERROR_SYSTEM_INVALIDXR_ERROR_VALIDATION_FAILURE
Fungsi xrCreateSpatialPersistenceContextCompleteEXT didefinisikan sebagai:
XrResult xrCreateSpatialPersistenceContextCompleteEXT(
XrSession session,
XrFutureEXT future,
XrCreateSpatialPersistenceContextCompletionEXT* completion);
Deskripsi Parameter
sessionadalah XrSession yang sebelumnya diteruskan ke xrCreateSpatialPersistenceContextAsyncEXT ::session.futureadalahXrFutureEXTyang diterima dari xrCreateSpatialPersistenceContextAsyncEXT .completionadalah pointer ke XrCreateSpatialPersistenceContextCompletionEXT .
xrCreateSpatialPersistenceContextCompleteEXT menyelesaikan operasi asinkron yang dimulai oleh xrCreateSpatialPersistenceContextAsyncEXT . Runtime harus menampilkan XR_ERROR_FUTURE_PENDING_EXT jika future tidak dalam status siap. Runtime harus menampilkan XR_ERROR_FUTURE_INVALID_EXT jika future telah selesai atau dibatalkan.
Penggunaan yang Valid (Implisit)
- Ekstensi
XR_EXT_spatial_persistenceharus diaktifkan sebelum memanggil xrCreateSpatialPersistenceContextCompleteEXT -
sessionharus berupa handle XrSession yang valid -
completionharus berupa pointer ke struktur XrCreateSpatialPersistenceContextCompletionEXT
Kode Status
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
Struktur XrCreateSpatialPersistenceContextCompletionEXT didefinisikan sebagai:
typedef struct XrCreateSpatialPersistenceContextCompletionEXT {
XrStructureType type;
void* next;
XrResult futureResult;
XrSpatialPersistenceContextResultEXT createResult;
XrSpatialPersistenceContextEXT persistenceContext;
} XrCreateSpatialPersistenceContextCompletionEXT;
Deskripsi Anggota
typeadalah XrStructureType dari struktur ini.nextadalahNULLatau pointer ke struktur berikutnya dalam rantai struktur.futureResultadalah XrResult dari operasi pembuatan konteks persistensi spasial.createResultadalah XrSpatialPersistenceContextResultEXT dari operasi pembuatan konteks persistensi spasial.persistenceContextadalah XrSpatialPersistenceContextEXT yang dibuat menggunakan data dan konfigurasi di xrCreateSpatialPersistenceContextAsyncEXT ::createInfo.
Kode Status Mendatang
Nilai 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
Jika futureResult dan createResult adalah kode berhasil, persistenceContext harus valid. Jika persistenceContext valid, harus tetap demikian dalam siklus proses xrCreateSpatialPersistenceContextAsyncEXT :: session atau hingga aplikasi menggunakan xrDestroySpatialPersistenceContextEXT dengan persistenceContext , mana saja yang lebih dulu.
Runtime harus menetapkan createResult hanya jika futureResult adalah kode keberhasilan.
Penggunaan yang Valid (Implisit)
- Ekstensi
XR_EXT_spatial_persistenceharus diaktifkan sebelum menggunakan XrCreateSpatialPersistenceContextCompletionEXT -
typeharus berupaXR_TYPE_CREATE_SPATIAL_PERSISTENCE_CONTEXT_COMPLETION_EXT -
nextharus berupaNULLatau pointer yang valid ke struktur berikutnya dalam rantai struktur -
futureResultharus berupa nilai XrResult yang valid -
createResultharus berupa nilai XrSpatialPersistenceContextResultEXT yang valid -
persistenceContextharus berupa handle XrSpatialPersistenceContextEXT yang valid
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;
Enumerasi XrSpatialPersistenceContextResultEXT mengidentifikasi berbagai jenis kode hasil untuk operasi persistensi. Kegagalan selama operasi persistensi tidak selalu berada dalam kontrol aplikasi dan enumerasi ini digunakan untuk menyampaikan kasus tersebut. Serupa dengan XrResult , kode keberhasilan dalam enumerasi XrSpatialPersistenceContextResultEXT adalah nilai non-negatif, dan kode kegagalan adalah nilai negatif.
Enum memiliki arti berikut:
Deskripsi Enum
XR_SPATIAL_PERSISTENCE_CONTEXT_RESULT_SUCCESS_EXT
Operasi konteks persistensi berhasil.
XR_SPATIAL_PERSISTENCE_CONTEXT_RESULT_ENTITY_NOT_TRACKING_EXT
Operasi persistensi gagal karena entitas tidak dapat dilacak oleh runtime. (Ditambahkan oleh ekstensi XR_EXT_spatial_persistence_operations)
XR_SPATIAL_PERSISTENCE_CONTEXT_RESULT_PERSIST_UUID_NOT_FOUND_EXT
UUID persist yang diberikan tidak ditemukan di penyimpanan. (Ditambahkan oleh ekstensi XR_EXT_spatial_persistence_operations)
XR_SPATIAL_PERSISTENCE_CONTEXT_RESULT_LOCALIZATION_FAILURE_ANDROIDX1
Operasi persistensi gagal karena pelokalan gagal. (Ditambahkan oleh ekstensi XR_ANDROIDX1_spatial_anchor_cloud_sharing)
XR_SPATIAL_PERSISTENCE_CONTEXT_RESULT_MAP_FEATURE_INSUFFICIENT_ANDROIDX1
Operasi persistensi gagal karena fitur peta pelokalan tidak memadai. (Ditambahkan oleh ekstensi XR_ANDROIDX1_spatial_anchor_cloud_sharing)
XR_SPATIAL_PERSISTENCE_CONTEXT_RESULT_NETWORK_FAILURE_ANDROIDX1
Operasi persistensi gagal karena koneksi jaringan gagal. (Ditambahkan oleh ekstensi XR_ANDROIDX1_spatial_anchor_cloud_sharing)
XR_SPATIAL_PERSISTENCE_CONTEXT_RESULT_NETWORK_TIMEOUT_ANDROIDX1
Operasi persistensi gagal karena waktu tunggu jaringan habis. (Ditambahkan oleh ekstensi XR_ANDROIDX1_spatial_anchor_cloud_sharing)
Menghancurkan konteks persistensi spasial
Fungsi xrDestroySpatialPersistenceContextEXT didefinisikan sebagai:
XrResult xrDestroySpatialPersistenceContextEXT(
XrSpatialPersistenceContextEXT persistenceContext);
Deskripsi Parameter
persistenceContextadalah XrSpatialPersistenceContextEXT yang sebelumnya dibuat oleh xrCreateSpatialPersistenceContextAsyncEXT .
Aplikasi dapat menggunakan xrDestroySpatialPersistenceContextEXT untuk merilis handle persistenceContext setelah selesai dengan tugas persistensi spasial.
Runtime tidak boleh menghancurkan resource yang mendasari untuk persistenceContext saat xrDestroySpatialPersistenceContextEXT dipanggil jika ada handle XrSpatialContextEXT yang valid yang ditautkan ke persistenceContext melalui XrSpatialContextPersistenceConfigEXT . Hal ini karena resource konteks persistensi masih digunakan oleh konteks spasial untuk menemukan entity yang dipertahankan. Menghancurkan handle konteks persistensi dalam situasi seperti ini hanya akan menghapus akses aplikasi ke resource tersebut.
Resource untuk XrSpatialPersistenceContextEXT yang dihancurkan harus dikosongkan saat semua handle XrSpatialContextEXT yang ditautkan ke konteks persistensi dihancurkan.
Penggunaan yang Valid (Implisit)
- Ekstensi
XR_EXT_spatial_persistenceharus diaktifkan sebelum memanggil xrDestroySpatialPersistenceContextEXT -
persistenceContextharus berupa handle XrSpatialPersistenceContextEXT yang valid
Keamanan Thread
- Akses ke
persistenceContext, dan handle turunan apa pun, harus disinkronkan secara eksternal
Kode Status
XR_SUCCESS
XR_ERROR_FUNCTION_UNSUPPORTEDXR_ERROR_HANDLE_INVALIDXR_ERROR_RUNTIME_FAILURE
Menemukan entity yang dipertahankan
Komponen persistensi
Entity spasial yang dipertahankan memiliki komponen persistensi yang harus disertakan oleh runtime dalam snapshot penemuan dan update jika XR_SPATIAL_COMPONENT_TYPE_PERSISTENCE_EXT diaktifkan selama pembuatan XrSpatialContextEXT dan disertakan dalam XrSpatialDiscoverySnapshotCreateInfoEXT :: componentTypes atau XrSpatialUpdateSnapshotCreateInfoEXT :: componentTypes .
Data Komponen
Struktur XrSpatialPersistenceDataEXT didefinisikan sebagai:
typedef struct XrSpatialPersistenceDataEXT {
XrUuid persistUuid;
XrSpatialPersistenceStateEXT persistState;
} XrSpatialPersistenceDataEXT;
Deskripsi Anggota
persistUuidadalah XrUuid .persistStateadalah XrSpatialPersistenceStateEXT yang mewakili status persistensipersistUuid
Penggunaan yang Valid (Implisit)
- Ekstensi
XR_EXT_spatial_persistenceharus diaktifkan sebelum menggunakan XrSpatialPersistenceDataEXT -
persistStateharus berupa nilai XrSpatialPersistenceStateEXT yang valid
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;
Enumerasi XrSpatialPersistenceStateEXT mengidentifikasi berbagai status uuid yang dipertahankan.
Enum memiliki arti berikut:
Deskripsi Enum
XR_SPATIAL_PERSISTENCE_STATE_LOADED_EXT
UUID yang dipertahankan telah berhasil dimuat dari penyimpanan.
XR_SPATIAL_PERSISTENCE_STATE_NOT_FOUND_EXT
UUID yang dipertahankan tidak ditemukan di penyimpanan dan telah dihapus dari penyimpanan atau tidak pernah ada di dalamnya.
Struktur daftar komponen untuk mengkueri data
Struktur XrSpatialComponentPersistenceListEXT didefinisikan sebagai:
typedef struct XrSpatialComponentPersistenceListEXT {
XrStructureType type;
void* next;
uint32_t persistDataCount;
XrSpatialPersistenceDataEXT* persistData;
} XrSpatialComponentPersistenceListEXT;
Deskripsi Anggota
typeadalah XrStructureType dari struktur ini.nextadalahNULLatau pointer ke struktur berikutnya dalam rantai struktur. Tidak ada struktur seperti itu yang ditentukan dalam OpenXR inti atau ekstensi ini.persistDataCountadalahuint32_tyang menjelaskan jumlah elemen dalam arraypersistData.persistDataadalah array XrSpatialPersistenceDataEXT .
Runtime harus menampilkan XR_ERROR_VALIDATION_FAILURE dari xrQuerySpatialComponentDataEXT jika XrSpatialComponentPersistenceListEXT berada dalam rantai berikutnya dari XrSpatialComponentDataQueryResultEXT :: next, tetapi XR_SPATIAL_COMPONENT_TYPE_PERSISTENCE_EXT tidak disertakan dalam XrSpatialComponentDataQueryConditionEXT :: componentTypes .
Runtime harus menampilkan XR_ERROR_SIZE_INSUFFICIENT dari xrQuerySpatialComponentDataEXT jika persistDataCount kurang dari XrSpatialComponentDataQueryResultEXT :: entityIdCountOutput .
Tidak seperti komponen lainnya, runtime harus menetapkan data untuk XR_SPATIAL_COMPONENT_TYPE_PERSISTENCE_EXT, terlepas dari XrSpatialEntityTrackingStateEXT .
Penggunaan yang Valid (Implisit)
- Ekstensi
XR_EXT_spatial_persistenceharus diaktifkan sebelum menggunakan XrSpatialComponentPersistenceListEXT -
typeharus berupaXR_TYPE_SPATIAL_COMPONENT_PERSISTENCE_LIST_EXT -
nextharus berupaNULLatau pointer yang valid ke struktur berikutnya dalam rantai struktur -
persistDataharus berupa pointer ke array strukturpersistDataCountXrSpatialPersistenceDataEXT - Parameter
persistDataCountharus lebih besar dari0
Konfigurasi
Jika XR_SPATIAL_COMPONENT_TYPE_PERSISTENCE_EXT dihitung dalam XrSpatialCapabilityComponentTypesEXT :: componentTypes untuk beberapa kemampuan, aplikasi dapat mengaktifkannya dengan menyertakan enum dalam daftar XrSpatialCapabilityConfigurationBaseHeaderEXT :: enabledComponents. Komponen ini tidak memerlukan konfigurasi khusus untuk disertakan dalam rantai XrSpatialCapabilityConfigurationBaseHeaderEXT berikutnya. Jika aplikasi menyertakan XR_SPATIAL_COMPONENT_TYPE_PERSISTENCE_EXT dalam daftar komponen yang diaktifkan, aplikasi harus menyertakan XrSpatialContextPersistenceConfigEXT dalam rantai XrSpatialContextCreateInfoEXT berikutnya. Jika tidak, runtime harus menampilkan XR_ERROR_SPATIAL_CAPABILITY_CONFIGURATION_INVALID_EXT dari xrCreateSpatialContextAsyncEXT .
Mengonfigurasi konteks spasial dengan konteks persistensi
Struktur XrSpatialContextPersistenceConfigEXT didefinisikan sebagai:
typedef struct XrSpatialContextPersistenceConfigEXT {
XrStructureType type;
const void* next;
uint32_t persistenceContextCount;
const XrSpatialPersistenceContextEXT* persistenceContexts;
} XrSpatialContextPersistenceConfigEXT;
Deskripsi Anggota
typeadalah XrStructureType dari struktur ini.nextadalahNULLatau pointer ke struktur berikutnya dalam rantai struktur. Tidak ada struktur seperti itu yang ditentukan dalam OpenXR inti atau ekstensi ini.persistenceContextCountadalahuint32_tyang menjelaskan jumlah elemen dalam arraypersistenceContexts.persistenceContextsadalah array XrSpatialPersistenceContextEXT .
Aplikasi dapat menambahkan XrSpatialContextPersistenceConfigEXT ke rantai XrSpatialContextCreateInfoEXT berikutnya. Tindakan ini akan mengonfigurasi XrSpatialContextEXT yang dibuat dengan persistenceContexts dan memungkinkan aplikasi menemukan entity spasial yang dipertahankan dalam penyimpanan yang diwakili oleh handle XrSpatialPersistenceContextEXT di persistenceContexts .
Penggunaan yang Valid (Implisit)
- Ekstensi
XR_EXT_spatial_persistenceharus diaktifkan sebelum menggunakan XrSpatialContextPersistenceConfigEXT -
typeharus berupaXR_TYPE_SPATIAL_CONTEXT_PERSISTENCE_CONFIG_EXT -
nextharus berupaNULLatau pointer yang valid ke struktur berikutnya dalam rantai struktur -
persistenceContextsharus berupa pointer ke array handle XrSpatialPersistenceContextEXT yang validpersistenceContextCount - Parameter
persistenceContextCountharus lebih besar dari0
Membuat snapshot penemuan
Menemukan entity dengan UUID tertentu
Struktur XrSpatialDiscoveryPersistenceUuidFilterEXT didefinisikan sebagai:
typedef struct XrSpatialDiscoveryPersistenceUuidFilterEXT {
XrStructureType type;
const void* next;
uint32_t persistedUuidCount;
const XrUuid* persistedUuids;
} XrSpatialDiscoveryPersistenceUuidFilterEXT;
Deskripsi Anggota
typeadalah XrStructureType dari struktur ini.nextadalahNULLatau pointer ke struktur berikutnya dalam rantai struktur. Tidak ada struktur seperti itu yang ditentukan dalam OpenXR inti atau ekstensi ini.persistedUuidCountadalahuint32_tyang menjelaskan jumlah elemen dalam arraypersistedUuidspersistedUuidsadalah array XrUuid .
Aplikasi dapat menggunakan XrSpatialDiscoveryPersistenceUuidFilterEXT dalam rantai XrSpatialDiscoverySnapshotCreateInfoEXT berikutnya untuk mencakup operasi penemuan hanya ke entity yang UUID persistennya berada dalam kumpulan UUID yang disediakan di persistedUuids .
Jika aplikasi menambahkan XrSpatialDiscoveryPersistenceUuidFilterEXT dalam rantai XrSpatialDiscoverySnapshotCreateInfoEXT berikutnya, tetapi xrCreateSpatialDiscoverySnapshotAsyncEXT :: spatialContext tidak dikonfigurasi dengan XrSpatialPersistenceContextEXT apa pun menggunakan XrSpatialContextPersistenceConfigEXT , runtime harus menampilkan XR_ERROR_VALIDATION_FAILURE dari xrCreateSpatialDiscoverySnapshotAsyncEXT .
Runtime harus memperlakukan filter XrSpatialDiscoveryPersistenceUuidFilterEXT sebagai kondisi 'AND' dengan filter lain yang disediakan di XrSpatialDiscoverySnapshotCreateInfoEXT atau rantai berikutnya. Runtime harus memperlakukan array persistedUuids itu sendiri sebagai kondisi 'OR', yaitu memfilter entity yang memiliki UUID yang disediakan dalam array tersebut.
Runtime harus menyertakan satu entri dalam snapshot yang dibuat untuk setiap UUID di persistedUuids yang dapat menentukan status XrSpatialPersistenceStateEXT saat ini.
Jika runtime berhasil menemukan UUID di penyimpanannya, -
- Runtime harus menetapkan XrSpatialPersistenceStateEXT di XrSpatialPersistenceDataEXT entitas ini ke
XR_SPATIAL_PERSISTENCE_STATE_LOADED_EXT. - Runtime harus menyertakan
XrSpatialEntityIdEXTyang valid untuk entity ini dalam snapshot yang dibuat. - Runtime harus menetapkan XrSpatialEntityTrackingStateEXT entity tersebut ke
XR_SPATIAL_ENTITY_TRACKING_STATE_TRACKING_EXTjika secara aktif melacak entity dan memiliki data yang valid untuk komponennya. Jika tidak, runtime harus menetapkan XrSpatialEntityTrackingStateEXT keXR_SPATIAL_ENTITY_TRACKING_STATE_PAUSED_EXT.
- Runtime harus menetapkan XrSpatialPersistenceStateEXT di XrSpatialPersistenceDataEXT entitas ini ke
Jika runtime telah menentukan bahwa UUID tidak ada dalam penyimpanannya (terlepas dari apakah UUID tersebut tidak pernah ada dalam penyimpanan atau pernah ada tetapi telah dihapus), maka -
- Runtime harus menetapkan XrSpatialPersistenceStateEXT di XrSpatialPersistenceDataEXT entity ini ke
XR_SPATIAL_PERSISTENCE_STATE_NOT_FOUND_EXTuntuk menunjukkan kepada aplikasi bahwa UUID ini tidak ada lagi di penyimpanan. - Runtime harus menetapkan
XrSpatialEntityIdEXTuntuk entity ini dalam snapshot yang dibuat ke XR_NULL_SPATIAL_ENTITY_ID_EXT . - Runtime harus menetapkan XrSpatialEntityTrackingStateEXT entity tersebut ke
XR_SPATIAL_ENTITY_TRACKING_STATE_STOPPED_EXTuntuk menunjukkan kepada aplikasi bahwa entity ini tidak akan pernah dilacak.
- Runtime harus menetapkan XrSpatialPersistenceStateEXT di XrSpatialPersistenceDataEXT entity ini ke
Jika runtime tidak dapat menentukan apakah UUID ada dalam penyimpanannya atau tidak, runtime tidak boleh menyertakannya dalam snapshot.
Aplikasi juga dapat menggunakan XrSpatialDiscoveryPersistenceUuidFilterEXT dalam rantai XrSpatialComponentDataQueryConditionEXT berikutnya untuk mengkueri entity UUID tertentu dalam snapshot yang ada. Jika digunakan dengan XrSpatialComponentDataQueryConditionEXT , jika XrSpatialDiscoveryPersistenceUuidFilterEXT :: persistedUuids berisi XrUuid yang tidak ada dalam XrSpatialSnapshotEXT , runtime tidak boleh menyertakan entri untuk XrUuid tersebut dalam hasil kueri. Selain itu, urutan (urutan) entitas dalam hasil kueri mungkin tidak cocok dengan urutan UUID yang diberikan di XrSpatialDiscoveryPersistenceUuidFilterEXT :: persistedUuids . Aplikasi harus menyertakan XR_SPATIAL_COMPONENT_TYPE_PERSISTENCE_EXT di XrSpatialComponentDataQueryConditionEXT :: componentTypes dan XrSpatialComponentPersistenceListEXT di rantai berikutnya dari XrSpatialComponentDataQueryResultEXT, lalu memeriksa XrSpatialPersistenceDataEXT :: persistUuid dari setiap indeks hasil kueri untuk memahami UUID mana yang sesuai dengan indeks hasil saat ini.
Penggunaan yang Valid (Implisit)
- Ekstensi
XR_EXT_spatial_persistenceharus diaktifkan sebelum menggunakan XrSpatialDiscoveryPersistenceUuidFilterEXT -
typeharus berupaXR_TYPE_SPATIAL_DISCOVERY_PERSISTENCE_UUID_FILTER_EXT -
nextharus berupaNULLatau pointer yang valid ke struktur berikutnya dalam rantai struktur -
persistedUuidsharus berupa pointer ke array strukturpersistedUuidCountXrUuid - Parameter
persistedUuidCountharus lebih besar dari0
Menemukan semua entitas yang dipertahankan
Jika aplikasi menggunakan xrCreateSpatialDiscoverySnapshotAsyncEXT tanpa XrSpatialDiscoveryPersistenceUuidFilterEXT dan dengan XrSpatialContextEXT yang telah dikonfigurasi dengan XrSpatialPersistenceContextEXT , runtime harus menyertakan entitas tersebut dalam snapshot yang dibuat yang dipertahankan dalam penyimpanan yang diwakili oleh XrSpatialPersistenceContextEXT dan memenuhi filter yang disediakan di XrSpatialDiscoverySnapshotCreateInfoEXT . Untuk entitas tersebut -
- Runtime harus menetapkan XrSpatialPersistenceStateEXT di XrSpatialPersistenceDataEXT entitas ini ke
XR_SPATIAL_PERSISTENCE_STATE_LOADED_EXT. - Runtime harus menyertakan
XrSpatialEntityIdEXTyang valid untuk entity ini dalam snapshot yang dibuat. - Runtime harus menetapkan XrSpatialEntityTrackingStateEXT entity tersebut ke
XR_SPATIAL_ENTITY_TRACKING_STATE_TRACKING_EXTjika secara aktif melacak entity dan memiliki data yang valid untuk komponennya. Jika tidak, runtime harus menetapkan XrSpatialEntityTrackingStateEXT keXR_SPATIAL_ENTITY_TRACKING_STATE_PAUSED_EXT.
Jenis Objek Baru
Perintah Baru
- xrCreateSpatialPersistenceContextAsyncEXT
- xrCreateSpatialPersistenceContextCompleteEXT
- xrDestroySpatialPersistenceContextEXT
- xrEnumerateSpatialPersistenceScopesEXT
Struktur Baru
- XrCreateSpatialPersistenceContextCompletionEXT
- XrSpatialPersistenceContextCreateInfoEXT
- XrSpatialPersistenceDataEXT
Memperluas XrSpatialComponentDataQueryResultEXT :
Memperluas XrSpatialContextCreateInfoEXT :
Memperluas XrSpatialDiscoverySnapshotCreateInfoEXT , XrSpatialComponentDataQueryConditionEXT :
Enum Baru
Konstanta Enum Baru
XR_EXT_SPATIAL_PERSISTENCE_EXTENSION_NAMEXR_EXT_spatial_persistence_SPEC_VERSIONMemperluas XrObjectType :
XR_OBJECT_TYPE_SPATIAL_PERSISTENCE_CONTEXT_EXT
Memperluas XrResult :
XR_ERROR_SPATIAL_PERSISTENCE_SCOPE_UNSUPPORTED_EXT
Memperluas XrSpatialComponentTypeEXT :
XR_SPATIAL_COMPONENT_TYPE_PERSISTENCE_EXT
Memperluas 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
Kode Contoh
Membuat Konteks Persistensi
// 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));
Menghubungkan Konteks Persistensi ke Konteks Spasial
// 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));
Menemukan semua entitas yang dipertahankan
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
// ...
}
Menemukan entity dengan UUID tertentu
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
// ...
}
Masalah
Riwayat Versi
Revisi 1, 29-08-2024 (Nihav Jain, Google)
- Deskripsi ekstensi awal