From 23118be428c260b0294d727c3f12d6444afffd09 Mon Sep 17 00:00:00 2001 From: water111 <48171810+water111@users.noreply.github.com> Date: Sun, 16 Feb 2025 17:40:23 -0500 Subject: [PATCH] [jak3] Fix crash in subrails (#3863) After the change to vector ops, subrails was crashing. This fixes the crash by fixing a stack type and also marks those new vector op functions as inline. Co-authored-by: water111 --- decompiler/config/jak3/ntsc_v1/stack_structures.jsonc | 2 +- goal_src/jak3/engine/math/vector.gc | 5 +++++ goal_src/jak3/levels/comb/h-sled.gc | 6 +++--- test/decompiler/reference/jak3/levels/comb/h-sled_REF.gc | 6 +++--- 4 files changed, 12 insertions(+), 7 deletions(-) diff --git a/decompiler/config/jak3/ntsc_v1/stack_structures.jsonc b/decompiler/config/jak3/ntsc_v1/stack_structures.jsonc index 9ec8d17870..270864f2f6 100644 --- a/decompiler/config/jak3/ntsc_v1/stack_structures.jsonc +++ b/decompiler/config/jak3/ntsc_v1/stack_structures.jsonc @@ -1883,7 +1883,7 @@ ], "(method 97 h-sled)": [ [16, "collide-query"], - [560, ["inline-array", "vector", 1]], + [560, ["inline-array", "matrix", 1]], [624, "vector"] ], "(method 152 h-sled)": [[16, "comb-sentry-stack-var0"]], diff --git a/goal_src/jak3/engine/math/vector.gc b/goal_src/jak3/engine/math/vector.gc index 21dd3b3522..5d8f3e443d 100644 --- a/goal_src/jak3/engine/math/vector.gc +++ b/goal_src/jak3/engine/math/vector.gc @@ -9,6 +9,7 @@ (defun vector-cross! ((arg0 vector) (arg1 vector) (arg2 vector)) "Compute the cross product. The w component is set to junk." + (declare (inline)) (rlet ((acc :class vf) (vf1 :class vf) (vf2 :class vf) @@ -62,6 +63,7 @@ (defun vector*! ((arg0 vector) (arg1 vector) (arg2 vector)) "Elementwise product. Set w = 1." + (declare (inline)) (rlet ((vf0 :class vf) (vf4 :class vf) (vf5 :class vf) @@ -79,6 +81,7 @@ (defun vector+*! ((arg0 vector) (arg1 vector) (arg2 vector) (arg3 float)) "set arg0 = arg1 + (arg3 * arg2). The w component will be set to 1." + (declare (inline)) (rlet ((acc :class vf) (vf0 :class vf) (vf4 :class vf) @@ -100,6 +103,7 @@ (defun vector-*! ((arg0 vector) (arg1 vector) (arg2 vector) (arg3 float)) "Set arg0 = arg1 - (arg3 * arg2). The w component will be set to 1." + (declare (inline)) (rlet ((acc :class vf) (vf0 :class vf) (vf4 :class vf) @@ -194,6 +198,7 @@ (defun vector+float*! ((arg0 vector) (arg1 vector) (arg2 vector) (arg3 float)) "arg0 = arg1 + arg2 * arg3." + (declare (inline)) (rlet ((acc :class vf) (vf0 :class vf) (vf1 :class vf) diff --git a/goal_src/jak3/levels/comb/h-sled.gc b/goal_src/jak3/levels/comb/h-sled.gc index 1abc1abf1c..b2e77168d4 100644 --- a/goal_src/jak3/levels/comb/h-sled.gc +++ b/goal_src/jak3/levels/comb/h-sled.gc @@ -1483,9 +1483,9 @@ (vector-normalize! (-> this side-dir) 1.0) ) (when (logtest? (-> this v-flags) (vehicle-flag on-ground)) - (let ((s2-1 (new 'stack-no-clear 'inline-array 'vector 1))) - (matrix-from-two-vectors! (the-as matrix (-> s2-1 0)) (-> this prev-tunnel-dir) (-> this tunnel-dir)) - (vector-rotate*! (-> s3-0 lin-momentum) (-> s3-0 lin-momentum) (the-as matrix (-> s2-1 0))) + (let ((s2-1 (new 'stack-no-clear 'inline-array 'matrix 1))) + (matrix-from-two-vectors! (-> s2-1 0) (-> this prev-tunnel-dir) (-> this tunnel-dir)) + (vector-rotate*! (-> s3-0 lin-momentum) (-> s3-0 lin-momentum) (-> s2-1 0)) ) (init-velocities! (-> this rbody)) ) diff --git a/test/decompiler/reference/jak3/levels/comb/h-sled_REF.gc b/test/decompiler/reference/jak3/levels/comb/h-sled_REF.gc index 08f095b667..ec45839631 100644 --- a/test/decompiler/reference/jak3/levels/comb/h-sled_REF.gc +++ b/test/decompiler/reference/jak3/levels/comb/h-sled_REF.gc @@ -1676,9 +1676,9 @@ (vector-normalize! (-> this side-dir) 1.0) ) (when (logtest? (-> this v-flags) (vehicle-flag on-ground)) - (let ((s2-1 (new 'stack-no-clear 'inline-array 'vector 1))) - (matrix-from-two-vectors! (the-as matrix (-> s2-1 0)) (-> this prev-tunnel-dir) (-> this tunnel-dir)) - (vector-rotate*! (-> s3-0 lin-momentum) (-> s3-0 lin-momentum) (the-as matrix (-> s2-1 0))) + (let ((s2-1 (new 'stack-no-clear 'inline-array 'matrix 1))) + (matrix-from-two-vectors! (-> s2-1 0) (-> this prev-tunnel-dir) (-> this tunnel-dir)) + (vector-rotate*! (-> s3-0 lin-momentum) (-> s3-0 lin-momentum) (-> s2-1 0)) ) (init-velocities! (-> this rbody)) )