2023-01-05 13:25:55 +01:00
/**************************************************************************/
/* openxr_interaction_profile.cpp */
/**************************************************************************/
/* 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. */
/**************************************************************************/
2021-12-14 02:44:12 +01:00
# include "openxr_interaction_profile.h"
void OpenXRIPBinding : : _bind_methods ( ) {
ClassDB : : bind_method ( D_METHOD ( " set_action " , " action " ) , & OpenXRIPBinding : : set_action ) ;
ClassDB : : bind_method ( D_METHOD ( " get_action " ) , & OpenXRIPBinding : : get_action ) ;
ADD_PROPERTY ( PropertyInfo ( Variant : : OBJECT , " action " , PROPERTY_HINT_RESOURCE_TYPE , " OpenXRAction " ) , " set_action " , " get_action " ) ;
2022-03-17 00:24:47 +01:00
ClassDB : : bind_method ( D_METHOD ( " get_path_count " ) , & OpenXRIPBinding : : get_path_count ) ;
2021-12-14 02:44:12 +01:00
ClassDB : : bind_method ( D_METHOD ( " set_paths " , " paths " ) , & OpenXRIPBinding : : set_paths ) ;
ClassDB : : bind_method ( D_METHOD ( " get_paths " ) , & OpenXRIPBinding : : get_paths ) ;
2022-08-11 00:59:47 +02:00
ADD_PROPERTY ( PropertyInfo ( Variant : : PACKED_STRING_ARRAY , " paths " ) , " set_paths " , " get_paths " ) ;
2022-03-17 00:24:47 +01:00
2022-07-26 20:42:38 +02:00
ClassDB : : bind_method ( D_METHOD ( " has_path " , " path " ) , & OpenXRIPBinding : : has_path ) ;
2022-03-17 00:24:47 +01:00
ClassDB : : bind_method ( D_METHOD ( " add_path " , " path " ) , & OpenXRIPBinding : : add_path ) ;
ClassDB : : bind_method ( D_METHOD ( " remove_path " , " path " ) , & OpenXRIPBinding : : remove_path ) ;
2021-12-14 02:44:12 +01:00
}
Ref < OpenXRIPBinding > OpenXRIPBinding : : new_binding ( const Ref < OpenXRAction > p_action , const char * p_paths ) {
// This is a helper function to help build our default action sets
Ref < OpenXRIPBinding > binding ;
binding . instantiate ( ) ;
binding - > set_action ( p_action ) ;
binding - > parse_paths ( String ( p_paths ) ) ;
return binding ;
}
void OpenXRIPBinding : : set_action ( const Ref < OpenXRAction > p_action ) {
action = p_action ;
2022-11-11 15:59:22 +01:00
emit_changed ( ) ;
2021-12-14 02:44:12 +01:00
}
Ref < OpenXRAction > OpenXRIPBinding : : get_action ( ) const {
return action ;
}
2022-03-17 00:24:47 +01:00
int OpenXRIPBinding : : get_path_count ( ) const {
return paths . size ( ) ;
}
2021-12-14 02:44:12 +01:00
void OpenXRIPBinding : : set_paths ( const PackedStringArray p_paths ) {
paths = p_paths ;
2022-11-11 15:59:22 +01:00
emit_changed ( ) ;
2021-12-14 02:44:12 +01:00
}
PackedStringArray OpenXRIPBinding : : get_paths ( ) const {
return paths ;
}
void OpenXRIPBinding : : parse_paths ( const String p_paths ) {
paths = p_paths . split ( " , " , false ) ;
2022-11-11 15:59:22 +01:00
emit_changed ( ) ;
2021-12-14 02:44:12 +01:00
}
2022-03-17 00:24:47 +01:00
bool OpenXRIPBinding : : has_path ( const String p_path ) const {
return paths . has ( p_path ) ;
}
void OpenXRIPBinding : : add_path ( const String p_path ) {
if ( ! paths . has ( p_path ) ) {
paths . push_back ( p_path ) ;
2022-11-11 15:59:22 +01:00
emit_changed ( ) ;
2022-03-17 00:24:47 +01:00
}
}
void OpenXRIPBinding : : remove_path ( const String p_path ) {
if ( paths . has ( p_path ) ) {
paths . erase ( p_path ) ;
2022-11-11 15:59:22 +01:00
emit_changed ( ) ;
2022-03-17 00:24:47 +01:00
}
}
2021-12-14 02:44:12 +01:00
OpenXRIPBinding : : ~ OpenXRIPBinding ( ) {
action . unref ( ) ;
}
void OpenXRInteractionProfile : : _bind_methods ( ) {
ClassDB : : bind_method ( D_METHOD ( " set_interaction_profile_path " , " interaction_profile_path " ) , & OpenXRInteractionProfile : : set_interaction_profile_path ) ;
ClassDB : : bind_method ( D_METHOD ( " get_interaction_profile_path " ) , & OpenXRInteractionProfile : : get_interaction_profile_path ) ;
ADD_PROPERTY ( PropertyInfo ( Variant : : STRING , " interaction_profile_path " ) , " set_interaction_profile_path " , " get_interaction_profile_path " ) ;
2022-03-17 00:24:47 +01:00
ClassDB : : bind_method ( D_METHOD ( " get_binding_count " ) , & OpenXRInteractionProfile : : get_binding_count ) ;
ClassDB : : bind_method ( D_METHOD ( " get_binding " , " index " ) , & OpenXRInteractionProfile : : get_binding ) ;
2021-12-14 02:44:12 +01:00
ClassDB : : bind_method ( D_METHOD ( " set_bindings " , " bindings " ) , & OpenXRInteractionProfile : : set_bindings ) ;
ClassDB : : bind_method ( D_METHOD ( " get_bindings " ) , & OpenXRInteractionProfile : : get_bindings ) ;
ADD_PROPERTY ( PropertyInfo ( Variant : : ARRAY , " bindings " , PROPERTY_HINT_RESOURCE_TYPE , " OpenXRIPBinding " , PROPERTY_USAGE_NO_EDITOR ) , " set_bindings " , " get_bindings " ) ;
}
Ref < OpenXRInteractionProfile > OpenXRInteractionProfile : : new_profile ( const char * p_input_profile_path ) {
Ref < OpenXRInteractionProfile > profile ;
profile . instantiate ( ) ;
profile - > set_interaction_profile_path ( String ( p_input_profile_path ) ) ;
return profile ;
}
void OpenXRInteractionProfile : : set_interaction_profile_path ( const String p_input_profile_path ) {
2023-07-17 08:36:01 +02:00
OpenXRInteractionProfileMetadata * pmd = OpenXRInteractionProfileMetadata : : get_singleton ( ) ;
2024-07-10 06:41:37 +02:00
if ( pmd ) {
interaction_profile_path = pmd - > check_profile_name ( p_input_profile_path ) ;
} else {
// OpenXR module not enabled, ignore checks.
interaction_profile_path = p_input_profile_path ;
}
2022-11-11 15:59:22 +01:00
emit_changed ( ) ;
2021-12-14 02:44:12 +01:00
}
String OpenXRInteractionProfile : : get_interaction_profile_path ( ) const {
return interaction_profile_path ;
}
2022-03-17 00:24:47 +01:00
int OpenXRInteractionProfile : : get_binding_count ( ) const {
return bindings . size ( ) ;
}
Ref < OpenXRIPBinding > OpenXRInteractionProfile : : get_binding ( int p_index ) const {
ERR_FAIL_INDEX_V ( p_index , bindings . size ( ) , Ref < OpenXRIPBinding > ( ) ) ;
return bindings [ p_index ] ;
}
2021-12-14 02:44:12 +01:00
void OpenXRInteractionProfile : : set_bindings ( Array p_bindings ) {
2022-03-17 00:24:47 +01:00
// TODO add check here that our bindings don't contain duplicate actions
2022-11-11 15:59:22 +01:00
bindings = p_bindings ;
emit_changed ( ) ;
2021-12-14 02:44:12 +01:00
}
Array OpenXRInteractionProfile : : get_bindings ( ) const {
return bindings ;
}
2022-03-17 00:24:47 +01:00
Ref < OpenXRIPBinding > OpenXRInteractionProfile : : get_binding_for_action ( const Ref < OpenXRAction > p_action ) const {
for ( int i = 0 ; i < bindings . size ( ) ; i + + ) {
Ref < OpenXRIPBinding > binding = bindings [ i ] ;
if ( binding - > get_action ( ) = = p_action ) {
return binding ;
}
}
return Ref < OpenXRIPBinding > ( ) ;
}
2021-12-14 02:44:12 +01:00
void OpenXRInteractionProfile : : add_binding ( Ref < OpenXRIPBinding > p_binding ) {
ERR_FAIL_COND ( p_binding . is_null ( ) ) ;
2024-05-06 16:20:20 +02:00
if ( ! bindings . has ( p_binding ) ) {
2022-03-17 00:24:47 +01:00
ERR_FAIL_COND_MSG ( get_binding_for_action ( p_binding - > get_action ( ) ) . is_valid ( ) , " There is already a binding for this action in this interaction profile " ) ;
2021-12-14 02:44:12 +01:00
bindings . push_back ( p_binding ) ;
2022-11-11 15:59:22 +01:00
emit_changed ( ) ;
2021-12-14 02:44:12 +01:00
}
}
void OpenXRInteractionProfile : : remove_binding ( Ref < OpenXRIPBinding > p_binding ) {
int idx = bindings . find ( p_binding ) ;
if ( idx ! = - 1 ) {
bindings . remove_at ( idx ) ;
2022-11-11 15:59:22 +01:00
emit_changed ( ) ;
2021-12-14 02:44:12 +01:00
}
}
void OpenXRInteractionProfile : : add_new_binding ( const Ref < OpenXRAction > p_action , const char * p_paths ) {
// This is a helper function to help build our default action sets
Ref < OpenXRIPBinding > binding = OpenXRIPBinding : : new_binding ( p_action , p_paths ) ;
add_binding ( binding ) ;
}
2022-03-17 00:24:47 +01:00
void OpenXRInteractionProfile : : remove_binding_for_action ( const Ref < OpenXRAction > p_action ) {
for ( int i = bindings . size ( ) - 1 ; i > = 0 ; i - - ) {
Ref < OpenXRIPBinding > binding = bindings [ i ] ;
if ( binding - > get_action ( ) = = p_action ) {
remove_binding ( binding ) ;
}
}
}
2022-11-11 15:59:22 +01:00
bool OpenXRInteractionProfile : : has_binding_for_action ( const Ref < OpenXRAction > p_action ) {
for ( int i = bindings . size ( ) - 1 ; i > = 0 ; i - - ) {
Ref < OpenXRIPBinding > binding = bindings [ i ] ;
if ( binding - > get_action ( ) = = p_action ) {
return true ;
}
}
return false ;
}
2021-12-14 02:44:12 +01:00
OpenXRInteractionProfile : : ~ OpenXRInteractionProfile ( ) {
bindings . clear ( ) ;
}