mirror of
https://github.com/open-goal/jak-project
synced 2026-08-11 03:26:33 -04:00
recognize vector, matrix, quaternion constructors in a better way (#630)
* recognize vector, matrix, quaternion constructors in a better way * fix bad bug
This commit is contained in:
@@ -66,6 +66,17 @@
|
||||
)
|
||||
)
|
||||
|
||||
(defmacro new-stack-quaternion0 ()
|
||||
"Get a stack quaternion that's set to 0.
|
||||
This is more efficient than (new 'stack 'quaternion) because
|
||||
this doesn't call the constructor."
|
||||
`(let ((q (new 'stack-no-clear 'quaternion)))
|
||||
(set! (-> q quad) (the-as uint128 0))
|
||||
q
|
||||
)
|
||||
)
|
||||
|
||||
|
||||
(defmacro with-pp (&rest body)
|
||||
`(rlet ((pp :reg r13 :reset-here #t :type process))
|
||||
,@body)
|
||||
|
||||
@@ -772,10 +772,7 @@
|
||||
;; Used lq/sq
|
||||
(defun matrix-rotate-yx! ((dst matrix) (rot-y-deg float) (rot-x-deg float))
|
||||
(matrix-rotate-y! dst rot-y-deg)
|
||||
(let* ((t9-1 matrix-rotate-x!)
|
||||
(a0-2 (new-stack-matrix0))
|
||||
(a1-2 (t9-1 a0-2 rot-x-deg))
|
||||
)
|
||||
(let ((a1-2 (matrix-rotate-x! (new-stack-matrix0) rot-x-deg)))
|
||||
(matrix*! dst a1-2 dst)
|
||||
)
|
||||
dst
|
||||
|
||||
@@ -924,13 +924,16 @@
|
||||
(defun
|
||||
quaternion-rotate-local-x!
|
||||
((arg0 quaternion) (arg1 quaternion) (arg2 float))
|
||||
(let ((t9-0 quaternion-vector-angle!)
|
||||
(a0-1 (new 'stack-no-clear 'quaternion))
|
||||
)
|
||||
(set! (-> a0-1 vec quad) (the-as uint128 0))
|
||||
(let ((a2-1 (t9-0 a0-1 (new 'static 'vector :x 1.0 :w 1.0) arg2)))
|
||||
(quaternion-normalize! (quaternion*! arg0 arg1 a2-1))
|
||||
(let
|
||||
((a2-1
|
||||
(quaternion-vector-angle!
|
||||
(new-stack-quaternion0)
|
||||
(new 'static 'vector :x 1.0 :w 1.0)
|
||||
arg2
|
||||
)
|
||||
)
|
||||
)
|
||||
(quaternion-normalize! (quaternion*! arg0 arg1 a2-1))
|
||||
)
|
||||
)
|
||||
|
||||
@@ -939,13 +942,16 @@
|
||||
(defun
|
||||
quaternion-rotate-local-y!
|
||||
((arg0 quaternion) (arg1 quaternion) (arg2 float))
|
||||
(let ((t9-0 quaternion-vector-angle!)
|
||||
(a0-1 (new 'stack-no-clear 'quaternion))
|
||||
)
|
||||
(set! (-> a0-1 vec quad) (the-as uint128 0))
|
||||
(let ((a2-1 (t9-0 a0-1 (new 'static 'vector :y 1.0 :w 1.0) arg2)))
|
||||
(quaternion-normalize! (quaternion*! arg0 arg1 a2-1))
|
||||
(let
|
||||
((a2-1
|
||||
(quaternion-vector-angle!
|
||||
(new-stack-quaternion0)
|
||||
(new 'static 'vector :y 1.0 :w 1.0)
|
||||
arg2
|
||||
)
|
||||
)
|
||||
)
|
||||
(quaternion-normalize! (quaternion*! arg0 arg1 a2-1))
|
||||
)
|
||||
)
|
||||
|
||||
@@ -954,58 +960,64 @@
|
||||
(defun
|
||||
quaternion-rotate-local-z!
|
||||
((arg0 quaternion) (arg1 quaternion) (arg2 float))
|
||||
(let ((t9-0 quaternion-vector-angle!)
|
||||
(a0-1 (new 'stack-no-clear 'quaternion))
|
||||
)
|
||||
(set! (-> a0-1 vec quad) (the-as uint128 0))
|
||||
(let ((a2-1 (t9-0 a0-1 (new 'static 'vector :z 1.0 :w 1.0) arg2)))
|
||||
(quaternion-normalize! (quaternion*! arg0 arg1 a2-1))
|
||||
(let
|
||||
((a2-1
|
||||
(quaternion-vector-angle!
|
||||
(new-stack-quaternion0)
|
||||
(new 'static 'vector :z 1.0 :w 1.0)
|
||||
arg2
|
||||
)
|
||||
)
|
||||
)
|
||||
(quaternion-normalize! (quaternion*! arg0 arg1 a2-1))
|
||||
)
|
||||
)
|
||||
|
||||
;; definition for function quaternion-rotate-y!
|
||||
;; Used lq/sq
|
||||
(defun quaternion-rotate-y! ((arg0 quaternion) (arg1 quaternion) (arg2 float))
|
||||
(let ((t9-0 quaternion-vector-angle!)
|
||||
(a0-1 (new 'stack-no-clear 'quaternion))
|
||||
)
|
||||
(set! (-> a0-1 vec quad) (the-as uint128 0))
|
||||
(let ((a1-2 (t9-0 a0-1 (new 'static 'vector :y 1.0 :w 1.0) arg2)))
|
||||
(quaternion-normalize! (quaternion*! arg0 a1-2 arg1))
|
||||
(let
|
||||
((a1-2
|
||||
(quaternion-vector-angle!
|
||||
(new-stack-quaternion0)
|
||||
(new 'static 'vector :y 1.0 :w 1.0)
|
||||
arg2
|
||||
)
|
||||
)
|
||||
)
|
||||
(quaternion-normalize! (quaternion*! arg0 a1-2 arg1))
|
||||
)
|
||||
)
|
||||
|
||||
;; definition for function quaternion-rotate-x!
|
||||
;; Used lq/sq
|
||||
(defun quaternion-rotate-x! ((arg0 quaternion) (arg1 quaternion) (arg2 float))
|
||||
(let ((s4-0 quaternion-vector-angle!)
|
||||
(s3-0 (new 'stack-no-clear 'quaternion))
|
||||
)
|
||||
(set! (-> s3-0 vec quad) (the-as uint128 0))
|
||||
(let* ((t9-0 vector-x-quaternion!)
|
||||
(a0-1 (new-stack-vector0))
|
||||
(a1-3 (s4-0 s3-0 (t9-0 a0-1 arg1) arg2))
|
||||
)
|
||||
(quaternion-normalize! (quaternion*! arg0 a1-3 arg1))
|
||||
(let
|
||||
((a1-3
|
||||
(quaternion-vector-angle!
|
||||
(new-stack-quaternion0)
|
||||
(vector-x-quaternion! (new-stack-vector0) arg1)
|
||||
arg2
|
||||
)
|
||||
)
|
||||
)
|
||||
(quaternion-normalize! (quaternion*! arg0 a1-3 arg1))
|
||||
)
|
||||
)
|
||||
|
||||
;; definition for function quaternion-rotate-z!
|
||||
;; Used lq/sq
|
||||
(defun quaternion-rotate-z! ((arg0 quaternion) (arg1 quaternion) (arg2 float))
|
||||
(let ((s4-0 quaternion-vector-angle!)
|
||||
(s3-0 (new 'stack-no-clear 'quaternion))
|
||||
)
|
||||
(set! (-> s3-0 vec quad) (the-as uint128 0))
|
||||
(let* ((t9-0 vector-z-quaternion!)
|
||||
(a0-1 (new-stack-vector0))
|
||||
(a1-3 (s4-0 s3-0 (t9-0 a0-1 arg1) arg2))
|
||||
)
|
||||
(quaternion-normalize! (quaternion*! arg0 a1-3 arg1))
|
||||
(let
|
||||
((a1-3
|
||||
(quaternion-vector-angle!
|
||||
(new-stack-quaternion0)
|
||||
(vector-z-quaternion! (new-stack-vector0) arg1)
|
||||
arg2
|
||||
)
|
||||
)
|
||||
)
|
||||
(quaternion-normalize! (quaternion*! arg0 a1-3 arg1))
|
||||
)
|
||||
)
|
||||
|
||||
|
||||
@@ -415,9 +415,7 @@
|
||||
(set! sv-56 (t9-3 a0-5 1.0))
|
||||
)
|
||||
(let* ((f30-0 (vector-y-angle sv-52))
|
||||
(t9-5 vector-flatten!)
|
||||
(a0-7 (new-stack-vector0))
|
||||
(a0-8 (t9-5 a0-7 sv-56 sv-48))
|
||||
(a0-8 (vector-flatten! (new-stack-vector0) sv-56 sv-48))
|
||||
(f0-0 (vector-y-angle a0-8))
|
||||
(f0-1 (deg-diff f30-0 f0-0))
|
||||
)
|
||||
@@ -482,9 +480,7 @@
|
||||
)
|
||||
)
|
||||
(f30-2 (vector-x-angle sv-52))
|
||||
(t9-16 vector-flatten!)
|
||||
(a0-19 (new-stack-vector0))
|
||||
(s3-2 (t9-16 a0-19 sv-56 s3-1))
|
||||
(s3-2 (vector-flatten! (new-stack-vector0) sv-56 s3-1))
|
||||
(f0-15 (vector-x-angle s3-2))
|
||||
(f0-21
|
||||
(fmax
|
||||
@@ -595,9 +591,7 @@
|
||||
(set! sv-56 (t9-3 a0-3 1.0))
|
||||
)
|
||||
(let* ((f30-0 (vector-y-angle sv-52))
|
||||
(t9-5 vector-flatten!)
|
||||
(a0-5 (new-stack-vector0))
|
||||
(a0-6 (t9-5 a0-5 sv-56 sv-48))
|
||||
(a0-6 (vector-flatten! (new-stack-vector0) sv-56 sv-48))
|
||||
(f0-0 (vector-y-angle a0-6))
|
||||
(f0-1 (deg-diff f30-0 f0-0))
|
||||
)
|
||||
@@ -645,9 +639,7 @@
|
||||
)
|
||||
)
|
||||
(f30-2 (vector-x-angle sv-52))
|
||||
(t9-14 vector-flatten!)
|
||||
(a0-14 (new-stack-vector0))
|
||||
(s4-4 (t9-14 a0-14 sv-56 s4-3))
|
||||
(s4-4 (vector-flatten! (new-stack-vector0) sv-56 s4-3))
|
||||
(f0-14 (vector-x-angle s4-4))
|
||||
(f0-20
|
||||
(fmax
|
||||
|
||||
@@ -1382,4 +1382,124 @@ TEST_F(FormRegressionTest, DebugMenuFuncDecode) {
|
||||
" )\n"
|
||||
" )";
|
||||
test_with_expr(func, type, expected, false, "", {}, "[[13, \"a0\", \"symbol\"]]");
|
||||
}
|
||||
|
||||
TEST_F(FormRegressionTest, MatrixNewInlineProp) {
|
||||
std::string func =
|
||||
"sll r0, r0, 0\n"
|
||||
" daddiu sp, sp, -112\n"
|
||||
" sd ra, 0(sp)\n"
|
||||
" sq s5, 80(sp)\n"
|
||||
" sq gp, 96(sp)\n"
|
||||
|
||||
" or gp, a0, r0\n"
|
||||
" or s5, a2, r0\n"
|
||||
" lw t9, matrix-rotate-y!(s7)\n"
|
||||
" or a0, gp, r0\n"
|
||||
" jalr ra, t9\n"
|
||||
" sll v0, ra, 0\n"
|
||||
|
||||
" lw t9, matrix-rotate-x!(s7)\n"
|
||||
" daddiu a0, sp, 16\n"
|
||||
" sq r0, 0(a0)\n"
|
||||
" sq r0, 16(a0)\n"
|
||||
" sq r0, 32(a0)\n"
|
||||
" sq r0, 48(a0)\n"
|
||||
" or a1, s5, r0\n"
|
||||
" jalr ra, t9\n"
|
||||
" sll v0, ra, 0\n"
|
||||
|
||||
" or a1, v0, r0\n"
|
||||
" lw t9, matrix*!(s7)\n"
|
||||
" or a0, gp, r0\n"
|
||||
" or a2, gp, r0\n"
|
||||
" jalr ra, t9\n"
|
||||
" sll v0, ra, 0\n"
|
||||
|
||||
" or v1, v0, r0\n"
|
||||
" or v0, gp, r0\n"
|
||||
" ld ra, 0(sp)\n"
|
||||
" lq gp, 96(sp)\n"
|
||||
" lq s5, 80(sp)\n"
|
||||
" jr ra\n"
|
||||
" daddiu sp, sp, 112\n"
|
||||
|
||||
" sll r0, r0, 0\n"
|
||||
" sll r0, r0, 0\n"
|
||||
" sll r0, r0, 0\n";
|
||||
std::string type = "(function matrix float float matrix)";
|
||||
std::string expected =
|
||||
"(begin\n"
|
||||
" (matrix-rotate-y! arg0 arg1)\n"
|
||||
" (let ((a1-2 (matrix-rotate-x! (new-stack-matrix0) arg2)))\n"
|
||||
" (matrix*! arg0 a1-2 arg0)\n"
|
||||
" )\n"
|
||||
" arg0\n"
|
||||
" )";
|
||||
test_with_stack_structures(func, type, expected, R"([[16, "matrix"]])");
|
||||
}
|
||||
|
||||
TEST_F(FormRegressionTest, VectorNewInlineProp) {
|
||||
std::string func =
|
||||
"sll r0, r0, 0\n"
|
||||
" daddiu sp, sp, -64\n"
|
||||
" sd ra, 0(sp)\n"
|
||||
" sd fp, 8(sp)\n"
|
||||
" or fp, t9, r0\n"
|
||||
" sq s5, 32(sp)\n"
|
||||
" sq gp, 48(sp)\n"
|
||||
" or gp, a0, r0\n"
|
||||
" daddiu s5, sp, 16\n"
|
||||
" sq r0, 0(s5)\n"
|
||||
" or v1, s5, r0\n"
|
||||
" lwc1 f0, 0(a1)\n"
|
||||
" swc1 f0, 0(v1)\n"
|
||||
" lwc1 f0, 4(a1)\n"
|
||||
" swc1 f0, 4(v1)\n"
|
||||
" lwc1 f0, 8(a1)\n"
|
||||
" swc1 f0, 8(v1)\n"
|
||||
" mtc1 f0, r0\n"
|
||||
" swc1 f0, 12(v1)\n"
|
||||
" lw t9, vector-matrix*!(s7)\n"
|
||||
" or a0, s5, r0\n"
|
||||
" or a1, s5, r0\n"
|
||||
" jalr ra, t9\n"
|
||||
" sll v0, ra, 0\n"
|
||||
|
||||
" lwc1 f0, 0(s5)\n"
|
||||
" swc1 f0, 0(gp)\n"
|
||||
" lwc1 f0, 4(s5)\n"
|
||||
" swc1 f0, 4(gp)\n"
|
||||
" lwc1 f0, 8(s5)\n"
|
||||
" swc1 f0, 8(gp)\n"
|
||||
" or v1, gp, r0\n"
|
||||
" or v0, gp, r0\n"
|
||||
" ld ra, 0(sp)\n"
|
||||
" ld fp, 8(sp)\n"
|
||||
" lq gp, 48(sp)\n"
|
||||
" lq s5, 32(sp)\n"
|
||||
" jr ra\n"
|
||||
" daddiu sp, sp, 64\n"
|
||||
|
||||
" sll r0, r0, 0\n"
|
||||
" sll r0, r0, 0\n"
|
||||
" sll r0, r0, 0\n";
|
||||
std::string type = "(function vector3s vector3s matrix vector3s)";
|
||||
std::string expected =
|
||||
"(begin\n"
|
||||
" (let ((s5-0 (new-stack-vector0)))\n"
|
||||
" (let ((v1-0 s5-0))\n"
|
||||
" (set! (-> v1-0 x) (-> arg1 x))\n"
|
||||
" (set! (-> v1-0 y) (-> arg1 y))\n"
|
||||
" (set! (-> v1-0 z) (-> arg1 z))\n"
|
||||
" (set! (-> v1-0 w) 0.0)\n"
|
||||
" )\n"
|
||||
" (vector-matrix*! s5-0 s5-0 arg2)\n"
|
||||
" (set! (-> arg0 x) (-> s5-0 x))\n"
|
||||
" (set! (-> arg0 y) (-> s5-0 y))\n"
|
||||
" (set! (-> arg0 z) (-> s5-0 z))\n"
|
||||
" )\n"
|
||||
" arg0\n"
|
||||
" )";
|
||||
test_with_stack_structures(func, type, expected, R"([[16, "vector"]])");
|
||||
}
|
||||
Reference in New Issue
Block a user