jak-project/goal_src/engine/draw/process-drawable-h.gc
ManDude 1e11a588f5
[decomp] loader prelim work + some cleanup (#697)
* [decomp] `loader` prelim work + some cleanup

* more things

* more

* even more

* yet even more

* minor fixes

* decompiler fix + use behaviors for two funcs

* last functions

* Create loader_REF.gc

* more work

* change vag tool config format + unrelated farmer and yakow stuff

* update some things

* fix some decomp

* cleanup things i came across + make dgo compileable

* fix consistency test

* update refs

* offline test: skip buggy `external-art-buffer` method

* fix test
2021-07-23 18:30:49 -04:00

151 lines
4.8 KiB
Common Lisp

;;-*-Lisp-*-
(in-package goal)
;; name: process-drawable-h.gc
;; name in dgo: process-drawable-h
;; dgos: GAME, ENGINE
(define-extern cspace-index-by-name (function process-drawable string int))
(define-extern cspace-by-name (function process-drawable string cspace))
(define-extern joint-control-reset! (function joint-control joint-control-channel none))
(defun cspace-by-name-no-fail ((arg0 process-drawable) (arg1 string))
"Get a cspace by name from the given process-drawable. If it fails, print an error and return the first one"
(let ((result (cspace-by-name arg0 arg1)))
(cond
(result
result
)
(else
(format 0 "no cspace (~A)~%" arg1)
(-> arg0 node-list data 0)
)
)
)
)
(defun cspace-index-by-name-no-fail ((arg0 process-drawable) (arg1 string))
"Get the index of a cspace by name from the given process drawable. If it fails, print an error and return 0."
(let ((v0-0 (cspace-index-by-name arg0 arg1)))
(cond
((< v0-0 0)
(format 0 "no cspace[ndx] (~A)~%" arg1)
0
)
(else
v0-0
)
)
)
)
;; The following functions can be applied to a joint-control-channel to change the frame number.
;; They return the resulting frame number as well.
(defun num-func-none ((arg0 joint-control-channel) (arg2 float) (arg2 float))
"Don't change anything."
(-> arg0 frame-num)
)
(defun num-func-+! ((arg0 joint-control-channel) (arg1 float) (arg2 float))
"Increment the frame number, taking into account the animation speed and current game rate."
(let ((f0-1
(+ (-> arg0 frame-num)
(* arg1 (* (-> arg0 frame-group speed) (-> *display* time-adjust-ratio)))
)
)
)
(set! (-> arg0 frame-num) f0-1)
f0-1
)
)
(defun num-func--! ((arg0 joint-control-channel) (arg1 float) (arg2 float))
"Decrement the frame number, taking into account the animation speed and current game rate."
(let ((f0-1
(- (-> arg0 frame-num)
(* arg1 (* (-> arg0 frame-group speed) (-> *display* time-adjust-ratio)))
)
)
)
(set! (-> arg0 frame-num) f0-1)
f0-1
)
)
(defun num-func-loop! ((chan joint-control-channel) (inc float) (arg2 float))
"Like num-func-+!, but will wrap to 0 after going past the end."
;; get the duration from the joint-animation-compressed.
(let* ((duration (the float (+ (-> chan frame-group data 0 length) -1)))
;; increment (also add a full duration to it, I guess to avoid issues if inc is negative and we're near the start.)
(after-inc (+ (+ (-> chan frame-num) duration)
(* inc (* (-> chan frame-group speed) (-> *display* time-adjust-ratio)))
)
)
;; wrap.
(wrapped (- after-inc (* (the float (the int (/ after-inc duration))) duration)))
)
(set! (-> chan frame-num) wrapped)
wrapped
)
)
(defun num-func-seek! ((arg0 joint-control-channel) (arg1 float) (arg2 float))
"Seek toward arg1 by at most arg2 (taking into account speed etc)"
(let ((f0-3 (seek
(-> arg0 frame-num)
arg1
(* arg2 (* (-> arg0 frame-group speed) (-> *display* time-adjust-ratio)))
)
)
)
;; set it twice, just to make sure.
(set! (-> arg0 frame-num) f0-3)
(set! (-> arg0 frame-num) f0-3)
f0-3
)
)
(defun num-func-blend-in! ((arg0 joint-control-channel) (arg1 float) (arg2 float))
"Seek frame-interp toward 1. Once its there, do a joint-control-reset."
(let* ((v0-0 (seek (-> arg0 frame-interp) 1.0 (* arg1 (-> *display* time-adjust-ratio))))
(f30-0 (the-as float v0-0))
)
(set! (-> arg0 frame-interp) f30-0)
(set! (-> arg0 frame-interp) f30-0)
(if (= f30-0 1.0)
(joint-control-reset! (-> arg0 parent) arg0)
)
f30-0
)
)
(defun num-func-chan ((arg0 joint-control-channel) (arg1 float) (arg2 float))
"Copies the frame number from the channel arg1."
;; this is a super hack.
;; we know that we're in an inline-array of joint-control-channels
;; and the group-sub-index is our index in our array
;; so we can compute the offset of the arg1-th index from this.
(let ((f0-2 (-> (the-as joint-control-channel
(+ (the-as uint arg0)
(the-as uint
;; 48 * (difference in indices)
(* 48 (- (the int arg1) (-> arg0 group-sub-index))))
)
)
frame-num
)
)
)
(set! (-> arg0 frame-num) f0-2)
f0-2
)
)
(defun num-func-identity ((arg0 joint-control-channel) (arg1 float) (arg2 float))
"seems to be the same thing as none."
(-> arg0 frame-num)
)