Files
jak-project/goal_src/jakx/engine/geometry/geometry-h.gc
T
2026-05-08 18:54:05 -04:00

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
)
)