XR_EXT_spatial_persistence
Name String
XR_EXT_spatial_persistence
Tipo di estensione
Estensione dell'istanza
Numero di interno registrato
764
Revisione
1
Stato della ratifica
Ratificato
Dipendenze di estensioni e versioni
XR_EXT_spatial_entity
e
XR_EXT_future
Collaboratori
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
Panoramica
Questa estensione consente alle applicazioni di rilevare e correlare le entità spaziali tra sessioni di applicazioni, sessioni OpenXR e più contesti spaziali OpenXR all'interno di una sessione. L'estensione XR_EXT_spatial_entity ha stabilito che un'entità all'interno di un XrSpatialContextEXT è rappresentata da un XrSpatialEntityIdEXT . Questa estensione amplia questo concetto stabilendo che un'entità, se persistente, è rappresentata da un XrUuid tra le sessioni dell'applicazione e di OpenXR, ovvero un'applicazione può utilizzare l'XrUuid fornito da questa estensione per identificare un'entità tra le sessioni. Questa estensione fornisce anche utili sovrapposizioni con l'estensione XR_EXT_spatial_entity per scoprire le entità persistenti nell'ambiente dell'utente e la possibilità di eseguire query sui dati dei relativi componenti.
Contesto di persistenza spaziale
Crea un contesto di persistenza spaziale
XR_DEFINE_HANDLE(XrSpatialPersistenceContextEXT)
L'handle XrSpatialPersistenceContextEXT rappresenta la connessione a uno spazio di archiviazione di entità spaziali persistenti.
La funzione xrCreateSpatialPersistenceContextAsyncEXT è definita come:
XrResult xrCreateSpatialPersistenceContextAsyncEXT(
XrSession session,
const XrSpatialPersistenceContextCreateInfoEXT* createInfo,
XrFutureEXT* future);
Descrizioni dei parametri
sessionè un XrSession in cui sarà attivo il contesto di persistenza spaziale.createInfoè l'oggetto XrSpatialPersistenceContextCreateInfoEXT utilizzato per specificare i parametri del contesto di persistenza spaziale.futureè un puntatore a unXrFutureEXT.
Un'applicazione può creare un handle XrSpatialPersistenceContextEXT utilizzando la funzione xrCreateSpatialPersistenceContextAsyncEXT e configurare l'ambito del contesto di persistenza in createInfo .
Il runtime deve restituire XR_ERROR_SPATIAL_PERSISTENCE_SCOPE_UNSUPPORTED_EXT se XrSpatialPersistenceContextCreateInfoEXT :: scope non è enumerato da xrEnumerateSpatialPersistenceScopesEXT .
Se un runtime applica un sistema di autorizzazioni per controllare l'accesso dell'applicazione allo spazio di archiviazione permanente rappresentato da XrSpatialPersistenceContextEXT , il runtime deve restituire XR_ERROR_PERMISSION_INSUFFICIENT se queste autorizzazioni non sono state concesse all'applicazione.
Utilizzo valido (implicito)
- L'estensione
XR_EXT_spatial_persistencedeve essere abilitata prima di chiamare xrCreateSpatialPersistenceContextAsyncEXT -
sessiondeve essere un handle XrSession valido -
createInfodeve essere un puntatore a una struttura XrSpatialPersistenceContextCreateInfoEXT valida -
futuredeve essere un puntatore a un valoreXrFutureEXT
Codici di risposta
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
La struttura XrSpatialPersistenceContextCreateInfoEXT è definita come:
typedef struct XrSpatialPersistenceContextCreateInfoEXT {
XrStructureType type;
const void* next;
XrSpatialPersistenceScopeEXT scope;
} XrSpatialPersistenceContextCreateInfoEXT;
Descrizioni dei membri
typeè l'XrStructureType di questa struttura.nextèNULLo un puntatore alla struttura successiva in una catena di strutture. Nessuna struttura di questo tipo è definita in OpenXR di base o in questa estensione.scopeè un XrSpatialPersistenceScopeEXT che definisce l'ambito di archiviazione del contesto di persistenza.
La struttura XrSpatialPersistenceContextCreateInfoEXT descrive le informazioni per creare un handle XrSpatialPersistenceContextEXT.
Utilizzo valido (implicito)
- L'estensione
XR_EXT_spatial_persistencedeve essere abilitata prima di utilizzare XrSpatialPersistenceContextCreateInfoEXT -
typedeve essereXR_TYPE_SPATIAL_PERSISTENCE_CONTEXT_CREATE_INFO_EXT -
nextdeve essereNULLo un puntatore valido alla struttura successiva in una catena di strutture -
scopedeve essere un valore XrSpatialPersistenceScopeEXT valido
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;
L'enumerazione XrSpatialPersistenceScopeEXT identifica i diversi tipi di ambiti del contesto di persistenza.
Gli enum hanno i seguenti significati:
Descrizione enum
XR_SPATIAL_PERSISTENCE_SCOPE_SYSTEM_MANAGED_EXT
Fornisce all'applicazione l'accesso di sola lettura (ovvero l'applicazione non può modificare lo store associato a questo ambito) alle entità spaziali persistenti e gestite dal sistema. L'applicazione può utilizzare l'UUID nel componente di persistenza per questo ambito per correlare le entità tra contesti spaziali e riavvii del dispositivo.
XR_SPATIAL_PERSISTENCE_SCOPE_LOCAL_ANCHORS_EXT
Le operazioni di persistenza e l'accesso ai dati sono limitati alle ancora spaziali, sullo stesso dispositivo, per lo stesso utente e la stessa app (aggiunta dall'estensione XR_EXT_spatial_persistence_operations)
XR_SPATIAL_PERSISTENCE_SCOPE_ANCHORS_FOR_CLOUD_SHARING_ANDROIDX1
Le operazioni di persistenza e l'accesso ai dati sono limitati agli ancoraggi spaziali, di proprietà e gestiti dallo stesso progetto cloud. (Aggiunto dall'estensione XR_ANDROIDX1_spatial_anchor_cloud_sharing)
La funzione xrEnumerateSpatialPersistenceScopesEXT è definita come segue:
XrResult xrEnumerateSpatialPersistenceScopesEXT(
XrInstance instance,
XrSystemId systemId,
uint32_t persistenceScopeCapacityInput,
uint32_t* persistenceScopeCountOutput,
XrSpatialPersistenceScopeEXT* persistenceScopes);
Descrizioni dei parametri
instanceè un handle per un XrInstance .systemIdè l'XrSystemIddi cui verranno enumerati gli ambiti di persistenza spaziale.persistenceScopeCapacityInputè la capacità dell'arraypersistenceScopeso 0 per indicare una richiesta di recupero della capacità richiesta.persistenceScopeCountOutputè il numero di ambiti di persistenza o la capacità richiesta nel caso in cuipersistenceScopeCapacityInputnon sia sufficiente.persistenceScopesè un array di XrSpatialPersistenceScopeEXT . Può essereNULLsepersistenceScopeCapacityInputè 0.- Consulta il capitolo Parametri delle dimensioni del buffer per una descrizione dettagliata del recupero della dimensione
persistenceScopesrichiesta.
L'applicazione può enumerare l'elenco degli ambiti di persistenza spaziale supportati da un determinato XrSystemId utilizzando xrEnumerateSpatialPersistenceScopesEXT .
Utilizzo valido (implicito)
- L'estensione
XR_EXT_spatial_persistencedeve essere abilitata prima di chiamare xrEnumerateSpatialPersistenceScopesEXT -
instancedeve essere un handle XrInstance valido -
persistenceScopeCountOutputdeve essere un puntatore a un valoreuint32_t - Se
persistenceScopeCapacityInputnon è0,persistenceScopesdeve essere un puntatore a un array di valoripersistenceScopeCapacityInputXrSpatialPersistenceScopeEXT
Codici di risposta
XR_SUCCESS
XR_ERROR_FUNCTION_UNSUPPORTEDXR_ERROR_HANDLE_INVALIDXR_ERROR_INSTANCE_LOSTXR_ERROR_RUNTIME_FAILUREXR_ERROR_SIZE_INSUFFICIENTXR_ERROR_SYSTEM_INVALIDXR_ERROR_VALIDATION_FAILURE
La funzione xrCreateSpatialPersistenceContextCompleteEXT è definita come:
XrResult xrCreateSpatialPersistenceContextCompleteEXT(
XrSession session,
XrFutureEXT future,
XrCreateSpatialPersistenceContextCompletionEXT* completion);
Descrizioni dei parametri
sessionè l'XrSession precedentemente passata a xrCreateSpatialPersistenceContextAsyncEXT ::session.futureè ilXrFutureEXTricevuto da xrCreateSpatialPersistenceContextAsyncEXT .completionè un puntatore a un XrCreateSpatialPersistenceContextCompletionEXT .
xrCreateSpatialPersistenceContextCompleteEXT completa l'operazione asincrona avviata da xrCreateSpatialPersistenceContextAsyncEXT . Il runtime deve restituire XR_ERROR_FUTURE_PENDING_EXT se future non è in stato Pronto. Il runtime deve restituire XR_ERROR_FUTURE_INVALID_EXT se future è già stato completato o annullato.
Utilizzo valido (implicito)
- L'estensione
XR_EXT_spatial_persistencedeve essere attivata prima di chiamare xrCreateSpatialPersistenceContextCompleteEXT -
sessiondeve essere un handle XrSession valido -
completiondeve essere un puntatore a una struttura XrCreateSpatialPersistenceContextCompletionEXT
Codici di risposta
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
La struttura XrCreateSpatialPersistenceContextCompletionEXT è definita come:
typedef struct XrCreateSpatialPersistenceContextCompletionEXT {
XrStructureType type;
void* next;
XrResult futureResult;
XrSpatialPersistenceContextResultEXT createResult;
XrSpatialPersistenceContextEXT persistenceContext;
} XrCreateSpatialPersistenceContextCompletionEXT;
Descrizioni dei membri
typeè l'XrStructureType di questa struttura.nextèNULLo un puntatore alla struttura successiva in una catena di strutture.futureResultè l'XrResult dell'operazione di creazione del contesto di persistenza spaziale.createResultè l'XrSpatialPersistenceContextResultEXT dell'operazione di creazione del contesto di persistenza spaziale.persistenceContextè un XrSpatialPersistenceContextEXT creato utilizzando i dati e la configurazione in xrCreateSpatialPersistenceContextAsyncEXT ::createInfo.
Codici di reso futuri
Valori 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
Se futureResult e createResult sono entrambi codici di operazione riuscita, persistenceContext deve essere valido. Se persistenceContext è valido, deve rimanere tale nel ciclo di vita di xrCreateSpatialPersistenceContextAsyncEXT :: session o finché l'applicazione non utilizza xrDestroySpatialPersistenceContextEXT con persistenceContext , a seconda di quale evento si verifica per primo.
Il runtime deve impostare createResult solo se futureResult è un codice di esito positivo.
Utilizzo valido (implicito)
- L'estensione
XR_EXT_spatial_persistencedeve essere abilitata prima di utilizzare XrCreateSpatialPersistenceContextCompletionEXT -
typedeve essereXR_TYPE_CREATE_SPATIAL_PERSISTENCE_CONTEXT_COMPLETION_EXT -
nextdeve essereNULLo un puntatore valido alla struttura successiva in una catena di strutture -
futureResultdeve essere un valore XrResult valido -
createResultdeve essere un valore XrSpatialPersistenceContextResultEXT valido -
persistenceContextdeve essere un handle XrSpatialPersistenceContextEXT valido
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;
L'enumerazione XrSpatialPersistenceContextResultEXT identifica i diversi tipi di codici di risultato per un'operazione di persistenza. Gli errori durante le operazioni di persistenza non sono sempre sotto il controllo dell'applicazione e questa enumerazione viene utilizzata per comunicare questi casi. Analogamente a XrResult , i codici di esito positivo nell'enumerazione XrSpatialPersistenceContextResultEXT sono valori non negativi, mentre i codici di errore sono valori negativi.
Gli enum hanno i seguenti significati:
Descrizione enum
XR_SPATIAL_PERSISTENCE_CONTEXT_RESULT_SUCCESS_EXT
L'operazione del contesto di persistenza è riuscita.
XR_SPATIAL_PERSISTENCE_CONTEXT_RESULT_ENTITY_NOT_TRACKING_EXT
L'operazione di persistenza non è riuscita perché l'entità non è stata monitorata dal runtime. (Aggiunto dall'estensione XR_EXT_spatial_persistence_operations)
XR_SPATIAL_PERSISTENCE_CONTEXT_RESULT_PERSIST_UUID_NOT_FOUND_EXT
L'UUID di persistenza fornito non è stato trovato nello spazio di archiviazione. (Aggiunto dall'estensione XR_EXT_spatial_persistence_operations)
XR_SPATIAL_PERSISTENCE_CONTEXT_RESULT_LOCALIZATION_FAILURE_ANDROIDX1
L'operazione di persistenza non è riuscita perché la localizzazione non è riuscita. (Aggiunto dall'estensione XR_ANDROIDX1_spatial_anchor_cloud_sharing)
XR_SPATIAL_PERSISTENCE_CONTEXT_RESULT_MAP_FEATURE_INSUFFICIENT_ANDROIDX1
L'operazione di persistenza non è riuscita perché la funzionalità della mappa di localizzazione non è sufficiente. (Aggiunto dall'estensione XR_ANDROIDX1_spatial_anchor_cloud_sharing)
XR_SPATIAL_PERSISTENCE_CONTEXT_RESULT_NETWORK_FAILURE_ANDROIDX1
L'operazione di persistenza non è riuscita perché la connessione di rete non è riuscita. (Aggiunto dall'estensione XR_ANDROIDX1_spatial_anchor_cloud_sharing)
XR_SPATIAL_PERSISTENCE_CONTEXT_RESULT_NETWORK_TIMEOUT_ANDROIDX1
L'operazione di persistenza non è riuscita a causa del timeout della rete. (Aggiunto dall'estensione XR_ANDROIDX1_spatial_anchor_cloud_sharing)
Elimina il contesto di persistenza spaziale
La funzione xrDestroySpatialPersistenceContextEXT è definita come:
XrResult xrDestroySpatialPersistenceContextEXT(
XrSpatialPersistenceContextEXT persistenceContext);
Descrizioni dei parametri
persistenceContextè un XrSpatialPersistenceContextEXT creato in precedenza da xrCreateSpatialPersistenceContextAsyncEXT .
L'applicazione può utilizzare xrDestroySpatialPersistenceContextEXT per rilasciare l'handle persistenceContext al termine delle attività di persistenza spaziale.
Il runtime non deve distruggere le risorse sottostanti per persistenceContext quando viene chiamato xrDestroySpatialPersistenceContextEXT se sono presenti handle XrSpatialContextEXT validi a cui persistenceContext è stato collegato tramite XrSpatialContextPersistenceConfigEXT . Questo perché le risorse del contesto di persistenza sono ancora utilizzate dal contesto spaziale per rilevare le entità persistenti. In questo caso, l'eliminazione dell'handle del contesto di persistenza rimuove solo l'accesso dell'applicazione a queste risorse.
Le risorse per un XrSpatialPersistenceContextEXT eliminato devono essere liberate quando vengono eliminati tutti gli handle XrSpatialContextEXT a cui era collegato il contesto di persistenza.
Utilizzo valido (implicito)
- L'estensione
XR_EXT_spatial_persistencedeve essere attivata prima di chiamare xrDestroySpatialPersistenceContextEXT -
persistenceContextdeve essere un handle XrSpatialPersistenceContextEXT valido
Thread safety
- L'accesso a
persistenceContexte a qualsiasi handle secondario deve essere sincronizzato esternamente
Codici di risposta
XR_SUCCESS
XR_ERROR_FUNCTION_UNSUPPORTEDXR_ERROR_HANDLE_INVALIDXR_ERROR_RUNTIME_FAILURE
Scopri le entità persistenti
Componente di persistenza
Le entità spaziali persistenti hanno il componente di persistenza che il runtime deve includere negli snapshot di rilevamento e aggiornamento se XR_SPATIAL_COMPONENT_TYPE_PERSISTENCE_EXT è abilitato durante la creazione di XrSpatialContextEXT e incluso in XrSpatialDiscoverySnapshotCreateInfoEXT :: componentTypes o XrSpatialUpdateSnapshotCreateInfoEXT :: componentTypes .
Dati dei componenti
La struttura XrSpatialPersistenceDataEXT è definita come:
typedef struct XrSpatialPersistenceDataEXT {
XrUuid persistUuid;
XrSpatialPersistenceStateEXT persistState;
} XrSpatialPersistenceDataEXT;
Descrizioni dei membri
persistUuidè un XrUuid .persistStateè un XrSpatialPersistenceStateEXT che rappresenta lo stato di persistenza dipersistUuid
Utilizzo valido (implicito)
- L'estensione
XR_EXT_spatial_persistencedeve essere abilitata prima di utilizzare XrSpatialPersistenceDataEXT -
persistStatedeve essere un valore XrSpatialPersistenceStateEXT valido
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;
L'enumerazione XrSpatialPersistenceStateEXT identifica i diversi stati dell'UUID persistente.
Gli enum hanno i seguenti significati:
Descrizione enum
XR_SPATIAL_PERSISTENCE_STATE_LOADED_EXT
L'UUID persistente è stato caricato correttamente dallo spazio di archiviazione.
XR_SPATIAL_PERSISTENCE_STATE_NOT_FOUND_EXT
L'UUID persistente non è stato trovato nello spazio di archiviazione ed è stato rimosso o non è mai stato presente.
Struttura dell'elenco dei componenti per eseguire query sui dati
La struttura XrSpatialComponentPersistenceListEXT è definita come:
typedef struct XrSpatialComponentPersistenceListEXT {
XrStructureType type;
void* next;
uint32_t persistDataCount;
XrSpatialPersistenceDataEXT* persistData;
} XrSpatialComponentPersistenceListEXT;
Descrizioni dei membri
typeè l'XrStructureType di questa struttura.nextèNULLo un puntatore alla struttura successiva in una catena di strutture. Nessuna struttura di questo tipo è definita in OpenXR di base o in questa estensione.persistDataCountè unuint32_tche descrive il conteggio degli elementi nell'arraypersistData.persistDataè un array di XrSpatialPersistenceDataEXT .
Il runtime deve restituire XR_ERROR_VALIDATION_FAILURE da xrQuerySpatialComponentDataEXT se XrSpatialComponentPersistenceListEXT si trova nella catena successiva di XrSpatialComponentDataQueryResultEXT :: next, ma XR_SPATIAL_COMPONENT_TYPE_PERSISTENCE_EXT non è incluso in XrSpatialComponentDataQueryConditionEXT :: componentTypes .
Il runtime deve restituire XR_ERROR_SIZE_INSUFFICIENT da xrQuerySpatialComponentDataEXT se persistDataCount è inferiore a XrSpatialComponentDataQueryResultEXT :: entityIdCountOutput .
A differenza degli altri componenti, il runtime deve impostare i dati per XR_SPATIAL_COMPONENT_TYPE_PERSISTENCE_EXT indipendentemente da XrSpatialEntityTrackingStateEXT .
Utilizzo valido (implicito)
- L'estensione
XR_EXT_spatial_persistencedeve essere attivata prima di utilizzare XrSpatialComponentPersistenceListEXT -
typedeve essereXR_TYPE_SPATIAL_COMPONENT_PERSISTENCE_LIST_EXT -
nextdeve essereNULLo un puntatore valido alla struttura successiva in una catena di strutture -
persistDatadeve essere un puntatore a un array dipersistDataCountstrutture XrSpatialPersistenceDataEXT - Il parametro
persistDataCountdeve essere maggiore di0
Configurazione
Se XR_SPATIAL_COMPONENT_TYPE_PERSISTENCE_EXT è enumerato in XrSpatialCapabilityComponentTypesEXT :: componentTypes per una funzionalità, l'applicazione può attivarla includendo l'enum nell'elenco XrSpatialCapabilityConfigurationBaseHeaderEXT :: enabledComponents. Questo componente non richiede alcuna configurazione speciale per essere incluso nella catena successiva di XrSpatialCapabilityConfigurationBaseHeaderEXT . Se l'applicazione include XR_SPATIAL_COMPONENT_TYPE_PERSISTENCE_EXT nell'elenco dei componenti abilitati, deve includere anche XrSpatialContextPersistenceConfigEXT nella catena successiva di XrSpatialContextCreateInfoEXT, altrimenti il runtime deve restituire XR_ERROR_SPATIAL_CAPABILITY_CONFIGURATION_INVALID_EXT da xrCreateSpatialContextAsyncEXT .
Configura il contesto spaziale con i contesti di persistenza
La struttura XrSpatialContextPersistenceConfigEXT è definita come:
typedef struct XrSpatialContextPersistenceConfigEXT {
XrStructureType type;
const void* next;
uint32_t persistenceContextCount;
const XrSpatialPersistenceContextEXT* persistenceContexts;
} XrSpatialContextPersistenceConfigEXT;
Descrizioni dei membri
typeè l'XrStructureType di questa struttura.nextèNULLo un puntatore alla struttura successiva in una catena di strutture. Nessuna struttura di questo tipo è definita in OpenXR di base o in questa estensione.persistenceContextCountè unuint32_tche descrive il conteggio degli elementi nell'arraypersistenceContexts.persistenceContextsè un array di XrSpatialPersistenceContextEXT .
Un'applicazione può aggiungere XrSpatialContextPersistenceConfigEXT alla catena successiva di XrSpatialContextCreateInfoEXT . In questo modo, l'oggetto XrSpatialContextEXT creato verrà configurato con persistenceContexts e l'applicazione potrà rilevare le entità spaziali persistenti nello spazio di archiviazione rappresentato dagli handle XrSpatialPersistenceContextEXT in persistenceContexts .
Utilizzo valido (implicito)
- L'estensione
XR_EXT_spatial_persistencedeve essere abilitata prima di utilizzare XrSpatialContextPersistenceConfigEXT -
typedeve essereXR_TYPE_SPATIAL_CONTEXT_PERSISTENCE_CONFIG_EXT -
nextdeve essereNULLo un puntatore valido alla struttura successiva in una catena di strutture -
persistenceContextsdeve essere un puntatore a un array dipersistenceContextCounthandle XrSpatialPersistenceContextEXT validi - Il parametro
persistenceContextCountdeve essere maggiore di0
Crea snapshot di rilevamento
Scopri le entità con UUID specifici
La struttura XrSpatialDiscoveryPersistenceUuidFilterEXT è definita come:
typedef struct XrSpatialDiscoveryPersistenceUuidFilterEXT {
XrStructureType type;
const void* next;
uint32_t persistedUuidCount;
const XrUuid* persistedUuids;
} XrSpatialDiscoveryPersistenceUuidFilterEXT;
Descrizioni dei membri
typeè l'XrStructureType di questa struttura.nextèNULLo un puntatore alla struttura successiva in una catena di strutture. Nessuna struttura di questo tipo è definita in OpenXR di base o in questa estensione.persistedUuidCountè unuint32_tche descrive il conteggio degli elementi nell'arraypersistedUuidspersistedUuidsè un array di XrUuid .
L'applicazione può utilizzare XrSpatialDiscoveryPersistenceUuidFilterEXT nella catena successiva di XrSpatialDiscoverySnapshotCreateInfoEXT per limitare l'operazione di rilevamento solo alle entità i cui UUID persistenti si trovano nell'insieme di UUID forniti in persistedUuids .
Se l'applicazione aggiunge XrSpatialDiscoveryPersistenceUuidFilterEXT nella catena successiva di XrSpatialDiscoverySnapshotCreateInfoEXT, ma xrCreateSpatialDiscoverySnapshotAsyncEXT :: spatialContext non è stato configurato con alcun XrSpatialPersistenceContextEXT utilizzando XrSpatialContextPersistenceConfigEXT, il runtime deve restituire XR_ERROR_VALIDATION_FAILURE da xrCreateSpatialDiscoverySnapshotAsyncEXT .
Il runtime deve trattare il filtro XrSpatialDiscoveryPersistenceUuidFilterEXT come una condizione "AND" con qualsiasi altro filtro fornito in XrSpatialDiscoverySnapshotCreateInfoEXT o nella catena successiva. Il runtime deve trattare l'array persistedUuids stesso come una condizione "OR", ovvero filtrare le entità che hanno uno degli UUID forniti nell'array.
Il runtime deve includere una voce nello snapshot creato per ciascuno degli UUID in persistedUuids per i quali è stato in grado di determinare lo stato XrSpatialPersistenceStateEXT in questo momento.
Se il runtime ha trovato l'UUID nello spazio di archiviazione:
- Il runtime deve impostare XrSpatialPersistenceStateEXT in XrSpatialPersistenceDataEXT di questa entità su
XR_SPATIAL_PERSISTENCE_STATE_LOADED_EXT. - Il runtime deve includere un
XrSpatialEntityIdEXTvalido per questa entità nello snapshot creato. - Il runtime deve impostare XrSpatialEntityTrackingStateEXT di quell'entità su
XR_SPATIAL_ENTITY_TRACKING_STATE_TRACKING_EXTse sta monitorando attivamente l'entità e dispone di dati validi per i suoi componenti. In caso contrario, il runtime deve impostare XrSpatialEntityTrackingStateEXT suXR_SPATIAL_ENTITY_TRACKING_STATE_PAUSED_EXT.
- Il runtime deve impostare XrSpatialPersistenceStateEXT in XrSpatialPersistenceDataEXT di questa entità su
Se il runtime ha stabilito che l'UUID non è presente nel suo spazio di archiviazione (indipendentemente dal fatto che l'UUID non sia mai stato presente nello spazio di archiviazione o che sia stato presente una volta, ma non sia più persistente), allora:
- Il runtime deve impostare XrSpatialPersistenceStateEXT in XrSpatialPersistenceDataEXT di questa entità su
XR_SPATIAL_PERSISTENCE_STATE_NOT_FOUND_EXTper indicare all'applicazione che questo UUID non è più presente nello spazio di archiviazione. - Il runtime deve impostare
XrSpatialEntityIdEXTper questa entità nello snapshot creato su XR_NULL_SPATIAL_ENTITY_ID_EXT . - Il runtime deve impostare XrSpatialEntityTrackingStateEXT di quell'entità su
XR_SPATIAL_ENTITY_TRACKING_STATE_STOPPED_EXTper indicare all'applicazione che l'entità non verrà mai monitorata.
- Il runtime deve impostare XrSpatialPersistenceStateEXT in XrSpatialPersistenceDataEXT di questa entità su
Se il runtime non è stato in grado di determinare se l'UUID è presente o meno nel suo spazio di archiviazione, non deve includerlo nello snapshot.
L'applicazione può anche utilizzare XrSpatialDiscoveryPersistenceUuidFilterEXT nella catena successiva di XrSpatialComponentDataQueryConditionEXT per eseguire query su entità di UUID specifici negli snapshot esistenti. Se utilizzato con XrSpatialComponentDataQueryConditionEXT , se XrSpatialDiscoveryPersistenceUuidFilterEXT :: persistedUuids contiene un XrUuid che non è presente in XrSpatialSnapshotEXT , il runtime non deve includere una voce per quell'XrUuid nel risultato della query. Inoltre, l'ordine (sequenza) delle entità nel risultato della query potrebbe non corrispondere all'ordine degli UUID forniti in XrSpatialDiscoveryPersistenceUuidFilterEXT :: persistedUuids . L'applicazione deve includere XR_SPATIAL_COMPONENT_TYPE_PERSISTENCE_EXT in XrSpatialComponentDataQueryConditionEXT :: componentTypes e XrSpatialComponentPersistenceListEXT nella catena successiva di XrSpatialComponentDataQueryResultEXT, quindi controllare XrSpatialPersistenceDataEXT :: persistUuid di ogni indice dei risultati della query per capire a quale UUID corrisponde l'indice dei risultati corrente.
Utilizzo valido (implicito)
- L'estensione
XR_EXT_spatial_persistencedeve essere attivata prima di utilizzare XrSpatialDiscoveryPersistenceUuidFilterEXT -
typedeve essereXR_TYPE_SPATIAL_DISCOVERY_PERSISTENCE_UUID_FILTER_EXT -
nextdeve essereNULLo un puntatore valido alla struttura successiva in una catena di strutture -
persistedUuidsdeve essere un puntatore a un array di strutturepersistedUuidCountXrUuid - Il parametro
persistedUuidCountdeve essere maggiore di0
Scopri tutte le entità persistenti
Se l'applicazione utilizza xrCreateSpatialDiscoverySnapshotAsyncEXT senza XrSpatialDiscoveryPersistenceUuidFilterEXT e con un XrSpatialContextEXT configurato con un XrSpatialPersistenceContextEXT , il runtime deve includere nello snapshot creato le entità persistenti nello spazio di archiviazione rappresentato da XrSpatialPersistenceContextEXT e soddisfare i filtri forniti in XrSpatialDiscoverySnapshotCreateInfoEXT . Per queste entità:
- Il runtime deve impostare XrSpatialPersistenceStateEXT in XrSpatialPersistenceDataEXT di questa entità su
XR_SPATIAL_PERSISTENCE_STATE_LOADED_EXT. - Il runtime deve includere un
XrSpatialEntityIdEXTvalido per questa entità nello snapshot creato. - Il runtime deve impostare XrSpatialEntityTrackingStateEXT di quell'entità su
XR_SPATIAL_ENTITY_TRACKING_STATE_TRACKING_EXTse sta monitorando attivamente l'entità e dispone di dati validi per i suoi componenti. In caso contrario, il runtime deve impostare XrSpatialEntityTrackingStateEXT suXR_SPATIAL_ENTITY_TRACKING_STATE_PAUSED_EXT.
Nuovi tipi di oggetti
Nuovi comandi
- xrCreateSpatialPersistenceContextAsyncEXT
- xrCreateSpatialPersistenceContextCompleteEXT
- xrDestroySpatialPersistenceContextEXT
- xrEnumerateSpatialPersistenceScopesEXT
Nuove strutture
- XrCreateSpatialPersistenceContextCompletionEXT
- XrSpatialPersistenceContextCreateInfoEXT
- XrSpatialPersistenceDataEXT
Estensione di XrSpatialComponentDataQueryResultEXT :
Estensione di XrSpatialContextCreateInfoEXT :
Estensione di XrSpatialDiscoverySnapshotCreateInfoEXT , XrSpatialComponentDataQueryConditionEXT :
Nuovi enum
Nuove costanti enum
XR_EXT_SPATIAL_PERSISTENCE_EXTENSION_NAMEXR_EXT_spatial_persistence_SPEC_VERSIONEstensione di XrObjectType :
XR_OBJECT_TYPE_SPATIAL_PERSISTENCE_CONTEXT_EXT
Estensione di XrResult :
XR_ERROR_SPATIAL_PERSISTENCE_SCOPE_UNSUPPORTED_EXT
Estensione di XrSpatialComponentTypeEXT :
XR_SPATIAL_COMPONENT_TYPE_PERSISTENCE_EXT
Estensione di 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
Esempio di codice
Crea contesto di persistenza
// 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));
Collega il contesto di persistenza a un contesto spaziale
// 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));
Scopri tutte le entità persistenti
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
// ...
}
Scopri le entità con UUID specifici
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
// ...
}
Problemi
Cronologia delle versioni
Revisione 1, 29/08/2024 (Nihav Jain, Google)
- Descrizione iniziale dell'estensione