From 77a3e4125cbf59b8dbc2c282068aa664320dc32c Mon Sep 17 00:00:00 2001 From: water111 <48171810+water111@users.noreply.github.com> Date: Mon, 2 Jan 2023 13:09:30 -0500 Subject: [PATCH] [jak2] don't ignore disable-draw bits (#2089) Same idea as what I did for jak 1, but now there's a mask that can be set by the user. It's used on the gun course dummies, for example. --- decompiler/config/jak2/all-types.gc | 2 +- game/mips2c/jak2_functions/foreground.cpp | 58 ++++++++++++++++++- .../jak2/engine/gfx/foreground/foreground.gc | 6 +- 3 files changed, 60 insertions(+), 6 deletions(-) diff --git a/decompiler/config/jak2/all-types.gc b/decompiler/config/jak2/all-types.gc index 6bff432d64..34b3e70059 100644 --- a/decompiler/config/jak2/all-types.gc +++ b/decompiler/config/jak2/all-types.gc @@ -24088,7 +24088,7 @@ (define-extern foreground-generic-merc-death (function object object none)) (define-extern foreground-generic-merc-add-fragments (function object object object none)) (define-extern foreground-generic-merc (function draw-control pointer int pointer)) -(define-extern foreground-merc (function draw-control (inline-array pris-mtx) pointer int int pointer)) +(define-extern foreground-merc (function draw-control (inline-array pris-mtx) pointer int int object pointer)) (define-extern foreground-emerc (function draw-control (inline-array pris-mtx) pointer object int int pointer)) (define-extern foreground-check-longest-edge-asm (function draw-control float symbol)) (define-extern foreground-ripple (function draw-control merc-ctrl pointer int pointer)) diff --git a/game/mips2c/jak2_functions/foreground.cpp b/game/mips2c/jak2_functions/foreground.cpp index 046bd4a257..8208d41fd4 100644 --- a/game/mips2c/jak2_functions/foreground.cpp +++ b/game/mips2c/jak2_functions/foreground.cpp @@ -324,6 +324,51 @@ struct Cache { void* merc_global_stats; // *merc-global-stats* } cache; +/* +(deftype merc-effect-bucket-info (structure) + ((color-fade rgba :offset-assert 0) ;; guessed by decompiler + (alpha uint8 :offset 3) + (merc-path uint8 :offset-assert 4) + (ignore-alpha uint8 :offset-assert 5) + (disable-draw uint8 :offset-assert 6) + (disable-envmap uint8 :offset-assert 7) + ) + :pack-me + :method-count-assert 9 + :size-assert #x8 + :flag-assert #x900000008 + ) + +(deftype merc-bucket-info (structure) + ((light vu-lights :inline :offset-assert 0) + (needs-clip int32 :offset-assert 112) + (need-mercprime-if-merc int32 :offset-assert 116) + (must-use-mercneric-for-clip int32 :offset-assert 120) + (effect merc-effect-bucket-info 64 :inline :offset-assert 124) ;; guessed by decompiler + ) + :method-count-assert 9 + :size-assert #x27c + :flag-assert #x90000027c + ) + */ + +struct MercEffectBucketInfo { + u8 color_fade[4]; + u8 merc_path; + u8 ignore_alpha; + u8 disable_draw; + u8 disable_envmap; +}; + +struct MercBucketInfo { + u8 lights[0x70]; + u32 needs_clip; + u32 mercprime; + u32 mercneric; + MercEffectBucketInfo effects[64]; +}; +static_assert(sizeof(MercBucketInfo) == 0x27c); + u64 execute(void* ctxt) { auto* c = (ExecutionContext*)ctxt; bool bc = false; @@ -336,6 +381,7 @@ u64 execute(void* ctxt) { c->sq(s4, 80, sp); // sq s4, 80(sp) c->sq(s5, 96, sp); // sq s5, 96(sp) c->sq(gp, 112, sp); // sq gp, 112(sp) + const MercBucketInfo* mbi = (const MercBucketInfo*)(g_ee_main_mem + c->sgpr64(t1)); c->mov64(t7, a3); // or t7, a3, r0 c->mov64(v1, t0); // or v1, t0, r0 c->lui(t0, 4096); // lui t0, 4096 @@ -442,8 +488,16 @@ u64 execute(void* ctxt) { // pc hack { - u16 use_pc_merc_bits = UINT16_MAX; - u16 ignore_alpha_bits = UINT16_MAX; + u16 use_pc_merc_bits = 0; + u16 ignore_alpha_bits = 0; + for (int i = 0; i < 16; i++) { + if (!mbi->effects[i].disable_draw) { + use_pc_merc_bits |= (1 << i); + } + if (mbi->effects[i].ignore_alpha) { + ignore_alpha_bits |= (1 << i); + } + } memcpy(g_ee_main_mem + c->sgpr64(a2) + 28, &use_pc_merc_bits, 2); memcpy(g_ee_main_mem + c->sgpr64(a2) + 30, &ignore_alpha_bits, 2); } diff --git a/goal_src/jak2/engine/gfx/foreground/foreground.gc b/goal_src/jak2/engine/gfx/foreground/foreground.gc index 0084682c45..6a05015d4b 100644 --- a/goal_src/jak2/engine/gfx/foreground/foreground.gc +++ b/goal_src/jak2/engine/gfx/foreground/foreground.gc @@ -577,7 +577,7 @@ arg1 ) -(def-mips2c foreground-merc (function draw-control (inline-array pris-mtx) pointer int int pointer)) +(def-mips2c foreground-merc (function draw-control (inline-array pris-mtx) pointer int int object pointer)) (define-extern foreground-emerc (function draw-control (inline-array pris-mtx) pointer object int int pointer)) @@ -1131,8 +1131,8 @@ (set! dma-ptr (pc-draw-bones dc dma-ptr)) (if (nonzero? (-> bucket-info need-mercprime-if-merc)) - (set! dma-ptr (foreground-merc dc (-> (scratchpad-object foreground-work) regs mtxs) dma-ptr 32 17)) - (set! dma-ptr (foreground-merc dc (-> (scratchpad-object foreground-work) regs mtxs) dma-ptr 35 20)) + (set! dma-ptr (foreground-merc dc (-> (scratchpad-object foreground-work) regs mtxs) dma-ptr 32 17 bucket-info)) + (set! dma-ptr (foreground-merc dc (-> (scratchpad-object foreground-work) regs mtxs) dma-ptr 35 20 bucket-info)) ) ) )