/**************************************************************************/ /* openxr_spatial_entities.h */ /**************************************************************************/ /* This file is part of: */ /* GODOT ENGINE */ /* https://godotengine.org */ /**************************************************************************/ /* Copyright (c) 2014-present Godot Engine contributors (see AUTHORS.md). */ /* Copyright (c) 2007-2014 Juan Linietsky, Ariel Manzur. */ /* */ /* Permission is hereby granted, free of charge, to any person obtaining */ /* a copy of this software and associated documentation files (the */ /* "Software"), to deal in the Software without restriction, including */ /* without limitation the rights to use, copy, modify, merge, publish, */ /* distribute, sublicense, and/or sell copies of the Software, and to */ /* permit persons to whom the Software is furnished to do so, subject to */ /* the following conditions: */ /* */ /* The above copyright notice and this permission notice shall be */ /* included in all copies or substantial portions of the Software. */ /* */ /* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */ /* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */ /* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. */ /* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */ /* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */ /* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */ /* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ /**************************************************************************/ #pragma once #include "../../openxr_structure.h" #include "../openxr_future_extension.h" #include "scene/resources/mesh.h" #include "servers/xr/xr_positional_tracker.h" #define XR_NULL_ENTITY 0x7FFFFFFF // Wrapper class for XrSpatialCapabilityConfigurationBaseHeaderEXT class OpenXRSpatialCapabilityConfigurationBaseHeader : public RefCounted { GDCLASS(OpenXRSpatialCapabilityConfigurationBaseHeader, RefCounted); protected: static void _bind_methods(); public: virtual bool has_valid_configuration() const; virtual XrSpatialCapabilityConfigurationBaseHeaderEXT *get_configuration(); GDVIRTUAL0RC(bool, _has_valid_configuration); GDVIRTUAL0R(uint64_t, _get_configuration); }; // Tracker for our spatial entities class OpenXRSpatialEntityTracker : public XRPositionalTracker { GDCLASS(OpenXRSpatialEntityTracker, XRPositionalTracker); public: enum EntityTrackingState { ENTITY_TRACKING_STATE_STOPPED = XR_SPATIAL_ENTITY_TRACKING_STATE_STOPPED_EXT, ENTITY_TRACKING_STATE_PAUSED = XR_SPATIAL_ENTITY_TRACKING_STATE_PAUSED_EXT, ENTITY_TRACKING_STATE_TRACKING = XR_SPATIAL_ENTITY_TRACKING_STATE_TRACKING_EXT, }; OpenXRSpatialEntityTracker(); virtual ~OpenXRSpatialEntityTracker(); void set_entity(const RID &p_entity); RID get_entity() const; void set_spatial_tracking_state(const XrSpatialEntityTrackingStateEXT p_state); XrSpatialEntityTrackingStateEXT get_spatial_tracking_state() const; protected: static void _bind_methods(); private: RID spatial_entity; XrSpatialEntityTrackingStateEXT spatial_tracking_state = XR_SPATIAL_ENTITY_TRACKING_STATE_PAUSED_EXT; void _set_spatial_tracking_state(const EntityTrackingState p_state); EntityTrackingState _get_spatial_tracking_state() const; }; VARIANT_ENUM_CAST(OpenXRSpatialEntityTracker::EntityTrackingState) // Wrapper class for our spatial component data returned by discovery queries class OpenXRSpatialComponentData : public RefCounted { GDCLASS(OpenXRSpatialComponentData, RefCounted); protected: static void _bind_methods(); public: virtual void set_capacity(uint32_t p_capacity); virtual XrSpatialComponentTypeEXT get_component_type() const; virtual void *get_structure_data(void *p_next); GDVIRTUAL1(_set_capacity, uint32_t); GDVIRTUAL0RC(uint64_t, _get_component_type); GDVIRTUAL1RC(uint64_t, _get_structure_data, uint64_t); }; class OpenXRSpatialComponentBounded2DList : public OpenXRSpatialComponentData { GDCLASS(OpenXRSpatialComponentBounded2DList, OpenXRSpatialComponentData); protected: static void _bind_methods(); public: virtual void set_capacity(uint32_t p_capacity) override; virtual XrSpatialComponentTypeEXT get_component_type() const override; virtual void *get_structure_data(void *p_next) override; Transform3D get_center_pose(int64_t p_index) const; Vector2 get_size(int64_t p_index) const; private: Vector bounded2d_data; XrSpatialComponentBounded2DListEXT bounded2d_list = { XR_TYPE_SPATIAL_COMPONENT_BOUNDED_2D_LIST_EXT, nullptr, 0, nullptr }; }; class OpenXRSpatialComponentBounded3DList : public OpenXRSpatialComponentData { GDCLASS(OpenXRSpatialComponentBounded3DList, OpenXRSpatialComponentData); protected: static void _bind_methods(); public: virtual void set_capacity(uint32_t p_capacity) override; virtual XrSpatialComponentTypeEXT get_component_type() const override; virtual void *get_structure_data(void *p_next) override; Transform3D get_center_pose(int64_t p_index) const; Vector3 get_size(int64_t p_index) const; private: Vector bounded3d_data; XrSpatialComponentBounded3DListEXT bounded3d_list = { XR_TYPE_SPATIAL_COMPONENT_BOUNDED_3D_LIST_EXT, nullptr, 0, nullptr }; }; class OpenXRSpatialComponentParentList : public OpenXRSpatialComponentData { GDCLASS(OpenXRSpatialComponentParentList, OpenXRSpatialComponentData); protected: static void _bind_methods(); public: virtual void set_capacity(uint32_t p_capacity) override; virtual XrSpatialComponentTypeEXT get_component_type() const override; virtual void *get_structure_data(void *p_next) override; RID get_parent(int64_t p_index) const; private: Vector parent_data; XrSpatialComponentParentListEXT parent_list = { XR_TYPE_SPATIAL_COMPONENT_PARENT_LIST_EXT, nullptr, 0, nullptr }; }; class OpenXRSpatialComponentMesh2DList : public OpenXRSpatialComponentData { GDCLASS(OpenXRSpatialComponentMesh2DList, OpenXRSpatialComponentData); protected: static void _bind_methods(); public: virtual void set_capacity(uint32_t p_capacity) override; virtual XrSpatialComponentTypeEXT get_component_type() const override; virtual void *get_structure_data(void *p_next) override; Transform3D get_transform(int64_t p_index) const; PackedVector2Array get_vertices(RID p_snapshot, int64_t p_index) const; PackedInt32Array get_indices(RID p_snapshot, int64_t p_index) const; private: Vector mesh2d_data; XrSpatialComponentMesh2DListEXT mesh2d_list = { XR_TYPE_SPATIAL_COMPONENT_MESH_2D_LIST_EXT, nullptr, 0, nullptr }; }; class OpenXRSpatialComponentMesh3DList : public OpenXRSpatialComponentData { GDCLASS(OpenXRSpatialComponentMesh3DList, OpenXRSpatialComponentData); protected: static void _bind_methods(); public: virtual void set_capacity(uint32_t p_capacity) override; virtual XrSpatialComponentTypeEXT get_component_type() const override; virtual void *get_structure_data(void *p_next) override; Transform3D get_transform(int64_t p_index) const; Ref get_mesh(int64_t p_index) const; private: Vector mesh3d_data; XrSpatialComponentMesh3DListEXT mesh3d_list = { XR_TYPE_SPATIAL_COMPONENT_MESH_3D_LIST_EXT, nullptr, 0, nullptr }; }; class OpenXRSpatialQueryResultData : public OpenXRSpatialComponentData { GDCLASS(OpenXRSpatialQueryResultData, OpenXRSpatialComponentData); protected: static void _bind_methods(); public: virtual void set_capacity(uint32_t p_capacity) override; virtual XrSpatialComponentTypeEXT get_component_type() const override; virtual void *get_structure_data(void *p_next) override; int64_t get_capacity() const { return entity_ids.size(); } XrSpatialEntityIdEXT get_entity_id(int64_t p_index) const; XrSpatialEntityTrackingStateEXT get_entity_state(int64_t p_index) const; static String get_entity_tracking_state_name(XrSpatialEntityTrackingStateEXT p_tracking_state); private: Vector entity_ids; Vector entity_states; XrSpatialComponentDataQueryResultEXT query_result = { XR_TYPE_SPATIAL_COMPONENT_DATA_QUERY_RESULT_EXT, nullptr, 0, 0, nullptr, 0, 0, nullptr }; uint64_t _get_entity_id(int64_t p_index) const; OpenXRSpatialEntityTracker::EntityTrackingState _get_entity_state(int64_t p_index) const; };