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