Files
jak-project/goal_src/engine/gfx/shadow/shadow-cpu.gc
T
water111 4a0ac6c155 [graphics] first half of shadow renderer (#1246)
* start on dma stuff

* temp

* temp

* add shadow cpu
2022-03-22 21:42:37 -04:00

623 lines
28 KiB
Common Lisp

;;-*-Lisp-*-
(in-package goal)
;; name: shadow-cpu.gc
;; name in dgo: shadow-cpu
;; dgos: GAME, ENGINE
(defmethod asize-of shadow-geo ((obj shadow-geo))
(the-as int (-> obj total-size))
)
(defmethod mem-usage shadow-geo ((obj shadow-geo) (arg0 memory-usage-block) (arg1 int))
(set! (-> arg0 length) (max 108 (-> arg0 length)))
(set! (-> arg0 data 107 name) "shadow-geo")
(+! (-> arg0 data 107 count) 1)
(let ((v1-5 (-> obj total-size)))
(+! (-> arg0 data 107 used) v1-5)
(+! (-> arg0 data 107 total) (logand -16 (+ v1-5 15)))
)
obj
)
(define *shadow-data* (new 'static 'shadow-data
:texoffset (new 'static 'vector :x 256.5 :y 112.5)
:texscale
(new 'static 'vector :x 0.001953125 :y 0.00390625)
:clrs
(new 'static 'inline-array vector 2
(new 'static 'vector :x (the-as float #x80) :w (the-as float #x82))
(new 'static 'vector :y (the-as float #x80) :w (the-as float #x7f))
)
:dma-unpack-template
(new 'static 'dma-packet
:dma
(new 'static 'dma-tag :id (dma-tag-id cnt))
:vif0
(new 'static 'vif-tag :cmd (vif-cmd flusha) :msk #x1)
:vif1
(new 'static 'vif-tag :cmd (vif-cmd unpack-v4-32))
)
:dma-cnt
(new 'static 'dma-tag :id (dma-tag-id cnt))
:vif-unpack-v4-8
(new 'static 'vif-tag :cmd (vif-cmd unpack-v4-8))
)
)
(defun shadow-dma-init ((arg0 dma-buffer))
(let* ((v1-0 *display*)
(a1-2 (-> v1-0 frames (-> v1-0 on-screen) draw frame1 fbp))
)
(* a1-2 32)
(let ((t3-0 512)
(t2-0 (-> *video-parms* screen-sy))
(a2-0 1792)
(a3-0 (-> *video-parms* screen-miny))
)
2304
(let ((t0-0 (-> *video-parms* screen-maxy))
(t1-0 (/ t3-0 32))
(t5-0 (* a3-0 16))
(v1-11 (-> arg0 base))
)
(let* ((t4-0 arg0)
(t6-0 (the-as object (-> t4-0 base)))
)
(set! (-> (the-as dma-packet t6-0) dma) (new 'static 'dma-tag :id (dma-tag-id cnt)))
(set! (-> (the-as dma-packet t6-0) vif0) (new 'static 'vif-tag))
(set! (-> (the-as dma-packet t6-0) vif1) (new 'static 'vif-tag :cmd (vif-cmd direct) :msk #x1))
(set! (-> t4-0 base) (&+ (the-as pointer t6-0) 16))
)
(let* ((t4-1 arg0)
(t6-2 (the-as object (-> t4-1 base)))
)
(set! (-> (the-as gs-gif-tag t6-2) tag) (new 'static 'gif-tag64 :nloop #xa :eop #x1 :nreg #x1))
(set! (-> (the-as gs-gif-tag t6-2) regs) (new 'static 'gif-tag-regs :regs0 (gif-reg-id a+d)))
(set! (-> t4-1 base) (&+ (the-as pointer t6-2) 16))
)
(let ((t4-2 (-> arg0 base)))
(set! (-> (the-as (pointer gs-reg) t4-2) 8) (gs-reg texflush))
(set! (-> (the-as (pointer gs-reg) t4-2) 24) (gs-reg test-1))
(set! (-> (the-as (pointer gs-test) t4-2) 2)
(new 'static 'gs-test :ate #x1 :atst (gs-atest always) :zte #x1 :ztst (gs-ztest always))
)
(set! (-> (the-as (pointer gs-reg) t4-2) 40) (gs-reg alpha-1))
(set! (-> (the-as (pointer gs-alpha) t4-2) 4) (new 'static 'gs-alpha :b #x1 :d #x1))
(set! (-> (the-as (pointer gs-reg) t4-2) 56) (gs-reg frame-1))
(set! (-> (the-as (pointer gs-frame) t4-2) 6) (new 'static 'gs-frame :fbw #x8 :fbmsk #xffffff :fbp a1-2))
(set! (-> (the-as (pointer gs-reg) t4-2) 72) (gs-reg zbuf-1))
(set! (-> (the-as (pointer gs-zbuf) t4-2) 8) (new 'static 'gs-zbuf :zbp #x1c0 :psm (gs-psm ct24) :zmsk #x1))
(set! (-> (the-as (pointer gs-reg) t4-2) 88) (gs-reg xyoffset-1))
(set! (-> (the-as (pointer gs-xy-offset) t4-2) 10) (new 'static 'gs-xy-offset :ofx (* a2-0 16) :ofy t5-0))
(set! (-> (the-as (pointer gs-reg) t4-2) 104) (gs-reg tex0-1))
(set! (-> (the-as (pointer gs-tex0) t4-2) 12)
(new 'static 'gs-tex0 :tbw #x8 :tw #x9 :th #x8 :tcc #x1 :tbp0 (* a1-2 32))
)
(set! (-> (the-as (pointer gs-reg) t4-2) 120) (gs-reg tex1-1))
(set! (-> (the-as (pointer gs-tex1) t4-2) 14) (new 'static 'gs-tex1))
(set! (-> (the-as (pointer gs-reg) t4-2) 136) (gs-reg miptbp1-1))
(set! (-> (the-as (pointer gs-miptbp) t4-2) 16) (new 'static 'gs-miptbp))
(set! (-> (the-as (pointer gs-reg) t4-2) 152) (gs-reg clamp-1))
(set! (-> (the-as (pointer gs-clamp) t4-2) 18)
(new 'static 'gs-clamp
:wms (gs-tex-wrap-mode region-clamp)
:wmt (gs-tex-wrap-mode region-clamp)
:maxv (+ t2-0 -1)
:maxu (+ t3-0 -1)
)
)
)
(&+! (-> arg0 base) 160)
(let* ((t2-7 arg0)
(t3-5 (the-as object (-> t2-7 base)))
)
(set! (-> (the-as gs-gif-tag t3-5) tag)
(new 'static 'gif-tag64 :nloop #x1 :eop #x1 :flg (gif-flag reg-list) :nreg #x2)
)
(set! (-> (the-as gs-gif-tag t3-5) regs) (new 'static 'gif-tag-regs :regs1 (gif-reg-id rgbaq)))
(set! (-> t2-7 base) (&+ (the-as pointer t3-5) 16))
)
(let* ((t2-8 arg0)
(t3-7 (-> t2-8 base))
)
(set! (-> (the-as (pointer gs-prim) t3-7) 0) (new 'static 'gs-prim :prim (gs-prim-type sprite)))
(set! (-> (the-as (pointer gs-rgbaq) t3-7) 1) (new 'static 'gs-rgbaq :a #x60))
(set! (-> t2-8 base) (&+ t3-7 16))
)
(let* ((t2-9 arg0)
(t3-9 (the-as object (-> t2-9 base)))
)
(set! (-> (the-as gs-gif-tag t3-9) tag)
(new 'static 'gif-tag64 :eop #x1 :flg (gif-flag reg-list) :nreg #x2 :nloop t1-0)
)
(set! (-> (the-as gs-gif-tag t3-9) regs)
(new 'static 'gif-tag-regs :regs0 (gif-reg-id xyz2) :regs1 (gif-reg-id xyz2))
)
(set! (-> t2-9 base) (&+ (the-as pointer t3-9) 16))
)
(let ((t2-10 0))
(dotimes (t3-11 t1-0)
(let* ((t4-10 arg0)
(t5-12 (-> t4-10 base))
)
(set! (-> (the-as (pointer gs-xyzf) t5-12) 0)
(new 'static 'gs-xyzf :z #x1ffff :y (* a3-0 16) :x (* (+ a2-0 t2-10) 16))
)
(set! (-> (the-as (pointer gs-xyzf) t5-12) 1)
(new 'static 'gs-xyzf :z #x1ffff :y (* t0-0 16) :x (* (+ t2-10 32 a2-0) 16))
)
(set! (-> t4-10 base) (&+ t5-12 16))
)
(+! t2-10 32)
)
)
(let* ((a2-3 arg0)
(a3-1 (the-as object (-> a2-3 base)))
)
(set! (-> (the-as gs-gif-tag a3-1) tag) (new 'static 'gif-tag64 :nloop #x4 :eop #x1 :nreg #x1))
(set! (-> (the-as gs-gif-tag a3-1) regs) (new 'static 'gif-tag-regs :regs0 (gif-reg-id a+d)))
(set! (-> a2-3 base) (&+ (the-as pointer a3-1) 16))
)
(cond
(*shadow-debug*
(let* ((a2-5 arg0)
(a3-3 (-> a2-5 base))
)
(set! (-> (the-as (pointer gs-test) a3-3) 0)
(new 'static 'gs-test :ate #x1 :atst (gs-atest always) :zte #x1 :ztst (gs-ztest greater-equal))
)
(set! (-> (the-as (pointer gs-reg64) a3-3) 1) (gs-reg64 test-1))
(set! (-> (the-as (pointer gs-zbuf) a3-3) 2) (new 'static 'gs-zbuf :zbp #x1c0 :psm (gs-psm ct24)))
(set! (-> (the-as (pointer gs-reg64) a3-3) 3) (gs-reg64 zbuf-1))
(set! (-> (the-as (pointer gs-frame) a3-3) 4) (new 'static 'gs-frame :fbw #x8 :fbp a1-2))
(set! (-> (the-as (pointer gs-reg64) a3-3) 5) (gs-reg64 frame-1))
(set! (-> (the-as (pointer uint64) a3-3) 6) (the-as uint 0))
(set! (-> (the-as (pointer gs-reg64) a3-3) 7) (gs-reg64 texflush))
(set! (-> a2-5 base) (&+ a3-3 64))
)
)
(else
(let* ((a2-6 arg0)
(a3-4 (-> a2-6 base))
)
(set! (-> (the-as (pointer gs-test) a3-4) 0)
(new 'static 'gs-test :ate #x1 :atst (gs-atest always) :zte #x1 :ztst (gs-ztest greater-equal))
)
(set! (-> (the-as (pointer gs-reg64) a3-4) 1) (gs-reg64 test-1))
(set! (-> (the-as (pointer gs-zbuf) a3-4) 2) (new 'static 'gs-zbuf :zbp #x1c0 :psm (gs-psm ct24) :zmsk #x1))
(set! (-> (the-as (pointer gs-reg64) a3-4) 3) (gs-reg64 zbuf-1))
(set! (-> (the-as (pointer gs-frame) a3-4) 4) (new 'static 'gs-frame :fbw #x8 :fbmsk #xffffff :fbp a1-2))
(set! (-> (the-as (pointer gs-reg64) a3-4) 5) (gs-reg64 frame-1))
(set! (-> (the-as (pointer uint64) a3-4) 6) (the-as uint 0))
(set! (-> (the-as (pointer gs-reg64) a3-4) 7) (gs-reg64 texflush))
(set! (-> a2-6 base) (&+ a3-4 64))
)
)
)
(let ((a2-10 (/ (the-as int (+ (- -16 (the-as int v1-11)) (the-as int (-> arg0 base)))) 16)))
(cond
((nonzero? a2-10)
(logior! (-> (the-as (pointer uint64) v1-11) 0) (shr (shl a2-10 48) 48))
(logior! (-> (the-as (pointer uint64) v1-11) 1) (shl (shr (shl a2-10 48) 48) 32))
)
(else
(set! (-> arg0 base) v1-11)
)
)
)
)
)
)
(none)
)
(defun shadow-dma-end ((arg0 dma-buffer))
(local-vars (t9-2 int) (ra-0 int) (ra-1 int) (ra-2 int))
(let* ((v1-0 *display*)
(v1-5 (-> v1-0 frames (-> v1-0 on-screen) draw frame1 fbp))
)
(* v1-5 32)
(let ((a2-0 512)
(a3-0 (-> *video-parms* screen-sy))
(a1-5 1792)
(t0-1 (-> *video-parms* screen-miny))
)
2304
(-> *video-parms* screen-maxy)
(let ((t1-3 (/ a2-0 32))
(a2-3 (+ (* *oddeven* 8) (* t0-1 16)))
)
(let* ((t2-1 arg0)
(t3-0 (the-as object (-> t2-1 base)))
)
(set! (-> (the-as dma-packet t3-0) dma) (new 'static 'dma-tag :qwc #x5 :id (dma-tag-id cnt)))
(set! (-> (the-as dma-packet t3-0) vif0) (new 'static 'vif-tag :cmd (vif-cmd flusha) :msk #x1))
(set! (-> (the-as dma-packet t3-0) vif1) (new 'static 'vif-tag :imm #x5 :cmd (vif-cmd direct) :msk #x1))
(set! (-> t2-1 base) (&+ (the-as pointer t3-0) 16))
)
(let* ((t2-2 arg0)
(t3-2 (the-as object (-> t2-2 base)))
)
(set! (-> (the-as gs-gif-tag t3-2) tag) (new 'static 'gif-tag64 :nloop #x1 :eop #x1 :nreg #x4))
(set! (-> (the-as gs-gif-tag t3-2) regs)
(new 'static 'gif-tag-regs
:regs0 (gif-reg-id a+d)
:regs1 (gif-reg-id a+d)
:regs2 (gif-reg-id a+d)
:regs3 (gif-reg-id a+d)
:regs4 (gif-reg-id a+d)
:regs5 (gif-reg-id a+d)
:regs6 (gif-reg-id a+d)
:regs7 (gif-reg-id a+d)
:regs8 (gif-reg-id a+d)
:regs9 (gif-reg-id a+d)
:regs10 (gif-reg-id a+d)
:regs11 (gif-reg-id a+d)
:regs12 (gif-reg-id a+d)
:regs13 (gif-reg-id a+d)
:regs14 (gif-reg-id a+d)
:regs15 (gif-reg-id a+d)
)
)
(set! (-> t2-2 base) (&+ (the-as pointer t3-2) 16))
)
(let* ((t2-3 arg0)
(t3-4 (-> t2-3 base))
)
(set! (-> (the-as (pointer uint64) t3-4) 0) (the-as uint 0))
(set! (-> (the-as (pointer gs-reg64) t3-4) 1) (gs-reg64 texflush))
(set! (-> (the-as (pointer gs-test) t3-4) 2)
(new 'static 'gs-test :ate #x1 :atst (gs-atest not-equal) :aref #x60 :zte #x1 :ztst (gs-ztest always))
)
(set! (-> (the-as (pointer gs-reg64) t3-4) 3) (gs-reg64 test-1))
(set! (-> (the-as (pointer gs-frame) t3-4) 4) (new 'static 'gs-frame :fbw #x8 :fbp v1-5))
(set! (-> (the-as (pointer gs-reg64) t3-4) 5) (gs-reg64 frame-1))
(set! (-> (the-as (pointer uint64) t3-4) 6) (the-as uint 0))
(set! (-> (the-as (pointer gs-reg64) t3-4) 7) (gs-reg64 texflush))
(set! (-> t2-3 base) (&+ t3-4 64))
)
(let ((t2-4 (-> arg0 base)))
(let* ((t3-6 arg0)
(t4-13 (the-as object (-> t3-6 base)))
)
(set! (-> (the-as dma-packet t4-13) dma) (new 'static 'dma-tag :id (dma-tag-id cnt)))
(set! (-> (the-as dma-packet t4-13) vif0) (new 'static 'vif-tag :cmd (vif-cmd flusha) :msk #x1))
(set! (-> (the-as dma-packet t4-13) vif1) (new 'static 'vif-tag :cmd (vif-cmd direct) :msk #x1))
(set! (-> t3-6 base) (&+ (the-as pointer t4-13) 16))
)
(let* ((t4-15 (the-as uint #x3f80000080404040))
(t3-8 (-> *time-of-day-context* current-shadow-color))
(t5-14
(the-as
gs-rgbaq
(logior (logand (logior (logand (logior (logand t4-15 -256) (shr (shl (the int (* 128.0 (-> t3-8 x))) 56) 56)) -65281)
(shr (shl (the int (* 128.0 (-> t3-8 y))) 56) 48)
)
-16711681
)
(shr (shl (the int (* 128.0 (-> t3-8 z))) 56) 40)
)
)
)
(t3-12 arg0)
(t4-21 (the-as object (-> t3-12 base)))
)
(set! (-> (the-as gs-gif-tag t4-21) tag)
(new 'static 'gif-tag64 :nloop #x1 :flg (gif-flag reg-list) :nreg #x2)
)
(set! (-> (the-as gs-gif-tag t4-21) regs) (new 'static 'gif-tag-regs :regs1 (gif-reg-id rgbaq)))
(set! (-> (the-as (pointer gs-prim) t4-21) 2)
(new 'static 'gs-prim :prim (gs-prim-type sprite) :tme #x1 :abe #x1)
)
(set! (-> (the-as (pointer gs-rgbaq) t4-21) 3) t5-14)
(set! (-> (the-as (inline-array gs-gif-tag) t4-21) 2 tag)
(new 'static 'gif-tag64 :eop #x1 :flg (gif-flag reg-list) :nreg #x4 :nloop t1-3)
)
(set! (-> (the-as (inline-array gs-gif-tag) t4-21) 2 regs)
(new 'static 'gif-tag-regs
:regs0 (gif-reg-id st)
:regs1 (gif-reg-id xyz2)
:regs2 (gif-reg-id st)
:regs3 (gif-reg-id xyz2)
)
)
(set! (-> t3-12 base) (&+ (the-as pointer t4-21) 48))
)
(let ((t3-13 0)
(t4-23 0)
)
(dotimes (t5-18 t1-3)
(let ((t8-0 t3-13))
(+! t3-13 32)
(let* ((t6-5 arg0)
(t7-0 (-> t6-5 base))
)
(let ((t9-1 (shl (the-as int (* 0.00390625 (+ 0.5 (the float (the-as int t4-23))))) 32)))
(let ((f0-12 (* 0.001953125 (+ 0.5 (the float t8-0)))))
(.mov ra-0 f0-12)
)
;;(.dsll32 ra-1 ra-0 0)
(set! ra-1 (shl ra-0 32))
;;(.dsrl32 ra-2 ra-1 0)
(set! ra-2 (shr ra-1 32))
;(.or t9-2 t9-1 ra-2)
(set! t9-2 (logior t9-1 ra-2))
)
(set! (-> (the-as (pointer int64) t7-0)) t9-2)
(set! (-> (the-as (pointer gs-xyzf) t7-0) 1)
(new 'static 'gs-xyzf :z #x1ffff :y (* (+ t0-1 t4-23) 16) :x (* (+ a1-5 t8-0) 16))
)
(set! (-> (the-as (pointer gs-st) t7-0) 2)
(new 'static 'gs-st
:s (* 0.001953125 (+ 0.5 (the float t3-13)))
:t (* 0.00390625 (+ 0.5 (the float a3-0)))
)
)
(set! (-> (the-as (pointer gs-xyzf) t7-0) 3)
(new 'static 'gs-xyzf :z #x1ffff :y (* (+ t0-1 a3-0) 16) :x (* (+ a1-5 t3-13) 16))
)
(set! (-> t6-5 base) (&+ t7-0 32))
)
)
)
)
(let ((t0-5 (/ (the-as int (+ (- -16 (the-as int t2-4)) (the-as int (-> arg0 base)))) 16)))
(cond
((nonzero? t0-5)
(logior! (-> (the-as (pointer uint64) t2-4)) (shr (shl t0-5 48) 48))
(logior! (-> (the-as (pointer uint64) t2-4) 1) (shl (shr (shl t0-5 48) 48) 32))
)
(else
(set! (-> arg0 base) t2-4)
)
)
)
)
(let* ((a3-3 arg0)
(t0-11 (the-as object (-> a3-3 base)))
)
(set! (-> (the-as dma-packet t0-11) dma) (new 'static 'dma-tag :qwc #x7 :id (dma-tag-id cnt)))
(set! (-> (the-as dma-packet t0-11) vif0) (new 'static 'vif-tag))
(set! (-> (the-as dma-packet t0-11) vif1) (new 'static 'vif-tag :imm #x7 :cmd (vif-cmd direct) :msk #x1))
(set! (-> a3-3 base) (&+ (the-as pointer t0-11) 16))
)
(let* ((a3-4 arg0)
(t0-13 (the-as object (-> a3-4 base)))
)
(set! (-> (the-as gs-gif-tag t0-13) tag) (new 'static 'gif-tag64 :nloop #x1 :eop #x1 :nreg #x6))
(set! (-> (the-as gs-gif-tag t0-13) regs) (new 'static 'gif-tag-regs
:regs0 (gif-reg-id a+d)
:regs1 (gif-reg-id a+d)
:regs2 (gif-reg-id a+d)
:regs3 (gif-reg-id a+d)
:regs4 (gif-reg-id a+d)
:regs5 (gif-reg-id a+d)
:regs6 (gif-reg-id a+d)
:regs7 (gif-reg-id a+d)
:regs8 (gif-reg-id a+d)
:regs9 (gif-reg-id a+d)
:regs10 (gif-reg-id a+d)
:regs11 (gif-reg-id a+d)
:regs12 (gif-reg-id a+d)
:regs13 (gif-reg-id a+d)
:regs14 (gif-reg-id a+d)
:regs15 (gif-reg-id a+d)
)
)
(set! (-> a3-4 base) (&+ (the-as pointer t0-13) 16))
)
(let* ((a3-5 arg0)
(t0-15 (-> a3-5 base))
)
(set! (-> (the-as (pointer gs-test) t0-15) 0)
(new 'static 'gs-test :atst (gs-atest not-equal) :zte #x1 :ztst (gs-ztest greater-equal))
)
(set! (-> (the-as (pointer gs-reg64) t0-15) 1) (gs-reg64 test-1))
(set! (-> (the-as (pointer gs-xy-offset) t0-15) 2) (new 'static 'gs-xy-offset :ofx (* a1-5 16) :ofy a2-3))
(set! (-> (the-as (pointer gs-reg64) t0-15) 3) (gs-reg64 xyoffset-1))
(set! (-> (the-as (pointer gs-alpha) t0-15) 4) (new 'static 'gs-alpha :b #x1 :d #x1))
(set! (-> (the-as (pointer gs-reg64) t0-15) 5) (gs-reg64 alpha-1))
(set! (-> (the-as (pointer gs-frame) t0-15) 6) (new 'static 'gs-frame :fbw #x8 :fbp v1-5))
(set! (-> (the-as (pointer gs-reg64) t0-15) 7) (gs-reg64 frame-1))
(set! (-> (the-as (pointer gs-zbuf) t0-15) 8) (new 'static 'gs-zbuf :zbp #x1c0 :psm (gs-psm ct24)))
(set! (-> (the-as (pointer gs-reg64) t0-15) 9) (gs-reg64 zbuf-1))
(set! (-> (the-as (pointer uint64) t0-15) 10) (the-as uint 0))
(set! (-> (the-as (pointer gs-reg64) t0-15) 11) (gs-reg64 texflush))
(set! (-> a3-5 base) (&+ t0-15 96))
)
)
)
)
(none)
)
(deftype shadow-stats (structure)
((num-single-tris uint32 :offset-assert 0)
(num-double-tris uint32 :offset-assert 4)
(num-single-edges uint32 :offset-assert 8)
(num-double-edges uint32 :offset-assert 12)
)
:method-count-assert 9
:size-assert #x10
:flag-assert #x900000010
)
(deftype shadow-dcache (structure)
((vtx-table uint32 :offset-assert 0)
(single-edge-table uint32 :offset-assert 4)
(double-edge-table uint32 :offset-assert 8)
(double-tri-table uint32 :offset-assert 12)
(dcache-top uint32 :offset-assert 16)
(num-facing-single-tris uint32 :offset-assert 20)
(num-single-edges uint32 :offset-assert 24)
(num-double-edges uint32 :offset-assert 28)
(single-tri-list uint32 :offset-assert 32)
(single-edge-list uint32 :offset-assert 36)
(double-edge-list uint32 :offset-assert 40)
(ptr-dual-verts uint32 :offset-assert 44)
(stats shadow-stats :inline :offset-assert 48)
(center vector :inline :offset-assert 64)
(plane vector :inline :offset-assert 80)
(top-plane vector :inline :offset-assert 96)
(near-plane vector :inline :offset-assert 112)
(light-dir vector :inline :offset-assert 128)
(vtx-min vector :inline :offset-assert 144)
(data uint8 :dynamic :offset-assert 160)
)
:method-count-assert 9
:size-assert #xa0
:flag-assert #x9000000a0
)
(define shadow-vu0-block (new 'static 'vu-function #|:length 88 :qlength 44|#))
(def-mips2c shadow-xform-verts function)
(def-mips2c shadow-execute (function shadow-dma-packet pointer pointer))
(defun shadow-vu0-upload ()
(#unless PC_PORT
(let ((gp-0 *vu0-dma-list*))
(let ((v1-0 gp-0))
(set! (-> v1-0 base) (-> v1-0 data))
(set! (-> v1-0 end) (&-> v1-0 data-buffer (-> v1-0 allocated-length)))
)
(dma-buffer-add-vu-function gp-0 shadow-vu0-block 0)
(let* ((v1-1 gp-0)
(a0-5 (-> v1-1 base))
)
(set! (-> (the-as (pointer int64) a0-5)) #x70000000)
(s.d! (+ a0-5 8) 0)
(set! (-> v1-1 base) (&+ a0-5 16))
)
(.sync.l)
(dma-buffer-send-chain (the-as dma-bank-source #x10008000) gp-0)
)
)
0
(none)
)
(defun shadow-execute-all ((arg0 dma-buffer) (arg1 shadow-queue))
(if *debug-segment*
(add-frame
(-> *display* frames (-> *display* on-screen) frame profile-bar 0)
'draw
(new 'static 'rgba :r #x40 :b #x40 :a #x80)
)
)
(when (logtest? (vu1-renderer-mask shadow) *vu1-enable-user*)
(when (> (-> arg1 cur-run) 0)
(let ((v1-12 #f))
(dotimes (a0-6 (the-as int (-> arg1 cur-run)))
(if (nonzero? (-> arg1 run a0-6 first))
(set! v1-12 #t)
)
)
(when v1-12
(shadow-vu0-upload)
(let* ((s4-0 (-> *display* frames (-> *display* on-screen) frame global-buf))
(s5-0 (-> s4-0 base))
)
(shadow-vu1-init-buffer s4-0)
(flush-cache 0)
(let ((v1-17 (the-as shadow-dcache *gsf-buffer*)))
(set! (-> v1-17 stats num-single-tris) (the-as uint 0))
(set! (-> v1-17 stats num-double-tris) (the-as uint 0))
(set! (-> v1-17 stats num-single-edges) (the-as uint 0))
(set! (-> v1-17 stats num-double-edges) (the-as uint 0))
)
0
(shadow-dma-init s4-0)
(dotimes (s3-0 (the-as int (-> arg1 cur-run)))
(let ((v1-21 (-> arg1 run s3-0)))
(if (nonzero? (-> v1-21 first))
(set! (-> s4-0 base) (shadow-execute (the-as shadow-dma-packet (-> v1-21 first)) (-> s4-0 base)))
)
)
)
(shadow-dma-end s4-0)
(let ((a3-0 (-> s4-0 base)))
(let ((v1-25 (the-as object (-> s4-0 base))))
(set! (-> (the-as dma-packet v1-25) dma) (new 'static 'dma-tag :id (dma-tag-id next)))
(set! (-> (the-as dma-packet v1-25) vif0) (new 'static 'vif-tag))
(set! (-> (the-as dma-packet v1-25) vif1) (new 'static 'vif-tag))
(set! (-> s4-0 base) (&+ (the-as pointer v1-25) 16))
)
(dma-bucket-insert-tag
(-> *display* frames (-> *display* on-screen) frame bucket-group)
(bucket-id shadow)
s5-0
(the-as (pointer dma-tag) a3-0)
)
)
)
)
)
(when #f
(let ((gp-1 (the-as structure *gsf-buffer*)))
(format *stdcon* "#single tris : ~4d~%" (-> (the-as shadow-dcache gp-1) stats num-single-tris))
(format *stdcon* "#double tris : ~4d~%" (-> (the-as shadow-dcache gp-1) stats num-double-tris))
(format *stdcon* "#single edges: ~4d~%" (-> (the-as shadow-dcache gp-1) stats num-single-edges))
(format *stdcon* "#double edges: ~4d~%" (-> (the-as shadow-dcache gp-1) stats num-double-edges))
)
)
)
)
(if *debug-segment*
(add-frame
(-> *display* frames (-> *display* on-screen) frame profile-bar 0)
'draw
(new 'static 'rgba :r #x40 :g #x42 :b #xe0 :a #x80)
)
)
0
(none)
)
(defmethod update-direction-from-time-of-day shadow-control ((obj shadow-control))
(let ((v1-1 (-> *time-of-day-context* current-shadow)))
(set! (-> obj settings shadow-dir x) (-> v1-1 x))
(set! (-> obj settings shadow-dir y) (-> v1-1 y))
(set! (-> obj settings shadow-dir z) (-> v1-1 z))
)
0
(none)
)
(defmethod collide-to-find-planes shadow-control ((obj shadow-control) (arg0 vector) (arg1 float) (arg2 float) (arg3 float))
(with-pp
(let ((s4-0 (new 'stack-no-clear 'collide-tri-result))
(v1-0 (new 'stack-no-clear 'vector))
(a2-1 (new 'stack-no-clear 'vector))
)
(set! (-> v1-0 quad) (-> arg0 quad))
(set! (-> v1-0 y) (+ 4096.0 (-> v1-0 y)))
(set-vector! a2-1 0.0 (- arg3) 0.0 1.0)
(cond
((>= (fill-and-probe-using-line-sphere *collide-cache* v1-0 a2-1 8192.0 (collide-kind background) pp s4-0 1)
0.0
)
(let ((v1-2 obj))
(set! (-> v1-2 settings flags) (logand -33 (-> v1-2 settings flags)))
)
0
(let ((v1-4 obj))
(set! (-> v1-4 settings bot-plane w) (- (+ (-> s4-0 intersect y) arg1)))
)
0
(set! (-> obj settings top-plane w) (- (+ (-> s4-0 intersect y) arg2)))
0
)
(else
(let ((v1-7 obj))
(logior! (-> v1-7 settings flags) 32)
)
0
)
)
)
0
(none)
)
)