mirror of
https://github.com/open-goal/jak-project
synced 2026-08-06 18:03:30 -04:00
138 lines
3.6 KiB
Common Lisp
138 lines
3.6 KiB
Common Lisp
;;-*-Lisp-*-
|
|
(in-package goal)
|
|
|
|
;; name: geometry-h.gc
|
|
;; name in dgo: geometry-h
|
|
;; dgos: ENGINE, GAME
|
|
|
|
(define-extern quaternion-from-two-vectors-max-angle! (function quaternion vector vector float quaternion))
|
|
(define-extern vector-orient-by-quat! (function vector vector quaternion vector))
|
|
(define-extern quaternion-from-two-vectors-partial!
|
|
"Create a quaternion representing the rotation between two vectors,
|
|
doing arg3 fraction of the total rotation."
|
|
(function quaternion vector vector float quaternion))
|
|
|
|
;; DECOMP BEGINS
|
|
|
|
(deftype curve (structure)
|
|
((cverts (inline-array vector))
|
|
(num-cverts int32)
|
|
(knots (pointer float))
|
|
(num-knots int32)
|
|
(length float)
|
|
)
|
|
:allow-misaligned
|
|
)
|
|
|
|
|
|
(deftype line-intersection-val (structure)
|
|
((tt0 float)
|
|
(tt1 float)
|
|
)
|
|
)
|
|
|
|
|
|
(deftype border-plane (basic)
|
|
((name symbol)
|
|
(action basic)
|
|
(slot int8)
|
|
(trans vector :inline)
|
|
(normal vector :inline)
|
|
)
|
|
(:methods
|
|
(debug-draw (_type_) int)
|
|
(point-past-plane? (_type_ vector) symbol)
|
|
)
|
|
)
|
|
|
|
|
|
(deftype lissajous (structure)
|
|
"A curve where the x and y position are set by two different sinusoids.
|
|
This stores the parameters and state for evaluating this curve."
|
|
((x-mag float)
|
|
(y-mag float)
|
|
(theta float)
|
|
(wx float)
|
|
(wy float)
|
|
(period-shift float)
|
|
(theta-rate float)
|
|
)
|
|
:pack-me
|
|
(:methods
|
|
(evaluate! (_type_ vector) vector)
|
|
)
|
|
)
|
|
|
|
|
|
(deftype lissajous-interp (structure)
|
|
"Handles interpolating between two different lissajous parameters, and also
|
|
stepping forward the dynamics."
|
|
((current lissajous :inline)
|
|
(dest lissajous :inline)
|
|
(rate lissajous :inline)
|
|
)
|
|
(:methods
|
|
(evaluate! (_type_ vector) vector)
|
|
(update! (_type_) float)
|
|
)
|
|
)
|
|
|
|
|
|
(deftype ellipsoid (vector)
|
|
((width float :overlay-at (-> data 0))
|
|
(height float :overlay-at (-> data 1))
|
|
(length float :overlay-at (-> data 2))
|
|
(h float :overlay-at (-> data 1))
|
|
(l float :overlay-at (-> data 2))
|
|
)
|
|
)
|
|
|
|
|
|
(defun point-in-ellipsoid? ((arg0 ellipsoid) (arg1 vector))
|
|
(let ((v1-1 (vector*! (new 'stack-no-clear 'vector) arg1 arg1)))
|
|
(+ (/ (-> v1-1 x) (square (-> arg0 w)))
|
|
(/ (-> v1-1 y) (square (-> arg0 y)))
|
|
(/ (-> v1-1 z) (square (-> arg0 z)))
|
|
)
|
|
)
|
|
)
|
|
|
|
(defun ellipsoid-random-point-on! ((arg0 ellipsoid) (arg1 vector))
|
|
(let ((s5-0 (new 'stack-no-clear 'vector))
|
|
(s4-0 (new 'stack-no-clear 'vector))
|
|
)
|
|
(let* ((s2-0 sincos-rad!)
|
|
(s1-0 s5-0)
|
|
(f30-0 -3.1415925)
|
|
(f28-0 6.283185)
|
|
(v1-3 (/ (the-as int (rand-uint31-gen *random-generator*)) 256))
|
|
(v1-4 (the-as number (logior #x3f800000 v1-3)))
|
|
)
|
|
(s2-0 s1-0 (+ f30-0 (* f28-0 (+ -1.0 (the-as float v1-4)))))
|
|
)
|
|
(let* ((s2-1 sincos-rad!)
|
|
(s1-1 s4-0)
|
|
(f30-1 -1.5707963)
|
|
(f28-1 3.1415925)
|
|
(v1-9 (/ (the-as int (rand-uint31-gen *random-generator*)) 256))
|
|
(v1-10 (the-as number (logior #x3f800000 v1-9)))
|
|
)
|
|
(s2-1 s1-1 (+ f30-1 (* f28-1 (+ -1.0 (the-as float v1-10)))))
|
|
)
|
|
(set! (-> arg1 x) (* (-> arg0 w) (-> s4-0 y) (-> s5-0 x)))
|
|
(set! (-> arg1 y) (* (-> arg0 y) (-> s4-0 x)))
|
|
(set! (-> arg1 z) (* (-> arg0 z) (-> s4-0 y) (-> s5-0 y)))
|
|
)
|
|
arg1
|
|
)
|
|
|
|
(defun ellipsoid-normal-at! ((arg0 ellipsoid) (arg1 vector) (arg2 vector))
|
|
(let ((v0-0 arg1))
|
|
(set! (-> v0-0 x) (/ (-> arg2 x) (square (-> arg0 w))))
|
|
(set! (-> v0-0 y) (/ (-> arg2 y) (square (-> arg0 y))))
|
|
(set! (-> v0-0 z) (/ (-> arg2 z) (square (-> arg0 z))))
|
|
(set! (-> v0-0 w) 1.0)
|
|
v0-0
|
|
)
|
|
)
|