From 0d0442eeb492febdc109b5f8b9f7b0c0972964c8 Mon Sep 17 00:00:00 2001 From: Tyler Wilding Date: Sun, 8 Aug 2021 13:28:47 -0400 Subject: [PATCH 1/4] decomp: finish `twister` --- decompiler/config/all-types.gc | 62 ++--- .../jak1_ntsc_black_label/label_types.jsonc | 4 + .../stack_structures.jsonc | 4 + .../jak1_ntsc_black_label/type_casts.jsonc | 28 ++- goal_src/levels/beach/twister.gc | 194 +++++++++++++++ .../reference/levels/beach/twister_REF.gc | 225 ++++++++++++++++++ 6 files changed, 484 insertions(+), 33 deletions(-) create mode 100644 test/decompiler/reference/levels/beach/twister_REF.gc diff --git a/decompiler/config/all-types.gc b/decompiler/config/all-types.gc index 2bf1cd1d25..23e9154d3e 100644 --- a/decompiler/config/all-types.gc +++ b/decompiler/config/all-types.gc @@ -23307,37 +23307,39 @@ ;; - Types -; (deftype twist-joint (structure) -; ((ry float :offset-assert 0) -; (max-dry float :offset-assert 4) -; ) -; :method-count-assert 9 -; :size-assert #x8 -; :flag-assert #x900000008 -; ) +(deftype twist-joint (structure) + ((ry float :offset-assert 0) + (max-dry float :offset-assert 4) + ) + :method-count-assert 9 + :size-assert #x8 + :flag-assert #x900000008 + ) -; (deftype twister (basic) -; ((num-joints int32 :offset-assert 4) -; (first-joint int32 :offset-assert 8) -; (last-joint int32 :offset-assert 12) -; (max-speed float :offset-assert 16) -; (smoothing float :offset-assert 20) -; (min-dist float :offset-assert 24) -; (target float :offset-assert 28) -; (ry float :offset-assert 32) -; (max-speed-ry float :offset-assert 36) -; (data UNKNOWN :dynamic :offset-assert 40) -; ) -; :method-count-assert 13 -; :size-assert #x28 -; :flag-assert #xd00000028 -; (:methods -; (dummy-9 () none 9) -; (dummy-10 () none 10) -; (dummy-11 () none 11) -; (dummy-12 () none 12) -; ) -; ) +(deftype twister (basic) + ((num-joints int32 :offset-assert 4) + (first-joint int32 :offset-assert 8) + (last-joint int32 :offset-assert 12) + (something uint16 :offset 12) + (max-speed float :offset-assert 16) + (smoothing float :offset-assert 20) + (min-dist float :offset-assert 24) + (target float :offset-assert 28) + (ry float :offset-assert 32) + (max-speed-ry float :offset-assert 36) + (data float :dynamic :offset-assert 40) + ) + :method-count-assert 13 + :size-assert #x28 + :flag-assert #xd00000028 + (:methods + (new (symbol _type_ int int float float float float) _type_ 0) + (TODO-RENAME-9 (_type_ int int float) none 9) + (set-target! (_type_ float) none 10) + (TODO-RENAME-11 (_type_) none 11) + (TODO-RENAME-12 (_type_ process-drawable) none 12) + ) + ) ;; ---------------------- diff --git a/decompiler/config/jak1_ntsc_black_label/label_types.jsonc b/decompiler/config/jak1_ntsc_black_label/label_types.jsonc index 538426c8c4..7bf19d08aa 100644 --- a/decompiler/config/jak1_ntsc_black_label/label_types.jsonc +++ b/decompiler/config/jak1_ntsc_black_label/label_types.jsonc @@ -1413,6 +1413,10 @@ ["L508", "float", true] ], + "twister": [ + ["L20", "float", true] + ], + // please do not add things after this entry! git is dumb. "object-file-that-doesnt-actually-exist-and-i-just-put-this-here-to-prevent-merge-conflicts-with-this-file": [] } diff --git a/decompiler/config/jak1_ntsc_black_label/stack_structures.jsonc b/decompiler/config/jak1_ntsc_black_label/stack_structures.jsonc index 7789fb60ad..71654a1af7 100644 --- a/decompiler/config/jak1_ntsc_black_label/stack_structures.jsonc +++ b/decompiler/config/jak1_ntsc_black_label/stack_structures.jsonc @@ -820,6 +820,10 @@ "draw-ocean-transition-seams": [ [16, "sphere"] ], + + "(method 12 twister)": [ + [16, "matrix"] + ], "placeholder-do-not-add-below!": [] } diff --git a/decompiler/config/jak1_ntsc_black_label/type_casts.jsonc b/decompiler/config/jak1_ntsc_black_label/type_casts.jsonc index 8ab0548d7a..4d6fcba4bd 100644 --- a/decompiler/config/jak1_ntsc_black_label/type_casts.jsonc +++ b/decompiler/config/jak1_ntsc_black_label/type_casts.jsonc @@ -1787,9 +1787,31 @@ "draw-ocean-transition": [[255, "v1", "ocean-mid-mask"]], - // "ocean-trans-mask-ptrs-bit?": [ - // [[32, 41], "a0", "(pointer ocean-trans-mask)"] - // ], + "(method 0 twister)": [ + [37, "a0", "twister"], + [41, "a0", "twister"] + ], + + "(method 9 twister)": [ + [8, "a2", "twister"] + ], + + "(method 11 twister)": [ + [7, "s4", "twist-joint"], + [13, "s4", "twist-joint"], + [26, "s4", "twist-joint"], + [28, "s4", "twist-joint"], + [36, "s4", "twist-joint"], + [40, "s4", "twist-joint"], + [47, "s4", "twist-joint"], + [55, "s4", "twist-joint"], + [70, "s4", "twist-joint"], + [82, "s4", "twist-joint"] + ], + + "(method 12 twister)": [ + [17, "v1", "twister"] + ], "placeholder-do-not-add-below": [] } diff --git a/goal_src/levels/beach/twister.gc b/goal_src/levels/beach/twister.gc index f28b5bab8e..4ab86a28c3 100644 --- a/goal_src/levels/beach/twister.gc +++ b/goal_src/levels/beach/twister.gc @@ -5,3 +5,197 @@ ;; name in dgo: twister ;; dgos: BEA, L1 +;; definition of type twist-joint +(deftype twist-joint (structure) + ((ry float :offset-assert 0) + (max-dry float :offset-assert 4) + ) + :method-count-assert 9 + :size-assert #x8 + :flag-assert #x900000008 + ) + +;; definition of type twister +(deftype twister (basic) + ((num-joints int32 :offset-assert 4) + (first-joint int32 :offset-assert 8) + (last-joint int32 :offset-assert 12) + (something uint16 :offset 12) + (max-speed float :offset-assert 16) + (smoothing float :offset-assert 20) + (min-dist float :offset-assert 24) + (target float :offset-assert 28) + (ry float :offset-assert 32) + (max-speed-ry float :offset-assert 36) + (data float :dynamic :offset-assert 40) + ) + :method-count-assert 13 + :size-assert #x28 + :flag-assert #xd00000028 + (:methods + (new (symbol _type_ int int float float float float) _type_ 0) + (TODO-RENAME-9 (_type_ int int float) none 9) + (set-target! (_type_ float) none 10) + (TODO-RENAME-11 (_type_) none 11) + (TODO-RENAME-12 (_type_ process-drawable) none 12) + ) + ) + +;; definition for method 0 of type twister +(defmethod + new + twister + ((allocation symbol) + (type-to-make twister) + (arg0 int) + (arg1 int) + (arg2 float) + (arg3 float) + (arg4 float) + (arg5 float) + ) + (let* ((gp-0 (+ (- 1 arg0) arg1)) + (v0-0 + (object-new + allocation + (the-as type type-to-make) + (the-as int (+ (-> type-to-make something) (* gp-0 16))) + ) + ) + ) + (set! (-> v0-0 first-joint) arg0) + (set! (-> v0-0 last-joint) arg1) + (set! (-> v0-0 num-joints) gp-0) + (set! (-> v0-0 max-speed) arg2) + (set! (-> v0-0 smoothing) arg4) + (set! (-> v0-0 min-dist) arg5) + (set! (-> v0-0 target) 0.0) + (set! (-> v0-0 ry) 0.0) + (set! (-> v0-0 max-speed-ry) arg3) + (dotimes (v1-4 gp-0) + (set! (-> (the-as twister (+ (the-as uint v0-0) (* v1-4 16))) data 0) 0.0) + (set! (-> (the-as twister (+ (the-as uint v0-0) (* v1-4 16))) data 1) 0.0) + ) + v0-0 + ) + ) + +;; definition for method 5 of type twister +(defmethod asize-of twister ((obj twister)) + (+ (* (-> obj num-joints) 16) 40) + ) + +;; definition for method 9 of type twister +;; INFO: Return type mismatch int vs none. +(defmethod + TODO-RENAME-9 + twister + ((obj twister) (arg0 int) (arg1 int) (arg2 float)) + (let ((v1-1 (- arg0 (-> obj first-joint))) + (a1-2 (- arg1 (-> obj first-joint))) + ) + (while (>= a1-2 v1-1) + (set! (-> (the-as twister (+ (the-as uint obj) (* v1-1 16))) data 1) arg2) + (+! v1-1 1) + ) + ) + 0 + (none) + ) + +;; definition for method 10 of type twister +;; INFO: Return type mismatch int vs none. +(defmethod set-target! twister ((obj twister) (arg0 float)) + (set! (-> obj target) arg0) + 0 + (none) + ) + +;; definition for method 11 of type twister +;; INFO: Return type mismatch int vs none. +(defmethod TODO-RENAME-11 twister ((obj twister)) + (let* ((s5-0 (+ (-> obj num-joints) -1)) + (s4-0 (the-as object (+ (+ (* s5-0 16) 36) (the-as int obj)))) + ) + (let ((f0-2 (deg-diff (-> (the-as twist-joint s4-0) ry) (-> obj target)))) + (+! + (-> (the-as twist-joint s4-0) ry) + (seek-with-smooth + 0.0 + f0-2 + (-> obj max-speed) + (-> obj smoothing) + (-> obj min-dist) + ) + ) + ) + (let ((f30-1 (-> (the-as twist-joint s4-0) ry))) + (while (> s5-0 0) + (+! s5-0 -1) + (let ((s4-1 (the-as object (+ (+ (* s5-0 16) 36) (the-as int obj))))) + (let ((f0-9 (deg-diff f30-1 (-> (the-as twist-joint s4-1) ry)))) + (cond + ((= (-> (the-as twist-joint s4-1) max-dry) 0.0) + (set! f0-9 0.0) + ) + ((< (fabs f0-9) (-> (the-as twist-joint s4-1) max-dry)) + ) + ((< f0-9 0.0) + (set! + f0-9 + (seek-with-smooth + f0-9 + (- (-> (the-as twist-joint s4-1) max-dry)) + (-> obj max-speed) + (-> obj smoothing) + (-> obj min-dist) + ) + ) + ) + (else + (set! + f0-9 + (seek-with-smooth + f0-9 + (-> (the-as twist-joint s4-1) max-dry) + (-> obj max-speed) + (-> obj smoothing) + (-> obj min-dist) + ) + ) + ) + ) + (+! f30-1 f0-9) + ) + (set! (-> (the-as twist-joint s4-1) ry) f30-1) + ) + ) + ) + ) + 0 + (none) + ) + +;; definition for method 12 of type twister +;; INFO: Return type mismatch int vs none. +(defmethod TODO-RENAME-12 twister ((obj twister) (arg0 process-drawable)) + (let ((s4-0 (new 'stack-no-clear 'matrix))) + (dotimes (s3-0 (-> obj num-joints)) + (let + ((s2-0 + (-> arg0 node-list data (+ (-> obj first-joint) s3-0) bone transform) + ) + ) + (matrix-rotate-y! + s4-0 + (-> (the-as twister (+ (the-as uint obj) (* s3-0 16))) data 0) + ) + (vector-! (-> s2-0 vector 3) (-> s2-0 vector 3) (-> arg0 root trans)) + (matrix*! s2-0 s2-0 s4-0) + (vector+! (-> s2-0 vector 3) (-> s2-0 vector 3) (-> arg0 root trans)) + ) + ) + ) + 0 + (none) + ) diff --git a/test/decompiler/reference/levels/beach/twister_REF.gc b/test/decompiler/reference/levels/beach/twister_REF.gc new file mode 100644 index 0000000000..1e1c102419 --- /dev/null +++ b/test/decompiler/reference/levels/beach/twister_REF.gc @@ -0,0 +1,225 @@ +;;-*-Lisp-*- +(in-package goal) + +;; definition of type twist-joint +(deftype twist-joint (structure) + ((ry float :offset-assert 0) + (max-dry float :offset-assert 4) + ) + :method-count-assert 9 + :size-assert #x8 + :flag-assert #x900000008 + ) + +;; definition for method 3 of type twist-joint +(defmethod inspect twist-joint ((obj twist-joint)) + (format #t "[~8x] ~A~%" obj 'twist-joint) + (format #t "~Try: ~f~%" (-> obj ry)) + (format #t "~Tmax-dry: ~f~%" (-> obj max-dry)) + obj + ) + +;; definition of type twister +(deftype twister (basic) + ((num-joints int32 :offset-assert 4) + (first-joint int32 :offset-assert 8) + (last-joint int32 :offset-assert 12) + (something uint16 :offset 12) + (max-speed float :offset-assert 16) + (smoothing float :offset-assert 20) + (min-dist float :offset-assert 24) + (target float :offset-assert 28) + (ry float :offset-assert 32) + (max-speed-ry float :offset-assert 36) + (data float :dynamic :offset-assert 40) + ) + :method-count-assert 13 + :size-assert #x28 + :flag-assert #xd00000028 + (:methods + (new (symbol _type_ int int float float float float) _type_ 0) + (TODO-RENAME-9 (_type_ int int float) none 9) + (set-target! (_type_ float) none 10) + (TODO-RENAME-11 (_type_) none 11) + (TODO-RENAME-12 (_type_ process-drawable) none 12) + ) + ) + +;; definition for method 3 of type twister +(defmethod inspect twister ((obj twister)) + (format #t "[~8x] ~A~%" obj (-> obj type)) + (format #t "~Tnum-joints: ~D~%" (-> obj num-joints)) + (format #t "~Tfirst-joint: ~D~%" (-> obj first-joint)) + (format #t "~Tlast-joint: ~D~%" (-> obj last-joint)) + (format #t "~Tmax-speed: ~f~%" (-> obj max-speed)) + (format #t "~Tsmoothing: ~f~%" (-> obj smoothing)) + (format #t "~Tmin-dist: ~f~%" (-> obj min-dist)) + (format #t "~Ttarget: ~f~%" (-> obj target)) + (format #t "~Try: ~f~%" (-> obj ry)) + (format #t "~Tmax-speed-ry: ~f~%" (-> obj max-speed-ry)) + (format #t "~Tdata[0] @ #x~X~%" (-> obj data)) + obj + ) + +;; definition for method 0 of type twister +(defmethod + new + twister + ((allocation symbol) + (type-to-make twister) + (arg0 int) + (arg1 int) + (arg2 float) + (arg3 float) + (arg4 float) + (arg5 float) + ) + (let* ((gp-0 (+ (- 1 arg0) arg1)) + (v0-0 + (object-new + allocation + (the-as type type-to-make) + (the-as int (+ (-> type-to-make something) (* gp-0 16))) + ) + ) + ) + (set! (-> v0-0 first-joint) arg0) + (set! (-> v0-0 last-joint) arg1) + (set! (-> v0-0 num-joints) gp-0) + (set! (-> v0-0 max-speed) arg2) + (set! (-> v0-0 smoothing) arg4) + (set! (-> v0-0 min-dist) arg5) + (set! (-> v0-0 target) 0.0) + (set! (-> v0-0 ry) 0.0) + (set! (-> v0-0 max-speed-ry) arg3) + (dotimes (v1-4 gp-0) + (set! (-> (the-as twister (+ (the-as uint v0-0) (* v1-4 16))) data 0) 0.0) + (set! (-> (the-as twister (+ (the-as uint v0-0) (* v1-4 16))) data 1) 0.0) + ) + v0-0 + ) + ) + +;; definition for method 5 of type twister +(defmethod asize-of twister ((obj twister)) + (+ (* (-> obj num-joints) 16) 40) + ) + +;; definition for method 9 of type twister +;; INFO: Return type mismatch int vs none. +(defmethod + TODO-RENAME-9 + twister + ((obj twister) (arg0 int) (arg1 int) (arg2 float)) + (let ((v1-1 (- arg0 (-> obj first-joint))) + (a1-2 (- arg1 (-> obj first-joint))) + ) + (while (>= a1-2 v1-1) + (set! (-> (the-as twister (+ (the-as uint obj) (* v1-1 16))) data 1) arg2) + (+! v1-1 1) + ) + ) + 0 + (none) + ) + +;; definition for method 10 of type twister +;; INFO: Return type mismatch int vs none. +(defmethod set-target! twister ((obj twister) (arg0 float)) + (set! (-> obj target) arg0) + 0 + (none) + ) + +;; definition for method 11 of type twister +;; INFO: Return type mismatch int vs none. +(defmethod TODO-RENAME-11 twister ((obj twister)) + (let* ((s5-0 (+ (-> obj num-joints) -1)) + (s4-0 (the-as object (+ (+ (* s5-0 16) 36) (the-as int obj)))) + ) + (let ((f0-2 (deg-diff (-> (the-as twist-joint s4-0) ry) (-> obj target)))) + (+! + (-> (the-as twist-joint s4-0) ry) + (seek-with-smooth + 0.0 + f0-2 + (-> obj max-speed) + (-> obj smoothing) + (-> obj min-dist) + ) + ) + ) + (let ((f30-1 (-> (the-as twist-joint s4-0) ry))) + (while (> s5-0 0) + (+! s5-0 -1) + (let ((s4-1 (the-as object (+ (+ (* s5-0 16) 36) (the-as int obj))))) + (let ((f0-9 (deg-diff f30-1 (-> (the-as twist-joint s4-1) ry)))) + (cond + ((= (-> (the-as twist-joint s4-1) max-dry) 0.0) + (set! f0-9 0.0) + ) + ((< (fabs f0-9) (-> (the-as twist-joint s4-1) max-dry)) + ) + ((< f0-9 0.0) + (set! + f0-9 + (seek-with-smooth + f0-9 + (- (-> (the-as twist-joint s4-1) max-dry)) + (-> obj max-speed) + (-> obj smoothing) + (-> obj min-dist) + ) + ) + ) + (else + (set! + f0-9 + (seek-with-smooth + f0-9 + (-> (the-as twist-joint s4-1) max-dry) + (-> obj max-speed) + (-> obj smoothing) + (-> obj min-dist) + ) + ) + ) + ) + (+! f30-1 f0-9) + ) + (set! (-> (the-as twist-joint s4-1) ry) f30-1) + ) + ) + ) + ) + 0 + (none) + ) + +;; definition for method 12 of type twister +;; INFO: Return type mismatch int vs none. +(defmethod TODO-RENAME-12 twister ((obj twister) (arg0 process-drawable)) + (let ((s4-0 (new 'stack-no-clear 'matrix))) + (dotimes (s3-0 (-> obj num-joints)) + (let + ((s2-0 + (-> arg0 node-list data (+ (-> obj first-joint) s3-0) bone transform) + ) + ) + (matrix-rotate-y! + s4-0 + (-> (the-as twister (+ (the-as uint obj) (* s3-0 16))) data 0) + ) + (vector-! (-> s2-0 vector 3) (-> s2-0 vector 3) (-> arg0 root trans)) + (matrix*! s2-0 s2-0 s4-0) + (vector+! (-> s2-0 vector 3) (-> s2-0 vector 3) (-> arg0 root trans)) + ) + ) + ) + 0 + (none) + ) + + + + From 38d2b2d02e1a97fcd80d9baf96b04bd958bd94a1 Mon Sep 17 00:00:00 2001 From: Tyler Wilding Date: Tue, 10 Aug 2021 20:43:25 -0400 Subject: [PATCH 2/4] fix dynamic element --- decompiler/config/all-types.gc | 3 +- goal_src/levels/beach/twister.gc | 40 ++++++++++++------- .../reference/levels/beach/twister_REF.gc | 40 ++++++++++++------- 3 files changed, 52 insertions(+), 31 deletions(-) diff --git a/decompiler/config/all-types.gc b/decompiler/config/all-types.gc index 23e9154d3e..2019f12be0 100644 --- a/decompiler/config/all-types.gc +++ b/decompiler/config/all-types.gc @@ -23311,6 +23311,7 @@ ((ry float :offset-assert 0) (max-dry float :offset-assert 4) ) + :pack-me :method-count-assert 9 :size-assert #x8 :flag-assert #x900000008 @@ -23327,7 +23328,7 @@ (target float :offset-assert 28) (ry float :offset-assert 32) (max-speed-ry float :offset-assert 36) - (data float :dynamic :offset-assert 40) + (data twist-joint :inline :dynamic :offset-assert 40) ) :method-count-assert 13 :size-assert #x28 diff --git a/goal_src/levels/beach/twister.gc b/goal_src/levels/beach/twister.gc index 4ab86a28c3..69fb2c2892 100644 --- a/goal_src/levels/beach/twister.gc +++ b/goal_src/levels/beach/twister.gc @@ -10,6 +10,7 @@ ((ry float :offset-assert 0) (max-dry float :offset-assert 4) ) + :pack-me :method-count-assert 9 :size-assert #x8 :flag-assert #x900000008 @@ -17,17 +18,17 @@ ;; definition of type twister (deftype twister (basic) - ((num-joints int32 :offset-assert 4) - (first-joint int32 :offset-assert 8) - (last-joint int32 :offset-assert 12) - (something uint16 :offset 12) - (max-speed float :offset-assert 16) - (smoothing float :offset-assert 20) - (min-dist float :offset-assert 24) - (target float :offset-assert 28) - (ry float :offset-assert 32) - (max-speed-ry float :offset-assert 36) - (data float :dynamic :offset-assert 40) + ((num-joints int32 :offset-assert 4) + (first-joint int32 :offset-assert 8) + (last-joint int32 :offset-assert 12) + (something uint16 :offset 12) + (max-speed float :offset-assert 16) + (smoothing float :offset-assert 20) + (min-dist float :offset-assert 24) + (target float :offset-assert 28) + (ry float :offset-assert 32) + (max-speed-ry float :offset-assert 36) + (data twist-joint :inline :dynamic :offset-assert 40) ) :method-count-assert 13 :size-assert #x28 @@ -73,8 +74,14 @@ (set! (-> v0-0 ry) 0.0) (set! (-> v0-0 max-speed-ry) arg3) (dotimes (v1-4 gp-0) - (set! (-> (the-as twister (+ (the-as uint v0-0) (* v1-4 16))) data 0) 0.0) - (set! (-> (the-as twister (+ (the-as uint v0-0) (* v1-4 16))) data 1) 0.0) + (set! + (-> (the-as twister (+ (the-as uint v0-0) (* v1-4 16))) data 0 ry) + 0.0 + ) + (set! + (-> (the-as twister (+ (the-as uint v0-0) (* v1-4 16))) data 0 max-dry) + 0.0 + ) ) v0-0 ) @@ -95,7 +102,10 @@ (a1-2 (- arg1 (-> obj first-joint))) ) (while (>= a1-2 v1-1) - (set! (-> (the-as twister (+ (the-as uint obj) (* v1-1 16))) data 1) arg2) + (set! + (-> (the-as twister (+ (the-as uint obj) (* v1-1 16))) data 0 max-dry) + arg2 + ) (+! v1-1 1) ) ) @@ -188,7 +198,7 @@ ) (matrix-rotate-y! s4-0 - (-> (the-as twister (+ (the-as uint obj) (* s3-0 16))) data 0) + (-> (the-as twister (+ (the-as uint obj) (* s3-0 16))) data 0 ry) ) (vector-! (-> s2-0 vector 3) (-> s2-0 vector 3) (-> arg0 root trans)) (matrix*! s2-0 s2-0 s4-0) diff --git a/test/decompiler/reference/levels/beach/twister_REF.gc b/test/decompiler/reference/levels/beach/twister_REF.gc index 1e1c102419..e170248612 100644 --- a/test/decompiler/reference/levels/beach/twister_REF.gc +++ b/test/decompiler/reference/levels/beach/twister_REF.gc @@ -6,6 +6,7 @@ ((ry float :offset-assert 0) (max-dry float :offset-assert 4) ) + :pack-me :method-count-assert 9 :size-assert #x8 :flag-assert #x900000008 @@ -21,17 +22,17 @@ ;; definition of type twister (deftype twister (basic) - ((num-joints int32 :offset-assert 4) - (first-joint int32 :offset-assert 8) - (last-joint int32 :offset-assert 12) - (something uint16 :offset 12) - (max-speed float :offset-assert 16) - (smoothing float :offset-assert 20) - (min-dist float :offset-assert 24) - (target float :offset-assert 28) - (ry float :offset-assert 32) - (max-speed-ry float :offset-assert 36) - (data float :dynamic :offset-assert 40) + ((num-joints int32 :offset-assert 4) + (first-joint int32 :offset-assert 8) + (last-joint int32 :offset-assert 12) + (something uint16 :offset 12) + (max-speed float :offset-assert 16) + (smoothing float :offset-assert 20) + (min-dist float :offset-assert 24) + (target float :offset-assert 28) + (ry float :offset-assert 32) + (max-speed-ry float :offset-assert 36) + (data twist-joint :inline :dynamic :offset-assert 40) ) :method-count-assert 13 :size-assert #x28 @@ -93,8 +94,14 @@ (set! (-> v0-0 ry) 0.0) (set! (-> v0-0 max-speed-ry) arg3) (dotimes (v1-4 gp-0) - (set! (-> (the-as twister (+ (the-as uint v0-0) (* v1-4 16))) data 0) 0.0) - (set! (-> (the-as twister (+ (the-as uint v0-0) (* v1-4 16))) data 1) 0.0) + (set! + (-> (the-as twister (+ (the-as uint v0-0) (* v1-4 16))) data 0 ry) + 0.0 + ) + (set! + (-> (the-as twister (+ (the-as uint v0-0) (* v1-4 16))) data 0 max-dry) + 0.0 + ) ) v0-0 ) @@ -115,7 +122,10 @@ (a1-2 (- arg1 (-> obj first-joint))) ) (while (>= a1-2 v1-1) - (set! (-> (the-as twister (+ (the-as uint obj) (* v1-1 16))) data 1) arg2) + (set! + (-> (the-as twister (+ (the-as uint obj) (* v1-1 16))) data 0 max-dry) + arg2 + ) (+! v1-1 1) ) ) @@ -208,7 +218,7 @@ ) (matrix-rotate-y! s4-0 - (-> (the-as twister (+ (the-as uint obj) (* s3-0 16))) data 0) + (-> (the-as twister (+ (the-as uint obj) (* s3-0 16))) data 0 ry) ) (vector-! (-> s2-0 vector 3) (-> s2-0 vector 3) (-> arg0 root trans)) (matrix*! s2-0 s2-0 s4-0) From 412998a2c483eb917cd5864252f164a5a24ad20b Mon Sep 17 00:00:00 2001 From: Tyler Wilding Date: Tue, 10 Aug 2021 20:52:41 -0400 Subject: [PATCH 3/4] docs: fix recent updates --- docs/gh-pages-proj/src/views/Home.vue | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/gh-pages-proj/src/views/Home.vue b/docs/gh-pages-proj/src/views/Home.vue index db7842cc41..6f2a8088d0 100644 --- a/docs/gh-pages-proj/src/views/Home.vue +++ b/docs/gh-pages-proj/src/views/Home.vue @@ -178,7 +178,7 @@ export default { const numPRs = 9; for (var i = 0; i < numPRs; i++) { var pr = data.items[i]; - if (pr.body.length == 0) { + if (pr,body == null || pr.body.length == 0) { pr.body = "No Description"; } pr.body = this.truncateString(pr.body, 250); From 2f2ad69a0cc0dd50c99c0f77891587ee947b705a Mon Sep 17 00:00:00 2001 From: Tyler Wilding Date: Wed, 11 Aug 2021 19:53:13 -0400 Subject: [PATCH 4/4] remove unneeded casts, switch to `:allow-misaligned` --- decompiler/config/all-types.gc | 2 +- .../jak1_ntsc_black_label/type_casts.jsonc | 13 ------ goal_src/levels/beach/twister.gc | 45 +++++++------------ .../reference/engine/gfx/shadow/shadow_REF.gc | 8 +--- .../reference/levels/beach/twister_REF.gc | 45 +++++++------------ 5 files changed, 35 insertions(+), 78 deletions(-) diff --git a/decompiler/config/all-types.gc b/decompiler/config/all-types.gc index 851bb34008..1c60952f5e 100644 --- a/decompiler/config/all-types.gc +++ b/decompiler/config/all-types.gc @@ -23311,7 +23311,7 @@ ((ry float :offset-assert 0) (max-dry float :offset-assert 4) ) - :pack-me + :allow-misaligned :method-count-assert 9 :size-assert #x8 :flag-assert #x900000008 diff --git a/decompiler/config/jak1_ntsc_black_label/type_casts.jsonc b/decompiler/config/jak1_ntsc_black_label/type_casts.jsonc index 5c34b6db22..b9939630f4 100644 --- a/decompiler/config/jak1_ntsc_black_label/type_casts.jsonc +++ b/decompiler/config/jak1_ntsc_black_label/type_casts.jsonc @@ -1791,15 +1791,6 @@ [[0, 999], "s6", "target"], [46, "v1", "collide-shape-prim"] // `event-other` from collide-shape ], - - "(method 0 twister)": [ - [37, "a0", "twister"], - [41, "a0", "twister"] - ], - - "(method 9 twister)": [ - [8, "a2", "twister"] - ], "(method 11 twister)": [ [7, "s4", "twist-joint"], @@ -1814,9 +1805,5 @@ [82, "s4", "twist-joint"] ], - "(method 12 twister)": [ - [17, "v1", "twister"] - ], - "placeholder-do-not-add-below": [] } diff --git a/goal_src/levels/beach/twister.gc b/goal_src/levels/beach/twister.gc index 69fb2c2892..6e34a02d46 100644 --- a/goal_src/levels/beach/twister.gc +++ b/goal_src/levels/beach/twister.gc @@ -10,8 +10,7 @@ ((ry float :offset-assert 0) (max-dry float :offset-assert 4) ) - :pack-me - :method-count-assert 9 + :allow-misaligned :method-count-assert 9 :size-assert #x8 :flag-assert #x900000008 ) @@ -74,14 +73,8 @@ (set! (-> v0-0 ry) 0.0) (set! (-> v0-0 max-speed-ry) arg3) (dotimes (v1-4 gp-0) - (set! - (-> (the-as twister (+ (the-as uint v0-0) (* v1-4 16))) data 0 ry) - 0.0 - ) - (set! - (-> (the-as twister (+ (the-as uint v0-0) (* v1-4 16))) data 0 max-dry) - 0.0 - ) + (set! (-> v0-0 data v1-4 ry) 0.0) + (set! (-> v0-0 data v1-4 max-dry) 0.0) ) v0-0 ) @@ -102,10 +95,7 @@ (a1-2 (- arg1 (-> obj first-joint))) ) (while (>= a1-2 v1-1) - (set! - (-> (the-as twister (+ (the-as uint obj) (* v1-1 16))) data 0 max-dry) - arg2 - ) + (set! (-> obj data v1-1 max-dry) arg2) (+! v1-1 1) ) ) @@ -125,11 +115,11 @@ ;; INFO: Return type mismatch int vs none. (defmethod TODO-RENAME-11 twister ((obj twister)) (let* ((s5-0 (+ (-> obj num-joints) -1)) - (s4-0 (the-as object (+ (+ (* s5-0 16) 36) (the-as int obj)))) + (s4-0 (-> obj data s5-0)) ) - (let ((f0-2 (deg-diff (-> (the-as twist-joint s4-0) ry) (-> obj target)))) + (let ((f0-2 (deg-diff (-> s4-0 ry) (-> obj target)))) (+! - (-> (the-as twist-joint s4-0) ry) + (-> s4-0 ry) (seek-with-smooth 0.0 f0-2 @@ -139,23 +129,23 @@ ) ) ) - (let ((f30-1 (-> (the-as twist-joint s4-0) ry))) + (let ((f30-1 (-> s4-0 ry))) (while (> s5-0 0) (+! s5-0 -1) - (let ((s4-1 (the-as object (+ (+ (* s5-0 16) 36) (the-as int obj))))) - (let ((f0-9 (deg-diff f30-1 (-> (the-as twist-joint s4-1) ry)))) + (let ((s4-1 (-> obj data s5-0))) + (let ((f0-9 (deg-diff f30-1 (-> s4-1 ry)))) (cond - ((= (-> (the-as twist-joint s4-1) max-dry) 0.0) + ((= (-> s4-1 max-dry) 0.0) (set! f0-9 0.0) ) - ((< (fabs f0-9) (-> (the-as twist-joint s4-1) max-dry)) + ((< (fabs f0-9) (-> s4-1 max-dry)) ) ((< f0-9 0.0) (set! f0-9 (seek-with-smooth f0-9 - (- (-> (the-as twist-joint s4-1) max-dry)) + (- (-> s4-1 max-dry)) (-> obj max-speed) (-> obj smoothing) (-> obj min-dist) @@ -167,7 +157,7 @@ f0-9 (seek-with-smooth f0-9 - (-> (the-as twist-joint s4-1) max-dry) + (-> s4-1 max-dry) (-> obj max-speed) (-> obj smoothing) (-> obj min-dist) @@ -177,7 +167,7 @@ ) (+! f30-1 f0-9) ) - (set! (-> (the-as twist-joint s4-1) ry) f30-1) + (set! (-> s4-1 ry) f30-1) ) ) ) @@ -196,10 +186,7 @@ (-> arg0 node-list data (+ (-> obj first-joint) s3-0) bone transform) ) ) - (matrix-rotate-y! - s4-0 - (-> (the-as twister (+ (the-as uint obj) (* s3-0 16))) data 0 ry) - ) + (matrix-rotate-y! s4-0 (-> obj data s3-0 ry)) (vector-! (-> s2-0 vector 3) (-> s2-0 vector 3) (-> arg0 root trans)) (matrix*! s2-0 s2-0 s4-0) (vector+! (-> s2-0 vector 3) (-> s2-0 vector 3) (-> arg0 root trans)) diff --git a/test/decompiler/reference/engine/gfx/shadow/shadow_REF.gc b/test/decompiler/reference/engine/gfx/shadow/shadow_REF.gc index b9b012c9f3..fa08a40be0 100644 --- a/test/decompiler/reference/engine/gfx/shadow/shadow_REF.gc +++ b/test/decompiler/reference/engine/gfx/shadow/shadow_REF.gc @@ -161,7 +161,7 @@ (if (!= arg2 0.0) (compute-and-draw-shadow s2-0 - (-> s4-0 position) + (-> s4-0 transform vector 3) (-> s4-0 scale) (the-as vector arg2) arg6 @@ -169,7 +169,7 @@ ) ) (if (and arg1 (!= (shr (shl (-> s4-0 cache bone-matrix) 52) 58) 3)) - (set! (-> arg1 quad) (-> s4-0 position quad)) + (set! (-> arg1 quad) (-> s4-0 transform vector 3 quad)) ) ) (else @@ -337,7 +337,3 @@ ) ) ) - - - - diff --git a/test/decompiler/reference/levels/beach/twister_REF.gc b/test/decompiler/reference/levels/beach/twister_REF.gc index e170248612..da30f6a2b3 100644 --- a/test/decompiler/reference/levels/beach/twister_REF.gc +++ b/test/decompiler/reference/levels/beach/twister_REF.gc @@ -6,8 +6,7 @@ ((ry float :offset-assert 0) (max-dry float :offset-assert 4) ) - :pack-me - :method-count-assert 9 + :allow-misaligned :method-count-assert 9 :size-assert #x8 :flag-assert #x900000008 ) @@ -94,14 +93,8 @@ (set! (-> v0-0 ry) 0.0) (set! (-> v0-0 max-speed-ry) arg3) (dotimes (v1-4 gp-0) - (set! - (-> (the-as twister (+ (the-as uint v0-0) (* v1-4 16))) data 0 ry) - 0.0 - ) - (set! - (-> (the-as twister (+ (the-as uint v0-0) (* v1-4 16))) data 0 max-dry) - 0.0 - ) + (set! (-> v0-0 data v1-4 ry) 0.0) + (set! (-> v0-0 data v1-4 max-dry) 0.0) ) v0-0 ) @@ -122,10 +115,7 @@ (a1-2 (- arg1 (-> obj first-joint))) ) (while (>= a1-2 v1-1) - (set! - (-> (the-as twister (+ (the-as uint obj) (* v1-1 16))) data 0 max-dry) - arg2 - ) + (set! (-> obj data v1-1 max-dry) arg2) (+! v1-1 1) ) ) @@ -145,11 +135,11 @@ ;; INFO: Return type mismatch int vs none. (defmethod TODO-RENAME-11 twister ((obj twister)) (let* ((s5-0 (+ (-> obj num-joints) -1)) - (s4-0 (the-as object (+ (+ (* s5-0 16) 36) (the-as int obj)))) + (s4-0 (-> obj data s5-0)) ) - (let ((f0-2 (deg-diff (-> (the-as twist-joint s4-0) ry) (-> obj target)))) + (let ((f0-2 (deg-diff (-> s4-0 ry) (-> obj target)))) (+! - (-> (the-as twist-joint s4-0) ry) + (-> s4-0 ry) (seek-with-smooth 0.0 f0-2 @@ -159,23 +149,23 @@ ) ) ) - (let ((f30-1 (-> (the-as twist-joint s4-0) ry))) + (let ((f30-1 (-> s4-0 ry))) (while (> s5-0 0) (+! s5-0 -1) - (let ((s4-1 (the-as object (+ (+ (* s5-0 16) 36) (the-as int obj))))) - (let ((f0-9 (deg-diff f30-1 (-> (the-as twist-joint s4-1) ry)))) + (let ((s4-1 (-> obj data s5-0))) + (let ((f0-9 (deg-diff f30-1 (-> s4-1 ry)))) (cond - ((= (-> (the-as twist-joint s4-1) max-dry) 0.0) + ((= (-> s4-1 max-dry) 0.0) (set! f0-9 0.0) ) - ((< (fabs f0-9) (-> (the-as twist-joint s4-1) max-dry)) + ((< (fabs f0-9) (-> s4-1 max-dry)) ) ((< f0-9 0.0) (set! f0-9 (seek-with-smooth f0-9 - (- (-> (the-as twist-joint s4-1) max-dry)) + (- (-> s4-1 max-dry)) (-> obj max-speed) (-> obj smoothing) (-> obj min-dist) @@ -187,7 +177,7 @@ f0-9 (seek-with-smooth f0-9 - (-> (the-as twist-joint s4-1) max-dry) + (-> s4-1 max-dry) (-> obj max-speed) (-> obj smoothing) (-> obj min-dist) @@ -197,7 +187,7 @@ ) (+! f30-1 f0-9) ) - (set! (-> (the-as twist-joint s4-1) ry) f30-1) + (set! (-> s4-1 ry) f30-1) ) ) ) @@ -216,10 +206,7 @@ (-> arg0 node-list data (+ (-> obj first-joint) s3-0) bone transform) ) ) - (matrix-rotate-y! - s4-0 - (-> (the-as twister (+ (the-as uint obj) (* s3-0 16))) data 0 ry) - ) + (matrix-rotate-y! s4-0 (-> obj data s3-0 ry)) (vector-! (-> s2-0 vector 3) (-> s2-0 vector 3) (-> arg0 root trans)) (matrix*! s2-0 s2-0 s4-0) (vector+! (-> s2-0 vector 3) (-> s2-0 vector 3) (-> arg0 root trans))