2014-02-10 09:10:30 +08:00
/*************************************************************************/
2017-01-16 15:04:19 +08:00
/* class_db.h */
2014-02-10 09:10:30 +08:00
/*************************************************************************/
/* This file is part of: */
/* GODOT ENGINE */
2017-08-27 20:16:55 +08:00
/* https://godotengine.org */
2014-02-10 09:10:30 +08:00
/*************************************************************************/
2022-01-04 04:27:34 +08:00
/* Copyright (c) 2007-2022 Juan Linietsky, Ariel Manzur. */
/* Copyright (c) 2014-2022 Godot Engine contributors (cf. AUTHORS.md). */
2014-02-10 09:10:30 +08:00
/* */
/* 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. */
/*************************************************************************/
2018-01-05 07:50:27 +08:00
2017-01-16 15:04:19 +08:00
# ifndef CLASS_DB_H
# define CLASS_DB_H
2014-02-10 09:10:30 +08:00
2020-11-08 06:33:38 +08:00
# include "core/object/method_bind.h"
# include "core/object/object.h"
# include "core/string/print_string.h"
2017-01-16 15:04:19 +08:00
2020-02-21 02:32:36 +08:00
// Makes callable_mp readily available in all classes connecting signals.
// Needs to come after method_bind and object have been included.
2020-11-08 06:33:38 +08:00
# include "core/object/callable_method_pointer.h"
2014-02-10 09:10:30 +08:00
2020-02-21 02:32:36 +08:00
# define DEFVAL(m_defval) (m_defval)
2014-02-10 09:10:30 +08:00
2022-04-06 07:40:07 +08:00
# ifdef DEBUG_METHODS_ENABLED
2014-02-10 09:10:30 +08:00
struct MethodDefinition {
StringName name ;
Vector < StringName > args ;
2016-03-09 07:00:52 +08:00
MethodDefinition ( ) { }
2017-12-07 04:36:34 +08:00
MethodDefinition ( const char * p_name ) :
name ( p_name ) { }
MethodDefinition ( const StringName & p_name ) :
name ( p_name ) { }
2014-02-10 09:10:30 +08:00
} ;
2022-04-27 18:52:18 +08:00
MethodDefinition D_METHODP ( const char * p_name , const char * const * * p_args , uint32_t p_argcount ) ;
template < typename . . . VarArgs >
MethodDefinition D_METHOD ( const char * p_name , const VarArgs . . . p_args ) {
const char * args [ sizeof . . . ( p_args ) + 1 ] = { p_args . . . , nullptr } ; // +1 makes sure zero sized arrays are also supported.
const char * const * argptrs [ sizeof . . . ( p_args ) + 1 ] ;
for ( uint32_t i = 0 ; i < sizeof . . . ( p_args ) ; i + + ) {
argptrs [ i ] = & args [ i ] ;
}
return D_METHODP ( p_name , sizeof . . . ( p_args ) = = 0 ? nullptr : ( const char * const * * ) argptrs , sizeof . . . ( p_args ) ) ;
}
2014-02-10 09:10:30 +08:00
2022-04-06 07:40:07 +08:00
# else
// When DEBUG_METHODS_ENABLED is set this will let the engine know
// the argument names for easier debugging.
# define D_METHOD(m_c, ...) m_c
# endif
2017-01-03 10:03:46 +08:00
class ClassDB {
2016-09-15 06:37:37 +08:00
public :
enum APIType {
API_CORE ,
API_EDITOR ,
2021-06-05 01:33:48 +08:00
API_EXTENSION ,
API_EDITOR_EXTENSION ,
2016-09-15 06:37:37 +08:00
API_NONE
} ;
2017-03-05 23:44:50 +08:00
2016-09-15 06:37:37 +08:00
public :
2014-02-10 09:10:30 +08:00
struct PropertySetGet {
int index ;
StringName setter ;
StringName getter ;
2022-04-04 21:06:57 +08:00
MethodBind * _setptr = nullptr ;
MethodBind * _getptr = nullptr ;
2015-12-06 01:18:22 +08:00
Variant : : Type type ;
2014-02-10 09:10:30 +08:00
} ;
2017-01-03 10:03:46 +08:00
struct ClassInfo {
2020-05-12 23:01:17 +08:00
APIType api = API_NONE ;
ClassInfo * inherits_ptr = nullptr ;
void * class_ptr = nullptr ;
2021-06-05 01:33:48 +08:00
ObjectNativeExtension * native_extension = nullptr ;
2018-07-03 02:08:35 +08:00
HashMap < StringName , MethodBind * > method_map ;
HashMap < StringName , int > constant_map ;
2020-03-17 14:33:00 +08:00
HashMap < StringName , List < StringName > > enum_map ;
2018-07-03 02:08:35 +08:00
HashMap < StringName , MethodInfo > signal_map ;
2014-02-10 09:10:30 +08:00
List < PropertyInfo > property_list ;
2020-06-11 05:13:25 +08:00
HashMap < StringName , PropertyInfo > property_map ;
2014-02-10 09:10:30 +08:00
# ifdef DEBUG_METHODS_ENABLED
List < StringName > constant_order ;
List < StringName > method_order ;
2022-05-13 21:04:37 +08:00
RBSet < StringName > methods_in_properties ;
2014-02-10 09:10:30 +08:00
List < MethodInfo > virtual_methods ;
2022-05-13 21:04:37 +08:00
HashMap < StringName , MethodInfo > virtual_methods_map ;
HashMap < StringName , Vector < Error > > method_error_values ;
2014-02-10 09:10:30 +08:00
# endif
2018-07-03 02:08:35 +08:00
HashMap < StringName , PropertySetGet > property_setget ;
2014-02-10 09:10:30 +08:00
StringName inherits ;
StringName name ;
2020-05-12 23:01:17 +08:00
bool disabled = false ;
bool exposed = false ;
2022-03-10 15:17:38 +08:00
bool is_virtual = false ;
2020-05-12 23:01:17 +08:00
Object * ( * creation_func ) ( ) = nullptr ;
ClassInfo ( ) { }
~ ClassInfo ( ) { }
2014-02-10 09:10:30 +08:00
} ;
2016-03-09 07:00:52 +08:00
2017-03-05 23:44:50 +08:00
template < class T >
2014-02-10 09:10:30 +08:00
static Object * creator ( ) {
2017-03-05 23:44:50 +08:00
return memnew ( T ) ;
2014-02-10 09:10:30 +08:00
}
2016-03-09 07:00:52 +08:00
2021-01-18 21:01:38 +08:00
static RWLock lock ;
2018-07-03 02:08:35 +08:00
static HashMap < StringName , ClassInfo > classes ;
static HashMap < StringName , StringName > resource_base_extensions ;
static HashMap < StringName , StringName > compat_classes ;
2014-02-10 09:10:30 +08:00
2022-04-06 07:40:07 +08:00
# ifdef DEBUG_METHODS_ENABLED
2017-03-05 23:44:50 +08:00
static MethodBind * bind_methodfi ( uint32_t p_flags , MethodBind * p_bind , const MethodDefinition & method_name , const Variant * * p_defs , int p_defcount ) ;
2022-04-06 07:40:07 +08:00
# else
static MethodBind * bind_methodfi ( uint32_t p_flags , MethodBind * p_bind , const char * method_name , const Variant * * p_defs , int p_defcount ) ;
# endif
2014-02-10 09:10:30 +08:00
2016-09-15 06:37:37 +08:00
static APIType current_api ;
2014-02-10 09:10:30 +08:00
2017-03-05 23:44:50 +08:00
static void _add_class2 ( const StringName & p_class , const StringName & p_inherits ) ;
2016-03-09 07:00:52 +08:00
2020-03-17 14:33:00 +08:00
static HashMap < StringName , HashMap < StringName , Variant > > default_values ;
2022-05-13 21:04:37 +08:00
static RBSet < StringName > default_values_cached ;
2018-11-08 22:30:02 +08:00
2022-03-14 22:52:03 +08:00
// Native structs, used by binder
struct NativeStruct {
String ccode ; // C code to create the native struct, fields separated by ; Arrays accepted (even containing other structs), also function pointers. All types must be Godot types.
uint64_t struct_size ; // local size of struct, for comparison
} ;
2022-05-13 21:04:37 +08:00
static HashMap < StringName , NativeStruct > native_structs ;
2022-03-14 22:52:03 +08:00
2020-11-01 15:44:15 +08:00
private :
// Non-locking variants of get_parent_class and is_parent_class.
static StringName _get_parent_class ( const StringName & p_class ) ;
static bool _is_parent_class ( const StringName & p_class , const StringName & p_inherits ) ;
2017-03-05 23:44:50 +08:00
public :
2014-02-10 09:10:30 +08:00
// DO NOT USE THIS!!!!!! NEEDS TO BE PUBLIC BUT DO NOT USE NO MATTER WHAT!!!
2017-03-05 23:44:50 +08:00
template < class T >
2017-01-03 10:03:46 +08:00
static void _add_class ( ) {
2017-03-05 23:44:50 +08:00
_add_class2 ( T : : get_class_static ( ) , T : : get_parent_class_static ( ) ) ;
2014-02-10 09:10:30 +08:00
}
2017-03-05 23:44:50 +08:00
template < class T >
2022-03-10 15:17:38 +08:00
static void register_class ( bool p_virtual = false ) {
2014-02-10 09:10:30 +08:00
GLOBAL_LOCK_FUNCTION ;
2017-01-03 10:03:46 +08:00
T : : initialize_class ( ) ;
2017-03-05 23:44:50 +08:00
ClassInfo * t = classes . getptr ( T : : get_class_static ( ) ) ;
2014-02-10 09:10:30 +08:00
ERR_FAIL_COND ( ! t ) ;
2017-03-05 23:44:50 +08:00
t - > creation_func = & creator < T > ;
2017-10-10 05:49:17 +08:00
t - > exposed = true ;
2022-03-10 15:17:38 +08:00
t - > is_virtual = p_virtual ;
2019-10-21 23:44:56 +08:00
t - > class_ptr = T : : get_class_ptr_static ( ) ;
2021-09-01 03:45:21 +08:00
t - > api = current_api ;
2014-02-10 09:10:30 +08:00
T : : register_custom_data_to_otdb ( ) ;
}
2017-03-05 23:44:50 +08:00
template < class T >
2022-03-10 15:17:38 +08:00
static void register_abstract_class ( ) {
2014-02-10 09:10:30 +08:00
GLOBAL_LOCK_FUNCTION ;
2017-01-03 10:03:46 +08:00
T : : initialize_class ( ) ;
2017-10-10 05:49:17 +08:00
ClassInfo * t = classes . getptr ( T : : get_class_static ( ) ) ;
ERR_FAIL_COND ( ! t ) ;
t - > exposed = true ;
2019-10-21 23:44:56 +08:00
t - > class_ptr = T : : get_class_ptr_static ( ) ;
2021-09-01 03:45:21 +08:00
t - > api = current_api ;
2014-02-10 09:10:30 +08:00
//nothing
}
2021-06-05 01:33:48 +08:00
static void register_extension_class ( ObjectNativeExtension * p_extension ) ;
2021-06-19 23:58:49 +08:00
static void unregister_extension_class ( const StringName & p_class ) ;
2021-06-05 01:33:48 +08:00
2017-03-05 23:44:50 +08:00
template < class T >
static Object * _create_ptr_func ( ) {
2014-02-14 05:03:28 +08:00
return T : : create ( ) ;
}
2017-03-05 23:44:50 +08:00
template < class T >
2017-01-03 10:03:46 +08:00
static void register_custom_instance_class ( ) {
2014-02-14 05:03:28 +08:00
GLOBAL_LOCK_FUNCTION ;
2017-01-03 10:03:46 +08:00
T : : initialize_class ( ) ;
2017-03-05 23:44:50 +08:00
ClassInfo * t = classes . getptr ( T : : get_class_static ( ) ) ;
2014-02-14 05:03:28 +08:00
ERR_FAIL_COND ( ! t ) ;
2017-03-05 23:44:50 +08:00
t - > creation_func = & _create_ptr_func < T > ;
2017-10-10 05:49:17 +08:00
t - > exposed = true ;
2019-10-21 23:44:56 +08:00
t - > class_ptr = T : : get_class_ptr_static ( ) ;
2021-09-01 03:45:21 +08:00
t - > api = current_api ;
2014-02-14 05:03:28 +08:00
T : : register_custom_data_to_otdb ( ) ;
}
2017-03-05 23:44:50 +08:00
static void get_class_list ( List < StringName > * p_classes ) ;
static void get_inheriters_from_class ( const StringName & p_class , List < StringName > * p_classes ) ;
2019-04-09 06:18:03 +08:00
static void get_direct_inheriters_from_class ( const StringName & p_class , List < StringName > * p_classes ) ;
2017-03-05 23:44:50 +08:00
static StringName get_parent_class_nocheck ( const StringName & p_class ) ;
static StringName get_parent_class ( const StringName & p_class ) ;
2019-10-04 04:39:08 +08:00
static StringName get_compatibility_remapped_class ( const StringName & p_class ) ;
2017-01-03 10:03:46 +08:00
static bool class_exists ( const StringName & p_class ) ;
2017-03-05 23:44:50 +08:00
static bool is_parent_class ( const StringName & p_class , const StringName & p_inherits ) ;
2021-06-18 06:03:09 +08:00
static bool can_instantiate ( const StringName & p_class ) ;
2022-03-10 15:17:38 +08:00
static bool is_virtual ( const StringName & p_class ) ;
2021-06-18 06:03:09 +08:00
static Object * instantiate ( const StringName & p_class ) ;
2021-11-24 17:22:12 +08:00
static void set_object_extension_instance ( Object * p_object , const StringName & p_class , GDExtensionClassInstancePtr p_instance ) ;
2021-06-19 23:58:49 +08:00
2017-01-03 10:03:46 +08:00
static APIType get_api_type ( const StringName & p_class ) ;
2016-09-15 06:37:37 +08:00
static uint64_t get_api_hash ( APIType p_api ) ;
2014-02-10 09:10:30 +08:00
2022-03-19 20:18:52 +08:00
template < class N , class M , typename . . . VarArgs >
static MethodBind * bind_method ( N p_method_name , M p_method , VarArgs . . . p_args ) {
Variant args [ sizeof . . . ( p_args ) + 1 ] = { p_args . . . , Variant ( ) } ; // +1 makes sure zero sized arrays are also supported.
const Variant * argptrs [ sizeof . . . ( p_args ) + 1 ] ;
for ( uint32_t i = 0 ; i < sizeof . . . ( p_args ) ; i + + ) {
argptrs [ i ] = & args [ i ] ;
}
2014-02-10 09:10:30 +08:00
MethodBind * bind = create_method_bind ( p_method ) ;
2022-03-19 20:18:52 +08:00
return bind_methodfi ( METHOD_FLAGS_DEFAULT , bind , p_method_name , sizeof . . . ( p_args ) = = 0 ? nullptr : ( const Variant * * ) argptrs , sizeof . . . ( p_args ) ) ;
2014-02-10 09:10:30 +08:00
}
2022-03-19 20:18:52 +08:00
template < class N , class M , typename . . . VarArgs >
static MethodBind * bind_static_method ( const StringName & p_class , N p_method_name , M p_method , VarArgs . . . p_args ) {
Variant args [ sizeof . . . ( p_args ) + 1 ] = { p_args . . . , Variant ( ) } ; // +1 makes sure zero sized arrays are also supported.
const Variant * argptrs [ sizeof . . . ( p_args ) + 1 ] ;
for ( uint32_t i = 0 ; i < sizeof . . . ( p_args ) ; i + + ) {
argptrs [ i ] = & args [ i ] ;
}
MethodBind * bind = create_static_method_bind ( p_method ) ;
bind - > set_instance_class ( p_class ) ;
return bind_methodfi ( METHOD_FLAGS_DEFAULT , bind , p_method_name , sizeof . . . ( p_args ) = = 0 ? nullptr : ( const Variant * * ) argptrs , sizeof . . . ( p_args ) ) ;
2020-01-01 18:39:07 +08:00
}
2017-03-05 23:44:50 +08:00
template < class M >
2021-07-20 01:25:15 +08:00
static MethodBind * bind_vararg_method ( uint32_t p_flags , const StringName & p_name , M p_method , const MethodInfo & p_info = MethodInfo ( ) , const Vector < Variant > & p_default_args = Vector < Variant > ( ) , bool p_return_nil_is_variant = true ) {
2014-02-10 09:10:30 +08:00
GLOBAL_LOCK_FUNCTION ;
2020-01-02 16:31:43 +08:00
MethodBind * bind = create_vararg_method_bind ( p_method , p_info , p_return_nil_is_variant ) ;
2020-04-02 07:20:12 +08:00
ERR_FAIL_COND_V ( ! bind , nullptr ) ;
2016-08-06 08:20:59 +08:00
2014-02-10 09:10:30 +08:00
bind - > set_name ( p_name ) ;
bind - > set_default_arguments ( p_default_args ) ;
2017-03-05 23:44:50 +08:00
String instance_type = bind - > get_instance_class ( ) ;
2014-02-10 09:10:30 +08:00
2017-03-05 23:44:50 +08:00
ClassInfo * type = classes . getptr ( instance_type ) ;
2014-02-10 09:10:30 +08:00
if ( ! type ) {
memdelete ( bind ) ;
2020-04-02 07:20:12 +08:00
ERR_FAIL_COND_V ( ! type , nullptr ) ;
2014-02-10 09:10:30 +08:00
}
if ( type - > method_map . has ( p_name ) ) {
memdelete ( bind ) ;
2021-08-13 22:46:14 +08:00
// Overloading not supported
2020-04-02 07:20:12 +08:00
ERR_FAIL_V_MSG ( nullptr , " Method already bound: " + instance_type + " :: " + p_name + " . " ) ;
2014-02-10 09:10:30 +08:00
}
2017-03-05 23:44:50 +08:00
type - > method_map [ p_name ] = bind ;
2014-02-10 09:10:30 +08:00
# ifdef DEBUG_METHODS_ENABLED
2017-08-27 20:16:32 +08:00
// FIXME: <reduz> set_return_type is no longer in MethodBind, so I guess it should be moved to vararg method bind
//bind->set_return_type("Variant");
2014-02-10 09:10:30 +08:00
type - > method_order . push_back ( p_name ) ;
# endif
return bind ;
}
2021-06-05 01:33:48 +08:00
static void bind_method_custom ( const StringName & p_class , MethodBind * p_method ) ;
2021-07-20 01:25:15 +08:00
static void add_signal ( const StringName & p_class , const MethodInfo & p_signal ) ;
static bool has_signal ( const StringName & p_class , const StringName & p_signal , bool p_no_inheritance = false ) ;
static bool get_signal ( const StringName & p_class , const StringName & p_signal , MethodInfo * r_signal ) ;
static void get_signal_list ( const StringName & p_class , List < MethodInfo > * p_signals , bool p_no_inheritance = false ) ;
2021-11-09 04:53:41 +08:00
static void add_property_group ( const StringName & p_class , const String & p_name , const String & p_prefix = " " , int p_indent_depth = 0 ) ;
static void add_property_subgroup ( const StringName & p_class , const String & p_name , const String & p_prefix = " " , int p_indent_depth = 0 ) ;
2021-10-28 00:29:44 +08:00
static void add_property_array_count ( const StringName & p_class , const String & p_label , const StringName & p_count_property , const StringName & p_count_setter , const StringName & p_count_getter , const String & p_array_element_prefix , uint32_t p_count_usage = PROPERTY_USAGE_DEFAULT ) ;
2021-08-31 16:48:45 +08:00
static void add_property_array ( const StringName & p_class , const StringName & p_path , const String & p_array_element_prefix ) ;
2021-07-20 01:25:15 +08:00
static void add_property ( const StringName & p_class , const PropertyInfo & p_pinfo , const StringName & p_setter , const StringName & p_getter , int p_index = - 1 ) ;
static void set_property_default_value ( const StringName & p_class , const StringName & p_name , const Variant & p_default ) ;
2021-08-13 02:26:47 +08:00
static void add_linked_property ( const StringName & p_class , const String & p_property , const String & p_linked_property ) ;
2021-07-20 01:25:15 +08:00
static void get_property_list ( const StringName & p_class , List < PropertyInfo > * p_list , bool p_no_inheritance = false , const Object * p_validator = nullptr ) ;
static bool get_property_info ( const StringName & p_class , const StringName & p_property , PropertyInfo * r_info , bool p_no_inheritance = false , const Object * p_validator = nullptr ) ;
2020-04-02 07:20:12 +08:00
static bool set_property ( Object * p_object , const StringName & p_property , const Variant & p_value , bool * r_valid = nullptr ) ;
2017-03-05 23:44:50 +08:00
static bool get_property ( Object * p_object , const StringName & p_property , Variant & r_value ) ;
static bool has_property ( const StringName & p_class , const StringName & p_property , bool p_no_inheritance = false ) ;
2020-04-02 07:20:12 +08:00
static int get_property_index ( const StringName & p_class , const StringName & p_property , bool * r_is_valid = nullptr ) ;
static Variant : : Type get_property_type ( const StringName & p_class , const StringName & p_property , bool * r_is_valid = nullptr ) ;
2021-07-20 01:25:15 +08:00
static StringName get_property_setter ( const StringName & p_class , const StringName & p_property ) ;
static StringName get_property_getter ( const StringName & p_class , const StringName & p_property ) ;
2017-03-05 23:44:50 +08:00
2021-07-20 01:25:15 +08:00
static bool has_method ( const StringName & p_class , const StringName & p_method , bool p_no_inheritance = false ) ;
static void set_method_flags ( const StringName & p_class , const StringName & p_method , int p_flags ) ;
2017-03-05 23:44:50 +08:00
2021-07-20 01:25:15 +08:00
static void get_method_list ( const StringName & p_class , List < MethodInfo > * p_methods , bool p_no_inheritance = false , bool p_exclude_from_properties = false ) ;
static bool get_method_info ( const StringName & p_class , const StringName & p_method , MethodInfo * r_info , bool p_no_inheritance = false , bool p_exclude_from_properties = false ) ;
static MethodBind * get_method ( const StringName & p_class , const StringName & p_name ) ;
2014-02-10 09:10:30 +08:00
2021-08-22 09:52:44 +08:00
static void add_virtual_method ( const StringName & p_class , const MethodInfo & p_method , bool p_virtual = true , const Vector < String > & p_arg_names = Vector < String > ( ) , bool p_object_core = false ) ;
2017-03-05 23:44:50 +08:00
static void get_virtual_methods ( const StringName & p_class , List < MethodInfo > * p_methods , bool p_no_inheritance = false ) ;
2016-03-09 07:00:52 +08:00
2017-08-20 23:45:01 +08:00
static void bind_integer_constant ( const StringName & p_class , const StringName & p_enum , const StringName & p_name , int p_constant ) ;
2017-03-05 23:44:50 +08:00
static void get_integer_constant_list ( const StringName & p_class , List < String > * p_constants , bool p_no_inheritance = false ) ;
2020-04-02 07:20:12 +08:00
static int get_integer_constant ( const StringName & p_class , const StringName & p_name , bool * p_success = nullptr ) ;
2020-06-11 05:13:25 +08:00
static bool has_integer_constant ( const StringName & p_class , const StringName & p_name , bool p_no_inheritance = false ) ;
2017-08-20 23:45:01 +08:00
static StringName get_integer_constant_enum ( const StringName & p_class , const StringName & p_name , bool p_no_inheritance = false ) ;
static void get_enum_list ( const StringName & p_class , List < StringName > * p_enums , bool p_no_inheritance = false ) ;
static void get_enum_constants ( const StringName & p_class , const StringName & p_enum , List < StringName > * p_constants , bool p_no_inheritance = false ) ;
2020-06-11 05:13:25 +08:00
static bool has_enum ( const StringName & p_class , const StringName & p_name , bool p_no_inheritance = false ) ;
2017-08-20 23:45:01 +08:00
2021-08-25 02:16:25 +08:00
static void set_method_error_return_values ( const StringName & p_class , const StringName & p_method , const Vector < Error > & p_values ) ;
static Vector < Error > get_method_error_return_values ( const StringName & p_class , const StringName & p_method ) ;
2020-04-02 07:20:12 +08:00
static Variant class_get_default_property_value ( const StringName & p_class , const StringName & p_property , bool * r_valid = nullptr ) ;
2018-11-08 22:30:02 +08:00
2021-07-20 01:25:15 +08:00
static void set_class_enabled ( const StringName & p_class , bool p_enable ) ;
static bool is_class_enabled ( const StringName & p_class ) ;
2014-02-10 09:10:30 +08:00
2021-07-20 01:25:15 +08:00
static bool is_class_exposed ( const StringName & p_class ) ;
2017-10-10 05:49:17 +08:00
2017-03-05 23:44:50 +08:00
static void add_resource_base_extension ( const StringName & p_extension , const StringName & p_class ) ;
2014-02-10 09:10:30 +08:00
static void get_resource_base_extensions ( List < String > * p_extensions ) ;
2017-03-05 23:44:50 +08:00
static void get_extensions_for_type ( const StringName & p_class , List < String > * p_extensions ) ;
2021-07-24 03:01:18 +08:00
static bool is_resource_extension ( const StringName & p_extension ) ;
2014-02-10 09:10:30 +08:00
2017-03-05 23:44:50 +08:00
static void add_compatibility_class ( const StringName & p_class , const StringName & p_fallback ) ;
2016-09-15 06:37:37 +08:00
static void set_current_api ( APIType p_api ) ;
2019-04-06 22:12:59 +08:00
static APIType get_current_api ( ) ;
2019-06-01 21:42:22 +08:00
static void cleanup_defaults ( ) ;
2014-02-10 09:10:30 +08:00
static void cleanup ( ) ;
2022-03-14 22:52:03 +08:00
static void register_native_struct ( const StringName & p_name , const String & p_code , uint64_t p_current_size ) ;
static void get_native_struct_list ( List < StringName > * r_names ) ;
static String get_native_struct_code ( const StringName & p_name ) ;
static uint64_t get_native_struct_size ( const StringName & p_name ) ; // Used for asserting
2014-02-10 09:10:30 +08:00
} ;
2017-08-20 23:45:01 +08:00
# ifdef DEBUG_METHODS_ENABLED
# define BIND_CONSTANT(m_constant) \
2021-08-13 22:46:14 +08:00
: : ClassDB : : bind_integer_constant ( get_class_static ( ) , StringName ( ) , # m_constant , m_constant ) ;
2017-08-20 23:45:01 +08:00
# define BIND_ENUM_CONSTANT(m_constant) \
2021-08-13 22:46:14 +08:00
: : ClassDB : : bind_integer_constant ( get_class_static ( ) , __constant_get_enum_name ( m_constant , # m_constant ) , # m_constant , m_constant ) ;
2017-08-20 23:45:01 +08:00
2021-08-25 02:16:25 +08:00
_FORCE_INLINE_ void errarray_add_str ( Vector < Error > & arr ) {
}
_FORCE_INLINE_ void errarray_add_str ( Vector < Error > & arr , const Error & p_err ) {
arr . push_back ( p_err ) ;
}
template < class . . . P >
_FORCE_INLINE_ void errarray_add_str ( Vector < Error > & arr , const Error & p_err , P . . . p_args ) {
arr . push_back ( p_err ) ;
errarray_add_str ( arr , p_args . . . ) ;
}
template < class . . . P >
_FORCE_INLINE_ Vector < Error > errarray ( P . . . p_args ) {
Vector < Error > arr ;
errarray_add_str ( arr , p_args . . . ) ;
return arr ;
}
# define BIND_METHOD_ERR_RETURN_DOC(m_method, ...) \
: : ClassDB : : set_method_error_return_values ( get_class_static ( ) , m_method , errarray ( __VA_ARGS__ ) ) ;
2017-08-20 23:45:01 +08:00
# else
2017-03-05 23:44:50 +08:00
# define BIND_CONSTANT(m_constant) \
2021-08-13 22:46:14 +08:00
: : ClassDB : : bind_integer_constant ( get_class_static ( ) , StringName ( ) , # m_constant , m_constant ) ;
2017-08-20 23:45:01 +08:00
# define BIND_ENUM_CONSTANT(m_constant) \
2021-08-13 22:46:14 +08:00
: : ClassDB : : bind_integer_constant ( get_class_static ( ) , StringName ( ) , # m_constant , m_constant ) ;
2017-08-20 23:45:01 +08:00
2021-08-25 02:16:25 +08:00
# define BIND_METHOD_ERR_RETURN_DOC(m_method, ...)
2017-08-20 23:45:01 +08:00
# endif
2014-02-10 09:10:30 +08:00
2021-07-12 06:30:33 +08:00
# define GDREGISTER_CLASS(m_class) \
if ( ! GD_IS_DEFINED ( ClassDB_Disable_ # # m_class ) ) { \
2021-08-13 22:46:14 +08:00
: : ClassDB : : register_class < m_class > ( ) ; \
2021-07-12 06:30:33 +08:00
}
2022-03-10 15:17:38 +08:00
# define GDREGISTER_VIRTUAL_CLASS(m_class) \
if ( ! GD_IS_DEFINED ( ClassDB_Disable_ # # m_class ) ) { \
: : ClassDB : : register_class < m_class > ( true ) ; \
}
# define GDREGISTER_ABSTRACT_CLASS(m_class) \
if ( ! GD_IS_DEFINED ( ClassDB_Disable_ # # m_class ) ) { \
: : ClassDB : : register_abstract_class < m_class > ( ) ; \
2021-07-12 06:30:33 +08:00
}
2022-03-14 22:52:03 +08:00
# define GDREGISTER_NATIVE_STRUCT(m_class, m_code) ClassDB::register_native_struct(#m_class, m_code, sizeof(m_class))
2021-07-12 06:30:33 +08:00
# include "core/disabled_classes.gen.h"
2017-01-16 15:04:19 +08:00
# endif // CLASS_DB_H