ManDude 2024-05-23 19:29:42 +02:00 committed by GitHub
parent 0db7be55e6
commit dd765b41cb
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
12 changed files with 4095 additions and 56 deletions

View file

@ -30849,7 +30849,6 @@
;; shadow-cpu ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
#|
(deftype shadow-stats (structure)
((num-single-tris uint32 :offset-assert 0)
(num-double-tris uint32 :offset-assert 4)
@ -30862,9 +30861,7 @@
:size-assert #x14
:flag-assert #x900000014
)
|#
#|
(deftype shadow-dcache (structure)
((vtx-table uint32 :offset-assert 0)
(single-edge-table uint32 :offset-assert 4)
@ -30892,40 +30889,38 @@
:size-assert #xb0
:flag-assert #x9000000b0
)
|#
;; (define-extern *shadow-data* object) ;; shadow-data
;; (define-extern shadow-invert-z-buf function) ;; (function dma-buffer none)
;; (define-extern shadow-make-invert-buf function) ;; (function none)
;; (define-extern *shadow-dma-invert-call* object) ;; pointer
;; (define-extern shadow-dma-init function) ;; (function dma-buffer none)
;; (define-extern shadow-dma-end function) ;; (function dma-buffer gs-rgbaq symbol int none)
;; (define-extern shadow-vu0-block object) ;; vu-function
;; (define-extern shadow-xform-verts function) ;; function
;; (define-extern shadow-calc-dual-verts function) ;; function
;; (define-extern shadow-scissor-edges function) ;; function
;; (define-extern shadow-scissor-top function) ;; function
;; (define-extern shadow-init-vars function) ;; function
;; (define-extern shadow-find-facing-single-tris function) ;; function
;; (define-extern shadow-find-single-edges function) ;; function
;; (define-extern shadow-find-facing-double-tris function) ;; function
;; (define-extern shadow-find-double-edges function) ;; function
;; (define-extern shadow-add-verts function) ;; function
;; (define-extern shadow-add-facing-single-tris function) ;; function
;; (define-extern shadow-add-single-edges function) ;; function
;; (define-extern shadow-add-single-tris function) ;; function
;; (define-extern shadow-add-double-tris function) ;; function
;; (define-extern shadow-add-double-edges function) ;; function
;; (define-extern debug-draw-settings function) ;; (function shadow-settings symbol)
;; (define-extern shadow-execute function) ;; (function shadow-dma-packet pointer pointer)
;; (define-extern shadow-vu0-upload function) ;; (function none)
(define-extern *shadow-data* shadow-data)
(define-extern shadow-invert-z-buf (function dma-buffer none))
(define-extern shadow-make-invert-buf (function none))
(define-extern *shadow-dma-invert-call* pointer)
(define-extern shadow-dma-init (function dma-buffer none))
(define-extern shadow-dma-end (function dma-buffer gs-rgbaq symbol int none))
(define-extern shadow-vu0-block vu-function)
(define-extern shadow-xform-verts function)
(define-extern shadow-calc-dual-verts function)
(define-extern shadow-scissor-edges function)
(define-extern shadow-scissor-top function)
(define-extern shadow-init-vars function)
(define-extern shadow-find-facing-single-tris function)
(define-extern shadow-find-single-edges function)
(define-extern shadow-find-facing-double-tris function)
(define-extern shadow-find-double-edges function)
(define-extern shadow-add-verts function)
(define-extern shadow-add-facing-single-tris function)
(define-extern shadow-add-single-edges function)
(define-extern shadow-add-single-tris function)
(define-extern shadow-add-double-tris function)
(define-extern shadow-add-double-edges function)
(define-extern debug-draw-settings (function shadow-settings symbol))
(define-extern shadow-execute (function shadow-dma-packet pointer pointer))
(define-extern shadow-vu0-upload (function none))
(define-extern shadow-execute-all (function dma-buffer none))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; shadow-vu1 ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
#|
(deftype shadow-vu1-constants (structure)
((hmgescale vector :inline :offset-assert 0)
(invhscale vector :inline :offset-assert 16)
@ -30933,7 +30928,7 @@
(texscale vector :inline :offset-assert 48)
(hvdfoff vector :inline :offset-assert 64)
(fog vector :inline :offset-assert 80)
(clrs vector 2 :offset-assert 96) ;; guessed by decompiler
(clrs vector 2 :inline :offset-assert 96) ;; guessed by decompiler
(adgif gs-gif-tag :inline :offset-assert 128)
(texflush gs-adcmd :inline :offset-assert 144)
(flush gs-adcmd :inline :offset-assert 160)
@ -30944,9 +30939,7 @@
:size-assert #xd0
:flag-assert #x9000000d0
)
|#
#|
(deftype shadow-vu1-data (structure)
((adgif gs-gif-tag :inline :offset-assert 0)
(ad gs-adcmd :inline :offset-assert 16)
@ -30955,20 +30948,19 @@
(quadgif gs-gif-tag :inline :offset-assert 64)
(texoffset vector :inline :offset-assert 80)
(texscale vector :inline :offset-assert 96)
(clrs qword 2 :offset-assert 112) ;; guessed by decompiler
(clrs qword 2 :inline :offset-assert 112) ;; guessed by decompiler
)
:method-count-assert 9
:size-assert #x90
:flag-assert #x900000090
)
|#
;; (define-extern *shadow-vu1-data* object) ;; shadow-vu1-data
;; (define-extern shadow-vu1-block object) ;; vu-function
;; (define-extern shadow-vu1-add-constants function) ;; (function dma-buffer int none)
;; (define-extern shadow-vu1-patch-consts function) ;; (function symbol int none)
;; (define-extern shadow-vu1-add-matrix function) ;; (function dma-buffer math-camera none)
;; (define-extern shadow-vu1-init-buffer function) ;; (function dma-buffer int none)
(define-extern *shadow-vu1-data* shadow-vu1-data)
(define-extern shadow-vu1-block vu-function)
(define-extern shadow-vu1-add-constants (function dma-buffer int none))
(define-extern shadow-vu1-patch-consts (function symbol int none))
(define-extern shadow-vu1-add-matrix (function dma-buffer math-camera none))
(define-extern shadow-vu1-init-buffer (function dma-buffer int none))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; warp ;;

View file

@ -78,10 +78,6 @@
"blerc-execute",
"foreground-check-longest-edge-asm",
"generic-light-proc",
"shadow-add-single-edges",
"shadow-add-facing-single-tris",
"shadow-add-double-tris",
"shadow-add-double-edges",
"(method 17 collide-edge-work)",
"(method 10 collide-cache-prim)",
"(method 17 collide-cache)",
@ -715,7 +711,23 @@
"live-func-curve",
"birth-func-curve",
"sparticle-motion-blur-dirt",
"foreground-draw-hud"
"foreground-draw-hud",
"shadow-execute",
"shadow-add-double-edges",
"shadow-add-single-edges",
"shadow-add-facing-single-tris",
"shadow-add-double-tris",
"shadow-xform-verts",
"shadow-calc-dual-verts",
"shadow-scissor-edges",
"shadow-scissor-top",
"shadow-init-vars",
"shadow-find-facing-single-tris",
"shadow-find-single-edges",
"shadow-find-facing-double-tris",
"shadow-find-double-edges",
"shadow-add-verts",
"shadow-add-single-tris"
],
"mips2c_jump_table_functions": {},

View file

@ -11138,6 +11138,132 @@
[11, "v1", "symbol"],
["_stack_", 16, "texture-page"]
],
"shadow-vu1-init-buffer": [[[18, 27], "a0", "dma-packet"]],
"shadow-vu1-add-constants": [
[[7, 16], "a2", "dma-packet"],
[[20, 66], "v1", "shadow-vu1-constants"],
[[72, 77], "a1", "dma-packet"],
[[82, 94], "a1", "shadow-vu1-data"]
],
"shadow-vu1-add-matrix": [
[[11, 19], "a3", "dma-packet"],
[[26, 30], "v1", "matrix"]
],
"shadow-vu0-upload": [[[16, 18], "a0", "dma-packet"]],
"shadow-make-invert-buf": [[[13, 16], "v1", "dma-packet"]],
"shadow-invert-z-buf": [
[[4, 8], "a2", "dma-packet"],
[[13, 16], "a2", "gs-gif-tag"],
[27, "t1", "(pointer gs-reg)"],
[28, "t1", "(pointer gs-reg64)"],
[30, "t1", "(pointer gs-reg)"],
[32, "t1", "(pointer gs-frame)"],
[34, "t1", "(pointer gs-reg)"],
[38, "t1", "(pointer gs-reg)"],
[42, "t1", "(pointer gs-reg)"],
[36, "t1", "(pointer gs-zbuf)"],
[40, "t1", "(pointer gs-test)"],
[44, "t1", "(pointer gs-alpha)"],
[45, "t1", "(pointer gs-reg)"],
[47, "t1", "(pointer gs-reg64)"],
[49, "t1", "(pointer gs-reg)"],
[51, "t1", "(pointer gs-rgbaq)"],
[[61, 64], "t2", "gs-gif-tag"],
[89, "t4", "(pointer gs-xyzf)"],
[79, "t4", "(pointer gs-xyzf)"],
[[106, 117], "v1", "(pointer uint64)"]
],
"shadow-dma-init": [
[[18, 21], "t4", "dma-packet"],
[[27, 31], "t6", "dma-packet"],
[[36, 39], "t6", "gs-gif-tag"],
[43, "t4", "(pointer gs-reg64)"],
[47, "t4", "(pointer gs-test)"],
[45, "t4", "(pointer gs-reg64)"],
[49, "t4", "(pointer gs-reg64)"],
[51, "t4", "(pointer gs-alpha)"],
[53, "t4", "(pointer gs-reg64)"],
[58, "t4", "(pointer gs-frame)"],
[60, "t4", "(pointer gs-reg64)"],
[64, "t4", "(pointer gs-reg64)"],
[73, "t4", "(pointer gs-reg64)"],
[81, "t4", "(pointer gs-reg)"],
[84, "t4", "(pointer gs-reg)"],
[62, "t4", "(pointer gs-zbuf)"],
[71, "t4", "(pointer gs-xy-offset)"],
[79, "t4", "(pointer gs-tex0)"],
[82, "t4", "(pointer gs-tex1)"],
[85, "t4", "(pointer gs-miptbp)"],
[87, "t4", "(pointer gs-reg)"],
[96, "t4", "(pointer gs-clamp)"],
[[103, 106], "t3", "gs-gif-tag"],
[[122, 125], "t3", "gs-gif-tag"],
[111, "t3", "(pointer gs-prim)"],
[113, "t3", "(pointer gs-rgbaq)"],
[143, "t5", "(pointer gs-xyzf)"],
[156, "t5", "(pointer gs-xyzf)"],
[[167, 170], "a3", "gs-gif-tag"],
[177, "a3", "(pointer gs-test)"],
[179, "a3", "(pointer gs-reg64)"],
[183, "a3", "(pointer gs-reg64)"],
[193, "a3", "(pointer gs-reg64)"],
[190, "a3", "(pointer gs-reg64)"],
[202, "a3", "(pointer gs-reg64)"],
[181, "a3", "(pointer gs-zbuf)"],
[188, "a3", "(pointer gs-frame)"],
[191, "a3", "(pointer uint64)"],
[206, "a3", "(pointer gs-reg64)"],
[213, "a3", "(pointer gs-reg64)"],
[214, "a3", "(pointer uint64)"],
[216, "a3", "(pointer gs-reg64)"],
[211, "a3", "(pointer gs-frame)"],
[204, "a3", "(pointer gs-zbuf)"],
[200, "a3", "(pointer gs-test)"],
[229, "v1", "(pointer uint64)"],
[225, "v1", "(pointer uint64)"],
[230, "v1", "(pointer uint64)"],
[235, "v1", "(pointer uint64)"]
],
"shadow-dma-end": [
[34, "a1", "dma-packet"],
[33, "a1", "dma-packet"],
[36, "a1", "dma-packet"],
[25, "v1", "(pointer uint64)"],
[41, "v1", "dma-packet"],
[42, "v1", "(pointer uint64)"],
[[113, 116], "a0", "gs-gif-tag"],
[[102, 107], "a0", "dma-packet"],
[120, "a0", "(pointer uint64)"],
[122, "a0", "(pointer gs-reg64)"],
[126, "a0", "(pointer gs-reg64)"],
[133, "a0", "(pointer gs-reg64)"],
[134, "a0", "(pointer uint64)"],
[136, "a0", "(pointer gs-reg64)"],
[137, "a0", "(pointer uint64)"],
[139, "a0", "(pointer gs-reg64)"],
[124, "a0", "(pointer gs-test)"],
[131, "a0", "(pointer gs-frame)"],
[[146, 151], "a1", "dma-packet"],
[201, "t0", "(pointer uint64)"],
[214, "t0", "(pointer uint64)"],
[237, "t0", "(pointer uint64)"],
[250, "t0", "(pointer uint64)"],
[[156, 159], "a1", "gs-gif-tag"],
[160, "a1", "(pointer gs-prim)"],
[161, "a1", "(pointer gs-rgbaq)"],
[[166, 169], "a1", "(inline-array gs-gif-tag)"],
[268, "v1", "(pointer uint64)"],
[264, "v1", "(pointer uint64)"],
[269, "v1", "(pointer uint64)"],
[274, "v1", "(pointer uint64)"]
],
"shadow-execute-all": [
[[56, 63], "v1", "shadow-dcache"],
[114, "v1", "shadow-dcache"],
[119, "a0", "uint32"],
[[191, 249], "gp", "shadow-dcache"],
[96, "v1", "shadow-dcache"]
],
"real-fog-texture-anim-func": [
[[6, 160], "s2", "(pointer uint32)"]
]

View file

@ -213,6 +213,7 @@ set(RUNTIME_SOURCE
mips2c/jak3_functions/merc_blend_shape.cpp
mips2c/jak3_functions/wvehicle_part.cpp
mips2c/jak3_functions/ripple.cpp
mips2c/jak3_functions/shadow.cpp
mips2c/jak3_functions/ocean.cpp
mips2c/jak3_functions/ocean_vu0.cpp
mips2c/jak3_functions/generic_merc.cpp

View file

@ -239,6 +239,10 @@ void OpenGLRenderer::init_bucket_renderers_jak3() {
BucketId::TEX_LCOM_SHRUB, m_texture_animator);
init_bucket_renderer<Merc2BucketRenderer>("merc-lcom-shrub", BucketCategory::MERC,
BucketId::MERC_LCOM_SHRUB, m_merc2);
// 350
init_bucket_renderer<Shadow2>("shadow", BucketCategory::OTHER, BucketId::SHADOW);
// 351
for (int i = 0; i < LEVEL_MAX; i++) {
#define GET_BUCKET_ID_FOR_LIST(bkt1, bkt2, idx) ((int)(bkt1) + ((int)(bkt2) - (int)(bkt1)) * (idx))
@ -317,6 +321,9 @@ void OpenGLRenderer::init_bucket_renderers_jak3() {
init_bucket_renderer<Generic2BucketRenderer>("generic-sprite-3", BucketCategory::OTHER,
BucketId::GENERIC_SPRITE_3, m_generic2,
Generic2::Mode::LIGHTNING);
init_bucket_renderer<Shadow2>("shadow2", BucketCategory::OTHER, BucketId::SHADOW2);
init_bucket_renderer<Shadow2>("shadow3", BucketCategory::OTHER, BucketId::SHADOW3);
// 575
init_bucket_renderer<TextureUploadHandler>("tex-warp", BucketCategory::TEX, BucketId::TEX_WARP,
m_texture_animator);

View file

@ -551,8 +551,8 @@ void Shadow2::draw_buffers(SharedRenderState* render_state,
if (have_darken) {
glColorMask(darken_channel[0], darken_channel[1], darken_channel[2], false);
glUniform4f(m_ogl.uniforms.color, (128 - m_color[0]) / 256.f, (128 - m_color[1]) / 256.f,
(128 - m_color[2]) / 256.f, 0);
glUniform4f(m_ogl.uniforms.color, (m_color[3] - m_color[0]) / 256.f,
(m_color[3] - m_color[1]) / 256.f, (m_color[3] - m_color[2]) / 256.f, 0);
glBlendEquation(GL_FUNC_REVERSE_SUBTRACT);
glDrawElements(GL_TRIANGLE_STRIP, 6, GL_UNSIGNED_INT,
(void*)(sizeof(u32) * (m_front_index_buffer_used - 6)));
@ -560,8 +560,8 @@ void Shadow2::draw_buffers(SharedRenderState* render_state,
if (have_lighten) {
glColorMask(lighten_channel[0], lighten_channel[1], lighten_channel[2], false);
glUniform4f(m_ogl.uniforms.color, (m_color[0] - 128) / 256.f, (m_color[1] - 128) / 256.f,
(m_color[2] - 128) / 256.f, 0);
glUniform4f(m_ogl.uniforms.color, (m_color[0] - m_color[3]) / 256.f,
(m_color[1] - m_color[3]) / 256.f, (m_color[2] - m_color[3]) / 256.f, 0);
glBlendEquation(GL_FUNC_ADD);
glDrawElements(GL_TRIANGLE_STRIP, 6, GL_UNSIGNED_INT,
(void*)(sizeof(u32) * (m_front_index_buffer_used - 6)));

File diff suppressed because it is too large Load diff

View file

@ -377,6 +377,22 @@ namespace method_34_sky_work { extern void link(); }
namespace method_35_sky_work { extern void link(); }
namespace method_32_sky_work { extern void link(); }
namespace set_sky_vf23_value { extern void link(); }
namespace shadow_xform_verts { extern void link(); }
namespace shadow_calc_dual_verts { extern void link(); }
namespace shadow_scissor_edges { extern void link(); }
namespace shadow_scissor_top { extern void link(); }
namespace shadow_init_vars { extern void link(); }
namespace shadow_find_facing_single_tris { extern void link(); }
namespace shadow_find_facing_double_tris { extern void link(); }
namespace shadow_find_single_edges { extern void link(); }
namespace shadow_find_double_edges { extern void link(); }
namespace shadow_add_verts { extern void link(); }
namespace shadow_add_facing_single_tris { extern void link(); }
namespace shadow_add_single_edges { extern void link(); }
namespace shadow_add_double_edges { extern void link(); }
namespace shadow_add_single_tris { extern void link(); }
namespace shadow_add_double_tris { extern void link(); }
namespace shadow_execute { extern void link(); }
}
// clang-format on
@ -629,7 +645,16 @@ PerGameVersion<std::unordered_map<std::string, std::vector<void (*)()>>> gMips2C
jak3::method_29_sky_work::link, jak3::method_30_sky_work::link,
jak3::method_31_sky_work::link, jak3::method_34_sky_work::link,
jak3::method_35_sky_work::link, jak3::method_32_sky_work::link,
jak3::set_sky_vf23_value::link, jak3::draw_large_polygon::link}}}};
jak3::set_sky_vf23_value::link, jak3::draw_large_polygon::link}},
{"shadow-cpu",
{jak3::shadow_xform_verts::link, jak3::shadow_execute::link,
jak3::shadow_calc_dual_verts::link, jak3::shadow_scissor_edges::link,
jak3::shadow_scissor_top::link, jak3::shadow_init_vars::link,
jak3::shadow_find_facing_single_tris::link, jak3::shadow_find_facing_double_tris::link,
jak3::shadow_find_single_edges::link, jak3::shadow_find_double_edges::link,
jak3::shadow_add_verts::link, jak3::shadow_add_facing_single_tris::link,
jak3::shadow_add_single_edges::link, jak3::shadow_add_double_edges::link,
jak3::shadow_add_single_tris::link, jak3::shadow_add_double_tris::link}}}};
void LinkedFunctionTable::reg(const std::string& name, u64 (*exec)(void*), u32 stack_size) {
const auto& it = m_executes.insert({name, {exec, Ptr<u8>()}});

View file

@ -178,6 +178,7 @@
(set! (-> obj flava-unlocked i) #f))
(set! (-> obj stats) *statistics*)
(initialize (-> obj stats kill-stats))
0)
(defmethod reset-input ((obj pc-settings-jak2) (device symbol) (call-handlers symbol))

View file

@ -1455,7 +1455,7 @@
(bones-init gp-0)
(bones-mtx-calc-execute)
(generic-merc-execute-all gp-0)
;; (shadow-execute-all gp-0)
(shadow-execute-all gp-0)
)
(lightning-draw-all)
;(prim-engine-execute)

View file

@ -5,10 +5,832 @@
;; name in dgo: shadow-cpu
;; dgos: GAME
(define-extern shadow-vu1-patch-consts (function symbol int none))
(define-extern shadow-vu1-init-buffer (function dma-buffer int none))
;; DECOMP BEGINS
;; stub
(format 0 "shadow-cpu: stubbed shadow-control::14~%")
(defmethod shadow-control-method-14 ((this shadow-control) (arg0 vector) (arg1 vector) (arg2 float) (arg3 float) (arg4 float))
;; WARN: Return type mismatch uint vs int.
(defmethod asize-of ((this shadow-geo))
(the-as int (* (-> this total-qwc) 16))
)
(defmethod mem-usage ((this shadow-geo) (usage memory-usage-block) (flags int))
(set! (-> usage length) (max 112 (-> usage length)))
(set! (-> usage data 111 name) "shadow-geo")
(+! (-> usage data 111 count) 1)
(let ((v1-6 (* (-> this total-qwc) 16)))
(+! (-> usage data 111 used) v1-6)
(+! (-> usage data 111 total) (logand -16 (+ v1-6 15)))
)
this
)
(define *shadow-data* (new 'static 'shadow-data
: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 flush) :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-invert-z-buf ((arg0 dma-buffer))
(let ((v1-0 (-> arg0 base)))
(let* ((a1-0 arg0)
(a2-0 (the-as object (-> a1-0 base)))
)
(set! (-> (the-as dma-packet a2-0) dma) (new 'static 'dma-tag :id (dma-tag-id cnt)))
(set! (-> (the-as dma-packet a2-0) vif0) (new 'static 'vif-tag))
(set! (-> (the-as dma-packet a2-0) vif1) (new 'static 'vif-tag :cmd (vif-cmd direct) :msk #x1))
(set! (-> a1-0 base) (&+ (the-as pointer a2-0) 16))
)
(let* ((a1-1 arg0)
(a2-2 (the-as object (-> a1-1 base)))
)
(set! (-> (the-as gs-gif-tag a2-2) tag) (new 'static 'gif-tag64 :nloop #x7 :eop #x1 :nreg #x1))
(set! (-> (the-as gs-gif-tag a2-2) regs) (new 'static 'gif-tag-regs :regs0 (gif-reg-id a+d)))
(set! (-> a1-1 base) (&+ (the-as pointer a2-2) 16))
)
(let ((t1-0 (-> arg0 base))
(t0-0 512)
)
416
(let ((a1-3 1792)
(a2-4 1840)
)
2304
(let ((a3-5 2256)
(t0-1 (/ t0-0 32))
)
(set! (-> (the-as (pointer gs-reg) t1-0) 8) (gs-reg texflush))
(set! (-> (the-as (pointer gs-reg64) t1-0) 0) (gs-reg64 prim))
(set! (-> (the-as (pointer gs-reg) t1-0) 24) (gs-reg frame-1))
(set! (-> (the-as (pointer gs-frame) t1-0) 2) (new 'static 'gs-frame :fbp #x130 :fbw #x8 :fbmsk #xff000000))
(set! (-> (the-as (pointer gs-reg) t1-0) 40) (gs-reg zbuf-1))
(set! (-> (the-as (pointer gs-zbuf) t1-0) 4) (new 'static 'gs-zbuf :zbp #x130 :psm (gs-psm ct24) :zmsk #x1))
(set! (-> (the-as (pointer gs-reg) t1-0) 56) (gs-reg test-1))
(set! (-> (the-as (pointer gs-test) t1-0) 6)
(new 'static 'gs-test :ate #x1 :atst (gs-atest always) :zte #x1 :ztst (gs-ztest always))
)
(set! (-> (the-as (pointer gs-reg) t1-0) 72) (gs-reg alpha-1))
(set! (-> (the-as (pointer gs-alpha) t1-0) 8) (new 'static 'gs-alpha :b #x1 :c #x2 :d #x2 :fix #x80))
(set! (-> (the-as (pointer gs-reg) t1-0) 88) (gs-reg prim))
(set! (-> (the-as (pointer gs-reg64) t1-0) 10) (gs-reg64 colclamp))
(set! (-> (the-as (pointer gs-reg) t1-0) 104) (gs-reg rgbaq))
(set! (-> (the-as (pointer gs-rgbaq) t1-0) 12) (new 'static 'gs-rgbaq :r #xff :g #xff :b #xff :q 1.0))
(&+! (-> arg0 base) 112)
(let* ((t1-3 arg0)
(t2-12 (the-as object (-> t1-3 base)))
)
(set! (-> (the-as gs-gif-tag t2-12) tag)
(new 'static 'gif-tag64 :eop #x1 :flg (gif-flag reg-list) :nreg #x2 :nloop t0-1)
)
(set! (-> (the-as gs-gif-tag t2-12) regs)
(new 'static 'gif-tag-regs :regs0 (gif-reg-id xyz2) :regs1 (gif-reg-id xyz2))
)
(set! (-> t1-3 base) (&+ (the-as pointer t2-12) 16))
)
(let ((t1-4 0))
(dotimes (t2-14 t0-1)
(let* ((t3-3 arg0)
(t4-2 (-> t3-3 base))
)
(set! (-> (the-as (pointer gs-xyzf) t4-2) 0) (new 'static 'gs-xyzf :y (* a2-4 16) :x (* (+ t1-4 a1-3) 16)))
(set! (-> (the-as (pointer gs-xyzf) t4-2) 1) (new 'static 'gs-xyzf :y (* a3-5 16) :x (* (+ t1-4 32 a1-3) 16)))
(set! (-> t3-3 base) (&+ t4-2 16))
)
(+! t1-4 32)
)
)
)
)
)
(nop!)
(nop!)
0
(let ((a1-9 (/ (the-as int (+ (- -16 (the-as int v1-0)) (the-as int (-> arg0 base)))) 16)))
(cond
((nonzero? a1-9)
(logior! (-> (the-as (pointer uint64) v1-0) 0) (shr (shl a1-9 48) 48))
(logior! (-> (the-as (pointer uint64) v1-0) 1) (shl (shr (shl a1-9 48) 48) 32))
)
(else
(set! (-> arg0 base) v1-0)
)
)
)
)
(none)
)
)
;; WARN: Return type mismatch pointer vs none.
(defun shadow-make-invert-buf ()
(let ((gp-0 *shadow-dma-buf*))
(let ((v1-0 gp-0))
(set! (-> v1-0 base) (-> v1-0 data))
(set! (-> v1-0 end) (the-as pointer (+ (+ (-> v1-0 allocated-length) 28) (the-as int v1-0))))
)
(shadow-invert-z-buf gp-0)
(let ((v1-1 (the-as object (-> gp-0 base))))
(set! (-> (the-as dma-packet v1-1) dma) (new 'static 'dma-tag :id (dma-tag-id ret)))
(set! (-> (the-as dma-packet v1-1) vif0) (new 'static 'vif-tag))
(set! (-> (the-as dma-packet v1-1) vif1) (new 'static 'vif-tag))
(set! (-> gp-0 base) (&+ (the-as pointer v1-1) 16))
)
)
(none)
)
(shadow-make-invert-buf)
(define *shadow-dma-invert-call* (the-as pointer #f))
;; WARN: Return type mismatch dma-buffer vs none.
(defun shadow-dma-init ((arg0 dma-buffer))
(-> *display* on-screen)
(let ((a1-0 408))
(* a1-0 32)
(let ((t3-0 512)
(t2-0 416)
(a2-0 1792)
(a3-0 1840)
)
2304
(let ((t0-0 2256)
(t1-0 (/ t3-0 32))
(t5-0 (* a3-0 16))
)
(set! *shadow-dma-invert-call* (-> arg0 base))
(let* ((v1-6 arg0)
(t4-0 (the-as object (-> v1-6 base)))
)
(set! (-> (the-as dma-packet t4-0) dma) (new 'static 'dma-tag :id (dma-tag-id cnt)))
(set! (-> (the-as dma-packet t4-0) vif0) (new 'static 'vif-tag))
(set! (-> (the-as dma-packet t4-0) vif1) (new 'static 'vif-tag))
(set! (-> v1-6 base) (&+ (the-as pointer t4-0) 16))
)
(let ((v1-7 (-> arg0 base)))
(let* ((t4-2 arg0)
(t6-1 (the-as object (-> t4-2 base)))
)
(set! (-> (the-as dma-packet t6-1) dma) (new 'static 'dma-tag :id (dma-tag-id cnt)))
(set! (-> (the-as dma-packet t6-1) vif0) (new 'static 'vif-tag))
(set! (-> (the-as dma-packet t6-1) vif1) (new 'static 'vif-tag :cmd (vif-cmd direct) :msk #x1))
(set! (-> t4-2 base) (&+ (the-as pointer t6-1) 16))
)
(let* ((t4-3 arg0)
(t6-3 (the-as object (-> t4-3 base)))
)
(set! (-> (the-as gs-gif-tag t6-3) tag) (new 'static 'gif-tag64 :nloop #xa :eop #x1 :nreg #x1))
(set! (-> (the-as gs-gif-tag t6-3) regs) (new 'static 'gif-tag-regs :regs0 (gif-reg-id a+d)))
(set! (-> t4-3 base) (&+ (the-as pointer t6-3) 16))
)
(let ((t4-4 (-> arg0 base)))
(set! (-> (the-as (pointer gs-reg64) t4-4) 1) (gs-reg64 texflush))
(set! (-> (the-as (pointer gs-reg64) t4-4) 3) (gs-reg64 test-1))
(set! (-> (the-as (pointer gs-test) t4-4) 2)
(new 'static 'gs-test :ate #x1 :atst (gs-atest always) :zte #x1 :ztst (gs-ztest always))
)
(set! (-> (the-as (pointer gs-reg64) t4-4) 5) (gs-reg64 alpha-1))
(set! (-> (the-as (pointer gs-alpha) t4-4) 4) (new 'static 'gs-alpha :b #x1 :d #x1))
(set! (-> (the-as (pointer gs-reg64) t4-4) 7) (gs-reg64 frame-1))
(set! (-> (the-as (pointer gs-frame) t4-4) 6) (new 'static 'gs-frame :fbw #x8 :fbmsk #xffffff :fbp a1-0))
(set! (-> (the-as (pointer gs-reg64) t4-4) 9) (gs-reg64 zbuf-1))
(set! (-> (the-as (pointer gs-zbuf) t4-4) 8) (new 'static 'gs-zbuf :zbp #x130 :psm (gs-psm ct24) :zmsk #x1))
(set! (-> (the-as (pointer gs-reg64) t4-4) 11) (gs-reg64 xyoffset-1))
(set! (-> (the-as (pointer gs-xy-offset) t4-4) 10) (new 'static 'gs-xy-offset :ofx (* a2-0 16) :ofy t5-0))
(set! (-> (the-as (pointer gs-reg64) t4-4) 13) (gs-reg64 tex0-1))
(set! (-> (the-as (pointer gs-tex0) t4-4) 12)
(new 'static 'gs-tex0 :tbw #x8 :tw #x9 :th #x9 :tcc #x1 :tbp0 (* a1-0 32))
)
(set! (-> (the-as (pointer gs-reg) t4-4) 120) (gs-reg tex1-1))
(set! (-> (the-as (pointer gs-tex1) t4-4) 14) (new 'static 'gs-tex1))
(set! (-> (the-as (pointer gs-reg) t4-4) 136) (gs-reg miptbp1-1))
(set! (-> (the-as (pointer gs-miptbp) t4-4) 16) (new 'static 'gs-miptbp))
(set! (-> (the-as (pointer gs-reg) t4-4) 152) (gs-reg clamp-1))
(set! (-> (the-as (pointer gs-clamp) t4-4) 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-12 arg0)
(t5-12 (-> t4-12 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-12 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 #x130 :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-0))
(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 #x130 :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-0))
(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-7)) (the-as int (-> arg0 base)))) 16)))
(cond
((nonzero? a2-10)
(logior! (-> (the-as (pointer uint64) v1-7) 0) (shr (shl a2-10 48) 48))
(logior! (-> (the-as (pointer uint64) v1-7) 1) (shl (shr (shl a2-10 48) 48) 32))
)
(else
(set! (-> arg0 base) v1-7)
)
)
)
)
)
)
)
(none)
)
;; WARN: Return type mismatch dma-buffer vs none.
(defun shadow-dma-end ((arg0 dma-buffer) (arg1 gs-rgbaq) (arg2 symbol) (arg3 int))
(local-vars (sv-16 int))
(set! sv-16 arg3)
(-> *display* on-screen)
(let ((s0-0 408))
(* s0-0 32)
(let ((v1-4 512)
(s3-0 416)
(s5-0 1792)
(s4-0 1840)
)
2304
2256
(let ((s2-0 (/ v1-4 32)))
(* s4-0 16)
(let ((v1-6 (the-as object *shadow-dma-invert-call*))
(a0-3 *shadow-dma-buf*)
)
(cond
(arg2
(set! (-> (the-as (pointer uint64) v1-6)) (logior #x50000000 (shr (shl (the-as int (-> a0-3 data)) 33) 1)))
(set! (-> (the-as (pointer uint64) v1-6) 1) (the-as uint 0))
(let* ((v1-7 arg0)
(a1-3 (the-as object (-> v1-7 base)))
)
(set! (-> (the-as dma-packet a1-3) dma)
(new 'static 'dma-tag :id (dma-tag-id call) :addr (the-as int (-> a0-3 data)))
)
(set! (-> (the-as dma-packet a1-3) vif0) (new 'static 'vif-tag))
(set! (-> (the-as dma-packet a1-3) vif1) (new 'static 'vif-tag :cmd (vif-cmd flusha) :msk #x1))
(set! (-> v1-7 base) (&+ (the-as pointer a1-3) 16))
)
)
(else
(set! (-> (the-as dma-packet v1-6) dma) (new 'static 'dma-tag :id (dma-tag-id cnt)))
(set! (-> (the-as (pointer uint64) v1-6) 1) (the-as uint 0))
0
)
)
)
(shadow-vu1-patch-consts arg2 sv-16)
(cond
((= sv-16 2)
(dma-buffer-add-gs-set-flusha arg0
(texflush 0)
(test-1
(new 'static 'gs-test :ate #x1 :atst (gs-atest not-equal) :aref #x60 :zte #x1 :ztst (gs-ztest always))
)
(tex0-1 (new 'static 'gs-tex0 :tbp0 #x3300 :tbw #x8 :tw #x9 :th #x9 :tcc #x1 :tfx #x3))
(frame-1 (new 'static 'gs-frame :fbw #x8 :fbp s0-0))
(alpha-1 (new 'static 'gs-alpha))
(texflush 0)
)
)
(else
(let* ((v1-13 arg0)
(a0-19 (the-as object (-> v1-13 base)))
)
(set! (-> (the-as dma-packet a0-19) dma) (new 'static 'dma-tag :qwc #x6 :id (dma-tag-id cnt)))
(set! (-> (the-as dma-packet a0-19) vif0) (new 'static 'vif-tag :cmd (vif-cmd flusha) :msk #x1))
(set! (-> (the-as dma-packet a0-19) vif1) (new 'static 'vif-tag :imm #x6 :cmd (vif-cmd direct) :msk #x1))
(set! (-> v1-13 base) (&+ (the-as pointer a0-19) 16))
)
(let* ((v1-14 arg0)
(a0-21 (the-as object (-> v1-14 base)))
)
(set! (-> (the-as gs-gif-tag a0-21) tag) (new 'static 'gif-tag64 :nloop #x1 :eop #x1 :nreg #x5))
(set! (-> (the-as gs-gif-tag a0-21) regs) GIF_REGS_ALL_AD)
(set! (-> v1-14 base) (&+ (the-as pointer a0-21) 16))
)
(let* ((v1-15 arg0)
(a0-23 (-> v1-15 base))
)
(set! (-> (the-as (pointer uint64) a0-23) 0) (the-as uint 0))
(set! (-> (the-as (pointer gs-reg64) a0-23) 1) (gs-reg64 texflush))
(set! (-> (the-as (pointer gs-test) a0-23) 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) a0-23) 3) (gs-reg64 test-1))
(set! (-> (the-as (pointer gs-frame) a0-23) 4) (new 'static 'gs-frame :fbw #x8 :fbp s0-0))
(set! (-> (the-as (pointer gs-reg64) a0-23) 5) (gs-reg64 frame-1))
(set! (-> (the-as (pointer uint64) a0-23) 6) (the-as uint 0))
(set! (-> (the-as (pointer gs-reg64) a0-23) 7) (gs-reg64 alpha-1))
(set! (-> (the-as (pointer uint64) a0-23) 8) (the-as uint 0))
(set! (-> (the-as (pointer gs-reg64) a0-23) 9) (gs-reg64 texflush))
(set! (-> v1-15 base) (&+ a0-23 80))
)
)
)
(let ((v1-16 (-> arg0 base)))
(let* ((a0-25 arg0)
(a1-35 (the-as object (-> a0-25 base)))
)
(set! (-> (the-as dma-packet a1-35) dma) (new 'static 'dma-tag :id (dma-tag-id cnt)))
(set! (-> (the-as dma-packet a1-35) vif0) (new 'static 'vif-tag :cmd (vif-cmd flusha) :msk #x1))
(set! (-> (the-as dma-packet a1-35) vif1) (new 'static 'vif-tag :cmd (vif-cmd direct) :msk #x1))
(set! (-> a0-25 base) (&+ (the-as pointer a1-35) 16))
)
(let* ((a0-26 arg0)
(a1-37 (the-as object (-> a0-26 base)))
)
(set! (-> (the-as gs-gif-tag a1-37) tag)
(new 'static 'gif-tag64 :nloop #x1 :flg (gif-flag reg-list) :nreg #x2)
)
(set! (-> (the-as gs-gif-tag a1-37) regs) (new 'static 'gif-tag-regs :regs1 (gif-reg-id rgbaq)))
(set! (-> (the-as (pointer gs-prim) a1-37) 2)
(new 'static 'gs-prim :prim (gs-prim-type sprite) :tme #x1 :abe #x1)
)
(set! (-> (the-as (pointer gs-rgbaq) a1-37) 3) arg1)
(set! (-> (the-as (inline-array gs-gif-tag) a1-37) 2 tag)
(new 'static 'gif-tag64 :eop #x1 :flg (gif-flag reg-list) :nreg #x4 :nloop s2-0)
)
(set! (-> (the-as (inline-array gs-gif-tag) a1-37) 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! (-> a0-26 base) (&+ (the-as pointer a1-37) 48))
)
(let ((a0-27 0)
(a1-39 0)
)
(dotimes (a2-14 s2-0)
(let ((t1-0 a0-27))
(+! a0-27 32)
(let* ((a3-7 arg0)
(t0-0 (-> a3-7 base))
)
(set! (-> (the-as (pointer uint64) t0-0) 0)
(the-as
uint
(logior (shl (the-as int (* 0.001953125 (+ 0.5 (the float a1-39)))) 32)
(shr (shl (the-as int (* 0.001953125 (+ 0.5 (the float t1-0)))) 32) 32)
)
)
)
(set! (-> (the-as (pointer uint64) t0-0) 1)
(the-as
uint
(logior (logior (shl #x1ffff 32) (shr (shl (* (+ s5-0 t1-0) 16) 48) 48))
(shr (shl (* (+ s4-0 a1-39) 16) 48) 32)
)
)
)
(set! (-> (the-as (pointer uint64) t0-0) 2)
(the-as
uint
(logior (shl (the-as int (* 0.001953125 (+ 0.5 (the float s3-0)))) 32)
(shr (shl (the-as int (* 0.001953125 (+ 0.5 (the float a0-27)))) 32) 32)
)
)
)
(set! (-> (the-as (pointer uint64) t0-0) 3)
(the-as uint (logior (logior (shl #x1ffff 32) (shr (shl (* (+ s5-0 a0-27) 16) 48) 48))
(shr (shl (* (+ s4-0 s3-0) 16) 48) 32)
)
)
)
(set! (-> a3-7 base) (&+ t0-0 32))
)
)
)
)
(let ((a1-43 (/ (the-as int (+ (- -16 (the-as int v1-16)) (the-as int (-> arg0 base)))) 16)))
(cond
((nonzero? a1-43)
(logior! (-> (the-as (pointer uint64) v1-16) 0) (shr (shl a1-43 48) 48))
(logior! (-> (the-as (pointer uint64) v1-16) 1) (shl (shr (shl a1-43 48) 48) 32))
)
(else
(set! (-> arg0 base) v1-16)
)
)
)
)
)
)
)
(reset-display-gs-state *display* arg0)
(none)
)
(deftype shadow-stats (structure)
((num-single-tris uint32)
(num-double-tris uint32)
(num-single-edges uint32)
(num-double-edges uint32)
(num-fragments uint16)
(num-objects uint16)
)
)
(deftype shadow-dcache (structure)
((vtx-table uint32)
(single-edge-table uint32)
(double-edge-table uint32)
(double-tri-table uint32)
(dcache-top uint32)
(num-facing-single-tris uint32)
(num-single-edges uint32)
(num-double-edges uint32)
(single-tri-list uint32)
(single-edge-list uint32)
(double-edge-list uint32)
(ptr-dual-verts uint32)
(stats shadow-stats :inline)
(frag-qwc uint32)
(center vector :inline)
(plane vector :inline)
(top-plane vector :inline)
(near-plane vector :inline)
(light-dir vector :inline)
(vtx-min vector :inline)
(data uint8 :dynamic)
)
)
(define shadow-vu0-block (new 'static 'vu-function :length 88 :qlength 44))
(def-mips2c shadow-xform-verts function)
(def-mips2c shadow-calc-dual-verts function)
(def-mips2c shadow-scissor-edges function)
(def-mips2c shadow-scissor-top function)
(def-mips2c shadow-init-vars function)
(def-mips2c shadow-find-facing-single-tris function)
(def-mips2c shadow-find-single-edges function)
(def-mips2c shadow-find-facing-double-tris function)
(def-mips2c shadow-find-double-edges function)
(def-mips2c shadow-add-verts function)
(def-mips2c shadow-add-facing-single-tris function)
(def-mips2c shadow-add-single-edges function)
(def-mips2c shadow-add-single-tris function)
(def-mips2c shadow-add-double-tris function)
(def-mips2c shadow-add-double-edges function)
(defmethod shadow-control-method-14 ((this shadow-control) (arg0 vector) (arg1 vector) (arg2 float) (arg3 float) (arg4 float))
(let ((gp-0 (-> this settings)))
(let ((s4-0 (-> gp-0 shadow-dir)))
(vector-normalize-copy! s4-0 arg1 1.0)
(set! (-> gp-0 shadow-dir w) (- arg2))
(when *shadow-debug*
(add-debug-x #t (bucket-id debug-no-zbuf1) arg0 *color-red*)
(add-debug-vector #t (bucket-id debug-no-zbuf1) arg0 s4-0 (meters 3) *color-red*)
)
(let ((s1-2 (vector+float*! (new 'stack-no-clear 'vector) arg0 s4-0 arg3))
(s5-2 (vector+float*! (new 'stack-no-clear 'vector) arg0 s4-0 arg4))
)
(vector-negate! (-> gp-0 top-plane) s4-0)
(vector-negate! (-> gp-0 bot-plane) s4-0)
(set! (-> gp-0 top-plane w) (- (vector-dot s1-2 (the-as vector (-> gp-0 top-plane)))))
(set! (-> gp-0 bot-plane w) (- (vector-dot s5-2 (the-as vector (-> gp-0 bot-plane)))))
)
)
(logior! (-> gp-0 flags) (shadow-flags shdf02 shdf03 shdf04 shdf07))
)
0
(none)
)
(defun debug-draw-settings ((arg0 shadow-settings))
(let ((s4-0 (-> arg0 shadow-dir))
(s5-0 (-> arg0 center))
(s3-0 (-> arg0 top-plane))
(s2-0 (-> arg0 bot-plane))
(s1-0 (new 'stack-no-clear 'vector))
(s0-0 (new 'stack-no-clear 'vector))
)
(cond
((logtest? (-> arg0 flags) (shadow-flags shdf02))
(vector+float*! s1-0 s5-0 s4-0 (- (vector-dot (the-as vector s3-0) s5-0) (-> s3-0 w)))
(vector+float*! s0-0 s5-0 s4-0 (- (vector-dot (the-as vector s2-0) s5-0) (-> s2-0 w)))
)
(else
(let ((v1-7 (vector+float*! (new 'stack-no-clear 'vector) s5-0 s4-0 (-> s4-0 w))))
(vector+float*! s1-0 v1-7 s4-0 (- (vector-dot (the-as vector s3-0) v1-7) (-> s3-0 w)))
(vector+float*! s0-0 v1-7 s4-0 (- (vector-dot (the-as vector s2-0) v1-7) (-> s2-0 w)))
)
)
)
(add-debug-sphere #t (bucket-id debug-no-zbuf1) s5-0 (meters 0.8) *color-magenta*)
(add-debug-vector #t (bucket-id debug-no-zbuf1) s5-0 s4-0 (meters 4) *color-magenta*)
(add-debug-x #t (bucket-id debug-no-zbuf1) s1-0 *color-blue*)
(add-debug-vector #t (bucket-id debug-no-zbuf1) s1-0 s3-0 (meters 2) *color-blue*)
(add-debug-line #t (bucket-id debug-no-zbuf1) (-> arg0 center) s1-0 *color-blue* #f (the-as rgba -1))
(add-debug-x #t (bucket-id debug-no-zbuf1) s0-0 *color-green*)
(add-debug-vector #t (bucket-id debug-no-zbuf1) s0-0 s2-0 (meters 2) *color-green*)
(add-debug-line #t (bucket-id debug-no-zbuf1) s1-0 s0-0 *color-green* #f (the-as rgba -1))
)
)
(def-mips2c shadow-execute (function shadow-dma-packet pointer pointer))
;; ERROR: Failed store: (s.d! (+ (the-as dma-packet a0-5) 8) 0) at op 17
(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 (the-as object (-> v1-1 base)))
)
(set! (-> (the-as dma-packet a0-5) dma) (new 'static 'dma-tag :id (dma-tag-id end)))
(s.d! (+ (the-as dma-packet a0-5) 8) 0)
(set! (-> v1-1 base) (&+ (the-as pointer a0-5) 16))
)
(.sync.l)
(dma-buffer-send-chain (the-as dma-bank-source #x10008000) gp-0)
)
)
0
(none)
)
;; ERROR: Failed store: (s.h! (+ v1-25 18) 0) at op 61
;; ERROR: Failed store: (s.h! (+ v1-25 16) 0) at op 62
(defun shadow-execute-all ((arg0 dma-buffer))
(when *debug-segment*
(let ((gp-0 (-> *display* frames (-> *display* on-screen) profile-array data 0))
(v1-7 'other)
(s5-0 *profile-other-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)
)
(set! (-> gp-0 count) (min 1023 (+ (-> gp-0 count) 1)))
(+! (-> gp-0 depth) 1)
(set! (-> gp-0 max-depth) (max (-> gp-0 max-depth) (-> gp-0 depth)))
)
)
0
)
(when (logtest? (vu1-renderer-mask rn32) (-> *display* vu1-enable-user))
(let ((gp-1 *shadow-globals*))
(let ((v1-25 (the-as shadow-dcache (-> (the-as shadow-dcache *gsf-buffer*) stats))))
(set! (-> v1-25 vtx-table) (the-as uint 0))
(set! (-> v1-25 single-edge-table) (the-as uint 0))
(set! (-> v1-25 double-edge-table) (the-as uint 0))
(set! (-> v1-25 double-tri-table) (the-as uint 0))
;; (s.h! (+ v1-25 18) 0)
;; (s.h! (+ v1-25 16) 0)
(set! (-> v1-25 dcache-top) (the-as uint 0))
)
0
(let ((v1-27 #f))
(dotimes (a0-13 3)
(if (nonzero? (-> gp-1 bucket a0-13 first))
(set! v1-27 #t)
)
)
(when v1-27
(shadow-vu0-upload)
(dotimes (s5-1 3)
(let* ((s4-1 (-> gp-1 bucket s5-1))
(s1-0 (-> s4-1 first))
)
(when (nonzero? s1-0)
(with-dma-buffer-add-bucket ((s2-0 (-> *display* frames (-> *display* on-screen) global-buf))
(-> s4-1 bucket-id)
)
(set! (-> (scratchpad-object shadow-dcache) ptr-dual-verts) (the-as uint 0))
(shadow-vu1-init-buffer s2-0 s5-1)
(flush-cache 0)
(shadow-dma-init s2-0)
(set! (-> s2-0 base) (shadow-execute (the-as shadow-dma-packet s1-0) (-> s2-0 base)))
(let ((a2-1 (nonzero? (-> (scratchpad-object shadow-dcache) ptr-dual-verts)))
(a1-9 (logior (shl #x3f800000 32) (shr (shl (the-as int (the-as uint32 (-> s4-1 shadow-color))) 32) 32)))
)
(let ((v1-43 (-> *time-of-day-context* current-shadow-color)))
(if (zero? s5-1)
(set! a1-9
(logior (logand (logior (logand (logior (logand a1-9 -256) (shr (shl (the int (* 128.0 (-> v1-43 x))) 56) 56)) -65281)
(shr (shl (the int (* 128.0 (-> v1-43 y))) 56) 48)
)
-16711681
)
(shr (shl (the int (* 128.0 (-> v1-43 z))) 56) 40)
)
)
)
)
;; modified in pc port so we don't have to do the crazy z buffer flipping stuff.
(shadow-dma-end s2-0 (the-as gs-rgbaq a1-9) #f #|a2-1|# s5-1)
)
)
)
)
)
)
)
)
(let ((gp-2 *gsf-buffer*))
(let ((v1-61 (-> *terrain-stats* shadow)))
(+! (-> v1-61 groups) (-> (the-as shadow-dcache gp-2) stats num-objects))
(+! (-> v1-61 fragments) (-> (the-as shadow-dcache gp-2) stats num-objects))
(+! (-> v1-61 tris)
(* (+ (-> (the-as shadow-dcache gp-2) stats num-single-tris)
(-> (the-as shadow-dcache gp-2) stats num-double-tris)
(-> (the-as shadow-dcache gp-2) stats num-single-edges)
(-> (the-as shadow-dcache gp-2) stats num-double-edges)
)
2
)
)
(+! (-> v1-61 dverts)
(* (the-as uint 6) (-> (the-as shadow-dcache gp-2) stats num-single-tris))
(* (the-as uint 6) (-> (the-as shadow-dcache gp-2) stats num-double-tris))
(* (-> (the-as shadow-dcache gp-2) stats num-single-edges) 4)
(* (-> (the-as shadow-dcache gp-2) stats num-double-edges) 4)
)
)
(when #f
(format *stdcon* "~%~%~%~%#single tris : ~4d~%" (-> (the-as shadow-dcache gp-2) stats num-single-tris))
(format *stdcon* "#double tris : ~4d~%" (-> (the-as shadow-dcache gp-2) stats num-double-tris))
(format *stdcon* "#single edges: ~4d~%" (-> (the-as shadow-dcache gp-2) stats num-single-edges))
(format *stdcon* "#double edges: ~4d~%" (-> (the-as shadow-dcache gp-2) stats num-double-edges))
)
)
)
(when *debug-segment*
(let ((gp-3 (-> *display* frames (-> *display* on-screen) profile-array data 0)))
(when (and *dproc* *debug-segment*)
(let* ((v1-75 (+ (-> gp-3 depth) -1))
(s5-2 (-> gp-3 segment v1-75))
(s4-2 (-> gp-3 base-time))
)
(when (>= v1-75 0)
(set! (-> s5-2 end-time) (the-as int (- (timer-count (the-as timer-bank #x10000800)) (the-as uint s4-2))))
(+! (-> gp-3 depth) -1)
)
)
)
)
0
)
0
(none)
)
(defmethod probe-line-for-shadow ((this shadow-control) (arg0 vector) (arg1 float) (arg2 float) (arg3 float))
(with-pp
(let ((s4-0 (new 'stack-no-clear 'collide-query)))
(let ((v1-0 pp))
(set! (-> s4-0 start-pos quad) (-> arg0 quad))
(+! (-> s4-0 start-pos y) 4096.0)
(set-vector! (-> s4-0 move-dist) 0.0 (- arg3) 0.0 1.0)
(let ((a0-4 s4-0))
(set! (-> a0-4 radius) 8192.0)
(set! (-> a0-4 collide-with) (collide-spec backgnd))
(set! (-> a0-4 ignore-process0) v1-0)
(set! (-> a0-4 ignore-process1) #f)
(set! (-> a0-4 ignore-pat)
(new 'static 'pat-surface :noentity #x1 :nojak #x1 :probe #x1 :noendlessfall #x1 :board #x1)
)
(set! (-> a0-4 action-mask) (collide-action solid))
)
)
(cond
((>= (fill-and-probe-using-line-sphere *collide-cache* s4-0) 0.0)
(let ((v1-5 this))
(logclear! (-> v1-5 settings flags) (shadow-flags disable-draw))
)
0
(let ((v1-7 this))
(set! (-> v1-7 settings bot-plane w) (- (+ (-> s4-0 best-other-tri intersect y) arg1)))
)
0
(set! (-> this settings top-plane w) (- (+ (-> s4-0 best-other-tri intersect y) arg2)))
0
)
(else
(let ((v1-10 this))
(logior! (-> v1-10 settings flags) (shadow-flags disable-draw))
)
0
)
)
)
0
(none)
)
)

View file

@ -7,3 +7,222 @@
;; DECOMP BEGINS
(deftype shadow-vu1-constants (structure)
((hmgescale vector :inline)
(invhscale vector :inline)
(texoffset vector :inline)
(texscale vector :inline)
(hvdfoff vector :inline)
(fog vector :inline)
(clrs vector 2 :inline)
(adgif gs-gif-tag :inline)
(texflush gs-adcmd :inline)
(flush gs-adcmd :inline)
(trigif gs-gif-tag :inline)
(quadgif gs-gif-tag :inline)
)
)
(deftype shadow-vu1-data (structure)
((adgif gs-gif-tag :inline)
(ad gs-adcmd :inline)
(flush gs-adcmd :inline)
(trigif gs-gif-tag :inline)
(quadgif gs-gif-tag :inline)
(texoffset vector :inline)
(texscale vector :inline)
(clrs qword 2 :inline)
)
)
(define *shadow-vu1-data* (new 'static 'shadow-vu1-data
:adgif (new 'static 'gs-gif-tag
:tag (new 'static 'gif-tag64 :nloop #x1 :nreg #x1)
:regs (new 'static 'gif-tag-regs :regs0 (gif-reg-id a+d))
)
:ad (new 'static 'gs-adcmd :cmds (gs-reg64 texflush))
:flush (new 'static 'gs-adcmd :cmds (gs-reg64 rgbaq) :y #x3f800000)
:trigif (new 'static 'gs-gif-tag
:tag (new 'static 'gif-tag64
:nloop #x1
:eop #x1
:pre #x1
:prim (new 'static 'gs-prim :prim (gs-prim-type tri-fan) :tme #x1)
:nreg #x7
)
:regs (new 'static 'gif-tag-regs
:regs0 (gif-reg-id rgbaq)
:regs1 (gif-reg-id st)
:regs2 (gif-reg-id xyzf2)
:regs3 (gif-reg-id st)
:regs4 (gif-reg-id xyzf2)
:regs5 (gif-reg-id st)
:regs6 (gif-reg-id xyzf2)
)
)
:quadgif (new 'static 'gs-gif-tag
:tag (new 'static 'gif-tag64
:nloop #x1
:eop #x1
:pre #x1
:prim (new 'static 'gs-prim :prim (gs-prim-type tri-fan) :tme #x1)
:nreg #x9
)
:regs (new 'static 'gif-tag-regs
:regs0 (gif-reg-id rgbaq)
:regs1 (gif-reg-id st)
:regs2 (gif-reg-id xyzf2)
:regs3 (gif-reg-id st)
:regs4 (gif-reg-id xyzf2)
:regs5 (gif-reg-id st)
:regs6 (gif-reg-id xyzf2)
:regs7 (gif-reg-id st)
:regs8 (gif-reg-id xyzf2)
)
)
:texoffset (new 'static 'vector :x 256.5 :y 208.5)
:texscale (new 'static 'vector :x 0.001953125 :y 0.001953125)
:clrs (new 'static 'inline-array qword 2
(new 'static 'qword :data (new 'static 'array uint32 4 #x80 #x0 #x0 #x82))
(new 'static 'qword :data (new 'static 'array uint32 4 #x0 #x80 #x0 #x7f))
)
)
)
(define shadow-vu1-block (new 'static 'vu-function #| :length #x2e9 :qlength #x175 |#))
;; WARN: Return type mismatch dma-buffer vs none.
(defun shadow-vu1-add-constants ((arg0 dma-buffer) (arg1 int))
(let* ((a3-0 13)
(v1-0 arg0)
(a2-0 (the-as object (-> v1-0 base)))
)
(set! (-> (the-as dma-packet a2-0) dma) (new 'static 'dma-tag :id (dma-tag-id cnt) :qwc a3-0))
(set! (-> (the-as dma-packet a2-0) vif0) (new 'static 'vif-tag :imm #x404 :cmd (vif-cmd stcycl)))
(set! (-> (the-as dma-packet a2-0) vif1)
(new 'static 'vif-tag :imm #x370 :cmd (vif-cmd unpack-v4-32) :num a3-0)
)
(set! (-> v1-0 base) (the-as pointer (&+ (the-as dma-packet a2-0) 16)))
)
(let ((v1-1 (the-as object (-> arg0 base))))
(let ((a3-4 *math-camera*)
(a2-2 *shadow-vu1-data*)
)
(set! (-> (the-as shadow-vu1-constants v1-1) hmgescale quad) (-> a3-4 hmge-scale quad))
(set! (-> (the-as shadow-vu1-constants v1-1) invhscale quad) (-> a3-4 inv-hmge-scale quad))
(set! (-> (the-as shadow-vu1-constants v1-1) hvdfoff quad) (-> a3-4 hvdf-off quad))
(set! (-> (the-as shadow-vu1-constants v1-1) hvdfoff x) 2048.0)
(set! (-> (the-as shadow-vu1-constants v1-1) hvdfoff y) 2048.0)
(set! (-> (the-as shadow-vu1-constants v1-1) fog x) (-> a3-4 pfog0))
(set! (-> (the-as shadow-vu1-constants v1-1) clrs 0 quad) (-> a2-2 clrs 0 quad))
(set! (-> (the-as shadow-vu1-constants v1-1) clrs 1 quad) (-> a2-2 clrs 1 quad))
(set! (-> (the-as shadow-vu1-constants v1-1) texoffset quad) (-> a2-2 texoffset quad))
(set! (-> (the-as shadow-vu1-constants v1-1) texscale quad) (-> a2-2 texscale quad))
(set! (-> (the-as shadow-vu1-constants v1-1) adgif qword) (-> a2-2 adgif qword))
(set! (-> (the-as shadow-vu1-constants v1-1) texflush quad) (-> a2-2 ad quad))
(set! (-> (the-as shadow-vu1-constants v1-1) flush quad) (-> a2-2 flush quad))
(set! (-> (the-as shadow-vu1-constants v1-1) trigif qword) (-> a2-2 trigif qword))
(set! (-> (the-as shadow-vu1-constants v1-1) quadgif qword) (-> a2-2 quadgif qword))
)
(set! (-> *shadow-globals* bucket arg1 constants) (the-as shadow-vu1-constants v1-1))
)
(&+! (-> arg0 base) 208)
(let* ((v1-4 arg0)
(a1-3 (the-as object (-> v1-4 base)))
)
(set! (-> (the-as dma-packet a1-3) dma) (new 'static 'dma-tag :qwc #x4 :id (dma-tag-id cnt)))
(set! (-> (the-as dma-packet a1-3) vif0) (new 'static 'vif-tag :imm #x404 :cmd (vif-cmd stcycl)))
(set! (-> (the-as dma-packet a1-3) vif1)
(new 'static 'vif-tag :imm #x3ac :num #x4 :cmd (vif-cmd unpack-v4-32))
)
(set! (-> v1-4 base) (&+ (the-as pointer a1-3) 16))
)
(let* ((v1-5 arg0)
(a1-5 (the-as object (-> v1-5 base)))
)
(set! (-> (the-as shadow-vu1-data a1-5) adgif tag) (new 'static 'gif-tag64 :nloop #x1 :nreg #x2))
(set! (-> (the-as shadow-vu1-data a1-5) adgif regs)
(new 'static 'gif-tag-regs :regs0 (gif-reg-id a+d) :regs1 (gif-reg-id rgbaq))
)
(set! (-> (the-as shadow-vu1-data a1-5) ad data) (the-as uint 0))
(set! (-> (the-as shadow-vu1-data a1-5) ad cmds) (gs-reg64 texflush))
(set! (-> (the-as shadow-vu1-data a1-5) flush data) (the-as uint 0))
(set! (-> (the-as shadow-vu1-data a1-5) flush cmds) (gs-reg64 prim))
(set! (-> (the-as shadow-vu1-data a1-5) trigif tag)
(new 'static 'gif-tag64
:nloop #x3
:eop #x1
:pre #x1
:prim (new 'static 'gs-prim :prim (gs-prim-type tri-fan) :tme #x1)
:nreg #x2
)
)
(set! (-> (the-as shadow-vu1-data a1-5) trigif regs)
(new 'static 'gif-tag-regs :regs0 (gif-reg-id st) :regs1 (gif-reg-id xyzf2))
)
(set! (-> v1-5 base) (&+ (the-as pointer a1-5) 64))
)
(none)
)
(defun shadow-vu1-patch-consts ((arg0 symbol) (arg1 int))
(let ((v1-2 (-> *shadow-globals* bucket arg1 constants)))
(cond
(arg0
(set! (-> v1-2 hvdfoff z) (- 1.0 (-> v1-2 hvdfoff z)))
(set! (-> v1-2 fog w) -1.0)
)
(else
(set! (-> v1-2 fog w) 1.0)
)
)
)
0
(none)
)
;; WARN: Return type mismatch dma-buffer vs none.
(defun shadow-vu1-add-matrix ((arg0 dma-buffer) (arg1 math-camera))
(let ((v1-0 4))
(let* ((a2-4 arg0)
(a3-0 (the-as object (-> a2-4 base)))
)
(set! (-> (the-as dma-packet a3-0) dma) (new 'static 'dma-tag :id (dma-tag-id cnt) :qwc v1-0))
(set! (-> (the-as dma-packet a3-0) vif0) (new 'static 'vif-tag :imm #x404 :cmd (vif-cmd stcycl)))
(set! (-> (the-as dma-packet a3-0) vif1) (new 'static 'vif-tag :cmd (vif-cmd unpack-v4-32) :num v1-0))
(set! (-> a2-4 base) (&+ (the-as pointer a3-0) 16))
)
)
(let ((v1-5 (the-as object (-> arg0 base))))
(let ((a2-5 (-> arg1 perspective rvec quad))
(a3-1 (-> arg1 perspective uvec quad))
(t0-4 (-> arg1 perspective fvec quad))
(a1-1 (-> arg1 perspective trans quad))
)
(set! (-> (the-as matrix v1-5) rvec quad) a2-5)
(set! (-> (the-as matrix v1-5) uvec quad) a3-1)
(set! (-> (the-as matrix v1-5) fvec quad) t0-4)
(set! (-> (the-as matrix v1-5) trans quad) a1-1)
)
(set! (-> arg0 base) (&+ (the-as pointer v1-5) 64))
)
(none)
)
;; WARN: Return type mismatch dma-buffer vs none.
(defun shadow-vu1-init-buffer ((arg0 dma-buffer) (arg1 int))
(dma-buffer-add-vu-function arg0 shadow-vu1-block 1)
(shadow-vu1-add-constants arg0 arg1)
(shadow-vu1-add-matrix arg0 *math-camera*)
(let* ((v1-0 arg0)
(a0-4 (the-as object (-> v1-0 base)))
)
(set! (-> (the-as dma-packet a0-4) dma) (new 'static 'dma-tag :id (dma-tag-id cnt)))
(set! (-> (the-as dma-packet a0-4) vif0) (new 'static 'vif-tag :cmd (vif-cmd mscalf) :msk #x1 :imm #xa))
(set! (-> (the-as dma-packet a0-4) vif1) (new 'static 'vif-tag :cmd (vif-cmd flushe) :msk #x1))
(set! (-> v1-0 base) (&+ (the-as pointer a0-4) 16))
)
(none)
)