Files
jak-project/goal_src/engine/math/vector.gc
T
Tyler Wilding f123bf368a decomp - vector.gc - Decompile vector.gc (#289)
* temp: commit what i have so far


decomp: Fix nonempty_intersection impl for MSVC Debugging use-case


docs: Add info on getting ASan builds running on Visual Studio w/o exceptions

* decomp: initial rlet implementation

* decomp: cleanup pass of vector-rewrite stage

* decomp: Commit in-progress vector.gc, shortcomings are TODO commented

* decomp: More cleanup, rename from being `vector` instr specific

Fundamentally, this process can be used for re-writing ANY inline-asm instruction

* decomp: Support 4th arg ACC instructions

* decomp: Final pass of vector.gc before implementing last instructions

* decomp: Better warnings when hitting unimplemented instructs

* compiler: Implement inverse-sqrt and mov.vf

* decomp: Final manual pass over vector.gc, documented gaps

* decomp: Finish decompiling what currently is possible in vector.gc

* decomp: Fix Variable -> RegisterAccess conflict

* decomp: codacy lint

* Address review feedback

* Address feedback part 2

* Resolve build failures
2021-03-06 10:46:26 -05:00

1102 lines
31 KiB
Common Lisp

;;-*-Lisp-*-
(in-package goal)
;; name: vector.gc
;; name in dgo: vector
;; dgos: GAME, ENGINE
;; ---- TOP LEVEL COMMENT TODO ----
;; TODO - rand-vu-sphere-point! (fails to decomp)
;; (defun sphere<-vector+r! ((arg0 sphere) (arg1 vector) (arg2 float))
;; (local-vars (v1-0 int))
;; (TODO.LQ v1-0 arg1)
;; (TODO.SQ v1-0 arg0)
;; (set! (-> arg0 data 3) arg2)
;; arg0
;; )
;; (defun sphere<-vector! ((arg0 sphere) (arg1 vector))
;; (local-vars (v1-0 int) (f0-0 float))
;; (set! f0-0 (-> arg0 data 3))
;; (TODO.LQ v1-0 arg1)
;; (TODO.SQ v1-0 arg0)
;; (set! (-> arg0 data 3) f0-0)
;; arg0
;; )
;; (defun spheres-overlap? ((arg0 vector) (arg1 vector))
;; "TODO"
;; (local-vars (v1-0 int)
;; (a0-1 int))
;; (rlet ((vf0 :class vf)
;; (vf1 :class vf)
;; (vf2 :class vf)
;; (vf3 :class vf)
;; (vf4 :class vf))
;; (.lvf vf0 (new 'static 'vector :x 0.0 :y 0.0 :z 0.0 :w 1.0))
;; (.lvf vf1 arg0)
;; (.lvf vf2 arg1)
;; (.sub.vf vf3 vf1 vf2 :mask #b1110)
;; (.mul.vf vf3 vf3 vf3 :mask #b1110)
;; (.add.w.vf vf4 vf1 vf2 :mask #b1)
;; (.mul.w.vf vf4 vf4 vf4 :mask #b1)
;; (.add.y.vf vf3 vf3 vf3 :mask #b1000)
;; (.add.z.vf vf3 vf3 vf3 :mask #b1000)
;; (.add.w.vf vf4 vf0 vf4 :mask #b1000)
;; (.mov a0-1 vf4)
;; (.mov v1-0 vf3)
;; (>= (the-as float (gpr->fpr a0-1))
;; (the-as float (gpr->fpr v1-0)))))
(defun vector3s-! ((arg0 vector) (arg1 vector) (arg2 vector))
"Subtract 2 vectors3: c = (a - b)"
(set! (-> arg0 data 0) (- (-> arg1 data 0) (-> arg2 data 0)))
(set! (-> arg0 data 1) (- (-> arg1 data 1) (-> arg2 data 1)))
(set! (-> arg0 data 2) (- (-> arg1 data 2) (-> arg2 data 2)))
arg0)
(defun vector3s*float! ((arg0 vector) (arg1 vector) (arg2 float))
"Multiply 2 vectors3 by some float"
(set! (-> arg0 data 0) (* (-> arg1 data 0) arg2))
(set! (-> arg0 data 1) (* (-> arg1 data 1) arg2))
(set! (-> arg0 data 2) (* (-> arg1 data 2) arg2))
arg0)
(defun vector3s+! ((arg0 vector) (arg1 vector) (arg2 vector))
"Add 2 vectors3"
(set! (-> arg0 data 0) (+ (-> arg1 data 0) (-> arg2 data 0)))
(set! (-> arg0 data 1) (+ (-> arg1 data 1) (-> arg2 data 1)))
(set! (-> arg0 data 2) (+ (-> arg1 data 2) (-> arg2 data 2)))
arg0)
(defun vector3s-copy! ((arg0 vector) (arg1 vector))
"Copy a vector3s"
(set! (-> arg0 data 0) (-> arg1 data 0))
(set! (-> arg0 data 1) (-> arg1 data 1))
(set! (-> arg0 data 2) (-> arg1 data 2))
arg0)
;; TODO - vector-deg-lerp-clamp! (fails to decomp)
;; - WARN: Type Propagation failed: Function vector-deg-lerp-clamp! has unknown type
;; (defun vector-deg-diff ((arg0 vector) (arg1 vector) (arg2 vector))
;; "TODO"
;; (local-vars (v0-0 int)
;; (v1-0 int)
;; (v1-1 int)
;; (v1-2 int)
;; (v1-3 int)
;; (a1-1 int)
;; (a1-2 int))
;; (rlet ((vf1 :class vf)
;; (vf2 :class vf))
;; (.lvf vf1 arg1)
;; (.lvf vf2 arg2)
;; (.ftoi.vf vf1 vf1)
;; (.ftoi.vf vf2 vf2)
;; (.mov a1-1 vf1)
;; (.mov v1-0 vf2)
;; (TODO.PSLLW a1-2 a1-1 16)
;; (TODO.PSLLW v1-1 v1-0 16)
;; (TODO.PSUBW v1-2 a1-2 v1-1)
;; (TODO.PSRAW v1-3 v1-2 16)
;; (.mov vf1 v1-3)
;; (.itof.vf vf1 vf1)
;; (.svf arg0 vf1)
;; (.mov v0-0 vf1)
;; (the-as vector v0-0)))
;; (defun vector-degmod ((arg0 vector) (arg1 vector))
;; "TODO"
;; (local-vars (v1-0 int)
;; (v1-1 int)
;; (v1-2 int))
;; (rlet ((vf1 :class vf))
;; (.lvf vf1 arg1)
;; (.ftoi.vf vf1 vf1)
;; (.mov v1-0 vf1)
;; (TODO.PSLLW v1-1 v1-0 16)
;; (TODO.PSRAW v1-2 v1-1 16)
;; (.mov vf1 v1-2)
;; (.itof.vf vf1 vf1)
;; (.svf arg0 vf1)
;; arg0))
;; (defun vector-degf ((arg0 vector) (arg1 vector))
;; "TODO"
;; (local-vars (v1-0 int)
;; (v1-1 int))
;; (rlet ((vf1 :class vf))
;; (TODO.LQ v1-0 arg1)
;; (TODO.PSRAW v1-1 v1-0 16)
;; (.mov vf1 v1-1)
;; (.itof.vf vf1 vf1)
;; (.svf arg0 vf1)
;; arg0))
;; (defun vector-degi ((arg0 vector) (arg1 vector))
;; "TODO"
;; (local-vars (v1-0 int)
;; (v1-1 int))
;; (rlet ((vf1 :class vf))
;; (.lvf vf1 arg1)
;; (.ftoi.vf vf1 vf1)
;; (.mov v1-0 vf1)
;; (TODO.PSLLW v1-1 v1-0 16)
;; (TODO.SQ v1-1 arg0)
;; arg0))
;; (defun vector4-lerp-clamp! ((arg0 vector) (arg1 vector) (arg2 float) (arg3 float))
;; "TODO"
;; (local-vars (v1-0 int)
;; (v1-1 int)
;; (v1-2 vector)
;; (a1-1 float)
;; (f0-2 float))
;; (rlet ((vf1 :class vf)
;; (vf2 :class vf)
;; (vf3 :class vf)
;; (vf4 :class vf))
;; (cond
;; ((>= 0.000000 arg3)
;; (TODO.LQ v1-0 arg1)
;; (TODO.SQ v1-0 arg0))
;; ((>= arg3 (l.f POSITIVE_ONE))
;; (TODO.LQ v1-1 arg2)
;; (TODO.SQ v1-1 arg0))
;; (else
;; (set! v1-2 arg0)
;; (set! f0-2 arg3)
;; (.lvf vf1 arg1)
;; (.lvf vf2 arg2)
;; (set! a1-1 f0-2)
;; (.mov vf4 a1-1)
;; (.sub.vf vf2 vf2 vf1)
;; (.mul.x.vf vf2 vf2 vf4)
;; (.add.vf vf3 vf1 vf2)
;; (.svf v1-2 vf3)))
;; arg0))
(defun vector4-lerp! ((arg0 vector) (arg1 vector))
"TODO"
(local-vars (a2-0 none)
(a3-0 none))
(rlet ((vf1 :class vf)
(vf2 :class vf)
(vf3 :class vf)
(vf4 :class vf))
(.lvf vf1 arg1)
(.lvf vf2 a2-0)
(.mov vf4 a3-0)
(.sub.vf vf2 vf2 vf1)
(.mul.x.vf vf2 vf2 vf4)
(.add.vf vf3 vf1 vf2)
(.svf arg0 vf3)
arg0))
;; (defun vector-lerp-clamp! ((arg0 vector) (arg1 vector) (arg2 float) (arg3 float))
;; "TODO"
;; (local-vars (v1-0 int)
;; (v1-1 int)
;; (v1-2 vector)
;; (a1-1 float)
;; (f0-2 float))
;; (rlet ((vf0 :class vf)
;; (vf1 :class vf)
;; (vf2 :class vf)
;; (vf3 :class vf)
;; (vf4 :class vf))
;; (.lvf vf0 (new 'static 'vector :x 0.0 :y 0.0 :z 0.0 :w 1.0))
;; (cond
;; ((>= 0.000000 arg3)
;; (TODO.LQ v1-0 arg1)
;; (TODO.SQ v1-0 arg0))
;; ((>= arg3 (l.f POSITIVE_ONE))
;; (TODO.LQ v1-1 arg2)
;; (TODO.SQ v1-1 arg0))
;; (else
;; (set! v1-2 arg0)
;; (set! f0-2 arg3)
;; (.lvf vf1 arg1)
;; (.lvf vf2 arg2)
;; (set! a1-1 f0-2)
;; (.mov vf4 a1-1)
;; (.add.x.vf vf3 vf0 vf0 :mask #b1)
;; (.sub.vf vf2 vf2 vf1)
;; (.mul.x.vf vf2 vf2 vf4)
;; (.add.vf vf3 vf1 vf2 :mask #b1110)
;; (.svf v1-2 vf3)))
;; arg0))
(defun vector-lerp! ((arg0 vector) (arg1 vector))
"TODO"
(local-vars (a2-0 none)
(a3-0 none))
(rlet ((vf0 :class vf)
(vf1 :class vf)
(vf2 :class vf)
(vf3 :class vf)
(vf4 :class vf))
(.lvf vf0 (new 'static 'vector :x 0.0 :y 0.0 :z 0.0 :w 1.0))
(.lvf vf1 arg1)
(.lvf vf2 a2-0)
(.mov vf4 a3-0)
(.add.x.vf vf3 vf0 vf0 :mask #b1)
(.sub.vf vf2 vf2 vf1)
(.mul.x.vf vf2 vf2 vf4)
(.add.vf vf3 vf1 vf2 :mask #b1110)
(.svf arg0 vf3)
arg0))
(defun rot-zyx-from-vector! ((arg0 vector) (arg1 vector))
"TODO"
(local-vars (v1-0 float)
(f0-1 float)
(f0-5 float)
(f0-6 float)
(f26-0 float)
(f28-0 float)
(f30-0 float))
(set! f28-0 (-> arg1 data 2))
(set! f30-0 (- (-> arg1 data 1)))
(set! f0-1 (atan f30-0 f28-0))
(set! (-> arg0 data 0) f0-1)
(set! f26-0 (- f0-1))
(set! f0-5 (- (* f28-0 (cos f26-0)) (* f30-0 (sin f26-0))))
(set! f0-6 (atan (-> arg1 data 0) f0-5))
(set! (-> arg0 data 1) f0-6)
(set! v1-0 f0-6)
(set! (-> arg0 data 2) 0.000000)
arg0)
(defun rot-zxy-from-vector! ((arg0 vector) (arg1 vector))
"TODO"
(local-vars (v1-0 float)
(f0-0 float)
(f0-4 float)
(f0-5 float)
(f26-0 float)
(f28-0 float)
(f30-0 float))
(set! f28-0 (-> arg1 data 2))
(set! f30-0 (-> arg1 data 0))
(set! f0-0 (atan f30-0 f28-0))
(set! (-> arg0 data 1) f0-0)
(set! f26-0 (- f0-0))
(set! f0-4 (- (* f28-0 (cos f26-0)) (* f30-0 (sin f26-0))))
(set! f0-5 (atan (- (-> arg1 data 1)) f0-4))
(set! (-> arg0 data 0) f0-5)
(set! v1-0 f0-5)
(set! (-> arg0 data 2) 0.000000)
arg0)
(defun vector-cvt.s.w! ((arg0 vector) (arg1 vector))
"TODO"
(rlet ((vf1 :class vf))
(.lvf vf1 arg1)
(.itof.vf vf1 vf1)
(.svf arg0 vf1)
arg0))
(defun vector-cvt.w.s! ((arg0 vector) (arg1 vector))
"TODO"
(rlet ((vf1 :class vf))
(.lvf vf1 arg1)
(.ftoi.vf vf1 vf1)
(.svf arg0 vf1)
arg0
)
)
(defun rotate-y<-vector+vector ((arg0 vector) (arg1 vector))
"TODO"
(atan
(- (-> arg1 data 0) (-> arg0 data 0))
(- (-> arg1 data 2) (-> arg0 data 2))))
;; (defun vector-rotate-around-y! ((arg0 vector) (arg1 vector) (arg2 float))
;; "TODO"
;; (local-vars (v1-0 int) (f0-0 float) (f26-0 float) (f28-0 float) (f30-0 float))
;; (set! f26-0 (-> arg1 data 2))
;; (set! f30-0 (-> arg1 data 0))
;; (set! f28-0 (cos arg2))
;; (set! f0-0 (sin arg2))
;; (TODO.lq v1-0 arg1)
;; (TODO.sq v1-0 arg0)
;; (set! (-> arg0 data 2) (- (* f26-0 f28-0) (* f30-0 f0-0)))
;; (set! (-> arg0 data 0) (+ (* f26-0 f0-0) (* f30-0 f28-0)))
;; arg0)
(defun vector-xz-length ((arg0 vector))
"TODO"
(sqrtf
(+ (* (-> arg0 data 0) (-> arg0 data 0))
(* (-> arg0 data 2) (-> arg0 data 2)))))
(defun vector-xz-length-max! ((arg0 vector) (arg1 float))
"TODO"
(local-vars (v1-4 float)
(f0-0 float)
(f0-1 float))
(set! f0-0 (vector-xz-length arg0))
(when
(not (or (= f0-0 0.000000)
(< f0-0 arg1)))
(set! f0-0 (/ f0-0 arg1))
(when (!= f0-0 0.000000)
(set! (-> arg0 data 0) (/ (-> arg0 data 0) f0-0))
(set! f0-1 (/ (-> arg0 data 2) f0-0))
(set! (-> arg0 data 2) f0-1)
(set! v1-4 f0-1)))
arg0)
(defun vector-length ((arg0 vector))
"TODO"
(local-vars (v0-0 float))
(rlet ((acc :class vf)
(Q :class vf)
(vf0 :class vf)
(vf1 :class vf))
(.lvf vf0 (new 'static 'vector :x 0.0 :y 0.0 :z 0.0 :w 1.0))
(.lvf vf1 arg0)
(.mul.vf vf1 vf1 vf1)
(.mul.x.vf acc vf0 vf1 :mask #b1)
(.add.mul.y.vf acc vf0 vf1 acc :mask #b1)
(.add.mul.z.vf vf1 vf0 vf1 acc :mask #b1)
(.sqrt.vf Q vf1 :ftf #b11)
(.add.w.vf vf1 vf0 vf0 :mask #b1000)
(.wait.vf)
(.mul.vf vf1 vf1 Q :mask #b1000)
(.nop.vf)
(.nop.vf)
(.mov v0-0 vf1)
(the-as float v0-0)))
(defun vector-length-max! ((arg0 vector) (arg1 float))
"TODO"
(local-vars (v1-4 float)
(f0-0 float)
(f0-1 float))
(set! f0-0 (vector-length arg0))
(when
(not (or (= f0-0 0.000000)
(< f0-0 arg1)))
(set! f0-0 (/ f0-0 arg1))
(when (!= f0-0 0.000000)
(set! (-> arg0 data 0) (/ (-> arg0 data 0) f0-0))
(set! (-> arg0 data 1) (/ (-> arg0 data 1) f0-0))
(set! f0-1 (/ (-> arg0 data 2) f0-0))
(set! (-> arg0 data 2) f0-1)
(set! v1-4 f0-1)))
arg0)
(defun vector-xz-normalize! ((arg0 vector) (arg1 float))
"TODO"
(local-vars (v1-1 float)
(v1-2 float)
(f0-0 float)
(f0-5 float))
(set! f0-0 (vector-xz-length arg0))
(when (!= f0-0 0.000000)
(set! v1-1 (/ arg1 f0-0))
(set! (-> arg0 data 0) (* (-> arg0 data 0) v1-1))
(set! f0-5 (* (-> arg0 data 2) v1-1))
(set! (-> arg0 data 2) f0-5)
(set! v1-2 f0-5))
arg0)
;; (defun vector-normalize-copy! ((arg0 vector) (arg1 vector) (arg2 float))
;; "TODO"
;; (local-vars (v1-0 int)
;; (v1-1 float)
;; (v1-2 float)
;; (f0-0 float)
;; (f0-7 float))
;; (set! f0-0 (vector-length arg1))
;; (cond
;; ((= f0-0 0.000000)
;; (TODO.LQ v1-0 arg1)
;; (TODO.SQ v1-0 arg0))
;; (else
;; (set! v1-1 (/ arg2 f0-0))
;; (set! (-> arg0 data 0) (* (-> arg1 data 0) v1-1))
;; (set! (-> arg0 data 1) (* (-> arg1 data 1) v1-1))
;; (set! f0-7 (* (-> arg1 data 2) v1-1))
;; (set! (-> arg0 data 2) f0-7)
;; (set! v1-2 f0-7)))
;; (set! (-> arg0 data 3) (l.f POSITIVE_ONE))
;; arg0)
;; (defun vector-normalize-ret-len! ((a0-0 vector) (a1-0 float))
;; "TODO"
;; (local-vars (v0-0 float)
;; (v1-0 float)
;; (v1-1 int)
;; (f0-0 int)
;; (f0-1 float))
;; (rlet ((acc :class vf)
;; (Q :class vf)
;; (vf0 :class vf)
;; (vf1 :class vf)
;; (vf2 :class vf)
;; (vf3 :class vf))
;; (.lvf vf0 (new 'static 'vector :x 0.0 :y 0.0 :z 0.0 :w 1.0))
;; (.lvf vf1 a0-0)
;; (.mul.vf vf2 vf1 vf1 :mask #b1110)
;; (set! v1-0 a1-0)
;; (.mov vf3 v1-0)
;; (.mul.x.vf acc vf0 vf2 :mask #b1)
;; (.add.mul.y.vf acc vf0 vf2 acc :mask #b1)
;; (.add.mul.z.vf vf2 vf0 vf2 acc :mask #b1)
;; (.isqrt.vf Q vf3 vf2 :ftf #b0 :fsf #b11)
;; (.add.w.vf vf2 vf0 vf2 :mask #b1000)
;; (.mov v1-1 vf2)
;; (set! f0-0 (gpr->fpr v1-1))
;; (set! f0-1 (sqrt.s f0-0))
;; (set! v0-0 (fpr->gpr f0-1))
;; (.wait.vf)
;; (.mul.vf vf1 vf1 Q :mask #b1110)
;; (.nop.vf)
;; (.nop.vf)
;; (.nop.vf)
;; (.svf a0-0 vf1)
;; (ret-value v0-0)))
(defun vector-normalize! ((arg0 vector) (arg1 vector))
"TODO"
(local-vars (v1-0 vector))
(rlet ((acc :class vf)
(Q :class vf)
(vf0 :class vf)
(vf1 :class vf)
(vf2 :class vf)
(vf3 :class vf))
(.lvf vf0 (new 'static 'vector :x 0.0 :y 0.0 :z 0.0 :w 1.0))
(.lvf vf1 arg0)
(.mul.vf vf2 vf1 vf1 :mask #b1110)
(set! v1-0 arg1)
(.mov vf3 v1-0)
(.mul.x.vf acc vf0 vf2 :mask #b1)
(.add.mul.y.vf acc vf0 vf2 acc :mask #b1)
(.add.mul.z.vf vf2 vf0 vf2 acc :mask #b1)
(.isqrt.vf Q vf3 vf2 :ftf #b0 :fsf #b11)
(.wait.vf)
(.mul.vf vf1 vf1 Q :mask #b1110)
(.nop.vf)
(.nop.vf)
(.nop.vf)
(.svf arg0 vf1)
arg0))
(defun vector-vector-xz-distance-squared ((arg0 vector) (arg1 vector))
"TODO"
(local-vars (v0-0 int))
(rlet ((vf1 :class vf)
(vf2 :class vf)
(vf3 :class vf))
(.lvf vf2 arg0)
(.lvf vf3 arg1)
(.sub.vf vf1 vf3 vf2)
(.mul.vf vf1 vf1 vf1)
(.add.z.vf vf1 vf1 vf1 :mask #b1000)
(.mov v0-0 vf1)
(the-as float v0-0)))
(defun vector-vector-xz-distance ((arg0 vector) (arg1 vector))
"TODO"
(local-vars (v0-0 int))
(rlet ((acc :class vf)
(Q :class vf)
(vf0 :class vf)
(vf1 :class vf)
(vf2 :class vf)
(vf3 :class vf))
(.lvf vf0 (new 'static 'vector :x 0.0 :y 0.0 :z 0.0 :w 1.0))
(.lvf vf2 arg0)
(.lvf vf3 arg1)
(.sub.vf vf1 vf3 vf2)
(.mul.vf vf1 vf1 vf1)
(.mul.x.vf acc vf0 vf1 :mask #b1)
(.add.mul.z.vf vf1 vf0 vf1 acc :mask #b1)
(.sqrt.vf Q vf1 :ftf #b11)
(.add.w.vf vf1 vf0 vf0 :mask #b1000)
(.wait.vf)
(.mul.vf vf1 vf1 Q :mask #b1000)
(.nop.vf)
(.nop.vf)
(.mov v0-0 vf1)
(the-as float v0-0)))
(defun vector-vector-distance-squared ((arg0 vector) (arg1 vector))
"TODO"
(local-vars (v0-0 int))
(rlet ((vf1 :class vf)
(vf2 :class vf)
(vf3 :class vf))
(.lvf vf2 arg0)
(.lvf vf3 arg1)
(.sub.vf vf1 vf3 vf2)
(.mul.vf vf1 vf1 vf1)
(.add.y.vf vf1 vf1 vf1 :mask #b1000)
(.add.z.vf vf1 vf1 vf1 :mask #b1000)
(.mov v0-0 vf1)
(the-as float v0-0)))
(defun vector-vector-distance ((arg0 vector) (arg1 vector))
"TODO"
(local-vars (v0-0 int))
(rlet ((acc :class vf)
(Q :class vf)
(vf0 :class vf)
(vf1 :class vf)
(vf2 :class vf)
(vf3 :class vf))
(.lvf vf0 (new 'static 'vector :x 0.0 :y 0.0 :z 0.0 :w 1.0))
(.lvf vf2 arg0)
(.lvf vf3 arg1)
(.sub.vf vf1 vf3 vf2)
(.mul.vf vf1 vf1 vf1)
(.mul.x.vf acc vf0 vf1 :mask #b1)
(.add.mul.y.vf acc vf0 vf1 acc :mask #b1)
(.add.mul.z.vf vf1 vf0 vf1 acc :mask #b1)
(.sqrt.vf Q vf1 :ftf #b11)
(.add.w.vf vf1 vf0 vf0 :mask #b1000)
(.wait.vf)
(.mul.vf vf1 vf1 Q :mask #b1000)
(.nop.vf)
(.nop.vf)
(.mov v0-0 vf1)
(the-as float v0-0)))
(defun vector-xz-length-squared ((arg0 vector))
"TODO"
(+ (* (-> arg0 data 0) (-> arg0 data 0))
(* (-> arg0 data 2) (-> arg0 data 2))))
(defun vector-length-squared ((arg0 vector))
"TODO"
(local-vars (v0-0 int))
(rlet ((acc :class vf)
(vf0 :class vf)
(vf1 :class vf)
(vf2 :class vf))
(.lvf vf0 (new 'static 'vector :x 0.0 :y 0.0 :z 0.0 :w 1.0))
(.lvf vf1 arg0)
(.add.w.vf vf2 vf0 vf0 :mask #b1000)
(.mul.vf vf1 vf1 vf1)
(.mul.x.vf acc vf2 vf1 :mask #b1000)
(.add.mul.y.vf acc vf2 vf1 acc :mask #b1000)
(.add.mul.z.vf vf1 vf2 vf1 acc :mask #b1000)
(.mov v0-0 vf1)
(the-as float v0-0)))
(defun vector-from-ups! ((arg0 vector) (arg1 vector))
"TODO"
(local-vars (at-0 int)
(f0-0 float))
(rlet ((vf0 :class vf)
(vf1 :class vf)
(vf2 :class vf))
(.lvf vf0 (new 'static 'vector :x 0.0 :y 0.0 :z 0.0 :w 1.0))
(.lvf vf1 arg1)
(set! f0-0 (-> *display* seconds-per-frame))
(.mov at-0 f0-0)
(.mov vf2 at-0)
(.mov.vf vf1 vf0 :mask #b1)
(.mul.x.vf vf1 vf1 vf2 :mask #b1110)
(.svf arg0 vf1)
arg0))
(defun vector-to-ups! ((arg0 vector) (arg1 vector))
"TODO"
(local-vars (at-0 int)
(f0-0 float))
(rlet ((vf0 :class vf)
(vf1 :class vf)
(vf2 :class vf))
(.lvf vf0 (new 'static 'vector :x 0.0 :y 0.0 :z 0.0 :w 1.0))
(.lvf vf1 arg1)
(set! f0-0 (-> *display* frames-per-second))
(.mov at-0 f0-0)
(.mov vf2 at-0)
(.mov.vf vf1 vf0 :mask #b1)
(.mul.x.vf vf1 vf1 vf2 :mask #b1110)
(.svf arg0 vf1)
arg0))
(defun vector+float*! ((arg0 vector) (arg1 vector) (arg2 vector) (arg3 float))
"TODO"
(rlet ((acc :class vf)
(vf0 :class vf)
(vf1 :class vf)
(vf2 :class vf)
(vf3 :class vf)
(vf4 :class vf))
(.lvf vf0 (new 'static 'vector :x 0.0 :y 0.0 :z 0.0 :w 1.0))
(.lvf vf2 arg2)
(.lvf vf1 arg1)
(.mov vf3 arg3)
(.add.x.vf vf4 vf0 vf0 :mask #b1)
(.mul.x.vf acc vf2 vf3)
(.add.mul.w.vf vf4 vf1 vf0 acc :mask #b1110)
(.svf arg0 vf4)
arg0))
(defun vector-v*float++! ((arg0 vector) (arg1 vector) (arg2 float))
"TODO"
(vector+float*! arg0 arg0 arg1 (* arg2 (-> *display* seconds-per-frame)))
arg0)
(defun vector-v*float! ((arg0 vector) (arg1 float) (arg2 float))
"TODO"
(local-vars (v0-0 vector)
(v1-0 float)
(v1-1 float)
(f0-1 float))
(rlet ((vf0 :class vf)
(vf1 :class vf)
(vf2 :class vf))
(.lvf vf0 (new 'static 'vector :x 0.0 :y 0.0 :z 0.0 :w 1.0))
(set! v0-0 arg0)
(set! v1-0 arg1)
(set! f0-1 (* arg2 (-> *display* seconds-per-frame)))
(.lvf vf1 v1-0)
(set! v1-1 f0-1)
(.mov vf2 v1-1)
(.add.x.vf vf1 vf0 vf0 :mask #b1)
(.mul.x.vf vf1 vf1 vf2 :mask #b1110)
(.svf v0-0 vf1)
v0-0))
(defun vector-v++! ((arg0 vector) (arg1 vector))
"TODO"
(vector+float*! arg0 arg0 arg1 (-> *display* seconds-per-frame))
arg0)
(defun vector-v*float+! ((arg0 vector) (arg1 vector) (arg2 vector) (arg3 float))
"TODO"
(vector+float*! arg0 arg1 arg2 (* arg3 (-> *display* seconds-per-frame)))
arg0)
(defun vector-v+! ((arg0 vector) (arg1 vector) (arg2 vector))
"TODO"
(vector+float*! arg0 arg1 arg2 (-> *display* seconds-per-frame))
arg0)
(defun vector-v! ((arg0 vector))
"TODO"
(local-vars (v1-0 vector)
(a1-0 vector)
(a1-1 float)
(f0-0 float))
(rlet ((vf0 :class vf)
(vf1 :class vf)
(vf2 :class vf))
(.lvf vf0 (new 'static 'vector :x 0.0 :y 0.0 :z 0.0 :w 1.0))
(set! v1-0 arg0)
(set! a1-0 arg0)
(set! f0-0 (-> *display* seconds-per-frame))
(.lvf vf1 a1-0)
(set! a1-1 f0-0)
(.mov vf2 a1-1)
(.add.x.vf vf1 vf0 vf0 :mask #b1)
(.mul.x.vf vf1 vf1 vf2 :mask #b1110)
(.svf v1-0 vf1)
arg0))
(defun vector-seconds! ((arg0 vector))
"TODO"
(set! (-> arg0 data 0) (* 300.000000 (-> arg0 data 0)))
(set! (-> arg0 data 1) (* 300.000000 (-> arg0 data 1)))
(set! (-> arg0 data 2) (* 300.000000 (-> arg0 data 2)))
arg0)
(defun vector-seconds ((arg0 vector) (arg1 vector))
"TODO"
(set! (-> arg0 data 0) (* 300.000000 (-> arg1 data 0)))
(set! (-> arg0 data 1) (* 300.000000 (-> arg1 data 1)))
(set! (-> arg0 data 2) (* 300.000000 (-> arg1 data 2)))
arg0)
(defun vector-identity! ((arg0 vector))
"TODO"
(set! (-> arg0 data 0) 1.000000)
(set! (-> arg0 data 1) 1.000000)
(set! (-> arg0 data 2) 1.000000)
(set! (-> arg0 data 3) 1.000000)
arg0)
(defun seek-with-smooth ((arg0 float) (arg1 float) (arg2 float) (arg3 float) (arg4 float))
"TODO"
(local-vars (v1-1 float)
(v1-3 float)
(f0-1 float)
(f0-2 float)
(f1-4 float))
(set! f0-1 (- arg1 arg0))
(cond
((>= arg4 (fabs f0-1)) arg1)
(else
(set! f0-2 (* f0-1 arg3))
(set! f1-4 (- arg2))
(cond
((< f0-2 f1-4)
(set! f0-2 f1-4)
(set! v1-1 f0-2))
((< arg2 f0-2)
(set! f0-2 arg2)
(set! v1-3 f0-2)))
(+ f0-2 arg0))))
(defun vector-seek-3d-smooth! ((arg0 vector) (arg1 vector) (arg2 float) (arg3 float))
"TODO"
(local-vars (v1-4 float)
(v1-5 float)
(f0-1 float)
(f0-4 float)
(f0-5 float)
(f0-7 float)
(f1-2 float)
(f1-3 float)
(f2-6 float)
(f3-1 float)
(f3-4 float)
(f3-5 float)
(f3-7 float))
(set! f0-1 (- (-> arg1 data 0) (-> arg0 data 0)))
(set! f1-2 (- (-> arg1 data 1) (-> arg0 data 1)))
(set! f3-1 (- (-> arg1 data 2) (-> arg0 data 2)))
(when
(or (!= f0-1 0.000000) (!= f1-2 0.000000) (!= f3-1 0.000000))
(set! f2-6 (* f0-1 arg3))
(set! f1-3 (* f1-2 arg3))
(set! f0-4 (* f3-1 arg3))
(set! f3-4 (+ (+ (* f2-6 f2-6) (* f1-3 f1-3)) (* f0-4 f0-4)))
(set! f3-5 (sqrtf f0-4))
(cond
((>= arg2 f3-5)
(set! (-> arg0 data 0) (+ (-> arg0 data 0) f2-6))
(set! (-> arg0 data 1) (+ (-> arg0 data 1) f1-3))
(set! f0-5 (+ (-> arg0 data 2) f0-4))
(set! (-> arg0 data 2) f0-5)
(set! v1-4 f0-5))
(else
(set! f3-7 (/ arg2 f3-5))
(set! (-> arg0 data 0) (+ (-> arg0 data 0) (* f3-7 f2-6)))
(set! (-> arg0 data 1) (+ (-> arg0 data 1) (* f3-7 f1-3)))
(set! f0-7 (+ (-> arg0 data 2) (* f3-7 f0-4)))
(set! (-> arg0 data 2) f0-7)
(set! v1-5 f0-7))))
arg0)
(defun vector-seek-2d-yz-smooth! ((arg0 vector) (arg1 vector) (arg2 float) (arg3 float))
"TODO"
(local-vars (v1-3 float)
(v1-4 float)
(f0-1 float)
(f0-3 float)
(f0-4 float)
(f0-6 float)
(f1-5 float)
(f2-1 float)
(f2-3 float)
(f2-4 float)
(f2-6 float))
(set! f0-1 (- (-> arg1 data 1) (-> arg0 data 1)))
(set! f2-1 (- (-> arg1 data 2) (-> arg0 data 2)))
(when
(or (!= f0-1 0.000000) (!= f2-1 0.000000))
(set! f1-5 (* f0-1 arg3))
(set! f0-3 (* f2-1 arg3))
(set! f2-3 (+ (* f1-5 f1-5) (* f0-3 f0-3)))
(set! f2-4 (sqrtf f0-3))
(cond
((>= arg2 f2-4)
(set! (-> arg0 data 1) (+ (-> arg0 data 1) f1-5))
(set! f0-4 (+ (-> arg0 data 2) f0-3))
(set! (-> arg0 data 2) f0-4)
(set! v1-3 f0-4))
(else
(set! f2-6 (/ arg2 f2-4))
(set! (-> arg0 data 1) (+ (-> arg0 data 1) (* f2-6 f1-5)))
(set! f0-6 (+ (-> arg0 data 2) (* f2-6 f0-3)))
(set! (-> arg0 data 2) f0-6)
(set! v1-4 f0-6))))
arg0)
(defun vector-seek-2d-xz-smooth! ((arg0 vector) (arg1 vector) (arg2 float) (arg3 float))
"TODO"
(local-vars (v1-3 float)
(v1-4 float)
(f0-1 float)
(f0-3 float)
(f0-4 float)
(f0-6 float)
(f1-5 float)
(f2-1 float)
(f2-3 float)
(f2-4 float)
(f2-6 float))
(set! f0-1 (- (-> arg1 data 0) (-> arg0 data 0)))
(set! f2-1 (- (-> arg1 data 2) (-> arg0 data 2)))
(when
(or (!= f0-1 0.000000) (!= f2-1 0.000000))
(set! f1-5 (* f0-1 arg3))
(set! f0-3 (* f2-1 arg3))
(set! f2-3 (+ (* f1-5 f1-5) (* f0-3 f0-3)))
(set! f2-4 (sqrtf f0-3))
(cond
((>= arg2 f2-4)
(set! (-> arg0 data 0) (+ (-> arg0 data 0) f1-5))
(set! f0-4 (+ (-> arg0 data 2) f0-3))
(set! (-> arg0 data 2) f0-4)
(set! v1-3 f0-4))
(else
(set! f2-6 (/ arg2 f2-4))
(set! (-> arg0 data 0) (+ (-> arg0 data 0) (* f2-6 f1-5)))
(set! f0-6 (+ (-> arg0 data 2) (* f2-6 f0-3)))
(set! (-> arg0 data 2) f0-6)
(set! v1-4 f0-6))))
arg0)
(defun vector-seek! ((arg0 vector) (arg1 vector) (arg2 float))
"TODO"
(rlet ((vf0 :class vf)
(vf1 :class vf)
(vf2 :class vf)
(vf3 :class vf)
(vf4 :class vf)
(vf5 :class vf))
(.lvf vf0 (new 'static 'vector :x 0.0 :y 0.0 :z 0.0 :w 1.0))
(.mov vf4 arg2)
(.lvf vf1 arg1)
(.lvf vf2 arg0)
(.add.x.vf vf1 vf0 vf0 :mask #b1)
(.sub.x.vf vf5 vf0 vf4 :mask #b1000)
(.sub.vf vf3 vf1 vf2 :mask #b1110)
(.min.x.vf vf3 vf3 vf4 :mask #b1110)
(.max.x.vf vf3 vf3 vf5 :mask #b1110)
(.add.vf vf1 vf2 vf3 :mask #b1110)
(.svf arg0 vf1)
arg0))
(defun vector-delta ((arg0 vector) (arg1 vector))
"TODO"
(local-vars (v0-0 int))
(rlet ((acc :class vf)
(vf0 :class vf)
(vf1 :class vf)
(vf2 :class vf)
(vf3 :class vf))
(.lvf vf0 (new 'static 'vector :x 0.0 :y 0.0 :z 0.0 :w 1.0))
(.lvf vf1 arg0)
(.lvf vf2 arg1)
(.sub.vf vf1 vf2 vf1)
(.abs.vf vf1 vf1)
(.mul.x.vf acc vf0 vf1 :mask #b1)
(.add.mul.y.vf acc vf0 vf1 acc :mask #b1)
(.add.mul.z.vf vf3 vf0 vf1 acc :mask #b1)
(.add.w.vf vf3 vf0 vf3 :mask #b1000)
(.mov v0-0 vf3)
(the-as float v0-0)))
;; TODO - vector= (decomp failed)
(defun vector-negate-in-place! ((arg0 vector))
"TODO"
(rlet ((vf0 :class vf)
(vf1 :class vf))
(.lvf vf0 (new 'static 'vector :x 0.0 :y 0.0 :z 0.0 :w 1.0))
(.lvf vf1 arg0)
(.sub.vf vf1 vf0 vf1 :mask #b1110)
(.svf arg0 vf1)
arg0))
(defun vector-negate! ((arg0 vector) (arg1 vector))
"TODO"
(rlet ((vf0 :class vf)
(vf1 :class vf)
(vf4 :class vf))
(.lvf vf0 (new 'static 'vector :x 0.0 :y 0.0 :z 0.0 :w 1.0))
(.lvf vf1 arg1)
(.sub.vf vf4 vf0 vf1 :mask #b1110)
(.add.x.vf vf4 vf0 vf0 :mask #b1)
(.svf arg0 vf4)
arg0))
(defun vector-float/! ((arg0 vector) (arg1 vector) (arg2 float))
"TODO"
(rlet ((Q :class vf)
(vf0 :class vf)
(vf1 :class vf)
(vf3 :class vf)
(vf4 :class vf))
(.lvf vf0 (new 'static 'vector :x 0.0 :y 0.0 :z 0.0 :w 1.0))
(.mov vf3 arg2)
(.div.vf Q vf0 vf3 :ftf #b11 :fsf #b0)
(.lvf vf1 arg1)
(.add.x.vf vf4 vf0 vf0 :mask #b1)
(.wait.vf)
(.mul.vf vf4 vf1 Q :mask #b1110)
(.nop.vf)
(.nop.vf)
(.svf arg0 vf4)
arg0))
(defun vector--float*! ((arg0 vector) (arg1 vector) (arg2 vector) (arg3 float))
"TODO"
(rlet ((acc :class vf)
(vf0 :class vf)
(vf1 :class vf)
(vf2 :class vf)
(vf3 :class vf)
(vf4 :class vf))
(.lvf vf0 (new 'static 'vector :x 0.0 :y 0.0 :z 0.0 :w 1.0))
(.lvf vf2 arg2)
(.lvf vf1 arg1)
(.mov vf3 arg3)
(.add.x.vf vf4 vf0 vf0 :mask #b1)
(.mul.w.vf acc vf1 vf0)
(.sub.mul.x.vf vf4 vf2 vf3 acc :mask #b1110)
(.svf arg0 vf4)
arg0))
(defun vector-average! ((arg0 vector) (arg1 vector) (arg2 vector))
"TODO"
(local-vars (v1-0 int))
(rlet ((acc :class vf)
(vf0 :class vf)
(vf1 :class vf)
(vf2 :class vf)
(vf3 :class vf)
(vf4 :class vf))
(.lvf vf0 (new 'static 'vector :x 0.0 :y 0.0 :z 0.0 :w 1.0))
(set! v1-0 #x3f000000)
(.lvf vf1 arg1)
(.lvf vf2 arg2)
(.mov vf3 v1-0)
(.add.x.vf vf4 vf0 vf0 :mask #b1)
(.mul.x.vf acc vf1 vf3)
(.add.mul.x.vf vf4 vf2 vf3 acc :mask #b1110)
(.svf arg0 vf4)
arg0))
(defun vector-float*! ((arg0 vector) (arg1 vector) (arg2 float))
"TODO"
(rlet ((vf0 :class vf)
(vf1 :class vf)
(vf2 :class vf))
(.lvf vf0 (new 'static 'vector :x 0.0 :y 0.0 :z 0.0 :w 1.0))
(.lvf vf1 arg1)
(.mov vf2 arg2)
(.add.x.vf vf1 vf0 vf0 :mask #b1)
(.mul.x.vf vf1 vf1 vf2 :mask #b1110)
(.svf arg0 vf1)
arg0))
(defun vector/! ((arg0 vector) (arg1 vector) (arg2 vector))
"TODO"
(local-vars (v1-0 float))
(rlet ((Q :class vf)
(vf0 :class vf)
(vf4 :class vf)
(vf5 :class vf)
(vf6 :class vf)
(vf7 :class vf))
(.lvf vf0 (new 'static 'vector :x 0.0 :y 0.0 :z 0.0 :w 1.0))
(.lvf vf5 arg2)
(.div.vf Q vf0 vf5 :ftf #b11 :fsf #b1)
(.add.x.vf vf6 vf0 vf0 :mask #b1)
(.lvf vf4 arg1)
(set! v1-0 (/ (-> arg1 data 0) (-> arg2 data 0)))
(.wait.vf)
(.mul.vf vf6 vf4 Q :mask #b100)
(.nop.vf)
(.nop.vf)
(.div.vf Q vf0 vf5 :ftf #b11 :fsf #b10)
(.mov vf7 v1-0)
(.add.x.vf vf6 vf0 vf7 :mask #b1000)
(.wait.vf)
(.mul.vf vf6 vf4 Q :mask #b10)
(.nop.vf)
(.nop.vf)
(.svf arg0 vf6)
arg0))
(defun vector-*! ((arg0 vector) (arg1 vector) (arg2 vector) (arg3 float))
"TODO"
(rlet ((acc :class vf)
(vf0 :class vf)
(vf4 :class vf)
(vf5 :class vf)
(vf6 :class vf)
(vf7 :class vf))
(.lvf vf0 (new 'static 'vector :x 0.0 :y 0.0 :z 0.0 :w 1.0))
(.mov vf7 arg3)
(.lvf vf5 arg2)
(.lvf vf4 arg1)
(.add.x.vf vf6 vf0 vf0 :mask #b1)
(.mul.w.vf acc vf4 vf0 :mask #b1110)
(.sub.mul.x.vf vf6 vf5 vf7 acc :mask #b1110)
(.svf arg0 vf6)
arg0))
(defun vector+*! ((arg0 vector) (arg1 vector) (arg2 vector) (arg3 float))
"TODO"
(rlet ((acc :class vf)
(vf0 :class vf)
(vf4 :class vf)
(vf5 :class vf)
(vf6 :class vf)
(vf7 :class vf))
(.lvf vf0 (new 'static 'vector :x 0.0 :y 0.0 :z 0.0 :w 1.0))
(.mov vf7 arg3)
(.lvf vf5 arg2)
(.lvf vf4 arg1)
(.add.x.vf vf6 vf0 vf0 :mask #b1)
(.mul.x.vf acc vf5 vf7 :mask #b1110)
(.add.mul.w.vf vf6 vf4 vf0 acc :mask #b1110)
(.svf arg0 vf6)
arg0))
(defun vector*! ((arg0 vector) (arg1 vector) (arg2 vector))
"TODO"
(rlet ((vf0 :class vf)
(vf4 :class vf)
(vf5 :class vf)
(vf6 :class vf))
(.lvf vf0 (new 'static 'vector :x 0.0 :y 0.0 :z 0.0 :w 1.0))
(.lvf vf4 arg1)
(.lvf vf5 arg2)
(.add.x.vf vf6 vf0 vf0 :mask #b1)
(.mul.vf vf6 vf4 vf5 :mask #b1110)
(.svf arg0 vf6)
arg0))
(defun vector+float! ((arg0 vector) (arg1 vector) (arg2 float))
"TODO"
(rlet ((vf0 :class vf)
(vf4 :class vf)
(vf5 :class vf)
(vf6 :class vf))
(.lvf vf0 (new 'static 'vector :x 0.0 :y 0.0 :z 0.0 :w 1.0))
(.mov vf6 arg2)
(.lvf vf4 arg1)
(.add.x.vf vf5 vf0 vf0 :mask #b1)
(.add.x.vf vf5 vf4 vf6 :mask #b1110)
(.svf arg0 vf5)
arg0))
(defun vector-cross! ((arg0 vector) (arg1 vector) (arg2 vector))
"TODO"
(rlet ((acc :class vf)
(vf1 :class vf)
(vf2 :class vf)
(vf3 :class vf))
(.lvf vf1 arg1)
(.lvf vf2 arg2)
(.outer.product.vf vf3 vf1 vf2)
(.svf arg0 vf3)
arg0))