mirror of
https://github.com/open-goal/jak-project
synced 2026-08-06 18:03:30 -04:00
976e08fe97
Add the vortex renderer. The vortex texture isn't there yet (it uses the same texture as clouds), so it uses a checkerboard. But the colors/vertices seem right.
194 lines
9.2 KiB
Common Lisp
194 lines
9.2 KiB
Common Lisp
;;-*-Lisp-*-
|
|
(in-package goal)
|
|
|
|
;; name: vortex.gc
|
|
;; name in dgo: vortex
|
|
;; dgos: INTROCST
|
|
|
|
;; DECOMP BEGINS
|
|
|
|
;; ERROR: function has no type analysis. Cannot decompile.
|
|
|
|
(def-mips2c init-vortex-regs (function none))
|
|
|
|
(def-mips2c draw-large-polygon-vortex function)
|
|
|
|
(def-mips2c render-vortex-quad (function vortex-vertex dma-buffer vector none))
|
|
|
|
(defun update-vortex-data ((arg0 float))
|
|
(when (not (paused?))
|
|
(+! (-> *vortex-work* off-s-0) (the int (* 4.0 arg0)))
|
|
(+! (-> *vortex-work* off-t-0) (the int (* -8.0 arg0)))
|
|
(+! (-> *vortex-work* off-s-1) (the int (* 4.0 arg0)))
|
|
(+! (-> *vortex-work* off-t-1) (the int (* -8.0 arg0)))
|
|
)
|
|
0
|
|
(none)
|
|
)
|
|
|
|
;; ERROR: Failed store: (s.w! (+ v1-76 8) 0) at op 268
|
|
(defun draw-vortex ()
|
|
(rlet ((vf27 :class vf))
|
|
(when (and (logtest? (-> *display* vu1-enable-user) (vu1-renderer-mask sky))
|
|
(logtest? (-> *texture-pool* texture-enable-user) (texture-enable-mask sky))
|
|
)
|
|
(let ((gp-0 (-> *display* frames (-> *display* on-screen) global-buf base)))
|
|
(update-vortex-data 60.0)
|
|
(with-dma-buffer-add-bucket ((s4-0 (-> *display* frames (-> *display* on-screen) global-buf))
|
|
(bucket-id sky-draw)
|
|
)
|
|
(let ((v1-17 s4-0))
|
|
(let ((a0-6 (the-as dma-packet (-> v1-17 base))))
|
|
(set! (-> a0-6 dma) (new 'static 'dma-tag :qwc #x4 :id (dma-tag-id cnt)))
|
|
(set! (-> a0-6 vif0) (new 'static 'vif-tag))
|
|
(set! (-> a0-6 vif1) (new 'static 'vif-tag :imm #x4 :cmd (vif-cmd direct) :msk #x1))
|
|
(set! (-> v1-17 base) (the-as pointer (&+ a0-6 16)))
|
|
)
|
|
)
|
|
(let ((v1-18 s4-0))
|
|
(let ((a0-8 (the-as gs-gif-tag (-> v1-18 base))))
|
|
(set! (-> a0-8 tag) (new 'static 'gif-tag64 :nloop #x1 :eop #x1 :nreg #x3))
|
|
(set! (-> a0-8 regs) GIF_REGS_ALL_AD)
|
|
(set! (-> v1-18 base) (the-as pointer (&+ a0-8 16)))
|
|
)
|
|
)
|
|
(let ((v1-19 s4-0))
|
|
(let ((a0-10 (-> v1-19 base)))
|
|
(set! (-> (the-as (pointer gs-zbuf) a0-10) 0) (new 'static 'gs-zbuf :zbp #x130 :psm (gs-psm ct24)))
|
|
(set! (-> (the-as (pointer gs-reg64) a0-10) 1) (gs-reg64 zbuf-1))
|
|
(set! (-> (the-as (pointer gs-test) a0-10) 2)
|
|
(new 'static 'gs-test :ate #x1 :atst (gs-atest always) :zte #x1 :ztst (gs-ztest always))
|
|
)
|
|
(set! (-> (the-as (pointer gs-reg64) a0-10) 3) (gs-reg64 test-1))
|
|
(set! (-> (the-as (pointer gs-rgbaq) a0-10) 4) (new 'static 'gs-rgbaq :b #x40 :q 1.0))
|
|
(set! (-> (the-as (pointer gs-reg64) a0-10) 5) (gs-reg64 rgbaq))
|
|
(set! (-> v1-19 base) (&+ a0-10 48))
|
|
)
|
|
)
|
|
(let ((v1-20 (-> s4-0 base)))
|
|
(set! (-> (the-as (pointer uint128) v1-20)) (-> *sky-work* sprite-tmpl dma-vif quad))
|
|
(set! (-> (the-as (pointer uint128) v1-20) 1) (-> *sky-work* sprite-tmpl quad 1))
|
|
)
|
|
(&+! (-> s4-0 base) 32)
|
|
(let ((v1-23 (-> s4-0 base)))
|
|
(set-vector! (the-as vector4w (&+ v1-23 0)) #x7000 #x7300 0 0)
|
|
(set-vector! (the-as vector4w (&+ v1-23 16)) #x9000 #x8d00 0 0)
|
|
)
|
|
(&+! (-> s4-0 base) 32)
|
|
(let ((v1-27 s4-0))
|
|
(let ((a0-19 (the-as dma-packet (-> v1-27 base))))
|
|
(set! (-> a0-19 dma) (new 'static 'dma-tag :qwc #x6 :id (dma-tag-id cnt)))
|
|
(set! (-> a0-19 vif0) (new 'static 'vif-tag))
|
|
(set! (-> a0-19 vif1) (new 'static 'vif-tag :imm #x6 :cmd (vif-cmd direct) :msk #x1))
|
|
(set! (-> v1-27 base) (the-as pointer (&+ a0-19 16)))
|
|
)
|
|
)
|
|
(let ((v1-28 s4-0))
|
|
(let ((a0-21 (the-as gs-gif-tag (-> v1-28 base))))
|
|
(set! (-> a0-21 tag) (new 'static 'gif-tag64 :nloop #x1 :eop #x1 :nreg #x5))
|
|
(set! (-> a0-21 regs) GIF_REGS_ALL_AD)
|
|
(set! (-> v1-28 base) (the-as pointer (&+ a0-21 16)))
|
|
)
|
|
)
|
|
(let ((s3-0 s4-0))
|
|
(let ((s2-0 (-> s3-0 base)))
|
|
(set! (-> (the-as (pointer gs-tex0) s2-0) 0) (new 'static 'gs-tex0
|
|
:tbp0 #x100
|
|
:tbw #x2
|
|
:psm #x1b
|
|
:tcc #x1
|
|
:cbp #x300
|
|
:cld #x1
|
|
:th (log2 128)
|
|
:tw (log2 128)
|
|
)
|
|
)
|
|
(set! (-> (the-as (pointer gs-reg64) s2-0) 1) (gs-reg64 tex0-1))
|
|
(set! (-> (the-as (pointer gs-tex1) s2-0) 2) (new 'static 'gs-tex1 :mmag #x1 :mmin #x1))
|
|
(set! (-> (the-as (pointer gs-reg64) s2-0) 3) (gs-reg64 tex1-1))
|
|
(set! (-> (the-as (pointer gs-clamp) s2-0) 4) (new 'static 'gs-clamp))
|
|
(set! (-> (the-as (pointer gs-reg64) s2-0) 5) (gs-reg64 clamp-1))
|
|
(set! (-> (the-as (pointer gs-alpha) s2-0) 6) (new 'static 'gs-alpha :b #x1 :d #x1))
|
|
(set! (-> (the-as (pointer gs-reg64) s2-0) 7) (gs-reg64 alpha-1))
|
|
(set! (-> (the-as (pointer uint64) s2-0) 8) (the-as uint 0))
|
|
(set! (-> (the-as (pointer gs-reg64) s2-0) 9) (gs-reg64 texflush))
|
|
(set! (-> s3-0 base) (&+ s2-0 80))
|
|
)
|
|
)
|
|
(init-vortex-regs)
|
|
;;(.lvf vf27 (&-> *vortex-work* giftag quad))
|
|
(set-sky-vf27 (&-> *vortex-work* giftag quad))
|
|
|
|
(set-tex-offset (the-as int (-> *vortex-work* off-s-0)) (the-as int (-> *vortex-work* off-t-0)))
|
|
(let ((s3-1 (the-as dma-packet (-> s4-0 base))))
|
|
(&+! (-> s4-0 base) 16)
|
|
(let ((s2-1 *vortex-poly*))
|
|
(dotimes (s1-2 304)
|
|
(render-vortex-quad (-> s2-1 (* s1-2 4)) s4-0 (new 'static 'vector :z 128.0 :w 128.0))
|
|
)
|
|
)
|
|
(close-sky-buffer s4-0)
|
|
(let ((v1-54 (/ (+ (- -16 (the-as int s3-1)) (the-as int (-> s4-0 base))) 16)))
|
|
(set! (-> s3-1 dma) (new 'static 'dma-tag :id (dma-tag-id cnt) :qwc v1-54))
|
|
(set! (-> s3-1 vif0) (new 'static 'vif-tag))
|
|
(set! (-> s3-1 vif1) (new 'static 'vif-tag :cmd (vif-cmd direct) :msk #x1 :imm v1-54))
|
|
)
|
|
)
|
|
(let ((v1-58 s4-0))
|
|
(let ((a0-32 (the-as dma-packet (-> v1-58 base))))
|
|
(set! (-> a0-32 dma) (new 'static 'dma-tag :qwc #x3 :id (dma-tag-id cnt)))
|
|
(set! (-> a0-32 vif0) (new 'static 'vif-tag))
|
|
(set! (-> a0-32 vif1) (new 'static 'vif-tag :imm #x3 :cmd (vif-cmd direct) :msk #x1))
|
|
(set! (-> v1-58 base) (the-as pointer (&+ a0-32 16)))
|
|
)
|
|
)
|
|
(let ((v1-59 s4-0))
|
|
(let ((a0-34 (the-as gs-gif-tag (-> v1-59 base))))
|
|
(set! (-> a0-34 tag) (new 'static 'gif-tag64 :nloop #x1 :eop #x1 :nreg #x2))
|
|
(set! (-> a0-34 regs) GIF_REGS_ALL_AD)
|
|
(set! (-> v1-59 base) (the-as pointer (&+ a0-34 16)))
|
|
)
|
|
)
|
|
(let ((v1-60 s4-0))
|
|
(let ((a0-36 (-> v1-60 base)))
|
|
(set! (-> (the-as (pointer gs-alpha) a0-36) 0) (new 'static 'gs-alpha :b #x2 :d #x1))
|
|
(set! (-> (the-as (pointer gs-reg64) a0-36) 1) (gs-reg64 alpha-1))
|
|
(set! (-> (the-as (pointer uint64) a0-36) 2) (the-as uint 1))
|
|
(set! (-> (the-as (pointer gs-reg64) a0-36) 3) (gs-reg64 colclamp))
|
|
(set! (-> v1-60 base) (&+ a0-36 32))
|
|
)
|
|
)
|
|
(set-tex-offset (the-as int (-> *vortex-work* off-s-1)) (the-as int (-> *vortex-work* off-t-1)))
|
|
(let ((s3-2 (the-as dma-packet (-> s4-0 base))))
|
|
(&+! (-> s4-0 base) 16)
|
|
(let ((s2-2 *vortex-poly*))
|
|
(dotimes (s1-3 304)
|
|
(render-vortex-quad (-> s2-2 (* s1-3 4)) s4-0 (new 'static 'vector :x 144.0 :y 128.0 :z 255.0 :w 128.0))
|
|
)
|
|
)
|
|
(close-sky-buffer s4-0)
|
|
(let ((v1-72 (/ (+ (- -16 (the-as int s3-2)) (the-as int (-> s4-0 base))) 16)))
|
|
(set! (-> s3-2 dma) (new 'static 'dma-tag :id (dma-tag-id cnt) :qwc v1-72))
|
|
(set! (-> s3-2 vif0) (new 'static 'vif-tag))
|
|
(set! (-> s3-2 vif1) (new 'static 'vif-tag :cmd (vif-cmd direct) :msk #x1 :imm v1-72))
|
|
)
|
|
)
|
|
)
|
|
(let ((v1-83 *dma-mem-usage*))
|
|
(when (nonzero? v1-83)
|
|
(set! (-> v1-83 length) (max 89 (-> v1-83 length)))
|
|
(set! (-> v1-83 data 88 name) "sky")
|
|
(+! (-> v1-83 data 88 count) 1)
|
|
(+! (-> v1-83 data 88 used)
|
|
(&- (-> *display* frames (-> *display* on-screen) global-buf base) (the-as uint gp-0))
|
|
)
|
|
(set! (-> v1-83 data 88 total) (-> v1-83 data 88 used))
|
|
)
|
|
)
|
|
)
|
|
)
|
|
0
|
|
(none)
|
|
)
|
|
)
|