2
0
Эх сурвалжийг харах

Merge pull request #87546 from dsnopek/openxr-hand-tracking-vendor-extensions

OpenXR: Make it possible to implement vendor extensions to hand tracking from GDExtension
Rémi Verschelde 1 жил өмнө
parent
commit
1c916c3d5b

+ 8 - 0
modules/openxr/doc_classes/OpenXRExtensionWrapperExtension.xml

@@ -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*" />

+ 1 - 0
modules/openxr/extensions/openxr_extension_wrapper.h

@@ -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

+ 11 - 0
modules/openxr/extensions/openxr_extension_wrapper_extension.cpp

@@ -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);
 }
 }

+ 2 - 0
modules/openxr/extensions/openxr_extension_wrapper_extension.h

@@ -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;

+ 8 - 0
modules/openxr/extensions/openxr_hand_tracking_extension.cpp

@@ -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;

+ 4 - 0
modules/openxr/openxr_api.cpp

@@ -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();

+ 1 - 0
modules/openxr/openxr_api.h

@@ -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();