@@ -382,6 +382,8 @@ def generate_builtin_class_header(builtin_api, size, used_classes, fully_used_cl
382
382
for include in fully_used_classes :
383
383
if include == "TypedArray" :
384
384
result .append ("#include <godot_cpp/variant/typed_array.hpp>" )
385
+ elif include == "TypedDictionary" :
386
+ result .append ("#include <godot_cpp/variant/typed_dictionary.hpp>" )
385
387
else :
386
388
result .append (f"#include <godot_cpp/{ get_include_path (include )} >" )
387
389
@@ -703,6 +705,10 @@ def generate_builtin_class_header(builtin_api, size, used_classes, fully_used_cl
703
705
if class_name == "Dictionary" :
704
706
result .append ("\t const Variant &operator[](const Variant &p_key) const;" )
705
707
result .append ("\t Variant &operator[](const Variant &p_key);" )
708
+ result .append (
709
+ "\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);"
710
+ )
711
+ result .append ("\t void _ref(const Dictionary &p_from) const;" )
706
712
707
713
result .append ("};" )
708
714
@@ -1084,6 +1090,32 @@ def generate_engine_classes_bindings(api, output_dir, use_template_get_node):
1084
1090
fully_used_classes .add (array_type_name )
1085
1091
else :
1086
1092
used_classes .add (array_type_name )
1093
+ elif type_name .startswith ("typeddictionary::" ):
1094
+ fully_used_classes .add ("TypedDictionary" )
1095
+ dict_type_name = type_name .replace ("typeddictionary::" , "" )
1096
+ if dict_type_name .startswith ("const " ):
1097
+ dict_type_name = dict_type_name [6 :]
1098
+ dict_type_names = dict_type_name .split ("," )
1099
+ dict_type_name = dict_type_names [0 ]
1100
+ if dict_type_name .endswith ("*" ):
1101
+ dict_type_name = dict_type_name [:- 1 ]
1102
+ if is_included (dict_type_name , class_name ):
1103
+ if is_enum (dict_type_name ):
1104
+ fully_used_classes .add (get_enum_class (dict_type_name ))
1105
+ elif "default_value" in argument :
1106
+ fully_used_classes .add (dict_type_name )
1107
+ else :
1108
+ used_classes .add (dict_type_name )
1109
+ dict_type_name = dict_type_names [2 ]
1110
+ if dict_type_name .endswith ("*" ):
1111
+ dict_type_name = dict_type_name [:- 1 ]
1112
+ if is_included (dict_type_name , class_name ):
1113
+ if is_enum (dict_type_name ):
1114
+ fully_used_classes .add (get_enum_class (dict_type_name ))
1115
+ elif "default_value" in argument :
1116
+ fully_used_classes .add (dict_type_name )
1117
+ else :
1118
+ used_classes .add (dict_type_name )
1087
1119
elif is_enum (type_name ):
1088
1120
fully_used_classes .add (get_enum_class (type_name ))
1089
1121
elif "default_value" in argument :
@@ -1113,6 +1145,32 @@ def generate_engine_classes_bindings(api, output_dir, use_template_get_node):
1113
1145
fully_used_classes .add (array_type_name )
1114
1146
else :
1115
1147
used_classes .add (array_type_name )
1148
+ elif type_name .startswith ("typeddictionary::" ):
1149
+ fully_used_classes .add ("TypedDictionary" )
1150
+ dict_type_name = type_name .replace ("typeddictionary::" , "" )
1151
+ if dict_type_name .startswith ("const " ):
1152
+ dict_type_name = dict_type_name [6 :]
1153
+ dict_type_names = dict_type_name .split ("," )
1154
+ dict_type_name = dict_type_names [0 ]
1155
+ if dict_type_name .endswith ("*" ):
1156
+ dict_type_name = dict_type_name [:- 1 ]
1157
+ if is_included (dict_type_name , class_name ):
1158
+ if is_enum (dict_type_name ):
1159
+ fully_used_classes .add (get_enum_class (dict_type_name ))
1160
+ elif is_variant (dict_type_name ):
1161
+ fully_used_classes .add (dict_type_name )
1162
+ else :
1163
+ used_classes .add (dict_type_name )
1164
+ dict_type_name = dict_type_names [2 ]
1165
+ if dict_type_name .endswith ("*" ):
1166
+ dict_type_name = dict_type_name [:- 1 ]
1167
+ if is_included (dict_type_name , class_name ):
1168
+ if is_enum (dict_type_name ):
1169
+ fully_used_classes .add (get_enum_class (dict_type_name ))
1170
+ elif is_variant (dict_type_name ):
1171
+ fully_used_classes .add (dict_type_name )
1172
+ else :
1173
+ used_classes .add (dict_type_name )
1116
1174
elif is_enum (type_name ):
1117
1175
fully_used_classes .add (get_enum_class (type_name ))
1118
1176
elif is_variant (type_name ):
@@ -1233,6 +1291,8 @@ def generate_engine_class_header(class_api, used_classes, fully_used_classes, us
1233
1291
for included in fully_used_classes :
1234
1292
if included == "TypedArray" :
1235
1293
result .append ("#include <godot_cpp/variant/typed_array.hpp>" )
1294
+ elif included == "TypedDictionary" :
1295
+ result .append ("#include <godot_cpp/variant/typed_dictionary.hpp>" )
1236
1296
else :
1237
1297
result .append (f"#include <godot_cpp/{ get_include_path (included )} >" )
1238
1298
@@ -2157,6 +2217,7 @@ def is_variant(type_name):
2157
2217
or type_name in builtin_classes
2158
2218
or type_name == "Nil"
2159
2219
or type_name .startswith ("typedarray::" )
2220
+ or type_name .startswith ("typeddictionary::" )
2160
2221
)
2161
2222
2162
2223
@@ -2182,6 +2243,8 @@ def is_included(type_name, current_type):
2182
2243
"""
2183
2244
if type_name .startswith ("typedarray::" ):
2184
2245
return True
2246
+ if type_name .startswith ("typeddictionary::" ):
2247
+ return True
2185
2248
to_include = get_enum_class (type_name ) if is_enum (type_name ) else type_name
2186
2249
if to_include == current_type or is_pod_type (to_include ):
2187
2250
return False
@@ -2215,6 +2278,12 @@ def correct_typed_array(type_name):
2215
2278
return type_name
2216
2279
2217
2280
2281
+ def correct_typed_dictionary (type_name ):
2282
+ if type_name .startswith ("typeddictionary::" ):
2283
+ return type_name .replace ("typeddictionary::" , "TypedDictionary<" ).replace ("," , ", " ) + ">"
2284
+ return type_name
2285
+
2286
+
2218
2287
def correct_type (type_name , meta = None ):
2219
2288
type_conversion = {"float" : "double" , "int" : "int64_t" , "Nil" : "Variant" }
2220
2289
if meta != None :
@@ -2228,6 +2297,8 @@ def correct_type(type_name, meta=None):
2228
2297
return type_conversion [type_name ]
2229
2298
if type_name .startswith ("typedarray::" ):
2230
2299
return type_name .replace ("typedarray::" , "TypedArray<" ) + ">"
2300
+ if type_name .startswith ("typeddictionary::" ):
2301
+ return type_name .replace ("typeddictionary::" , "TypedDictionary<" ).replace ("," , ", " ) + ">"
2231
2302
if is_enum (type_name ):
2232
2303
if is_bitfield (type_name ):
2233
2304
base_class = get_enum_class (type_name )
@@ -2331,6 +2402,8 @@ def get_default_value_for_type(type_name):
2331
2402
return "false"
2332
2403
if type_name .startswith ("typedarray::" ):
2333
2404
return f"{ correct_type (type_name )} ()"
2405
+ if type_name .startswith ("typeddictionary::" ):
2406
+ return f"{ correct_type (type_name )} ()"
2334
2407
if is_enum (type_name ):
2335
2408
return f"{ correct_type (type_name )} (0)"
2336
2409
if is_variant (type_name ):
0 commit comments