From 99866cec880ff7f956c05089dc491963f768b459 Mon Sep 17 00:00:00 2001 From: Hat Kid <6624576+Hat-Kid@users.noreply.github.com> Date: Sat, 23 Mar 2024 14:25:11 +0100 Subject: [PATCH] decomp3: more engine files, `get-texture` macro, use `print` method in autogenerated inspect, fix bitfield float print (#3432) - `fma-sphere` - `prim-beam-h` - `cam-start` - `ragdoll` - `light-trails-h` - `light-trails` - `menu` - `water` - `water-flow` - `hud` - `hud-classes` - `progress` - `progress-draw` --- The `get-texture` macro replaces calls to `lookup-texture-by-id` and `lookup-texture-by-id-fast`. The `defpart` macro detection was modified to print a pair like `(texture-name tpage-name)` for the texture field that gets turned into a `texture-id` constant. Only used in Jak 3 at the moment, I'll probably go through the other games at a later point. --- decompiler/IR2/Form.cpp | 2 +- decompiler/IR2/FormExpressionAnalysis.cpp | 30 + decompiler/ObjectFile/ObjectFileDB.cpp | 30 +- decompiler/ObjectFile/ObjectFileDB.h | 7 +- decompiler/config.cpp | 24 +- decompiler/config.h | 9 + decompiler/config/jak1/jak1_config.jsonc | 5 + .../config/jak1/ntsc_v1/tex-info.min.json | 1 + decompiler/config/jak2/jak2_config.jsonc | 5 + .../config/jak2/ntsc_v1/tex-info.min.json | 1 + decompiler/config/jak3/all-types.gc | 869 +- decompiler/config/jak3/jak3_config.jsonc | 5 + .../ntsc_v1/anonymous_function_types.jsonc | 3 +- decompiler/config/jak3/ntsc_v1/hacks.jsonc | 29 +- .../config/jak3/ntsc_v1/label_types.jsonc | 37 + .../jak3/ntsc_v1/stack_structures.jsonc | 42 +- .../config/jak3/ntsc_v1/tex-info.min.json | 1 + .../config/jak3/ntsc_v1/type_casts.jsonc | 302 +- .../config/jak3/ntsc_v1/var_names.jsonc | 13 + decompiler/data/TextureDB.h | 7 + decompiler/extractor/main.cpp | 3 +- decompiler/main.cpp | 16 +- decompiler/util/DecompilerTypeSystem.h | 2 + decompiler/util/data_decompile.cpp | 5 + decompiler/util/sparticle_decompile.cpp | 20 +- decompiler/util/sparticle_decompile.h | 4 +- goal_src/goal-lib.gc | 32 + goal_src/goos-lib.gs | 2 + goal_src/jak3/engine/anim/fma-sphere.gc | 268 + goal_src/jak3/engine/camera/cam-start.gc | 39 + goal_src/jak3/engine/camera/camera-h.gc | 3 + .../jak3/engine/collide/collide-shape-h.gc | 4 +- goal_src/jak3/engine/common-obs/crates.gc | 26 +- .../jak3/engine/common-obs/generic-obs.gc | 20 +- .../jak3/engine/common-obs/prim-beam-h.gc | 26 + goal_src/jak3/engine/common-obs/voicebox.gc | 2 +- goal_src/jak3/engine/common-obs/water-flow.gc | 623 + goal_src/jak3/engine/common-obs/water-h.gc | 12 +- goal_src/jak3/engine/common-obs/water.gc | 1179 + goal_src/jak3/engine/data/textures.gc | 19825 ++++++++++++++++ goal_src/jak3/engine/data/tpages.gc | 779 + goal_src/jak3/engine/debug/menu.gc | 1486 ++ goal_src/jak3/engine/game/game-info.gc | 49 +- goal_src/jak3/engine/game/game-save.gc | 23 +- goal_src/jak3/engine/game/main-h.gc | 23 +- goal_src/jak3/engine/game/settings.gc | 8 +- .../jak3/engine/game/task/task-control-h.gc | 8 +- goal_src/jak3/engine/geometry/path-h.gc | 2 +- goal_src/jak3/engine/gfx/font-h.gc | 1 + goal_src/jak3/engine/gfx/foreground/ripple.gc | 1 + goal_src/jak3/engine/gfx/hw/video-h.gc | 2 + goal_src/jak3/engine/gfx/ocean/ocean-h.gc | 2 +- .../gfx/sprite/particles/light-trails-h.gc | 225 + .../gfx/sprite/particles/light-trails.gc | 1255 + .../gfx/sprite/particles/sparticle-h.gc | 9 + .../sprite/particles/sparticle-launcher-h.gc | 6 +- goal_src/jak3/engine/gfx/texture/texture-h.gc | 7 + goal_src/jak3/engine/gfx/texture/texture.gc | 18 +- goal_src/jak3/engine/level/level-h.gc | 2 +- goal_src/jak3/engine/nav/nav-mesh-h.gc | 3 + goal_src/jak3/engine/physics/ragdoll-h.gc | 7 +- goal_src/jak3/engine/physics/ragdoll.gc | 1706 ++ .../process-drawable/process-drawable-h.gc | 2 + goal_src/jak3/engine/scene/scene-h.gc | 4 + goal_src/jak3/engine/target/lightjak-wings.gc | 2 +- goal_src/jak3/engine/target/target-death.gc | 14 +- .../jak3/engine/target/target-invisible.gc | 6 +- .../jak3/engine/target/target-lightjak.gc | 48 +- goal_src/jak3/engine/ui/bigmap-h.gc | 6 +- goal_src/jak3/engine/ui/hud-classes.gc | 1423 ++ goal_src/jak3/engine/ui/hud-h.gc | 89 +- goal_src/jak3/engine/ui/hud.gc | 1347 ++ goal_src/jak3/engine/ui/minimap-h.gc | 10 +- .../jak3/engine/ui/progress/progress-draw.gc | 5083 ++++ .../jak3/engine/ui/progress/progress-h.gc | 122 +- .../engine/ui/progress/progress-static.gc | 11 +- goal_src/jak3/engine/ui/progress/progress.gc | 4177 ++++ goal_src/jak3/engine/ui/text-h.gc | 177 +- goalc/build_level/jak1/build_level.cpp | 2 +- goalc/build_level/jak2/build_level.cpp | 2 +- goalc/compiler/compilation/Type.cpp | 19 +- .../reference/jak3/decompiler-macros.gc | 21 +- .../jak3/engine/anim/fma-sphere_REF.gc | 307 + .../jak3/engine/camera/cam-start_REF.gc | 50 + .../engine/collide/collide-shape-h_REF.gc | 4 +- .../jak3/engine/common-obs/crates_REF.gc | 26 +- .../jak3/engine/common-obs/generic-obs_REF.gc | 18 +- .../jak3/engine/common-obs/prim-beam-h_REF.gc | 84 + .../jak3/engine/common-obs/voicebox_REF.gc | 2 +- .../jak3/engine/common-obs/water-flow_REF.gc | 713 + .../jak3/engine/common-obs/water-h_REF.gc | 10 +- .../jak3/engine/common-obs/water_REF.gc | 1267 + .../reference/jak3/engine/debug/menu_REF.gc | 1677 ++ .../jak3/engine/game/game-info_REF.gc | 7 +- .../jak3/engine/game/game-save_REF.gc | 23 +- .../jak3/engine/game/settings_REF.gc | 8 +- .../engine/game/task/task-control-h_REF.gc | 4 +- .../jak3/engine/geometry/path-h_REF.gc | 2 +- .../jak3/engine/gfx/ocean/ocean-h_REF.gc | 6 +- .../sprite/particles/light-trails-h_REF.gc | 520 + .../gfx/sprite/particles/light-trails_REF.gc | 1328 ++ .../jak3/engine/gfx/texture/texture_REF.gc | 18 +- .../jak3/engine/level/level-h_REF.gc | 2 +- .../jak3/engine/physics/ragdoll-h_REF.gc | 6 +- .../jak3/engine/physics/ragdoll_REF.gc | 1772 ++ .../jak3/engine/target/lightjak-wings_REF.gc | 2 +- .../jak3/engine/target/target-death_REF.gc | 18 +- .../engine/target/target-invisible_REF.gc | 6 +- .../jak3/engine/target/target-lightjak_REF.gc | 48 +- .../reference/jak3/engine/ui/bigmap-h_REF.gc | 6 +- .../jak3/engine/ui/hud-classes_REF.gc | 1509 ++ .../reference/jak3/engine/ui/hud-h_REF.gc | 71 +- .../reference/jak3/engine/ui/hud_REF.gc | 1439 ++ .../reference/jak3/engine/ui/minimap-h_REF.gc | 10 +- .../engine/ui/progress/progress-draw_REF.gc | 5271 ++++ .../jak3/engine/ui/progress/progress-h_REF.gc | 122 +- .../engine/ui/progress/progress-static_REF.gc | 13 +- .../jak3/engine/ui/progress/progress_REF.gc | 4299 ++++ test/offline/config/jak3/config.jsonc | 4 +- test/offline/framework/orchestration.cpp | 1 + 120 files changed, 61355 insertions(+), 1038 deletions(-) create mode 100644 decompiler/config/jak1/ntsc_v1/tex-info.min.json create mode 100644 decompiler/config/jak2/ntsc_v1/tex-info.min.json create mode 100644 decompiler/config/jak3/ntsc_v1/tex-info.min.json create mode 100644 goal_src/jak3/engine/data/textures.gc create mode 100644 goal_src/jak3/engine/data/tpages.gc create mode 100644 test/decompiler/reference/jak3/engine/anim/fma-sphere_REF.gc create mode 100644 test/decompiler/reference/jak3/engine/camera/cam-start_REF.gc create mode 100644 test/decompiler/reference/jak3/engine/common-obs/prim-beam-h_REF.gc create mode 100644 test/decompiler/reference/jak3/engine/common-obs/water-flow_REF.gc create mode 100644 test/decompiler/reference/jak3/engine/common-obs/water_REF.gc create mode 100644 test/decompiler/reference/jak3/engine/debug/menu_REF.gc create mode 100644 test/decompiler/reference/jak3/engine/gfx/sprite/particles/light-trails-h_REF.gc create mode 100644 test/decompiler/reference/jak3/engine/gfx/sprite/particles/light-trails_REF.gc create mode 100644 test/decompiler/reference/jak3/engine/physics/ragdoll_REF.gc create mode 100644 test/decompiler/reference/jak3/engine/ui/hud-classes_REF.gc create mode 100644 test/decompiler/reference/jak3/engine/ui/hud_REF.gc create mode 100644 test/decompiler/reference/jak3/engine/ui/progress/progress-draw_REF.gc create mode 100644 test/decompiler/reference/jak3/engine/ui/progress/progress_REF.gc diff --git a/decompiler/IR2/Form.cpp b/decompiler/IR2/Form.cpp index 0a3844d625..3cfb897524 100644 --- a/decompiler/IR2/Form.cpp +++ b/decompiler/IR2/Form.cpp @@ -3447,7 +3447,7 @@ goos::Object DefpartElement::to_form_internal(const Env& env) const { break; } item_forms.push_back(decompile_sparticle_field_init(e.data, e.field_id, e.flags, e.sound_spec, - e.userdata, env.dts->ts, env.version)); + e.userdata, env.dts->ts, env.version, env)); } if (!item_forms.empty()) { forms.push_back(pretty_print::to_symbol(":init-specs")); diff --git a/decompiler/IR2/FormExpressionAnalysis.cpp b/decompiler/IR2/FormExpressionAnalysis.cpp index d8457c4fb3..64ff160c51 100644 --- a/decompiler/IR2/FormExpressionAnalysis.cpp +++ b/decompiler/IR2/FormExpressionAnalysis.cpp @@ -3300,6 +3300,36 @@ void FunctionCallElement::update_from_stack(const Env& env, return; } + // tpage and texture macros + { + auto func = Matcher::symbol("lookup-texture-by-id"); + auto func_fast = Matcher::symbol("lookup-texture-by-id-fast"); + auto mr = match(func, unstacked.at(0)); + auto mr_fast = match(func_fast, unstacked.at(0)); + if (mr.matched || mr_fast.matched) { + auto tex_id = Matcher::any_integer(0); + auto mr2 = match(tex_id, unstacked.at(1)); + if (mr2.matched) { + auto id = mr2.maps.ints.at(0); + u16 tpage = (id & 0xfff00000) >> 20; + u16 idx = (id & 0x000fff00) >> 8; + auto fixed_id = tpage << 16 | idx; + if (!env.dts->textures.empty() && + env.dts->textures.find(fixed_id) != env.dts->textures.end()) { + std::vector