diff --git a/decompiler/analysis/insert_lets.cpp b/decompiler/analysis/insert_lets.cpp index 58a825ab4..9acd89814 100644 --- a/decompiler/analysis/insert_lets.cpp +++ b/decompiler/analysis/insert_lets.cpp @@ -2236,6 +2236,7 @@ FormElement* rewrite_with_dma_buf_add_bucket(LetElement* in, const Env& env, For if (!mr_buf_base.matched) { return nullptr; } + if (!var_equal(env, buf_dst, mr_buf_base.maps.regs.at(0))) { lg::print("dma buf bad name\n"); return nullptr; @@ -2251,16 +2252,59 @@ FormElement* rewrite_with_dma_buf_add_bucket(LetElement* in, const Env& env, For last_part = dynamic_cast(in->body()->at(in->body()->size() - 1)); if (!last_part) { - // lg::error("NO LAST PART AHH wtf!!"); return nullptr; } - if (last_part->entries().size() != 1 || last_part->body()->size() != 2) { + // New for Jak 3: they check to see if nothing was added, and skip adding an empty DMA transfer + // if so. This means the usual 2 ending let body forms are now wrapped in a `when`. + const int expected_last_let_body_size = env.version == GameVersion::Jak3 ? 1 : 2; + if (last_part->entries().size() != 1 || + last_part->body()->size() != expected_last_let_body_size) { return nullptr; } auto buf_end_dst = last_part->entries().at(0).dest; - auto dmatag_let = dynamic_cast(last_part->body()->at(0)); + LetElement* dmatag_let; + FormElement* insert_tag_call; + + if (env.version == GameVersion::Jak3) { + // check for the when: + auto outer_when = dynamic_cast(last_part->body()->at(0)); + if (!outer_when) { + // lg::error(" P no cond-no-else:\n{}\n", last_part->body()->at(0)->to_string(env)); + return nullptr; + } + if (outer_when->entries.size() != 1) { + // lg::error(" P cond-no-else bad entry count"); + return nullptr; + } + auto& entry = outer_when->entries.at(0); + auto matcher = Matcher::op(GenericOpMatcher::fixed(FixedOperatorKind::NEQ), + {Matcher::any_reg(0), Matcher::any_reg(1)}); + auto mr = match(matcher, entry.condition); + if (!mr.matched) { + // lg::error(" P no match: {}\n", entry.condition->to_string(env)); + return nullptr; + } + + if (!var_equal(env, bucket_dst, mr.maps.regs.at(0)) || + !var_equal(env, buf_end_dst, mr.maps.regs.at(1))) { + // lg::error(" P bad vars"); + return nullptr; + } + + auto body = entry.body; + if (body->size() != 2) { + // lg::error(" P bad inner body size"); + return nullptr; + } + + dmatag_let = dynamic_cast(body->at(0)); + insert_tag_call = body->at(1); + } else { + dmatag_let = dynamic_cast(last_part->body()->at(0)); + insert_tag_call = last_part->body()->at(1); + } if (!dmatag_let || dmatag_let->entries().size() != 1 || dmatag_let->body()->size() != 4) { return nullptr; @@ -2334,7 +2378,7 @@ FormElement* rewrite_with_dma_buf_add_bucket(LetElement* in, const Env& env, For DerefTokenMatcher::string("bucket-group")}), Matcher::any(1), Matcher::any_reg(2), Matcher::cast("(pointer dma-tag)", Matcher::any_reg(3))}), - last_part->body()->at(1)); + insert_tag_call); if (!mr_bucket_add_tag_func.matched || !var_equal(env, bucket_dst, mr_bucket_add_tag_func.maps.regs.at(2)) || !var_equal(env, buf_end_dst, mr_bucket_add_tag_func.maps.regs.at(3))) { diff --git a/decompiler/config/jak3/all-types.gc b/decompiler/config/jak3/all-types.gc index 2adfa9cb6..7934fa3ff 100644 --- a/decompiler/config/jak3/all-types.gc +++ b/decompiler/config/jak3/all-types.gc @@ -4085,7 +4085,7 @@ (bucket567 567) (bucket568 568) (bucket569 569) - (bucket570 570) + (particles 570) (bucket571 571) (shadow2 572) (shadow3 573) @@ -25028,6 +25028,7 @@ ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (deftype sprite-vec-data-2d (structure) + "Per-particle data needed for rendering. This is sent to VU1." ((x-y-z-sx vector :inline :offset-assert 0) (flag-rot-sy vector :inline :offset-assert 16) (r-g-b-a vector :inline :offset-assert 32) @@ -25055,6 +25056,7 @@ ) (deftype sprite-array-2d (basic) + "Array of sprite data for all 2D sprites. There are two groups: normal and HUD." ((num-sprites int32 2 :offset-assert 4) ;; guessed by decompiler (num-valid int32 2 :offset-assert 12) ;; guessed by decompiler (vec-data pointer :offset-assert 20) ;; guessed by decompiler @@ -25062,12 +25064,16 @@ (pad uint128 4 :offset-assert 32) ;; guessed by decompiler (data uint128 1 :offset-assert 96) ;; guessed by decompiler ) + (:methods + (new (symbol type int int) _type_) ;; 0 + ) :method-count-assert 9 :size-assert #x70 :flag-assert #x900000070 ) (deftype sprite-vec-data-3d (structure) + "Per-particle data needed for rendering. This is sent to VU1." ((x-y-z-sx vector :inline :offset-assert 0) (qx-qy-qz-sy vector :inline :offset-assert 16) (r-g-b-a vector :inline :offset-assert 32) @@ -25094,12 +25100,16 @@ ) (deftype sprite-array-3d (basic) + "Array of sprite data for all 3D sprites. There are two groups, but only the first is used." ((num-sprites int32 2 :offset-assert 4) ;; guessed by decompiler (num-valid int32 2 :offset-assert 12) ;; guessed by decompiler (vec-data pointer :offset-assert 20) ;; guessed by decompiler (adgif-data (inline-array adgif-shader) :offset-assert 24) ;; guessed by decompiler (data uint128 1 :offset-assert 32) ;; guessed by decompiler ) + (:methods + (new (symbol type int int) _type_) ;; 0 + ) :method-count-assert 9 :size-assert #x30 :flag-assert #x900000030 @@ -25140,7 +25150,7 @@ :flag-assert #xc00000008 (:methods (simple-sprite-system-method-9 () none) ;; 9 ;; (add! (_type_ sprite-glow-data) none) - (simple-sprite-system-method-10 () none) ;; 10 ;; (draw-all-sprites! (_type_ dma-buffer) none) + (draw-all-sprites! (_type_ dma-buffer) none) ;; 10 (simple-sprite-system-method-11 () none) ;; 11 ;; (clear! (_type_) none) ) ) @@ -28983,80 +28993,89 @@ ;; sprite ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -#| (deftype sprite-header (structure) - ((header qword 1 :offset-assert 0) ;; guessed by decompiler - (num-sprites int32 :offset-assert 0) + "Header for the data sent to VU1 renderer." + ((header qword 1 :inline :offset-assert 0) ;; guessed by decompiler + (num-sprites int32 :offset 0) ) :method-count-assert 9 :size-assert #x10 :flag-assert #x900000010 ) -|# -#| (deftype sprite-hvdf-data (structure) - ((data qword 76 :offset-assert 0) ;; guessed by decompiler + "Table of HVDF offsets. The first one is the normal one produced by math-camera. + The remaining 75 can be allocated by the user. + This is only used by Jak 1's weird HUD drawing system, to position HUD elements." + ((data qword 76 :inline :offset-assert 0) ;; guessed by decompiler ) :method-count-assert 9 :size-assert #x4c0 :flag-assert #x9000004c0 ) -|# -#| (deftype sprite-hvdf-control (structure) + "Table of flags indicating if the HVDF control is allocated or not." ((alloc int8 76 :offset-assert 0) ;; guessed by decompiler ) :method-count-assert 9 :size-assert #x4c :flag-assert #x90000004c ) -|# -#| +(defenum sprite-aux-type + :bitfield #f + :type uint32 + (distort 0) + (glow 1) + ) + (deftype sprite-aux-elem (structure) + "Entry for a sprite which should be drawn by a renderer other than the usual sprite." ((aux-type sprite-aux-type :offset-assert 0) ;; guessed by decompiler - (data vector 3 :offset-assert 4) ;; guessed by decompiler - (vec-data sprite-vec-data-2d :offset-assert 4) - (gif-data adgif-shader :offset-assert 8) - (aux-data sparticle-cpuinfo :offset-assert 12) + (data vector 3 :offset-assert 4 :score -1) ;; guessed by decompiler + (vec-data sprite-vec-data-2d :offset 4) + (gif-data adgif-shader :offset 8) + (aux-data sparticle-cpuinfo :offset 12) ) + :pack-me :method-count-assert 9 :size-assert #x10 :flag-assert #x900000010 ) -|# -#| (deftype sprite-aux-list (basic) + "List of sprites that can't be drawn by the normal sprite renderer. + The glow and distort renderers will pull sprites from here." ((num-entries int32 :offset-assert 4) (entry int32 :offset-assert 8) - (UNKNOWN UNKNOWN :offset-assert -1) ;; field could not be read. + (data sprite-aux-elem :dynamic :inline :offset-assert 12) ) + (:methods + (new (symbol type int) _type_) + ) :method-count-assert 9 :size-assert #xc :flag-assert #x90000000c ) -|# -#| (deftype sprite-frame-data (structure) - ((data UNKNOWN 42 :offset-assert 0) - (cdata vector 16 :offset-assert 0) ;; guessed by decompiler - (fdata UNKNOWN 26 :offset-assert 256) - (xy-array vector 8 :offset-assert 0) ;; guessed by decompiler - (st-array vector 4 :offset-assert 128) ;; guessed by decompiler - (xyz-array vector 4 :offset-assert 192) ;; guessed by decompiler - (hmge-scale vector :inline :offset-assert 256) - (consts vector :inline :offset-assert 272) - (pfog0 float :offset-assert 272) - (deg-to-rad float :offset-assert 276) - (min-scale float :offset-assert 280) - (inv-area float :offset-assert 284) - (adgif-giftag qword :inline :offset-assert 288) ;; gs-gif-tag :inline - (sprite-2d-giftag qword :inline :offset-assert 304) ;; gs-gif-tag :inline - (sprite-2d-giftag-2 qword :inline :offset-assert 320) ;; gs-gif-tag :inline + "Data sent to VU1 which is constant over a frame, like giftag templates, camera/fog constants..." + (;;(data UNKNOWN 42 :offset-assert 0) + (cdata vector 16 :inline :offset-assert 0) ;; guessed by decompiler + ;(fdata UNKNOWN 26 :offset-assert 256) + (xy-array vector 8 :inline :offset 0) ;; guessed by decompiler + (st-array vector 4 :inline :offset 128) ;; guessed by decompiler + (xyz-array vector 4 :inline :offset 192) ;; guessed by decompiler + (hmge-scale vector :inline :offset 256) + (consts vector :inline :offset 272) + (pfog0 float :offset 272) + (deg-to-rad float :offset 276) + (min-scale float :offset 280) + (inv-area float :offset 284) + (adgif-giftag gs-gif-tag :inline :offset-assert 288) ;; gs-gif-tag :inline + (sprite-2d-giftag gs-gif-tag :inline :offset-assert 304) ;; gs-gif-tag :inline + (sprite-2d-giftag-2 gs-gif-tag :inline :offset-assert 320) ;; gs-gif-tag :inline (sincos-01 vector :inline :offset-assert 336) (sincos-23 vector :inline :offset-assert 352) (sincos-45 vector :inline :offset-assert 368) @@ -29064,47 +29083,77 @@ (sincos-89 vector :inline :offset-assert 400) (basis-x vector :inline :offset-assert 416) (basis-y vector :inline :offset-assert 432) - (sprite-3d-giftag qword :inline :offset-assert 448) ;; gs-gif-tag :inline - (sprite-3d-giftag-2 qword :inline :offset-assert 464) ;; gs-gif-tag :inline + (sprite-3d-giftag gs-gif-tag :inline :offset-assert 448) ;; gs-gif-tag :inline + (sprite-3d-giftag-2 gs-gif-tag :inline :offset-assert 464) ;; gs-gif-tag :inline (screen-shader adgif-shader :inline :offset-assert 480) - (inv-hmge-scale vector :inline :offset-assert 576) + (inv-hmge-scale vector :inline :offset 576) (stq-offset vector :inline :offset-assert 592) (stq-scale vector :inline :offset-assert 608) (rgba-plain qword :inline :offset-assert 624) - (warp-giftag qword :inline :offset-assert 640) ;; gs-gif-tag :inline + (warp-giftag gs-gif-tag :inline :offset-assert 640) ;; gs-gif-tag :inline (fog-clamp vector :inline :offset-assert 656) - (fog-min float :offset-assert 656) - (fog-max float :offset-assert 660) - (max-scale float :offset-assert 664) + (fog-min float :offset 656 :score 1) + (fog-max float :offset 660 :score 1) + (max-scale float :offset 664 :score 1) ) :method-count-assert 9 :size-assert #x2a0 :flag-assert #x9000002a0 ) -|# -;; (define-extern sprite-setup-header function) ;; (function sprite-header int none) -;; (define-extern clear-sprite-aux-list function) ;; (function none) -;; (define-extern add-to-sprite-aux-list function) ;; (function sparticle-system sparticle-cpuinfo sprite-vec-data-3d uint none) -;; (define-extern sprite-setup-frame-data function) ;; (function sprite-frame-data uint none) -;; (define-extern sprite-vu1-block object) ;; vu-function -;; (define-extern sprite-set-3d-quaternion! function) ;; (function sprite-vec-data-3d quaternion quaternion) -;; (define-extern sprite-get-3d-quaternion! function) ;; (function quaternion sprite-vec-data-3d quaternion) -;; (define-extern sprite-add-matrix-data function) ;; (function dma-buffer uint none) -;; (define-extern sprite-add-frame-data function) ;; (function dma-buffer uint none) -;; (define-extern sprite-add-2d-chunk function) ;; (function sprite-array-2d int int dma-buffer int none) -;; (define-extern sprite-add-2d-all function) ;; (function sprite-array-2d dma-buffer int none) -;; (define-extern sprite-add-3d-chunk function) ;; (function sprite-array-3d int int dma-buffer none) -;; (define-extern sprite-add-3d-all function) ;; (function sprite-array-3d dma-buffer int none) -;; (define-extern sprite-draw function) ;; (function display none) -;; (define-extern sprite-allocate-user-hvdf function) ;; (function int) -(define-extern sprite-release-user-hvdf (function int none)) -;; (define-extern sprite-get-user-hvdf function) ;; (function int vector) -;; (define-extern *sprite-hvdf-data* object) ;; sprite-hvdf-data -;; (define-extern *sprite-hvdf-control* object) ;; sprite-hvdf-control -;; (define-extern *sprite-aux-list* object) ;; sprite-aux-list -;; (define-extern *sprite-array-2d* object) ;; sprite-array-2d -;; (define-extern *sprite-array-3d* object) ;; sprite-array-3d +(define-extern sprite-setup-header + "Initialize VU1 data header with number of sprites." + (function sprite-header int none)) +(define-extern clear-sprite-aux-list + "Reset all pending sprites in the aux-list." + (function none)) +(define-extern add-to-sprite-aux-list (function sparticle-system sparticle-cpuinfo sprite-vec-data-3d uint none)) +(define-extern sprite-setup-frame-data (function sprite-frame-data uint none)) +(define-extern sprite-vu1-block vu-function) +(define-extern sprite-set-3d-quaternion! + "Set the quaternion of the vec-data." + (function sprite-vec-data-3d quaternion quaternion)) +(define-extern sprite-get-3d-quaternion! + "Get the quaternion from the vec data." + (function quaternion sprite-vec-data-3d quaternion)) +(define-extern sprite-add-matrix-data + "Set up matrix data DMA to VU1. + This changes per sprite mode, but remains constant for all sprites in that mode." + (function dma-buffer uint none)) +(define-extern sprite-add-frame-data + "Set up frame data DMA to VU1." + (function dma-buffer uint none)) +(define-extern sprite-add-2d-chunk + "Set up DMA for a single chunk of 2D sprites." + (function sprite-array-2d int int dma-buffer int none)) +(define-extern sprite-add-2d-all + "Generate DMA for all chunks." + (function sprite-array-2d dma-buffer int none)) +(define-extern sprite-add-3d-chunk + "Generate DMA for a single chunk of 3D sprites." + (function sprite-array-3d int int dma-buffer none)) +(define-extern sprite-add-3d-all + "Generate DMA for all chunks of 3D sprites." + (function sprite-array-3d dma-buffer int none)) +(define-extern sprite-draw + "Top-level sprite DMA generation function. + Takes the sprites from sparticle, and draws them with + normal sprite, sprite-distort, sprite-glow, and simple-sprite-system" + (function display none)) +(define-extern sprite-allocate-user-hvdf + "Allocate an HVDF entry. Returns the index in the hvdf-data array." + (function int)) +(define-extern sprite-release-user-hvdf + "Free an HVDF entry." + (function int none)) +(define-extern sprite-get-user-hvdf + "Get the HVDF vector." + (function int vector)) +(define-extern *sprite-hvdf-data* sprite-hvdf-data) +(define-extern *sprite-hvdf-control* sprite-hvdf-control) +(define-extern *sprite-aux-list* sprite-aux-list) +(define-extern *sprite-array-2d* sprite-array-2d) +(define-extern *sprite-array-3d* sprite-array-3d) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; sprite-distort ;; @@ -29128,8 +29177,8 @@ ;; (define-extern *sprite-distorter-sine-tables* object) ;; sprite-distorter-sine-tables (define-extern sprite-distorter-generate-tables (function none)) ;; (define-extern sprite-distort-vu1-block object) ;; vu-function -;; (define-extern sprite-init-distorter function) ;; (function dma-buffer none) -;; (define-extern sprite-draw-distorters function) ;; (function dma-buffer none) +(define-extern sprite-init-distorter (function dma-buffer none)) +(define-extern sprite-draw-distorters (function dma-buffer none)) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; sprite-glow ;; @@ -29258,13 +29307,13 @@ ;; (define-extern *sprite-glow-template* object) ;; sprite-glow-template ;; (define-extern sprite-glow-vu1-block object) ;; vu-function ;; (define-extern sprite-glow-init-consts function) ;; (function sprite-glow-consts none) -;; (define-extern sprite-glow-init-engine function) ;; (function dma-buffer none) +(define-extern sprite-glow-init-engine (function dma-buffer none)) ;; (define-extern *sprite-glow-dma-packet-data* object) ;; sprite-glow-dma-packet-data ;; (define-extern sprite-glow-add-sprite function) ;; (function dma-buffer sprite-vec-data-2d float float float adgif-shader none) ;; (define-extern sprite-glow-add-simple-sprite function) ;; (function dma-buffer sprite-glow-dma-packet-data sprite-glow-data pointer none) -;; (define-extern sprite-glow-draw function) ;; (function dma-buffer none) +(define-extern sprite-glow-draw (function dma-buffer none)) ;; (define-extern add-shader-to-dma function) ;; (function dma-buffer adgif-shader) -;; (define-extern *simple-sprite-system* object) ;; simple-sprite-system +(define-extern *simple-sprite-system* simple-sprite-system) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; debug-sphere ;; diff --git a/decompiler/config/jak3/ntsc_v1/type_casts.jsonc b/decompiler/config/jak3/ntsc_v1/type_casts.jsonc index 5a1babc0e..b1ac74fda 100644 --- a/decompiler/config/jak3/ntsc_v1/type_casts.jsonc +++ b/decompiler/config/jak3/ntsc_v1/type_casts.jsonc @@ -2052,5 +2052,35 @@ [27, "a0", "process-focusable"], [37, "a0", "process-focusable"] ], - "(code die eco)": [[54, "v0", "float"]] + "(code die eco)": [[54, "v0", "float"]], + "sprite-add-matrix-data": [ + [[3, 16], "a2", "dma-packet"], + [[17, 28], "a1", "matrix"], + [[46, 58], "a2", "dma-packet"], + [[70, 97], "a2", "vector"], + [[98, 113], "a1", "vector"], + [[119, 133], "a1", "vector"] + ], + "sprite-add-frame-data": [[[3, 17], "a0", "dma-packet"]], + "sprite-add-2d-chunk": [ + [[7, 21], "a0", "dma-packet"], + [[33, 53], "a0", "dma-packet"], + [[57, 77], "a0", "dma-packet"], + [[78, 88], "v1", "dma-packet"], + [65, "a3", "int"] + ], + "sprite-add-3d-chunk": [ + [[7, 21], "a0", "dma-packet"], + [[33, 53], "a0", "dma-packet"], + [[57, 77], "a0", "dma-packet"], + [[78, 88], "v1", "dma-packet"], + [65, "a3", "int"] + ], + "sprite-draw": [ + [[71, 83], "a0", "dma-packet"], + [[85, 93], "a0", "dma-packet"], + [[109, 116], "a0", "dma-packet"], + [[127, 134], "a0", "dma-packet"], + [[148, 155], "a0", "dma-packet"] + ] } diff --git a/game/graphics/opengl_renderer/sprite/Sprite3.cpp b/game/graphics/opengl_renderer/sprite/Sprite3.cpp index cb7d04050..173b6abe7 100644 --- a/game/graphics/opengl_renderer/sprite/Sprite3.cpp +++ b/game/graphics/opengl_renderer/sprite/Sprite3.cpp @@ -830,6 +830,15 @@ void Sprite3::do_block_common(SpriteMode mode, auto& vert1 = m_vertices_3d.at(start_vtx_id + 0); + if (render_state->version == GameVersion::Jak3) { + auto flag = m_vec_data_2d[sprite_idx].flag(); + if ((flag & 0x10) || (flag & 0x20)) { + // these flags mean we need to swap vertex order around - not yet implemented since it's too + // hard to get right without this code running. + ASSERT_NOT_REACHED(); + } + } + vert1.xyz_sx = m_vec_data_2d[sprite_idx].xyz_sx; vert1.quat_sy = m_vec_data_2d[sprite_idx].flag_rot_sy; vert1.rgba = m_vec_data_2d[sprite_idx].rgba / 255; diff --git a/goal_src/jak3/engine/dma/dma-buffer.gc b/goal_src/jak3/engine/dma/dma-buffer.gc index c337ee356..c8afef49f 100644 --- a/goal_src/jak3/engine/dma/dma-buffer.gc +++ b/goal_src/jak3/engine/dma/dma-buffer.gc @@ -280,39 +280,42 @@ (defmacro with-dma-bucket (bindings &rest body) "Start a new dma-bucket in body that will be finished at the end. - The bindings are the dma-buffer, dma-bucket and bucket-id respectively." + The bindings are the dma-buffer, dma-bucket and bucket-id respectively." (let ((buf (first bindings)) (bucket (second bindings)) (bucket-id (third bindings)) ) - (with-gensyms (buf-start bucket-edge pkt) - `(let ((,buf-start (-> ,buf base))) + (with-gensyms (buf-start bucket-edge pkt) + `(let ((,buf-start (-> ,buf base))) - ,@body + ,@body - ;; we end the chain with a next. The bucket system will patch the next chain to this, - ;; and then patch all the buckets togehter before sending the DMA. - (let ((,bucket-edge (the (pointer dma-tag) (-> ,buf base)))) - (let ((,pkt (the-as dma-packet (-> ,buf base)))) + ;; we end the chain with a next. The bucket system will patch the next chain to this, + ;; and then patch all the buckets togehter before sending the DMA. + (let ((,bucket-edge (the (pointer dma-tag) (-> ,buf base)))) - (set! (-> ,pkt dma) (new 'static 'dma-tag :id (dma-tag-id next))) - (set! (-> ,pkt vif0) (new 'static 'vif-tag :cmd (vif-cmd nop))) - (set! (-> ,pkt vif1) (new 'static 'vif-tag :cmd (vif-cmd nop))) + ;; if nothing was added, skip the tag entirely. + (when (!= ,bucket-edge ,buf-start) + (let ((,pkt (the-as dma-packet (-> ,buf base)))) - (set! (-> ,buf base) (&+ (the-as pointer ,pkt) (size-of dma-packet))) + (set! (-> ,pkt dma) (new 'static 'dma-tag :id (dma-tag-id next))) + (set! (-> ,pkt vif0) (new 'static 'vif-tag :cmd (vif-cmd nop))) + (set! (-> ,pkt vif1) (new 'static 'vif-tag :cmd (vif-cmd nop))) - ) - (dma-bucket-insert-tag ,bucket ,bucket-id - ,buf-start ;; the first thing in this chain, bucket will patch previous to this - ,bucket-edge ;; end of this chain (ptr to next tag) - ) - ) - ) - ) + (set! (-> ,buf base) (&+ (the-as pointer ,pkt) (size-of dma-packet))) + ) + (dma-bucket-insert-tag ,bucket ,bucket-id + ,buf-start ;; the first thing in this chain, bucket will patch previous to this + ,bucket-edge ;; end of this chain (ptr to next tag) + ) + ) + ) + ) ) + ) ) (defmacro with-dma-buffer-add-bucket (bindings &key (bucket-group (-> (current-frame) bucket-group)) &rest body) diff --git a/goal_src/jak3/engine/gfx/sprite/simple-sprite-h.gc b/goal_src/jak3/engine/gfx/sprite/simple-sprite-h.gc index 4b5a615cb..8c7f670e8 100644 --- a/goal_src/jak3/engine/gfx/sprite/simple-sprite-h.gc +++ b/goal_src/jak3/engine/gfx/sprite/simple-sprite-h.gc @@ -42,7 +42,7 @@ ) (:methods (simple-sprite-system-method-9 () none) - (simple-sprite-system-method-10 () none) + (draw-all-sprites! (_type_ dma-buffer) none) (simple-sprite-system-method-11 () none) ) ) diff --git a/goal_src/jak3/engine/gfx/sprite/sprite-h.gc b/goal_src/jak3/engine/gfx/sprite/sprite-h.gc index e35d83b77..3db780afe 100644 --- a/goal_src/jak3/engine/gfx/sprite/sprite-h.gc +++ b/goal_src/jak3/engine/gfx/sprite/sprite-h.gc @@ -5,9 +5,15 @@ ;; name in dgo: sprite-h ;; dgos: GAME +(define-extern sprite-init-distorter (function dma-buffer none)) +(define-extern sprite-draw-distorters (function dma-buffer none)) +(define-extern sprite-glow-init-engine (function dma-buffer none)) +(define-extern sprite-glow-draw (function dma-buffer none)) + ;; DECOMP BEGINS (deftype sprite-vec-data-2d (structure) + "Per-particle data needed for rendering. This is sent to VU1." ((x-y-z-sx vector :inline) (flag-rot-sy vector :inline) (r-g-b-a vector :inline) @@ -33,6 +39,7 @@ (deftype sprite-array-2d (basic) + "Array of sprite data for all 2D sprites. There are two groups: normal and HUD." ((num-sprites int32 2) (num-valid int32 2) (vec-data pointer) @@ -40,10 +47,14 @@ (pad uint128 4) (data uint128 1) ) + (:methods + (new (symbol type int int) _type_) + ) ) (deftype sprite-vec-data-3d (structure) + "Per-particle data needed for rendering. This is sent to VU1." ((x-y-z-sx vector :inline) (qx-qy-qz-sy vector :inline) (r-g-b-a vector :inline) @@ -68,10 +79,14 @@ (deftype sprite-array-3d (basic) + "Array of sprite data for all 3D sprites. There are two groups, but only the first is used." ((num-sprites int32 2) (num-valid int32 2) (vec-data pointer) (adgif-data (inline-array adgif-shader)) (data uint128 1) ) + (:methods + (new (symbol type int int) _type_) + ) ) diff --git a/goal_src/jak3/engine/gfx/sprite/sprite.gc b/goal_src/jak3/engine/gfx/sprite/sprite.gc index bd01f186e..a39b78b2a 100644 --- a/goal_src/jak3/engine/gfx/sprite/sprite.gc +++ b/goal_src/jak3/engine/gfx/sprite/sprite.gc @@ -5,5 +5,776 @@ ;; name in dgo: sprite ;; dgos: GAME +(defenum sprite-aux-type + :bitfield #f + :type uint32 + (distort 0) + (glow 1) + ) + +(define-extern *sprite-hvdf-data* sprite-hvdf-data) +(define-extern *sprite-hvdf-control* sprite-hvdf-control) +(define-extern *sprite-aux-list* sprite-aux-list) +(define-extern *sprite-array-2d* sprite-array-2d) +(define-extern *sprite-array-3d* sprite-array-3d) +(define-extern *simple-sprite-system* simple-sprite-system) + ;; DECOMP BEGINS +(deftype sprite-header (structure) + "Header for the data sent to VU1 renderer." + ((header qword 1 :inline) + (num-sprites int32 :overlay-at (-> header 0 data 0)) + ) + ) + + +(defun sprite-setup-header ((arg0 sprite-header) (arg1 int)) + "Initialize VU1 data header with number of sprites." + (set! (-> arg0 num-sprites) arg1) + (none) + ) + +(deftype sprite-hvdf-data (structure) + "Table of HVDF offsets. The first one is the normal one produced by math-camera. +The remaining 75 can be allocated by the user. +This is only used by Jak 1's weird HUD drawing system, to position HUD elements." + ((data qword 76 :inline) + ) + ) + + +(deftype sprite-hvdf-control (structure) + "Table of flags indicating if the HVDF control is allocated or not." + ((alloc int8 76) + ) + ) + + +(deftype sprite-aux-elem (structure) + "Entry for a sprite which should be drawn by a renderer other than the usual sprite." + ((aux-type sprite-aux-type) + (data vector 3) + (vec-data sprite-vec-data-2d :overlay-at (-> data 0)) + (gif-data adgif-shader :overlay-at (-> data 1)) + (aux-data sparticle-cpuinfo :overlay-at (-> data 2)) + ) + :pack-me + ) + + +(deftype sprite-aux-list (basic) + "List of sprites that can't be drawn by the normal sprite renderer. +The glow and distort renderers will pull sprites from here." + ((num-entries int32) + (entry int32) + (data sprite-aux-elem :inline :dynamic) + ) + (:methods + (new (symbol type int) _type_) + ) + ) + + +(defmethod new sprite-aux-list ((allocation symbol) (type-to-make type) (arg0 int)) + (let ((v0-0 (object-new allocation type-to-make (the-as int (+ (-> type-to-make size) (* arg0 16)))))) + (set! (-> v0-0 num-entries) arg0) + (set! (-> v0-0 entry) 0) + v0-0 + ) + ) + +;; WARN: Return type mismatch symbol vs sprite-aux-list. + +(defun clear-sprite-aux-list () + "Reset all pending sprites in the aux-list." + (set! (-> *sprite-aux-list* entry) 0) + 0 + (none) + ) + +(defun add-to-sprite-aux-list ((arg0 sparticle-system) (arg1 sparticle-cpuinfo) (arg2 sprite-vec-data-3d) (arg3 uint)) + (let ((s2-0 (-> arg1 sp-func))) + (if (and (nonzero? s2-0) (not (paused?))) + (s2-0 arg0 arg1 arg2 arg3) + ) + ) + (let ((v1-3 *sprite-aux-list*)) + (when (< (-> v1-3 entry) (-> v1-3 num-entries)) + (cond + ((logtest? (-> arg1 flags) (sp-cpuinfo-flag distort)) + (set! (-> v1-3 data (-> v1-3 entry) aux-type) (sprite-aux-type distort)) + (set! (-> v1-3 data (-> v1-3 entry) vec-data) (-> arg1 sprite)) + (+! (-> v1-3 entry) 1) + (set! (-> arg2 r-g-b-a w) 0.0) + ) + ((logtest? (-> arg1 flags) (sp-cpuinfo-flag glow)) + (let ((a0-18 (-> arg0 cpuinfo-table arg3)) + (a1-11 (-> v1-3 data (-> v1-3 entry))) + ) + (set! (-> a1-11 aux-type) (sprite-aux-type glow)) + (set! (-> a1-11 vec-data) (-> arg1 sprite)) + (set! (-> a1-11 gif-data) (-> arg1 adgif)) + (set! (-> a1-11 aux-data) a0-18) + ) + (+! (-> v1-3 entry) 1) + (set! (-> arg2 qx-qy-qz-sy y) (the-as float #xffffffff)) + ) + ) + ) + ) + 0 + (none) + ) + +(deftype sprite-frame-data (structure) + "Data sent to VU1 which is constant over a frame, like giftag templates, camera/fog constants..." + ((cdata vector 16 :inline) + (xy-array vector 8 :inline :overlay-at (-> cdata 0)) + (st-array vector 4 :inline :overlay-at (-> cdata 8)) + (xyz-array vector 4 :inline :overlay-at (-> cdata 12)) + (hmge-scale vector :inline :offset 256) + (consts vector :inline :offset 272) + (pfog0 float :overlay-at (-> consts x)) + (deg-to-rad float :overlay-at (-> consts y)) + (min-scale float :overlay-at (-> consts z)) + (inv-area float :overlay-at (-> consts w)) + (adgif-giftag gs-gif-tag :inline) + (sprite-2d-giftag gs-gif-tag :inline) + (sprite-2d-giftag-2 gs-gif-tag :inline) + (sincos-01 vector :inline) + (sincos-23 vector :inline) + (sincos-45 vector :inline) + (sincos-67 vector :inline) + (sincos-89 vector :inline) + (basis-x vector :inline) + (basis-y vector :inline) + (sprite-3d-giftag gs-gif-tag :inline) + (sprite-3d-giftag-2 gs-gif-tag :inline) + (screen-shader adgif-shader :inline) + (inv-hmge-scale vector :inline :offset 576) + (stq-offset vector :inline) + (stq-scale vector :inline) + (rgba-plain qword :inline) + (warp-giftag gs-gif-tag :inline) + (fog-clamp vector :inline) + (fog-min float :overlay-at (-> fog-clamp data 0)) + (fog-max float :overlay-at (-> fog-clamp data 1)) + (max-scale float :overlay-at (-> fog-clamp data 2)) + ) + ) + + +;; WARN: Return type mismatch float vs none. +(defun sprite-setup-frame-data ((arg0 sprite-frame-data) (arg1 uint)) + (set! (-> arg0 hmge-scale quad) (-> *math-camera* hmge-scale quad)) + (set! (-> arg0 inv-hmge-scale quad) (-> *math-camera* inv-hmge-scale quad)) + (set! (-> arg0 consts x) (-> *math-camera* pfog0)) + (set! (-> arg0 consts y) 0.000095873795) + (set! (-> arg0 adgif-giftag tag) (new 'static 'gif-tag64 :nloop #x1 :nreg #x5)) + (set! (-> arg0 adgif-giftag 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) + ) + ) + (set! (-> arg0 sprite-2d-giftag tag) + (new 'static 'gif-tag64 + :nloop #x1 + :eop #x1 + :pre #x1 + :prim (new 'static 'gs-prim :prim (gs-prim-type tri-fan) :tme #x1 :fge #x1 :abe #x1) + :nreg #x9 + ) + ) + (set! (-> arg0 sprite-2d-giftag 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) + ) + ) + (set! (-> arg0 sprite-2d-giftag-2 tag) + (new 'static 'gif-tag64 + :nloop #x1 + :eop #x1 + :pre #x1 + :prim (new 'static 'gs-prim :prim (gs-prim-type tri-fan) :tme #x1 :abe #x1) + :nreg #x9 + ) + ) + (set! (-> arg0 sprite-2d-giftag-2 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) + ) + ) + (set! (-> arg0 sprite-3d-giftag tag) + (new 'static 'gif-tag64 + :nloop #x4 + :eop #x1 + :pre #x1 + :prim (new 'static 'gs-prim :prim (gs-prim-type tri-fan) :tme #x1 :fge #x1 :abe #x1) + :nreg #x3 + ) + ) + (set! (-> arg0 sprite-3d-giftag regs) + (new 'static 'gif-tag-regs :regs0 (gif-reg-id st) :regs1 (gif-reg-id rgbaq) :regs2 (gif-reg-id xyzf2)) + ) + (set! (-> arg0 sprite-3d-giftag-2 tag) + (new 'static 'gif-tag64 + :nloop #x4 + :eop #x1 + :pre #x1 + :prim (new 'static 'gs-prim :prim (gs-prim-type tri-fan) :tme #x1 :abe #x1) + :nreg #x3 + ) + ) + (set! (-> arg0 sprite-3d-giftag-2 regs) + (new 'static 'gif-tag-regs :regs0 (gif-reg-id st) :regs1 (gif-reg-id rgbaq) :regs2 (gif-reg-id xyzf2)) + ) + (set! (-> arg0 warp-giftag tag) (new 'static 'gif-tag64 + :nloop #x1 + :eop #x1 + :pre #x1 + :prim (new 'static 'gs-prim :prim (gs-prim-type tri) :tme #x1 :abe #x1) + :nreg #xc + ) + ) + (set! (-> arg0 warp-giftag regs) (new 'static 'gif-tag-regs + :regs0 (gif-reg-id st) + :regs1 (gif-reg-id rgbaq) + :regs2 (gif-reg-id xyzf2) + :regs3 (gif-reg-id st) + :regs4 (gif-reg-id rgbaq) + :regs5 (gif-reg-id xyzf2) + :regs6 (gif-reg-id st) + :regs7 (gif-reg-id rgbaq) + :regs8 (gif-reg-id xyzf2) + ) + ) + (set! (-> arg0 screen-shader prims 1) (gs-reg64 tex0-1)) + (set! (-> arg0 screen-shader tex0) (new 'static 'gs-tex0 :tbw #x8 :tw #xa :th #x8 :tbp0 (* arg1 32))) + (set! (-> arg0 screen-shader prims 3) (gs-reg64 tex1-1)) + (set! (-> arg0 screen-shader tex1) (new 'static 'gs-tex1 :mmag #x1 :mmin #x1)) + (set! (-> arg0 screen-shader prims 5) (gs-reg64 miptbp1-1)) + (set! (-> arg0 screen-shader miptbp1) (new 'static 'gs-miptbp)) + (set! (-> arg0 screen-shader clamp-reg) (gs-reg64 clamp-1)) + (set! (-> arg0 screen-shader clamp) (new 'static 'gs-clamp + :wms (gs-tex-wrap-mode region-clamp) + :wmt (gs-tex-wrap-mode region-clamp) + :maxu #x27f + :maxv #xef + ) + ) + (set! (-> arg0 screen-shader prims 9) (gs-reg64 alpha-1)) + (set! (-> arg0 screen-shader alpha) (new 'static 'gs-alpha :b #x1 :d #x1)) + (set! (-> arg0 sincos-01 z) 0.999998) + (set! (-> arg0 sincos-23 z) -0.16666014) + (set! (-> arg0 sincos-45 z) 0.008326521) + (set! (-> arg0 sincos-67 z) -0.0001956241) + (set! (-> arg0 sincos-89 z) 0.0000023042373) + (set! (-> arg0 sincos-01 w) 1.0) + (set! (-> arg0 sincos-23 w) -0.49998003) + (set! (-> arg0 sincos-45 w) 0.041620404) + (set! (-> arg0 sincos-67 w) -0.0013636408) + (set! (-> arg0 sincos-89 w) 0.000020170546) + (set! (-> arg0 basis-x quad) (the-as uint128 0)) + (set! (-> arg0 basis-x x) (- (-> *math-camera* perspective rvec x))) + (set! (-> arg0 basis-y quad) (the-as uint128 0)) + (set! (-> arg0 basis-y y) (- (-> *math-camera* perspective uvec y))) + (set! (-> arg0 consts z) (sqrtf (* (/ 1.0 (-> arg0 basis-x x)) (/ 1.0 (-> arg0 basis-y y))))) + (set! (-> arg0 consts w) (/ 1.0 (* (-> arg0 consts z) (-> arg0 consts z)))) + (set-vector! (-> arg0 cdata 0) -0.5 -0.5 0.0 0.0) + (set-vector! (-> arg0 cdata 1) 0.5 -0.5 0.0 0.0) + (set-vector! (-> arg0 cdata 2) 0.5 0.5 0.0 0.0) + (set-vector! (-> arg0 cdata 3) -0.5 0.5 0.0 0.0) + (set-vector! (-> arg0 cdata 4) 0.0 -0.5 0.0 0.0) + (set-vector! (-> arg0 cdata 5) 1.0 -0.5 0.0 0.0) + (set-vector! (-> arg0 cdata 6) 1.0 0.5 0.0 0.0) + (set-vector! (-> arg0 cdata 7) 0.0 0.5 0.0 0.0) + (set-vector! (-> arg0 st-array 0) 0.0 0.0 1.0 0.0) + (set-vector! (-> arg0 cdata 9) 1.0 0.0 1.0 0.0) + (set-vector! (-> arg0 cdata 10) 1.0 1.0 1.0 0.0) + (set-vector! (-> arg0 cdata 11) 0.0 1.0 1.0 0.0) + (set-vector! (-> arg0 xyz-array 0) -0.5 0.0 -0.5 0.0) + (set-vector! (-> arg0 cdata 13) 0.5 0.0 -0.5 0.0) + (set-vector! (-> arg0 cdata 14) 0.5 0.0 0.5 0.0) + (set-vector! (-> arg0 cdata 15) -0.5 0.0 0.5 0.0) + (set-vector! (-> arg0 stq-offset) -1792.0 -1840.0 0.0 0.0) + (set-vector! (-> arg0 stq-scale) 0.0009765625 0.00390625 1.0 1.0) + (set! (-> arg0 rgba-plain vector4w x) 128) + (set! (-> arg0 rgba-plain vector4w y) 128) + (set! (-> arg0 rgba-plain vector4w z) 128) + (set! (-> arg0 rgba-plain vector4w w) 64) + (set! (-> arg0 fog-min) (-> *math-camera* fog-min)) + (set! (-> arg0 fog-max) (-> *math-camera* fog-max)) + (set! (-> arg0 max-scale) 2048.0) + (none) + ) + +(define sprite-vu1-block (new 'static 'vu-function :length #x37b :qlength #x1be)) + +(defmethod new sprite-array-2d ((allocation symbol) (type-to-make type) (arg0 int) (arg1 int)) + (let* ((v1-0 (+ arg0 arg1)) + (s4-0 (* 3 v1-0)) + (a2-3 (* 5 v1-0)) + (v0-0 (object-new allocation type-to-make (the-as int (+ (-> type-to-make size) (* (+ a2-3 -1 s4-0) 16))))) + ) + (set! (-> v0-0 num-sprites 0) arg0) + (set! (-> v0-0 num-sprites 1) arg1) + (set! (-> v0-0 num-valid 0) 0) + (set! (-> v0-0 num-valid 1) 0) + (set! (-> v0-0 vec-data) (-> v0-0 data)) + (set! (-> v0-0 adgif-data) (the-as (inline-array adgif-shader) (&-> v0-0 data s4-0))) + v0-0 + ) + ) + +(defmethod new sprite-array-3d ((allocation symbol) (type-to-make type) (arg0 int) (arg1 int)) + (let* ((v1-0 (+ arg0 arg1)) + (s4-0 (* 3 v1-0)) + (a2-3 (* 5 v1-0)) + (v0-0 (object-new allocation type-to-make (the-as int (+ (-> type-to-make size) (* (+ a2-3 -1 s4-0) 16))))) + ) + (set! (-> v0-0 num-sprites 0) arg0) + (set! (-> v0-0 num-sprites 1) arg1) + (set! (-> v0-0 num-valid 0) 0) + (set! (-> v0-0 num-valid 1) 0) + (set! (-> v0-0 vec-data) (-> v0-0 data)) + (set! (-> v0-0 adgif-data) (the-as (inline-array adgif-shader) (&-> v0-0 data s4-0))) + v0-0 + ) + ) + +(defun sprite-set-3d-quaternion! ((arg0 sprite-vec-data-3d) (arg1 quaternion)) + "Set the quaternion of the vec-data." + (local-vars (v1-0 float) (v1-1 float)) + (rlet ((vf0 :class vf) + (vf1 :class vf) + (vf2 :class vf) + ) + (init-vf0-vector) + (cond + ((< (-> arg1 w) 0.0) + (.lvf vf1 (&-> arg0 qx-qy-qz-sy quad)) + (.lvf vf2 (&-> arg1 quad)) + (.sub.vf vf1 vf0 vf2 :mask #b111) + (.svf (&-> arg0 qx-qy-qz-sy quad) vf1) + (.mov v1-0 vf1) + ) + (else + (.lvf vf1 (&-> arg0 qx-qy-qz-sy quad)) + (.lvf vf2 (&-> arg1 quad)) + (.add.vf vf1 vf0 vf2 :mask #b111) + (.svf (&-> arg0 qx-qy-qz-sy quad) vf1) + (.mov v1-1 vf1) + ) + ) + arg1 + ) + ) + +(defun sprite-get-3d-quaternion! ((arg0 quaternion) (arg1 sprite-vec-data-3d)) + "Get the quaternion from the vec data." + (let ((f0-0 (-> arg1 qx-qy-qz-sy x)) + (f1-0 (-> arg1 qx-qy-qz-sy y)) + (f2-0 (-> arg1 qx-qy-qz-sy z)) + ) + (set! (-> arg0 x) f0-0) + (set! (-> arg0 y) f1-0) + (set! (-> arg0 z) f2-0) + (set! (-> arg0 w) (sqrtf (- (- (- 1.0 (* f2-0 f2-0)) (* f1-0 f1-0)) (* f0-0 f0-0)))) + ) + arg0 + ) + +(defun sprite-add-matrix-data ((arg0 dma-buffer) (arg1 uint)) + "Set up matrix data DMA to VU1. + This changes per sprite mode, but remains constant for all sprites in that mode." + (let ((v1-0 900)) + (cond + ((zero? arg1) + (let* ((a1-1 arg0) + (a2-1 (the-as dma-packet (-> a1-1 base))) + ) + (set! (-> a2-1 dma) (new 'static 'dma-tag :qwc #x5 :id (dma-tag-id cnt))) + (set! (-> a2-1 vif0) (new 'static 'vif-tag :imm #x404 :cmd (vif-cmd stcycl))) + (set! (-> a2-1 vif1) (new 'static 'vif-tag :num #x5 :cmd (vif-cmd unpack-v4-32) :imm (shr (shl v1-0 54) 54))) + (set! (-> a1-1 base) (the-as pointer (&+ a2-1 16))) + ) + (let* ((a1-2 (the-as matrix (-> arg0 base))) + (t1-0 (-> *math-camera* camera-temp)) + (a2-4 (-> t1-0 rvec quad)) + (a3-4 (-> t1-0 uvec quad)) + (t0-4 (-> t1-0 fvec quad)) + (t1-1 (-> t1-0 trans quad)) + ) + (set! (-> a1-2 rvec quad) a2-4) + (set! (-> a1-2 uvec quad) a3-4) + (set! (-> a1-2 fvec quad) t0-4) + (set! (-> a1-2 trans quad) t1-1) + ) + (&+! (-> arg0 base) 64) + (let ((v1-1 (+ v1-0 4))) + (set! (-> (the-as (pointer uint128) (-> arg0 base))) (-> *math-camera* hvdf-off quad)) + (&+! (-> arg0 base) 16) + (+ v1-1 1) + ) + ) + ((= arg1 1) + (let* ((a1-10 arg0) + (a2-9 (the-as dma-packet (-> a1-10 base))) + ) + (set! (-> a2-9 dma) (new 'static 'dma-tag :qwc #x50 :id (dma-tag-id cnt))) + (set! (-> a2-9 vif0) (new 'static 'vif-tag :imm #x404 :cmd (vif-cmd stcycl))) + (set! (-> a2-9 vif1) (new 'static 'vif-tag :num #x50 :cmd (vif-cmd unpack-v4-32) :imm (shr (shl v1-0 54) 54))) + (set! (-> a1-10 base) (the-as pointer (&+ a2-9 16))) + ) + (let ((a1-11 (-> arg0 base)) + (f1-0 (-> *math-camera* perspective rvec x)) + (f2-0 (-> *math-camera* perspective uvec y)) + (f0-1 (* -1.9996 (-> *math-camera* perspective rvec x))) + ) + (set-vector! (the-as vector (&+ a1-11 0)) f0-1 0.0 0.0 0.0) + (set-vector! (the-as vector (&+ a1-11 16)) 0.0 (- (* (/ f2-0 f1-0) f0-1)) 0.0 0.0) + (set-vector! (the-as vector (&+ a1-11 32)) 0.0 0.0 (- f0-1) 0.0) + (set-vector! + (the-as vector (&+ a1-11 48)) + 0.0 + 0.0 + (* 500000000.0 f0-1) + (* 60.0 f0-1 (-> *math-camera* pfog0)) + ) + ) + (&+! (-> arg0 base) 64) + (let ((v1-2 (+ v1-0 4))) + (let ((a1-16 (the-as vector (-> arg0 base)))) + (set! (-> a1-16 quad) (-> *math-camera* hvdf-off quad)) + (set! (-> a1-16 x) 2048.0) + (set! (-> a1-16 y) 2048.0) + (set! (-> a1-16 z) (-> *math-camera* hvdf-off z)) + ) + (&+! (-> arg0 base) 16) + (let ((v1-3 (+ v1-2 1))) + (dotimes (a1-20 75) + (set! (-> (the-as (pointer uint128) (-> arg0 base))) (-> *sprite-hvdf-data* data (+ a1-20 1) quad)) + (&+! (-> arg0 base) 16) + (+! v1-3 1) + ) + ) + ) + ) + ) + ) + 0 + (none) + ) + +;; WARN: Return type mismatch pointer vs none. +(defun sprite-add-frame-data ((arg0 dma-buffer) (arg1 uint)) + "Set up frame data DMA to VU1." + (let ((s5-0 42)) + (let* ((v1-0 arg0) + (a0-1 (the-as dma-packet (-> v1-0 base))) + ) + (set! (-> a0-1 dma) (new 'static 'dma-tag :id (dma-tag-id cnt) :qwc s5-0)) + (set! (-> a0-1 vif0) (new 'static 'vif-tag :imm #x404 :cmd (vif-cmd stcycl))) + (set! (-> a0-1 vif1) (new 'static 'vif-tag :imm #x3d4 :cmd (vif-cmd unpack-v4-32) :num s5-0)) + (set! (-> v1-0 base) (the-as pointer (&+ a0-1 16))) + ) + (sprite-setup-frame-data (the-as sprite-frame-data (-> arg0 base)) arg1) + (&+! (-> arg0 base) (* s5-0 16)) + ) + (none) + ) + +;; WARN: Return type mismatch dma-packet vs none. +(defun sprite-add-2d-chunk ((arg0 sprite-array-2d) (arg1 int) (arg2 int) (arg3 dma-buffer) (arg4 int)) + "Set up DMA for a single chunk of 2D sprites." + (let ((s1-0 1)) + (let* ((v1-0 arg3) + (a0-1 (the-as dma-packet (-> v1-0 base))) + ) + (set! (-> a0-1 dma) (new 'static 'dma-tag :id (dma-tag-id cnt) :qwc s1-0)) + (set! (-> a0-1 vif0) (new 'static 'vif-tag :imm #x404 :cmd (vif-cmd stcycl))) + (set! (-> a0-1 vif1) (new 'static 'vif-tag :imm #x8000 :cmd (vif-cmd unpack-v4-32) :num s1-0)) + (set! (-> v1-0 base) (the-as pointer (&+ a0-1 16))) + ) + (sprite-setup-header (the-as sprite-header (-> arg3 base)) arg2) + (&+! (-> arg3 base) (* s1-0 16)) + ) + (let* ((a1-7 (* 3 arg2)) + (v1-4 arg3) + (a0-5 (the-as dma-packet (-> v1-4 base))) + ) + (set! (-> a0-5 dma) + (new 'static 'dma-tag :id (dma-tag-id ref) :addr (the-as int (&+ (-> arg0 vec-data) (* 48 arg1))) :qwc a1-7) + ) + (set! (-> a0-5 vif0) (new 'static 'vif-tag)) + (set! (-> a0-5 vif1) (new 'static 'vif-tag :imm #x8001 :cmd (vif-cmd unpack-v4-32) :num a1-7)) + (set! (-> v1-4 base) (the-as pointer (&+ a0-5 16))) + ) + (let* ((a1-11 (* 5 arg2)) + (v1-6 arg3) + (a0-7 (the-as dma-packet (-> v1-6 base))) + ) + (set! (-> a0-7 dma) + (new 'static 'dma-tag :id (dma-tag-id ref) :addr (+ (the-as int (-> arg0 adgif-data)) (* 80 arg1)) :qwc a1-11) + ) + (set! (-> a0-7 vif0) (new 'static 'vif-tag)) + (set! (-> a0-7 vif1) (new 'static 'vif-tag :imm #x8091 :cmd (vif-cmd unpack-v4-32) :num a1-11)) + (set! (-> v1-6 base) (the-as pointer (&+ a0-7 16))) + ) + (let ((v1-7 (the-as dma-packet (-> arg3 base)))) + (set! (-> v1-7 dma) (new 'static 'dma-tag :id (dma-tag-id cnt))) + (set! (-> v1-7 vif0) (new 'static 'vif-tag)) + (set! (-> v1-7 vif1) (new 'static 'vif-tag :cmd (vif-cmd mscal) :msk #x1 :imm arg4)) + (set! (-> arg3 base) (the-as pointer (&+ v1-7 16))) + ) + (none) + ) + +(defun sprite-add-2d-all ((arg0 sprite-array-2d) (arg1 dma-buffer) (arg2 int)) + "Generate DMA for all chunks." + (when (> (-> arg0 num-valid arg2) 0) + (let ((s4-0 0) + (s3-0 3) + ) + (when (= arg2 1) + (set! s4-0 (-> arg0 num-sprites 0)) + (set! s3-0 143) + ) + (let ((s2-0 (-> arg0 num-valid arg2))) + (while (< 48 s2-0) + (sprite-add-2d-chunk arg0 s4-0 48 arg1 s3-0) + (+! s4-0 48) + (+! s2-0 -48) + ) + (sprite-add-2d-chunk arg0 s4-0 s2-0 arg1 s3-0) + ) + ) + ) + (none) + ) + +;; WARN: Return type mismatch dma-packet vs none. +(defun sprite-add-3d-chunk ((arg0 sprite-array-3d) (arg1 int) (arg2 int) (arg3 dma-buffer)) + "Generate DMA for a single chunk of 3D sprites." + (let ((s2-0 1)) + (let* ((v1-0 arg3) + (a0-1 (the-as dma-packet (-> v1-0 base))) + ) + (set! (-> a0-1 dma) (new 'static 'dma-tag :id (dma-tag-id cnt) :qwc s2-0)) + (set! (-> a0-1 vif0) (new 'static 'vif-tag :imm #x404 :cmd (vif-cmd stcycl))) + (set! (-> a0-1 vif1) (new 'static 'vif-tag :imm #x8000 :cmd (vif-cmd unpack-v4-32) :num s2-0)) + (set! (-> v1-0 base) (the-as pointer (the-as dma-packet (&+ a0-1 16)))) + ) + (sprite-setup-header (the-as sprite-header (-> arg3 base)) arg2) + (&+! (-> arg3 base) (* s2-0 16)) + ) + (let* ((a1-7 (* 3 arg2)) + (v1-4 arg3) + (a0-5 (the-as dma-packet (-> v1-4 base))) + ) + (set! (-> a0-5 dma) + (new 'static 'dma-tag :id (dma-tag-id ref) :addr (the-as int (&+ (-> arg0 vec-data) (* 48 arg1))) :qwc a1-7) + ) + (set! (-> a0-5 vif0) (new 'static 'vif-tag)) + (set! (-> a0-5 vif1) (new 'static 'vif-tag :imm #x8001 :cmd (vif-cmd unpack-v4-32) :num a1-7)) + (set! (-> v1-4 base) (the-as pointer (the-as dma-packet (&+ a0-5 16)))) + ) + (let* ((a1-11 (* 5 arg2)) + (v1-6 arg3) + (a0-7 (the-as dma-packet (-> v1-6 base))) + ) + (set! (-> a0-7 dma) + (new 'static 'dma-tag :id (dma-tag-id ref) :addr (the-as int (-> arg0 adgif-data arg1)) :qwc a1-11) + ) + (set! (-> a0-7 vif0) (new 'static 'vif-tag)) + (set! (-> a0-7 vif1) (new 'static 'vif-tag :imm #x8091 :cmd (vif-cmd unpack-v4-32) :num a1-11)) + (set! (-> v1-6 base) (the-as pointer (the-as dma-packet (&+ a0-7 16)))) + ) + (let ((v1-7 (the-as dma-packet (-> arg3 base)))) + (set! (-> v1-7 dma) (new 'static 'dma-tag :id (dma-tag-id cnt))) + (set! (-> v1-7 vif0) (new 'static 'vif-tag)) + (set! (-> v1-7 vif1) (new 'static 'vif-tag :cmd (vif-cmd mscal) :msk #x1 :imm #xf5)) + (set! (-> arg3 base) (the-as pointer (&+ v1-7 16))) + ) + (none) + ) + +(defun sprite-add-3d-all ((arg0 sprite-array-3d) (arg1 dma-buffer) (arg2 int)) + "Generate DMA for all chunks of 3D sprites." + (when (> (-> arg0 num-valid arg2) 0) + (let ((s4-0 (if (zero? arg2) + 0 + (-> arg0 num-sprites 0) + ) + ) + (s3-0 (-> arg0 num-valid arg2)) + ) + (while (< 48 s3-0) + (sprite-add-3d-chunk arg0 s4-0 48 arg1) + (+! s4-0 48) + (+! s3-0 -48) + ) + (sprite-add-3d-chunk arg0 s4-0 s3-0 arg1) + ) + ) + (none) + ) + +(defun sprite-draw ((arg0 display)) + "Top-level sprite DMA generation function. + Takes the sprites from sparticle, and draws them with + normal sprite, sprite-distort, sprite-glow, and simple-sprite-system" + (let ((gp-0 (-> *display* frames (-> *display* on-screen) global-buf base))) + (with-dma-buffer-add-bucket ((s4-0 (-> *display* frames (-> *display* on-screen) global-buf)) + (bucket-id particles) + ) + (when (or (zero? *screen-shot-work*) (= (-> *screen-shot-work* count) -1)) + (sprite-init-distorter s4-0) + (sprite-draw-distorters s4-0) + ) + (dma-buffer-add-gs-set s4-0 + (test-1 (new 'static 'gs-test + :ate #x1 + :atst (gs-atest greater-equal) + :aref #x26 + :afail #x1 + :zte #x1 + :ztst (gs-ztest greater-equal) + ) + ) + (clamp-1 (new 'static 'gs-clamp :wms (gs-tex-wrap-mode clamp) :wmt (gs-tex-wrap-mode clamp))) + ) + (dma-buffer-add-vu-function s4-0 sprite-vu1-block 1) + (sprite-add-frame-data s4-0 (the-as uint 408)) + (let* ((v1-20 s4-0) + (a0-14 (the-as dma-packet (-> v1-20 base))) + ) + (set! (-> a0-14 dma) (new 'static 'dma-tag :id (dma-tag-id cnt))) + (set! (-> a0-14 vif0) (new 'static 'vif-tag :cmd (vif-cmd mscalf) :msk #x1 :imm #x0)) + (set! (-> a0-14 vif1) (new 'static 'vif-tag :cmd (vif-cmd flushe) :msk #x1)) + (set! (-> v1-20 base) (the-as pointer (&+ a0-14 16))) + ) + (let* ((v1-21 s4-0) + (a0-16 (the-as dma-packet (-> v1-21 base))) + ) + (set! (-> a0-16 dma) (new 'static 'dma-tag :id (dma-tag-id cnt))) + (set! (-> a0-16 vif0) (new 'static 'vif-tag :cmd (vif-cmd base))) + (set! (-> a0-16 vif1) (new 'static 'vif-tag :imm #x190 :cmd (vif-cmd offset))) + (set! (-> v1-21 base) (the-as pointer (&+ a0-16 16))) + ) + (sprite-add-matrix-data s4-0 (the-as uint 0)) + (sprite-add-3d-all *sprite-array-3d* s4-0 0) + (sprite-add-2d-all *sprite-array-2d* s4-0 0) + (let* ((v1-22 s4-0) + (a0-21 (the-as dma-packet (-> v1-22 base))) + ) + (set! (-> a0-21 dma) (new 'static 'dma-tag :id (dma-tag-id cnt))) + (set! (-> a0-21 vif0) (new 'static 'vif-tag)) + (set! (-> a0-21 vif1) (new 'static 'vif-tag :cmd (vif-cmd flushe) :msk #x1)) + (set! (-> v1-22 base) (the-as pointer (&+ a0-21 16))) + ) + (sprite-add-matrix-data s4-0 (the-as uint 1)) + (sprite-add-2d-all *sprite-array-2d* s4-0 1) + (let* ((v1-23 s4-0) + (a0-25 (the-as dma-packet (-> v1-23 base))) + ) + (set! (-> a0-25 dma) (new 'static 'dma-tag :id (dma-tag-id cnt))) + (set! (-> a0-25 vif0) (new 'static 'vif-tag)) + (set! (-> a0-25 vif1) (new 'static 'vif-tag :cmd (vif-cmd flushe) :msk #x1)) + (set! (-> v1-23 base) (the-as pointer (&+ a0-25 16))) + ) + (sprite-glow-init-engine s4-0) + (sprite-glow-draw s4-0) + (draw-all-sprites! *simple-sprite-system* s4-0) + (let* ((v1-26 s4-0) + (a0-30 (the-as dma-packet (-> v1-26 base))) + ) + (set! (-> a0-30 dma) (new 'static 'dma-tag :id (dma-tag-id cnt))) + (set! (-> a0-30 vif0) (new 'static 'vif-tag)) + (set! (-> a0-30 vif1) (new 'static 'vif-tag :cmd (vif-cmd flushe) :msk #x1)) + (set! (-> v1-26 base) (the-as pointer (&+ a0-30 16))) + ) + ) + (let ((a0-35 *dma-mem-usage*)) + (when (nonzero? a0-35) + (set! (-> a0-35 length) (max 87 (-> a0-35 length))) + (set! (-> a0-35 data 86 name) "sprite") + (+! (-> a0-35 data 86 count) 1) + (+! (-> a0-35 data 86 used) + (&- (-> *display* frames (-> *display* on-screen) global-buf base) (the-as uint gp-0)) + ) + (set! (-> a0-35 data 86 total) (-> a0-35 data 86 used)) + ) + ) + ) + 0 + (none) + ) + +(defun sprite-allocate-user-hvdf () + "Allocate an HVDF entry. Returns the index in the hvdf-data array." + (dotimes (v1-0 76) + (when (zero? (-> *sprite-hvdf-control* alloc v1-0)) + (set! (-> *sprite-hvdf-control* alloc v1-0) 1) + (return v1-0) + ) + ) + 0 + ) + +(defun sprite-release-user-hvdf ((arg0 int)) + "Free an HVDF entry." + (when (and (>= arg0 1) (< arg0 76)) + (set! (-> *sprite-hvdf-control* alloc arg0) 0) + 0 + ) + 0 + (none) + ) + +;; WARN: Return type mismatch qword vs vector. +(defun sprite-get-user-hvdf ((arg0 int)) + "Get the HVDF vector." + (the-as vector (-> *sprite-hvdf-data* data arg0)) + ) + +(kmemopen global "sprite-tables") + +(define *sprite-hvdf-data* (new 'global 'sprite-hvdf-data)) + +(define *sprite-hvdf-control* (new 'global 'sprite-hvdf-control)) + +(dotimes (v1-25 76) + (set! (-> *sprite-hvdf-control* alloc v1-25) 0) + ) + +(set! (-> *sprite-hvdf-control* alloc 0) 1) + +(define *sprite-aux-list* (new 'global 'sprite-aux-list 256)) + +(define *sprite-array-2d* (new 'global 'sprite-array-2d 1920 128)) + +(define *sprite-array-3d* (new 'global 'sprite-array-3d 256 0)) + +(kmemclose) diff --git a/goal_src/jak3/engine/gfx/vu1-user-h.gc b/goal_src/jak3/engine/gfx/vu1-user-h.gc index d3bdf10db..2d4459e97 100644 --- a/goal_src/jak3/engine/gfx/vu1-user-h.gc +++ b/goal_src/jak3/engine/gfx/vu1-user-h.gc @@ -595,7 +595,7 @@ (bucket567 567) (bucket568 568) (bucket569 569) - (bucket570 570) + (particles 570) (bucket571 571) (shadow2 572) (shadow3 573) diff --git a/test/decompiler/reference/jak3/decompiler-macros.gc b/test/decompiler/reference/jak3/decompiler-macros.gc index aeb1025e5..1baaac1b0 100644 --- a/test/decompiler/reference/jak3/decompiler-macros.gc +++ b/test/decompiler/reference/jak3/decompiler-macros.gc @@ -1534,4 +1534,8 @@ ,rate #|(if (= (get-video-mode) 'custom) (/ (-> *display* time-factor) 5.0) ,rate)|#) ) ) + ) + +(defmacro current-frame () + `(-> *display* frames (-> *display* on-screen)) ) \ No newline at end of file diff --git a/test/decompiler/reference/jak3/engine/gfx/sprite/simple-sprite-h_REF.gc b/test/decompiler/reference/jak3/engine/gfx/sprite/simple-sprite-h_REF.gc index b2ef5a08b..98f9b54ee 100644 --- a/test/decompiler/reference/jak3/engine/gfx/sprite/simple-sprite-h_REF.gc +++ b/test/decompiler/reference/jak3/engine/gfx/sprite/simple-sprite-h_REF.gc @@ -62,7 +62,7 @@ ) (:methods (simple-sprite-system-method-9 () none) - (simple-sprite-system-method-10 () none) + (draw-all-sprites! (_type_ dma-buffer) none) (simple-sprite-system-method-11 () none) ) ) @@ -83,7 +83,3 @@ ;; failed to figure out what this is: 0 - - - - diff --git a/test/decompiler/reference/jak3/engine/gfx/sprite/sprite-h_REF.gc b/test/decompiler/reference/jak3/engine/gfx/sprite/sprite-h_REF.gc index a452fcbae..b64948607 100644 --- a/test/decompiler/reference/jak3/engine/gfx/sprite/sprite-h_REF.gc +++ b/test/decompiler/reference/jak3/engine/gfx/sprite/sprite-h_REF.gc @@ -3,6 +3,7 @@ ;; definition of type sprite-vec-data-2d (deftype sprite-vec-data-2d (structure) + "Per-particle data needed for rendering. This is sent to VU1." ((x-y-z-sx vector :inline) (flag-rot-sy vector :inline) (r-g-b-a vector :inline) @@ -59,6 +60,7 @@ ;; definition of type sprite-array-2d (deftype sprite-array-2d (basic) + "Array of sprite data for all 2D sprites. There are two groups: normal and HUD." ((num-sprites int32 2) (num-valid int32 2) (vec-data pointer) @@ -66,6 +68,9 @@ (pad uint128 4) (data uint128 1) ) + (:methods + (new (symbol type int int) _type_) + ) ) ;; definition for method 3 of type sprite-array-2d @@ -87,6 +92,7 @@ ;; definition of type sprite-vec-data-3d (deftype sprite-vec-data-3d (structure) + "Per-particle data needed for rendering. This is sent to VU1." ((x-y-z-sx vector :inline) (qx-qy-qz-sy vector :inline) (r-g-b-a vector :inline) @@ -141,12 +147,16 @@ ;; definition of type sprite-array-3d (deftype sprite-array-3d (basic) + "Array of sprite data for all 3D sprites. There are two groups, but only the first is used." ((num-sprites int32 2) (num-valid int32 2) (vec-data pointer) (adgif-data (inline-array adgif-shader)) (data uint128 1) ) + (:methods + (new (symbol type int int) _type_) + ) ) ;; definition for method 3 of type sprite-array-3d @@ -167,7 +177,3 @@ ;; failed to figure out what this is: 0 - - - - diff --git a/test/decompiler/reference/jak3/engine/gfx/sprite/sprite_REF.gc b/test/decompiler/reference/jak3/engine/gfx/sprite/sprite_REF.gc new file mode 100644 index 000000000..a51bc9daf --- /dev/null +++ b/test/decompiler/reference/jak3/engine/gfx/sprite/sprite_REF.gc @@ -0,0 +1,925 @@ +;;-*-Lisp-*- +(in-package goal) + +;; definition of type sprite-header +(deftype sprite-header (structure) + "Header for the data sent to VU1 renderer." + ((header qword 1 :inline) + (num-sprites int32 :overlay-at (-> header 0 data 0)) + ) + ) + +;; definition for method 3 of type sprite-header +(defmethod inspect ((this sprite-header)) + (when (not this) + (set! this this) + (goto cfg-4) + ) + (format #t "[~8x] ~A~%" this 'sprite-header) + (format #t "~1Theader[1] @ #x~X~%" (-> this header)) + (format #t "~1Tnum-sprites: ~D~%" (-> this num-sprites)) + (label cfg-4) + this + ) + +;; definition for function sprite-setup-header +;; WARN: Return type mismatch int vs none. +(defun sprite-setup-header ((arg0 sprite-header) (arg1 int)) + "Initialize VU1 data header with number of sprites." + (set! (-> arg0 num-sprites) arg1) + (none) + ) + +;; definition of type sprite-hvdf-data +(deftype sprite-hvdf-data (structure) + "Table of HVDF offsets. The first one is the normal one produced by math-camera. +The remaining 75 can be allocated by the user. +This is only used by Jak 1's weird HUD drawing system, to position HUD elements." + ((data qword 76 :inline) + ) + ) + +;; definition for method 3 of type sprite-hvdf-data +(defmethod inspect ((this sprite-hvdf-data)) + (when (not this) + (set! this this) + (goto cfg-4) + ) + (format #t "[~8x] ~A~%" this 'sprite-hvdf-data) + (format #t "~1Tdata[76] @ #x~X~%" (-> this data)) + (label cfg-4) + this + ) + +;; definition of type sprite-hvdf-control +(deftype sprite-hvdf-control (structure) + "Table of flags indicating if the HVDF control is allocated or not." + ((alloc int8 76) + ) + ) + +;; definition for method 3 of type sprite-hvdf-control +(defmethod inspect ((this sprite-hvdf-control)) + (when (not this) + (set! this this) + (goto cfg-4) + ) + (format #t "[~8x] ~A~%" this 'sprite-hvdf-control) + (format #t "~1Talloc[76] @ #x~X~%" (-> this alloc)) + (label cfg-4) + this + ) + +;; definition of type sprite-aux-elem +(deftype sprite-aux-elem (structure) + "Entry for a sprite which should be drawn by a renderer other than the usual sprite." + ((aux-type sprite-aux-type) + (data vector 3) + (vec-data sprite-vec-data-2d :overlay-at (-> data 0)) + (gif-data adgif-shader :overlay-at (-> data 1)) + (aux-data sparticle-cpuinfo :overlay-at (-> data 2)) + ) + :pack-me + ) + +;; definition for method 3 of type sprite-aux-elem +(defmethod inspect ((this sprite-aux-elem)) + (when (not this) + (set! this this) + (goto cfg-4) + ) + (format #t "[~8x] ~A~%" this 'sprite-aux-elem) + (format #t "~1Taux-type: ~D~%" (-> this aux-type)) + (format #t "~1Tdata[3] @ #x~X~%" (&-> this vec-data)) + (format #t "~1Tvec-data: #~%" (-> this vec-data)) + (format #t "~1Tgif-data: #~%" (-> this gif-data)) + (format #t "~1Taux-data: #~%" (-> this aux-data)) + (label cfg-4) + this + ) + +;; definition of type sprite-aux-list +(deftype sprite-aux-list (basic) + "List of sprites that can't be drawn by the normal sprite renderer. +The glow and distort renderers will pull sprites from here." + ((num-entries int32) + (entry int32) + (data sprite-aux-elem :inline :dynamic) + ) + (:methods + (new (symbol type int) _type_) + ) + ) + +;; definition for method 3 of type sprite-aux-list +;; INFO: this function exists in multiple non-identical object files +(defmethod inspect ((this sprite-aux-list)) + (when (not this) + (set! this this) + (goto cfg-4) + ) + (format #t "[~8x] ~A~%" this (-> this type)) + (format #t "~1Tnum-entries: ~D~%" (-> this num-entries)) + (format #t "~1Tentry: ~D~%" (-> this entry)) + (format #t "~1Tdata[0] @ #x~X~%" (-> this data)) + (label cfg-4) + this + ) + +;; definition for method 0 of type sprite-aux-list +(defmethod new sprite-aux-list ((allocation symbol) (type-to-make type) (arg0 int)) + (let ((v0-0 (object-new allocation type-to-make (the-as int (+ (-> type-to-make size) (* arg0 16)))))) + (set! (-> v0-0 num-entries) arg0) + (set! (-> v0-0 entry) 0) + v0-0 + ) + ) + +;; definition for method 3 of type sprite-aux-list +;; INFO: this function exists in multiple non-identical object files +;; WARN: Return type mismatch symbol vs sprite-aux-list. +(defmethod inspect ((this sprite-aux-list)) + (format #t "[~X] sprite-aux-list:~%" this) + (format #t "~Tnum-entries: ~D~%" (-> this num-entries)) + (format #t "~Tentry: ~D~%" (-> this entry)) + (dotimes (s5-0 (-> this entry)) + (format #t "~T~D : ~X~%" s5-0 (-> this data s5-0)) + ) + (the-as sprite-aux-list #f) + ) + +;; definition for function clear-sprite-aux-list +;; WARN: Return type mismatch int vs none. +(defun clear-sprite-aux-list () + "Reset all pending sprites in the aux-list." + (set! (-> *sprite-aux-list* entry) 0) + 0 + (none) + ) + +;; definition for function add-to-sprite-aux-list +;; WARN: Return type mismatch int vs none. +(defun add-to-sprite-aux-list ((arg0 sparticle-system) (arg1 sparticle-cpuinfo) (arg2 sprite-vec-data-3d) (arg3 uint)) + (let ((s2-0 (-> arg1 sp-func))) + (if (and (nonzero? s2-0) (not (paused?))) + (s2-0 arg0 arg1 arg2 arg3) + ) + ) + (let ((v1-3 *sprite-aux-list*)) + (when (< (-> v1-3 entry) (-> v1-3 num-entries)) + (cond + ((logtest? (-> arg1 flags) (sp-cpuinfo-flag distort)) + (set! (-> v1-3 data (-> v1-3 entry) aux-type) (sprite-aux-type distort)) + (set! (-> v1-3 data (-> v1-3 entry) vec-data) (-> arg1 sprite)) + (+! (-> v1-3 entry) 1) + (set! (-> arg2 r-g-b-a w) 0.0) + ) + ((logtest? (-> arg1 flags) (sp-cpuinfo-flag glow)) + (let ((a0-18 (-> arg0 cpuinfo-table arg3)) + (a1-11 (-> v1-3 data (-> v1-3 entry))) + ) + (set! (-> a1-11 aux-type) (sprite-aux-type glow)) + (set! (-> a1-11 vec-data) (-> arg1 sprite)) + (set! (-> a1-11 gif-data) (-> arg1 adgif)) + (set! (-> a1-11 aux-data) a0-18) + ) + (+! (-> v1-3 entry) 1) + (set! (-> arg2 qx-qy-qz-sy y) (the-as float #xffffffff)) + ) + ) + ) + ) + 0 + (none) + ) + +;; definition of type sprite-frame-data +(deftype sprite-frame-data (structure) + "Data sent to VU1 which is constant over a frame, like giftag templates, camera/fog constants..." + ((cdata vector 16 :inline) + (xy-array vector 8 :inline :overlay-at (-> cdata 0)) + (st-array vector 4 :inline :overlay-at (-> cdata 8)) + (xyz-array vector 4 :inline :overlay-at (-> cdata 12)) + (hmge-scale vector :inline :offset 256) + (consts vector :inline :offset 272) + (pfog0 float :overlay-at (-> consts x)) + (deg-to-rad float :overlay-at (-> consts y)) + (min-scale float :overlay-at (-> consts z)) + (inv-area float :overlay-at (-> consts w)) + (adgif-giftag gs-gif-tag :inline) + (sprite-2d-giftag gs-gif-tag :inline) + (sprite-2d-giftag-2 gs-gif-tag :inline) + (sincos-01 vector :inline) + (sincos-23 vector :inline) + (sincos-45 vector :inline) + (sincos-67 vector :inline) + (sincos-89 vector :inline) + (basis-x vector :inline) + (basis-y vector :inline) + (sprite-3d-giftag gs-gif-tag :inline) + (sprite-3d-giftag-2 gs-gif-tag :inline) + (screen-shader adgif-shader :inline) + (inv-hmge-scale vector :inline :offset 576) + (stq-offset vector :inline) + (stq-scale vector :inline) + (rgba-plain qword :inline) + (warp-giftag gs-gif-tag :inline) + (fog-clamp vector :inline) + (fog-min float :overlay-at (-> fog-clamp data 0)) + (fog-max float :overlay-at (-> fog-clamp data 1)) + (max-scale float :overlay-at (-> fog-clamp data 2)) + ) + ) + +;; definition for method 3 of type sprite-frame-data +(defmethod inspect ((this sprite-frame-data)) + (when (not this) + (set! this this) + (goto cfg-4) + ) + (format #t "[~8x] ~A~%" this 'sprite-frame-data) + (format #t "~1Tdata[42] @ #x~X~%" (-> this cdata)) + (format #t "~1Tcdata[16] @ #x~X~%" (-> this cdata)) + (format #t "~1Tfdata[26] @ #x~X~%" (-> this hmge-scale)) + (format #t "~1Txy-array[8] @ #x~X~%" (-> this cdata)) + (format #t "~1Tst-array[4] @ #x~X~%" (-> this st-array)) + (format #t "~1Txyz-array[4] @ #x~X~%" (-> this xyz-array)) + (format #t "~1Thmge-scale: #~%" (-> this hmge-scale)) + (format #t "~1Tconsts: #~%" (-> this consts)) + (format #t "~1Tpfog0: ~f~%" (-> this consts x)) + (format #t "~1Tdeg-to-rad: ~f~%" (-> this consts y)) + (format #t "~1Tmin-scale: ~f~%" (-> this consts z)) + (format #t "~1Tinv-area: ~f~%" (-> this consts w)) + (format #t "~1Tadgif-giftag: #~%" (-> this adgif-giftag)) + (format #t "~1Tsprite-2d-giftag: #~%" (-> this sprite-2d-giftag)) + (format #t "~1Tsprite-2d-giftag-2: #~%" (-> this sprite-2d-giftag-2)) + (format #t "~1Tsincos-01: #~%" (-> this sincos-01)) + (format #t "~1Tsincos-23: #~%" (-> this sincos-23)) + (format #t "~1Tsincos-45: #~%" (-> this sincos-45)) + (format #t "~1Tsincos-67: #~%" (-> this sincos-67)) + (format #t "~1Tsincos-89: #~%" (-> this sincos-89)) + (format #t "~1Tbasis-x: #~%" (-> this basis-x)) + (format #t "~1Tbasis-y: #~%" (-> this basis-y)) + (format #t "~1Tsprite-3d-giftag: #~%" (-> this sprite-3d-giftag)) + (format #t "~1Tsprite-3d-giftag-2: #~%" (-> this sprite-3d-giftag-2)) + (format #t "~1Tscreen-shader: #~%" (-> this screen-shader)) + (format #t "~1Tinv-hmge-scale: #~%" (-> this inv-hmge-scale)) + (format #t "~1Tstq-offset: #~%" (-> this stq-offset)) + (format #t "~1Tstq-scale: #~%" (-> this stq-scale)) + (format #t "~1Trgba-plain: #~%" (-> this rgba-plain)) + (format #t "~1Twarp-giftag: #~%" (-> this warp-giftag)) + (format #t "~1Tfog-clamp: #~%" (&-> this fog-min)) + (format #t "~1Tfog-min: ~f~%" (-> this fog-min)) + (format #t "~1Tfog-max: ~f~%" (-> this fog-max)) + (format #t "~1Tmax-scale: ~f~%" (-> this max-scale)) + (label cfg-4) + this + ) + +;; definition for function sprite-setup-frame-data +;; INFO: Used lq/sq +;; WARN: Return type mismatch float vs none. +(defun sprite-setup-frame-data ((arg0 sprite-frame-data) (arg1 uint)) + (set! (-> arg0 hmge-scale quad) (-> *math-camera* hmge-scale quad)) + (set! (-> arg0 inv-hmge-scale quad) (-> *math-camera* inv-hmge-scale quad)) + (set! (-> arg0 consts x) (-> *math-camera* pfog0)) + (set! (-> arg0 consts y) 0.000095873795) + (set! (-> arg0 adgif-giftag tag) (new 'static 'gif-tag64 :nloop #x1 :nreg #x5)) + (set! (-> arg0 adgif-giftag 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) + ) + ) + (set! (-> arg0 sprite-2d-giftag tag) + (new 'static 'gif-tag64 + :nloop #x1 + :eop #x1 + :pre #x1 + :prim (new 'static 'gs-prim :prim (gs-prim-type tri-fan) :tme #x1 :fge #x1 :abe #x1) + :nreg #x9 + ) + ) + (set! (-> arg0 sprite-2d-giftag 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) + ) + ) + (set! (-> arg0 sprite-2d-giftag-2 tag) + (new 'static 'gif-tag64 + :nloop #x1 + :eop #x1 + :pre #x1 + :prim (new 'static 'gs-prim :prim (gs-prim-type tri-fan) :tme #x1 :abe #x1) + :nreg #x9 + ) + ) + (set! (-> arg0 sprite-2d-giftag-2 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) + ) + ) + (set! (-> arg0 sprite-3d-giftag tag) + (new 'static 'gif-tag64 + :nloop #x4 + :eop #x1 + :pre #x1 + :prim (new 'static 'gs-prim :prim (gs-prim-type tri-fan) :tme #x1 :fge #x1 :abe #x1) + :nreg #x3 + ) + ) + (set! (-> arg0 sprite-3d-giftag regs) + (new 'static 'gif-tag-regs :regs0 (gif-reg-id st) :regs1 (gif-reg-id rgbaq) :regs2 (gif-reg-id xyzf2)) + ) + (set! (-> arg0 sprite-3d-giftag-2 tag) + (new 'static 'gif-tag64 + :nloop #x4 + :eop #x1 + :pre #x1 + :prim (new 'static 'gs-prim :prim (gs-prim-type tri-fan) :tme #x1 :abe #x1) + :nreg #x3 + ) + ) + (set! (-> arg0 sprite-3d-giftag-2 regs) + (new 'static 'gif-tag-regs :regs0 (gif-reg-id st) :regs1 (gif-reg-id rgbaq) :regs2 (gif-reg-id xyzf2)) + ) + (set! (-> arg0 warp-giftag tag) (new 'static 'gif-tag64 + :nloop #x1 + :eop #x1 + :pre #x1 + :prim (new 'static 'gs-prim :prim (gs-prim-type tri) :tme #x1 :abe #x1) + :nreg #xc + ) + ) + (set! (-> arg0 warp-giftag regs) (new 'static 'gif-tag-regs + :regs0 (gif-reg-id st) + :regs1 (gif-reg-id rgbaq) + :regs2 (gif-reg-id xyzf2) + :regs3 (gif-reg-id st) + :regs4 (gif-reg-id rgbaq) + :regs5 (gif-reg-id xyzf2) + :regs6 (gif-reg-id st) + :regs7 (gif-reg-id rgbaq) + :regs8 (gif-reg-id xyzf2) + ) + ) + (set! (-> arg0 screen-shader prims 1) (gs-reg64 tex0-1)) + (set! (-> arg0 screen-shader tex0) (new 'static 'gs-tex0 :tbw #x8 :tw #xa :th #x8 :tbp0 (* arg1 32))) + (set! (-> arg0 screen-shader prims 3) (gs-reg64 tex1-1)) + (set! (-> arg0 screen-shader tex1) (new 'static 'gs-tex1 :mmag #x1 :mmin #x1)) + (set! (-> arg0 screen-shader prims 5) (gs-reg64 miptbp1-1)) + (set! (-> arg0 screen-shader miptbp1) (new 'static 'gs-miptbp)) + (set! (-> arg0 screen-shader clamp-reg) (gs-reg64 clamp-1)) + (set! (-> arg0 screen-shader clamp) (new 'static 'gs-clamp + :wms (gs-tex-wrap-mode region-clamp) + :wmt (gs-tex-wrap-mode region-clamp) + :maxu #x27f + :maxv #xef + ) + ) + (set! (-> arg0 screen-shader prims 9) (gs-reg64 alpha-1)) + (set! (-> arg0 screen-shader alpha) (new 'static 'gs-alpha :b #x1 :d #x1)) + (set! (-> arg0 sincos-01 z) 0.999998) + (set! (-> arg0 sincos-23 z) -0.16666014) + (set! (-> arg0 sincos-45 z) 0.008326521) + (set! (-> arg0 sincos-67 z) -0.0001956241) + (set! (-> arg0 sincos-89 z) 0.0000023042373) + (set! (-> arg0 sincos-01 w) 1.0) + (set! (-> arg0 sincos-23 w) -0.49998003) + (set! (-> arg0 sincos-45 w) 0.041620404) + (set! (-> arg0 sincos-67 w) -0.0013636408) + (set! (-> arg0 sincos-89 w) 0.000020170546) + (set! (-> arg0 basis-x quad) (the-as uint128 0)) + (set! (-> arg0 basis-x x) (- (-> *math-camera* perspective rvec x))) + (set! (-> arg0 basis-y quad) (the-as uint128 0)) + (set! (-> arg0 basis-y y) (- (-> *math-camera* perspective uvec y))) + (set! (-> arg0 consts z) (sqrtf (* (/ 1.0 (-> arg0 basis-x x)) (/ 1.0 (-> arg0 basis-y y))))) + (set! (-> arg0 consts w) (/ 1.0 (* (-> arg0 consts z) (-> arg0 consts z)))) + (set-vector! (-> arg0 cdata 0) -0.5 -0.5 0.0 0.0) + (set-vector! (-> arg0 cdata 1) 0.5 -0.5 0.0 0.0) + (set-vector! (-> arg0 cdata 2) 0.5 0.5 0.0 0.0) + (set-vector! (-> arg0 cdata 3) -0.5 0.5 0.0 0.0) + (set-vector! (-> arg0 cdata 4) 0.0 -0.5 0.0 0.0) + (set-vector! (-> arg0 cdata 5) 1.0 -0.5 0.0 0.0) + (set-vector! (-> arg0 cdata 6) 1.0 0.5 0.0 0.0) + (set-vector! (-> arg0 cdata 7) 0.0 0.5 0.0 0.0) + (set-vector! (-> arg0 st-array 0) 0.0 0.0 1.0 0.0) + (set-vector! (-> arg0 cdata 9) 1.0 0.0 1.0 0.0) + (set-vector! (-> arg0 cdata 10) 1.0 1.0 1.0 0.0) + (set-vector! (-> arg0 cdata 11) 0.0 1.0 1.0 0.0) + (set-vector! (-> arg0 xyz-array 0) -0.5 0.0 -0.5 0.0) + (set-vector! (-> arg0 cdata 13) 0.5 0.0 -0.5 0.0) + (set-vector! (-> arg0 cdata 14) 0.5 0.0 0.5 0.0) + (set-vector! (-> arg0 cdata 15) -0.5 0.0 0.5 0.0) + (set-vector! (-> arg0 stq-offset) -1792.0 -1840.0 0.0 0.0) + (set-vector! (-> arg0 stq-scale) 0.0009765625 0.00390625 1.0 1.0) + (set! (-> arg0 rgba-plain vector4w x) 128) + (set! (-> arg0 rgba-plain vector4w y) 128) + (set! (-> arg0 rgba-plain vector4w z) 128) + (set! (-> arg0 rgba-plain vector4w w) 64) + (set! (-> arg0 fog-min) (-> *math-camera* fog-min)) + (set! (-> arg0 fog-max) (-> *math-camera* fog-max)) + (set! (-> arg0 max-scale) 2048.0) + (none) + ) + +;; definition for symbol sprite-vu1-block, type vu-function +(define sprite-vu1-block (new 'static 'vu-function :length #x37b :qlength #x1be)) + +;; definition for method 0 of type sprite-array-2d +(defmethod new sprite-array-2d ((allocation symbol) (type-to-make type) (arg0 int) (arg1 int)) + (let* ((v1-0 (+ arg0 arg1)) + (s4-0 (* 3 v1-0)) + (a2-3 (* 5 v1-0)) + (v0-0 (object-new allocation type-to-make (the-as int (+ (-> type-to-make size) (* (+ a2-3 -1 s4-0) 16))))) + ) + (set! (-> v0-0 num-sprites 0) arg0) + (set! (-> v0-0 num-sprites 1) arg1) + (set! (-> v0-0 num-valid 0) 0) + (set! (-> v0-0 num-valid 1) 0) + (set! (-> v0-0 vec-data) (-> v0-0 data)) + (set! (-> v0-0 adgif-data) (the-as (inline-array adgif-shader) (&-> v0-0 data s4-0))) + v0-0 + ) + ) + +;; definition for method 0 of type sprite-array-3d +(defmethod new sprite-array-3d ((allocation symbol) (type-to-make type) (arg0 int) (arg1 int)) + (let* ((v1-0 (+ arg0 arg1)) + (s4-0 (* 3 v1-0)) + (a2-3 (* 5 v1-0)) + (v0-0 (object-new allocation type-to-make (the-as int (+ (-> type-to-make size) (* (+ a2-3 -1 s4-0) 16))))) + ) + (set! (-> v0-0 num-sprites 0) arg0) + (set! (-> v0-0 num-sprites 1) arg1) + (set! (-> v0-0 num-valid 0) 0) + (set! (-> v0-0 num-valid 1) 0) + (set! (-> v0-0 vec-data) (-> v0-0 data)) + (set! (-> v0-0 adgif-data) (the-as (inline-array adgif-shader) (&-> v0-0 data s4-0))) + v0-0 + ) + ) + +;; definition for function sprite-set-3d-quaternion! +(defun sprite-set-3d-quaternion! ((arg0 sprite-vec-data-3d) (arg1 quaternion)) + "Set the quaternion of the vec-data." + (local-vars (v1-0 float) (v1-1 float)) + (rlet ((vf0 :class vf) + (vf1 :class vf) + (vf2 :class vf) + ) + (init-vf0-vector) + (cond + ((< (-> arg1 w) 0.0) + (.lvf vf1 (&-> arg0 qx-qy-qz-sy quad)) + (.lvf vf2 (&-> arg1 quad)) + (.sub.vf vf1 vf0 vf2 :mask #b111) + (.svf (&-> arg0 qx-qy-qz-sy quad) vf1) + (.mov v1-0 vf1) + ) + (else + (.lvf vf1 (&-> arg0 qx-qy-qz-sy quad)) + (.lvf vf2 (&-> arg1 quad)) + (.add.vf vf1 vf0 vf2 :mask #b111) + (.svf (&-> arg0 qx-qy-qz-sy quad) vf1) + (.mov v1-1 vf1) + ) + ) + arg1 + ) + ) + +;; definition for function sprite-get-3d-quaternion! +(defun sprite-get-3d-quaternion! ((arg0 quaternion) (arg1 sprite-vec-data-3d)) + "Get the quaternion from the vec data." + (let ((f0-0 (-> arg1 qx-qy-qz-sy x)) + (f1-0 (-> arg1 qx-qy-qz-sy y)) + (f2-0 (-> arg1 qx-qy-qz-sy z)) + ) + (set! (-> arg0 x) f0-0) + (set! (-> arg0 y) f1-0) + (set! (-> arg0 z) f2-0) + (set! (-> arg0 w) (sqrtf (- (- (- 1.0 (* f2-0 f2-0)) (* f1-0 f1-0)) (* f0-0 f0-0)))) + ) + arg0 + ) + +;; definition for function sprite-add-matrix-data +;; INFO: Used lq/sq +;; WARN: Return type mismatch int vs none. +(defun sprite-add-matrix-data ((arg0 dma-buffer) (arg1 uint)) + "Set up matrix data DMA to VU1. + This changes per sprite mode, but remains constant for all sprites in that mode." + (let ((v1-0 900)) + (cond + ((zero? arg1) + (let* ((a1-1 arg0) + (a2-1 (the-as dma-packet (-> a1-1 base))) + ) + (set! (-> a2-1 dma) (new 'static 'dma-tag :qwc #x5 :id (dma-tag-id cnt))) + (set! (-> a2-1 vif0) (new 'static 'vif-tag :imm #x404 :cmd (vif-cmd stcycl))) + (set! (-> a2-1 vif1) (new 'static 'vif-tag :num #x5 :cmd (vif-cmd unpack-v4-32) :imm (shr (shl v1-0 54) 54))) + (set! (-> a1-1 base) (the-as pointer (&+ a2-1 16))) + ) + (let* ((a1-2 (the-as matrix (-> arg0 base))) + (t1-0 (-> *math-camera* camera-temp)) + (a2-4 (-> t1-0 rvec quad)) + (a3-4 (-> t1-0 uvec quad)) + (t0-4 (-> t1-0 fvec quad)) + (t1-1 (-> t1-0 trans quad)) + ) + (set! (-> a1-2 rvec quad) a2-4) + (set! (-> a1-2 uvec quad) a3-4) + (set! (-> a1-2 fvec quad) t0-4) + (set! (-> a1-2 trans quad) t1-1) + ) + (&+! (-> arg0 base) 64) + (let ((v1-1 (+ v1-0 4))) + (set! (-> (the-as (pointer uint128) (-> arg0 base))) (-> *math-camera* hvdf-off quad)) + (&+! (-> arg0 base) 16) + (+ v1-1 1) + ) + ) + ((= arg1 1) + (let* ((a1-10 arg0) + (a2-9 (the-as dma-packet (-> a1-10 base))) + ) + (set! (-> a2-9 dma) (new 'static 'dma-tag :qwc #x50 :id (dma-tag-id cnt))) + (set! (-> a2-9 vif0) (new 'static 'vif-tag :imm #x404 :cmd (vif-cmd stcycl))) + (set! (-> a2-9 vif1) (new 'static 'vif-tag :num #x50 :cmd (vif-cmd unpack-v4-32) :imm (shr (shl v1-0 54) 54))) + (set! (-> a1-10 base) (the-as pointer (&+ a2-9 16))) + ) + (let ((a1-11 (-> arg0 base)) + (f1-0 (-> *math-camera* perspective rvec x)) + (f2-0 (-> *math-camera* perspective uvec y)) + (f0-1 (* -1.9996 (-> *math-camera* perspective rvec x))) + ) + (set-vector! (the-as vector (&+ a1-11 0)) f0-1 0.0 0.0 0.0) + (set-vector! (the-as vector (&+ a1-11 16)) 0.0 (- (* (/ f2-0 f1-0) f0-1)) 0.0 0.0) + (set-vector! (the-as vector (&+ a1-11 32)) 0.0 0.0 (- f0-1) 0.0) + (set-vector! + (the-as vector (&+ a1-11 48)) + 0.0 + 0.0 + (* 500000000.0 f0-1) + (* 60.0 f0-1 (-> *math-camera* pfog0)) + ) + ) + (&+! (-> arg0 base) 64) + (let ((v1-2 (+ v1-0 4))) + (let ((a1-16 (the-as vector (-> arg0 base)))) + (set! (-> a1-16 quad) (-> *math-camera* hvdf-off quad)) + (set! (-> a1-16 x) 2048.0) + (set! (-> a1-16 y) 2048.0) + (set! (-> a1-16 z) (-> *math-camera* hvdf-off z)) + ) + (&+! (-> arg0 base) 16) + (let ((v1-3 (+ v1-2 1))) + (dotimes (a1-20 75) + (set! (-> (the-as (pointer uint128) (-> arg0 base))) (-> *sprite-hvdf-data* data (+ a1-20 1) quad)) + (&+! (-> arg0 base) 16) + (+! v1-3 1) + ) + ) + ) + ) + ) + ) + 0 + (none) + ) + +;; definition for function sprite-add-frame-data +;; WARN: Return type mismatch pointer vs none. +(defun sprite-add-frame-data ((arg0 dma-buffer) (arg1 uint)) + "Set up frame data DMA to VU1." + (let ((s5-0 42)) + (let* ((v1-0 arg0) + (a0-1 (the-as dma-packet (-> v1-0 base))) + ) + (set! (-> a0-1 dma) (new 'static 'dma-tag :id (dma-tag-id cnt) :qwc s5-0)) + (set! (-> a0-1 vif0) (new 'static 'vif-tag :imm #x404 :cmd (vif-cmd stcycl))) + (set! (-> a0-1 vif1) (new 'static 'vif-tag :imm #x3d4 :cmd (vif-cmd unpack-v4-32) :num s5-0)) + (set! (-> v1-0 base) (the-as pointer (&+ a0-1 16))) + ) + (sprite-setup-frame-data (the-as sprite-frame-data (-> arg0 base)) arg1) + (&+! (-> arg0 base) (* s5-0 16)) + ) + (none) + ) + +;; definition for function sprite-add-2d-chunk +;; WARN: Return type mismatch dma-packet vs none. +(defun sprite-add-2d-chunk ((arg0 sprite-array-2d) (arg1 int) (arg2 int) (arg3 dma-buffer) (arg4 int)) + "Set up DMA for a single chunk of 2D sprites." + (let ((s1-0 1)) + (let* ((v1-0 arg3) + (a0-1 (the-as dma-packet (-> v1-0 base))) + ) + (set! (-> a0-1 dma) (new 'static 'dma-tag :id (dma-tag-id cnt) :qwc s1-0)) + (set! (-> a0-1 vif0) (new 'static 'vif-tag :imm #x404 :cmd (vif-cmd stcycl))) + (set! (-> a0-1 vif1) (new 'static 'vif-tag :imm #x8000 :cmd (vif-cmd unpack-v4-32) :num s1-0)) + (set! (-> v1-0 base) (the-as pointer (&+ a0-1 16))) + ) + (sprite-setup-header (the-as sprite-header (-> arg3 base)) arg2) + (&+! (-> arg3 base) (* s1-0 16)) + ) + (let* ((a1-7 (* 3 arg2)) + (v1-4 arg3) + (a0-5 (the-as dma-packet (-> v1-4 base))) + ) + (set! (-> a0-5 dma) + (new 'static 'dma-tag :id (dma-tag-id ref) :addr (the-as int (&+ (-> arg0 vec-data) (* 48 arg1))) :qwc a1-7) + ) + (set! (-> a0-5 vif0) (new 'static 'vif-tag)) + (set! (-> a0-5 vif1) (new 'static 'vif-tag :imm #x8001 :cmd (vif-cmd unpack-v4-32) :num a1-7)) + (set! (-> v1-4 base) (the-as pointer (&+ a0-5 16))) + ) + (let* ((a1-11 (* 5 arg2)) + (v1-6 arg3) + (a0-7 (the-as dma-packet (-> v1-6 base))) + ) + (set! (-> a0-7 dma) + (new 'static 'dma-tag :id (dma-tag-id ref) :addr (+ (the-as int (-> arg0 adgif-data)) (* 80 arg1)) :qwc a1-11) + ) + (set! (-> a0-7 vif0) (new 'static 'vif-tag)) + (set! (-> a0-7 vif1) (new 'static 'vif-tag :imm #x8091 :cmd (vif-cmd unpack-v4-32) :num a1-11)) + (set! (-> v1-6 base) (the-as pointer (&+ a0-7 16))) + ) + (let ((v1-7 (the-as dma-packet (-> arg3 base)))) + (set! (-> v1-7 dma) (new 'static 'dma-tag :id (dma-tag-id cnt))) + (set! (-> v1-7 vif0) (new 'static 'vif-tag)) + (set! (-> v1-7 vif1) (new 'static 'vif-tag :cmd (vif-cmd mscal) :msk #x1 :imm arg4)) + (set! (-> arg3 base) (the-as pointer (&+ v1-7 16))) + ) + (none) + ) + +;; definition for function sprite-add-2d-all +(defun sprite-add-2d-all ((arg0 sprite-array-2d) (arg1 dma-buffer) (arg2 int)) + "Generate DMA for all chunks." + (when (> (-> arg0 num-valid arg2) 0) + (let ((s4-0 0) + (s3-0 3) + ) + (when (= arg2 1) + (set! s4-0 (-> arg0 num-sprites 0)) + (set! s3-0 143) + ) + (let ((s2-0 (-> arg0 num-valid arg2))) + (while (< 48 s2-0) + (sprite-add-2d-chunk arg0 s4-0 48 arg1 s3-0) + (+! s4-0 48) + (+! s2-0 -48) + ) + (sprite-add-2d-chunk arg0 s4-0 s2-0 arg1 s3-0) + ) + ) + ) + (none) + ) + +;; definition for function sprite-add-3d-chunk +;; WARN: Return type mismatch dma-packet vs none. +(defun sprite-add-3d-chunk ((arg0 sprite-array-3d) (arg1 int) (arg2 int) (arg3 dma-buffer)) + "Generate DMA for a single chunk of 3D sprites." + (let ((s2-0 1)) + (let* ((v1-0 arg3) + (a0-1 (the-as dma-packet (-> v1-0 base))) + ) + (set! (-> a0-1 dma) (new 'static 'dma-tag :id (dma-tag-id cnt) :qwc s2-0)) + (set! (-> a0-1 vif0) (new 'static 'vif-tag :imm #x404 :cmd (vif-cmd stcycl))) + (set! (-> a0-1 vif1) (new 'static 'vif-tag :imm #x8000 :cmd (vif-cmd unpack-v4-32) :num s2-0)) + (set! (-> v1-0 base) (the-as pointer (the-as dma-packet (&+ a0-1 16)))) + ) + (sprite-setup-header (the-as sprite-header (-> arg3 base)) arg2) + (&+! (-> arg3 base) (* s2-0 16)) + ) + (let* ((a1-7 (* 3 arg2)) + (v1-4 arg3) + (a0-5 (the-as dma-packet (-> v1-4 base))) + ) + (set! (-> a0-5 dma) + (new 'static 'dma-tag :id (dma-tag-id ref) :addr (the-as int (&+ (-> arg0 vec-data) (* 48 arg1))) :qwc a1-7) + ) + (set! (-> a0-5 vif0) (new 'static 'vif-tag)) + (set! (-> a0-5 vif1) (new 'static 'vif-tag :imm #x8001 :cmd (vif-cmd unpack-v4-32) :num a1-7)) + (set! (-> v1-4 base) (the-as pointer (the-as dma-packet (&+ a0-5 16)))) + ) + (let* ((a1-11 (* 5 arg2)) + (v1-6 arg3) + (a0-7 (the-as dma-packet (-> v1-6 base))) + ) + (set! (-> a0-7 dma) + (new 'static 'dma-tag :id (dma-tag-id ref) :addr (the-as int (-> arg0 adgif-data arg1)) :qwc a1-11) + ) + (set! (-> a0-7 vif0) (new 'static 'vif-tag)) + (set! (-> a0-7 vif1) (new 'static 'vif-tag :imm #x8091 :cmd (vif-cmd unpack-v4-32) :num a1-11)) + (set! (-> v1-6 base) (the-as pointer (the-as dma-packet (&+ a0-7 16)))) + ) + (let ((v1-7 (the-as dma-packet (-> arg3 base)))) + (set! (-> v1-7 dma) (new 'static 'dma-tag :id (dma-tag-id cnt))) + (set! (-> v1-7 vif0) (new 'static 'vif-tag)) + (set! (-> v1-7 vif1) (new 'static 'vif-tag :cmd (vif-cmd mscal) :msk #x1 :imm #xf5)) + (set! (-> arg3 base) (the-as pointer (&+ v1-7 16))) + ) + (none) + ) + +;; definition for function sprite-add-3d-all +(defun sprite-add-3d-all ((arg0 sprite-array-3d) (arg1 dma-buffer) (arg2 int)) + "Generate DMA for all chunks of 3D sprites." + (when (> (-> arg0 num-valid arg2) 0) + (let ((s4-0 (if (zero? arg2) + 0 + (-> arg0 num-sprites 0) + ) + ) + (s3-0 (-> arg0 num-valid arg2)) + ) + (while (< 48 s3-0) + (sprite-add-3d-chunk arg0 s4-0 48 arg1) + (+! s4-0 48) + (+! s3-0 -48) + ) + (sprite-add-3d-chunk arg0 s4-0 s3-0 arg1) + ) + ) + (none) + ) + +;; definition for function sprite-draw +;; WARN: Return type mismatch int vs none. +(defun sprite-draw ((arg0 display)) + "Top-level sprite DMA generation function. + Takes the sprites from sparticle, and draws them with + normal sprite, sprite-distort, sprite-glow, and simple-sprite-system" + (let ((gp-0 (-> *display* frames (-> *display* on-screen) global-buf base))) + (with-dma-buffer-add-bucket ((s4-0 (-> *display* frames (-> *display* on-screen) global-buf)) + (bucket-id particles) + ) + (when (or (zero? *screen-shot-work*) (= (-> *screen-shot-work* count) -1)) + (sprite-init-distorter s4-0) + (sprite-draw-distorters s4-0) + ) + (dma-buffer-add-gs-set s4-0 + (test-1 (new 'static 'gs-test + :ate #x1 + :atst (gs-atest greater-equal) + :aref #x26 + :afail #x1 + :zte #x1 + :ztst (gs-ztest greater-equal) + ) + ) + (clamp-1 (new 'static 'gs-clamp :wms (gs-tex-wrap-mode clamp) :wmt (gs-tex-wrap-mode clamp))) + ) + (dma-buffer-add-vu-function s4-0 sprite-vu1-block 1) + (sprite-add-frame-data s4-0 (the-as uint 408)) + (let* ((v1-20 s4-0) + (a0-14 (the-as dma-packet (-> v1-20 base))) + ) + (set! (-> a0-14 dma) (new 'static 'dma-tag :id (dma-tag-id cnt))) + (set! (-> a0-14 vif0) (new 'static 'vif-tag :cmd (vif-cmd mscalf) :msk #x1 :imm #x0)) + (set! (-> a0-14 vif1) (new 'static 'vif-tag :cmd (vif-cmd flushe) :msk #x1)) + (set! (-> v1-20 base) (the-as pointer (&+ a0-14 16))) + ) + (let* ((v1-21 s4-0) + (a0-16 (the-as dma-packet (-> v1-21 base))) + ) + (set! (-> a0-16 dma) (new 'static 'dma-tag :id (dma-tag-id cnt))) + (set! (-> a0-16 vif0) (new 'static 'vif-tag :cmd (vif-cmd base))) + (set! (-> a0-16 vif1) (new 'static 'vif-tag :imm #x190 :cmd (vif-cmd offset))) + (set! (-> v1-21 base) (the-as pointer (&+ a0-16 16))) + ) + (sprite-add-matrix-data s4-0 (the-as uint 0)) + (sprite-add-3d-all *sprite-array-3d* s4-0 0) + (sprite-add-2d-all *sprite-array-2d* s4-0 0) + (let* ((v1-22 s4-0) + (a0-21 (the-as dma-packet (-> v1-22 base))) + ) + (set! (-> a0-21 dma) (new 'static 'dma-tag :id (dma-tag-id cnt))) + (set! (-> a0-21 vif0) (new 'static 'vif-tag)) + (set! (-> a0-21 vif1) (new 'static 'vif-tag :cmd (vif-cmd flushe) :msk #x1)) + (set! (-> v1-22 base) (the-as pointer (&+ a0-21 16))) + ) + (sprite-add-matrix-data s4-0 (the-as uint 1)) + (sprite-add-2d-all *sprite-array-2d* s4-0 1) + (let* ((v1-23 s4-0) + (a0-25 (the-as dma-packet (-> v1-23 base))) + ) + (set! (-> a0-25 dma) (new 'static 'dma-tag :id (dma-tag-id cnt))) + (set! (-> a0-25 vif0) (new 'static 'vif-tag)) + (set! (-> a0-25 vif1) (new 'static 'vif-tag :cmd (vif-cmd flushe) :msk #x1)) + (set! (-> v1-23 base) (the-as pointer (&+ a0-25 16))) + ) + (sprite-glow-init-engine s4-0) + (sprite-glow-draw s4-0) + (draw-all-sprites! *simple-sprite-system* s4-0) + (let* ((v1-26 s4-0) + (a0-30 (the-as dma-packet (-> v1-26 base))) + ) + (set! (-> a0-30 dma) (new 'static 'dma-tag :id (dma-tag-id cnt))) + (set! (-> a0-30 vif0) (new 'static 'vif-tag)) + (set! (-> a0-30 vif1) (new 'static 'vif-tag :cmd (vif-cmd flushe) :msk #x1)) + (set! (-> v1-26 base) (the-as pointer (&+ a0-30 16))) + ) + ) + (let ((a0-35 *dma-mem-usage*)) + (when (nonzero? a0-35) + (set! (-> a0-35 length) (max 87 (-> a0-35 length))) + (set! (-> a0-35 data 86 name) "sprite") + (+! (-> a0-35 data 86 count) 1) + (+! (-> a0-35 data 86 used) + (&- (-> *display* frames (-> *display* on-screen) global-buf base) (the-as uint gp-0)) + ) + (set! (-> a0-35 data 86 total) (-> a0-35 data 86 used)) + ) + ) + ) + 0 + (none) + ) + +;; definition for function sprite-allocate-user-hvdf +(defun sprite-allocate-user-hvdf () + "Allocate an HVDF entry. Returns the index in the hvdf-data array." + (dotimes (v1-0 76) + (when (zero? (-> *sprite-hvdf-control* alloc v1-0)) + (set! (-> *sprite-hvdf-control* alloc v1-0) 1) + (return v1-0) + ) + ) + 0 + ) + +;; definition for function sprite-release-user-hvdf +;; WARN: Return type mismatch int vs none. +(defun sprite-release-user-hvdf ((arg0 int)) + "Free an HVDF entry." + (when (and (>= arg0 1) (< arg0 76)) + (set! (-> *sprite-hvdf-control* alloc arg0) 0) + 0 + ) + 0 + (none) + ) + +;; definition for function sprite-get-user-hvdf +;; WARN: Return type mismatch qword vs vector. +(defun sprite-get-user-hvdf ((arg0 int)) + "Get the HVDF vector." + (the-as vector (-> *sprite-hvdf-data* data arg0)) + ) + +;; failed to figure out what this is: +(kmemopen global "sprite-tables") + +;; definition for symbol *sprite-hvdf-data*, type sprite-hvdf-data +(define *sprite-hvdf-data* (new 'global 'sprite-hvdf-data)) + +;; definition for symbol *sprite-hvdf-control*, type sprite-hvdf-control +(define *sprite-hvdf-control* (new 'global 'sprite-hvdf-control)) + +;; failed to figure out what this is: +(dotimes (v1-25 76) + (set! (-> *sprite-hvdf-control* alloc v1-25) 0) + ) + +;; failed to figure out what this is: +(set! (-> *sprite-hvdf-control* alloc 0) 1) + +;; definition for symbol *sprite-aux-list*, type sprite-aux-list +(define *sprite-aux-list* (new 'global 'sprite-aux-list 256)) + +;; definition for symbol *sprite-array-2d*, type sprite-array-2d +(define *sprite-array-2d* (new 'global 'sprite-array-2d 1920 128)) + +;; definition for symbol *sprite-array-3d*, type sprite-array-3d +(define *sprite-array-3d* (new 'global 'sprite-array-3d 256 0)) + +;; failed to figure out what this is: +(kmemclose) + + + + diff --git a/test/offline/config/jak3/config.jsonc b/test/offline/config/jak3/config.jsonc index 2b3a5b402..7da643260 100644 --- a/test/offline/config/jak3/config.jsonc +++ b/test/offline/config/jak3/config.jsonc @@ -80,7 +80,9 @@ // target-handler "target-send-attack", // find-nearest - "find-nearest-focusable" + "find-nearest-focusable", + + "(method 3 sprite-aux-list)" // appears twice. ],