From a97f61f02ac78581d98f59ee9425f9f66cbf9a91 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?L=C3=A9o=20Lam?= Date: Sat, 19 Sep 2020 18:38:50 +0200 Subject: [PATCH] Add a tool to automatically generate GParamList object struct+ctor --- tools/generate_bgparamlist_struct.py | 107 +++++++++++++++++++++++++++ 1 file changed, 107 insertions(+) create mode 100755 tools/generate_bgparamlist_struct.py diff --git a/tools/generate_bgparamlist_struct.py b/tools/generate_bgparamlist_struct.py new file mode 100755 index 00000000..ed5e356a --- /dev/null +++ b/tools/generate_bgparamlist_struct.py @@ -0,0 +1,107 @@ +#!/usr/bin/env python3 +import argparse +import json +import oead +from pathlib import Path + + +def _parse_parameter_archive(path: Path) -> oead.aamp.ParameterIO: + data = path.read_bytes() + try: + return oead.aamp.ParameterIO.from_binary(data) + except: + return oead.aamp.ParameterIO.from_text(data) + + +_AampTypeToAglUtlParameterType = { + oead.aamp.Parameter.Type.Bool: "agl::utl::Parameter", + oead.aamp.Parameter.Type.F32: "agl::utl::Parameter", + oead.aamp.Parameter.Type.Int: "agl::utl::Parameter", + oead.aamp.Parameter.Type.Vec2: "agl::utl::Parameter", + oead.aamp.Parameter.Type.Vec3: "agl::utl::Parameter", + oead.aamp.Parameter.Type.Vec4: "agl::utl::Parameter", + oead.aamp.Parameter.Type.Color: "agl::utl::Parameter", + oead.aamp.Parameter.Type.String32: "agl::utl::Parameter", + oead.aamp.Parameter.Type.String64: "agl::utl::Parameter", + oead.aamp.Parameter.Type.Curve1: "agl::utl::ParameterCurve<1>", + oead.aamp.Parameter.Type.Curve2: "agl::utl::ParameterCurve<2>", + oead.aamp.Parameter.Type.Curve3: "agl::utl::ParameterCurve<3>", + oead.aamp.Parameter.Type.Curve4: "agl::utl::ParameterCurve<4>", + oead.aamp.Parameter.Type.BufferInt: "agl::utl::ParameterBuffer", + oead.aamp.Parameter.Type.BufferF32: "agl::utl::ParameterBuffer", + oead.aamp.Parameter.Type.String256: "agl::utl::Parameter", + oead.aamp.Parameter.Type.Quat: "agl::utl::Parameter", + oead.aamp.Parameter.Type.U32: "agl::utl::Parameter", + oead.aamp.Parameter.Type.BufferU32: "agl::utl::ParameterBuffer", + oead.aamp.Parameter.Type.BufferBinary: "agl::utl::ParameterBuffer", + oead.aamp.Parameter.Type.StringRef: "agl::utl::Parameter", +} + + +def _aamp_type_to_agl_utl_parameter_type(type_: oead.aamp.Parameter.Type) -> str: + return _AampTypeToAglUtlParameterType[type_] + + +def _get_value_repr(value) -> str: + v = value.v + + if isinstance(v, bool): + return "true" if v else "false" + + if isinstance(v, oead.FixedSafeString32) or isinstance(v, oead.FixedSafeString64) or isinstance(v, oead.FixedSafeString256) or isinstance(v, str): + return json.dumps(str(v)) + + if isinstance(v, oead.Vector2f): + return f"{{{v.x}, {v.y}}}" + + if isinstance(v, oead.Vector3f): + return f"{{{v.x}, {v.y}, {v.z}}}" + + if isinstance(v, oead.Vector4f): + return f"{{{v.x}, {v.y}, {v.z}, {v.t}}}" + + return repr(v) + + +def main() -> None: + parser = argparse.ArgumentParser() + parser.add_argument("bgparamlist_path", type=Path, + help="Path to Dummy.bgparamlist (text or binary)") + parser.add_argument("--object", required=True) + args = parser.parse_args() + + name_table = oead.aamp.get_default_name_table() + + pio = _parse_parameter_archive(args.bgparamlist_path) + pobj = pio.objects[args.object] + + class_name = f"GParamListObject{args.object}" + + # Generate the class definition. + print(f"class {class_name} : public GParamListObject {{") + print(f"public:") + print(f" {class_name}();") + print(f' const char* getName() const override {{ return "{args.object}"; }}') + print() + for key, value in pobj.params.items(): + name = name_table.get_name(key.hash, 0, 0) + assert name + type_str = _aamp_type_to_agl_utl_parameter_type(value.type()) + print(f" {type_str} m{name};") + print("};") + print() + + # Generate the constructor now. + print(f"inline {class_name}::{class_name}() {{") + print(" auto* const obj = &mObj;") + print() + for key, value in pobj.params.items(): + name = name_table.get_name(key.hash, 0, 0) + assert name + default_value_repr = _get_value_repr(value) + print(f' m{name}.init({default_value_repr}, "{name}", "", obj);') + print("}") + + +if __name__ == "__main__": + main()