XR_EXT_spatial_persistence
Name String
XR_EXT_spatial_persistence
Uzantı Türü
Örnek uzantısı
Kayıtlı Dahili Numara
764
Düzeltme
1
Onay Durumu
Onaylandı
Uzantı ve Sürüm Bağımlılıkları
XR_EXT_spatial_entity
ve
XR_EXT_future
Katkıda bulunanlar
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
Genel Bakış
Bu uzantı, uygulamaların uygulama oturumları, OpenXR oturumları ve bir oturumdaki birden fazla OpenXR uzamsal bağlamı genelinde uzamsal varlıkları keşfetmesine ve ilişkilendirmesine olanak tanır. XR_EXT_spatial_entity uzantısı, XrSpatialContextEXT içindeki bir varlığın XrSpatialEntityIdEXT ile temsil edildiğini belirledi. Bu uzantı, bir varlığın kalıcı olması durumunda uygulama ve OpenXR oturumları genelinde bir XrUuid ile temsil edildiğini belirterek bu kavramı genişletir. Yani bir uygulama, oturumlar genelinde bir varlığı tanımlamak için bu uzantı tarafından sağlanan XrUuid'yi kullanabilir. Bu uzantı, kullanıcının ortamındaki kalıcı varlıkları keşfetmek ve bileşen verilerini sorgulamak için XR_EXT_spatial_entity uzantısıyla da faydalı çakışmalar sağlar.
Uzamsal Kalıcılık Bağlamı
Mekansal kalıcılık bağlamı oluşturma
XR_DEFINE_HANDLE(XrSpatialPersistenceContextEXT)
XrSpatialPersistenceContextEXT herkese açık kullanıcı adı, kalıcı bir uzamsal varlık depolama alanıyla bağlantıyı temsil eder.
xrCreateSpatialPersistenceContextAsyncEXT işlevi şu şekilde tanımlanır:
XrResult xrCreateSpatialPersistenceContextAsyncEXT(
XrSession session,
const XrSpatialPersistenceContextCreateInfoEXT* createInfo,
XrFutureEXT* future);
Parametre Açıklamaları
session, uzamsal kalıcılık bağlamının etkin olacağı bir XrSession'dır.createInfo, uzamsal kalıcılık bağlamı parametrelerini belirtmek için kullanılan XrSpatialPersistenceContextCreateInfoEXT'tir.future, birXrFutureEXTişaretçisidir.
Uygulamalar, xrCreateSpatialPersistenceContextAsyncEXT işlevini kullanarak XrSpatialPersistenceContextEXT herkese açık anahtarı oluşturabilir ve createInfo içinde kalıcılık bağlamının kapsamını yapılandırabilir.
XrSpatialPersistenceContextCreateInfoEXT :: scope, xrEnumerateSpatialPersistenceScopesEXT tarafından numaralandırılmamışsa çalışma zamanı XR_ERROR_SPATIAL_PERSISTENCE_SCOPE_UNSUPPORTED_EXT değerini döndürmelidir.
Bir çalışma zamanı, XrSpatialPersistenceContextEXT ile temsil edilen kalıcı depolama alanına uygulama erişimini kontrol etmek için bir izin sistemi uyguluyorsa bu izinler uygulamaya verilmediğinde çalışma zamanı XR_ERROR_PERMISSION_INSUFFICIENT değerini döndürmelidir.
Geçerli Kullanım (Dolaylı)
- xrCreateSpatialPersistenceContextAsyncEXT çağrılmadan önce
XR_EXT_spatial_persistenceuzantısı etkinleştirilmelidir. -
sessiongeçerli bir XrSession herkese açık kullanıcı adı olmalıdır -
createInfo, geçerli bir XrSpatialPersistenceContextCreateInfoEXT yapısına işaret eden bir işaretçi olmalıdır. -
future, birXrFutureEXTdeğerine işaretçi olmalıdır
Dönüş Kodları
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 yapısı şu şekilde tanımlanır:
typedef struct XrSpatialPersistenceContextCreateInfoEXT {
XrStructureType type;
const void* next;
XrSpatialPersistenceScopeEXT scope;
} XrSpatialPersistenceContextCreateInfoEXT;
Üye Açıklamaları
type, bu yapının XrStructureType değeridir.next,NULLveya bir yapı zincirindeki sonraki yapıya işaret eden bir göstergedir. Temel OpenXR'da veya bu uzantıda bu tür yapılar tanımlanmamıştır.scope, kalıcılık bağlamının depolama kapsamını tanımlayan bir XrSpatialPersistenceScopeEXT'tir.
XrSpatialPersistenceContextCreateInfoEXT yapısı, XrSpatialPersistenceContextEXT herkese açık kullanıcı adı oluşturmak için gereken bilgileri açıklar.
Geçerli Kullanım (Dolaylı)
- XrSpatialPersistenceContextCreateInfoEXT kullanılmadan önce
XR_EXT_spatial_persistenceuzantısı etkinleştirilmelidir. -
typeXR_TYPE_SPATIAL_PERSISTENCE_CONTEXT_CREATE_INFO_EXTolmalıdır -
next,NULLveya yapı zincirindeki bir sonraki yapıya geçerli bir işaretçi olmalıdır. -
scopegeçerli bir XrSpatialPersistenceScopeEXT değeri olmalıdır
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 numaralandırması, farklı kalıcılık bağlamı kapsamı türlerini tanımlar.
Numaralandırmalar aşağıdaki anlamlara sahiptir:
Enum Açıklaması
XR_SPATIAL_PERSISTENCE_SCOPE_SYSTEM_MANAGED_EXT
Uygulamaya, sistem tarafından kalıcı hale getirilen ve yönetilen uzamsal varlıklara salt okuma erişimi (yani uygulama, bu kapsamla ilişkili mağazayı değiştiremez) sağlar. Uygulama, öğeleri mekansal bağlamlar ve cihaz yeniden başlatmaları arasında ilişkilendirmek için bu kapsamdaki kalıcılık bileşeninde UUID'yi kullanabilir.
XR_SPATIAL_PERSISTENCE_SCOPE_LOCAL_ANCHORS_EXT
Kalıcılık işlemleri ve veri erişimi, aynı cihazda, aynı kullanıcı ve aynı uygulama için uzamsal yer işaretleriyle sınırlıdır (XR_EXT_spatial_persistence_operations uzantısı tarafından eklenir).
XR_SPATIAL_PERSISTENCE_SCOPE_ANCHORS_FOR_CLOUD_SHARING_ANDROIDX1
Kalıcılık işlemleri ve veri erişimi, aynı bulut projesine ait olan ve aynı bulut projesi tarafından yönetilen konumsal yer işaretleriyle sınırlıdır. (XR_ANDROIDX1_spatial_anchor_cloud_sharing uzantısı tarafından eklendi)
xrEnumerateSpatialPersistenceScopesEXT işlevi şu şekilde tanımlanır:
XrResult xrEnumerateSpatialPersistenceScopesEXT(
XrInstance instance,
XrSystemId systemId,
uint32_t persistenceScopeCapacityInput,
uint32_t* persistenceScopeCountOutput,
XrSpatialPersistenceScopeEXT* persistenceScopes);
Parametre Açıklamaları
instance, bir XrInstance için herkese açık kullanıcı adıdır.systemId, uzamsal kalıcılık kapsamları numaralandırılacakXrSystemIddeğeridir.persistenceScopeCapacityInput,persistenceScopesdizisinin kapasitesidir veya gerekli kapasiteyi alma isteğini belirtmek için 0'dır.persistenceScopeCountOutput, kalıcılık kapsamlarının sayısı veyapersistenceScopeCapacityInputyetersiz olduğunda gereken kapasitedir.persistenceScopes, XrSpatialPersistenceScopeEXT dizisidir.persistenceScopeCapacityInput0 iseNULLolabilir.- Gerekli
persistenceScopesboyutunu alma hakkında ayrıntılı açıklama için Arabellek Boyutu Parametreleri bölümüne bakın.
Uygulama, xrEnumerateSpatialPersistenceScopesEXT kullanarak belirli bir XrSystemId tarafından desteklenen uzamsal kalıcılık kapsamlarının listesini numaralandırabilir.
Geçerli Kullanım (Dolaylı)
-
XR_EXT_spatial_persistenceuzantısı, xrEnumerateSpatialPersistenceScopesEXT çağrılmadan önce etkinleştirilmelidir. -
instancegeçerli bir XrInstance herkese açık kullanıcı adı olmalıdır -
persistenceScopeCountOutput, biruint32_tdeğerine işaretçi olmalıdır -
persistenceScopeCapacityInput,0değilsepersistenceScopes,persistenceScopeCapacityInputXrSpatialPersistenceScopeEXT değerlerinden oluşan bir diziye işaretçi olmalıdır.
Dönüş Kodları
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 işlevi şu şekilde tanımlanır:
XrResult xrCreateSpatialPersistenceContextCompleteEXT(
XrSession session,
XrFutureEXT future,
XrCreateSpatialPersistenceContextCompletionEXT* completion);
Parametre Açıklamaları
session, daha önce xrCreateSpatialPersistenceContextAsyncEXT ::sessionöğesine iletilen XrSession değeridir.future, xrCreateSpatialPersistenceContextAsyncEXT'ten alınanXrFutureEXTdeğeridir.completion, bir XrCreateSpatialPersistenceContextCompletionEXT işaretçisidir.
xrCreateSpatialPersistenceContextCompleteEXT, xrCreateSpatialPersistenceContextAsyncEXT tarafından başlatılan eşzamansız işlemi tamamlar. future hazır durumda değilse çalışma zamanı XR_ERROR_FUTURE_PENDING_EXT değerini döndürmelidir (must). future zaten tamamlanmış veya iptal edilmişse çalışma zamanı XR_ERROR_FUTURE_INVALID_EXT değerini döndürmelidir (must).
Geçerli Kullanım (Dolaylı)
-
XR_EXT_spatial_persistenceuzantısı, xrCreateSpatialPersistenceContextCompleteEXT çağrılmadan önce etkinleştirilmelidir -
sessiongeçerli bir XrSession herkese açık kullanıcı adı olmalıdır -
completion, bir XrCreateSpatialPersistenceContextCompletionEXT yapısına işaretçi olmalıdır
Dönüş Kodları
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 yapısı şu şekilde tanımlanır:
typedef struct XrCreateSpatialPersistenceContextCompletionEXT {
XrStructureType type;
void* next;
XrResult futureResult;
XrSpatialPersistenceContextResultEXT createResult;
XrSpatialPersistenceContextEXT persistenceContext;
} XrCreateSpatialPersistenceContextCompletionEXT;
Üye Açıklamaları
type, bu yapının XrStructureType değeridir.next,NULLveya bir yapı zincirindeki sonraki yapıya işaret eden bir göstergedir.futureResult, uzamsal kalıcılık bağlamı oluşturma işleminin XrResult değeridir.createResult, uzamsal kalıcılık bağlamı oluşturma işleminin XrSpatialPersistenceContextResultEXT değeridir.persistenceContext, xrCreateSpatialPersistenceContextAsyncEXT ::createInfoiçindeki veriler ve yapılandırma kullanılarak oluşturulan bir XrSpatialPersistenceContextEXT'tir.
Gelecekteki İade Kodları
futureResult değer:
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 ve createResult başarılı kodlarsa persistenceContext geçerli olmalıdır. persistenceContext geçerliyse xrCreateSpatialPersistenceContextAsyncEXT :: session yaşam döngüsü içinde veya uygulama persistenceContext ile xrDestroySpatialPersistenceContextEXT işlevini kullanana kadar (hangisi önce gerçekleşirse) geçerli kalması gerekir.
Çalışma zamanı, createResult değerini yalnızca futureResult bir başarı koduysa ayarlamalıdır.
Geçerli Kullanım (Dolaylı)
- XrCreateSpatialPersistenceContextCompletionEXT kullanılmadan önce
XR_EXT_spatial_persistenceuzantısı etkinleştirilmelidir. -
typeXR_TYPE_CREATE_SPATIAL_PERSISTENCE_CONTEXT_COMPLETION_EXTolmalıdır -
next,NULLveya yapı zincirindeki bir sonraki yapıya geçerli bir işaretçi olmalıdır. -
futureResultgeçerli bir XrResult değeri olmalıdır -
createResultgeçerli bir XrSpatialPersistenceContextResultEXT değeri olmalıdır -
persistenceContext, geçerli bir XrSpatialPersistenceContextEXT herkese açık kullanıcı adı olmalıdır
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 numaralandırması, kalıcılık işlemi için farklı sonuç kodu türlerini tanımlar. Kalıcılık işlemleri sırasındaki hatalar her zaman uygulamanın kontrolünde değildir ve bu numaralandırma, bu tür durumları iletmek için kullanılır. XrResult'a benzer şekilde, XrSpatialPersistenceContextResultEXT sıralamasındaki başarı kodları negatif olmayan değerler, hata kodları ise negatif değerlerdir.
Numaralandırmalar aşağıdaki anlamlara sahiptir:
Enum Açıklaması
XR_SPATIAL_PERSISTENCE_CONTEXT_RESULT_SUCCESS_EXT
Kalıcılık bağlamı işlemi başarılı oldu.
XR_SPATIAL_PERSISTENCE_CONTEXT_RESULT_ENTITY_NOT_TRACKING_EXT
Varlık, çalışma zamanı tarafından izlenemediği için kalıcılık işlemi başarısız oldu. (XR_EXT_spatial_persistence_operations uzantısı tarafından eklendi)
XR_SPATIAL_PERSISTENCE_CONTEXT_RESULT_PERSIST_UUID_NOT_FOUND_EXT
Sağlanan kalıcı UUID, depolama alanında bulunamadı. (XR_EXT_spatial_persistence_operations uzantısı tarafından eklendi)
XR_SPATIAL_PERSISTENCE_CONTEXT_RESULT_LOCALIZATION_FAILURE_ANDROIDX1
Yerelleştirme başarısız olduğu için kalıcılık işlemi başarısız oldu. (XR_ANDROIDX1_spatial_anchor_cloud_sharing uzantısı tarafından eklendi)
XR_SPATIAL_PERSISTENCE_CONTEXT_RESULT_MAP_FEATURE_INSUFFICIENT_ANDROIDX1
Yerelleştirme haritası özelliği yetersiz olduğundan kalıcılık işlemi başarısız oldu. (XR_ANDROIDX1_spatial_anchor_cloud_sharing uzantısı tarafından eklendi)
XR_SPATIAL_PERSISTENCE_CONTEXT_RESULT_NETWORK_FAILURE_ANDROIDX1
Ağ bağlantısı başarısız olduğu için kalıcılık işlemi başarısız oldu. (XR_ANDROIDX1_spatial_anchor_cloud_sharing uzantısı tarafından eklendi)
XR_SPATIAL_PERSISTENCE_CONTEXT_RESULT_NETWORK_TIMEOUT_ANDROIDX1
Ağ zaman aşımı nedeniyle kalıcılık işlemi başarısız oldu. (XR_ANDROIDX1_spatial_anchor_cloud_sharing uzantısı tarafından eklendi)
Uzamsal kalıcılık bağlamını yok etme
xrDestroySpatialPersistenceContextEXT işlevi şu şekilde tanımlanır:
XrResult xrDestroySpatialPersistenceContextEXT(
XrSpatialPersistenceContextEXT persistenceContext);
Parametre Açıklamaları
persistenceContext, daha önce xrCreateSpatialPersistenceContextAsyncEXT tarafından oluşturulmuş bir XrSpatialPersistenceContextEXT değeridir.
Uygulama, uzamsal kalıcılık görevlerini tamamladığında persistenceContext tutma yerini serbest bırakmak için xrDestroySpatialPersistenceContextEXT işlevini kullanabilir.
XrSpatialContextPersistenceConfigEXT aracılığıyla persistenceContext ile bağlantılı geçerli XrSpatialContextEXT tanıtıcıları varsa xrDestroySpatialPersistenceContextEXT çağrıldığında çalışma zamanı, persistenceContext için temel kaynakları yok etmemelidir. Bunun nedeni, kalıcılık bağlamının kaynaklarının, kalıcı varlıkları keşfetmek için uzamsal bağlam tarafından kullanılmaya devam etmesidir. Böyle bir durumda kalıcılık bağlamı tutamacını yok etmek, yalnızca uygulamanın bu kaynaklara erişimini kaldırır.
İmha edilen bir XrSpatialPersistenceContextEXT'nin kaynakları, kalıcılık bağlamının bağlı olduğu tüm XrSpatialContextEXT tanıtıcıları imha edildiğinde serbest bırakılmalıdır.
Geçerli Kullanım (Dolaylı)
-
XR_EXT_spatial_persistenceuzantısı, xrDestroySpatialPersistenceContextEXT çağrılmadan önce etkinleştirilmelidir. -
persistenceContext, geçerli bir XrSpatialPersistenceContextEXT herkese açık kullanıcı adı olmalıdır
İleti Dizisi Güvenliği
persistenceContextve tüm alt herkese açık kullanıcı adlarına erişim harici olarak senkronize edilmelidir.
Dönüş Kodları
XR_SUCCESS
XR_ERROR_FUNCTION_UNSUPPORTEDXR_ERROR_HANDLE_INVALIDXR_ERROR_RUNTIME_FAILURE
Kalıcı varlıkları keşfetme
Kalıcılık bileşeni
Kalıcı uzamsal varlıklar, kalıcılık bileşenine sahiptir. XrSpatialContextEXT oluşturulurken XR_SPATIAL_COMPONENT_TYPE_PERSISTENCE_EXT etkinleştirilmişse ve XrSpatialDiscoverySnapshotCreateInfoEXT :: componentTypes veya XrSpatialUpdateSnapshotCreateInfoEXT :: componentTypes içine dahil edilmişse çalışma zamanı, bu bileşeni keşif ve güncelleme anlık görüntülerine dahil etmelidir.
Bileşen Verileri
XrSpatialPersistenceDataEXT yapısı şu şekilde tanımlanır:
typedef struct XrSpatialPersistenceDataEXT {
XrUuid persistUuid;
XrSpatialPersistenceStateEXT persistState;
} XrSpatialPersistenceDataEXT;
Üye Açıklamaları
persistUuid, bir XrUuid'dir.persistState,persistUuidöğesinin kalıcılık durumunu temsil eden bir XrSpatialPersistenceStateEXT değeridir.
Geçerli Kullanım (Dolaylı)
- XrSpatialPersistenceDataEXT kullanılmadan önce
XR_EXT_spatial_persistenceuzantısı etkinleştirilmelidir. -
persistStategeçerli bir XrSpatialPersistenceStateEXT değeri olmalıdır
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 numaralandırması, kalıcı UUID'nin farklı durumlarını tanımlar.
Numaralandırmalar aşağıdaki anlamlara sahiptir:
Enum Açıklaması
XR_SPATIAL_PERSISTENCE_STATE_LOADED_EXT
Kalıcı UUID, depolama alanından başarıyla yüklendi.
XR_SPATIAL_PERSISTENCE_STATE_NOT_FOUND_EXT
Kalıcı UUID, depolama alanında bulunamadı ve depolama alanından kaldırıldı veya hiç eklenmedi.
Verileri sorgulamak için bileşen listesi yapısı
XrSpatialComponentPersistenceListEXT yapısı şu şekilde tanımlanır:
typedef struct XrSpatialComponentPersistenceListEXT {
XrStructureType type;
void* next;
uint32_t persistDataCount;
XrSpatialPersistenceDataEXT* persistData;
} XrSpatialComponentPersistenceListEXT;
Üye Açıklamaları
type, bu yapının XrStructureType değeridir.next,NULLveya bir yapı zincirindeki sonraki yapıya işaret eden bir göstergedir. Temel OpenXR'da veya bu uzantıda bu tür yapılar tanımlanmamıştır.persistDataCount,persistDatadizisindeki öğe sayısını açıklayan biruint32_tdeğeridir.persistData, XrSpatialPersistenceDataEXT dizisidir.
XrSpatialComponentPersistenceListEXT, XrSpatialComponentDataQueryResultEXT :: next öğesinin sonraki zincirindeyse ancak XR_SPATIAL_COMPONENT_TYPE_PERSISTENCE_EXT, XrSpatialComponentDataQueryConditionEXT :: componentTypes öğesine dahil değilse çalışma zamanı, xrQuerySpatialComponentDataEXT öğesinden XR_ERROR_VALIDATION_FAILURE değerini döndürmelidir.
persistDataCount, XrSpatialComponentDataQueryResultEXT :: entityIdCountOutput değerinden küçükse çalışma zamanı, xrQuerySpatialComponentDataEXT'ten XR_ERROR_SIZE_INSUFFICIENT değerini döndürmelidir.
Diğer bileşenlerin aksine, çalışma zamanı XrSpatialEntityTrackingStateEXT'ten bağımsız olarak XR_SPATIAL_COMPONENT_TYPE_PERSISTENCE_EXT için verileri ayarlamalıdır (must).
Geçerli Kullanım (Dolaylı)
- XrSpatialComponentPersistenceListEXT kullanılmadan önce
XR_EXT_spatial_persistenceuzantısı etkinleştirilmelidir -
typeXR_TYPE_SPATIAL_COMPONENT_PERSISTENCE_LIST_EXTolmalıdır -
next,NULLveya yapı zincirindeki bir sonraki yapıya geçerli bir işaretçi olmalıdır. -
persistData,persistDataCountXrSpatialPersistenceDataEXT yapılarından oluşan bir dizinin işaretçisi olmalıdır -
persistDataCountparametresi0değerinden büyük olmalıdır.
Yapılandırma
XR_SPATIAL_COMPONENT_TYPE_PERSISTENCE_EXT, bir özellik için XrSpatialCapabilityComponentTypesEXT :: componentTypes içinde listeleniyorsa uygulama, enum'u XrSpatialCapabilityConfigurationBaseHeaderEXT :: enabledComponents listesine ekleyerek bu özelliği etkinleştirebilir . Bu bileşenin, sonraki XrSpatialCapabilityConfigurationBaseHeaderEXT zincirine dahil edilmesi için özel bir yapılandırma gerekmez. Uygulama, etkin bileşen listesine XR_SPATIAL_COMPONENT_TYPE_PERSISTENCE_EXT öğesini dahil ediyorsa sonraki XrSpatialContextCreateInfoEXT zincirine XrSpatialContextPersistenceConfigEXT öğesini de dahil etmelidir. Aksi takdirde çalışma zamanı, xrCreateSpatialContextAsyncEXT öğesinden XR_ERROR_SPATIAL_CAPABILITY_CONFIGURATION_INVALID_EXT değerini döndürmelidir.
Kalıcılık bağlamlarıyla uzamsal bağlamı yapılandırma
XrSpatialContextPersistenceConfigEXT yapısı şu şekilde tanımlanır:
typedef struct XrSpatialContextPersistenceConfigEXT {
XrStructureType type;
const void* next;
uint32_t persistenceContextCount;
const XrSpatialPersistenceContextEXT* persistenceContexts;
} XrSpatialContextPersistenceConfigEXT;
Üye Açıklamaları
type, bu yapının XrStructureType değeridir.next,NULLveya bir yapı zincirindeki sonraki yapıya işaret eden bir göstergedir. Temel OpenXR'da veya bu uzantıda bu tür yapılar tanımlanmamıştır.persistenceContextCount,persistenceContextsdizisindeki öğe sayısını açıklayan biruint32_tdeğeridir.persistenceContexts, XrSpatialPersistenceContextEXT dizisidir.
Uygulamalar, XrSpatialContextCreateInfoEXT'in sonraki zincirine XrSpatialContextPersistenceConfigEXT ekleyebilir. Bu işlem, oluşturulan XrSpatialContextEXT'i persistenceContexts ile yapılandırır ve uygulamanın, persistenceContexts içindeki XrSpatialPersistenceContextEXT tanıtıcıları tarafından temsil edilen depolama alanında kalıcı olan uzamsal varlıkları keşfetmesine olanak tanır.
Geçerli Kullanım (Dolaylı)
- XrSpatialContextPersistenceConfigEXT kullanılmadan önce
XR_EXT_spatial_persistenceuzantısı etkinleştirilmelidir. -
typeXR_TYPE_SPATIAL_CONTEXT_PERSISTENCE_CONFIG_EXTolmalıdır -
next,NULLveya yapı zincirindeki bir sonraki yapıya geçerli bir işaretçi olmalıdır. -
persistenceContexts,persistenceContextCountgeçerli XrSpatialPersistenceContextEXT tanıtıcısından oluşan bir dizinin işaretçisi olmalıdır. -
persistenceContextCountparametresi0değerinden büyük olmalıdır.
Keşif anlık görüntüsü oluşturma
Belirli UUID'lere sahip varlıkları keşfetme
XrSpatialDiscoveryPersistenceUuidFilterEXT yapısı şu şekilde tanımlanır:
typedef struct XrSpatialDiscoveryPersistenceUuidFilterEXT {
XrStructureType type;
const void* next;
uint32_t persistedUuidCount;
const XrUuid* persistedUuids;
} XrSpatialDiscoveryPersistenceUuidFilterEXT;
Üye Açıklamaları
type, bu yapının XrStructureType değeridir.next,NULLveya bir yapı zincirindeki sonraki yapıya işaret eden bir göstergedir. Temel OpenXR'da veya bu uzantıda bu tür yapılar tanımlanmamıştır.persistedUuidCount,persistedUuidsdizisindeki öğe sayısını açıklayan biruint32_tdeğeridir.persistedUuids, XrUuid dizisidir.
Uygulama, keşif işlemini yalnızca kalıcı UUID'leri persistedUuids içinde sağlanan UUID'ler kümesinde bulunan varlıklarla sınırlamak için XrSpatialDiscoverySnapshotCreateInfoEXT'in sonraki zincirinde XrSpatialDiscoveryPersistenceUuidFilterEXT'yi kullanabilir.
Uygulama, XrSpatialDiscoverySnapshotCreateInfoEXT'nin sonraki zincirine XrSpatialDiscoveryPersistenceUuidFilterEXT eklerse ancak xrCreateSpatialDiscoverySnapshotAsyncEXT :: spatialContext, XrSpatialContextPersistenceConfigEXT kullanılarak herhangi bir XrSpatialPersistenceContextEXT ile yapılandırılmamışsa çalışma zamanı, xrCreateSpatialDiscoverySnapshotAsyncEXT'ten XR_ERROR_VALIDATION_FAILURE döndürmelidir.
Çalışma zamanı, XrSpatialDiscoveryPersistenceUuidFilterEXT filtresini XrSpatialDiscoverySnapshotCreateInfoEXT veya sonraki zincirinde sağlanan diğer filtrelerle birlikte "VE" koşulu olarak değerlendirmelidir. Çalışma zamanı, persistedUuids dizisini "VEYA" koşulu olarak değerlendirmelidir. Yani bu dizide sağlanan UUID'lerden herhangi birine sahip varlıkları filtrelemelidir.
Çalışma zamanı, persistedUuids içinde o anda XrSpatialPersistenceStateEXT durumunu belirleyebildiği her UUID için oluşturulan anlık görüntüye bir giriş eklemelidir.
Çalışma zamanı, depolama alanında UUID'yi başarıyla bulduysa:
- Çalışma zamanı, bu varlığın XrSpatialPersistenceDataEXT öğesindeki XrSpatialPersistenceStateEXT değerini
XR_SPATIAL_PERSISTENCE_STATE_LOADED_EXTolarak ayarlamalıdır. - Çalışma zamanı, oluşturulan anlık görüntüde bu varlık için geçerli bir
XrSpatialEntityIdEXTiçermelidir. - Çalışma zamanı, öğeyi etkin bir şekilde izliyorsa ve bileşenleri için geçerli verilere sahipse ilgili öğenin XrSpatialEntityTrackingStateEXT değerini
XR_SPATIAL_ENTITY_TRACKING_STATE_TRACKING_EXTolarak ayarlamalıdır. Aksi takdirde çalışma zamanı, XrSpatialEntityTrackingStateEXT'yiXR_SPATIAL_ENTITY_TRACKING_STATE_PAUSED_EXTolarak ayarlamalıdır.
- Çalışma zamanı, bu varlığın XrSpatialPersistenceDataEXT öğesindeki XrSpatialPersistenceStateEXT değerini
Çalışma zamanı, UUID'nin depolama alanında bulunmadığını belirlerse (UUID'nin depolama alanında hiç bulunmadığı veya bir kez bulunduğu ancak o zamandan beri kalıcı olmadığı durumlarda):
- Çalışma zamanı, bu varlığın XrSpatialPersistenceDataEXT öğesindeki XrSpatialPersistenceStateEXT değerini
XR_SPATIAL_PERSISTENCE_STATE_NOT_FOUND_EXTolarak ayarlamalıdır. Bu, uygulamaya bu UUID'nin artık depolama alanında bulunmadığını gösterir. - Çalışma zamanı, oluşturulan anlık görüntüde bu varlık için
XrSpatialEntityIdEXTdeğerini XR_NULL_SPATIAL_ENTITY_ID_EXT olarak ayarlamalıdır. - Çalışma zamanı, uygulamanın bu öğenin hiçbir zaman izlenmeyeceğini belirtmek için öğenin XrSpatialEntityTrackingStateEXT değerini
XR_SPATIAL_ENTITY_TRACKING_STATE_STOPPED_EXTolarak ayarlamalıdır.
- Çalışma zamanı, bu varlığın XrSpatialPersistenceDataEXT öğesindeki XrSpatialPersistenceStateEXT değerini
Çalışma zamanı, UUID'nin depolama alanında olup olmadığını belirleyemediyse UUID'yi anlık görüntüye dahil etmemelidir.
Uygulama, mevcut anlık görüntülerdeki belirli UUID'lere sahip varlıkları sorgulamak için XrSpatialComponentDataQueryConditionEXT'nin sonraki zincirinde XrSpatialDiscoveryPersistenceUuidFilterEXT'yi de kullanabilir. XrSpatialComponentDataQueryConditionEXT ile kullanıldığında, XrSpatialDiscoveryPersistenceUuidFilterEXT :: persistedUuids, XrSpatialSnapshotEXT içinde olmayan herhangi bir XrUuid içeriyorsa çalışma zamanı, sorgu sonucuna bu XrUuid için bir giriş eklememelidir. Ayrıca, sorgu sonucundaki varlıkların sırası (dizisi) XrSpatialDiscoveryPersistenceUuidFilterEXT :: persistedUuids içinde sağlanan UUID'lerin sırasıyla eşleşmeyebilir. Uygulama, XrSpatialComponentDataQueryConditionEXT :: componentTypes içinde XR_SPATIAL_COMPONENT_TYPE_PERSISTENCE_EXT ve sonraki XrSpatialComponentDataQueryResultEXT zincirinde XrSpatialComponentPersistenceListEXT öğesini içermeli, ardından mevcut sonuç dizininin hangi UUID'ye karşılık geldiğini anlamak için her sorgu sonucu dizininin XrSpatialPersistenceDataEXT :: persistUuid öğesini kontrol etmelidir.
Geçerli Kullanım (Dolaylı)
- XrSpatialDiscoveryPersistenceUuidFilterEXT kullanılmadan önce
XR_EXT_spatial_persistenceuzantısı etkinleştirilmelidir -
typeXR_TYPE_SPATIAL_DISCOVERY_PERSISTENCE_UUID_FILTER_EXTolmalıdır -
next,NULLveya yapı zincirindeki bir sonraki yapıya geçerli bir işaretçi olmalıdır. -
persistedUuids,persistedUuidCountXrUuid yapılarından oluşan bir diziye işaretçi olmalıdır. -
persistedUuidCountparametresi0değerinden büyük olmalıdır.
Kalıcı hale getirilen tüm varlıkları keşfetme
Uygulama, XrSpatialDiscoveryPersistenceUuidFilterEXT olmadan ve XrSpatialPersistenceContextEXT ile yapılandırılmış bir XrSpatialContextEXT ile xrCreateSpatialDiscoverySnapshotAsyncEXT kullanıyorsa çalışma zamanı, XrSpatialPersistenceContextEXT tarafından temsil edilen depolama alanında kalıcı olan ve XrSpatialDiscoverySnapshotCreateInfoEXT içinde sağlanan filtreleri karşılayan öğeleri oluşturulan anlık görüntüye dahil etmelidir. Bu tüzel kişiler için:
- Çalışma zamanı, bu varlığın XrSpatialPersistenceDataEXT öğesindeki XrSpatialPersistenceStateEXT değerini
XR_SPATIAL_PERSISTENCE_STATE_LOADED_EXTolarak ayarlamalıdır. - Çalışma zamanı, oluşturulan anlık görüntüde bu varlık için geçerli bir
XrSpatialEntityIdEXTiçermelidir. - Çalışma zamanı, öğeyi etkin bir şekilde izliyorsa ve bileşenleri için geçerli verilere sahipse ilgili öğenin XrSpatialEntityTrackingStateEXT değerini
XR_SPATIAL_ENTITY_TRACKING_STATE_TRACKING_EXTolarak ayarlamalıdır. Aksi takdirde çalışma zamanı, XrSpatialEntityTrackingStateEXT'yiXR_SPATIAL_ENTITY_TRACKING_STATE_PAUSED_EXTolarak ayarlamalıdır.
Yeni nesne türleri
Yeni Komutlar
- xrCreateSpatialPersistenceContextAsyncEXT
- xrCreateSpatialPersistenceContextCompleteEXT
- xrDestroySpatialPersistenceContextEXT
- xrEnumerateSpatialPersistenceScopesEXT
Yeni Yapılar
- XrCreateSpatialPersistenceContextCompletionEXT
- XrSpatialPersistenceContextCreateInfoEXT
- XrSpatialPersistenceDataEXT
XrSpatialComponentDataQueryResultEXT'yi genişletme:
XrSpatialContextCreateInfoEXT'yi genişletme:
XrSpatialDiscoverySnapshotCreateInfoEXT , XrSpatialComponentDataQueryConditionEXT'yi genişletme:
Yeni Enum Veri Türleri
Yeni Enum Sabitleri
XR_EXT_SPATIAL_PERSISTENCE_EXTENSION_NAMEXR_EXT_spatial_persistence_SPEC_VERSIONXrObjectType'i genişletme:
XR_OBJECT_TYPE_SPATIAL_PERSISTENCE_CONTEXT_EXT
XrResult'ı genişletme:
XR_ERROR_SPATIAL_PERSISTENCE_SCOPE_UNSUPPORTED_EXT
XrSpatialComponentTypeEXT'yi genişletme:
XR_SPATIAL_COMPONENT_TYPE_PERSISTENCE_EXT
XrStructureType'ı genişletme:
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
Örnek Kod
Kalıcılık bağlamı oluşturma
// 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));
Kalıcılık bağlamını uzamsal bağlama bağlama
// 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));
Kalıcı hale getirilen tüm varlıkları keşfetme
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
// ...
}
Belirli UUID'lere sahip varlıkları keşfetme
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
// ...
}
Sayılar
Sürüm Geçmişi
Revizyon 1, 29.08.2024 (Nihav Jain, Google)
- İlk uzantı açıklaması