@@ -235,29 +235,29 @@ def merge_builtins_size_info(api_json: dict, build_config: BuildConfig) -> None:
235235 for item in api_json ["builtin_classes" ]:
236236 name = item ["name" ]
237237 item ["size" ] = builtin_class_sizes [name ]
238- # TODO: correct me once https://github.com/godotengine/godot/pull/64365 is merged
239- for member in builtin_class_member_offsets .get (name , ()):
240- for item_member in item ["members" ]:
241- if item_member ["name" ] == member ["member" ]:
242- item_member ["offset" ] = member ["offset" ]
243- # Float builtin in extension_api.json is always 64bits long,
244- # however builtins made of floating point number can be made of
245- # 32bits (C float) or 64bits (C double)
246- # But Color is a special case: it is always made of 32bits floats !
247- if name == "Color" :
248- item_member ["type" ] = "meta:float"
249- elif item_member ["type" ] == "float" :
250- if build_config in (BuildConfig .FLOAT_32 , BuildConfig .FLOAT_64 ):
251- item_member ["type" ] = "meta:float"
252- else :
253- assert build_config in (BuildConfig .DOUBLE_32 , BuildConfig .DOUBLE_64 )
254- item_member ["type" ] = "meta:double"
255- elif item_member ["type" ] == "int" :
256- # Builtins containing int is always made of int32
257- item_member ["type" ] = "meta:int32"
238+ for member_offset in builtin_class_member_offsets .get (name , ()):
239+ for item_member in item .get ("members" , ()):
240+ if item_member ["name" ] == member_offset ["member" ]:
241+ # Add the offset field
242+ item_member ["offset" ] = member_offset ["offset" ]
243+
244+ # Overwrite the type (typically `int` -> `meta:uint32`)
245+ # This is needed given the actual size of the type depends on
246+ # the structure (e.g. `Color` is always composed of 32bits floats)
247+ # and the build config (`float` in a structure can reference either
248+ # 32 or 64bits... while the float builtin is always 64bits !)
249+ if item_member ["type" ] in ("float" , "int" ):
250+ item_member ["type" ] = f"meta:{ member_offset ['meta' ]} "
251+
252+ # Note it's possible to have more members than offets, the remaining
253+ # members being properties (e.g. `Rec2` has `start` and `size`, then
254+ # an additional `end` which is computed from the first two)
255+
258256 break
259257 else :
260- raise RuntimeError (f"Member `{ member } ` doesn't seem to be part of `{ name } ` !" )
258+ raise RuntimeError (
259+ f"Member `{ member_offset } ` doesn't seem to be part of `{ name } ` !"
260+ )
261261
262262 # Variant&Object are not present among the `builtin_classes`, only their size is provided.
263263 # So we have to create our own custom entry for them.
0 commit comments