[decompiler] Detect vector*! (#3846)

Detect use of `vector*!`, which is inlined in jak 2 and jak 3.

---------

Co-authored-by: water111 <awaterford1111445@gmail.com>
This commit is contained in:
water111
2025-01-20 12:21:28 -05:00
committed by GitHub
parent 3ee2b4423c
commit 98d6618a8b
37 changed files with 2449 additions and 3185 deletions
+96 -149
View File
@@ -556,175 +556,122 @@
;; WARN: Return type mismatch int vs none.
(defun ragdoll-joint-callback ((arg0 cspace) (arg1 transformq) (arg2 process-drawable) (arg3 ragdoll-proc))
(local-vars (a2-10 matrix) (sv-240 int) (sv-256 quaternion) (sv-272 vector) (sv-288 matrix))
(rlet ((vf0 :class vf)
(vf4 :class vf)
(vf5 :class vf)
(vf6 :class vf)
)
(init-vf0-vector)
(when *debug-segment*
(let ((s2-0 (-> *display* frames (-> *display* on-screen) profile-array data 0))
(v1-7 'ragdoll-callback)
(s1-0 *color-white*)
)
(when (and *dproc* *debug-segment*)
(let ((s0-0 (-> s2-0 data (-> s2-0 count))))
(set! sv-240 (-> s2-0 base-time))
(set! (-> s0-0 name) v1-7)
(set! (-> s0-0 start-time) (the-as int (- (timer-count (the-as timer-bank #x10000800)) (the-as uint sv-240))))
(set! (-> s0-0 depth) (the-as uint (-> s2-0 depth)))
(set! (-> s0-0 color) s1-0)
(set! (-> s2-0 segment (-> s2-0 depth)) s0-0)
)
(set! (-> s2-0 count) (min 1023 (+ (-> s2-0 count) 1)))
(+! (-> s2-0 depth) 1)
(set! (-> s2-0 max-depth) (max (-> s2-0 max-depth) (-> s2-0 depth)))
(when *debug-segment*
(let ((s2-0 (-> *display* frames (-> *display* on-screen) profile-array data 0))
(v1-7 'ragdoll-callback)
(s1-0 *color-white*)
)
(when (and *dproc* *debug-segment*)
(let ((s0-0 (-> s2-0 data (-> s2-0 count))))
(set! sv-240 (-> s2-0 base-time))
(set! (-> s0-0 name) v1-7)
(set! (-> s0-0 start-time) (the-as int (- (timer-count (the-as timer-bank #x10000800)) (the-as uint sv-240))))
(set! (-> s0-0 depth) (the-as uint (-> s2-0 depth)))
(set! (-> s0-0 color) s1-0)
(set! (-> s2-0 segment (-> s2-0 depth)) s0-0)
)
(set! (-> s2-0 count) (min 1023 (+ (-> s2-0 count) 1)))
(+! (-> s2-0 depth) 1)
(set! (-> s2-0 max-depth) (max (-> s2-0 max-depth) (-> s2-0 depth)))
)
0
)
(when arg3
(let ((s3-1 (-> arg3 ragdoll)))
(when (and s3-1
(and (< 0.0 (-> s3-1 flex-blend)) (!= (-> s3-1 ragdoll-joint-remap (+ (-> arg0 joint number) 1)) 255))
)
(let ((s1-1 (-> s3-1 ragdoll-joints (-> s3-1 ragdoll-joint-remap (+ (-> arg0 joint number) 1)))))
(when s1-1
(if (and (-> s1-1 old-param0) (!= (-> s1-1 old-param0) ragdoll-other-joint-callback))
((the-as (function cspace transformq none) (-> s1-1 old-param0)) arg0 arg1)
(cspace<-parented-transformq-joint! arg0 arg1)
)
(let ((s2-1 (new 'stack-no-clear 'matrix)))
(set! sv-256
(quaternion-vector-angle! (new 'stack-no-clear 'quaternion) (-> s1-1 geo-tform) (-> s1-1 geo-tform w))
)
(quaternion-normalize! (quaternion*! sv-256 (-> s1-1 quat) sv-256))
(quaternion->matrix s2-1 sv-256)
(when (logtest? (-> s3-1 ragdoll-flags) (ragdoll-flag rf10))
(let ((v1-40 (&+ s1-1 188)))
(when (and (!= v1-40 (-> s3-1 ragdoll-joints (-> s3-1 num-joints))) (= (-> v1-40 parent-joint) -1))
(let ((s0-3 (vector-! (new 'stack-no-clear 'vector) (-> v1-40 position) (-> s1-1 position))))
(set! sv-272 (new 'stack-no-clear 'vector))
(set! sv-288 (new 'stack-no-clear 'matrix))
(vector-flatten! sv-272 s0-3 (-> s2-1 rvec))
(vector-normalize! sv-272 1.0)
(matrix-from-two-vectors! sv-288 (-> s2-1 uvec) sv-272)
(matrix*! s2-1 s2-1 sv-288)
(vector-flatten! sv-272 s0-3 (-> s2-1 fvec))
)
0
)
(when arg3
(let ((s3-1 (-> arg3 ragdoll)))
(when (and s3-1
(and (< 0.0 (-> s3-1 flex-blend)) (!= (-> s3-1 ragdoll-joint-remap (+ (-> arg0 joint number) 1)) 255))
)
(let ((s1-1 (-> s3-1 ragdoll-joints (-> s3-1 ragdoll-joint-remap (+ (-> arg0 joint number) 1)))))
(when s1-1
(if (and (-> s1-1 old-param0) (!= (-> s1-1 old-param0) ragdoll-other-joint-callback))
((the-as (function cspace transformq none) (-> s1-1 old-param0)) arg0 arg1)
(cspace<-parented-transformq-joint! arg0 arg1)
)
(let ((s2-1 (new 'stack-no-clear 'matrix)))
(set! sv-256
(quaternion-vector-angle! (new 'stack-no-clear 'quaternion) (-> s1-1 geo-tform) (-> s1-1 geo-tform w))
)
(quaternion-normalize! (quaternion*! sv-256 (-> s1-1 quat) sv-256))
(quaternion->matrix s2-1 sv-256)
(when (logtest? (-> s3-1 ragdoll-flags) (ragdoll-flag rf10))
(let ((v1-40 (&+ s1-1 188)))
(when (and (!= v1-40 (-> s3-1 ragdoll-joints (-> s3-1 num-joints))) (= (-> v1-40 parent-joint) -1))
(let ((s0-3 (vector-! (new 'stack-no-clear 'vector) (-> v1-40 position) (-> s1-1 position))))
(set! sv-272 (new 'stack-no-clear 'vector))
(set! sv-288 (new 'stack-no-clear 'matrix))
(vector-flatten! sv-272 s0-3 (-> s2-1 rvec))
(vector-normalize! sv-272 1.0)
(matrix-from-two-vectors! sv-288 (-> s2-1 uvec) sv-272)
(matrix*! s2-1 s2-1 sv-288)
(vector-flatten! sv-272 s0-3 (-> s2-1 fvec))
)
(vector-normalize! sv-272 1.0)
(matrix-from-two-vectors! sv-288 (-> s2-1 uvec) sv-272)
(matrix*! s2-1 s2-1 sv-288)
)
)
(vector-copy! (-> s2-1 trans) (-> s1-1 position))
(set! (-> s2-1 trans w) 1.0)
(if (logtest? (-> s3-1 ragdoll-flags) (ragdoll-flag mirror))
(matrix*! s2-1 s2-1 (-> s3-1 mirror))
)
(set! a2-10
(cond
((>= (-> s3-1 flex-blend) 1.0)
(matrix-copy! (-> arg0 bone transform) s2-1)
)
(else
(let ((s1-3 (vector-lerp!
(new 'stack-no-clear 'vector)
(matrix->trans (-> arg0 bone transform) (new 'stack-no-clear 'vector))
(-> s2-1 trans)
(-> s3-1 flex-blend)
)
)
(vector-copy! (-> s2-1 trans) (-> s1-1 position))
(set! (-> s2-1 trans w) 1.0)
(if (logtest? (-> s3-1 ragdoll-flags) (ragdoll-flag mirror))
(matrix*! s2-1 s2-1 (-> s3-1 mirror))
)
(set! a2-10
(cond
((>= (-> s3-1 flex-blend) 1.0)
(matrix-copy! (-> arg0 bone transform) s2-1)
)
(else
(let ((s1-3 (vector-lerp!
(new 'stack-no-clear 'vector)
(matrix->trans (-> arg0 bone transform) (new 'stack-no-clear 'vector))
(-> s2-1 trans)
(-> s3-1 flex-blend)
)
)
(ragdoll-matrix-interp (-> arg0 bone transform) (-> arg0 bone transform) s2-1 (-> s3-1 flex-blend))
(vector-copy! (-> arg0 bone transform trans) s1-3)
)
(set! (-> arg0 bone transform trans w) 1.0)
a2-10
)
)
(ragdoll-matrix-interp (-> arg0 bone transform) (-> arg0 bone transform) s2-1 (-> s3-1 flex-blend))
(vector-copy! (-> arg0 bone transform trans) s1-3)
)
(set! (-> arg0 bone transform trans w) 1.0)
a2-10
)
)
)
(let ((v1-60 (new 'stack-no-clear 'vector)))
(let ((a0-50 v1-60))
(let ((a1-24 (-> s3-1 scale))
(a2-14 (-> arg2 root scale))
)
(.lvf vf4 (&-> a1-24 quad))
(.lvf vf5 (&-> a2-14 quad))
)
(.add.x.vf vf6 vf0 vf0 :mask #b1000)
(.mul.vf vf6 vf4 vf5 :mask #b111)
(.svf (&-> a0-50 quad) vf6)
)
(let ((a1-25 v1-60))
(let ((a0-51 v1-60)
(a2-15 (-> arg1 scale))
)
(.lvf vf4 (&-> a0-51 quad))
(.lvf vf5 (&-> a2-15 quad))
)
(.add.x.vf vf6 vf0 vf0 :mask #b1000)
(.mul.vf vf6 vf4 vf5 :mask #b111)
(.svf (&-> a1-25 quad) vf6)
)
(let ((a0-53 (-> arg0 bone transform)))
(let ((a1-27 (-> arg0 bone transform))
(a2-16 v1-60)
)
(.lvf vf4 (&-> a1-27 rvec quad))
(.lvf vf5 (&-> a2-16 quad))
)
(.add.x.vf vf6 vf0 vf0 :mask #b1000)
(.mul.vf vf6 vf4 vf5 :mask #b111)
(.svf (&-> a0-53 rvec quad) vf6)
)
(let ((a0-55 (-> arg0 bone transform uvec)))
(let ((a1-29 (-> arg0 bone transform uvec))
(a2-17 v1-60)
)
(.lvf vf4 (&-> a1-29 quad))
(.lvf vf5 (&-> a2-17 quad))
)
(.add.x.vf vf6 vf0 vf0 :mask #b1000)
(.mul.vf vf6 vf4 vf5 :mask #b111)
(.svf (&-> a0-55 quad) vf6)
)
(let ((a0-57 (-> arg0 bone transform fvec)))
(.lvf vf4 (&-> (-> arg0 bone transform fvec) quad))
(.lvf vf5 (&-> v1-60 quad))
(.add.x.vf vf6 vf0 vf0 :mask #b1000)
(.mul.vf vf6 vf4 vf5 :mask #b111)
(.svf (&-> a0-57 quad) vf6)
)
)
(set! (-> arg0 bone transform rvec w) 0.0)
(set! (-> arg0 bone transform uvec w) 0.0)
(set! (-> arg0 bone transform fvec w) 0.0)
)
(let ((v1-60 (new 'stack-no-clear 'vector)))
(vector*! v1-60 (-> s3-1 scale) (-> arg2 root scale))
(vector*! v1-60 v1-60 (-> arg1 scale))
(vector*! (the-as vector (-> arg0 bone transform)) (the-as vector (-> arg0 bone transform)) v1-60)
(vector*! (-> arg0 bone transform uvec) (-> arg0 bone transform uvec) v1-60)
(vector*! (-> arg0 bone transform fvec) (-> arg0 bone transform fvec) v1-60)
)
(set! (-> arg0 bone transform rvec w) 0.0)
(set! (-> arg0 bone transform uvec w) 0.0)
(set! (-> arg0 bone transform fvec w) 0.0)
)
)
)
)
(when *debug-segment*
(let ((gp-1 (-> *display* frames (-> *display* on-screen) profile-array data 0)))
(when (and *dproc* *debug-segment*)
(let* ((v1-75 (+ (-> gp-1 depth) -1))
(s5-1 (-> gp-1 segment v1-75))
(s4-1 (-> gp-1 base-time))
)
(when (>= v1-75 0)
(set! (-> s5-1 end-time) (the-as int (- (timer-count (the-as timer-bank #x10000800)) (the-as uint s4-1))))
(+! (-> gp-1 depth) -1)
)
)
)
)
0
)
(none)
)
(when *debug-segment*
(let ((gp-1 (-> *display* frames (-> *display* on-screen) profile-array data 0)))
(when (and *dproc* *debug-segment*)
(let* ((v1-75 (+ (-> gp-1 depth) -1))
(s5-1 (-> gp-1 segment v1-75))
(s4-1 (-> gp-1 base-time))
)
(when (>= v1-75 0)
(set! (-> s5-1 end-time) (the-as int (- (timer-count (the-as timer-bank #x10000800)) (the-as uint s4-1))))
(+! (-> gp-1 depth) -1)
)
)
)
)
0
)
(none)
)
;; definition for function ragdoll-other-joint-callback