From ce6ebc385c90153ed861f9f72f23e8190b455f14 Mon Sep 17 00:00:00 2001 From: Tyler Wilding Date: Tue, 18 May 2021 21:50:08 -0400 Subject: [PATCH] decomp: decompile `trajectory` (#499) * decomp: decompile `trajectory` * address review feedback * some more corrections --- decompiler/config/all-types.gc | 18 +- .../jak1_ntsc_black_label/label_types.jsonc | 4 + .../jak1_ntsc_black_label/stack_vars.jsonc | 5 + goal_src/engine/debug/debug.gc | 2 + goal_src/engine/physics/trajectory-h.gc | 40 +++-- goal_src/engine/physics/trajectory.gc | 150 +++++++++++++++++ .../reference/all_forward_declarations.gc | 4 + .../engine/physics/trajectory-h_REF.gc | 41 +++++ .../engine/physics/trajectory_REF.gc | 157 ++++++++++++++++++ 9 files changed, 394 insertions(+), 27 deletions(-) create mode 100644 test/decompiler/reference/engine/physics/trajectory-h_REF.gc create mode 100644 test/decompiler/reference/engine/physics/trajectory_REF.gc diff --git a/decompiler/config/all-types.gc b/decompiler/config/all-types.gc index ac4b069652..ab5c799add 100644 --- a/decompiler/config/all-types.gc +++ b/decompiler/config/all-types.gc @@ -9432,13 +9432,13 @@ :size-assert #x28 :flag-assert #x1000000028 (:methods - (dummy-9 () none 9) - (dummy-10 () none 10) - (dummy-11 () none 11) - (dummy-12 () none 12) - (dummy-13 () none 13) - (dummy-14 () none 14) - (dummy-15 () none 15) + (TODO-RENAME-9 (_type_ float vector) vector 9) + (TODO-RENAME-10 (_type_ float vector) vector 10) + (TODO-RENAME-11 (_type_ vector vector float float) none 11) + (TODO-RENAME-12 (_type_ vector vector float float) none 12) + (TODO-RENAME-13 (_type_ vector vector float float) none 13) + (TODO-RENAME-14 (_type_ vector vector float float) none 14) + (TODO-RENAME-15 (_type_) none 15) ) ) @@ -34131,7 +34131,7 @@ ;;(define-extern *debug-sphere-table* object) ;; unknown type (define-extern add-debug-sphere-from-table function) (define-extern debug-sphere-table type) -(define-extern add-debug-line function) +(define-extern add-debug-line (function symbol int vector vector rgba symbol int int)) (define-extern internal-draw-debug-text-3d function) (define-extern add-debug-curve2 function) (define-extern history-init function) @@ -34142,7 +34142,7 @@ (define-extern add-debug-x function) (define-extern add-debug-points function) (define-extern add-debug-text-3d function) -(define-extern add-debug-vector function) +;; (define-extern add-debug-vector (function symbol int trajectory ? float float)) (define-extern transform-float-point function) (define-extern add-debug-curve function) ;;(define-extern *debug-lines* object) ;; unknown type diff --git a/decompiler/config/jak1_ntsc_black_label/label_types.jsonc b/decompiler/config/jak1_ntsc_black_label/label_types.jsonc index e2eae9b9ed..066c8dad44 100644 --- a/decompiler/config/jak1_ntsc_black_label/label_types.jsonc +++ b/decompiler/config/jak1_ntsc_black_label/label_types.jsonc @@ -436,5 +436,9 @@ "load-dgo": [ ["L46", "uint64", true] + ], + + "trajectory": [ + ["L18", "uint64", true] ] } diff --git a/decompiler/config/jak1_ntsc_black_label/stack_vars.jsonc b/decompiler/config/jak1_ntsc_black_label/stack_vars.jsonc index 58a158a9e6..5cad27fbd7 100644 --- a/decompiler/config/jak1_ntsc_black_label/stack_vars.jsonc +++ b/decompiler/config/jak1_ntsc_black_label/stack_vars.jsonc @@ -241,5 +241,10 @@ "string->sound-name": [ [16, "qword"] + ], + + "(method 15 trajectory)": [ + [16, "vector"], + [32, "vector"] ] } diff --git a/goal_src/engine/debug/debug.gc b/goal_src/engine/debug/debug.gc index 9fc8c68a2f..eed1f85970 100644 --- a/goal_src/engine/debug/debug.gc +++ b/goal_src/engine/debug/debug.gc @@ -5,3 +5,5 @@ ;; name in dgo: debug ;; dgos: GAME, ENGINE +;; TODO - for trajectory.gc +(define-extern add-debug-line (function symbol int vector vector rgba symbol int int)) diff --git a/goal_src/engine/physics/trajectory-h.gc b/goal_src/engine/physics/trajectory-h.gc index 8f298e687d..bfa313d51b 100644 --- a/goal_src/engine/physics/trajectory-h.gc +++ b/goal_src/engine/physics/trajectory-h.gc @@ -5,22 +5,26 @@ ;; name in dgo: trajectory-h ;; dgos: GAME, ENGINE - (deftype trajectory (structure) - ((initial-position vector :inline :offset-assert 0) - (initial-velocity vector :inline :offset-assert 16) - (time float :offset-assert 32) - (gravity float :offset-assert 36) ;; meters - ) - :method-count-assert 16 - :size-assert #x28 - :flag-assert #x1000000028 - (:methods - (dummy-9 () none 9) - (dummy-10 () none 10) - (dummy-11 () none 11) - (dummy-12 () none 12) - (dummy-13 () none 13) - (dummy-14 () none 14) - (dummy-15 () none 15) - ) +;; definition of type trajectory +(deftype trajectory (structure) + ((initial-position vector :inline :offset-assert 0) + (initial-velocity vector :inline :offset-assert 16) + (time float :offset-assert 32) + (gravity float :offset-assert 36) + ) + :method-count-assert 16 + :size-assert #x28 + :flag-assert #x1000000028 + (:methods + (TODO-RENAME-9 (_type_ float vector) vector 9) + (TODO-RENAME-10 (_type_ float vector) vector 10) + (TODO-RENAME-11 (_type_ vector vector float float) none 11) + (TODO-RENAME-12 (_type_ vector vector float float) none 12) + (TODO-RENAME-13 (_type_ vector vector float float) none 13) + (TODO-RENAME-14 (_type_ vector vector float float) none 14) + (TODO-RENAME-15 (_type_) none 15) ) + ) + + + diff --git a/goal_src/engine/physics/trajectory.gc b/goal_src/engine/physics/trajectory.gc index 53d42ad8d9..33b9cf8f55 100644 --- a/goal_src/engine/physics/trajectory.gc +++ b/goal_src/engine/physics/trajectory.gc @@ -5,3 +5,153 @@ ;; name in dgo: trajectory ;; dgos: GAME, ENGINE +;; definition for method 9 of type trajectory +;; Used lq/sq +(defmethod TODO-RENAME-9 trajectory ((obj trajectory) (arg0 float) (arg1 vector)) + (let ((v1-0 arg1)) + (set! (-> v1-0 quad) (-> obj initial-position quad)) + ) + (set! (-> arg1 x) (+ (-> arg1 x) (* arg0 (-> obj initial-velocity x)))) + (set! (-> arg1 y) (+ (-> arg1 y) (* arg0 (-> obj initial-velocity y)))) + (set! (-> arg1 z) (+ (-> arg1 z) (* arg0 (-> obj initial-velocity z)))) + (set! (-> arg1 y) (+ (-> arg1 y) (* (* (* 0.5 arg0) arg0) (-> obj gravity)))) + arg1 + ) + +;; definition for method 10 of type trajectory +;; Used lq/sq +(defmethod + TODO-RENAME-10 + trajectory + ((obj trajectory) (arg0 float) (arg1 vector)) + (let ((v1-0 arg1)) + (set! (-> v1-0 quad) (-> obj initial-velocity quad)) + ) + (set! (-> arg1 y) (+ (-> arg1 y) (* arg0 (-> obj gravity)))) + arg1 + ) + +;; definition for method 11 of type trajectory +;; INFO: Return type mismatch int vs none. +;; Used lq/sq +(defmethod + TODO-RENAME-11 + trajectory + ((obj trajectory) (arg0 vector) (arg1 vector) (arg2 float) (arg3 float)) + (rlet ((vf0 :class vf) + (vf4 :class vf) + (vf5 :class vf) + (vf6 :class vf) + ) + (init-vf0-vector) + (let ((v1-0 (-> obj initial-position))) + (set! (-> v1-0 quad) (-> arg0 quad)) + ) + (set! (-> obj gravity) arg3) + (set! (-> obj time) arg2) + (let ((f0-3 (/ (vector-vector-xz-distance arg1 arg0) arg2))) + (let ((a1-2 (-> obj initial-velocity))) + (let ((v1-1 arg1) + (a0-4 arg0) + ) + (.lvf vf4 (&-> v1-1 quad)) + (.lvf vf5 (&-> a0-4 quad)) + ) + (.mov.vf vf6 vf0 :mask #b1000) + (.sub.vf vf6 vf4 vf5 :mask #b111) + (.svf (&-> a1-2 quad) vf6) + ) + (vector-xz-normalize! (-> obj initial-velocity) f0-3) + ) + (set! + (-> obj initial-velocity y) + (- (/ (- (-> arg1 y) (-> arg0 y)) arg2) (* (* 0.5 arg2) (-> obj gravity))) + ) + (let ((v0-2 0)) + ) + (none) + ) + ) + +;; definition for method 12 of type trajectory +;; INFO: Return type mismatch int vs none. +(defmethod + TODO-RENAME-12 + trajectory + ((obj trajectory) (arg0 vector) (arg1 vector) (arg2 float) (arg3 float)) + (let ((f0-1 (/ (vector-vector-xz-distance arg1 arg0) arg2))) + ((method-of-type trajectory TODO-RENAME-11) obj arg0 arg1 f0-1 arg3) + ) + (let ((v0-1 0)) + ) + (none) + ) + +;; definition for method 13 of type trajectory +;; INFO: Return type mismatch int vs none. +(defmethod + TODO-RENAME-13 + trajectory + ((obj trajectory) (arg0 vector) (arg1 vector) (arg2 float) (arg3 float)) + (let* ((f0-0 arg2) + (f1-3 (- (* f0-0 f0-0) (* (* 2.0 (- (-> arg0 y) (-> arg1 y))) arg3))) + (f0-3 900.0) + ) + (when (>= f1-3 0.0) + (let ((f0-4 (sqrtf f1-3))) + (set! f0-3 (fmax (/ (- (- arg2) f0-4) arg3) (/ (+ (- arg2) f0-4) arg3))) + ) + ) + ((method-of-type trajectory TODO-RENAME-11) obj arg0 arg1 f0-3 arg3) + ) + (let ((v0-1 0)) + ) + (none) + ) + +;; definition for method 14 of type trajectory +;; INFO: Return type mismatch int vs none. +(defmethod + TODO-RENAME-14 + trajectory + ((obj trajectory) (arg0 vector) (arg1 vector) (arg2 float) (arg3 float)) + (let* ((f1-2 (+ arg2 (fmax (-> arg0 y) (-> arg1 y)))) + (f1-5 (* (* 2.0 (- (-> arg0 y) f1-2)) arg3)) + (f0-3 4096.0) + ) + (if (< 0.0 f1-5) + (set! f0-3 (sqrtf f1-5)) + ) + ((method-of-type trajectory TODO-RENAME-13) obj arg0 arg1 f0-3 arg3) + ) + (let ((v0-1 0)) + ) + (none) + ) + +;; definition for method 15 of type trajectory +;; INFO: Return type mismatch int vs none. +;; Used lq/sq +(defmethod TODO-RENAME-15 trajectory ((obj trajectory)) + (let ((s5-0 (new 'stack-no-clear 'vector)) + (s4-0 (new 'stack-no-clear 'vector)) + (s3-0 10) + ) + (let ((v1-0 s4-0)) + (set! (-> v1-0 quad) (-> obj initial-position quad)) + ) + (dotimes (s2-0 s3-0) + (let ((v1-1 s5-0)) + (set! (-> v1-1 quad) (-> s4-0 quad)) + ) + (let + ((f0-1 (* (-> obj time) (/ (+ 1.0 (the float s2-0)) (the float s3-0))))) + ((method-of-type trajectory TODO-RENAME-9) obj f0-1 s4-0) + ) + (add-debug-line #t 68 s5-0 s4-0 (new 'static 'rgba :r #xff :a #x80) #f -1) + ) + ) + (let ((v0-2 0)) + ) + (none) + ) diff --git a/test/decompiler/reference/all_forward_declarations.gc b/test/decompiler/reference/all_forward_declarations.gc index 79940b971c..17ee2a8ff1 100644 --- a/test/decompiler/reference/all_forward_declarations.gc +++ b/test/decompiler/reference/all_forward_declarations.gc @@ -646,3 +646,7 @@ "Initializes the VF0 vector which is a constant vector in the VU set to <0,0,0,1>" `(.lvf vf0 (new 'static 'vector :x 0.0 :y 0.0 :z 0.0 :w 1.0)) ) + +;; TODO - for trajectory.gc +(declare-type trajectory structure) +(define-extern add-debug-line (function symbol int vector vector rgba symbol int int)) diff --git a/test/decompiler/reference/engine/physics/trajectory-h_REF.gc b/test/decompiler/reference/engine/physics/trajectory-h_REF.gc new file mode 100644 index 0000000000..0612e179e4 --- /dev/null +++ b/test/decompiler/reference/engine/physics/trajectory-h_REF.gc @@ -0,0 +1,41 @@ +;;-*-Lisp-*- +(in-package goal) + +;; definition of type trajectory +(deftype trajectory (structure) + ((initial-position vector :inline :offset-assert 0) + (initial-velocity vector :inline :offset-assert 16) + (time float :offset-assert 32) + (gravity float :offset-assert 36) + ) + :method-count-assert 16 + :size-assert #x28 + :flag-assert #x1000000028 + (:methods + (TODO-RENAME-9 (_type_ float vector) vector 9) + (TODO-RENAME-10 (_type_ float vector) vector 10) + (TODO-RENAME-11 (_type_ vector vector float float) none 11) + (TODO-RENAME-12 (_type_ vector vector float float) none 12) + (TODO-RENAME-13 (_type_ vector vector float float) none 13) + (TODO-RENAME-14 (_type_ vector vector float float) none 14) + (TODO-RENAME-15 (_type_) none 15) + ) + ) + +;; definition for method 3 of type trajectory +(defmethod inspect trajectory ((obj trajectory)) + (format #t "[~8x] ~A~%" obj 'trajectory) + (format #t "~Tinitial-position: ~`vector`P~%" (-> obj initial-position)) + (format #t "~Tinitial-velocity: ~`vector`P~%" (-> obj initial-velocity)) + (format #t "~Ttime: ~f~%" (-> obj time)) + (format #t "~Tgravity: (meters ~m)~%" (-> obj gravity)) + obj + ) + +;; failed to figure out what this is: +(let ((v0-1 0)) + ) + + + + diff --git a/test/decompiler/reference/engine/physics/trajectory_REF.gc b/test/decompiler/reference/engine/physics/trajectory_REF.gc new file mode 100644 index 0000000000..2c0f820146 --- /dev/null +++ b/test/decompiler/reference/engine/physics/trajectory_REF.gc @@ -0,0 +1,157 @@ +;;-*-Lisp-*- +(in-package goal) + +;; definition for method 9 of type trajectory +;; Used lq/sq +(defmethod TODO-RENAME-9 trajectory ((obj trajectory) (arg0 float) (arg1 vector)) + (let ((v1-0 arg1)) + (set! (-> v1-0 quad) (-> obj initial-position quad)) + ) + (set! (-> arg1 x) (+ (-> arg1 x) (* arg0 (-> obj initial-velocity x)))) + (set! (-> arg1 y) (+ (-> arg1 y) (* arg0 (-> obj initial-velocity y)))) + (set! (-> arg1 z) (+ (-> arg1 z) (* arg0 (-> obj initial-velocity z)))) + (set! (-> arg1 y) (+ (-> arg1 y) (* (* (* 0.5 arg0) arg0) (-> obj gravity)))) + arg1 + ) + +;; definition for method 10 of type trajectory +;; Used lq/sq +(defmethod + TODO-RENAME-10 + trajectory + ((obj trajectory) (arg0 float) (arg1 vector)) + (let ((v1-0 arg1)) + (set! (-> v1-0 quad) (-> obj initial-velocity quad)) + ) + (set! (-> arg1 y) (+ (-> arg1 y) (* arg0 (-> obj gravity)))) + arg1 + ) + +;; definition for method 11 of type trajectory +;; INFO: Return type mismatch int vs none. +;; Used lq/sq +(defmethod + TODO-RENAME-11 + trajectory + ((obj trajectory) (arg0 vector) (arg1 vector) (arg2 float) (arg3 float)) + (rlet ((vf0 :class vf) + (vf4 :class vf) + (vf5 :class vf) + (vf6 :class vf) + ) + (init-vf0-vector) + (let ((v1-0 (-> obj initial-position))) + (set! (-> v1-0 quad) (-> arg0 quad)) + ) + (set! (-> obj gravity) arg3) + (set! (-> obj time) arg2) + (let ((f0-3 (/ (vector-vector-xz-distance arg1 arg0) arg2))) + (let ((a1-2 (-> obj initial-velocity))) + (let ((v1-1 arg1) + (a0-4 arg0) + ) + (.lvf vf4 (&-> v1-1 quad)) + (.lvf vf5 (&-> a0-4 quad)) + ) + (.mov.vf vf6 vf0 :mask #b1000) + (.sub.vf vf6 vf4 vf5 :mask #b111) + (.svf (&-> a1-2 quad) vf6) + ) + (vector-xz-normalize! (-> obj initial-velocity) f0-3) + ) + (set! + (-> obj initial-velocity y) + (- (/ (- (-> arg1 y) (-> arg0 y)) arg2) (* (* 0.5 arg2) (-> obj gravity))) + ) + (let ((v0-2 0)) + ) + (none) + ) + ) + +;; definition for method 12 of type trajectory +;; INFO: Return type mismatch int vs none. +(defmethod + TODO-RENAME-12 + trajectory + ((obj trajectory) (arg0 vector) (arg1 vector) (arg2 float) (arg3 float)) + (let ((f0-1 (/ (vector-vector-xz-distance arg1 arg0) arg2))) + ((method-of-type trajectory TODO-RENAME-11) obj arg0 arg1 f0-1 arg3) + ) + (let ((v0-1 0)) + ) + (none) + ) + +;; definition for method 13 of type trajectory +;; INFO: Return type mismatch int vs none. +(defmethod + TODO-RENAME-13 + trajectory + ((obj trajectory) (arg0 vector) (arg1 vector) (arg2 float) (arg3 float)) + (let* ((f0-0 arg2) + (f1-3 (- (* f0-0 f0-0) (* (* 2.0 (- (-> arg0 y) (-> arg1 y))) arg3))) + (f0-3 900.0) + ) + (when (>= f1-3 0.0) + (let ((f0-4 (sqrtf f1-3))) + (set! f0-3 (fmax (/ (- (- arg2) f0-4) arg3) (/ (+ (- arg2) f0-4) arg3))) + ) + ) + ((method-of-type trajectory TODO-RENAME-11) obj arg0 arg1 f0-3 arg3) + ) + (let ((v0-1 0)) + ) + (none) + ) + +;; definition for method 14 of type trajectory +;; INFO: Return type mismatch int vs none. +(defmethod + TODO-RENAME-14 + trajectory + ((obj trajectory) (arg0 vector) (arg1 vector) (arg2 float) (arg3 float)) + (let* ((f1-2 (+ arg2 (fmax (-> arg0 y) (-> arg1 y)))) + (f1-5 (* (* 2.0 (- (-> arg0 y) f1-2)) arg3)) + (f0-3 4096.0) + ) + (if (< 0.0 f1-5) + (set! f0-3 (sqrtf f1-5)) + ) + ((method-of-type trajectory TODO-RENAME-13) obj arg0 arg1 f0-3 arg3) + ) + (let ((v0-1 0)) + ) + (none) + ) + +;; definition for method 15 of type trajectory +;; INFO: Return type mismatch int vs none. +;; Used lq/sq +(defmethod TODO-RENAME-15 trajectory ((obj trajectory)) + (let ((s5-0 (new 'stack-no-clear 'vector)) + (s4-0 (new 'stack-no-clear 'vector)) + (s3-0 10) + ) + (let ((v1-0 s4-0)) + (set! (-> v1-0 quad) (-> obj initial-position quad)) + ) + (dotimes (s2-0 s3-0) + (let ((v1-1 s5-0)) + (set! (-> v1-1 quad) (-> s4-0 quad)) + ) + (let + ((f0-1 (* (-> obj time) (/ (+ 1.0 (the float s2-0)) (the float s3-0))))) + ((method-of-type trajectory TODO-RENAME-9) obj f0-1 s4-0) + ) + (add-debug-line #t 68 s5-0 s4-0 (new 'static 'rgba :r #xff :a #x80) #f -1) + ) + ) + (let ((v0-2 0)) + ) + (none) + ) + + + +