Path: blob/master/modules/openxr/extensions/openxr_extension_wrapper.cpp
10278 views
/**************************************************************************/1/* openxr_extension_wrapper.cpp */2/**************************************************************************/3/* This file is part of: */4/* GODOT ENGINE */5/* https://godotengine.org */6/**************************************************************************/7/* Copyright (c) 2014-present Godot Engine contributors (see AUTHORS.md). */8/* Copyright (c) 2007-2014 Juan Linietsky, Ariel Manzur. */9/* */10/* Permission is hereby granted, free of charge, to any person obtaining */11/* a copy of this software and associated documentation files (the */12/* "Software"), to deal in the Software without restriction, including */13/* without limitation the rights to use, copy, modify, merge, publish, */14/* distribute, sublicense, and/or sell copies of the Software, and to */15/* permit persons to whom the Software is furnished to do so, subject to */16/* the following conditions: */17/* */18/* The above copyright notice and this permission notice shall be */19/* included in all copies or substantial portions of the Software. */20/* */21/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */22/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */23/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. */24/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */25/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */26/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */27/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */28/**************************************************************************/2930#include "openxr_extension_wrapper.h"3132#include "../openxr_api.h"33#include "../openxr_api_extension.h"3435void OpenXRExtensionWrapper::_bind_methods() {36GDVIRTUAL_BIND(_get_requested_extensions);37GDVIRTUAL_BIND(_set_system_properties_and_get_next_pointer, "next_pointer");38GDVIRTUAL_BIND(_set_instance_create_info_and_get_next_pointer, "next_pointer");39GDVIRTUAL_BIND(_set_session_create_and_get_next_pointer, "next_pointer");40GDVIRTUAL_BIND(_set_swapchain_create_info_and_get_next_pointer, "next_pointer");41GDVIRTUAL_BIND(_set_hand_joint_locations_and_get_next_pointer, "hand_index", "next_pointer");42GDVIRTUAL_BIND(_set_projection_views_and_get_next_pointer, "view_index", "next_pointer");43GDVIRTUAL_BIND(_set_frame_wait_info_and_get_next_pointer, "next_pointer");44GDVIRTUAL_BIND(_set_frame_end_info_and_get_next_pointer, "next_pointer");45GDVIRTUAL_BIND(_set_view_locate_info_and_get_next_pointer, "next_pointer");46GDVIRTUAL_BIND(_set_reference_space_create_info_and_get_next_pointer, "reference_space_type", "next_pointer");47GDVIRTUAL_BIND(_get_composition_layer_count);48GDVIRTUAL_BIND(_get_composition_layer, "index");49GDVIRTUAL_BIND(_get_composition_layer_order, "index");50GDVIRTUAL_BIND(_get_suggested_tracker_names);51GDVIRTUAL_BIND(_on_register_metadata);52GDVIRTUAL_BIND(_on_before_instance_created);53GDVIRTUAL_BIND(_on_instance_created, "instance");54GDVIRTUAL_BIND(_on_instance_destroyed);55GDVIRTUAL_BIND(_on_session_created, "session");56GDVIRTUAL_BIND(_on_process);57GDVIRTUAL_BIND(_on_sync_actions);58GDVIRTUAL_BIND(_on_pre_render);59GDVIRTUAL_BIND(_on_main_swapchains_created);60GDVIRTUAL_BIND(_on_pre_draw_viewport, "viewport");61GDVIRTUAL_BIND(_on_post_draw_viewport, "viewport");62GDVIRTUAL_BIND(_on_session_destroyed);63GDVIRTUAL_BIND(_on_state_idle);64GDVIRTUAL_BIND(_on_state_ready);65GDVIRTUAL_BIND(_on_state_synchronized);66GDVIRTUAL_BIND(_on_state_visible);67GDVIRTUAL_BIND(_on_state_focused);68GDVIRTUAL_BIND(_on_state_stopping);69GDVIRTUAL_BIND(_on_state_loss_pending);70GDVIRTUAL_BIND(_on_state_exiting);71GDVIRTUAL_BIND(_on_event_polled, "event");72GDVIRTUAL_BIND(_set_viewport_composition_layer_and_get_next_pointer, "layer", "property_values", "next_pointer");73GDVIRTUAL_BIND(_get_viewport_composition_layer_extension_properties);74GDVIRTUAL_BIND(_get_viewport_composition_layer_extension_property_defaults);75GDVIRTUAL_BIND(_on_viewport_composition_layer_destroyed, "layer");76GDVIRTUAL_BIND(_set_android_surface_swapchain_create_info_and_get_next_pointer, "property_values", "next_pointer");7778ClassDB::bind_method(D_METHOD("get_openxr_api"), &OpenXRExtensionWrapper::_gdextension_get_openxr_api);79ClassDB::bind_method(D_METHOD("register_extension_wrapper"), &OpenXRExtensionWrapper::_gdextension_register_extension_wrapper);80}8182HashMap<String, bool *> OpenXRExtensionWrapper::get_requested_extensions() {83Dictionary request_extension;8485if (GDVIRTUAL_CALL(_get_requested_extensions, request_extension)) {86HashMap<String, bool *> result;87for (const KeyValue<Variant, Variant> &kv : request_extension) {88GDExtensionPtr<bool> value = VariantCaster<GDExtensionPtr<bool>>::cast(kv.value);89result.insert(kv.key, value);90}91return result;92}9394return HashMap<String, bool *>();95}9697void *OpenXRExtensionWrapper::set_system_properties_and_get_next_pointer(void *p_next_pointer) {98uint64_t pointer;99100if (GDVIRTUAL_CALL(_set_system_properties_and_get_next_pointer, GDExtensionPtr<void>(p_next_pointer), pointer)) {101return reinterpret_cast<void *>(pointer);102}103104return nullptr;105}106107void *OpenXRExtensionWrapper::set_instance_create_info_and_get_next_pointer(void *p_next_pointer) {108uint64_t pointer;109110if (GDVIRTUAL_CALL(_set_instance_create_info_and_get_next_pointer, GDExtensionPtr<void>(p_next_pointer), pointer)) {111return reinterpret_cast<void *>(pointer);112}113114return nullptr;115}116117void *OpenXRExtensionWrapper::set_session_create_and_get_next_pointer(void *p_next_pointer) {118uint64_t pointer;119120if (GDVIRTUAL_CALL(_set_session_create_and_get_next_pointer, GDExtensionPtr<void>(p_next_pointer), pointer)) {121return reinterpret_cast<void *>(pointer);122}123124return nullptr;125}126127void *OpenXRExtensionWrapper::set_swapchain_create_info_and_get_next_pointer(void *p_next_pointer) {128uint64_t pointer;129130if (GDVIRTUAL_CALL(_set_swapchain_create_info_and_get_next_pointer, GDExtensionPtr<void>(p_next_pointer), pointer)) {131return reinterpret_cast<void *>(pointer);132}133134return nullptr;135}136137void *OpenXRExtensionWrapper::set_hand_joint_locations_and_get_next_pointer(int p_hand_index, void *p_next_pointer) {138uint64_t pointer;139140if (GDVIRTUAL_CALL(_set_hand_joint_locations_and_get_next_pointer, p_hand_index, GDExtensionPtr<void>(p_next_pointer), pointer)) {141return reinterpret_cast<void *>(pointer);142}143144return nullptr;145}146147void *OpenXRExtensionWrapper::set_projection_views_and_get_next_pointer(int p_view_index, void *p_next_pointer) {148uint64_t pointer = 0;149150if (GDVIRTUAL_CALL(_set_projection_views_and_get_next_pointer, p_view_index, GDExtensionPtr<void>(p_next_pointer), pointer)) {151return reinterpret_cast<void *>(pointer);152}153154return nullptr;155}156157void *OpenXRExtensionWrapper::set_reference_space_create_info_and_get_next_pointer(int p_reference_space_type, void *p_next_pointer) {158uint64_t pointer = 0;159160if (GDVIRTUAL_CALL(_set_reference_space_create_info_and_get_next_pointer, p_reference_space_type, GDExtensionPtr<void>(p_next_pointer), pointer)) {161return reinterpret_cast<void *>(pointer);162}163164return nullptr;165}166167void *OpenXRExtensionWrapper::set_frame_wait_info_and_get_next_pointer(void *p_next_pointer) {168uint64_t pointer = 0;169170if (GDVIRTUAL_CALL(_set_frame_wait_info_and_get_next_pointer, GDExtensionPtr<void>(p_next_pointer), pointer)) {171return reinterpret_cast<void *>(pointer);172}173174return nullptr;175}176177void *OpenXRExtensionWrapper::set_frame_end_info_and_get_next_pointer(void *p_next_pointer) {178uint64_t pointer = 0;179180if (GDVIRTUAL_CALL(_set_frame_end_info_and_get_next_pointer, GDExtensionPtr<void>(p_next_pointer), pointer)) {181return reinterpret_cast<void *>(pointer);182}183184return nullptr;185}186187void *OpenXRExtensionWrapper::set_view_locate_info_and_get_next_pointer(void *p_next_pointer) {188uint64_t pointer = 0;189190if (GDVIRTUAL_CALL(_set_view_locate_info_and_get_next_pointer, GDExtensionPtr<void>(p_next_pointer), pointer)) {191return reinterpret_cast<void *>(pointer);192}193194return nullptr;195}196197PackedStringArray OpenXRExtensionWrapper::get_suggested_tracker_names() {198PackedStringArray ret;199200if (GDVIRTUAL_CALL(_get_suggested_tracker_names, ret)) {201return ret;202}203204return PackedStringArray();205}206207int OpenXRExtensionWrapper::get_composition_layer_count() {208int count = 0;209GDVIRTUAL_CALL(_get_composition_layer_count, count);210return count;211}212213XrCompositionLayerBaseHeader *OpenXRExtensionWrapper::get_composition_layer(int p_index) {214uint64_t pointer;215216if (GDVIRTUAL_CALL(_get_composition_layer, p_index, pointer)) {217return reinterpret_cast<XrCompositionLayerBaseHeader *>(pointer);218}219220return nullptr;221}222223int OpenXRExtensionWrapper::get_composition_layer_order(int p_index) {224int order = 0;225GDVIRTUAL_CALL(_get_composition_layer_order, p_index, order);226return order;227}228229void OpenXRExtensionWrapper::on_register_metadata() {230GDVIRTUAL_CALL(_on_register_metadata);231}232233void OpenXRExtensionWrapper::on_before_instance_created() {234GDVIRTUAL_CALL(_on_before_instance_created);235}236237void OpenXRExtensionWrapper::on_instance_created(const XrInstance p_instance) {238uint64_t instance = (uint64_t)p_instance;239GDVIRTUAL_CALL(_on_instance_created, instance);240}241242void OpenXRExtensionWrapper::on_instance_destroyed() {243GDVIRTUAL_CALL(_on_instance_destroyed);244}245246void OpenXRExtensionWrapper::on_session_created(const XrSession p_session) {247uint64_t session = (uint64_t)p_session;248GDVIRTUAL_CALL(_on_session_created, session);249}250251void OpenXRExtensionWrapper::on_process() {252GDVIRTUAL_CALL(_on_process);253}254255void OpenXRExtensionWrapper::on_sync_actions() {256GDVIRTUAL_CALL(_on_sync_actions);257}258259void OpenXRExtensionWrapper::on_pre_render() {260GDVIRTUAL_CALL(_on_pre_render);261}262263void OpenXRExtensionWrapper::on_main_swapchains_created() {264GDVIRTUAL_CALL(_on_main_swapchains_created);265}266267void OpenXRExtensionWrapper::on_session_destroyed() {268GDVIRTUAL_CALL(_on_session_destroyed);269}270271void OpenXRExtensionWrapper::on_pre_draw_viewport(RID p_render_target) {272GDVIRTUAL_CALL(_on_pre_draw_viewport, p_render_target);273}274275void OpenXRExtensionWrapper::on_post_draw_viewport(RID p_render_target) {276GDVIRTUAL_CALL(_on_post_draw_viewport, p_render_target);277}278279void OpenXRExtensionWrapper::on_state_idle() {280GDVIRTUAL_CALL(_on_state_idle);281}282283void OpenXRExtensionWrapper::on_state_ready() {284GDVIRTUAL_CALL(_on_state_ready);285}286287void OpenXRExtensionWrapper::on_state_synchronized() {288GDVIRTUAL_CALL(_on_state_synchronized);289}290291void OpenXRExtensionWrapper::on_state_visible() {292GDVIRTUAL_CALL(_on_state_visible);293}294295void OpenXRExtensionWrapper::on_state_focused() {296GDVIRTUAL_CALL(_on_state_focused);297}298299void OpenXRExtensionWrapper::on_state_stopping() {300GDVIRTUAL_CALL(_on_state_stopping);301}302303void OpenXRExtensionWrapper::on_state_loss_pending() {304GDVIRTUAL_CALL(_on_state_loss_pending);305}306307void OpenXRExtensionWrapper::on_state_exiting() {308GDVIRTUAL_CALL(_on_state_exiting);309}310311bool OpenXRExtensionWrapper::on_event_polled(const XrEventDataBuffer &p_event) {312bool event_polled;313314if (GDVIRTUAL_CALL(_on_event_polled, GDExtensionConstPtr<void>(&p_event), event_polled)) {315return event_polled;316}317318return false;319}320321void *OpenXRExtensionWrapper::set_viewport_composition_layer_and_get_next_pointer(const XrCompositionLayerBaseHeader *p_layer, const Dictionary &p_property_values, void *p_next_pointer) {322uint64_t pointer = 0;323324if (GDVIRTUAL_CALL(_set_viewport_composition_layer_and_get_next_pointer, GDExtensionConstPtr<void>(p_layer), p_property_values, GDExtensionPtr<void>(p_next_pointer), pointer)) {325return reinterpret_cast<void *>(pointer);326}327328return p_next_pointer;329}330331void OpenXRExtensionWrapper::on_viewport_composition_layer_destroyed(const XrCompositionLayerBaseHeader *p_layer) {332GDVIRTUAL_CALL(_on_viewport_composition_layer_destroyed, GDExtensionConstPtr<void>(p_layer));333}334335void OpenXRExtensionWrapper::get_viewport_composition_layer_extension_properties(List<PropertyInfo> *p_property_list) {336TypedArray<Dictionary> properties;337338if (GDVIRTUAL_CALL(_get_viewport_composition_layer_extension_properties, properties)) {339for (int i = 0; i < properties.size(); i++) {340p_property_list->push_back(PropertyInfo::from_dict(properties[i]));341}342}343}344345Dictionary OpenXRExtensionWrapper::get_viewport_composition_layer_extension_property_defaults() {346Dictionary property_defaults;347GDVIRTUAL_CALL(_get_viewport_composition_layer_extension_property_defaults, property_defaults);348return property_defaults;349}350351void *OpenXRExtensionWrapper::set_android_surface_swapchain_create_info_and_get_next_pointer(const Dictionary &p_property_values, void *p_next_pointer) {352uint64_t pointer = 0;353354if (GDVIRTUAL_CALL(_set_android_surface_swapchain_create_info_and_get_next_pointer, p_property_values, GDExtensionPtr<void>(p_next_pointer), pointer)) {355return reinterpret_cast<void *>(pointer);356}357358return p_next_pointer;359}360361Ref<OpenXRAPIExtension> OpenXRExtensionWrapper::_gdextension_get_openxr_api() {362static Ref<OpenXRAPIExtension> openxr_api_extension;363if (unlikely(openxr_api_extension.is_null())) {364openxr_api_extension.instantiate();365}366return openxr_api_extension;367}368369void OpenXRExtensionWrapper::_gdextension_register_extension_wrapper() {370OpenXRAPI::register_extension_wrapper(this);371}372373374