[jak3] Decompile sprite (#3412)

Decompile `sprite.gc`. Also update the DMA macro for a small change in
Jak 3: a check to see if nothing was added to the bucket.
This commit is contained in:
water111 2024-03-09 12:14:12 -05:00 committed by GitHub
parent 0626862a8c
commit 390a511055
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
14 changed files with 1962 additions and 108 deletions

View file

@ -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<LetElement*>(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<LetElement*>(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<CondNoElseElement*>(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<LetElement*>(body->at(0));
insert_tag_call = body->at(1);
} else {
dmatag_let = dynamic_cast<LetElement*>(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))) {

View file

@ -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 ;;

View file

@ -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"]
]
}

View file

@ -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;

View file

@ -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)

View file

@ -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)
)
)

View file

@ -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_)
)
)

View file

@ -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)

View file

@ -595,7 +595,7 @@
(bucket567 567)
(bucket568 568)
(bucket569 569)
(bucket570 570)
(particles 570)
(bucket571 571)
(shadow2 572)
(shadow3 573)

View file

@ -1534,4 +1534,8 @@
,rate #|(if (= (get-video-mode) 'custom) (/ (-> *display* time-factor) 5.0) ,rate)|#)
)
)
)
(defmacro current-frame ()
`(-> *display* frames (-> *display* on-screen))
)

View file

@ -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

View file

@ -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

View file

@ -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: #<sprite-vec-data-2d @ #x~X>~%" (-> this vec-data))
(format #t "~1Tgif-data: #<adgif-shader @ #x~X>~%" (-> this gif-data))
(format #t "~1Taux-data: #<sparticle-cpuinfo @ #x~X>~%" (-> 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: #<vector @ #x~X>~%" (-> this hmge-scale))
(format #t "~1Tconsts: #<vector @ #x~X>~%" (-> 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: #<qword @ #x~X>~%" (-> this adgif-giftag))
(format #t "~1Tsprite-2d-giftag: #<qword @ #x~X>~%" (-> this sprite-2d-giftag))
(format #t "~1Tsprite-2d-giftag-2: #<qword @ #x~X>~%" (-> this sprite-2d-giftag-2))
(format #t "~1Tsincos-01: #<vector @ #x~X>~%" (-> this sincos-01))
(format #t "~1Tsincos-23: #<vector @ #x~X>~%" (-> this sincos-23))
(format #t "~1Tsincos-45: #<vector @ #x~X>~%" (-> this sincos-45))
(format #t "~1Tsincos-67: #<vector @ #x~X>~%" (-> this sincos-67))
(format #t "~1Tsincos-89: #<vector @ #x~X>~%" (-> this sincos-89))
(format #t "~1Tbasis-x: #<vector @ #x~X>~%" (-> this basis-x))
(format #t "~1Tbasis-y: #<vector @ #x~X>~%" (-> this basis-y))
(format #t "~1Tsprite-3d-giftag: #<qword @ #x~X>~%" (-> this sprite-3d-giftag))
(format #t "~1Tsprite-3d-giftag-2: #<qword @ #x~X>~%" (-> this sprite-3d-giftag-2))
(format #t "~1Tscreen-shader: #<adgif-shader @ #x~X>~%" (-> this screen-shader))
(format #t "~1Tinv-hmge-scale: #<vector @ #x~X>~%" (-> this inv-hmge-scale))
(format #t "~1Tstq-offset: #<vector @ #x~X>~%" (-> this stq-offset))
(format #t "~1Tstq-scale: #<vector @ #x~X>~%" (-> this stq-scale))
(format #t "~1Trgba-plain: #<qword @ #x~X>~%" (-> this rgba-plain))
(format #t "~1Twarp-giftag: #<qword @ #x~X>~%" (-> this warp-giftag))
(format #t "~1Tfog-clamp: #<vector @ #x~X>~%" (&-> 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)

View file

@ -80,7 +80,9 @@
// target-handler
"target-send-attack",
// find-nearest
"find-nearest-focusable"
"find-nearest-focusable",
"(method 3 sprite-aux-list)" // appears twice.
],