XR_EXT_spatial_container
Name String
XR_EXT_spatial_container
Type d'extension
Extension d'instance
Numéro d'extension enregistré
811
Révision
1
État de la ratification
Non ratifié
Dépendances d'extension et de version
Date de dernière modification
2026-08-06
État de l'adresse IP
Aucune réclamation de propriété intellectuelle connue.
Participants
Jared Finder, Google
Andreas Loeve Selvik, Meta Platforms
Lachlan Ford, Google
Cass Everitt, Meta Platforms
Adam Gousetis, Meta Platforms
Ankur Agrawal, Unity Technologies
Bjorn Swenson, LÖVR
Denny Rönngren, Varjo Technologies
Fredia Huya-Kouadio, Godot Engine
Guodong Rong, Meta Platforms
Jakob Bornecrantz, NVIDIA
Jian Zhang, ByteDance
John Kearney, Meta Platforms
Jonathan Wright, Meta Platforms
Junfeng She, ByteDance
Kenny Vercaemer, Google
Kurtis Eveleigh, Qualcomm
Mauricio Narvaez, Meta Platforms
Nathan Nuber, Valve Corporation
Nihav Jain, Google
Nikita Lutsenko, Meta Platforms
Praveen Babu J D, ByteDance
Rylie Pavlik, Collabora
Salar Khan, Google
Shuai Liu, ByteDance
Walter Luh, Meta Platforms
Yin Li, Microsoft
Zhipeng Liu, ByteDance
Présentation
Cette extension définit une nouvelle classe d'entités affichables, appelées "conteneurs spatiaux", qui sont analogues au concept de "fenêtres" dans les systèmes de fenêtrage 2D pour ordinateur.
Dans OpenXR 1.x, les applications ont un contrôle exclusif sur tout ce que l'utilisateur voit et sur la façon dont cela est superposé à l'environnement réel ou virtuel de l'utilisateur. Les environnements d'exécution n'apportent que de légères modifications à ce qui est affiché pour garantir la sécurité des utilisateurs. Ce modèle d'application est idéal pour plonger un utilisateur dans une expérience unique, mais il ne s'étend pas à plusieurs expériences simultanées. En particulier, dans les environnements de RA et de réalité mixte, les utilisateurs souhaitent souvent utiliser plusieurs applications différentes en même temps.
Les conteneurs spatiaux sont comme des fenêtres étendues à la 3D. L'utilisateur peut voir plusieurs conteneurs spatiaux simultanément et fournit des entrées à un sous-ensemble d'entre eux. Les conteneurs spatiaux visibles peuvent appartenir à différentes applications, et les environnements d'exécution gèrent leur taille et leur emplacement pour le compte de l'utilisateur.
Cette extension est compatible avec ces nouveaux types d'expériences spatialement limitées, en plus des expériences OpenXR immersives existantes. Les expériences OpenXR limitées peuvent comporter du contenu légèrement en 3D (panneaux plats avec de légers décalages de profondeur) ou des volumes hébergeant du contenu entièrement en 3D. Les expériences OpenXR immersives sont les applications immersives en plein écran existantes qui sont compatibles depuis OpenXR 1.0. Les applications peuvent basculer entre les deux types de contenus si elles le souhaitent.
Cette extension ne définit aucune méthode permettant à une application d'afficher son contenu. La façon de dessiner le contenu est définie dans d'autres extensions : XR_EXT_spatial_container_self_rendering .
Utiliser des conteneurs spatiaux
Un XrSpatialContainerEXT est un handle qui représente un conteneur spatial.
XR_DEFINE_HANDLE(XrSpatialContainerEXT)
Une application commence à s'afficher via un conteneur spatial en procédant comme suit :
- Créez un conteneur spatial avec xrCreateSpatialContainerEXT .
- Modifiez n'importe quel état du conteneur pour la présentation initiale, comme son mode de limites.
- Demandez à l'environnement d'exécution d'afficher le conteneur avec xrRequestSpatialContainerVisibleEXT .
- Attendez que l'environnement d'exécution soit prêt à afficher le conteneur. Lorsque l'environnement d'exécution est prêt, il met en file d'attente un événement XrEventDataSpatialContainerVisibleChangedEXT avec
visibledéfini surXR_TRUE. - Commencez l'affichage du conteneur spatial.
Pour supprimer un conteneur spatial :
- Demandez à l'environnement d'exécution de masquer le conteneur avec xrRequestSpatialContainerVisibleEXT .
- Attendez que l'environnement d'exécution ait fini de masquer le conteneur. Lorsque l'environnement d'exécution a complètement masqué le conteneur, il met en file d'attente un événement XrEventDataSpatialContainerVisibleChangedEXT avec
visibledéfini surXR_FALSE. - Terminez l'affichage du conteneur spatial.
- Détruisez le conteneur avec xrDestroySpatialContainerEXT .
Remarque
Par défaut, cette extension délègue la gestion de la visibilité et de la sélection à des conteneurs spatiaux individuels. Étant donné que la session dans son ensemble ne représente plus un seul objet visible ou sélectionné, elle ne passe pas par la machine d'état OpenXR standard (READY, SYNCHRONIZED, VISIBLE, FOCUSED). Au lieu de cela, la session reste dans l'état XR_SESSION_STATE_IDLE pendant sa durée de vie active, et les règles de la section Modifications de l'état de la session spécifient comment les opérations OpenXR de base sont mappées à ce mode.
Créer un conteneur spatial
La fonction xrCreateSpatialContainerEXT crée un conteneur spatial.
XrResult xrCreateSpatialContainerEXT(
XrSession session,
const XrSpatialContainerCreateInfoEXT* createInfo,
XrSpatialContainerEXT* spatialContainer);
Description des paramètres
sessionest l'XrSession qui crée le conteneur spatial.createInfoest un pointeur vers un XrSpatialContainerCreateInfoEXT contenant les paramètres permettant de créer le conteneur spatial.spatialContainerest un pointeur vers un handle dans lequel l'élément XrSpatialContainerEXT créé est renvoyé.
Un XrSpatialContainerEXT nouvellement créé doit être non visible, non interactif et en mode de limites XR_SPATIAL_CONTAINER_BOUNDS_MODE_BOUNDED_EXT . Une application qui souhaite qu'un conteneur spatial démarre en mode immersif peut demander un mode de limites XR_SPATIAL_CONTAINER_BOUNDS_MODE_IMMERSIVE_EXT avant de demander l'affichage d'un conteneur spatial.
Les environnements d'exécution doivent renvoyer XR_ERROR_VALIDATION_FAILURE si une dimension de XrSpatialContainerCreateInfoEXT :: suggestedBounds est négative, infinie ou n'est pas un nombre. Les environnements d'exécution doivent renvoyer XR_ERROR_LIMIT_REACHED si une application tente de créer plus de conteneurs spatiaux que ce qui est spécifié dans XrSystemSpatialContainerPropertiesEXT :: maxSpatialContainerCount . Si les conteneurs spatiaux n'ont pas été activés pour cette session , les environnements d'exécution doivent renvoyer XR_ERROR_SPATIAL_CONTAINERS_NOT_ENABLED_EXT .
Utilisation valide (implicite)
- L'extension
XR_EXT_spatial_containerdoit être activée avant d'appeler xrCreateSpatialContainerEXT. -
sessiondoit être un handle XrSession valide -
createInfodoit être un pointeur vers une structure XrSpatialContainerCreateInfoEXT valide -
spatialContainerdoit être un pointeur vers un handle XrSpatialContainerEXT.
Codes renvoyés
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_CONTAINERS_NOT_ENABLED_EXTXR_ERROR_VALIDATION_FAILURE
XrSpatialContainerCreateInfoEXT est transmis à xrCreateSpatialContainerEXT pour créer un conteneur spatial.
typedef struct XrSpatialContainerCreateInfoEXT {
XrStructureType type;
const void* next;
XrSpatialContainerGraphicsPresentationEXT graphicsPresentation;
XrExtent3Df suggestedBounds;
} XrSpatialContainerCreateInfoEXT;
Description du membre
typeest le XrStructureType de cette structure.nextestNULLou un pointeur vers la structure suivante dans une chaîne de structures. Aucune structure de ce type n'est définie dans OpenXR de base ou dans cette extension.graphicsPresentationest un XrSpatialContainerGraphicsPresentationEXT qui décrit comment ce conteneur spatial présente les graphismes.suggestedBoundsest un XrExtent3Df qui décrit les dimensions demandées du conteneur spatial en mètres.
Une application qui n'a pas de préférence pour sa taille peut définir suggestedBounds sur {0, 0, 0}. Un environnement d'exécution peut ignorer le suggestedBounds demandé.
Un environnement d'exécution qui permet de délimiter les conteneurs spatiaux par des formes autres que des boîtes orientées doit utiliser suggestedBounds comme cadre de délimitation autour des autres formes. Les cadres orientés sont destinés à être la forme de délimitation la plus courante.
Utilisation valide (implicite)
- L'extension
XR_EXT_spatial_containerdoit être activée avant d'utiliser XrSpatialContainerCreateInfoEXT. -
typedoit êtreXR_TYPE_SPATIAL_CONTAINER_CREATE_INFO_EXT -
nextdoit êtreNULLou un pointeur valide vers la structure suivante dans une chaîne de structures -
graphicsPresentationdoit être une valeur XrSpatialContainerGraphicsPresentationEXT valide
Lorsqu'un conteneur spatial n'est plus utilisable, les environnements d'exécution doivent mettre en file d'attente un événement XrEventDataSpatialContainerClosedEXT.
typedef struct XrEventDataSpatialContainerClosedEXT {
XrStructureType type;
const void* next;
XrSpatialContainerEXT spatialContainer;
} XrEventDataSpatialContainerClosedEXT;
Description du membre
typeest le XrStructureType de cette structure.nextestNULLou un pointeur vers la structure suivante dans une chaîne de structures. Aucune structure de ce type n'est définie dans OpenXR de base ou dans cette extension.spatialContainerest le XrSpatialContainerEXT auquel cet événement est destiné.
La réception de l'événement XrEventDataSpatialContainerClosedEXT indique que l'environnement d'exécution ne peut plus afficher de conteneur spatial, par exemple parce que l'utilisateur a cliqué sur un bouton "Fermer" ou que la session est passée à l'état XR_SESSION_STATE_LOSS_PENDING.
Après avoir reçu l'événement XrEventDataSpatialContainerClosedEXT, une application doit cesser d'utiliser ce conteneur spatial, supprimer tout état associé tel qu'une boucle de rendu et détruire le conteneur. Les environnements d'exécution doivent renvoyer XR_ERROR_SPATIAL_CONTAINER_CLOSED_EXT pour toutes les fonctions opérant sur ce conteneur, à l'exception de xrDestroySpatialContainerEXT .
Si un conteneur spatial est visible lorsque l'environnement d'exécution met en file d'attente un événement de fermeture, les environnements d'exécution doivent d'abord rendre le conteneur invisible et mettre en file d'attente un événement XrEventDataSpatialContainerVisibleChangedEXT.
Utilisation valide (implicite)
- L'extension
XR_EXT_spatial_containerdoit être activée avant d'utiliser XrEventDataSpatialContainerClosedEXT. -
typedoit êtreXR_TYPE_EVENT_DATA_SPATIAL_CONTAINER_CLOSED_EXT -
nextdoit êtreNULLou un pointeur valide vers la structure suivante dans une chaîne de structures
La fonction xrDestroySpatialContainerEXT détruit un conteneur spatial existant.
XrResult xrDestroySpatialContainerEXT(
XrSpatialContainerEXT spatialContainer);
Description des paramètres
spatialContainerest un XrSpatialContainerEXT précédemment créé par xrCreateSpatialContainerEXT .
Une fois qu'un conteneur spatial est détruit, les environnements d'exécution ne doivent plus afficher le contenu du conteneur et ne doivent pas mettre en file d'attente d'autres événements concernant le conteneur.
Une application ne doit pas détruire un conteneur spatial visible, car cela peut entraîner des artefacts graphiques. À la place, une application doit demander à masquer le conteneur spatial avec xrRequestSpatialContainerVisibleEXT, attendre un événement XrEventDataSpatialContainerVisibleChangedEXT, puis détruire le conteneur.
Utilisation valide (implicite)
- L'extension
XR_EXT_spatial_containerdoit être activée avant d'appeler xrDestroySpatialContainerEXT. -
spatialContainerdoit être un handle XrSpatialContainerEXT valide
Thread safety
- L'accès à
spatialContaineret à tous les handles enfants doit être synchronisé en externe.
Codes renvoyés
XR_SUCCESS
XR_ERROR_FUNCTION_UNSUPPORTEDXR_ERROR_HANDLE_INVALIDXR_ERROR_RUNTIME_FAILURE
Espace du conteneur spatial
La fonction xrCreateSpatialContainerSpaceEXT crée un handle XrSpace pour l'espace de conteneur spatial d'un conteneur spatial spécifique.
XrResult xrCreateSpatialContainerSpaceEXT(
XrSession session,
const XrSpatialContainerSpaceCreateInfoEXT* createInfo,
XrSpace* space);
Description des paramètres
sessionest l'XrSession qui crée l'espace.createInfoest un pointeur vers un XrSpatialContainerSpaceCreateInfoEXT contenant les paramètres permettant de créer l'espace.spaceest un pointeur vers un handle dans lequel l'XrSpace créé est renvoyé.
L'espace du conteneur spatial pour un conteneur spatial donné est un système de coordonnées dont l'origine se trouve au centre des limites de ce conteneur spatial. Cet espace est généralement utilisé comme espace de base pour des fonctions telles que xrLocateSpace .
+X pointe vers la face droite du conteneur, +Y pointe vers la face supérieure du conteneur et +Z pointe vers la face avant du conteneur. Par exemple, si un conteneur est aligné sur la gravité, devant l'utilisateur, et que l'utilisateur se trouve dans la pose d'identité par rapport à l'espace LOCAL , les environnements d'exécution doivent orienter l'espace du conteneur avec l'orientation d'identité par rapport à l'espace LOCAL . Les environnements d'exécution peuvent définir la position d'un espace de conteneur par rapport à l'espace LOCAL sur n'importe quelle position arbitraire lorsque ce conteneur devient visible.
ext spatial container space convention
Figure 18. Convention des axes de l'espace du conteneur spatial
L'espace du conteneur spatial est une origine non verrouillée dans le monde. Les applications qui souhaitent une origine verrouillée sur le monde en mode immersif peuvent utiliser un espace verrouillé sur le monde tel que XR_REFERENCE_SPACE_TYPE_LOCAL .
Les environnements d'exécution peuvent modifier la pose d'un espace de conteneur spatial à tout moment, généralement pour permettre à un utilisateur de déplacer un conteneur spatial vers une autre position ou rotation. Les environnements d'exécution peuvent également modifier la pose lors de la transition entre les modes de limites XR_SPATIAL_CONTAINER_BOUNDS_MODE_BOUNDED_EXT et XR_SPATIAL_CONTAINER_BOUNDS_MODE_IMMERSIVE_EXT.
Un espace de conteneur spatial doit continuer à être un handle valide même si le conteneur spatial auquel il est destiné est détruit avec xrDestroySpatialContainerEXT . Lorsqu'un conteneur spatial n'est pas visible ou est détruit, l'espace du conteneur spatial doit être introuvable par rapport aux autres espaces. XrSpaceLocation :: locationFlags et XrViewState ::viewStateFlags seront définis sur 0.
Utilisation valide (implicite)
- L'extension
XR_EXT_spatial_containerdoit être activée avant d'appeler xrCreateSpatialContainerSpaceEXT. -
sessiondoit être un handle XrSession valide -
createInfodoit être un pointeur vers une structure XrSpatialContainerSpaceCreateInfoEXT valide -
spacedoit être un pointeur vers un handle XrSpace
Codes renvoyés
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_CONTAINER_CLOSED_EXTXR_ERROR_VALIDATION_FAILURE
XrSpatialContainerSpaceCreateInfoEXT est utilisé avec xrCreateSpatialContainerSpaceEXT pour créer un handle XrSpace.
typedef struct XrSpatialContainerSpaceCreateInfoEXT {
XrStructureType type;
const void* next;
XrSpatialContainerEXT spatialContainer;
} XrSpatialContainerSpaceCreateInfoEXT;
Description du membre
typeest le XrStructureType de cette structure.nextestNULLou un pointeur vers la structure suivante dans une chaîne de structures. Aucune structure de ce type n'est définie dans OpenXR de base ou dans cette extension.spatialContainerest un XrSpatialContainerEXT pour lequel créer un espace.
Utilisation valide (implicite)
- L'extension
XR_EXT_spatial_containerdoit être activée avant d'utiliser XrSpatialContainerSpaceCreateInfoEXT. -
typedoit êtreXR_TYPE_SPATIAL_CONTAINER_SPACE_CREATE_INFO_EXT -
nextdoit êtreNULLou un pointeur valide vers la structure suivante dans une chaîne de structures -
spatialContainerdoit être un handle XrSpatialContainerEXT valide
Présenter un conteneur spatial
L'envoi du contenu d'un conteneur spatial à OpenXR pour affichage est géré par d'autres extensions : XR_EXT_spatial_container_self_rendering .
Pour permettre à d'autres extensions de spécifier la méthode de présentation graphique d'un conteneur spatial, cette extension définit l'énumération XrSpatialContainerGraphicsPresentationEXT.
typedef enum XrSpatialContainerGraphicsPresentationEXT {
XR_SPATIAL_CONTAINER_GRAPHICS_PRESENTATION_SELF_RENDERING_EXT = 1000813000,
XR_SPATIAL_CONTAINER_GRAPHICS_PRESENTATION_CONFORMANCE_AUTOMATION_EXT = 1000814000,
XR_SPATIAL_CONTAINER_GRAPHICS_PRESENTATION_SYSTEM_RENDERING_EXTX1 = 1000815000,
XR_SPATIAL_CONTAINER_GRAPHICS_PRESENTATION_MAX_ENUM_EXT = 0x7FFFFFFF
} XrSpatialContainerGraphicsPresentationEXT;
Description de l'enum
XR_SPATIAL_CONTAINER_GRAPHICS_PRESENTATION_SELF_RENDERING_EXT
Le conteneur spatial utilise des couches de composition OpenXR (ajoutées par l'extension XR_EXT_spatial_container_self_rendering).
XR_SPATIAL_CONTAINER_GRAPHICS_PRESENTATION_CONFORMANCE_AUTOMATION_EXT
Le conteneur spatial est créé pour les tests de conformité et ne comporte pas de chemin de rendu (ajouté par l'extension XR_EXT_spatial_container_conformance_automation).
XR_SPATIAL_CONTAINER_GRAPHICS_PRESENTATION_SYSTEM_RENDERING_EXTX1
Le conteneur spatial utilise le rendu du système OpenXR (ajouté par l'extension XR_EXTX1_system_renderer)
État du conteneur spatial
L'état du conteneur spatial est géré par les environnements d'exécution en fonction des requêtes de l'application et des besoins de l'utilisateur. Par conséquent, chaque aspect de l'état du conteneur spatial documente les éléments suivants :
- Lorsque les environnements d'exécution sont autorisés à modifier l'état du conteneur spatial. Pour la plupart des états de conteneur spatial, les environnements d'exécution peuvent modifier l'état à tout moment.
- Comment une application demande des modifications de l'état. Les environnements d'exécution peuvent différer toute requête jusqu'à ce qu'ils estiment qu'elle est appropriée. Les environnements d'exécution ne mettent pas les événements en file d'attente lorsqu'une requête est différée. Les applications ne doivent donc pas attendre un tel événement pour une logique non liée.
- Événements que les environnements d'exécution mettent en file d'attente lorsque l'état du conteneur spatial change. Les environnements d'exécution mettent en file d'attente les événements pour toutes les modifications, y compris celles demandées par l'application et celles initiées par l'environnement d'exécution. Les environnements d'exécution ne doivent pas mettre en file d'attente les événements de changement d'état qui n'indiquent pas de changement, par exemple si une application effectue deux requêtes pour masquer un conteneur à un intervalle très court.
- File d'attente des environnements d'exécution d'événements lors du refus d'une demande de modification d'application. Les environnements d'exécution peuvent refuser une requête pour n'importe quelle raison, généralement en raison d'une règle système liée au maintien d'une expérience utilisateur de haute qualité.
La fonction xrGetSpatialContainerStateEXT interroge l'état actuel du conteneur spatial.
XrResult xrGetSpatialContainerStateEXT(
XrSpatialContainerEXT spatialContainer,
const XrSpatialContainerStateGetInfoEXT* getInfo,
XrSpatialContainerStateEXT* state);
Description des paramètres
spatialContainerest le XrSpatialContainerEXT à interroger.getInfoest l'élément XrSpatialContainerStateGetInfoEXT contenant les informations utilisées pour obtenir l'état du conteneur spatial.stateest un pointeur vers XrSpatialContainerStateEXT dans lequel l'état du conteneur spatial est renvoyé.
Utilisation valide (implicite)
- L'extension
XR_EXT_spatial_containerdoit être activée avant d'appeler xrGetSpatialContainerStateEXT. -
spatialContainerdoit être un handle XrSpatialContainerEXT valide - Si
getInfon'est pasNULL,getInfodoit être un pointeur vers une structure XrSpatialContainerStateGetInfoEXT valide. -
statedoit être un pointeur vers une structure XrSpatialContainerStateEXT
Codes renvoyés
XR_SUCCESSXR_SESSION_LOSS_PENDING
XR_ERROR_FUNCTION_UNSUPPORTEDXR_ERROR_HANDLE_INVALIDXR_ERROR_INSTANCE_LOSTXR_ERROR_RUNTIME_FAILUREXR_ERROR_SESSION_LOSTXR_ERROR_SPATIAL_CONTAINER_CLOSED_EXTXR_ERROR_VALIDATION_FAILURE
XrSpatialContainerStateGetInfoEXT est utilisé avec xrGetSpatialContainerStateEXT pour interroger un XrSpatialContainerStateEXT .
typedef struct XrSpatialContainerStateGetInfoEXT {
XrStructureType type;
const void* next;
} XrSpatialContainerStateGetInfoEXT;
Description du membre
typeest le XrStructureType de cette structure.nextestNULLou un pointeur vers la structure suivante dans une chaîne de structures. Aucune structure de ce type n'est définie dans OpenXR de base ou dans cette extension.
Utilisation valide (implicite)
- L'extension
XR_EXT_spatial_containerdoit être activée avant d'utiliser XrSpatialContainerStateGetInfoEXT. -
typedoit êtreXR_TYPE_SPATIAL_CONTAINER_STATE_GET_INFO_EXT -
nextdoit êtreNULLou un pointeur valide vers la structure suivante dans une chaîne de structures
typedef struct XrSpatialContainerStateEXT {
XrStructureType type;
void* next;
XrBool32 visible;
XrBool32 interactable;
XrSpatialContainerBoundsModeEXT boundsMode;
} XrSpatialContainerStateEXT;
Description du membre
typeest le XrStructureType de cette structure.nextestNULLou un pointeur vers la structure suivante dans une chaîne de structures. Aucune structure de ce type n'est définie dans OpenXR de base ou dans cette extension.visibleindique si un conteneur spatial est visible.interactableindique si un conteneur spatial peut actuellement recevoir n'importe quel type d'entrée. Il est semblable au "focus" des systèmes de fenêtrage 2D pour ordinateur, à la différence que plusieurs conteneurs spatiaux peuvent être interactifs en même temps.boundsModeest le XrSpatialContainerBoundsModeEXT actuel du conteneur spatial.
Les modifications apportées à l'état d'un conteneur spatial sont communiquées via des événements.
Événement "Champ modifié"
visible
XrEventDataSpatialContainerVisibleChangedEXT
interactable
XrEventDataSpatialContainerInteractableChangedEXT
boundsMode
XrEventDataSpatialContainerBoundsChangedEXT
Utilisation valide (implicite)
- L'extension
XR_EXT_spatial_containerdoit être activée avant d'utiliser XrSpatialContainerStateEXT. -
typedoit êtreXR_TYPE_SPATIAL_CONTAINER_STATE_EXT -
nextdoit êtreNULLou un pointeur valide vers la structure suivante dans une chaîne de structures
Visibilité
Les applications demandent à afficher ou à masquer un conteneur spatial avec xrRequestSpatialContainerVisibleEXT .
XrResult xrRequestSpatialContainerVisibleEXT(
XrSpatialContainerEXT spatialContainer,
const XrSpatialContainerVisibleRequestInfoEXT* info);
Description des paramètres
spatialContainerest le XrSpatialContainerEXT pour lequel une modification est demandée.infoest un pointeur vers un XrSpatialContainerVisibleRequestInfoEXT contenant l'état visible demandé.
L'affichage ou le masquage d'un conteneur spatial est une opération asynchrone.
Les applications doivent demander à masquer un conteneur spatial avant de le détruire, ce qui permet aux environnements d'exécution d'afficher une transition fluide. Les environnements d'exécution doivent respecter les demandes de masquage d'un conteneur spatial.
Un environnement d'exécution peut refuser les requêtes d'affichage d'un conteneur spatial. Dans ce cas, l'environnement d'exécution doit mettre en file d'attente un événement XrEventDataSpatialContainerVisibleRequestDeniedEXT. Par exemple, certains environnements d'exécution refuseront une requête d'affichage d'un conteneur spatial que l'utilisateur a masqué en interagissant avec un bouton "Réduire" fourni par le système.
Les environnements d'exécution ne doivent pas afficher de conteneur spatial avant que l'application ne demande à l'afficher au moins une fois. Après la première demande de l'application d'afficher un conteneur spatial, les environnements d'exécution peuvent modifier la visibilité de ce conteneur spatial indépendamment des demandes de l'application. Cela permet à l'application de contrôler l'état initial et le contenu d'un conteneur spatial, et aux environnements d'exécution de fournir une UI système, comme une barre des tâches, qui permet à l'utilisateur de choisir les conteneurs spatiaux visibles.
Les environnements d'exécution doivent refuser les requêtes d'affichage d'un conteneur spatial dans un mode de limites non compatible en fonction de XrSystemSpatialContainerPropertiesEXT :: supportsBounded et XrSystemSpatialContainerPropertiesEXT :: supportsImmersive . Cela est possible lorsque le mode de limites par défaut, XR_SPATIAL_CONTAINER_BOUNDS_MODE_BOUNDED_EXT , n'est pas compatible avec un système donné.
Remarque
Sur certaines implémentations, l'affichage ou le masquage d'un conteneur spatial nécessite de communiquer avec les services système et peut être différé jusqu'à ce que l'utilisateur interagisse avec une boîte de dialogue système. La conception asynchrone pour demander des changements d'état de visibilité est destinée à donner aux environnements d'exécution le temps d'effectuer ces deux opérations.
Utilisation valide (implicite)
- L'extension
XR_EXT_spatial_containerdoit être activée avant d'appeler xrRequestSpatialContainerVisibleEXT. -
spatialContainerdoit être un handle XrSpatialContainerEXT valide -
infodoit être un pointeur vers une structure XrSpatialContainerVisibleRequestInfoEXT valide.
Codes renvoyés
XR_SUCCESSXR_SESSION_LOSS_PENDING
XR_ERROR_FUNCTION_UNSUPPORTEDXR_ERROR_HANDLE_INVALIDXR_ERROR_INSTANCE_LOSTXR_ERROR_RUNTIME_FAILUREXR_ERROR_SESSION_LOSTXR_ERROR_SPATIAL_CONTAINER_CLOSED_EXTXR_ERROR_VALIDATION_FAILURE
XrSpatialContainerVisibleRequestInfoEXT est utilisé avec xrRequestSpatialContainerVisibleEXT pour modifier la visibilité d'un conteneur spatial.
typedef struct XrSpatialContainerVisibleRequestInfoEXT {
XrStructureType type;
const void* next;
XrBool32 visible;
} XrSpatialContainerVisibleRequestInfoEXT;
Description du membre
typeest le XrStructureType de cette structure.nextestNULLou un pointeur vers la structure suivante dans une chaîne de structures. Aucune structure de ce type n'est définie dans OpenXR de base ou dans cette extension.visibleindique si un conteneur spatial doit être affiché ou masqué.
Utilisation valide (implicite)
- L'extension
XR_EXT_spatial_containerdoit être activée avant d'utiliser XrSpatialContainerVisibleRequestInfoEXT. -
typedoit êtreXR_TYPE_SPATIAL_CONTAINER_VISIBLE_REQUEST_INFO_EXT -
nextdoit êtreNULLou un pointeur valide vers la structure suivante dans une chaîne de structures
Chaque fois qu'un environnement d'exécution modifie la visibilité d'un conteneur spatial, il doit mettre en file d'attente un événement XrEventDataSpatialContainerVisibleChangedEXT avec le nouvel état.
typedef struct XrEventDataSpatialContainerVisibleChangedEXT {
XrStructureType type;
const void* next;
XrSpatialContainerEXT spatialContainer;
XrBool32 visible;
} XrEventDataSpatialContainerVisibleChangedEXT;
Description du membre
typeest le XrStructureType de cette structure.nextestNULLou un pointeur vers la structure suivante dans une chaîne de structures. Aucune structure de ce type n'est définie dans OpenXR de base ou dans cette extension.spatialContainerest le XrSpatialContainerEXT auquel cet événement est destiné.visibleest le nouvel état visible du conteneur spatial.
Cet événement remplace XR_SESSION_STATE_VISIBLE , ce qui permet d'avoir une valeur différente par conteneur. L'événement doit être mis en file d'attente pour toutes les modifications, y compris celles demandées par l'application et celles initiées par l'environnement d'exécution.
Un environnement d'exécution peut retarder l'affichage d'un conteneur de quelques images après avoir mis cet événement en file d'attente avec visible défini sur XR_TRUE pour éviter d'afficher un conteneur vide et laisser à l'application le temps d'envoyer son contenu initial. Pendant ce temps, XrSpatialContainerStateEXT ::visible sera XR_TRUE . Les environnements d'exécution ne doivent pas retarder l'affichage d'un conteneur de plus de 0,5 seconde.
Utilisation valide (implicite)
- L'extension
XR_EXT_spatial_containerdoit être activée avant d'utiliser XrEventDataSpatialContainerVisibleChangedEXT. -
typedoit êtreXR_TYPE_EVENT_DATA_SPATIAL_CONTAINER_VISIBLE_CHANGED_EXT -
nextdoit êtreNULLou un pointeur valide vers la structure suivante dans une chaîne de structures
Chaque fois qu'un environnement d'exécution refuse une requête d'affichage d'un conteneur, il doit mettre en file d'attente un événement XrEventDataSpatialContainerVisibleRequestDeniedEXT.
typedef struct XrEventDataSpatialContainerVisibleRequestDeniedEXT {
XrStructureType type;
const void* next;
XrSpatialContainerEXT spatialContainer;
} XrEventDataSpatialContainerVisibleRequestDeniedEXT;
Description du membre
typeest le XrStructureType de cette structure.nextestNULLou un pointeur vers la structure suivante dans une chaîne de structures. Aucune structure de ce type n'est définie dans OpenXR de base ou dans cette extension.spatialContainerest le XrSpatialContainerEXT auquel cet événement est destiné.
Utilisation valide (implicite)
- L'extension
XR_EXT_spatial_containerdoit être activée avant d'utiliser XrEventDataSpatialContainerVisibleRequestDeniedEXT. -
typedoit êtreXR_TYPE_EVENT_DATA_SPATIAL_CONTAINER_VISIBLE_REQUEST_DENIED_EXT -
nextdoit êtreNULLou un pointeur valide vers la structure suivante dans une chaîne de structures
Interactable
Une application ne peut pas demander qu'un conteneur spatial soit interactif. Les environnements d'exécution contrôlent entièrement les conteneurs spatiaux avec lesquels il est possible d'interagir. Un conteneur spatial interactif doit également être visible.
Chaque fois qu'un environnement d'exécution modifie l'état d'interaction d'un conteneur spatial, il doit mettre en file d'attente un événement XrEventDataSpatialContainerInteractableChangedEXT avec le nouvel état.
typedef struct XrEventDataSpatialContainerInteractableChangedEXT {
XrStructureType type;
const void* next;
XrSpatialContainerEXT spatialContainer;
XrBool32 interactable;
} XrEventDataSpatialContainerInteractableChangedEXT;
Description du membre
typeest le XrStructureType de cette structure.nextestNULLou un pointeur vers la structure suivante dans une chaîne de structures. Aucune structure de ce type n'est définie dans OpenXR de base ou dans cette extension.spatialContainerest le XrSpatialContainerEXT auquel cet événement est destiné.interactableest le nouvel état d'interaction du conteneur spatial.
Cet événement remplace XR_SESSION_STATE_FOCUSED , ce qui permet d'avoir une valeur différente par conteneur. L'événement est mis en file d'attente pour toutes les modifications, y compris celles initiées par l'environnement d'exécution.
Les environnements d'exécution peuvent activer ou désactiver l'interaction avec un conteneur spatial à tout moment. Si un environnement d'exécution n'accepte qu'un seul conteneur spatial interactif à la fois, lorsqu'il modifie le conteneur spatial interactif, il doit mettre en file d'attente l'événement pour le conteneur spatial qui cesse d'être interactif ( interactable défini sur "false") avant l'événement pour le conteneur qui commence à être interactif ( interactable défini sur "true").
Utilisation valide (implicite)
- L'extension
XR_EXT_spatial_containerdoit être activée avant d'utiliser XrEventDataSpatialContainerInteractableChangedEXT. -
typedoit êtreXR_TYPE_EVENT_DATA_SPATIAL_CONTAINER_INTERACTABLE_CHANGED_EXT -
nextdoit êtreNULLou un pointeur valide vers la structure suivante dans une chaîne de structures
Limites
Un conteneur spatial possède un mode de limites et un cadre de délimitation. Le mode de limites d'un conteneur spatial décrit le comportement des limites. Son cadre de délimitation est l'élément dans lequel le conteneur spatial dessine.
L'énumération XrSpatialContainerBoundsModeEXT identifie les différents modes dans lesquels les limites d'un conteneur spatial peuvent se trouver.
typedef enum XrSpatialContainerBoundsModeEXT {
XR_SPATIAL_CONTAINER_BOUNDS_MODE_BOUNDED_EXT = 1,
XR_SPATIAL_CONTAINER_BOUNDS_MODE_IMMERSIVE_EXT = 2,
XR_SPATIAL_CONTAINER_BOUNDS_MODE_MAX_ENUM_EXT = 0x7FFFFFFF
} XrSpatialContainerBoundsModeEXT;
Description de l'enum
XR_SPATIAL_CONTAINER_BOUNDS_MODE_BOUNDED_EXT
Le conteneur spatial est limité. Les limites sont un cadre fini. Le conteneur spatial n'apparaîtra que dans cette région.
XR_SPATIAL_CONTAINER_BOUNDS_MODE_IMMERSIVE_EXT
Le conteneur spatial est immersif et n'a pas de limites. Le conteneur spatial s'affiche sur tout l'écran.
Les conteneurs spatiaux en mode de limites XR_SPATIAL_CONTAINER_BOUNDS_MODE_IMMERSIVE_EXT sont soumis à des exigences supplémentaires :
- Les environnements d'exécution doivent traiter ces conteneurs spatiaux de la même manière qu'une application immersive en plein écran créée sans conteneur spatial, à l'exception des changements de comportement décrits dans Modifications de l'état de la session .
- Les environnements d'exécution peuvent fournir des extensions supplémentaires qui permettent aux conteneurs spatiaux immersifs de se comporter différemment des applications plein écran et immersives créées sans cette extension.
- Les environnements d'exécution doivent signaler des limites infinies pour ces conteneurs spatiaux.
- Les environnements d'exécution peuvent masquer d'autres conteneurs spatiaux lorsqu'un conteneur spatial immersif est visible. Comme cela peut varier d'un environnement d'exécution à l'autre, les applications ne doivent pas compter sur l'affichage ou le masquage automatique des conteneurs spatiaux en fonction de la visibilité des conteneurs spatiaux immersifs. Comme pour toutes les autres transitions d'état visibles, les environnements d'exécution doivent mettre en file d'attente un événement XrEventDataSpatialContainerVisibleChangedEXT lorsqu'un conteneur spatial est masqué, car un conteneur immersif est visible.
Remarque
Les exigences ci-dessus impliquent que tous les environnements d'exécution peuvent implémenter le chemin d'accès OpenXR 1.x sans cette extension en créant implicitement un conteneur spatial, en définissant le mode de limites du conteneur sur immersif et en demandant qu'il soit visible.
Les applications demandent à modifier le mode de limites d'un conteneur spatial avec xrRequestSpatialContainerBoundsModeEXT .
XrResult xrRequestSpatialContainerBoundsModeEXT(
XrSpatialContainerEXT spatialContainer,
const XrSpatialContainerBoundsModeRequestInfoEXT* info);
Description des paramètres
spatialContainerest le XrSpatialContainerEXT pour lequel une modification est demandée.infoest un pointeur vers un XrSpatialContainerBoundsModeRequestInfoEXT contenant le mode de limites demandé.
La modification du mode de limites d'un conteneur spatial est une opération asynchrone, et les environnements d'exécution peuvent mettre en file d'attente un événement de modification ou de refus plusieurs secondes après que l'application a demandé une modification. Cela permet aux environnements d'exécution d'afficher l'interface utilisateur nécessaire pour permettre à un utilisateur d'accéder en toute sécurité à un mode immersif.
Les environnements d'exécution doivent honorer une requête de modification du mode de limites pour un conteneur spatial non visible. Si un environnement d'exécution refuse une requête de mode de limites pour un conteneur non visible, il peut rejeter ou différer une requête d'affichage d'un tel conteneur spatial. Cela permet aux applications de démarrer un conteneur en tant que conteneur immersif. Un environnement d'exécution peut refuser les requêtes de modification du mode de limites d'un conteneur spatial visible. Dans ce cas, l'environnement d'exécution doit mettre en file d'attente un événement XrEventDataSpatialContainerBoundsModeRequestDeniedEXT. Par exemple, certains environnements d'exécution refuseront une requête visant à modifier le mode de limites d'un conteneur spatial visible avec lequel l'utilisateur n'interagit pas activement.
Les environnements d'exécution doivent renvoyer XR_ERROR_VALIDATION_FAILURE si une application demande un mode de limites non compatible en fonction de XrSystemSpatialContainerPropertiesEXT :: supportsBounded et XrSystemSpatialContainerPropertiesEXT :: supportsImmersive .
Utilisation valide (implicite)
- L'extension
XR_EXT_spatial_containerdoit être activée avant d'appeler xrRequestSpatialContainerBoundsModeEXT. -
spatialContainerdoit être un handle XrSpatialContainerEXT valide -
infodoit être un pointeur vers une structure XrSpatialContainerBoundsModeRequestInfoEXT valide
Codes renvoyés
XR_SUCCESSXR_SESSION_LOSS_PENDING
XR_ERROR_FUNCTION_UNSUPPORTEDXR_ERROR_HANDLE_INVALIDXR_ERROR_INSTANCE_LOSTXR_ERROR_RUNTIME_FAILUREXR_ERROR_SESSION_LOSTXR_ERROR_SPATIAL_CONTAINER_CLOSED_EXTXR_ERROR_VALIDATION_FAILURE
XrSpatialContainerBoundsModeRequestInfoEXT est utilisé avec xrRequestSpatialContainerBoundsModeEXT pour modifier le mode de limites d'un conteneur spatial.
typedef struct XrSpatialContainerBoundsModeRequestInfoEXT {
XrStructureType type;
const void* next;
XrSpatialContainerBoundsModeEXT boundsMode;
} XrSpatialContainerBoundsModeRequestInfoEXT;
Description du membre
typeest le XrStructureType de cette structure.nextestNULLou un pointeur vers la structure suivante dans une chaîne de structures. Aucune structure de ce type n'est définie dans OpenXR de base ou dans cette extension.boundsModeest le XrSpatialContainerBoundsModeEXT souhaité pour le conteneur spatial.
Utilisation valide (implicite)
- L'extension
XR_EXT_spatial_containerdoit être activée avant d'utiliser XrSpatialContainerBoundsModeRequestInfoEXT. -
typedoit êtreXR_TYPE_SPATIAL_CONTAINER_BOUNDS_MODE_REQUEST_INFO_EXT -
nextdoit êtreNULLou un pointeur valide vers la structure suivante dans une chaîne de structures -
boundsModedoit être une valeur XrSpatialContainerBoundsModeEXT valide
Chaque fois qu'un environnement d'exécution modifie les limites ou le mode de limites d'un conteneur spatial, il doit mettre en file d'attente un événement XrEventDataSpatialContainerBoundsChangedEXT avec les nouvelles informations de limites.
typedef struct XrEventDataSpatialContainerBoundsChangedEXT {
XrStructureType type;
const void* next;
XrSpatialContainerEXT spatialContainer;
XrExtent3Df bounds;
XrBool32 infiniteBounds;
XrSpatialContainerBoundsModeEXT boundsMode;
} XrEventDataSpatialContainerBoundsChangedEXT;
Description du membre
typeest le XrStructureType de cette structure.nextestNULLou un pointeur vers la structure suivante dans une chaîne de structures. Aucune structure de ce type n'est définie dans OpenXR de base ou dans cette extension.spatialContainerest le XrSpatialContainerEXT auquel cet événement est destiné.boundscorrespond aux nouvelles largeur, hauteur et profondeur des limites du conteneur spatial.infiniteBoundsest défini sur "true" si le conteneur a des limites infinies.boundsModeest le nouveau XrSpatialContainerBoundsModeEXT du conteneur spatial.
L'événement est mis en file d'attente pour toutes les modifications, y compris celles demandées par l'application et celles initiées par l'environnement d'exécution.
Lorsqu'un utilisateur redimensionne un conteneur spatial de manière interactive, les environnements d'exécution doivent se comporter de l'une des manières suivantes :
- mettre en file d'attente de nombreux événements, probablement à la fréquence d'images, lorsque l'utilisateur redimensionne le conteneur spatial
- mettre en file d'attente un seul événement à la fin du redimensionnement
Si un environnement d'exécution ne met en file d'attente qu'un seul événement à la fin du redimensionnement, cet environnement d'exécution doit continuer à signaler les anciennes limites de xrGetSpatialContainerBoundsEXT jusqu'à ce qu'il mette en file d'attente un événement de redimensionnement. Les environnements d'exécution doivent fusionner plusieurs événements de modification des limites non interrogés. En d'autres termes, si les limites ou le mode de limites changent alors qu'un événement XrEventDataSpatialContainerBoundsChangedEXT est toujours en file d'attente, les environnements d'exécution doivent ne signaler qu'un seul événement contenant la dernière modification de limites qui s'est produite. Étant donné que les applications peuvent également interroger directement les limites d'un conteneur spatial avec xrGetSpatialContainerBoundsEXT, le nombre de modifications de limites à partir d'événements peut être différent du nombre de modifications à partir de l'interrogation en fonction du moment où les modifications de limites générées par l'environnement d'exécution, les appels d'application à xrPollEvent et les appels d'application à xrGetSpatialContainerBoundsEXT sont effectués.
Lorsque les limites d'un conteneur spatial changent, l'origine locale du conteneur spatial peut également changer. Par exemple, si un environnement d'exécution permet à un utilisateur de redimensionner les limites du conteneur spatial en faisant glisser l'un de ses bords, les limites et l'origine locale de ce conteneur changeront lorsque l'utilisateur fera glisser un seul bord. Dans ce cas, l'environnement d'exécution doit modifier simultanément les limites et l'origine locale.
Les environnements d'exécution doivent définir infiniteBounds sur XR_TRUE, et définir la largeur, la hauteur et la profondeur sur 0,0 pour représenter des limites infinies. Les environnements d'exécution doivent définir infiniteBounds sur XR_FALSE, et définir la largeur, la hauteur et la profondeur sur des nombres positifs finis pour les limites finies.
Les environnements d'exécution doivent définir bounds et infiniteBounds en suivant les mêmes règles que pour XrSpatialContainerBoundsEXT .
Utilisation valide (implicite)
- L'extension
XR_EXT_spatial_containerdoit être activée avant d'utiliser XrEventDataSpatialContainerBoundsChangedEXT. -
typedoit êtreXR_TYPE_EVENT_DATA_SPATIAL_CONTAINER_BOUNDS_CHANGED_EXT -
nextdoit êtreNULLou un pointeur valide vers la structure suivante dans une chaîne de structures
Chaque fois qu'un environnement d'exécution refuse une demande de modification du mode de limites d'un conteneur, il doit mettre en file d'attente un événement XrEventDataSpatialContainerBoundsModeRequestDeniedEXT.
typedef struct XrEventDataSpatialContainerBoundsModeRequestDeniedEXT {
XrStructureType type;
const void* next;
XrSpatialContainerEXT spatialContainer;
} XrEventDataSpatialContainerBoundsModeRequestDeniedEXT;
Description du membre
typeest le XrStructureType de cette structure.nextestNULLou un pointeur vers la structure suivante dans une chaîne de structures. Aucune structure de ce type n'est définie dans OpenXR de base ou dans cette extension.spatialContainerest le XrSpatialContainerEXT auquel cet événement est destiné.
Utilisation valide (implicite)
- L'extension
XR_EXT_spatial_containerdoit être activée avant d'utiliser XrEventDataSpatialContainerBoundsModeRequestDeniedEXT. -
typedoit êtreXR_TYPE_EVENT_DATA_SPATIAL_CONTAINER_BOUNDS_MODE_REQUEST_DENIED_EXT -
nextdoit êtreNULLou un pointeur valide vers la structure suivante dans une chaîne de structures
La structure XrSpatialContainerBoundsEXT décrit le cadre de délimitation d'un conteneur spatial.
typedef struct XrSpatialContainerBoundsEXT {
XrStructureType type;
void* next;
XrExtent3Df bounds;
XrBool32 infiniteBounds;
} XrSpatialContainerBoundsEXT;
Description du membre
typeest le XrStructureType de cette structure.nextestNULLou un pointeur vers la structure suivante dans une chaîne de structures. Aucune structure de ce type n'est définie dans OpenXR de base ou dans cette extension.boundscorrespond à la largeur, à la hauteur et à la profondeur des limites du conteneur spatial. Les limites sont exprimées en mètres.infiniteBoundsest défini sur "true" si le conteneur a des limites infinies.
Les environnements d'exécution doivent définir infiniteBounds sur XR_TRUE, et définir la largeur, la hauteur et la profondeur sur 0,0 pour représenter des limites infinies. Les environnements d'exécution doivent définir infiniteBounds sur XR_FALSE, et définir la largeur, la hauteur et la profondeur sur des nombres positifs finis pour les limites finies.
Utilisation valide (implicite)
- L'extension
XR_EXT_spatial_containerdoit être activée avant d'utiliser XrSpatialContainerBoundsEXT. -
typedoit êtreXR_TYPE_SPATIAL_CONTAINER_BOUNDS_EXT -
nextdoit êtreNULLou un pointeur valide vers la structure suivante dans une chaîne de structures
La fonction xrGetSpatialContainerBoundsEXT interroge les limites actuelles d'un conteneur spatial.
XrResult xrGetSpatialContainerBoundsEXT(
XrSpatialContainerEXT spatialContainer,
const XrSpatialContainerBoundsGetInfoEXT* getInfo,
XrSpatialContainerBoundsEXT* bounds);
Description des paramètres
spatialContainerest le XrSpatialContainerEXT à interroger.getInfoest l'élément XrSpatialContainerBoundsGetInfoEXT contenant les informations utilisées pour obtenir l'état du conteneur spatial.boundsest un pointeur vers l'XrSpatialContainerBoundsEXT dans lequel les limites sont renvoyées.
Un conteneur spatial limité ne doit pas avoir de limites infinies, tandis qu'un conteneur spatial immersif doit avoir des limites infinies.
Les environnements d'exécution peuvent modifier les limites d'un conteneur spatial en n'importe quelle valeur finie positive à tout moment lorsque le conteneur spatial est limité. Les modifications apportées aux limites d'un conteneur spatial sont communiquées via XrEventDataSpatialContainerBoundsChangedEXT .
Avec cette extension, une application ne peut pas demander de modifications des limites, sauf pour passer d'un mode limité à un mode immersif avec xrRequestSpatialContainerBoundsModeEXT . D'autres extensions pourraient proposer une telle solution à l'avenir.
Utilisation valide (implicite)
- L'extension
XR_EXT_spatial_containerdoit être activée avant d'appeler xrGetSpatialContainerBoundsEXT. -
spatialContainerdoit être un handle XrSpatialContainerEXT valide - Si
getInfon'est pasNULL,getInfodoit être un pointeur vers une structure XrSpatialContainerBoundsGetInfoEXT valide. -
boundsdoit être un pointeur vers une structure XrSpatialContainerBoundsEXT
Codes renvoyés
XR_SUCCESSXR_SESSION_LOSS_PENDING
XR_ERROR_FUNCTION_UNSUPPORTEDXR_ERROR_HANDLE_INVALIDXR_ERROR_INSTANCE_LOSTXR_ERROR_RUNTIME_FAILUREXR_ERROR_SESSION_LOSTXR_ERROR_SPATIAL_CONTAINER_CLOSED_EXTXR_ERROR_VALIDATION_FAILURE
La structure XrSpatialContainerBoundsGetInfoEXT est une structure d'entrée qui existe à des fins d'extension future.
typedef struct XrSpatialContainerBoundsGetInfoEXT {
XrStructureType type;
const void* next;
} XrSpatialContainerBoundsGetInfoEXT;
Description du membre
typeest le XrStructureType de cette structure.nextestNULLou un pointeur vers la structure suivante dans une chaîne de structures. Aucune structure de ce type n'est définie dans OpenXR de base ou dans cette extension.
Utilisation valide (implicite)
- L'extension
XR_EXT_spatial_containerdoit être activée avant d'utiliser XrSpatialContainerBoundsGetInfoEXT. -
typedoit êtreXR_TYPE_SPATIAL_CONTAINER_BOUNDS_GET_INFO_EXT -
nextdoit êtreNULLou un pointeur valide vers la structure suivante dans une chaîne de structures
L'énumération XrSpatialContainerVolumeClippingEXT identifie différents comportements de découpage de volume pour un conteneur spatial.
typedef enum XrSpatialContainerVolumeClippingEXT {
XR_SPATIAL_CONTAINER_VOLUME_CLIPPING_NONE_EXT = 0,
XR_SPATIAL_CONTAINER_VOLUME_CLIPPING_STRICT_EXT = 1,
XR_SPATIAL_CONTAINER_VOLUME_CLIPPING_MAX_ENUM_EXT = 0x7FFFFFFF
} XrSpatialContainerVolumeClippingEXT;
Description de l'enum
XR_SPATIAL_CONTAINER_VOLUME_CLIPPING_NONE_EXT
Aucun contenu n'est découpé selon le volume de délimitation du conteneur spatial. Le contenu peut s'afficher en dehors des limites du conteneur spatial.
XR_SPATIAL_CONTAINER_VOLUME_CLIPPING_STRICT_EXT
Le contenu est strictement limité au volume de délimitation du conteneur spatial.
Cette énumération n'est pas utilisée dans cette extension. Il est défini pour permettre à d'autres extensions de spécifier le comportement de coupure de volume souhaité. Par exemple, une application peut vouloir dessiner un arrière-plan pour un conteneur spatial délimité. Un cubemap monoculaire est un moyen pratique de spécifier un arrière-plan. Toutefois, un cubemap monoculaire est conceptuellement positionné à l'infini, ce qui se trouve en dehors du conteneur.
Fonctionnalités du système
Une application peut inspecter les fonctionnalités du système en associant une structure XrSystemSpatialContainerPropertiesEXT à XrSystemProperties lors de l'appel de xrGetSystemProperties .
typedef struct XrSystemSpatialContainerPropertiesEXT {
XrStructureType type;
void* next;
uint32_t maxSpatialContainerCount;
XrBool32 supportsBounded;
XrBool32 supportsImmersive;
} XrSystemSpatialContainerPropertiesEXT;
Description du membre
typeest le XrStructureType de cette structure.nextestNULLou un pointeur vers la structure suivante dans une chaîne de structures. Aucune structure de ce type n'est définie dans OpenXR de base ou dans cette extension.maxSpatialContainerCountest le nombre maximal de conteneurs spatiaux pouvant être créés.supportsBoundedest défini sur "true" si les conteneurs spatiaux peuvent être limités.supportsImmersiveest défini sur "true" si les conteneurs spatiaux sont autorisés à être immersifs.
Les environnements d'exécution compatibles avec cette extension devraient permettre à une application de créer de nombreux conteneurs spatiaux, limités uniquement par l'allocation de mémoire. Un environnement d'exécution peut avoir une limite différente pour le nombre de conteneurs spatiaux affichés simultanément. Il n'est pas possible d'interroger le nombre de conteneurs affichés simultanément dans cette extension, car un environnement d'exécution peut limiter les applications individuelles en fonction de l'état de toutes les applications en cours d'exécution. L'hypothèse est que les appareils très limités et les appareils moins limités auront des limites différentes pour le nombre de conteneurs affichés simultanément. Les appareils très limités peuvent n'accepter qu'un seul conteneur spatial affiché à la fois, et les appareils moins limités peuvent accepter un grand nombre de conteneurs spatiaux affichés simultanément, sous réserve des limites de calcul de rendu.
Les environnements d'exécution compatibles avec cette extension doivent prendre en charge au moins l'un des conteneurs spatiaux limités ou immersifs.
Utilisation valide (implicite)
- L'extension
XR_EXT_spatial_containerdoit être activée avant d'utiliser XrSystemSpatialContainerPropertiesEXT. -
typedoit êtreXR_TYPE_SYSTEM_SPATIAL_CONTAINER_PROPERTIES_EXT -
nextdoit êtreNULLou un pointeur valide vers la structure suivante dans une chaîne de structures
La fonction xrEnumerateSupportedSpatialContainerGraphicsPresentationsEXT renvoie les méthodes de présentation graphique compatibles avec un système.
XrResult xrEnumerateSupportedSpatialContainerGraphicsPresentationsEXT(
XrInstance instance,
XrSystemId systemId,
uint32_t graphicsPresentationCapacityInput,
uint32_t* graphicsPresentationCountOutput,
XrSpatialContainerGraphicsPresentationEXT* graphicsPresentations);
Description des paramètres
instanceest l'XrInstance à partir de laquellesystemIda été récupéré.systemIdest l'élémentXrSystemIdinterrogé.graphicsPresentationCapacityInputest la capacité du tableaugraphicsPresentations, ou 0 pour indiquer une requête de récupération de la capacité requise.graphicsPresentationCountOutputest un pointeur vers le nombre de présentations graphiques écrites, ou un pointeur vers la capacité requise sigraphicsPresentationCapacityInputest égal à 0.graphicsPresentationsest un pointeur vers un tableau de valeurs XrSpatialContainerGraphicsPresentationEXT, mais peut être nul sigraphicsPresentationCapacityInputest égal à 0.- Consultez la section Paramètres de taille de la mémoire tampon pour obtenir une description détaillée de la récupération de la taille
graphicsPresentationsrequise.
Les environnements d'exécution doivent toujours renvoyer un contenu de tampon identique à partir de cette énumération pour l'ID système donné et pendant la durée de vie de l'instance.
Utilisation valide (implicite)
- L'extension
XR_EXT_spatial_containerdoit être activée avant d'appeler xrEnumerateSupportedSpatialContainerGraphicsPresentationsEXT. -
instancedoit être un handle XrInstance valide -
graphicsPresentationCountOutputdoit être un pointeur vers une valeuruint32_t - Si
graphicsPresentationCapacityInputn'est pas0,graphicsPresentationsdoit être un pointeur vers un tableau de valeursgraphicsPresentationCapacityInputXrSpatialContainerGraphicsPresentationEXT.
Codes renvoyés
XR_SUCCESS
XR_ERROR_FUNCTION_UNSUPPORTEDXR_ERROR_HANDLE_INVALIDXR_ERROR_INSTANCE_LOSTXR_ERROR_RUNTIME_FAILUREXR_ERROR_SIZE_INSUFFICIENTXR_ERROR_SYSTEM_INVALIDXR_ERROR_VALIDATION_FAILURE
Modifications apportées à l'état de la session
La compatibilité avec les conteneurs spatiaux est activée pour une session en associant un XrSessionCreateInfoSpatialContainersEXT lors de l'appel de xrCreateSession .
typedef struct XrSessionCreateInfoSpatialContainersEXT {
XrStructureType type;
const void* next;
} XrSessionCreateInfoSpatialContainersEXT;
Lorsque la compatibilité avec les conteneurs spatiaux est activée, une XrSession se comporte différemment. En effet, lorsque vous utilisez des conteneurs spatiaux, la session ne présente plus le contenu de l'image sur les écrans. Ce sont les conteneurs spatiaux qui s'en chargent. Par conséquent, lorsque cette extension est activée, une session est effectivement "sans interface graphique". Contrairement aux autres extensions headless, les applications peuvent envoyer des données d'image via les conteneurs spatiaux.
L'activation de la compatibilité avec les conteneurs spatiaux modifie les API OpenXR de base de la manière suivante.
runtime: losing system or device
runtime: losing system or device
xrDestroySession
xrDestroySession
IDLE
(en cours d'exécution)
IDLE...
xrGetSystem
xrCreateSession
xrGetSystem...
xrCreateInstance
xrCreateIn...
xrDestroySession
xrDestroySession
LOSS_PENDING
(inactif)
LOSS_PENDING...
xrDestroyInstance
xrDestroyInstance
app : relancer XR (facultatif)
app : éventuellement...
Figure 19 : Machine à états de la nouvelle session
- La session n'entre jamais dans les états
XR_SESSION_STATE_VISIBLE,XR_SESSION_STATE_FOCUSEDouXR_SESSION_STATE_EXITING. Les environnements d'exécution ne doivent jamais mettre en file d'attente des événements pour ces états. Ces états sont remplacés par les événements par conteneur spatial XrEventDataSpatialContainerVisibleChangedEXT, XrEventDataSpatialContainerInteractableChangedEXT et XrEventDataSpatialContainerClosedEXT, respectivement. - La session n'entre jamais non plus dans les états
XR_SESSION_STATE_READY,XR_SESSION_STATE_SYNCHRONIZEDouXR_SESSION_STATE_STOPPING. Les environnements d'exécution ne doivent jamais mettre en file d'attente des événements pour ces états. Il n'existe aucun remplacement pour ces états. - Les environnements d'exécution doivent traiter la session comme étant en cours d'exécution lorsqu'elle est à l'état
XR_SESSION_STATE_IDLE. - Les environnements d'exécution doivent traiter la session comme étant active lorsqu'elle est à l'état
XR_SESSION_STATE_IDLEet qu'au moins un conteneur spatial interactif existe. - Les fonctions xrBeginSession et xrEndSession ne sont plus nécessaires. Les environnements d'exécution doivent renvoyer
XR_ERROR_SPATIAL_CONTAINERS_ENABLED_EXTlorsque ces fonctions sont appelées. D'autres extensions peuvent fournir des remplacements pour ces fonctions. - La fonction xrRequestExitSession n'est plus nécessaire non plus. Les environnements d'exécution doivent renvoyer
XR_ERROR_SPATIAL_CONTAINERS_ENABLED_EXTlorsque cette fonction est appelée. Les applications qui souhaitent quitter une session en cours peuvent appeler xrRequestSpatialContainerVisibleEXT pour masquer leurs conteneurs, puis détruire la session une fois que tous les conteneurs ne sont plus visibles. Les extensions qui mettaient en file d'attente des événements supplémentaires au démarrage de l'exécution de la session doivent désormais mettre ces événements en file d'attente après la création de la session. Ces extensions sont indiquées ci-dessous.
Événement d'extension
XR_EXT_user_presence
XrEventDataUserPresenceChangedEXT
XR_META_boundary_visibility
XrEventDataBoundaryVisibilityChangedMETA
- La fonction xrLocateViews n'est pas valide pour l'appel de la session. Les environnements d'exécution doivent renvoyer
XR_ERROR_SPATIAL_CONTAINERS_ENABLED_EXTà partir de xrLocateViews . D'autres extensions peuvent fournir des moyens de localiser les vues d'un conteneur spatial particulier. - La fonction xrWaitFrame doit toujours définir XrFrameState ::
shouldRendersur "false". D'autres extensions peuvent fournir des moyens de savoir si un conteneur spatial particulier doit mettre à jour ses couches de composition. - La fonction xrEndFrame n'est pas un moyen valide d'envoyer des couches de composition. Si une application définit XrFrameEndInfo ::
layerCountsur une valeur non nulle, les environnements d'exécution doivent renvoyerXR_ERROR_VALIDATION_FAILURE. D'autres extensions peuvent fournir des moyens d'envoyer des couches de composition pour un conteneur spatial particulier. - L'activation de l'état
XR_SESSION_STATE_LOSS_PENDINGferme également tous les conteneurs spatiaux. Les environnements d'exécution doivent mettre en file d'attente un événement XrEventDataSpatialContainerClosedEXT pour chaque conteneur spatial actif avant de mettre en file d'attente un changement d'état de session pourXR_SESSION_STATE_LOSS_PENDING. - La fonction xrCreateSession n'a plus besoin d'une structure de liaison d'API graphique. D'autres extensions peuvent nécessiter une liaison graphique, par exemple pour qu'un conteneur spatial s'affiche à l'aide d'une API graphique.
Le comportement ci-dessus est légèrement différent de celui de XR_MND_headless . Les environnements d'exécution ne doivent pas activer le comportement de session sans interface graphique de XR_MND_headless lorsque la compatibilité avec les conteneurs spatiaux est activée pour cette session.
Remarque
Lorsque les conteneurs spatiaux sont activés, une session ne passe que par deux états : XR_SESSION_STATE_IDLE (en cours d'exécution) et XR_SESSION_STATE_LOSS_PENDING (pas en cours d'exécution). Par conséquent, les environnements d'exécution ne renvoient plus XR_ERROR_SESSION_RUNNING ni XR_ERROR_SESSION_NOT_RUNNING . Au lieu de cela, lorsqu'une session n'est pas en cours d'exécution, les environnements d'exécution renvoient XR_ERROR_SESSION_LOST ou XR_SESSION_LOSS_PENDING en suivant les règles du noyau OpenXR. De plus, xrBeginSession , la seule fonction qui renvoie XR_ERROR_SESSION_RUNNING , renverra désormais toujours XR_ERROR_SPATIAL_CONTAINERS_ENABLED_EXT .
Utilisation valide (implicite)
- L'extension
XR_EXT_spatial_containerdoit être activée avant d'utiliser XrSessionCreateInfoSpatialContainersEXT. -
typedoit êtreXR_TYPE_SESSION_CREATE_INFO_SPATIAL_CONTAINERS_EXT -
nextdoit êtreNULLou un pointeur valide vers la structure suivante dans une chaîne de structures
Entrées du fichier manifeste Android
Les environnements d'exécution basés sur l'AOSP peuvent avoir un comportement personnalisé en fonction de l'état initial du conteneur spatial, qui est démarré avant l'exécution du code de l'application. Par exemple, un environnement d'exécution peut modifier les ressources allouées à l'activité, lancer des animations ou afficher un écran de démarrage. Les propriétés suivantes sont fournies à cette fin. Ils remplacent la balise <category android:name="org.khronos.openxr.intent.category.IMMERSIVE_HMD" />, que les applications basées sur des conteneurs spatiaux ne doivent pas spécifier, sauf pour assurer la compatibilité avec les environnements d'exécution basés sur l'AOSP antérieurs.
<property android:name="org.khronos.openxr.PROPERTY_ACTIVITY_HINT_XR_SPATIAL_CONTAINER_USED_BOUNDS_MODES"
android:value="list of modes" />
Cette propriété indique aux environnements d'exécution les modes de limites utilisés par une activité. Par défaut, il s'agit d'une liste vide, ce qui implique qu'il n'y a pas d'indice.
Les chaînes suivantes sont valides pour cet attribut. Plusieurs valeurs sont séparées par | (par exemple, "bounded|immersive").
Valeur
Description
"2d_panel"
L'activité s'affiche à l'aide du framework de vue 2D d'Android.
"bounded"
L'activité utilise XR_SPATIAL_CONTAINER_BOUNDS_MODE_BOUNDED_EXT .
"immersive"
L'activité utilise XR_SPATIAL_CONTAINER_BOUNDS_MODE_IMMERSIVE_EXT .
<property android:name="org.khronos.openxr.PROPERTY_ACTIVITY_HINT_XR_SPATIAL_CONTAINER_INITIAL_BOUNDS_MODE"
android:value="XR_SPATIAL_CONTAINER_INITIAL_BOUNDS_MODE_BOUNDED|
XR_SPATIAL_CONTAINER_INITIAL_BOUNDS_MODE_IMMERSIVE|
XR_SPATIAL_CONTAINER_INITIAL_BOUNDS_MODE_UNDEFINED" />
Cette propriété indique aux environnements d'exécution le XrSpatialContainerBoundsModeEXT initial de l'activité lors de sa création. Par défaut, il s'agit de la chaîne XR_SPATIAL_CONTAINER_INITIAL_BOUNDS_MODE_UNDEFINED, ce qui signifie qu'aucune indication n'est fournie.
Les environnements d'exécution ne doivent pas exiger que les applications disposent de ces propriétés pour se comporter conformément à cette spécification. Les environnements d'exécution ne doivent pas modifier le comportement visible de l'application en fonction de ces propriétés. Toutes ces métadonnées doivent pouvoir être spécifiées au niveau <activity> ou <application>. S'il est spécifié au niveau <application>, il s'applique à toutes les activités de l'application qui ne spécifient pas leurs propres valeurs.
Exemple de code
Le code suivant montre comment utiliser cette extension pour les cas d'utilisation de perception uniquement, sans aucun rendu.
XrInstance instance; // Already initialized
// Create the session with spatial containers enabled
XrSession session;
XrSessionCreateInfoSpatialContainersEXT spatialContainerCreateInfo {
.type = XR_TYPE_SESSION_CREATE_INFO_SPATIAL_CONTAINERS_EXT,
};
XrSessionCreateInfo sessionCreateInfo {
.type = XR_TYPE_SESSION_CREATE_INFO,
.next = &spatialContainerCreateInfo, // Enable spatial containers
};
(void)sessionCreateInfo.systemId; // Other create fields set in usual way
CHK_XR(xrCreateSession(instance, &sessionCreateInfo, &session));
// Because spatial containers are enabled, the session is considered
// running. App is able to query perception data such as head poses and hand
// poses.
// Based on app logic or when a system lost event happens, destroy the
// session
CHK_XR(xrDestroySession(session));
Nouveaux types d'objets
Nouvelles commandes
- xrCreateSpatialContainerEXT
- xrCreateSpatialContainerSpaceEXT
- xrDestroySpatialContainerEXT
- xrEnumerateSupportedSpatialContainerGraphicsPresentationsEXT
- xrGetSpatialContainerBoundsEXT
- xrGetSpatialContainerStateEXT
- xrRequestSpatialContainerBoundsModeEXT
- xrRequestSpatialContainerVisibleEXT
Nouvelles structures
- XrEventDataSpatialContainerBoundsChangedEXT
- XrEventDataSpatialContainerBoundsModeRequestDeniedEXT
- XrEventDataSpatialContainerClosedEXT
- XrEventDataSpatialContainerInteractableChangedEXT
- XrEventDataSpatialContainerVisibleChangedEXT
- XrEventDataSpatialContainerVisibleRequestDeniedEXT
- XrSpatialContainerBoundsEXT
- XrSpatialContainerBoundsGetInfoEXT
- XrSpatialContainerBoundsModeRequestInfoEXT
- XrSpatialContainerCreateInfoEXT
- XrSpatialContainerSpaceCreateInfoEXT
- XrSpatialContainerStateEXT
- XrSpatialContainerStateGetInfoEXT
- XrSpatialContainerVisibleRequestInfoEXT
Extension de XrSessionCreateInfo :
Extension de XrSystemProperties :
Nouvelles énumérations
- XrSpatialContainerBoundsModeEXT
- XrSpatialContainerGraphicsPresentationEXT
- XrSpatialContainerVolumeClippingEXT
Nouvelles constantes d'énumération
XR_EXT_SPATIAL_CONTAINER_EXTENSION_NAMEXR_EXT_spatial_container_SPEC_VERSIONExtension de XrObjectType :
XR_OBJECT_TYPE_SPATIAL_CONTAINER_EXT
Extension de XrResult :
XR_ERROR_COMPATIBLE_SPATIAL_CONTAINER_MISSING_EXTXR_ERROR_SPATIAL_CONTAINERS_ENABLED_EXTXR_ERROR_SPATIAL_CONTAINERS_NOT_ENABLED_EXTXR_ERROR_SPATIAL_CONTAINER_CLOSED_EXT
Extension de XrStructureType :
XR_TYPE_EVENT_DATA_SPATIAL_CONTAINER_BOUNDS_CHANGED_EXTXR_TYPE_EVENT_DATA_SPATIAL_CONTAINER_BOUNDS_MODE_REQUEST_DENIED_EXTXR_TYPE_EVENT_DATA_SPATIAL_CONTAINER_CLOSED_EXTXR_TYPE_EVENT_DATA_SPATIAL_CONTAINER_INTERACTABLE_CHANGED_EXTXR_TYPE_EVENT_DATA_SPATIAL_CONTAINER_VISIBLE_CHANGED_EXTXR_TYPE_EVENT_DATA_SPATIAL_CONTAINER_VISIBLE_REQUEST_DENIED_EXTXR_TYPE_SESSION_CREATE_INFO_SPATIAL_CONTAINERS_EXTXR_TYPE_SPATIAL_CONTAINER_BOUNDS_EXTXR_TYPE_SPATIAL_CONTAINER_BOUNDS_GET_INFO_EXTXR_TYPE_SPATIAL_CONTAINER_BOUNDS_MODE_REQUEST_INFO_EXTXR_TYPE_SPATIAL_CONTAINER_CREATE_INFO_EXTXR_TYPE_SPATIAL_CONTAINER_SPACE_CREATE_INFO_EXTXR_TYPE_SPATIAL_CONTAINER_STATE_EXTXR_TYPE_SPATIAL_CONTAINER_STATE_GET_INFO_EXTXR_TYPE_SPATIAL_CONTAINER_VISIBLE_REQUEST_INFO_EXTXR_TYPE_SYSTEM_SPATIAL_CONTAINER_PROPERTIES_EXT
Problèmes
Comment gérer plusieurs requêtes visibles en attente ? L'application doit-elle recevoir un seul changement/refus ou plusieurs ? La réponse peut être différente si les appels sont répartis sur plusieurs frames. La réponse peut également être différente si les requêtes multiples n'ont aucun effet (par exemple, demander qu'un conteneur spatial soit visible, puis non visible pour un conteneur qui n'est pas visible au départ).
- Résolu. Différents choix pour les événements de modification et les événements refusés. Les requêtes Noop ne mettent pas en file d'attente un événement de modification. Elles ne font que générer du bruit pour le développeur d'applications et sont faciles à filtrer pour les environnements d'exécution. Si plusieurs requêtes visibles sont refusées, les environnements d'exécution doivent générer un événement de refus correspondant pour chacune d'elles.
Comment une extension d'automatisation de la conformité doit-elle être définie pour que tout le texte de spécification facultatif pour les comportements des règles puisse toujours être testé par CTS ?
- Résolu. Extension de test distincte. Un environnement d'exécution d'extension de test sera implémenté pour CTS uniquement, ce qui permettra à CTS de contrôler l'ensemble des règles système.
Avons-nous besoin d'un événement lorsque la position d'un conteneur spatial change ?
- Résolu. Non. L'espace du conteneur spatial n'est pas verrouillé par rapport au monde, et d'autres espaces de ce type, comme
XR_REFERENCE_SPACE_TYPE_VIEW, ne comportent pas d'événements lorsqu'ils changent.
- Résolu. Non. L'espace du conteneur spatial n'est pas verrouillé par rapport au monde, et d'autres espaces de ce type, comme
Comment fonctionne xrSyncActions s'il existe plusieurs conteneurs spatiaux ?
- Résolu. Aucune modification n'est nécessaire. xrSyncActions s'appliquerait à tous les conteneurs spatiaux de la session. Si une application souhaite diriger les actions de saisie vers un conteneur spatial particulier, elle peut examiner l'état interactif par conteneur pour choisir les conteneurs qui sont des cibles valides. Si une application souhaite synchroniser uniquement l'état de l'action d'entrée pour un seul conteneur spatial, une extension supplémentaire est nécessaire. Toutefois, nous prévoyons de nous concentrer plutôt sur une extension qui permet aux applications d'être entièrement basées sur des événements et d'éviter d'avoir à appeler xrSyncActions dans une boucle de frame.
Comment les applications peu fréquemment mises à jour gèrent-elles les entrées ?
- Résolu. Aucune modification n'est nécessaire. Bien qu'elle soit utile pour EXT_spatial_container, elle l'est également en dehors des conteneurs spatiaux. Cela peut être géré via une extension de canal d'événement et fonctionner dans les deux cas. Pour les conteneurs spatiaux, nous ajouterons d'autres moyens de filtrer les événements pour un seul conteneur spatial.
Doit-on attendre pour limiter/contrôler le timing de la boucle d'entrée pour les applications avec des boucles d'entrée et de rendu dissociées ?
- Résolu. Aucune modification n'est nécessaire. Cela devrait être géré via le canal d'événement et les extensions de requête actuelles. L'extension de requête Present permet d'effectuer un rendu basé sur des événements et dissocié d'une boucle de frame.
Un conteneur spatial peut-il obtenir sa pose par rapport à d'autres conteneurs spatiaux ? Points clés à prendre en compte : avons-nous un cas d'utilisation pour cela ? Si oui, comment les espaces de conteneur spatial se connectent-ils à LOCAL ?
- Résolu. Oui. C'est déjà possible pour les conteneurs spatiaux d'une même session en passant par
XR_REFERENCE_SPACE_TYPE_VIEW, et il est souhaitable de prendre en charge le contenu dépendant de la vue. Pour partager des positions de conteneurs spatiaux entre les sessions (par exemple, vers un autre processus), la méthode attendue consiste à exploiterXR_EXT_spatial_anchoret ses modèles de persistance et de partage existants.
- Résolu. Oui. C'est déjà possible pour les conteneurs spatiaux d'une même session en passant par
L'espace d'un conteneur spatial est-il localisable s'il n'est pas visible ?
- Résolu. Non. L'espace du conteneur spatial n'est pas localisable lorsque le conteneur spatial n'est pas visible. Cela implique qu'il n'y a pas de son spatialisé et que l'application ne peut pas "précharger" le contenu dépendant de la vue lorsque le spatial_container n'est pas visible. Ces deux options sont acceptables, car lorsqu'un conteneur spatial n'est pas visible, l'application est censée arrêter toute charge CPU/GPU utilisée pour ce conteneur spatial.
Où l'espace du conteneur spatial doit-il être placé dans le conteneur spatial ? Les suggestions ont été le centre ou le point minimal (minX, minY, minZ).
- Résolu. Au centre. Il n'y a pas d'emplacement qui ne se déplace pas de la plupart des manières dont une UX de redimensionnement de conteneur spatial est censée se déplacer (bords mobiles). "Center" est couramment utilisé dans d'autres parties d'OpenXR. Nous ne nous sommes pas alignés sur les fenêtres de l'informatique 2D, qui utilisent la coordonnée minimale, car les visionneuses de modèles 3D ne suivent souvent pas cette convention.
Quand un environnement d'exécution doit-il créer des ressources sous-jacentes au conteneur spatial ? Cela implique parfois une communication interprocessus avec les services système.
- Résolu. De manière synchrone dans le cadre de
xrCreateSpatialContainerEXT. Bien qu'il puisse y avoir des communications interprocessus, la création d'un conteneur est généralement peu coûteuse. Certains fournisseurs disposent de mutex globaux pour la gestion des conteneurs, mais ils ne devraient pas entraîner de longs temps d'attente. Les problèmes de conflit de mutex sont des bugs spécifiques au fournisseur qui doivent être résolus par chaque fournisseur.
- Résolu. De manière synchrone dans le cadre de
Avons-nous besoin d'un signal indiquant qu'une XrSession va créer des conteneurs spatiaux et ne sera donc pas compatible avec l'ancien chemin de rendu ?
- Résolu. Oui. Nous modifions fondamentalement la machine d'état de la session.
Historique des versions
Révision 1, 06/08/2026 (Jared Finder, Google)
- Description initiale de l'extension