@@ -421,6 +421,8 @@ def generate_builtin_class_header(builtin_api, size, used_classes, fully_used_cl
421
421
for include in fully_used_classes :
422
422
if include == "TypedArray" :
423
423
result .append ("#include <godot_cpp/variant/typed_array.hpp>" )
424
+ elif include == "TypedDictionary" :
425
+ result .append ("#include <godot_cpp/variant/typed_dictionary.hpp>" )
424
426
else :
425
427
result .append (f"#include <godot_cpp/{ get_include_path (include )} >" )
426
428
@@ -743,6 +745,10 @@ def generate_builtin_class_header(builtin_api, size, used_classes, fully_used_cl
743
745
if class_name == "Dictionary" :
744
746
result .append ("\t const Variant &operator[](const Variant &p_key) const;" )
745
747
result .append ("\t Variant &operator[](const Variant &p_key);" )
748
+ result .append (
749
+ "\t void set_typed(uint32_t p_key_type, const StringName &p_key_class_name, const Variant &p_key_script, uint32_t p_value_type, const StringName &p_value_class_name, const Variant &p_value_script);"
750
+ )
751
+ result .append ("\t void _ref(const Dictionary &p_from) const;" )
746
752
747
753
result .append ("};" )
748
754
@@ -1126,6 +1132,32 @@ def generate_engine_classes_bindings(api, output_dir, use_template_get_node):
1126
1132
fully_used_classes .add (array_type_name )
1127
1133
else :
1128
1134
used_classes .add (array_type_name )
1135
+ elif type_name .startswith ("typeddictionary::" ):
1136
+ fully_used_classes .add ("TypedDictionary" )
1137
+ dict_type_name = type_name .replace ("typeddictionary::" , "" )
1138
+ if dict_type_name .startswith ("const " ):
1139
+ dict_type_name = dict_type_name [6 :]
1140
+ dict_type_names = dict_type_name .split ("," )
1141
+ dict_type_name = dict_type_names [0 ]
1142
+ if dict_type_name .endswith ("*" ):
1143
+ dict_type_name = dict_type_name [:- 1 ]
1144
+ if is_included (dict_type_name , class_name ):
1145
+ if is_enum (dict_type_name ):
1146
+ fully_used_classes .add (get_enum_class (dict_type_name ))
1147
+ elif "default_value" in argument :
1148
+ fully_used_classes .add (dict_type_name )
1149
+ else :
1150
+ used_classes .add (dict_type_name )
1151
+ dict_type_name = dict_type_names [2 ]
1152
+ if dict_type_name .endswith ("*" ):
1153
+ dict_type_name = dict_type_name [:- 1 ]
1154
+ if is_included (dict_type_name , class_name ):
1155
+ if is_enum (dict_type_name ):
1156
+ fully_used_classes .add (get_enum_class (dict_type_name ))
1157
+ elif "default_value" in argument :
1158
+ fully_used_classes .add (dict_type_name )
1159
+ else :
1160
+ used_classes .add (dict_type_name )
1129
1161
elif is_enum (type_name ):
1130
1162
fully_used_classes .add (get_enum_class (type_name ))
1131
1163
elif "default_value" in argument :
@@ -1155,6 +1187,32 @@ def generate_engine_classes_bindings(api, output_dir, use_template_get_node):
1155
1187
fully_used_classes .add (array_type_name )
1156
1188
else :
1157
1189
used_classes .add (array_type_name )
1190
+ elif type_name .startswith ("typeddictionary::" ):
1191
+ fully_used_classes .add ("TypedDictionary" )
1192
+ dict_type_name = type_name .replace ("typeddictionary::" , "" )
1193
+ if dict_type_name .startswith ("const " ):
1194
+ dict_type_name = dict_type_name [6 :]
1195
+ dict_type_names = dict_type_name .split ("," )
1196
+ dict_type_name = dict_type_names [0 ]
1197
+ if dict_type_name .endswith ("*" ):
1198
+ dict_type_name = dict_type_name [:- 1 ]
1199
+ if is_included (dict_type_name , class_name ):
1200
+ if is_enum (dict_type_name ):
1201
+ fully_used_classes .add (get_enum_class (dict_type_name ))
1202
+ elif is_variant (dict_type_name ):
1203
+ fully_used_classes .add (dict_type_name )
1204
+ else :
1205
+ used_classes .add (dict_type_name )
1206
+ dict_type_name = dict_type_names [2 ]
1207
+ if dict_type_name .endswith ("*" ):
1208
+ dict_type_name = dict_type_name [:- 1 ]
1209
+ if is_included (dict_type_name , class_name ):
1210
+ if is_enum (dict_type_name ):
1211
+ fully_used_classes .add (get_enum_class (dict_type_name ))
1212
+ elif is_variant (dict_type_name ):
1213
+ fully_used_classes .add (dict_type_name )
1214
+ else :
1215
+ used_classes .add (dict_type_name )
1158
1216
elif is_enum (type_name ):
1159
1217
fully_used_classes .add (get_enum_class (type_name ))
1160
1218
elif is_variant (type_name ):
@@ -1281,6 +1339,8 @@ def generate_engine_class_header(class_api, used_classes, fully_used_classes, us
1281
1339
for included in fully_used_classes :
1282
1340
if included == "TypedArray" :
1283
1341
result .append ("#include <godot_cpp/variant/typed_array.hpp>" )
1342
+ elif included == "TypedDictionary" :
1343
+ result .append ("#include <godot_cpp/variant/typed_dictionary.hpp>" )
1284
1344
else :
1285
1345
result .append (f"#include <godot_cpp/{ get_include_path (included )} >" )
1286
1346
@@ -2322,6 +2382,7 @@ def is_variant(type_name):
2322
2382
or type_name in builtin_classes
2323
2383
or type_name == "Nil"
2324
2384
or type_name .startswith ("typedarray::" )
2385
+ or type_name .startswith ("typeddictionary::" )
2325
2386
)
2326
2387
2327
2388
@@ -2347,6 +2408,8 @@ def is_included(type_name, current_type):
2347
2408
"""
2348
2409
if type_name .startswith ("typedarray::" ):
2349
2410
return True
2411
+ if type_name .startswith ("typeddictionary::" ):
2412
+ return True
2350
2413
to_include = get_enum_class (type_name ) if is_enum (type_name ) else type_name
2351
2414
if to_include == current_type or is_pod_type (to_include ):
2352
2415
return False
@@ -2380,6 +2443,12 @@ def correct_typed_array(type_name):
2380
2443
return type_name
2381
2444
2382
2445
2446
+ def correct_typed_dictionary (type_name ):
2447
+ if type_name .startswith ("typeddictionary::" ):
2448
+ return type_name .replace ("typeddictionary::" , "TypedDictionary<" ).replace ("," , ", " ) + ">"
2449
+ return type_name
2450
+
2451
+
2383
2452
def correct_type (type_name , meta = None ):
2384
2453
type_conversion = {"float" : "double" , "int" : "int64_t" , "Nil" : "Variant" }
2385
2454
if meta != None :
@@ -2393,6 +2462,8 @@ def correct_type(type_name, meta=None):
2393
2462
return type_conversion [type_name ]
2394
2463
if type_name .startswith ("typedarray::" ):
2395
2464
return type_name .replace ("typedarray::" , "TypedArray<" ) + ">"
2465
+ if type_name .startswith ("typeddictionary::" ):
2466
+ return type_name .replace ("typeddictionary::" , "TypedDictionary<" ).replace ("," , ", " ) + ">"
2396
2467
if is_enum (type_name ):
2397
2468
if is_bitfield (type_name ):
2398
2469
base_class = get_enum_class (type_name )
@@ -2497,6 +2568,8 @@ def get_default_value_for_type(type_name):
2497
2568
return "false"
2498
2569
if type_name .startswith ("typedarray::" ):
2499
2570
return f"{ correct_type (type_name )} ()"
2571
+ if type_name .startswith ("typeddictionary::" ):
2572
+ return f"{ correct_type (type_name )} ()"
2500
2573
if is_enum (type_name ):
2501
2574
return f"{ correct_type (type_name )} (0)"
2502
2575
if is_variant (type_name ):
0 commit comments