[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.
This commit is contained in:
water111 2023-01-02 13:09:30 -05:00 committed by GitHub
parent 20a6839e07
commit 77a3e4125c
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 60 additions and 6 deletions

View file

@ -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))

View file

@ -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);
}

View file

@ -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))
)
)
)