Merge pull request #87546 from dsnopek/openxr-hand-tracking-vendor-extensions
OpenXR: Make it possible to implement vendor extensions to hand tracking from GDExtension
This commit is contained in:
commit
1c916c3d5b
@ -123,6 +123,14 @@
|
|||||||
Called when the OpenXR session state is changed to visible. This means OpenXR is now ready to receive frames.
|
Called when the OpenXR session state is changed to visible. This means OpenXR is now ready to receive frames.
|
||||||
</description>
|
</description>
|
||||||
</method>
|
</method>
|
||||||
|
<method name="_set_hand_joint_locations_and_get_next_pointer" qualifiers="virtual">
|
||||||
|
<return type="int" />
|
||||||
|
<param index="0" name="hand_index" type="int" />
|
||||||
|
<param index="1" name="next_pointer" type="void*" />
|
||||||
|
<description>
|
||||||
|
Adds additional data structures when each hand tracker is created.
|
||||||
|
</description>
|
||||||
|
</method>
|
||||||
<method name="_set_instance_create_info_and_get_next_pointer" qualifiers="virtual">
|
<method name="_set_instance_create_info_and_get_next_pointer" qualifiers="virtual">
|
||||||
<return type="int" />
|
<return type="int" />
|
||||||
<param index="0" name="next_pointer" type="void*" />
|
<param index="0" name="next_pointer" type="void*" />
|
||||||
|
@ -60,6 +60,7 @@ public:
|
|||||||
virtual void *set_instance_create_info_and_get_next_pointer(void *p_next_pointer) { return p_next_pointer; } // Add additional data structures when we create our OpenXR instance.
|
virtual void *set_instance_create_info_and_get_next_pointer(void *p_next_pointer) { return p_next_pointer; } // Add additional data structures when we create our OpenXR instance.
|
||||||
virtual void *set_session_create_and_get_next_pointer(void *p_next_pointer) { return p_next_pointer; } // Add additional data structures when we create our OpenXR session.
|
virtual void *set_session_create_and_get_next_pointer(void *p_next_pointer) { return p_next_pointer; } // Add additional data structures when we create our OpenXR session.
|
||||||
virtual void *set_swapchain_create_info_and_get_next_pointer(void *p_next_pointer) { return p_next_pointer; } // Add additional data structures when creating OpenXR swap chains.
|
virtual void *set_swapchain_create_info_and_get_next_pointer(void *p_next_pointer) { return p_next_pointer; } // Add additional data structures when creating OpenXR swap chains.
|
||||||
|
virtual void *set_hand_joint_locations_and_get_next_pointer(int p_hand_index, void *p_next_pointer) { return p_next_pointer; }
|
||||||
|
|
||||||
// `on_register_metadata` allows extensions to register additional controller metadata.
|
// `on_register_metadata` allows extensions to register additional controller metadata.
|
||||||
// This function is called even when OpenXRApi is not constructured as the metadata
|
// This function is called even when OpenXRApi is not constructured as the metadata
|
||||||
|
@ -38,6 +38,7 @@ void OpenXRExtensionWrapperExtension::_bind_methods() {
|
|||||||
GDVIRTUAL_BIND(_set_instance_create_info_and_get_next_pointer, "next_pointer");
|
GDVIRTUAL_BIND(_set_instance_create_info_and_get_next_pointer, "next_pointer");
|
||||||
GDVIRTUAL_BIND(_set_session_create_and_get_next_pointer, "next_pointer");
|
GDVIRTUAL_BIND(_set_session_create_and_get_next_pointer, "next_pointer");
|
||||||
GDVIRTUAL_BIND(_set_swapchain_create_info_and_get_next_pointer, "next_pointer");
|
GDVIRTUAL_BIND(_set_swapchain_create_info_and_get_next_pointer, "next_pointer");
|
||||||
|
GDVIRTUAL_BIND(_set_hand_joint_locations_and_get_next_pointer, "hand_index", "next_pointer");
|
||||||
GDVIRTUAL_BIND(_on_register_metadata);
|
GDVIRTUAL_BIND(_on_register_metadata);
|
||||||
GDVIRTUAL_BIND(_on_before_instance_created);
|
GDVIRTUAL_BIND(_on_before_instance_created);
|
||||||
GDVIRTUAL_BIND(_on_instance_created, "instance");
|
GDVIRTUAL_BIND(_on_instance_created, "instance");
|
||||||
@ -117,6 +118,16 @@ void *OpenXRExtensionWrapperExtension::set_swapchain_create_info_and_get_next_po
|
|||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void *OpenXRExtensionWrapperExtension::set_hand_joint_locations_and_get_next_pointer(int p_hand_index, void *p_next_pointer) {
|
||||||
|
uint64_t pointer;
|
||||||
|
|
||||||
|
if (GDVIRTUAL_CALL(_set_hand_joint_locations_and_get_next_pointer, p_hand_index, GDExtensionPtr<void>(p_next_pointer), pointer)) {
|
||||||
|
return reinterpret_cast<void *>(pointer);
|
||||||
|
}
|
||||||
|
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
void OpenXRExtensionWrapperExtension::on_register_metadata() {
|
void OpenXRExtensionWrapperExtension::on_register_metadata() {
|
||||||
GDVIRTUAL_CALL(_on_register_metadata);
|
GDVIRTUAL_CALL(_on_register_metadata);
|
||||||
}
|
}
|
||||||
|
@ -58,12 +58,14 @@ public:
|
|||||||
virtual void *set_instance_create_info_and_get_next_pointer(void *p_next_pointer) override;
|
virtual void *set_instance_create_info_and_get_next_pointer(void *p_next_pointer) override;
|
||||||
virtual void *set_session_create_and_get_next_pointer(void *p_next_pointer) override;
|
virtual void *set_session_create_and_get_next_pointer(void *p_next_pointer) override;
|
||||||
virtual void *set_swapchain_create_info_and_get_next_pointer(void *p_next_pointer) override;
|
virtual void *set_swapchain_create_info_and_get_next_pointer(void *p_next_pointer) override;
|
||||||
|
virtual void *set_hand_joint_locations_and_get_next_pointer(int p_hand_index, void *p_next_pointer) override;
|
||||||
|
|
||||||
//TODO workaround as GDExtensionPtr<void> return type results in build error in godot-cpp
|
//TODO workaround as GDExtensionPtr<void> return type results in build error in godot-cpp
|
||||||
GDVIRTUAL1R(uint64_t, _set_system_properties_and_get_next_pointer, GDExtensionPtr<void>);
|
GDVIRTUAL1R(uint64_t, _set_system_properties_and_get_next_pointer, GDExtensionPtr<void>);
|
||||||
GDVIRTUAL1R(uint64_t, _set_instance_create_info_and_get_next_pointer, GDExtensionPtr<void>);
|
GDVIRTUAL1R(uint64_t, _set_instance_create_info_and_get_next_pointer, GDExtensionPtr<void>);
|
||||||
GDVIRTUAL1R(uint64_t, _set_session_create_and_get_next_pointer, GDExtensionPtr<void>);
|
GDVIRTUAL1R(uint64_t, _set_session_create_and_get_next_pointer, GDExtensionPtr<void>);
|
||||||
GDVIRTUAL1R(uint64_t, _set_swapchain_create_info_and_get_next_pointer, GDExtensionPtr<void>);
|
GDVIRTUAL1R(uint64_t, _set_swapchain_create_info_and_get_next_pointer, GDExtensionPtr<void>);
|
||||||
|
GDVIRTUAL2R(uint64_t, _set_hand_joint_locations_and_get_next_pointer, int, GDExtensionPtr<void>);
|
||||||
|
|
||||||
virtual void on_register_metadata() override;
|
virtual void on_register_metadata() override;
|
||||||
virtual void on_before_instance_created() override;
|
virtual void on_before_instance_created() override;
|
||||||
|
@ -179,6 +179,14 @@ void OpenXRHandTrackingExtension::on_process() {
|
|||||||
next_pointer = &hand_trackers[i].data_source;
|
next_pointer = &hand_trackers[i].data_source;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Needed for vendor hand tracking extensions implemented from GDExtension.
|
||||||
|
for (OpenXRExtensionWrapper *wrapper : OpenXRAPI::get_singleton()->get_registered_extension_wrappers()) {
|
||||||
|
void *np = wrapper->set_hand_joint_locations_and_get_next_pointer(i, next_pointer);
|
||||||
|
if (np != nullptr) {
|
||||||
|
next_pointer = np;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
hand_trackers[i].locations.type = XR_TYPE_HAND_JOINT_LOCATIONS_EXT;
|
hand_trackers[i].locations.type = XR_TYPE_HAND_JOINT_LOCATIONS_EXT;
|
||||||
hand_trackers[i].locations.next = next_pointer;
|
hand_trackers[i].locations.next = next_pointer;
|
||||||
hand_trackers[i].locations.isActive = false;
|
hand_trackers[i].locations.isActive = false;
|
||||||
|
@ -1497,6 +1497,10 @@ void OpenXRAPI::unregister_extension_wrapper(OpenXRExtensionWrapper *p_extension
|
|||||||
registered_extension_wrappers.erase(p_extension_wrapper);
|
registered_extension_wrappers.erase(p_extension_wrapper);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const Vector<OpenXRExtensionWrapper *> &OpenXRAPI::get_registered_extension_wrappers() {
|
||||||
|
return registered_extension_wrappers;
|
||||||
|
}
|
||||||
|
|
||||||
void OpenXRAPI::register_extension_metadata() {
|
void OpenXRAPI::register_extension_metadata() {
|
||||||
for (OpenXRExtensionWrapper *extension_wrapper : registered_extension_wrappers) {
|
for (OpenXRExtensionWrapper *extension_wrapper : registered_extension_wrappers) {
|
||||||
extension_wrapper->on_register_metadata();
|
extension_wrapper->on_register_metadata();
|
||||||
|
@ -329,6 +329,7 @@ public:
|
|||||||
void set_xr_interface(OpenXRInterface *p_xr_interface);
|
void set_xr_interface(OpenXRInterface *p_xr_interface);
|
||||||
static void register_extension_wrapper(OpenXRExtensionWrapper *p_extension_wrapper);
|
static void register_extension_wrapper(OpenXRExtensionWrapper *p_extension_wrapper);
|
||||||
static void unregister_extension_wrapper(OpenXRExtensionWrapper *p_extension_wrapper);
|
static void unregister_extension_wrapper(OpenXRExtensionWrapper *p_extension_wrapper);
|
||||||
|
static const Vector<OpenXRExtensionWrapper *> &get_registered_extension_wrappers();
|
||||||
static void register_extension_metadata();
|
static void register_extension_metadata();
|
||||||
static void cleanup_extension_wrappers();
|
static void cleanup_extension_wrappers();
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user