gdnative_interface.h 35 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585
  1. /*************************************************************************/
  2. /* gdnative_interface.h */
  3. /*************************************************************************/
  4. /* This file is part of: */
  5. /* GODOT ENGINE */
  6. /* https://godotengine.org */
  7. /*************************************************************************/
  8. /* Copyright (c) 2007-2022 Juan Linietsky, Ariel Manzur. */
  9. /* Copyright (c) 2014-2022 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. GDNATIVE_VARIANT_OP_POWER,
  105. /* bitwise */
  106. GDNATIVE_VARIANT_OP_SHIFT_LEFT,
  107. GDNATIVE_VARIANT_OP_SHIFT_RIGHT,
  108. GDNATIVE_VARIANT_OP_BIT_AND,
  109. GDNATIVE_VARIANT_OP_BIT_OR,
  110. GDNATIVE_VARIANT_OP_BIT_XOR,
  111. GDNATIVE_VARIANT_OP_BIT_NEGATE,
  112. /* logic */
  113. GDNATIVE_VARIANT_OP_AND,
  114. GDNATIVE_VARIANT_OP_OR,
  115. GDNATIVE_VARIANT_OP_XOR,
  116. GDNATIVE_VARIANT_OP_NOT,
  117. /* containment */
  118. GDNATIVE_VARIANT_OP_IN,
  119. GDNATIVE_VARIANT_OP_MAX
  120. } GDNativeVariantOperator;
  121. typedef void *GDNativeVariantPtr;
  122. typedef void *GDNativeStringNamePtr;
  123. typedef void *GDNativeStringPtr;
  124. typedef void *GDNativeObjectPtr;
  125. typedef void *GDNativeTypePtr;
  126. typedef void *GDNativeExtensionPtr;
  127. typedef void *GDNativeMethodBindPtr;
  128. typedef int64_t GDNativeInt;
  129. typedef uint8_t GDNativeBool;
  130. typedef uint64_t GDObjectInstanceID;
  131. /* VARIANT DATA I/O */
  132. typedef enum {
  133. GDNATIVE_CALL_OK,
  134. GDNATIVE_CALL_ERROR_INVALID_METHOD,
  135. GDNATIVE_CALL_ERROR_INVALID_ARGUMENT, /* expected is variant type */
  136. GDNATIVE_CALL_ERROR_TOO_MANY_ARGUMENTS, /* expected is number of arguments */
  137. GDNATIVE_CALL_ERROR_TOO_FEW_ARGUMENTS, /* expected is number of arguments */
  138. GDNATIVE_CALL_ERROR_INSTANCE_IS_NULL,
  139. GDNATIVE_CALL_ERROR_METHOD_NOT_CONST, /* used for const call */
  140. } GDNativeCallErrorType;
  141. typedef struct {
  142. GDNativeCallErrorType error;
  143. int32_t argument;
  144. int32_t expected;
  145. } GDNativeCallError;
  146. typedef void (*GDNativeVariantFromTypeConstructorFunc)(GDNativeVariantPtr, GDNativeTypePtr);
  147. typedef void (*GDNativeTypeFromVariantConstructorFunc)(GDNativeTypePtr, GDNativeVariantPtr);
  148. typedef void (*GDNativePtrOperatorEvaluator)(const GDNativeTypePtr p_left, const GDNativeTypePtr p_right, GDNativeTypePtr r_result);
  149. typedef void (*GDNativePtrBuiltInMethod)(GDNativeTypePtr p_base, const GDNativeTypePtr *p_args, GDNativeTypePtr r_return, int p_argument_count);
  150. typedef void (*GDNativePtrConstructor)(GDNativeTypePtr p_base, const GDNativeTypePtr *p_args);
  151. typedef void (*GDNativePtrDestructor)(GDNativeTypePtr p_base);
  152. typedef void (*GDNativePtrSetter)(GDNativeTypePtr p_base, const GDNativeTypePtr p_value);
  153. typedef void (*GDNativePtrGetter)(const GDNativeTypePtr p_base, GDNativeTypePtr r_value);
  154. typedef void (*GDNativePtrIndexedSetter)(GDNativeTypePtr p_base, GDNativeInt p_index, const GDNativeTypePtr p_value);
  155. typedef void (*GDNativePtrIndexedGetter)(const GDNativeTypePtr p_base, GDNativeInt p_index, GDNativeTypePtr r_value);
  156. typedef void (*GDNativePtrKeyedSetter)(GDNativeTypePtr p_base, const GDNativeTypePtr p_key, const GDNativeTypePtr p_value);
  157. typedef void (*GDNativePtrKeyedGetter)(const GDNativeTypePtr p_base, const GDNativeTypePtr p_key, GDNativeTypePtr r_value);
  158. typedef uint32_t (*GDNativePtrKeyedChecker)(const GDNativeVariantPtr p_base, const GDNativeVariantPtr p_key);
  159. typedef void (*GDNativePtrUtilityFunction)(GDNativeTypePtr r_return, const GDNativeTypePtr *p_arguments, int p_argument_count);
  160. typedef GDNativeObjectPtr (*GDNativeClassConstructor)();
  161. typedef void *(*GDNativeInstanceBindingCreateCallback)(void *p_token, void *p_instance);
  162. typedef void (*GDNativeInstanceBindingFreeCallback)(void *p_token, void *p_instance, void *p_binding);
  163. typedef GDNativeBool (*GDNativeInstanceBindingReferenceCallback)(void *p_token, void *p_binding, GDNativeBool p_reference);
  164. typedef struct {
  165. GDNativeInstanceBindingCreateCallback create_callback;
  166. GDNativeInstanceBindingFreeCallback free_callback;
  167. GDNativeInstanceBindingReferenceCallback reference_callback;
  168. } GDNativeInstanceBindingCallbacks;
  169. /* EXTENSION CLASSES */
  170. typedef void *GDExtensionClassInstancePtr;
  171. typedef GDNativeBool (*GDNativeExtensionClassSet)(GDExtensionClassInstancePtr p_instance, const GDNativeStringNamePtr p_name, const GDNativeVariantPtr p_value);
  172. typedef GDNativeBool (*GDNativeExtensionClassGet)(GDExtensionClassInstancePtr p_instance, const GDNativeStringNamePtr p_name, GDNativeVariantPtr r_ret);
  173. typedef uint64_t (*GDNativeExtensionClassGetRID)(GDExtensionClassInstancePtr p_instance);
  174. typedef struct {
  175. uint32_t type;
  176. const char *name;
  177. const char *class_name;
  178. uint32_t hint;
  179. const char *hint_string;
  180. uint32_t usage;
  181. } GDNativePropertyInfo;
  182. typedef struct {
  183. const char *name;
  184. GDNativePropertyInfo return_value;
  185. uint32_t flags; // From GDNativeExtensionClassMethodFlags
  186. int32_t id;
  187. GDNativePropertyInfo *arguments;
  188. uint32_t argument_count;
  189. GDNativeVariantPtr default_arguments;
  190. uint32_t default_argument_count;
  191. } GDNativeMethodInfo;
  192. typedef const GDNativePropertyInfo *(*GDNativeExtensionClassGetPropertyList)(GDExtensionClassInstancePtr p_instance, uint32_t *r_count);
  193. typedef void (*GDNativeExtensionClassFreePropertyList)(GDExtensionClassInstancePtr p_instance, const GDNativePropertyInfo *p_list);
  194. typedef void (*GDNativeExtensionClassNotification)(GDExtensionClassInstancePtr p_instance, int32_t p_what);
  195. typedef void (*GDNativeExtensionClassToString)(GDExtensionClassInstancePtr p_instance, GDNativeStringPtr p_out);
  196. typedef void (*GDNativeExtensionClassReference)(GDExtensionClassInstancePtr p_instance);
  197. typedef void (*GDNativeExtensionClassUnreference)(GDExtensionClassInstancePtr p_instance);
  198. typedef void (*GDNativeExtensionClassCallVirtual)(GDExtensionClassInstancePtr p_instance, const GDNativeTypePtr *p_args, GDNativeTypePtr r_ret);
  199. typedef GDNativeObjectPtr (*GDNativeExtensionClassCreateInstance)(void *p_userdata);
  200. typedef void (*GDNativeExtensionClassFreeInstance)(void *p_userdata, GDExtensionClassInstancePtr p_instance);
  201. typedef void (*GDNativeExtensionClassObjectInstance)(GDExtensionClassInstancePtr p_instance, GDNativeObjectPtr p_object_instance);
  202. typedef GDNativeExtensionClassCallVirtual (*GDNativeExtensionClassGetVirtual)(void *p_userdata, const char *p_name);
  203. typedef struct {
  204. GDNativeExtensionClassSet set_func;
  205. GDNativeExtensionClassGet get_func;
  206. GDNativeExtensionClassGetPropertyList get_property_list_func;
  207. GDNativeExtensionClassFreePropertyList free_property_list_func;
  208. GDNativeExtensionClassNotification notification_func;
  209. GDNativeExtensionClassToString to_string_func;
  210. GDNativeExtensionClassReference reference_func;
  211. GDNativeExtensionClassUnreference unreference_func;
  212. GDNativeExtensionClassCreateInstance create_instance_func; /* this one is mandatory */
  213. GDNativeExtensionClassFreeInstance free_instance_func; /* this one is mandatory */
  214. GDNativeExtensionClassGetVirtual get_virtual_func;
  215. GDNativeExtensionClassGetRID get_rid_func;
  216. void *class_userdata;
  217. } GDNativeExtensionClassCreationInfo;
  218. typedef void *GDNativeExtensionClassLibraryPtr;
  219. /* Method */
  220. typedef enum {
  221. GDNATIVE_EXTENSION_METHOD_FLAG_NORMAL = 1,
  222. GDNATIVE_EXTENSION_METHOD_FLAG_EDITOR = 2,
  223. GDNATIVE_EXTENSION_METHOD_FLAG_NOSCRIPT = 4,
  224. GDNATIVE_EXTENSION_METHOD_FLAG_CONST = 8,
  225. GDNATIVE_EXTENSION_METHOD_FLAG_REVERSE = 16, /* used for events */
  226. GDNATIVE_EXTENSION_METHOD_FLAG_VIRTUAL = 32,
  227. GDNATIVE_EXTENSION_METHOD_FLAG_FROM_SCRIPT = 64,
  228. GDNATIVE_EXTENSION_METHOD_FLAG_VARARG = 128,
  229. GDNATIVE_EXTENSION_METHOD_FLAG_STATIC = 256,
  230. GDNATIVE_EXTENSION_METHOD_FLAGS_DEFAULT = GDNATIVE_EXTENSION_METHOD_FLAG_NORMAL,
  231. } GDNativeExtensionClassMethodFlags;
  232. typedef enum {
  233. GDNATIVE_EXTENSION_METHOD_ARGUMENT_METADATA_NONE,
  234. GDNATIVE_EXTENSION_METHOD_ARGUMENT_METADATA_INT_IS_INT8,
  235. GDNATIVE_EXTENSION_METHOD_ARGUMENT_METADATA_INT_IS_INT16,
  236. GDNATIVE_EXTENSION_METHOD_ARGUMENT_METADATA_INT_IS_INT32,
  237. GDNATIVE_EXTENSION_METHOD_ARGUMENT_METADATA_INT_IS_INT64,
  238. GDNATIVE_EXTENSION_METHOD_ARGUMENT_METADATA_INT_IS_UINT8,
  239. GDNATIVE_EXTENSION_METHOD_ARGUMENT_METADATA_INT_IS_UINT16,
  240. GDNATIVE_EXTENSION_METHOD_ARGUMENT_METADATA_INT_IS_UINT32,
  241. GDNATIVE_EXTENSION_METHOD_ARGUMENT_METADATA_INT_IS_UINT64,
  242. GDNATIVE_EXTENSION_METHOD_ARGUMENT_METADATA_REAL_IS_FLOAT,
  243. GDNATIVE_EXTENSION_METHOD_ARGUMENT_METADATA_REAL_IS_DOUBLE
  244. } GDNativeExtensionClassMethodArgumentMetadata;
  245. typedef void (*GDNativeExtensionClassMethodCall)(void *method_userdata, GDExtensionClassInstancePtr p_instance, const GDNativeVariantPtr *p_args, const GDNativeInt p_argument_count, GDNativeVariantPtr r_return, GDNativeCallError *r_error);
  246. typedef void (*GDNativeExtensionClassMethodPtrCall)(void *method_userdata, GDExtensionClassInstancePtr p_instance, const GDNativeTypePtr *p_args, GDNativeTypePtr r_ret);
  247. /* passing -1 as argument in the following functions refers to the return type */
  248. typedef GDNativeVariantType (*GDNativeExtensionClassMethodGetArgumentType)(void *p_method_userdata, int32_t p_argument);
  249. typedef void (*GDNativeExtensionClassMethodGetArgumentInfo)(void *p_method_userdata, int32_t p_argument, GDNativePropertyInfo *r_info);
  250. typedef GDNativeExtensionClassMethodArgumentMetadata (*GDNativeExtensionClassMethodGetArgumentMetadata)(void *p_method_userdata, int32_t p_argument);
  251. typedef struct {
  252. const char *name;
  253. void *method_userdata;
  254. GDNativeExtensionClassMethodCall call_func;
  255. GDNativeExtensionClassMethodPtrCall ptrcall_func;
  256. uint32_t method_flags; /* GDNativeExtensionClassMethodFlags */
  257. uint32_t argument_count;
  258. GDNativeBool has_return_value;
  259. GDNativeExtensionClassMethodGetArgumentType get_argument_type_func;
  260. 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. */
  261. GDNativeExtensionClassMethodGetArgumentMetadata get_argument_metadata_func;
  262. uint32_t default_argument_count;
  263. GDNativeVariantPtr *default_arguments;
  264. } GDNativeExtensionClassMethodInfo;
  265. /* SCRIPT INSTANCE EXTENSION */
  266. typedef void *GDNativeExtensionScriptInstanceDataPtr; // Pointer to custom ScriptInstance native implementation
  267. typedef GDNativeBool (*GDNativeExtensionScriptInstanceSet)(GDNativeExtensionScriptInstanceDataPtr p_instance, const GDNativeStringNamePtr p_name, const GDNativeVariantPtr p_value);
  268. typedef GDNativeBool (*GDNativeExtensionScriptInstanceGet)(GDNativeExtensionScriptInstanceDataPtr p_instance, const GDNativeStringNamePtr p_name, GDNativeVariantPtr r_ret);
  269. typedef const GDNativePropertyInfo *(*GDNativeExtensionScriptInstanceGetPropertyList)(GDNativeExtensionScriptInstanceDataPtr p_instance, uint32_t *r_count);
  270. typedef void (*GDNativeExtensionScriptInstanceFreePropertyList)(GDNativeExtensionScriptInstanceDataPtr p_instance, const GDNativePropertyInfo *p_list);
  271. typedef GDNativeVariantType (*GDNativeExtensionScriptInstanceGetPropertyType)(GDNativeExtensionScriptInstanceDataPtr p_instance, const GDNativeStringNamePtr p_name, GDNativeBool *r_is_valid);
  272. typedef GDNativeObjectPtr (*GDNativeExtensionScriptInstanceGetOwner)(GDNativeExtensionScriptInstanceDataPtr p_instance);
  273. typedef void (*GDNativeExtensionScriptInstancePropertyStateAdd)(const GDNativeStringNamePtr p_name, const GDNativeVariantPtr p_value, void *p_userdata);
  274. typedef void (*GDNativeExtensionScriptInstanceGetPropertyState)(GDNativeExtensionScriptInstanceDataPtr p_instance, GDNativeExtensionScriptInstancePropertyStateAdd p_add_func, void *p_userdata);
  275. typedef const GDNativeMethodInfo *(*GDNativeExtensionScriptInstanceGetMethodList)(GDNativeExtensionScriptInstanceDataPtr p_instance, uint32_t *r_count);
  276. typedef void (*GDNativeExtensionScriptInstanceFreeMethodList)(GDNativeExtensionScriptInstanceDataPtr p_instance, const GDNativeMethodInfo *p_list);
  277. typedef GDNativeBool (*GDNativeExtensionScriptInstanceHasMethod)(GDNativeExtensionScriptInstanceDataPtr p_instance, const GDNativeStringNamePtr p_name);
  278. typedef void (*GDNativeExtensionScriptInstanceCall)(GDNativeExtensionScriptInstanceDataPtr p_self, const GDNativeStringNamePtr p_method, const GDNativeVariantPtr *p_args, const GDNativeInt p_argument_count, GDNativeVariantPtr r_return, GDNativeCallError *r_error);
  279. typedef void (*GDNativeExtensionScriptInstanceNotification)(GDNativeExtensionScriptInstanceDataPtr p_instance, int32_t p_what);
  280. typedef const char *(*GDNativeExtensionScriptInstanceToString)(GDNativeExtensionScriptInstanceDataPtr p_instance, GDNativeBool *r_is_valid);
  281. typedef void (*GDNativeExtensionScriptInstanceRefCountIncremented)(GDNativeExtensionScriptInstanceDataPtr p_instance);
  282. typedef GDNativeBool (*GDNativeExtensionScriptInstanceRefCountDecremented)(GDNativeExtensionScriptInstanceDataPtr p_instance);
  283. typedef GDNativeObjectPtr (*GDNativeExtensionScriptInstanceGetScript)(GDNativeExtensionScriptInstanceDataPtr p_instance);
  284. typedef GDNativeBool (*GDNativeExtensionScriptInstanceIsPlaceholder)(GDNativeExtensionScriptInstanceDataPtr p_instance);
  285. typedef void *GDNativeExtensionScriptLanguagePtr;
  286. typedef GDNativeExtensionScriptLanguagePtr (*GDNativeExtensionScriptInstanceGetLanguage)(GDNativeExtensionScriptInstanceDataPtr p_instance);
  287. typedef void (*GDNativeExtensionScriptInstanceFree)(GDNativeExtensionScriptInstanceDataPtr p_instance);
  288. typedef void *GDNativeScriptInstancePtr; // Pointer to ScriptInstance.
  289. typedef struct {
  290. GDNativeExtensionScriptInstanceSet set_func;
  291. GDNativeExtensionScriptInstanceGet get_func;
  292. GDNativeExtensionScriptInstanceGetPropertyList get_property_list_func;
  293. GDNativeExtensionScriptInstanceFreePropertyList free_property_list_func;
  294. GDNativeExtensionScriptInstanceGetPropertyType get_property_type_func;
  295. GDNativeExtensionScriptInstanceGetOwner get_owner_func;
  296. GDNativeExtensionScriptInstanceGetPropertyState get_property_state_func;
  297. GDNativeExtensionScriptInstanceGetMethodList get_method_list_func;
  298. GDNativeExtensionScriptInstanceFreeMethodList free_method_list_func;
  299. GDNativeExtensionScriptInstanceHasMethod has_method_func;
  300. GDNativeExtensionScriptInstanceCall call_func;
  301. GDNativeExtensionScriptInstanceNotification notification_func;
  302. GDNativeExtensionScriptInstanceToString to_string_func;
  303. GDNativeExtensionScriptInstanceRefCountIncremented refcount_incremented_func;
  304. GDNativeExtensionScriptInstanceRefCountDecremented refcount_decremented_func;
  305. GDNativeExtensionScriptInstanceGetScript get_script_func;
  306. GDNativeExtensionScriptInstanceIsPlaceholder is_placeholder_func;
  307. GDNativeExtensionScriptInstanceSet set_fallback_func;
  308. GDNativeExtensionScriptInstanceGet get_fallback_func;
  309. GDNativeExtensionScriptInstanceGetLanguage get_language_func;
  310. GDNativeExtensionScriptInstanceFree free_func;
  311. } GDNativeExtensionScriptInstanceInfo;
  312. /* INTERFACE */
  313. typedef struct {
  314. uint32_t version_major;
  315. uint32_t version_minor;
  316. uint32_t version_patch;
  317. const char *version_string;
  318. /* GODOT CORE */
  319. void *(*mem_alloc)(size_t p_bytes);
  320. void *(*mem_realloc)(void *p_ptr, size_t p_bytes);
  321. void (*mem_free)(void *p_ptr);
  322. void (*print_error)(const char *p_description, const char *p_function, const char *p_file, int32_t p_line);
  323. void (*print_warning)(const char *p_description, const char *p_function, const char *p_file, int32_t p_line);
  324. void (*print_script_error)(const char *p_description, const char *p_function, const char *p_file, int32_t p_line);
  325. uint64_t (*get_native_struct_size)(const char *p_name);
  326. /* GODOT VARIANT */
  327. /* variant general */
  328. void (*variant_new_copy)(GDNativeVariantPtr r_dest, const GDNativeVariantPtr p_src);
  329. void (*variant_new_nil)(GDNativeVariantPtr r_dest);
  330. void (*variant_destroy)(GDNativeVariantPtr p_self);
  331. /* variant type */
  332. 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);
  333. 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);
  334. void (*variant_evaluate)(GDNativeVariantOperator p_op, const GDNativeVariantPtr p_a, const GDNativeVariantPtr p_b, GDNativeVariantPtr r_return, GDNativeBool *r_valid);
  335. void (*variant_set)(GDNativeVariantPtr p_self, const GDNativeVariantPtr p_key, const GDNativeVariantPtr p_value, GDNativeBool *r_valid);
  336. void (*variant_set_named)(GDNativeVariantPtr p_self, const GDNativeStringNamePtr p_key, const GDNativeVariantPtr p_value, GDNativeBool *r_valid);
  337. void (*variant_set_keyed)(GDNativeVariantPtr p_self, const GDNativeVariantPtr p_key, const GDNativeVariantPtr p_value, GDNativeBool *r_valid);
  338. void (*variant_set_indexed)(GDNativeVariantPtr p_self, GDNativeInt p_index, const GDNativeVariantPtr p_value, GDNativeBool *r_valid, GDNativeBool *r_oob);
  339. void (*variant_get)(const GDNativeVariantPtr p_self, const GDNativeVariantPtr p_key, GDNativeVariantPtr r_ret, GDNativeBool *r_valid);
  340. void (*variant_get_named)(const GDNativeVariantPtr p_self, const GDNativeStringNamePtr p_key, GDNativeVariantPtr r_ret, GDNativeBool *r_valid);
  341. void (*variant_get_keyed)(const GDNativeVariantPtr p_self, const GDNativeVariantPtr p_key, GDNativeVariantPtr r_ret, GDNativeBool *r_valid);
  342. void (*variant_get_indexed)(const GDNativeVariantPtr p_self, GDNativeInt p_index, GDNativeVariantPtr r_ret, GDNativeBool *r_valid, GDNativeBool *r_oob);
  343. GDNativeBool (*variant_iter_init)(const GDNativeVariantPtr p_self, GDNativeVariantPtr r_iter, GDNativeBool *r_valid);
  344. GDNativeBool (*variant_iter_next)(const GDNativeVariantPtr p_self, GDNativeVariantPtr r_iter, GDNativeBool *r_valid);
  345. void (*variant_iter_get)(const GDNativeVariantPtr p_self, GDNativeVariantPtr r_iter, GDNativeVariantPtr r_ret, GDNativeBool *r_valid);
  346. GDNativeInt (*variant_hash)(const GDNativeVariantPtr p_self);
  347. GDNativeInt (*variant_recursive_hash)(const GDNativeVariantPtr p_self, GDNativeInt p_recursion_count);
  348. GDNativeBool (*variant_hash_compare)(const GDNativeVariantPtr p_self, const GDNativeVariantPtr p_other);
  349. GDNativeBool (*variant_booleanize)(const GDNativeVariantPtr p_self);
  350. void (*variant_sub)(const GDNativeVariantPtr p_a, const GDNativeVariantPtr p_b, GDNativeVariantPtr r_dst);
  351. void (*variant_blend)(const GDNativeVariantPtr p_a, const GDNativeVariantPtr p_b, float p_c, GDNativeVariantPtr r_dst);
  352. void (*variant_interpolate)(const GDNativeVariantPtr p_a, const GDNativeVariantPtr p_b, float p_c, GDNativeVariantPtr r_dst);
  353. void (*variant_duplicate)(const GDNativeVariantPtr p_self, GDNativeVariantPtr r_ret, GDNativeBool p_deep);
  354. void (*variant_stringify)(const GDNativeVariantPtr p_self, GDNativeStringPtr r_ret);
  355. GDNativeVariantType (*variant_get_type)(const GDNativeVariantPtr p_self);
  356. GDNativeBool (*variant_has_method)(const GDNativeVariantPtr p_self, const GDNativeStringNamePtr p_method);
  357. GDNativeBool (*variant_has_member)(GDNativeVariantType p_type, const GDNativeStringNamePtr p_member);
  358. GDNativeBool (*variant_has_key)(const GDNativeVariantPtr p_self, const GDNativeVariantPtr p_key, GDNativeBool *r_valid);
  359. void (*variant_get_type_name)(GDNativeVariantType p_type, GDNativeStringPtr r_name);
  360. GDNativeBool (*variant_can_convert)(GDNativeVariantType p_from, GDNativeVariantType p_to);
  361. GDNativeBool (*variant_can_convert_strict)(GDNativeVariantType p_from, GDNativeVariantType p_to);
  362. /* ptrcalls */
  363. GDNativeVariantFromTypeConstructorFunc (*get_variant_from_type_constructor)(GDNativeVariantType p_type);
  364. GDNativeTypeFromVariantConstructorFunc (*get_variant_to_type_constructor)(GDNativeVariantType p_type);
  365. GDNativePtrOperatorEvaluator (*variant_get_ptr_operator_evaluator)(GDNativeVariantOperator p_operator, GDNativeVariantType p_type_a, GDNativeVariantType p_type_b);
  366. GDNativePtrBuiltInMethod (*variant_get_ptr_builtin_method)(GDNativeVariantType p_type, const char *p_method, GDNativeInt p_hash);
  367. GDNativePtrConstructor (*variant_get_ptr_constructor)(GDNativeVariantType p_type, int32_t p_constructor);
  368. GDNativePtrDestructor (*variant_get_ptr_destructor)(GDNativeVariantType p_type);
  369. void (*variant_construct)(GDNativeVariantType p_type, GDNativeVariantPtr p_base, const GDNativeVariantPtr *p_args, int32_t p_argument_count, GDNativeCallError *r_error);
  370. GDNativePtrSetter (*variant_get_ptr_setter)(GDNativeVariantType p_type, const char *p_member);
  371. GDNativePtrGetter (*variant_get_ptr_getter)(GDNativeVariantType p_type, const char *p_member);
  372. GDNativePtrIndexedSetter (*variant_get_ptr_indexed_setter)(GDNativeVariantType p_type);
  373. GDNativePtrIndexedGetter (*variant_get_ptr_indexed_getter)(GDNativeVariantType p_type);
  374. GDNativePtrKeyedSetter (*variant_get_ptr_keyed_setter)(GDNativeVariantType p_type);
  375. GDNativePtrKeyedGetter (*variant_get_ptr_keyed_getter)(GDNativeVariantType p_type);
  376. GDNativePtrKeyedChecker (*variant_get_ptr_keyed_checker)(GDNativeVariantType p_type);
  377. void (*variant_get_constant_value)(GDNativeVariantType p_type, const char *p_constant, GDNativeVariantPtr r_ret);
  378. GDNativePtrUtilityFunction (*variant_get_ptr_utility_function)(const char *p_function, GDNativeInt p_hash);
  379. /* extra utilities */
  380. void (*string_new_with_latin1_chars)(GDNativeStringPtr r_dest, const char *p_contents);
  381. void (*string_new_with_utf8_chars)(GDNativeStringPtr r_dest, const char *p_contents);
  382. void (*string_new_with_utf16_chars)(GDNativeStringPtr r_dest, const char16_t *p_contents);
  383. void (*string_new_with_utf32_chars)(GDNativeStringPtr r_dest, const char32_t *p_contents);
  384. void (*string_new_with_wide_chars)(GDNativeStringPtr r_dest, const wchar_t *p_contents);
  385. void (*string_new_with_latin1_chars_and_len)(GDNativeStringPtr r_dest, const char *p_contents, const GDNativeInt p_size);
  386. void (*string_new_with_utf8_chars_and_len)(GDNativeStringPtr r_dest, const char *p_contents, const GDNativeInt p_size);
  387. void (*string_new_with_utf16_chars_and_len)(GDNativeStringPtr r_dest, const char16_t *p_contents, const GDNativeInt p_size);
  388. void (*string_new_with_utf32_chars_and_len)(GDNativeStringPtr r_dest, const char32_t *p_contents, const GDNativeInt p_size);
  389. void (*string_new_with_wide_chars_and_len)(GDNativeStringPtr r_dest, const wchar_t *p_contents, const GDNativeInt p_size);
  390. /* Information about the following functions:
  391. * - The return value is the resulting encoded string length.
  392. * - The length returned is in characters, not in bytes. It also does not include a trailing zero.
  393. * - 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).
  394. * - Passing NULL in r_text means only the length is computed (again, without including trailing zero).
  395. * - p_max_write_length argument is in characters, not bytes. It will be ignored if r_text is NULL.
  396. * - p_max_write_length argument does not affect the return value, it's only to cap write length.
  397. */
  398. GDNativeInt (*string_to_latin1_chars)(const GDNativeStringPtr p_self, char *r_text, GDNativeInt p_max_write_length);
  399. GDNativeInt (*string_to_utf8_chars)(const GDNativeStringPtr p_self, char *r_text, GDNativeInt p_max_write_length);
  400. GDNativeInt (*string_to_utf16_chars)(const GDNativeStringPtr p_self, char16_t *r_text, GDNativeInt p_max_write_length);
  401. GDNativeInt (*string_to_utf32_chars)(const GDNativeStringPtr p_self, char32_t *r_text, GDNativeInt p_max_write_length);
  402. GDNativeInt (*string_to_wide_chars)(const GDNativeStringPtr p_self, wchar_t *r_text, GDNativeInt p_max_write_length);
  403. char32_t *(*string_operator_index)(GDNativeStringPtr p_self, GDNativeInt p_index);
  404. const char32_t *(*string_operator_index_const)(const GDNativeStringPtr p_self, GDNativeInt p_index);
  405. /* Packed array functions */
  406. uint8_t *(*packed_byte_array_operator_index)(GDNativeTypePtr p_self, GDNativeInt p_index); // p_self should be a PackedByteArray
  407. const uint8_t *(*packed_byte_array_operator_index_const)(const GDNativeTypePtr p_self, GDNativeInt p_index); // p_self should be a PackedByteArray
  408. GDNativeTypePtr (*packed_color_array_operator_index)(GDNativeTypePtr p_self, GDNativeInt p_index); // p_self should be a PackedColorArray, returns Color ptr
  409. GDNativeTypePtr (*packed_color_array_operator_index_const)(const GDNativeTypePtr p_self, GDNativeInt p_index); // p_self should be a PackedColorArray, returns Color ptr
  410. float *(*packed_float32_array_operator_index)(GDNativeTypePtr p_self, GDNativeInt p_index); // p_self should be a PackedFloat32Array
  411. const float *(*packed_float32_array_operator_index_const)(const GDNativeTypePtr p_self, GDNativeInt p_index); // p_self should be a PackedFloat32Array
  412. double *(*packed_float64_array_operator_index)(GDNativeTypePtr p_self, GDNativeInt p_index); // p_self should be a PackedFloat64Array
  413. const double *(*packed_float64_array_operator_index_const)(const GDNativeTypePtr p_self, GDNativeInt p_index); // p_self should be a PackedFloat64Array
  414. int32_t *(*packed_int32_array_operator_index)(GDNativeTypePtr p_self, GDNativeInt p_index); // p_self should be a PackedInt32Array
  415. const int32_t *(*packed_int32_array_operator_index_const)(const GDNativeTypePtr p_self, GDNativeInt p_index); // p_self should be a PackedInt32Array
  416. int64_t *(*packed_int64_array_operator_index)(GDNativeTypePtr p_self, GDNativeInt p_index); // p_self should be a PackedInt32Array
  417. const int64_t *(*packed_int64_array_operator_index_const)(const GDNativeTypePtr p_self, GDNativeInt p_index); // p_self should be a PackedInt32Array
  418. GDNativeStringPtr (*packed_string_array_operator_index)(GDNativeTypePtr p_self, GDNativeInt p_index); // p_self should be a PackedStringArray
  419. GDNativeStringPtr (*packed_string_array_operator_index_const)(const GDNativeTypePtr p_self, GDNativeInt p_index); // p_self should be a PackedStringArray
  420. GDNativeTypePtr (*packed_vector2_array_operator_index)(GDNativeTypePtr p_self, GDNativeInt p_index); // p_self should be a PackedVector2Array, returns Vector2 ptr
  421. GDNativeTypePtr (*packed_vector2_array_operator_index_const)(const GDNativeTypePtr p_self, GDNativeInt p_index); // p_self should be a PackedVector2Array, returns Vector2 ptr
  422. GDNativeTypePtr (*packed_vector3_array_operator_index)(GDNativeTypePtr p_self, GDNativeInt p_index); // p_self should be a PackedVector3Array, returns Vector3 ptr
  423. GDNativeTypePtr (*packed_vector3_array_operator_index_const)(const GDNativeTypePtr p_self, GDNativeInt p_index); // p_self should be a PackedVector3Array, returns Vector3 ptr
  424. GDNativeVariantPtr (*array_operator_index)(GDNativeTypePtr p_self, GDNativeInt p_index); // p_self should be an Array ptr
  425. GDNativeVariantPtr (*array_operator_index_const)(const GDNativeTypePtr p_self, GDNativeInt p_index); // p_self should be an Array ptr
  426. /* Dictionary functions */
  427. GDNativeVariantPtr (*dictionary_operator_index)(GDNativeTypePtr p_self, const GDNativeVariantPtr p_key); // p_self should be an Dictionary ptr
  428. GDNativeVariantPtr (*dictionary_operator_index_const)(const GDNativeTypePtr p_self, const GDNativeVariantPtr p_key); // p_self should be an Dictionary ptr
  429. /* OBJECT */
  430. 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);
  431. void (*object_method_bind_ptrcall)(const GDNativeMethodBindPtr p_method_bind, GDNativeObjectPtr p_instance, const GDNativeTypePtr *p_args, GDNativeTypePtr r_ret);
  432. void (*object_destroy)(GDNativeObjectPtr p_o);
  433. GDNativeObjectPtr (*global_get_singleton)(const char *p_name);
  434. void *(*object_get_instance_binding)(GDNativeObjectPtr p_o, void *p_token, const GDNativeInstanceBindingCallbacks *p_callbacks);
  435. void (*object_set_instance_binding)(GDNativeObjectPtr p_o, void *p_token, void *p_binding, const GDNativeInstanceBindingCallbacks *p_callbacks);
  436. void (*object_set_instance)(GDNativeObjectPtr p_o, const char *p_classname, GDExtensionClassInstancePtr p_instance); /* p_classname should be a registered extension class and should extend the p_o object's class. */
  437. GDNativeObjectPtr (*object_cast_to)(const GDNativeObjectPtr p_object, void *p_class_tag);
  438. GDNativeObjectPtr (*object_get_instance_from_id)(GDObjectInstanceID p_instance_id);
  439. GDObjectInstanceID (*object_get_instance_id)(const GDNativeObjectPtr p_object);
  440. /* SCRIPT INSTANCE */
  441. GDNativeScriptInstancePtr (*script_instance_create)(const GDNativeExtensionScriptInstanceInfo *p_info, GDNativeExtensionScriptInstanceDataPtr p_instance_data);
  442. /* CLASSDB */
  443. GDNativeObjectPtr (*classdb_construct_object)(const char *p_classname); /* The passed class must be a built-in godot class, or an already-registered extension class. In both case, object_set_instance should be called to fully initialize the object. */
  444. GDNativeMethodBindPtr (*classdb_get_method_bind)(const char *p_classname, const char *p_methodname, GDNativeInt p_hash);
  445. void *(*classdb_get_class_tag)(const char *p_classname);
  446. /* CLASSDB EXTENSION */
  447. 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);
  448. void (*classdb_register_extension_class_method)(const GDNativeExtensionClassLibraryPtr p_library, const char *p_class_name, const GDNativeExtensionClassMethodInfo *p_method_info);
  449. 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, bool p_is_bitfield);
  450. 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);
  451. void (*classdb_register_extension_class_property_group)(const GDNativeExtensionClassLibraryPtr p_library, const char *p_class_name, const char *p_group_name, const char *p_prefix);
  452. void (*classdb_register_extension_class_property_subgroup)(const GDNativeExtensionClassLibraryPtr p_library, const char *p_class_name, const char *p_subgroup_name, const char *p_prefix);
  453. 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);
  454. 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. */
  455. void (*get_library_path)(const GDNativeExtensionClassLibraryPtr p_library, GDNativeStringPtr r_path);
  456. } GDNativeInterface;
  457. /* INITIALIZATION */
  458. typedef enum {
  459. GDNATIVE_INITIALIZATION_CORE,
  460. GDNATIVE_INITIALIZATION_SERVERS,
  461. GDNATIVE_INITIALIZATION_SCENE,
  462. GDNATIVE_INITIALIZATION_EDITOR,
  463. GDNATIVE_MAX_INITIALIZATION_LEVEL,
  464. } GDNativeInitializationLevel;
  465. typedef struct {
  466. /* Minimum initialization level required.
  467. * If Core or Servers, the extension needs editor or game restart to take effect */
  468. GDNativeInitializationLevel minimum_initialization_level;
  469. /* Up to the user to supply when initializing */
  470. void *userdata;
  471. /* This function will be called multiple times for each initialization level. */
  472. void (*initialize)(void *userdata, GDNativeInitializationLevel p_level);
  473. void (*deinitialize)(void *userdata, GDNativeInitializationLevel p_level);
  474. } GDNativeInitialization;
  475. /* Define a C function prototype that implements the function below and expose it to dlopen() (or similar).
  476. * It will be called on initialization. The name must be an unique one specified in the .gdextension config file.
  477. */
  478. typedef GDNativeBool (*GDNativeInitializationFunction)(const GDNativeInterface *p_interface, const GDNativeExtensionClassLibraryPtr p_library, GDNativeInitialization *r_initialization);
  479. #ifdef __cplusplus
  480. }
  481. #endif
  482. #endif