gdnative_interface.h 28 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475
  1. /*************************************************************************/
  2. /* gdnative_interface.h */
  3. /*************************************************************************/
  4. /* This file is part of: */
  5. /* GODOT ENGINE */
  6. /* https://godotengine.org */
  7. /*************************************************************************/
  8. /* Copyright (c) 2007-2021 Juan Linietsky, Ariel Manzur. */
  9. /* Copyright (c) 2014-2021 Godot Engine contributors (cf. AUTHORS.md). */
  10. /* */
  11. /* Permission is hereby granted, free of charge, to any person obtaining */
  12. /* a copy of this software and associated documentation files (the */
  13. /* "Software"), to deal in the Software without restriction, including */
  14. /* without limitation the rights to use, copy, modify, merge, publish, */
  15. /* distribute, sublicense, and/or sell copies of the Software, and to */
  16. /* permit persons to whom the Software is furnished to do so, subject to */
  17. /* the following conditions: */
  18. /* */
  19. /* The above copyright notice and this permission notice shall be */
  20. /* included in all copies or substantial portions of the Software. */
  21. /* */
  22. /* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
  23. /* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
  24. /* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/
  25. /* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
  26. /* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
  27. /* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
  28. /* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
  29. /*************************************************************************/
  30. #ifndef GDNATIVE_INTERFACE_H
  31. #define GDNATIVE_INTERFACE_H
  32. /* This is a C class header, you can copy it and use it directly in your own binders.
  33. * Together with the JSON file, you should be able to generate any binder.
  34. */
  35. #include <stddef.h>
  36. #include <stdint.h>
  37. #include <stdio.h>
  38. #ifndef __cplusplus
  39. typedef uint32_t char32_t;
  40. typedef uint16_t char16_t;
  41. #endif
  42. #ifdef __cplusplus
  43. extern "C" {
  44. #endif
  45. /* VARIANT TYPES */
  46. typedef enum {
  47. GDNATIVE_VARIANT_TYPE_NIL,
  48. /* atomic types */
  49. GDNATIVE_VARIANT_TYPE_BOOL,
  50. GDNATIVE_VARIANT_TYPE_INT,
  51. GDNATIVE_VARIANT_TYPE_FLOAT,
  52. GDNATIVE_VARIANT_TYPE_STRING,
  53. /* math types */
  54. GDNATIVE_VARIANT_TYPE_VECTOR2,
  55. GDNATIVE_VARIANT_TYPE_VECTOR2I,
  56. GDNATIVE_VARIANT_TYPE_RECT2,
  57. GDNATIVE_VARIANT_TYPE_RECT2I,
  58. GDNATIVE_VARIANT_TYPE_VECTOR3,
  59. GDNATIVE_VARIANT_TYPE_VECTOR3I,
  60. GDNATIVE_VARIANT_TYPE_TRANSFORM2D,
  61. GDNATIVE_VARIANT_TYPE_PLANE,
  62. GDNATIVE_VARIANT_TYPE_QUATERNION,
  63. GDNATIVE_VARIANT_TYPE_AABB,
  64. GDNATIVE_VARIANT_TYPE_BASIS,
  65. GDNATIVE_VARIANT_TYPE_TRANSFORM3D,
  66. /* misc types */
  67. GDNATIVE_VARIANT_TYPE_COLOR,
  68. GDNATIVE_VARIANT_TYPE_STRING_NAME,
  69. GDNATIVE_VARIANT_TYPE_NODE_PATH,
  70. GDNATIVE_VARIANT_TYPE_RID,
  71. GDNATIVE_VARIANT_TYPE_OBJECT,
  72. GDNATIVE_VARIANT_TYPE_CALLABLE,
  73. GDNATIVE_VARIANT_TYPE_SIGNAL,
  74. GDNATIVE_VARIANT_TYPE_DICTIONARY,
  75. GDNATIVE_VARIANT_TYPE_ARRAY,
  76. /* typed arrays */
  77. GDNATIVE_VARIANT_TYPE_PACKED_BYTE_ARRAY,
  78. GDNATIVE_VARIANT_TYPE_PACKED_INT32_ARRAY,
  79. GDNATIVE_VARIANT_TYPE_PACKED_INT64_ARRAY,
  80. GDNATIVE_VARIANT_TYPE_PACKED_FLOAT32_ARRAY,
  81. GDNATIVE_VARIANT_TYPE_PACKED_FLOAT64_ARRAY,
  82. GDNATIVE_VARIANT_TYPE_PACKED_STRING_ARRAY,
  83. GDNATIVE_VARIANT_TYPE_PACKED_VECTOR2_ARRAY,
  84. GDNATIVE_VARIANT_TYPE_PACKED_VECTOR3_ARRAY,
  85. GDNATIVE_VARIANT_TYPE_PACKED_COLOR_ARRAY,
  86. GDNATIVE_VARIANT_TYPE_VARIANT_MAX
  87. } GDNativeVariantType;
  88. typedef enum {
  89. /* comparison */
  90. GDNATIVE_VARIANT_OP_EQUAL,
  91. GDNATIVE_VARIANT_OP_NOT_EQUAL,
  92. GDNATIVE_VARIANT_OP_LESS,
  93. GDNATIVE_VARIANT_OP_LESS_EQUAL,
  94. GDNATIVE_VARIANT_OP_GREATER,
  95. GDNATIVE_VARIANT_OP_GREATER_EQUAL,
  96. /* mathematic */
  97. GDNATIVE_VARIANT_OP_ADD,
  98. GDNATIVE_VARIANT_OP_SUBTRACT,
  99. GDNATIVE_VARIANT_OP_MULTIPLY,
  100. GDNATIVE_VARIANT_OP_DIVIDE,
  101. GDNATIVE_VARIANT_OP_NEGATE,
  102. GDNATIVE_VARIANT_OP_POSITIVE,
  103. GDNATIVE_VARIANT_OP_MODULE,
  104. /* bitwise */
  105. GDNATIVE_VARIANT_OP_SHIFT_LEFT,
  106. GDNATIVE_VARIANT_OP_SHIFT_RIGHT,
  107. GDNATIVE_VARIANT_OP_BIT_AND,
  108. GDNATIVE_VARIANT_OP_BIT_OR,
  109. GDNATIVE_VARIANT_OP_BIT_XOR,
  110. GDNATIVE_VARIANT_OP_BIT_NEGATE,
  111. /* logic */
  112. GDNATIVE_VARIANT_OP_AND,
  113. GDNATIVE_VARIANT_OP_OR,
  114. GDNATIVE_VARIANT_OP_XOR,
  115. GDNATIVE_VARIANT_OP_NOT,
  116. /* containment */
  117. GDNATIVE_VARIANT_OP_IN,
  118. GDNATIVE_VARIANT_OP_MAX
  119. } GDNativeVariantOperator;
  120. typedef void *GDNativeVariantPtr;
  121. typedef void *GDNativeStringNamePtr;
  122. typedef void *GDNativeStringPtr;
  123. typedef void *GDNativeObjectPtr;
  124. typedef void *GDNativeTypePtr;
  125. typedef void *GDNativeMethodBindPtr;
  126. typedef int64_t GDNativeInt;
  127. typedef uint8_t GDNativeBool;
  128. typedef uint64_t GDObjectInstanceID;
  129. /* VARIANT DATA I/O */
  130. typedef enum {
  131. GDNATIVE_CALL_OK,
  132. GDNATIVE_CALL_ERROR_INVALID_METHOD,
  133. GDNATIVE_CALL_ERROR_INVALID_ARGUMENT, /* expected is variant type */
  134. GDNATIVE_CALL_ERROR_TOO_MANY_ARGUMENTS, /* expected is number of arguments */
  135. GDNATIVE_CALL_ERROR_TOO_FEW_ARGUMENTS, /* expected is number of arguments */
  136. GDNATIVE_CALL_ERROR_INSTANCE_IS_NULL,
  137. } GDNativeCallErrorType;
  138. typedef struct {
  139. GDNativeCallErrorType error;
  140. int32_t argument;
  141. int32_t expected;
  142. } GDNativeCallError;
  143. typedef void (*GDNativeVariantFromTypeConstructorFunc)(GDNativeVariantPtr, GDNativeTypePtr);
  144. typedef void (*GDNativeTypeFromVariantConstructorFunc)(GDNativeTypePtr, GDNativeVariantPtr);
  145. typedef void (*GDNativePtrOperatorEvaluator)(const GDNativeTypePtr p_left, const GDNativeTypePtr p_right, GDNativeTypePtr r_result);
  146. typedef void (*GDNativePtrBuiltInMethod)(GDNativeTypePtr p_base, const GDNativeTypePtr *p_args, GDNativeTypePtr r_return, int p_argument_count);
  147. typedef void (*GDNativePtrConstructor)(GDNativeTypePtr p_base, const GDNativeTypePtr *p_args);
  148. typedef void (*GDNativePtrDestructor)(GDNativeTypePtr p_base);
  149. typedef void (*GDNativePtrSetter)(GDNativeTypePtr p_base, const GDNativeTypePtr p_value);
  150. typedef void (*GDNativePtrGetter)(const GDNativeTypePtr p_base, GDNativeTypePtr r_value);
  151. typedef void (*GDNativePtrIndexedSetter)(GDNativeTypePtr p_base, GDNativeInt p_index, const GDNativeTypePtr p_value);
  152. typedef void (*GDNativePtrIndexedGetter)(const GDNativeTypePtr p_base, GDNativeInt p_index, GDNativeTypePtr r_value);
  153. typedef void (*GDNativePtrKeyedSetter)(GDNativeTypePtr p_base, const GDNativeTypePtr p_key, const GDNativeTypePtr p_value);
  154. typedef void (*GDNativePtrKeyedGetter)(const GDNativeTypePtr p_base, const GDNativeTypePtr p_key, GDNativeTypePtr r_value);
  155. typedef uint32_t (*GDNativePtrKeyedChecker)(const GDNativeVariantPtr p_base, const GDNativeVariantPtr p_key);
  156. typedef void (*GDNativePtrUtilityFunction)(GDNativeTypePtr r_return, const GDNativeTypePtr *p_arguments, int p_argument_count);
  157. typedef GDNativeObjectPtr (*GDNativeClassConstructor)();
  158. typedef void *(*GDNativeInstanceBindingCreateCallback)(void *p_token, void *p_instance);
  159. typedef void (*GDNativeInstanceBindingFreeCallback)(void *p_token, void *p_instance, void *p_binding);
  160. typedef GDNativeBool (*GDNativeInstanceBindingReferenceCallback)(void *p_token, void *p_binding, GDNativeBool p_reference);
  161. struct GDNativeInstanceBindingCallbacks {
  162. GDNativeInstanceBindingCreateCallback create_callback;
  163. GDNativeInstanceBindingFreeCallback free_callback;
  164. GDNativeInstanceBindingReferenceCallback reference_callback;
  165. };
  166. /* EXTENSION CLASSES */
  167. typedef void *GDExtensionClassInstancePtr;
  168. typedef GDNativeBool (*GDNativeExtensionClassSet)(GDExtensionClassInstancePtr p_instance, const GDNativeStringNamePtr p_name, const GDNativeVariantPtr p_value);
  169. typedef GDNativeBool (*GDNativeExtensionClassGet)(GDExtensionClassInstancePtr p_instance, const GDNativeStringNamePtr p_name, GDNativeVariantPtr r_ret);
  170. typedef struct {
  171. uint32_t type;
  172. const char *name;
  173. const char *class_name;
  174. uint32_t hint;
  175. const char *hint_string;
  176. uint32_t usage;
  177. } GDNativePropertyInfo;
  178. typedef const GDNativePropertyInfo *(*GDNativeExtensionClassGetPropertyList)(GDExtensionClassInstancePtr p_instance, uint32_t *r_count);
  179. typedef void (*GDNativeExtensionClassFreePropertyList)(GDExtensionClassInstancePtr p_instance, const GDNativePropertyInfo *p_list);
  180. typedef void (*GDNativeExtensionClassNotification)(GDExtensionClassInstancePtr p_instance, int32_t p_what);
  181. typedef const char *(*GDNativeExtensionClassToString)(GDExtensionClassInstancePtr p_instance);
  182. typedef void (*GDNativeExtensionClassReference)(GDExtensionClassInstancePtr p_instance);
  183. typedef void (*GDNativeExtensionClassUnreference)(GDExtensionClassInstancePtr p_instance);
  184. typedef void (*GDNativeExtensionClassCallVirtual)(GDExtensionClassInstancePtr p_instance, const GDNativeTypePtr *p_args, GDNativeTypePtr r_ret);
  185. typedef GDExtensionClassInstancePtr (*GDNativeExtensionClassCreateInstance)(void *p_userdata);
  186. typedef void (*GDNativeExtensionClassFreeInstance)(void *p_userdata, GDExtensionClassInstancePtr p_instance);
  187. typedef void (*GDNativeExtensionClassObjectInstance)(GDExtensionClassInstancePtr p_instance, GDNativeObjectPtr p_object_instance);
  188. typedef GDNativeExtensionClassCallVirtual (*GDNativeExtensionClassGetVirtual)(void *p_userdata, const char *p_name);
  189. typedef struct {
  190. GDNativeExtensionClassSet set_func;
  191. GDNativeExtensionClassGet get_func;
  192. GDNativeExtensionClassGetPropertyList get_property_list_func;
  193. GDNativeExtensionClassFreePropertyList free_property_list_func;
  194. GDNativeExtensionClassNotification notification_func;
  195. GDNativeExtensionClassToString to_string_func;
  196. GDNativeExtensionClassReference reference_func;
  197. GDNativeExtensionClassUnreference unreference_func;
  198. GDNativeExtensionClassCreateInstance create_instance_func; /* this one is mandatory */
  199. GDNativeExtensionClassFreeInstance free_instance_func; /* this one is mandatory */
  200. GDNativeExtensionClassObjectInstance object_instance_func; /* this one is mandatory */
  201. GDNativeExtensionClassGetVirtual get_virtual_func;
  202. void *class_userdata;
  203. } GDNativeExtensionClassCreationInfo;
  204. typedef void *GDNativeExtensionClassLibraryPtr;
  205. typedef const GDNativePropertyInfo *(*GDNativeExtensionClassGetPropertyList)(GDExtensionClassInstancePtr p_instance, uint32_t *r_count);
  206. /* Method */
  207. typedef enum {
  208. GDNATIVE_EXTENSION_METHOD_FLAG_NORMAL = 1,
  209. GDNATIVE_EXTENSION_METHOD_FLAG_EDITOR = 2,
  210. GDNATIVE_EXTENSION_METHOD_FLAG_NOSCRIPT = 4,
  211. GDNATIVE_EXTENSION_METHOD_FLAG_CONST = 8,
  212. GDNATIVE_EXTENSION_METHOD_FLAG_REVERSE = 16, /* used for events */
  213. GDNATIVE_EXTENSION_METHOD_FLAG_VIRTUAL = 32,
  214. GDNATIVE_EXTENSION_METHOD_FLAG_FROM_SCRIPT = 64,
  215. GDNATIVE_EXTENSION_METHOD_FLAG_VARARG = 128,
  216. GDNATIVE_EXTENSION_METHOD_FLAG_STATIC = 256,
  217. GDNATIVE_EXTENSION_METHOD_FLAGS_DEFAULT = GDNATIVE_EXTENSION_METHOD_FLAG_NORMAL,
  218. } GDNativeExtensionClassMethodFlags;
  219. typedef enum {
  220. GDNATIVE_EXTENSION_METHOD_ARGUMENT_METADATA_NONE,
  221. GDNATIVE_EXTENSION_METHOD_ARGUMENT_METADATA_INT_IS_INT8,
  222. GDNATIVE_EXTENSION_METHOD_ARGUMENT_METADATA_INT_IS_INT16,
  223. GDNATIVE_EXTENSION_METHOD_ARGUMENT_METADATA_INT_IS_INT32,
  224. GDNATIVE_EXTENSION_METHOD_ARGUMENT_METADATA_INT_IS_INT64,
  225. GDNATIVE_EXTENSION_METHOD_ARGUMENT_METADATA_INT_IS_UINT8,
  226. GDNATIVE_EXTENSION_METHOD_ARGUMENT_METADATA_INT_IS_UINT16,
  227. GDNATIVE_EXTENSION_METHOD_ARGUMENT_METADATA_INT_IS_UINT32,
  228. GDNATIVE_EXTENSION_METHOD_ARGUMENT_METADATA_INT_IS_UINT64,
  229. GDNATIVE_EXTENSION_METHOD_ARGUMENT_METADATA_REAL_IS_FLOAT,
  230. GDNATIVE_EXTENSION_METHOD_ARGUMENT_METADATA_REAL_IS_DOUBLE
  231. } GDNativeExtensionClassMethodArgumentMetadata;
  232. typedef void (*GDNativeExtensionClassMethodCall)(void *method_userdata, GDExtensionClassInstancePtr p_instance, const GDNativeVariantPtr *p_args, const GDNativeInt p_argument_count, GDNativeVariantPtr r_return, GDNativeCallError *r_error);
  233. typedef void (*GDNativeExtensionClassMethodPtrCall)(void *method_userdata, GDExtensionClassInstancePtr p_instance, const GDNativeTypePtr *p_args, GDNativeTypePtr r_ret);
  234. /* passing -1 as argument in the following functions refers to the return type */
  235. typedef GDNativeVariantType (*GDNativeExtensionClassMethodGetArgumentType)(void *p_method_userdata, int32_t p_argument);
  236. typedef void (*GDNativeExtensionClassMethodGetArgumentInfo)(void *p_method_userdata, int32_t p_argument, GDNativePropertyInfo *r_info);
  237. typedef GDNativeExtensionClassMethodArgumentMetadata (*GDNativeExtensionClassMethodGetArgumentMetadata)(void *p_method_userdata, int32_t p_argument);
  238. typedef struct {
  239. const char *name;
  240. void *method_userdata;
  241. GDNativeExtensionClassMethodCall call_func;
  242. GDNativeExtensionClassMethodPtrCall ptrcall_func;
  243. uint32_t method_flags; /* GDNativeExtensionClassMethodFlags */
  244. uint32_t argument_count;
  245. GDNativeBool has_return_value;
  246. GDNativeExtensionClassMethodGetArgumentType get_argument_type_func;
  247. GDNativeExtensionClassMethodGetArgumentInfo get_argument_info_func; /* name and hint information for the argument can be omitted in release builds. Class name should always be present if it applies. */
  248. GDNativeExtensionClassMethodGetArgumentMetadata get_argument_metadata_func;
  249. uint32_t default_argument_count;
  250. GDNativeVariantPtr *default_arguments;
  251. } GDNativeExtensionClassMethodInfo;
  252. /* INTERFACE */
  253. typedef struct {
  254. uint32_t version_major;
  255. uint32_t version_minor;
  256. uint32_t version_patch;
  257. const char *version_string;
  258. /* GODOT CORE */
  259. void *(*mem_alloc)(size_t p_bytes);
  260. void *(*mem_realloc)(void *p_ptr, size_t p_bytes);
  261. void (*mem_free)(void *p_ptr);
  262. void (*print_error)(const char *p_description, const char *p_function, const char *p_file, int32_t p_line);
  263. void (*print_warning)(const char *p_description, const char *p_function, const char *p_file, int32_t p_line);
  264. void (*print_script_error)(const char *p_description, const char *p_function, const char *p_file, int32_t p_line);
  265. /* GODOT VARIANT */
  266. /* variant general */
  267. void (*variant_new_copy)(GDNativeVariantPtr r_dest, const GDNativeVariantPtr p_src);
  268. void (*variant_new_nil)(GDNativeVariantPtr r_dest);
  269. void (*variant_destroy)(GDNativeVariantPtr p_self);
  270. /* variant type */
  271. void (*variant_call)(GDNativeVariantPtr p_self, const GDNativeStringNamePtr p_method, const GDNativeVariantPtr *p_args, const GDNativeInt p_argument_count, GDNativeVariantPtr r_return, GDNativeCallError *r_error);
  272. void (*variant_call_static)(GDNativeVariantType p_type, const GDNativeStringNamePtr p_method, const GDNativeVariantPtr *p_args, const GDNativeInt p_argument_count, GDNativeVariantPtr r_return, GDNativeCallError *r_error);
  273. void (*variant_evaluate)(GDNativeVariantOperator p_op, const GDNativeVariantPtr p_a, const GDNativeVariantPtr p_b, GDNativeVariantPtr r_return, GDNativeBool *r_valid);
  274. void (*variant_set)(GDNativeVariantPtr p_self, const GDNativeVariantPtr p_key, const GDNativeVariantPtr p_value, GDNativeBool *r_valid);
  275. void (*variant_set_named)(GDNativeVariantPtr p_self, const GDNativeStringNamePtr p_key, const GDNativeVariantPtr p_value, GDNativeBool *r_valid);
  276. void (*variant_set_keyed)(GDNativeVariantPtr p_self, const GDNativeVariantPtr p_key, const GDNativeVariantPtr p_value, GDNativeBool *r_valid);
  277. void (*variant_set_indexed)(GDNativeVariantPtr p_self, GDNativeInt p_index, const GDNativeVariantPtr p_value, GDNativeBool *r_valid, GDNativeBool *r_oob);
  278. void (*variant_get)(const GDNativeVariantPtr p_self, const GDNativeVariantPtr p_key, GDNativeVariantPtr r_ret, GDNativeBool *r_valid);
  279. void (*variant_get_named)(const GDNativeVariantPtr p_self, const GDNativeStringNamePtr p_key, GDNativeVariantPtr r_ret, GDNativeBool *r_valid);
  280. void (*variant_get_keyed)(const GDNativeVariantPtr p_self, const GDNativeVariantPtr p_key, GDNativeVariantPtr r_ret, GDNativeBool *r_valid);
  281. void (*variant_get_indexed)(const GDNativeVariantPtr p_self, GDNativeInt p_index, GDNativeVariantPtr r_ret, GDNativeBool *r_valid, GDNativeBool *r_oob);
  282. GDNativeBool (*variant_iter_init)(const GDNativeVariantPtr p_self, GDNativeVariantPtr r_iter, GDNativeBool *r_valid);
  283. GDNativeBool (*variant_iter_next)(const GDNativeVariantPtr p_self, GDNativeVariantPtr r_iter, GDNativeBool *r_valid);
  284. void (*variant_iter_get)(const GDNativeVariantPtr p_self, GDNativeVariantPtr r_iter, GDNativeVariantPtr r_ret, GDNativeBool *r_valid);
  285. GDNativeBool (*variant_hash_compare)(const GDNativeVariantPtr p_self, const GDNativeVariantPtr p_other);
  286. GDNativeBool (*variant_booleanize)(const GDNativeVariantPtr p_self);
  287. void (*variant_blend)(const GDNativeVariantPtr p_a, const GDNativeVariantPtr p_b, float p_c, GDNativeVariantPtr r_dst);
  288. void (*variant_interpolate)(const GDNativeVariantPtr p_a, const GDNativeVariantPtr p_b, float p_c, GDNativeVariantPtr r_dst);
  289. void (*variant_duplicate)(const GDNativeVariantPtr p_self, GDNativeVariantPtr r_ret, GDNativeBool p_deep);
  290. void (*variant_stringify)(const GDNativeVariantPtr p_self, GDNativeStringPtr r_ret);
  291. GDNativeVariantType (*variant_get_type)(const GDNativeVariantPtr p_self);
  292. GDNativeBool (*variant_has_method)(const GDNativeVariantPtr p_self, const GDNativeStringNamePtr p_method);
  293. GDNativeBool (*variant_has_member)(GDNativeVariantType p_type, const GDNativeStringNamePtr p_member);
  294. GDNativeBool (*variant_has_key)(const GDNativeVariantPtr p_self, const GDNativeVariantPtr p_key, GDNativeBool *r_valid);
  295. void (*variant_get_type_name)(GDNativeVariantType p_type, GDNativeStringPtr r_name);
  296. GDNativeBool (*variant_can_convert)(GDNativeVariantType p_from, GDNativeVariantType p_to);
  297. GDNativeBool (*variant_can_convert_strict)(GDNativeVariantType p_from, GDNativeVariantType p_to);
  298. /* ptrcalls */
  299. GDNativeVariantFromTypeConstructorFunc (*get_variant_from_type_constructor)(GDNativeVariantType p_type);
  300. GDNativeTypeFromVariantConstructorFunc (*get_variant_to_type_constructor)(GDNativeVariantType p_type);
  301. GDNativePtrOperatorEvaluator (*variant_get_ptr_operator_evaluator)(GDNativeVariantOperator p_operator, GDNativeVariantType p_type_a, GDNativeVariantType p_type_b);
  302. GDNativePtrBuiltInMethod (*variant_get_ptr_builtin_method)(GDNativeVariantType p_type, const char *p_method, GDNativeInt p_hash);
  303. GDNativePtrConstructor (*variant_get_ptr_constructor)(GDNativeVariantType p_type, int32_t p_constructor);
  304. GDNativePtrDestructor (*variant_get_ptr_destructor)(GDNativeVariantType p_type);
  305. void (*variant_construct)(GDNativeVariantType p_type, GDNativeVariantPtr p_base, const GDNativeVariantPtr *p_args, int32_t p_argument_count, GDNativeCallError *r_error);
  306. GDNativePtrSetter (*variant_get_ptr_setter)(GDNativeVariantType p_type, const char *p_member);
  307. GDNativePtrGetter (*variant_get_ptr_getter)(GDNativeVariantType p_type, const char *p_member);
  308. GDNativePtrIndexedSetter (*variant_get_ptr_indexed_setter)(GDNativeVariantType p_type);
  309. GDNativePtrIndexedGetter (*variant_get_ptr_indexed_getter)(GDNativeVariantType p_type);
  310. GDNativePtrKeyedSetter (*variant_get_ptr_keyed_setter)(GDNativeVariantType p_type);
  311. GDNativePtrKeyedGetter (*variant_get_ptr_keyed_getter)(GDNativeVariantType p_type);
  312. GDNativePtrKeyedChecker (*variant_get_ptr_keyed_checker)(GDNativeVariantType p_type);
  313. void (*variant_get_constant_value)(GDNativeVariantType p_type, const char *p_constant, GDNativeVariantPtr r_ret);
  314. GDNativePtrUtilityFunction (*variant_get_ptr_utility_function)(const char *p_function, GDNativeInt p_hash);
  315. /* extra utilities */
  316. void (*string_new_with_latin1_chars)(GDNativeStringPtr r_dest, const char *p_contents);
  317. void (*string_new_with_utf8_chars)(GDNativeStringPtr r_dest, const char *p_contents);
  318. void (*string_new_with_utf16_chars)(GDNativeStringPtr r_dest, const char16_t *p_contents);
  319. void (*string_new_with_utf32_chars)(GDNativeStringPtr r_dest, const char32_t *p_contents);
  320. void (*string_new_with_wide_chars)(GDNativeStringPtr r_dest, const wchar_t *p_contents);
  321. void (*string_new_with_latin1_chars_and_len)(GDNativeStringPtr r_dest, const char *p_contents, const GDNativeInt p_size);
  322. void (*string_new_with_utf8_chars_and_len)(GDNativeStringPtr r_dest, const char *p_contents, const GDNativeInt p_size);
  323. void (*string_new_with_utf16_chars_and_len)(GDNativeStringPtr r_dest, const char16_t *p_contents, const GDNativeInt p_size);
  324. void (*string_new_with_utf32_chars_and_len)(GDNativeStringPtr r_dest, const char32_t *p_contents, const GDNativeInt p_size);
  325. void (*string_new_with_wide_chars_and_len)(GDNativeStringPtr r_dest, const wchar_t *p_contents, const GDNativeInt p_size);
  326. /* Information about the following functions:
  327. * - The return value is the resulting encoded string length.
  328. * - The length returned is in characters, not in bytes. It also does not include a trailing zero.
  329. * - These functions also do not write trailing zero, If you need it, write it yourself at the position indicated by the length (and make sure to allocate it).
  330. * - Passing NULL in r_text means only the length is computed (again, without including trailing zero).
  331. * - p_max_write_length argument is in characters, not bytes. It will be ignored if r_text is NULL.
  332. * - p_max_write_length argument does not affect the return value, it's only to cap write length.
  333. */
  334. GDNativeInt (*string_to_latin1_chars)(const GDNativeStringPtr p_self, char *r_text, GDNativeInt p_max_write_length);
  335. GDNativeInt (*string_to_utf8_chars)(const GDNativeStringPtr p_self, char *r_text, GDNativeInt p_max_write_length);
  336. GDNativeInt (*string_to_utf16_chars)(const GDNativeStringPtr p_self, char16_t *r_text, GDNativeInt p_max_write_length);
  337. GDNativeInt (*string_to_utf32_chars)(const GDNativeStringPtr p_self, char32_t *r_text, GDNativeInt p_max_write_length);
  338. GDNativeInt (*string_to_wide_chars)(const GDNativeStringPtr p_self, wchar_t *r_text, GDNativeInt p_max_write_length);
  339. char32_t *(*string_operator_index)(GDNativeStringPtr p_self, GDNativeInt p_index);
  340. const char32_t *(*string_operator_index_const)(const GDNativeStringPtr p_self, GDNativeInt p_index);
  341. /* Packed array functions */
  342. uint8_t *(*packed_byte_array_operator_index)(GDNativeTypePtr p_self, GDNativeInt p_index); // p_self should be a PackedByteArray
  343. const uint8_t *(*packed_byte_array_operator_index_const)(const GDNativeTypePtr p_self, GDNativeInt p_index); // p_self should be a PackedByteArray
  344. GDNativeTypePtr (*packed_color_array_operator_index)(GDNativeTypePtr p_self, GDNativeInt p_index); // p_self should be a PackedColorArray, returns Color ptr
  345. GDNativeTypePtr (*packed_color_array_operator_index_const)(const GDNativeTypePtr p_self, GDNativeInt p_index); // p_self should be a PackedColorArray, returns Color ptr
  346. float *(*packed_float32_array_operator_index)(GDNativeTypePtr p_self, GDNativeInt p_index); // p_self should be a PackedFloat32Array
  347. const float *(*packed_float32_array_operator_index_const)(const GDNativeTypePtr p_self, GDNativeInt p_index); // p_self should be a PackedFloat32Array
  348. double *(*packed_float64_array_operator_index)(GDNativeTypePtr p_self, GDNativeInt p_index); // p_self should be a PackedFloat64Array
  349. const double *(*packed_float64_array_operator_index_const)(const GDNativeTypePtr p_self, GDNativeInt p_index); // p_self should be a PackedFloat64Array
  350. int32_t *(*packed_int32_array_operator_index)(GDNativeTypePtr p_self, GDNativeInt p_index); // p_self should be a PackedInt32Array
  351. const int32_t *(*packed_int32_array_operator_index_const)(const GDNativeTypePtr p_self, GDNativeInt p_index); // p_self should be a PackedInt32Array
  352. int64_t *(*packed_int64_array_operator_index)(GDNativeTypePtr p_self, GDNativeInt p_index); // p_self should be a PackedInt32Array
  353. const int64_t *(*packed_int64_array_operator_index_const)(const GDNativeTypePtr p_self, GDNativeInt p_index); // p_self should be a PackedInt32Array
  354. GDNativeStringPtr (*packed_string_array_operator_index)(GDNativeTypePtr p_self, GDNativeInt p_index); // p_self should be a PackedStringArray
  355. GDNativeStringPtr (*packed_string_array_operator_index_const)(const GDNativeTypePtr p_self, GDNativeInt p_index); // p_self should be a PackedStringArray
  356. GDNativeTypePtr (*packed_vector2_array_operator_index)(GDNativeTypePtr p_self, GDNativeInt p_index); // p_self should be a PackedVector2Array, returns Vector2 ptr
  357. GDNativeTypePtr (*packed_vector2_array_operator_index_const)(const GDNativeTypePtr p_self, GDNativeInt p_index); // p_self should be a PackedVector2Array, returns Vector2 ptr
  358. GDNativeTypePtr (*packed_vector3_array_operator_index)(GDNativeTypePtr p_self, GDNativeInt p_index); // p_self should be a PackedVector3Array, returns Vector3 ptr
  359. GDNativeTypePtr (*packed_vector3_array_operator_index_const)(const GDNativeTypePtr p_self, GDNativeInt p_index); // p_self should be a PackedVector3Array, returns Vector3 ptr
  360. /* OBJECT */
  361. void (*object_method_bind_call)(const GDNativeMethodBindPtr p_method_bind, GDNativeObjectPtr p_instance, const GDNativeVariantPtr *p_args, GDNativeInt p_arg_count, GDNativeVariantPtr r_ret, GDNativeCallError *r_error);
  362. void (*object_method_bind_ptrcall)(const GDNativeMethodBindPtr p_method_bind, GDNativeObjectPtr p_instance, const GDNativeTypePtr *p_args, GDNativeTypePtr r_ret);
  363. void (*object_destroy)(GDNativeObjectPtr p_o);
  364. GDNativeObjectPtr (*global_get_singleton)(const char *p_name);
  365. void *(*object_get_instance_binding)(GDNativeObjectPtr p_o, void *p_token, const GDNativeInstanceBindingCallbacks *p_callbacks);
  366. void (*object_set_instance_binding)(GDNativeObjectPtr p_o, void *p_token, void *p_binding, const GDNativeInstanceBindingCallbacks *p_callbacks);
  367. GDNativeObjectPtr (*object_cast_to)(const GDNativeObjectPtr p_object, void *p_class_tag);
  368. GDNativeObjectPtr (*object_get_instance_from_id)(GDObjectInstanceID p_instance_id);
  369. GDObjectInstanceID (*object_get_instance_id)(const GDNativeObjectPtr p_object);
  370. /* CLASSDB */
  371. GDNativeClassConstructor (*classdb_get_constructor)(const char *p_classname);
  372. GDNativeMethodBindPtr (*classdb_get_method_bind)(const char *p_classname, const char *p_methodname, GDNativeInt p_hash);
  373. void *(*classdb_get_class_tag)(const char *p_classname);
  374. /* CLASSDB EXTENSION */
  375. void (*classdb_register_extension_class)(const GDNativeExtensionClassLibraryPtr p_library, const char *p_class_name, const char *p_parent_class_name, const GDNativeExtensionClassCreationInfo *p_extension_funcs);
  376. void (*classdb_register_extension_class_method)(const GDNativeExtensionClassLibraryPtr p_library, const char *p_class_name, const GDNativeExtensionClassMethodInfo *p_method_info);
  377. void (*classdb_register_extension_class_integer_constant)(const GDNativeExtensionClassLibraryPtr p_library, const char *p_class_name, const char *p_enum_name, const char *p_constant_name, GDNativeInt p_constant_value);
  378. void (*classdb_register_extension_class_property)(const GDNativeExtensionClassLibraryPtr p_library, const char *p_class_name, const GDNativePropertyInfo *p_info, const char *p_setter, const char *p_getter);
  379. void (*classdb_register_extension_class_signal)(const GDNativeExtensionClassLibraryPtr p_library, const char *p_class_name, const char *p_signal_name, const GDNativePropertyInfo *p_argument_info, GDNativeInt p_argument_count);
  380. void (*classdb_unregister_extension_class)(const GDNativeExtensionClassLibraryPtr p_library, const char *p_class_name); /* Unregistering a parent class before a class that inherits it will result in failure. Inheritors must be unregistered first. */
  381. } GDNativeInterface;
  382. /* INITIALIZATION */
  383. typedef enum {
  384. GDNATIVE_INITIALIZATION_CORE,
  385. GDNATIVE_INITIALIZATION_SERVERS,
  386. GDNATIVE_INITIALIZATION_SCENE,
  387. GDNATIVE_INITIALIZATION_EDITOR,
  388. } GDNativeInitializationLevel;
  389. typedef struct {
  390. /* Minimum initialization level required.
  391. * If Core or Servers, the extension needs editor or game restart to take effect */
  392. GDNativeInitializationLevel minimum_initialization_level;
  393. /* Up to the user to supply when initializing */
  394. void *userdata;
  395. /* This function will be called multiple times for each initialization level. */
  396. void (*initialize)(void *userdata, GDNativeInitializationLevel p_level);
  397. void (*deinitialize)(void *userdata, GDNativeInitializationLevel p_level);
  398. } GDNativeInitialization;
  399. /* Define a C function prototype that implements the function below and expose it to dlopen() (or similar).
  400. * It will be called on initialization. The name must be an unique one specified in the .gdextension config file.
  401. */
  402. typedef GDNativeBool (*GDNativeInitializationFunction)(const GDNativeInterface *p_interface, const GDNativeExtensionClassLibraryPtr p_library, GDNativeInitialization *r_initialization);
  403. #ifdef __cplusplus
  404. }
  405. #endif
  406. #endif