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, bir XrFutureEXT iş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ı)

Dönüş Kodları

Başarılı

  • XR_SUCCESS
  • XR_SESSION_LOSS_PENDING

Hata

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

XrSpatialPersistenceContextCreateInfoEXT 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, NULL veya 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ı)

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ılacak XrSystemId değeridir.
  • persistenceScopeCapacityInput, persistenceScopes dizisinin kapasitesidir veya gerekli kapasiteyi alma isteğini belirtmek için 0'dır.
  • persistenceScopeCountOutput, kalıcılık kapsamlarının sayısı veya persistenceScopeCapacityInput yetersiz olduğunda gereken kapasitedir.
  • persistenceScopes, XrSpatialPersistenceScopeEXT dizisidir. persistenceScopeCapacityInput 0 ise NULL olabilir.
  • Gerekli persistenceScopes boyutunu 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_persistence uzantısı, xrEnumerateSpatialPersistenceScopesEXT çağrılmadan önce etkinleştirilmelidir.
  • instance geçerli bir XrInstance herkese açık kullanıcı adı olmalıdır
  • persistenceScopeCountOutput, bir uint32_t değerine işaretçi olmalıdır
  • persistenceScopeCapacityInput, 0 değilse persistenceScopes, persistenceScopeCapacityInput XrSpatialPersistenceScopeEXT değerlerinden oluşan bir diziye işaretçi olmalıdır.

Dönüş Kodları

Başarılı

  • XR_SUCCESS

Hata

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

xrCreateSpatialPersistenceContextCompleteEXT işlevi şu şekilde tanımlanır:

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

Parametre Açıklamaları

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ı)

Dönüş Kodları

Başarılı

  • XR_SUCCESS
  • XR_SESSION_LOSS_PENDING

Hata

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

XrCreateSpatialPersistenceContextCompletionEXT yapısı şu şekilde tanımlanır:

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

Üye Açıklamaları

Gelecekteki İade Kodları

futureResult değer:

Başarılı

  • XR_SUCCESS
  • XR_SESSION_LOSS_PENDING

Hata

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

futureResult 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ı)

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ı

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ı)

İleti Dizisi Güvenliği

  • persistenceContext ve tüm alt herkese açık kullanıcı adlarına erişim harici olarak senkronize edilmelidir.

Dönüş Kodları

Başarılı

  • XR_SUCCESS

Hata

  • XR_ERROR_FUNCTION_UNSUPPORTED
  • XR_ERROR_HANDLE_INVALID
  • XR_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ı

Geçerli Kullanım (Dolaylı)

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, NULL veya 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, persistData dizisindeki öğe sayısını açıklayan bir uint32_t değ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ı)

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, NULL veya 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, persistenceContexts dizisindeki öğe sayısını açıklayan bir uint32_t değ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ı)

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, NULL veya 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, persistedUuids dizisindeki öğe sayısını açıklayan bir uint32_t değ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_EXT olarak ayarlamalıdır.
    • Çalışma zamanı, oluşturulan anlık görüntüde bu varlık için geçerli bir XrSpatialEntityIdEXT iç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_EXT olarak ayarlamalıdır. Aksi takdirde çalışma zamanı, XrSpatialEntityTrackingStateEXT'yi XR_SPATIAL_ENTITY_TRACKING_STATE_PAUSED_EXT olarak ayarlamalıdır.
  • Ç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_EXT olarak 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 XrSpatialEntityIdEXT değ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_EXT olarak ayarlamalıdır.
  • Ç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_persistence uzantısı etkinleştirilmelidir
  • type XR_TYPE_SPATIAL_DISCOVERY_PERSISTENCE_UUID_FILTER_EXT olmalıdır
  • next, NULL veya yapı zincirindeki bir sonraki yapıya geçerli bir işaretçi olmalıdır.
  • persistedUuids, persistedUuidCount XrUuid yapılarından oluşan bir diziye işaretçi olmalıdır.
  • persistedUuidCount parametresi 0 değ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_EXT olarak ayarlamalıdır.
  • Çalışma zamanı, oluşturulan anlık görüntüde bu varlık için geçerli bir XrSpatialEntityIdEXT iç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_EXT olarak ayarlamalıdır. Aksi takdirde çalışma zamanı, XrSpatialEntityTrackingStateEXT'yi XR_SPATIAL_ENTITY_TRACKING_STATE_PAUSED_EXT olarak ayarlamalıdır.

Yeni nesne türleri

Yeni Komutlar

Yeni Yapılar

Yeni Enum Veri Türleri

Yeni Enum Sabitleri

  • XR_EXT_SPATIAL_PERSISTENCE_EXTENSION_NAME
  • XR_EXT_spatial_persistence_SPEC_VERSION
  • XrObjectType'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_EXT
    • XR_TYPE_SPATIAL_COMPONENT_PERSISTENCE_LIST_EXT
    • XR_TYPE_SPATIAL_CONTEXT_PERSISTENCE_CONFIG_EXT
    • XR_TYPE_SPATIAL_DISCOVERY_PERSISTENCE_UUID_FILTER_EXT
    • XR_TYPE_SPATIAL_PERSISTENCE_CONTEXT_CREATE_INFO_EXT

Ö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ı