1 /*************************************************************************/ 2 /* variant.h */ 3 /*************************************************************************/ 4 /* This file is part of: */ 5 /* GODOT ENGINE */ 6 /* https://godotengine.org */ 7 /*************************************************************************/ 8 /* Copyright (c) 2007-2020 Juan Linietsky, Ariel Manzur. */ 9 /* Copyright (c) 2014-2020 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 31 #ifndef GODOT_VARIANT_H 32 #define GODOT_VARIANT_H 33 34 #ifdef __cplusplus 35 extern "C" { 36 #endif 37 38 #include <stdint.h> 39 40 #define GODOT_VARIANT_SIZE (16 + sizeof(int64_t)) 41 42 #ifndef GODOT_CORE_API_GODOT_VARIANT_TYPE_DEFINED 43 #define GODOT_CORE_API_GODOT_VARIANT_TYPE_DEFINED 44 typedef struct { 45 uint8_t _dont_touch_that[GODOT_VARIANT_SIZE]; 46 } godot_variant; 47 #endif 48 49 typedef enum godot_variant_type { 50 GODOT_VARIANT_TYPE_NIL, 51 52 // atomic types 53 GODOT_VARIANT_TYPE_BOOL, 54 GODOT_VARIANT_TYPE_INT, 55 GODOT_VARIANT_TYPE_REAL, 56 GODOT_VARIANT_TYPE_STRING, 57 58 // math types 59 60 GODOT_VARIANT_TYPE_VECTOR2, // 5 61 GODOT_VARIANT_TYPE_RECT2, 62 GODOT_VARIANT_TYPE_VECTOR3, 63 GODOT_VARIANT_TYPE_TRANSFORM2D, 64 GODOT_VARIANT_TYPE_PLANE, 65 GODOT_VARIANT_TYPE_QUAT, // 10 66 GODOT_VARIANT_TYPE_AABB, 67 GODOT_VARIANT_TYPE_BASIS, 68 GODOT_VARIANT_TYPE_TRANSFORM, 69 70 // misc types 71 GODOT_VARIANT_TYPE_COLOR, 72 GODOT_VARIANT_TYPE_NODE_PATH, // 15 73 GODOT_VARIANT_TYPE_RID, 74 GODOT_VARIANT_TYPE_OBJECT, 75 GODOT_VARIANT_TYPE_DICTIONARY, 76 GODOT_VARIANT_TYPE_ARRAY, // 20 77 78 // arrays 79 GODOT_VARIANT_TYPE_POOL_BYTE_ARRAY, 80 GODOT_VARIANT_TYPE_POOL_INT_ARRAY, 81 GODOT_VARIANT_TYPE_POOL_REAL_ARRAY, 82 GODOT_VARIANT_TYPE_POOL_STRING_ARRAY, 83 GODOT_VARIANT_TYPE_POOL_VECTOR2_ARRAY, // 25 84 GODOT_VARIANT_TYPE_POOL_VECTOR3_ARRAY, 85 GODOT_VARIANT_TYPE_POOL_COLOR_ARRAY, 86 } godot_variant_type; 87 88 typedef enum godot_variant_call_error_error { 89 GODOT_CALL_ERROR_CALL_OK, 90 GODOT_CALL_ERROR_CALL_ERROR_INVALID_METHOD, 91 GODOT_CALL_ERROR_CALL_ERROR_INVALID_ARGUMENT, 92 GODOT_CALL_ERROR_CALL_ERROR_TOO_MANY_ARGUMENTS, 93 GODOT_CALL_ERROR_CALL_ERROR_TOO_FEW_ARGUMENTS, 94 GODOT_CALL_ERROR_CALL_ERROR_INSTANCE_IS_NULL, 95 } godot_variant_call_error_error; 96 97 typedef struct godot_variant_call_error { 98 godot_variant_call_error_error error; 99 int argument; 100 godot_variant_type expected; 101 } godot_variant_call_error; 102 103 typedef enum godot_variant_operator { 104 // comparison 105 GODOT_VARIANT_OP_EQUAL, 106 GODOT_VARIANT_OP_NOT_EQUAL, 107 GODOT_VARIANT_OP_LESS, 108 GODOT_VARIANT_OP_LESS_EQUAL, 109 GODOT_VARIANT_OP_GREATER, 110 GODOT_VARIANT_OP_GREATER_EQUAL, 111 112 // mathematic 113 GODOT_VARIANT_OP_ADD, 114 GODOT_VARIANT_OP_SUBTRACT, 115 GODOT_VARIANT_OP_MULTIPLY, 116 GODOT_VARIANT_OP_DIVIDE, 117 GODOT_VARIANT_OP_NEGATE, 118 GODOT_VARIANT_OP_POSITIVE, 119 GODOT_VARIANT_OP_MODULE, 120 GODOT_VARIANT_OP_STRING_CONCAT, 121 122 // bitwise 123 GODOT_VARIANT_OP_SHIFT_LEFT, 124 GODOT_VARIANT_OP_SHIFT_RIGHT, 125 GODOT_VARIANT_OP_BIT_AND, 126 GODOT_VARIANT_OP_BIT_OR, 127 GODOT_VARIANT_OP_BIT_XOR, 128 GODOT_VARIANT_OP_BIT_NEGATE, 129 130 // logic 131 GODOT_VARIANT_OP_AND, 132 GODOT_VARIANT_OP_OR, 133 GODOT_VARIANT_OP_XOR, 134 GODOT_VARIANT_OP_NOT, 135 136 // containment 137 GODOT_VARIANT_OP_IN, 138 139 GODOT_VARIANT_OP_MAX, 140 } godot_variant_operator; 141 142 // reduce extern "C" nesting for VS2013 143 #ifdef __cplusplus 144 } 145 #endif 146 147 #include <gdnative/aabb.h> 148 #include <gdnative/array.h> 149 #include <gdnative/basis.h> 150 #include <gdnative/color.h> 151 #include <gdnative/dictionary.h> 152 #include <gdnative/node_path.h> 153 #include <gdnative/plane.h> 154 #include <gdnative/pool_arrays.h> 155 #include <gdnative/quat.h> 156 #include <gdnative/rect2.h> 157 #include <gdnative/rid.h> 158 #include <gdnative/string.h> 159 #include <gdnative/transform.h> 160 #include <gdnative/transform2d.h> 161 #include <gdnative/variant.h> 162 #include <gdnative/vector2.h> 163 #include <gdnative/vector3.h> 164 165 #include <gdnative/gdnative.h> 166 167 #ifdef __cplusplus 168 extern "C" { 169 #endif 170 171 godot_variant_type GDAPI godot_variant_get_type(const godot_variant *p_v); 172 173 void GDAPI godot_variant_new_copy(godot_variant *r_dest, const godot_variant *p_src); 174 175 void GDAPI godot_variant_new_nil(godot_variant *r_dest); 176 177 void GDAPI godot_variant_new_bool(godot_variant *r_dest, const godot_bool p_b); 178 void GDAPI godot_variant_new_uint(godot_variant *r_dest, const uint64_t p_i); 179 void GDAPI godot_variant_new_int(godot_variant *r_dest, const int64_t p_i); 180 void GDAPI godot_variant_new_real(godot_variant *r_dest, const double p_r); 181 void GDAPI godot_variant_new_string(godot_variant *r_dest, const godot_string *p_s); 182 void GDAPI godot_variant_new_vector2(godot_variant *r_dest, const godot_vector2 *p_v2); 183 void GDAPI godot_variant_new_rect2(godot_variant *r_dest, const godot_rect2 *p_rect2); 184 void GDAPI godot_variant_new_vector3(godot_variant *r_dest, const godot_vector3 *p_v3); 185 void GDAPI godot_variant_new_transform2d(godot_variant *r_dest, const godot_transform2d *p_t2d); 186 void GDAPI godot_variant_new_plane(godot_variant *r_dest, const godot_plane *p_plane); 187 void GDAPI godot_variant_new_quat(godot_variant *r_dest, const godot_quat *p_quat); 188 void GDAPI godot_variant_new_aabb(godot_variant *r_dest, const godot_aabb *p_aabb); 189 void GDAPI godot_variant_new_basis(godot_variant *r_dest, const godot_basis *p_basis); 190 void GDAPI godot_variant_new_transform(godot_variant *r_dest, const godot_transform *p_trans); 191 void GDAPI godot_variant_new_color(godot_variant *r_dest, const godot_color *p_color); 192 void GDAPI godot_variant_new_node_path(godot_variant *r_dest, const godot_node_path *p_np); 193 void GDAPI godot_variant_new_rid(godot_variant *r_dest, const godot_rid *p_rid); 194 void GDAPI godot_variant_new_object(godot_variant *r_dest, const godot_object *p_obj); 195 void GDAPI godot_variant_new_dictionary(godot_variant *r_dest, const godot_dictionary *p_dict); 196 void GDAPI godot_variant_new_array(godot_variant *r_dest, const godot_array *p_arr); 197 void GDAPI godot_variant_new_pool_byte_array(godot_variant *r_dest, const godot_pool_byte_array *p_pba); 198 void GDAPI godot_variant_new_pool_int_array(godot_variant *r_dest, const godot_pool_int_array *p_pia); 199 void GDAPI godot_variant_new_pool_real_array(godot_variant *r_dest, const godot_pool_real_array *p_pra); 200 void GDAPI godot_variant_new_pool_string_array(godot_variant *r_dest, const godot_pool_string_array *p_psa); 201 void GDAPI godot_variant_new_pool_vector2_array(godot_variant *r_dest, const godot_pool_vector2_array *p_pv2a); 202 void GDAPI godot_variant_new_pool_vector3_array(godot_variant *r_dest, const godot_pool_vector3_array *p_pv3a); 203 void GDAPI godot_variant_new_pool_color_array(godot_variant *r_dest, const godot_pool_color_array *p_pca); 204 205 godot_bool GDAPI godot_variant_as_bool(const godot_variant *p_self); 206 uint64_t GDAPI godot_variant_as_uint(const godot_variant *p_self); 207 int64_t GDAPI godot_variant_as_int(const godot_variant *p_self); 208 double GDAPI godot_variant_as_real(const godot_variant *p_self); 209 godot_string GDAPI godot_variant_as_string(const godot_variant *p_self); 210 godot_vector2 GDAPI godot_variant_as_vector2(const godot_variant *p_self); 211 godot_rect2 GDAPI godot_variant_as_rect2(const godot_variant *p_self); 212 godot_vector3 GDAPI godot_variant_as_vector3(const godot_variant *p_self); 213 godot_transform2d GDAPI godot_variant_as_transform2d(const godot_variant *p_self); 214 godot_plane GDAPI godot_variant_as_plane(const godot_variant *p_self); 215 godot_quat GDAPI godot_variant_as_quat(const godot_variant *p_self); 216 godot_aabb GDAPI godot_variant_as_aabb(const godot_variant *p_self); 217 godot_basis GDAPI godot_variant_as_basis(const godot_variant *p_self); 218 godot_transform GDAPI godot_variant_as_transform(const godot_variant *p_self); 219 godot_color GDAPI godot_variant_as_color(const godot_variant *p_self); 220 godot_node_path GDAPI godot_variant_as_node_path(const godot_variant *p_self); 221 godot_rid GDAPI godot_variant_as_rid(const godot_variant *p_self); 222 godot_object GDAPI *godot_variant_as_object(const godot_variant *p_self); 223 godot_dictionary GDAPI godot_variant_as_dictionary(const godot_variant *p_self); 224 godot_array GDAPI godot_variant_as_array(const godot_variant *p_self); 225 godot_pool_byte_array GDAPI godot_variant_as_pool_byte_array(const godot_variant *p_self); 226 godot_pool_int_array GDAPI godot_variant_as_pool_int_array(const godot_variant *p_self); 227 godot_pool_real_array GDAPI godot_variant_as_pool_real_array(const godot_variant *p_self); 228 godot_pool_string_array GDAPI godot_variant_as_pool_string_array(const godot_variant *p_self); 229 godot_pool_vector2_array GDAPI godot_variant_as_pool_vector2_array(const godot_variant *p_self); 230 godot_pool_vector3_array GDAPI godot_variant_as_pool_vector3_array(const godot_variant *p_self); 231 godot_pool_color_array GDAPI godot_variant_as_pool_color_array(const godot_variant *p_self); 232 233 godot_variant GDAPI godot_variant_call(godot_variant *p_self, const godot_string *p_method, const godot_variant **p_args, const godot_int p_argcount, godot_variant_call_error *r_error); 234 235 godot_bool GDAPI godot_variant_has_method(const godot_variant *p_self, const godot_string *p_method); 236 237 godot_bool GDAPI godot_variant_operator_equal(const godot_variant *p_self, const godot_variant *p_other); 238 godot_bool GDAPI godot_variant_operator_less(const godot_variant *p_self, const godot_variant *p_other); 239 240 godot_bool GDAPI godot_variant_hash_compare(const godot_variant *p_self, const godot_variant *p_other); 241 242 godot_bool GDAPI godot_variant_booleanize(const godot_variant *p_self); 243 244 void GDAPI godot_variant_destroy(godot_variant *p_self); 245 246 // GDNative core 1.1 247 248 godot_string GDAPI godot_variant_get_operator_name(godot_variant_operator p_op); 249 void GDAPI godot_variant_evaluate(godot_variant_operator p_op, const godot_variant *p_a, const godot_variant *p_b, godot_variant *r_ret, godot_bool *r_valid); 250 251 #ifdef __cplusplus 252 } 253 #endif 254 255 #endif 256