jak-project/goal_src/jak2/engine/camera/cam-combiner.gc
Tyler Wilding d264779173
d/jak2: finish glist | glist-h | camera | cam-interface | cam-states-dbg | cam-combiner | cam-debug | cam-start (#1829)
* d/jak2: finish `glist` and `glist-h` partially done `time-of-day`

* d/jak2: finish `camera` and `cam-interface`

* d/jak2: partially finish `cam-master` `cam-states`, and `cam-update` finish `cam-states-dbg` `cam-combiner` `cam-debug` and `cam-start`

* tests: update ref tests

* scripts: add scripts to automatically update gsrc files

* d/jak2: update gsrc
2022-08-31 19:22:47 -04:00

482 lines
19 KiB
Common Lisp

;;-*-Lisp-*-
(in-package goal)
;; name: cam-combiner.gc
;; name in dgo: cam-combiner
;; dgos: ENGINE, GAME
;; DECOMP BEGINS
(defbehavior cam-helper-temp camera-combiner ((arg0 (pointer camera-slave)) (arg1 (pointer camera-slave)) (arg2 float))
(local-vars (sv-144 cam-rotation-tracker))
(set! sv-144 (-> arg0 0 tracking))
(let ((s1-0 (-> arg0 0 trans))
(gp-0 (-> arg1 0 tracking))
(s0-0 (-> arg1 0 trans))
)
(cond
((= (-> self tracking-status) 3)
(cam-calc-follow! (-> self tracking) s1-0 #t)
(slave-set-rotation! (-> self tracking) s1-0 (the-as float (-> self tracking-options)) (-> self fov) #t)
(set! sv-144 (-> self tracking))
(set! s1-0 (-> self trans))
)
((= (-> self tracking-status) 2)
(cam-calc-follow! (-> self tracking) s0-0 #t)
(slave-set-rotation! (-> self tracking) s0-0 (the-as float (-> self tracking-options)) (-> self fov) #t)
(set! gp-0 (-> self tracking))
(set! s0-0 (-> self trans))
)
)
(let ((s2-0 (new 'stack-no-clear 'matrix)))
(dotimes (v1-14 3)
(set! (-> s2-0 vector v1-14 quad) (the-as uint128 0))
)
0.0
0.0
0.0
(let ((s4-0 (new-stack-vector0)))
0.0
(let ((s3-0 (new-stack-matrix0)))
(vector-!
(the-as vector (-> s2-0 vector))
(the-as vector (-> sv-144 inv-mat))
(the-as vector (-> gp-0 inv-mat))
)
(vector-! (-> s2-0 vector 1) (-> sv-144 inv-mat vector 1) (-> gp-0 inv-mat vector 1))
(vector-! (-> s2-0 vector 2) (-> sv-144 inv-mat vector 2) (-> gp-0 inv-mat vector 2))
(let ((f0-6 (vector-length (the-as vector (-> s2-0 vector))))
(f1-0 (vector-length (-> s2-0 vector 1)))
(f2-0 (vector-length (-> s2-0 vector 2)))
)
(cond
((and (< f0-6 f1-0) (< f0-6 f2-0))
(vector-cross! s4-0 (-> s2-0 vector 1) (-> s2-0 vector 2))
)
((and (< f1-0 f0-6) (< f1-0 f2-0))
(vector-cross! s4-0 (the-as vector (-> s2-0 vector)) (-> s2-0 vector 2))
)
(else
(vector-cross! s4-0 (the-as vector (-> s2-0 vector)) (-> s2-0 vector 1))
)
)
)
(vector-normalize! s4-0 1.0)
(let ((f0-9 (fabs (vector-dot (the-as vector (-> sv-144 inv-mat)) s4-0)))
(f1-3 (fabs (vector-dot (-> sv-144 inv-mat vector 1) s4-0)))
(f2-3 (fabs (vector-dot (-> sv-144 inv-mat vector 2) s4-0)))
)
(cond
((and (< f0-9 f1-3) (< f0-9 f2-3))
(vector-flatten! (the-as vector (-> s2-0 vector)) (the-as vector (-> sv-144 inv-mat)) s4-0)
(vector-flatten! (-> s2-0 vector 1) (the-as vector (-> gp-0 inv-mat)) s4-0)
)
((< f1-3 f2-3)
(vector-flatten! (the-as vector (-> s2-0 vector)) (-> sv-144 inv-mat vector 1) s4-0)
(vector-flatten! (-> s2-0 vector 1) (-> gp-0 inv-mat vector 1) s4-0)
)
(else
(vector-flatten! (the-as vector (-> s2-0 vector)) (-> sv-144 inv-mat vector 2) s4-0)
(vector-flatten! (-> s2-0 vector 1) (-> gp-0 inv-mat vector 2) s4-0)
)
)
)
(vector-normalize! (the-as vector (-> s2-0 vector)) 1.0)
(vector-normalize! (-> s2-0 vector 1) 1.0)
(vector-cross! (-> s2-0 vector 2) (the-as vector (-> s2-0 vector)) (-> s2-0 vector 1))
(if (< (vector-dot (-> s2-0 vector 2) s4-0) 0.0)
(vector-negate! s4-0 s4-0)
)
(let ((f30-0 (acos (vector-dot (the-as vector (-> s2-0 vector)) (-> s2-0 vector 1)))))
(cond
((logtest? (-> *camera* master-options) 2)
(set! (-> *camera* master-options) (logand -7 (-> *camera* master-options)))
(when (and (< 8192.0 f30-0) (logtest? (-> *camera* master-options) 1))
(vector-! (the-as vector (-> s2-0 vector)) (-> *camera* tpos-curr) s1-0)
(vector-! (-> s2-0 vector 1) s0-0 s1-0)
(vector-flatten! (the-as vector (-> s2-0 vector)) (the-as vector (-> s2-0 vector)) (-> *camera* local-down))
(vector-flatten! (-> s2-0 vector 1) (-> s2-0 vector 1) (-> *camera* local-down))
(when (and (< 4096.0 (vector-normalize-ret-len! (the-as vector (-> s2-0 vector)) 1.0))
(< 4096.0 (vector-normalize-ret-len! (-> s2-0 vector 1) 1.0))
)
(vector-cross! (-> s2-0 vector 2) (-> s2-0 vector 1) (the-as vector (-> s2-0 vector)))
(when (< (vector-dot (-> s2-0 vector 2) s4-0) -0.01)
)
)
)
)
((and (< 16384.0 f30-0) (< (vector-dot (-> self flip-control-axis) s4-0) 0.0))
(logxor! (-> *camera* master-options) 4)
)
)
(set! (-> self flip-control-axis quad) (-> s4-0 quad))
(when (logtest? (-> *camera* master-options) 4)
(set! f30-0 (- 65536.0 f30-0))
(vector-negate! s4-0 s4-0)
)
(let ((f30-1 (* f30-0 (- 1.0 arg2))))
(matrix-axis-sin-cos! s3-0 s4-0 (sin f30-1) (cos f30-1))
)
)
(matrix*! (-> self inv-camera-rot) (the-as matrix gp-0) s3-0)
)
)
)
)
)
(defstate cam-combiner-active (camera-combiner)
:event (behavior ((arg0 process) (arg1 int) (arg2 symbol) (arg3 event-message-block))
(local-vars (v0-0 none))
(let ((v1-0 arg2))
(the-as
object
(cond
((= v1-0 'fast-rot)
(set! v0-0 (the-as none #t))
(set! (-> self fast-rot) (the-as basic v0-0))
v0-0
)
((= v1-0 'set-interpolation)
(let ((f0-1 (the float (-> arg3 param 0))))
(cond
((>= 0.0 f0-1)
(let ((f0-2 1.0))
(set! (-> self interp-val) f0-2)
f0-2
)
)
(else
(set! (-> self interp-val) 0.0)
(let ((f0-3 (/ 5.0 f0-1)))
(set! (-> self interp-step) f0-3)
f0-3
)
)
)
)
)
((= v1-0 'teleport)
(when (nonzero? (-> self tracking-status))
(jump-to-target! (-> self tracking point-of-interest-blend) 0.0)
(cam-calc-follow! (-> self tracking) (-> self trans) #f)
(slave-set-rotation!
(-> self tracking)
(-> self trans)
(the-as float (-> self tracking-options))
(-> self fov)
#f
)
)
)
((= v1-0 'stop-tracking)
(set! (-> self tracking-status) (the-as uint 0))
0
)
((= v1-0 'start-tracking)
(cond
((< arg1 1)
(let ((t9-3 format)
(a0-14 0)
(a1-4 "ERROR <GMJ>: missing camera-slave parameter to *camera-combiner* start-tracking~%")
)
(let ((v1-8 (-> arg3 param 0)))
(rtype-of v1-8)
)
(t9-3 a0-14 a1-4)
)
)
((not (type? (-> arg3 param 0) camera-slave))
(let ((t9-5 format)
(a0-16 0)
(a1-6 "ERROR <GMJ>: invalid type '~A' to *camera-combiner* start-tracking~%")
(v1-11 (-> arg3 param 0))
)
(t9-5 a0-16 a1-6 (rtype-of v1-11))
)
)
((zero? (-> self tracking-status))
(set! (-> self tracking-status) (the-as uint 1))
(let ((gp-1 (the-as camera-slave (-> arg3 param 0))))
(set! (-> self tracking-options) (the-as int (-> gp-1 options)))
(set! (-> self tracking no-follow) (-> gp-1 tracking no-follow))
(copy-to (-> self tracking tilt-adjust) (-> gp-1 tracking tilt-adjust))
(copy-to (-> self tracking underwater-blend) (-> gp-1 tracking underwater-blend))
(copy-to (-> self tracking point-of-interest-blend) (-> gp-1 tracking point-of-interest-blend))
(let ((gp-2 (-> gp-1 trans)))
(cam-calc-follow! (-> self tracking) gp-2 #f)
(slave-set-rotation! (-> self tracking) gp-2 (the-as float (-> self tracking-options)) (-> self fov) #f)
)
)
)
)
)
((= v1-0 'copy-tracking)
(cond
((< arg1 1)
(let ((t9-11 format)
(a0-23 0)
(a1-12 "ERROR <GMJ>: missing camera-slave parameter to *camera-combiner* copy-tracking~%")
)
(let ((v1-23 (-> arg3 param 0)))
(rtype-of v1-23)
)
(t9-11 a0-23 a1-12)
)
)
((not (type? (-> arg3 param 0) camera-slave))
(let ((t9-13 format)
(a0-25 0)
(a1-14 "ERROR <GMJ>: invalid type '~A' to *camera-combiner* copy-tracking~%")
(v1-25 (-> arg3 param 0))
)
(t9-13 a0-25 a1-14 (rtype-of v1-25))
)
)
((nonzero? (-> self tracking-status))
#f
)
(else
(set! (-> self tracking-status) (the-as uint 1))
(let ((gp-3 (the-as camera-slave (-> arg3 param 0))))
(set! (-> self tracking-options) (the-as int (-> gp-3 options)))
(set! (-> self tracking no-follow) (-> gp-3 tracking no-follow))
(copy-to (-> self tracking tilt-adjust) (-> gp-3 tracking tilt-adjust))
(copy-to (-> self tracking underwater-blend) (-> gp-3 tracking underwater-blend))
(set! (-> self tracking follow-off quad) (-> gp-3 tracking follow-off quad))
(set! (-> self tracking follow-pt quad) (-> gp-3 tracking follow-pt quad))
(let* ((a2-23 (-> self tracking))
(a3-7 (-> gp-3 tracking))
(v1-37 (-> a3-7 inv-mat vector 0 quad))
(a0-32 (-> a3-7 inv-mat vector 1 quad))
(a1-17 (-> a3-7 inv-mat vector 2 quad))
(a3-8 (-> a3-7 inv-mat trans quad))
)
(set! (-> a2-23 inv-mat vector 0 quad) v1-37)
(set! (-> a2-23 inv-mat vector 1 quad) a0-32)
(set! (-> a2-23 inv-mat vector 2 quad) a1-17)
(set! (-> a2-23 inv-mat trans quad) a3-8)
)
(copy-to (-> self tracking point-of-interest-blend) (-> gp-3 tracking point-of-interest-blend))
(set! (-> self tracking looking-at quad) (-> gp-3 tracking looking-at quad))
(set! v0-0 (the-as none (-> self tracking looking-interesting)))
(set! (-> (the-as vector v0-0) quad) (-> gp-3 tracking looking-interesting quad))
)
v0-0
)
)
)
)
)
)
)
:code (behavior ()
(until #f
(when *debug-segment*
(let ((gp-0 (-> *display* frames (-> *display* on-screen) profile-array data 0))
(v1-7 'camera)
(s5-0 *profile-camera-color*)
)
(when (and *dproc* *debug-segment*)
(let ((s4-0 (-> gp-0 data (-> gp-0 count))))
(let ((s3-0 (-> gp-0 base-time)))
(set! (-> s4-0 name) v1-7)
(set! (-> s4-0 start-time) (the-as int (- (timer-count (the-as timer-bank #x10000800)) (the-as uint s3-0))))
)
(set! (-> s4-0 depth) (the-as uint (-> gp-0 depth)))
(set! (-> s4-0 color) s5-0)
(set! (-> gp-0 segment (-> gp-0 depth)) s4-0)
)
(+! (-> gp-0 count) 1)
(+! (-> gp-0 depth) 1)
(set! (-> gp-0 max-depth) (max (-> gp-0 max-depth) (-> gp-0 depth)))
)
)
0
)
(when (and (zero? (logand (-> *camera* master-options) 1)) (!= (-> self tracking-status) 0))
(set! (-> self tracking-status) (the-as uint 0))
0
)
(when *camera*
(let ((s5-1 (-> *camera* slave))
(s4-1 (-> *camera* decel))
(f30-0 (parameter-ease-sin-clamp (-> self interp-val)))
(gp-1 (new-stack-vector0))
)
(set! (-> gp-1 quad) (-> self trans quad))
(when s5-1
(cond
((< (-> self interp-val) 1.0)
(vector-lerp-clamp! (-> self trans) (-> s4-1 0 trans) (-> s5-1 0 trans) f30-0)
(set! (-> self fov) (lerp-clamp (-> s4-1 0 fov) (-> s5-1 0 fov) f30-0))
(set! (-> self dist-from-src) (vector-vector-distance (-> self trans) (-> s4-1 0 trans)))
(set! (-> self dist-from-dest) (vector-vector-distance (-> self trans) (-> s5-1 0 trans)))
(cond
((= (-> self tracking-status) 1)
(cam-calc-follow! (-> self tracking) (-> self trans) #t)
(slave-set-rotation!
(-> self tracking)
(-> self trans)
(the-as float (-> self tracking-options))
(-> self fov)
(not (-> self fast-rot))
)
(let* ((a2-4 (-> self inv-camera-rot))
(a3-2 (-> self tracking))
(v1-42 (-> a3-2 inv-mat vector 0 quad))
(a0-18 (-> a3-2 inv-mat vector 1 quad))
(a1-8 (-> a3-2 inv-mat vector 2 quad))
(a3-3 (-> a3-2 inv-mat trans quad))
)
(set! (-> a2-4 vector 0 quad) v1-42)
(set! (-> a2-4 vector 1 quad) a0-18)
(set! (-> a2-4 vector 2 quad) a1-8)
(set! (-> a2-4 trans quad) a3-3)
)
)
(else
(cam-helper-temp s4-1 s5-1 f30-0)
)
)
(cond
((and (< 0.0 (-> *camera* outro-t-step)) (< (-> *camera* outro-t) (-> *camera* outro-exit-value)))
)
((and (< (-> *camera* outro-t-step) 0.0) (< (-> *camera* outro-exit-value) (-> *camera* outro-t)))
)
((paused?)
)
(else
(+! (-> self interp-val) (* (-> self interp-step) (-> self clock time-adjust-ratio)))
)
)
)
(else
(set! (-> self dist-from-src) 409600.0)
(set! (-> self dist-from-dest) 0.0)
(set! (-> self trans quad) (-> s5-1 0 trans quad))
(set! (-> self fov) (-> s5-1 0 fov))
(cond
((= (-> self tracking-status) 2)
(set! (-> self tracking-status) (the-as uint 1))
)
((= (-> self tracking-status) 3)
(set! (-> self tracking-status) (the-as uint 0))
0
)
)
(cond
((= (-> self tracking-status) 1)
(cam-calc-follow! (-> self tracking) (-> self trans) #t)
(slave-set-rotation!
(-> self tracking)
(-> self trans)
(the-as float (-> self tracking-options))
(-> self fov)
(not (-> self fast-rot))
)
(let* ((v1-71 (-> self inv-camera-rot))
(a3-5 (-> self tracking))
(a0-25 (-> a3-5 inv-mat vector 0 quad))
(a1-12 (-> a3-5 inv-mat vector 1 quad))
(a2-8 (-> a3-5 inv-mat vector 2 quad))
(a3-6 (-> a3-5 inv-mat trans quad))
)
(set! (-> v1-71 vector 0 quad) a0-25)
(set! (-> v1-71 vector 1 quad) a1-12)
(set! (-> v1-71 vector 2 quad) a2-8)
(set! (-> v1-71 trans quad) a3-6)
)
)
(else
(let* ((v1-72 (-> self inv-camera-rot))
(a3-7 (-> s5-1 0 tracking))
(a0-27 (-> a3-7 inv-mat vector 0 quad))
(a1-13 (-> a3-7 inv-mat vector 1 quad))
(a2-9 (-> a3-7 inv-mat vector 2 quad))
(a3-8 (-> a3-7 inv-mat trans quad))
)
(set! (-> v1-72 vector 0 quad) a0-27)
(set! (-> v1-72 vector 1 quad) a1-13)
(set! (-> v1-72 vector 2 quad) a2-9)
(set! (-> v1-72 trans quad) a3-8)
)
)
)
)
)
)
(vector-! (-> self velocity) (-> self trans) gp-1)
)
)
(when *debug-segment*
(let ((gp-2 (-> *display* frames (-> *display* on-screen) profile-array data 0)))
(when (and *dproc* *debug-segment*)
(let* ((v1-85 (+ (-> gp-2 depth) -1))
(s5-2 (-> gp-2 segment v1-85))
(s4-2 (-> gp-2 base-time))
)
(when (>= v1-85 0)
(set! (-> s5-2 end-time) (the-as int (- (timer-count (the-as timer-bank #x10000800)) (the-as uint s4-2))))
(+! (-> gp-2 depth) -1)
)
)
)
)
0
)
(set! (-> self fast-rot) #f)
(suspend)
)
#f
(none)
)
)
(defbehavior cam-combiner-init camera-combiner ()
(stack-size-set! (-> self main-thread) 512)
(vector-reset! (-> self trans))
(matrix-identity! (-> self inv-camera-rot))
(cond
(*math-camera*
(set! (-> self fov) (-> *math-camera* fov))
(set! (-> self trans quad) (-> *math-camera* trans quad))
(let* ((v1-6 (-> self inv-camera-rot))
(a3-0 (-> *math-camera* inv-camera-rot))
(a0-6 (-> a3-0 vector 0 quad))
(a1-1 (-> a3-0 vector 1 quad))
(a2-0 (-> a3-0 vector 2 quad))
(a3-1 (-> a3-0 trans quad))
)
(set! (-> v1-6 vector 0 quad) a0-6)
(set! (-> v1-6 vector 1 quad) a1-1)
(set! (-> v1-6 vector 2 quad) a2-0)
(set! (-> v1-6 trans quad) a3-1)
)
)
(else
(set! (-> self fov) 11650.845)
)
)
(set! (-> self interp-val) 1.0)
(set! (-> self interp-step) 0.125)
(set! (-> self tracking-status) (the-as uint 0))
(set! (-> self fast-rot) #f)
(init (-> self tracking tilt-adjust) (-> *CAMERA-bank* default-tilt-adjust) 9.102222 91.022224 0.25)
(init
(-> self tracking follow-height-extra)
(-> *setting-control* cam-current extra-follow-height)
81.92
819.2
0.5
)
(vector-reset! (-> self velocity))
(go cam-combiner-active)
0
(none)
)