openxr_render_model_extension.h 8.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172
  1. /**************************************************************************/
  2. /* openxr_render_model_extension.h */
  3. /**************************************************************************/
  4. /* This file is part of: */
  5. /* GODOT ENGINE */
  6. /* https://godotengine.org */
  7. /**************************************************************************/
  8. /* Copyright (c) 2014-present Godot Engine contributors (see AUTHORS.md). */
  9. /* Copyright (c) 2007-2014 Juan Linietsky, Ariel Manzur. */
  10. /* */
  11. /* Permission is hereby granted, free of charge, to any person obtaining */
  12. /* a copy of this software and associated documentation files (the */
  13. /* "Software"), to deal in the Software without restriction, including */
  14. /* without limitation the rights to use, copy, modify, merge, publish, */
  15. /* distribute, sublicense, and/or sell copies of the Software, and to */
  16. /* permit persons to whom the Software is furnished to do so, subject to */
  17. /* the following conditions: */
  18. /* */
  19. /* The above copyright notice and this permission notice shall be */
  20. /* included in all copies or substantial portions of the Software. */
  21. /* */
  22. /* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
  23. /* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
  24. /* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. */
  25. /* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
  26. /* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
  27. /* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
  28. /* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
  29. /**************************************************************************/
  30. #pragma once
  31. #include "modules/modules_enabled.gen.h"
  32. #ifdef MODULE_GLTF_ENABLED
  33. #include "../openxr_uuid.h"
  34. #include "../util.h"
  35. #include "core/templates/rid_owner.h"
  36. #include "modules/gltf/gltf_document.h"
  37. #include "openxr_extension_wrapper.h"
  38. #include "scene/3d/node_3d.h"
  39. #include "servers/xr/xr_pose.h"
  40. #include <openxr/openxr.h>
  41. class OpenXRRenderModelData : public RefCounted {
  42. GDCLASS(OpenXRRenderModelData, RefCounted);
  43. private:
  44. Ref<GLTFDocument> gltf_document;
  45. Ref<GLTFState> gltf_state;
  46. PackedStringArray node_names;
  47. public:
  48. Ref<GLTFState> get_gltf_state() { return gltf_state; }
  49. bool parse_gltf_document(const PackedByteArray &p_bytes);
  50. Node3D *new_scene_instance();
  51. void set_node_names(const PackedStringArray &p_node_names);
  52. PackedStringArray get_node_names() const;
  53. const String get_node_name(uint32_t p_node_index) const;
  54. OpenXRRenderModelData();
  55. ~OpenXRRenderModelData();
  56. };
  57. class OpenXRRenderModelExtension : public OpenXRExtensionWrapper {
  58. GDCLASS(OpenXRRenderModelExtension, OpenXRExtensionWrapper);
  59. protected:
  60. static void _bind_methods();
  61. public:
  62. static OpenXRRenderModelExtension *get_singleton();
  63. OpenXRRenderModelExtension();
  64. virtual ~OpenXRRenderModelExtension() override;
  65. virtual HashMap<String, bool *> get_requested_extensions(XrVersion p_version) override;
  66. virtual void on_instance_created(const XrInstance p_instance) override;
  67. virtual void on_session_created(const XrSession p_session) override;
  68. virtual void on_instance_destroyed() override;
  69. virtual void on_session_destroyed() override;
  70. virtual bool on_event_polled(const XrEventDataBuffer &event) override;
  71. virtual void on_sync_actions() override;
  72. bool is_active() const;
  73. // Render model.
  74. bool has_render_model(RID p_render_model) const;
  75. RID render_model_create(XrRenderModelIdEXT p_render_model_id);
  76. void render_model_destroy(RID p_render_model);
  77. TypedArray<RID> render_model_get_all();
  78. Node3D *render_model_new_scene_instance(RID p_render_model) const;
  79. PackedStringArray render_model_get_subaction_paths(RID p_render_model);
  80. XrPath render_model_get_top_level_path(RID p_render_model) const;
  81. String render_model_get_top_level_path_as_string(RID p_render_model) const;
  82. XRPose::TrackingConfidence render_model_get_confidence(RID p_render_model) const;
  83. Transform3D render_model_get_root_transform(RID p_render_model) const;
  84. uint32_t render_model_get_animatable_node_count(RID p_render_model) const;
  85. String render_model_get_animatable_node_name(RID p_render_model, uint32_t p_index) const;
  86. bool render_model_is_animatable_node_visible(RID p_render_model, uint32_t p_index) const;
  87. Transform3D render_model_get_animatable_node_transform(RID p_render_model, uint32_t p_index) const;
  88. private:
  89. static OpenXRRenderModelExtension *singleton;
  90. // Related extensions.
  91. bool uuid_ext = false;
  92. bool render_model_ext = false;
  93. bool interaction_render_model_ext = false;
  94. // XrSync status
  95. bool xr_sync_has_run = false;
  96. // Interaction data.
  97. bool _interaction_data_dirty = true;
  98. HashMap<XrRenderModelIdEXT, RID> interaction_render_models;
  99. void _clear_interaction_data();
  100. bool _update_interaction_data();
  101. // Render model.
  102. Vector<XrPath> toplevel_paths;
  103. struct RenderModel {
  104. XrRenderModelIdEXT xr_render_model_id = XR_NULL_RENDER_MODEL_ID_EXT;
  105. XrRenderModelEXT xr_render_model = XR_NULL_HANDLE;
  106. uint32_t animatable_node_count = 0;
  107. Ref<OpenXRRenderModelData> render_model_data;
  108. XrSpace xr_space = XR_NULL_HANDLE;
  109. XRPose::TrackingConfidence confidence = XRPose::TrackingConfidence::XR_TRACKING_CONFIDENCE_NONE;
  110. Transform3D root_transform;
  111. LocalVector<XrRenderModelNodeStateEXT> node_states;
  112. XrPath top_level_path = XR_NULL_PATH;
  113. };
  114. mutable RID_Owner<RenderModel, true> render_model_owner;
  115. // GLTF asset cache
  116. HashMap<XrUuidEXT, Ref<OpenXRRenderModelData>, HashMapHasherXrUuidEXT> render_model_data_cache;
  117. Ref<OpenXRRenderModelData> _get_render_model_data(XrUuidEXT p_cache_id, uint32_t p_animatable_node_count);
  118. Ref<OpenXRRenderModelData> _load_asset(XrRenderModelAssetEXT p_asset, uint32_t p_animatable_node_count);
  119. void _clear_render_model_data();
  120. // GDScript/GDExtension passthroughs
  121. RID _render_model_create(uint64_t p_render_model_id);
  122. // OpenXR API call wrappers
  123. EXT_PROTO_XRRESULT_FUNC3(xrCreateRenderModelEXT, (XrSession), session, (const XrRenderModelCreateInfoEXT *), createInfo, (XrRenderModelEXT *), renderModel);
  124. EXT_PROTO_XRRESULT_FUNC1(xrDestroyRenderModelEXT, (XrRenderModelEXT), renderModel);
  125. EXT_PROTO_XRRESULT_FUNC3(xrGetRenderModelPropertiesEXT, (XrRenderModelEXT), renderModel, (const XrRenderModelPropertiesGetInfoEXT *), getInfo, (XrRenderModelPropertiesEXT *), properties);
  126. EXT_PROTO_XRRESULT_FUNC3(xrCreateRenderModelSpaceEXT, (XrSession), session, (const XrRenderModelSpaceCreateInfoEXT *), createInfo, (XrSpace *), space);
  127. EXT_PROTO_XRRESULT_FUNC3(xrCreateRenderModelAssetEXT, (XrSession), session, (const XrRenderModelAssetCreateInfoEXT *), createInfo, (XrRenderModelAssetEXT *), asset);
  128. EXT_PROTO_XRRESULT_FUNC1(xrDestroyRenderModelAssetEXT, (XrRenderModelAssetEXT), asset);
  129. EXT_PROTO_XRRESULT_FUNC3(xrGetRenderModelAssetDataEXT, (XrRenderModelAssetEXT), asset, (const XrRenderModelAssetDataGetInfoEXT *), getInfo, (XrRenderModelAssetDataEXT *), buffer);
  130. EXT_PROTO_XRRESULT_FUNC3(xrGetRenderModelAssetPropertiesEXT, (XrRenderModelAssetEXT), asset, (const XrRenderModelAssetPropertiesGetInfoEXT *), getInfo, (XrRenderModelAssetPropertiesEXT *), properties);
  131. EXT_PROTO_XRRESULT_FUNC3(xrGetRenderModelStateEXT, (XrRenderModelEXT), renderModel, (const XrRenderModelStateGetInfoEXT *), getInfo, (XrRenderModelStateEXT *), state);
  132. EXT_PROTO_XRRESULT_FUNC5(xrEnumerateInteractionRenderModelIdsEXT, (XrSession), session, (const XrInteractionRenderModelIdsEnumerateInfoEXT *), getInfo, (uint32_t), renderModelIdCapacityInput, (uint32_t *), renderModelIdCountOutput, (XrRenderModelIdEXT *), renderModelIds);
  133. EXT_PROTO_XRRESULT_FUNC5(xrEnumerateRenderModelSubactionPathsEXT, (XrRenderModelEXT), renderModel, (const XrInteractionRenderModelSubactionPathInfoEXT *), info, (uint32_t), pathCapacityInput, (uint32_t *), pathCountOutput, (XrPath *), paths);
  134. EXT_PROTO_XRRESULT_FUNC3(xrGetRenderModelPoseTopLevelUserPathEXT, (XrRenderModelEXT), renderModel, (const XrInteractionRenderModelTopLevelUserPathGetInfoEXT *), info, (XrPath *), topLevelUserPath);
  135. EXT_PROTO_XRRESULT_FUNC4(xrLocateSpace, (XrSpace), space, (XrSpace), baseSpace, (XrTime), time, (XrSpaceLocation *), location);
  136. EXT_PROTO_XRRESULT_FUNC1(xrDestroySpace, (XrSpace), space);
  137. EXT_PROTO_XRRESULT_FUNC5(xrPathToString, (XrInstance), instance, (XrPath), path, (uint32_t), bufferCapacityInput, (uint32_t *), bufferCountOutput, (char *), buffer);
  138. };
  139. #endif // MODULE_GLTF_ENABLED