mirror of
https://github.com/open-goal/jak-project.git
synced 2024-10-20 11:26:18 -04:00
add ref test for sprite and support nested bitfields in static data (#723)
This commit is contained in:
parent
92a5d84a5b
commit
bd9f550d82
|
@ -454,6 +454,13 @@ goos::Object SetFormFormElement::to_form_internal(const Env& env) const {
|
|||
|
||||
goos::Object SetFormFormElement::to_form_for_define(const Env& env) const {
|
||||
if (m_cast_for_define) {
|
||||
// for vu-function, we just put a 0. These aren't supported
|
||||
if (*m_cast_for_define == TypeSpec("vu-function")) {
|
||||
return pretty_print::build_list(
|
||||
fmt::format("define"), m_dst->to_form(env),
|
||||
pretty_print::build_list(fmt::format("the-as {}", m_cast_for_define->print()),
|
||||
pretty_print::to_symbol("0")));
|
||||
}
|
||||
return pretty_print::build_list(
|
||||
fmt::format("define"), m_dst->to_form(env),
|
||||
pretty_print::build_list(fmt::format("the-as {}", m_cast_for_define->print()),
|
||||
|
|
|
@ -647,7 +647,14 @@ BitFieldDef BitFieldDef::from_constant(const BitFieldConstantDef& constant, Form
|
|||
BitFieldDef bfd;
|
||||
bfd.field_name = constant.field_name;
|
||||
bfd.is_signed = constant.is_signed;
|
||||
if (constant.enum_constant) {
|
||||
if (constant.nested_field) {
|
||||
std::vector<BitFieldDef> defs;
|
||||
for (auto& x : constant.nested_field->fields) {
|
||||
defs.push_back(BitFieldDef::from_constant(x, pool));
|
||||
}
|
||||
bfd.value = pool.alloc_single_element_form<BitfieldStaticDefElement>(
|
||||
nullptr, constant.nested_field->field_type, defs);
|
||||
} else if (constant.enum_constant) {
|
||||
bfd.value =
|
||||
pool.alloc_single_element_form<ConstantTokenElement>(nullptr, *constant.enum_constant);
|
||||
} else {
|
||||
|
|
|
@ -530,6 +530,7 @@
|
|||
(water-tex1 60)
|
||||
;; merc1 61
|
||||
;; generic1 62
|
||||
(depth-cue 64)
|
||||
(bucket-65 65)
|
||||
(sprite 66)
|
||||
;; debug spheres? 67
|
||||
|
@ -5075,7 +5076,7 @@
|
|||
(define-extern math-cam-start-smoothing (function float float quaternion))
|
||||
(define-extern move-target-from-pad (function transform int transform))
|
||||
(define-extern transform-point-vector! (function vector vector symbol))
|
||||
(define-extern transform-point-qword! (function vector vector symbol))
|
||||
(define-extern transform-point-qword! (function vector4w vector symbol))
|
||||
(define-extern transform-point-vector-scale! (function vector vector float))
|
||||
(define-extern init-for-transform (function matrix none))
|
||||
|
||||
|
@ -15698,7 +15699,7 @@
|
|||
|
||||
;; - Functions
|
||||
|
||||
(define-extern depth-cue-draw-front function)
|
||||
(define-extern depth-cue-draw-front (function dma-buffer int float float uint int none))
|
||||
(define-extern depth-cue-set-stencil function)
|
||||
(define-extern depth-cue-draw-depth function)
|
||||
(define-extern depth-cue-calc-z function)
|
||||
|
@ -15706,7 +15707,7 @@
|
|||
|
||||
;; - Unknowns
|
||||
|
||||
;;(define-extern *depth-cue-work* object) ;; unknown type
|
||||
(define-extern *depth-cue-work* depth-cue-work)
|
||||
|
||||
|
||||
;; ----------------------
|
||||
|
|
|
@ -97,10 +97,6 @@
|
|||
// vector
|
||||
"vector=", // asm branching
|
||||
|
||||
// texture
|
||||
// "adgif-shader<-texture-with-update!", // F: asm branching
|
||||
// "(method 9 texture-page-dir)",
|
||||
|
||||
// collide-mesh-h
|
||||
"(method 11 collide-mesh-cache)",
|
||||
|
||||
|
@ -117,6 +113,9 @@
|
|||
"clear-frame-accumulator", // F: asm branching
|
||||
"cspace<-parented-transformq-joint!",
|
||||
|
||||
// sprite
|
||||
"add-to-sprite-aux-list", // fine, but don't know types yet.
|
||||
|
||||
// merc-blend-shape
|
||||
"setup-blerc-chains-for-one-fragment", // F: asm branching
|
||||
"blerc-execute", // F: asm branching
|
||||
|
@ -526,8 +525,6 @@
|
|||
|
||||
"(method 12 perf-stat)": [0],
|
||||
"(method 11 perf-stat)": [0],
|
||||
"(method 20 actor-link-info)": [2],
|
||||
"(method 21 actor-link-info)": [2],
|
||||
"raw-ray-sphere-intersect": [0, 1, 2, 3, 4, 5],
|
||||
"ray-cylinder-intersect": [0, 1, 2, 3, 4, 5],
|
||||
"ray-triangle-intersect": [0, 1, 2, 3, 4],
|
||||
|
|
|
@ -1282,7 +1282,8 @@
|
|||
["L509", "(inline-array list-field)", true, 12],
|
||||
["L123", "_lambda_", true],
|
||||
["L119", "_lambda_", true],
|
||||
["L86", "_lambda_", true]
|
||||
["L86", "_lambda_", true],
|
||||
["L652", "float", true]
|
||||
],
|
||||
|
||||
// please do not add things after this entry! git is dumb.
|
||||
|
|
|
@ -1266,20 +1266,20 @@
|
|||
[23, "v1", "float"],
|
||||
[36, "v1", "uint"]
|
||||
],
|
||||
|
||||
|
||||
"(method 0 anim-test-obj)": [
|
||||
[9, "s4", "anim-test-obj"],
|
||||
[10, "s4", "anim-test-obj"],
|
||||
[13, "s4", "anim-test-obj"],
|
||||
[15, "s4", "anim-test-obj"]
|
||||
],
|
||||
|
||||
|
||||
"(method 0 anim-test-sequence)": [
|
||||
[8, "s5", "anim-test-sequence"],
|
||||
[11, "s5", "anim-test-sequence"],
|
||||
[13, "s5", "anim-test-sequence"]
|
||||
],
|
||||
|
||||
|
||||
"(method 0 anim-test-seq-item)": [
|
||||
[8, "v1", "anim-test-seq-item"],
|
||||
[10, "v0", "anim-test-seq-item"],
|
||||
|
@ -1287,7 +1287,7 @@
|
|||
[14, "v0", "anim-test-seq-item"],
|
||||
[17, "v0", "anim-test-seq-item"]
|
||||
],
|
||||
|
||||
|
||||
"(method 3 anim-tester)": [
|
||||
[12, "s5", "anim-test-obj"],
|
||||
[15, "s5", "anim-test-obj"],
|
||||
|
@ -1311,7 +1311,7 @@
|
|||
[126, "s3", "anim-test-seq-item"],
|
||||
[128, "s3", "anim-test-seq-item"]
|
||||
],
|
||||
|
||||
|
||||
"anim-test-obj-item-valid?": [
|
||||
[5, "s5", "anim-test-sequence"],
|
||||
[12, "s5", "anim-test-sequence"],
|
||||
|
@ -1322,7 +1322,7 @@
|
|||
[26, "v1", "anim-test-seq-item"],
|
||||
[28, "v1", "anim-test-seq-item"]
|
||||
],
|
||||
|
||||
|
||||
"anim-test-obj-remove-invalid": [
|
||||
[84, "v1", "anim-test-sequence"],
|
||||
[88, "v1", "anim-test-sequence"],
|
||||
|
@ -1350,7 +1350,7 @@
|
|||
[36, "s3", "anim-test-seq-item"],
|
||||
[61, "a0", "anim-test-seq-item"]
|
||||
],
|
||||
|
||||
|
||||
"anim-tester-reset": [
|
||||
[14, "v1", "anim-test-obj"],
|
||||
[30, "v1", "anim-test-obj"],
|
||||
|
@ -1359,12 +1359,12 @@
|
|||
[43, "v1", "anim-test-obj"],
|
||||
[[50, 53], "v1", "anim-test-obj"]
|
||||
],
|
||||
|
||||
|
||||
"anim-tester-save-all-objects": [
|
||||
[[4, 19], "gp", "anim-test-obj"],
|
||||
[17, "v1", "anim-test-obj"]
|
||||
],
|
||||
|
||||
|
||||
"anim-tester-save-object-seqs": [
|
||||
[63, "s5", "anim-test-sequence"],
|
||||
[69, "s5", "anim-test-sequence"],
|
||||
|
@ -1386,7 +1386,7 @@
|
|||
[121, "v1", "anim-test-seq-item"],
|
||||
[122, "s4", "anim-test-seq-item"]
|
||||
],
|
||||
|
||||
|
||||
"anim-test-obj-list-handler": [
|
||||
[25, "s5", "anim-test-obj"],
|
||||
[31, "s5", "anim-test-obj"],
|
||||
|
@ -1394,7 +1394,7 @@
|
|||
[166, "s5", "anim-test-obj"],
|
||||
[112, "v1", "anim-tester"]
|
||||
],
|
||||
|
||||
|
||||
"anim-test-anim-list-handler": [
|
||||
[2, "s5", "anim-test-obj"],
|
||||
[25, "s5", "anim-test-obj"],
|
||||
|
@ -1413,7 +1413,7 @@
|
|||
[171, "v1", "anim-test-obj"],
|
||||
[173, "v1", "anim-test-obj"]
|
||||
],
|
||||
|
||||
|
||||
"anim-test-sequence-list-handler": [
|
||||
[2, "s5", "anim-test-sequence"],
|
||||
[25, "s5", "anim-test-sequence"],
|
||||
|
@ -1429,7 +1429,7 @@
|
|||
[146, "v1", "anim-test-sequence"],
|
||||
[151, "v1", "anim-test-sequence"]
|
||||
],
|
||||
|
||||
|
||||
"anim-test-edit-sequence-list-handler": [
|
||||
[[122, 965], "s4", "anim-test-sequence"],
|
||||
[129, "v1", "glst-named-node"],
|
||||
|
@ -1442,21 +1442,21 @@
|
|||
[491, "s3", "anim-test-seq-item"],
|
||||
[502, "s3", "anim-test-seq-item"]
|
||||
],
|
||||
|
||||
|
||||
"anim-tester-interface": [
|
||||
[[34, 48], "gp", "anim-test-obj"],
|
||||
[[95, 109], "gp", "anim-test-obj"],
|
||||
[[156, 160], "v1", "anim-test-obj"],
|
||||
[[162, 165], "v1", "anim-test-sequence"]
|
||||
],
|
||||
|
||||
|
||||
"anim-tester-get-playing-item": [
|
||||
[7, "v0", "anim-test-seq-item"],
|
||||
[[5, 22], "s5", "anim-test-seq-item"],
|
||||
[21, "v0", "anim-test-seq-item"],
|
||||
[25, "v0", "anim-test-seq-item"]
|
||||
],
|
||||
|
||||
|
||||
"anim-tester-add-newobj": [
|
||||
[[2, 185], "s2", "anim-test-obj"],
|
||||
[[70, 193], "s5", "anim-test-obj"],
|
||||
|
@ -1466,20 +1466,16 @@
|
|||
[164, "a0", "art-joint-anim"],
|
||||
[170, "a0", "art-joint-anim"]
|
||||
],
|
||||
|
||||
"anim-tester-start": [
|
||||
[20, "t9", "(function process function none)"]
|
||||
],
|
||||
|
||||
|
||||
"anim-tester-start": [[20, "t9", "(function process function none)"]],
|
||||
|
||||
"anim-tester-set-name": [
|
||||
[[34, 51], "s3", "anim-test-obj"],
|
||||
[[40, 63], "s5", "anim-test-sequence"]
|
||||
],
|
||||
|
||||
"anim-tester-add-sequence": [
|
||||
[[33, 102], "s5", "anim-test-obj"]
|
||||
],
|
||||
|
||||
|
||||
"anim-tester-add-sequence": [[[33, 102], "s5", "anim-test-obj"]],
|
||||
|
||||
"(anon-function 11 anim-tester)": [
|
||||
[[23, 113], "s4", "anim-test-obj"],
|
||||
[[83, 338], "gp", "anim-test-sequence"],
|
||||
|
@ -1579,5 +1575,17 @@
|
|||
[[62, 67], "a1", "dma-packet"]
|
||||
],
|
||||
|
||||
"sprite-draw-distorters": [
|
||||
[[70, 90], "a0", "vector"],
|
||||
[72, "v1", "vector"],
|
||||
[93, "v1", "vector"],
|
||||
[96, "v1", "vector"],
|
||||
[115, "v1", "(pointer int32)"],
|
||||
[119, "a0", "(pointer int32)"],
|
||||
[124, "v1", "vector"],
|
||||
[154, "v1", "vector"],
|
||||
[[172, 189], "a1", "dma-packet"]
|
||||
],
|
||||
|
||||
"placeholder-do-not-add-below": []
|
||||
}
|
||||
|
|
|
@ -2162,6 +2162,7 @@
|
|||
},
|
||||
|
||||
"add-debug-point": {
|
||||
"args": ["enable-draw", "bucket", "pt"],
|
||||
"vars": {
|
||||
"a0-6": ["a0-6", "(pointer uint64)"],
|
||||
"a0-7": ["a0-7", "dma-packet"],
|
||||
|
|
|
@ -1183,6 +1183,14 @@ std::optional<std::vector<BitFieldConstantDef>> try_decompile_bitfield_from_int(
|
|||
auto name = decompile_int_enum_from_int(field.type(), ts, bitfield_value);
|
||||
def.enum_constant = fmt::format("({} {})", field.type().print(), name);
|
||||
}
|
||||
|
||||
auto nested_bitfield_type = dynamic_cast<BitFieldType*>(ts.lookup_type(field.type()));
|
||||
if (nested_bitfield_type) {
|
||||
BitFieldConstantDef::NestedField nested;
|
||||
nested.field_type = field.type();
|
||||
nested.fields = *try_decompile_bitfield_from_int(field.type(), ts, bitfield_value, true);
|
||||
def.nested_field = nested;
|
||||
}
|
||||
result.push_back(def);
|
||||
}
|
||||
|
||||
|
|
|
@ -73,6 +73,13 @@ struct BitFieldConstantDef {
|
|||
u64 value = -1;
|
||||
std::optional<std::string> enum_constant;
|
||||
std::string field_name;
|
||||
|
||||
struct NestedField {
|
||||
TypeSpec field_type;
|
||||
std::vector<BitFieldConstantDef> fields;
|
||||
};
|
||||
|
||||
std::optional<NestedField> nested_field;
|
||||
};
|
||||
|
||||
template <typename T>
|
||||
|
|
|
@ -439,7 +439,7 @@
|
|||
)
|
||||
)
|
||||
|
||||
(defun transform-point-qword! ((arg0 vector) (arg1 vector))
|
||||
(defun transform-point-qword! ((arg0 vector4w) (arg1 vector))
|
||||
"Apply camera transformation to point, returning fixed point 28.4 position"
|
||||
(rlet ((acc :class vf)
|
||||
(Q :class vf)
|
||||
|
|
|
@ -5,7 +5,6 @@
|
|||
;; name in dgo: debug-sphere
|
||||
;; dgos: GAME, ENGINE
|
||||
|
||||
;; definition of type debug-sphere-table
|
||||
(deftype debug-sphere-table (basic)
|
||||
((point vector 300 :inline :offset-assert 16)
|
||||
)
|
||||
|
@ -14,9 +13,6 @@
|
|||
:flag-assert #x9000012d0
|
||||
)
|
||||
|
||||
;; definition for function make-debug-sphere-table
|
||||
;; INFO: Return type mismatch int vs none.
|
||||
;; Used lq/sq
|
||||
(defun make-debug-sphere-table ((arg0 debug-sphere-table))
|
||||
(local-vars (sv-80 int))
|
||||
(let ((s5-0 (new-stack-vector0))
|
||||
|
@ -31,41 +27,17 @@
|
|||
(s1-0 (new-stack-vector0))
|
||||
(s0-0 (new-stack-vector0))
|
||||
)
|
||||
(set!
|
||||
(-> s2-0 y)
|
||||
(+ (-> s5-0 y) (* (cos (* 3276.8 (the float s3-0))) f30-0))
|
||||
)
|
||||
(set! (-> s2-0 y) (+ (-> s5-0 y) (* (cos (* 3276.8 (the float s3-0))) f30-0)))
|
||||
(set! (-> s1-0 y) (-> s2-0 y))
|
||||
(set!
|
||||
(-> s0-0 y)
|
||||
(+ (-> s5-0 y) (* (cos (* 3276.8 (the float (+ s3-0 1)))) f30-0))
|
||||
)
|
||||
(set! (-> s0-0 y) (+ (-> s5-0 y) (* (cos (* 3276.8 (the float (+ s3-0 1)))) f30-0)))
|
||||
(set! sv-80 0)
|
||||
(while (< sv-80 10)
|
||||
(set!
|
||||
(-> s2-0 x)
|
||||
(+ (-> s5-0 x) (* (cos (* 6553.6 (the float sv-80))) f28-0))
|
||||
)
|
||||
(set!
|
||||
(-> s2-0 z)
|
||||
(+ (-> s5-0 z) (* (sin (* 6553.6 (the float sv-80))) f28-0))
|
||||
)
|
||||
(set!
|
||||
(-> s1-0 x)
|
||||
(+ (-> s5-0 x) (* (cos (* 6553.6 (the float (+ sv-80 1)))) f28-0))
|
||||
)
|
||||
(set!
|
||||
(-> s1-0 z)
|
||||
(+ (-> s5-0 z) (* (sin (* 6553.6 (the float (+ sv-80 1)))) f28-0))
|
||||
)
|
||||
(set!
|
||||
(-> s0-0 x)
|
||||
(+ (-> s5-0 x) (* (cos (* 6553.6 (the float sv-80))) f26-0))
|
||||
)
|
||||
(set!
|
||||
(-> s0-0 z)
|
||||
(+ (-> s5-0 z) (* (sin (* 6553.6 (the float sv-80))) f26-0))
|
||||
)
|
||||
(set! (-> s2-0 x) (+ (-> s5-0 x) (* (cos (* 6553.6 (the float sv-80))) f28-0)))
|
||||
(set! (-> s2-0 z) (+ (-> s5-0 z) (* (sin (* 6553.6 (the float sv-80))) f28-0)))
|
||||
(set! (-> s1-0 x) (+ (-> s5-0 x) (* (cos (* 6553.6 (the float (+ sv-80 1)))) f28-0)))
|
||||
(set! (-> s1-0 z) (+ (-> s5-0 z) (* (sin (* 6553.6 (the float (+ sv-80 1)))) f28-0)))
|
||||
(set! (-> s0-0 x) (+ (-> s5-0 x) (* (cos (* 6553.6 (the float sv-80))) f26-0)))
|
||||
(set! (-> s0-0 z) (+ (-> s5-0 z) (* (sin (* 6553.6 (the float sv-80))) f26-0)))
|
||||
(set! (-> arg0 point s4-0 quad) (-> s2-0 quad))
|
||||
(set! (-> arg0 point (+ s4-0 1) quad) (-> s1-0 quad))
|
||||
(set! (-> arg0 point (+ s4-0 2) quad) (-> s0-0 quad))
|
||||
|
@ -75,56 +47,45 @@
|
|||
)
|
||||
)
|
||||
)
|
||||
(let ((v0-10 0))
|
||||
)
|
||||
(none)
|
||||
)
|
||||
|
||||
;; definition for symbol *debug-sphere-table*, type debug-sphere-table
|
||||
(define *debug-sphere-table* (new 'static 'debug-sphere-table))
|
||||
|
||||
;; failed to figure out what this is:
|
||||
(make-debug-sphere-table *debug-sphere-table*)
|
||||
|
||||
;; definition for function add-debug-sphere-from-table
|
||||
;; INFO: Return type mismatch int vs none.
|
||||
;; Used lq/sq
|
||||
(defun
|
||||
add-debug-sphere-from-table
|
||||
((arg0 bucket-id) (arg1 vector) (arg2 float) (arg3 rgba))
|
||||
(defun add-debug-sphere-from-table ((arg0 bucket-id) (arg1 vector) (arg2 float) (arg3 rgba))
|
||||
"Draw a wireframe sphere"
|
||||
(rlet ((vf1 :class vf)
|
||||
(vf2 :class vf)
|
||||
(vf3 :class vf)
|
||||
(vf4 :class vf)
|
||||
(vf5 :class vf)
|
||||
)
|
||||
(let ((s4-0 (new-stack-vector0))
|
||||
(s3-0 (new-stack-vector0))
|
||||
(s2-0 (new-stack-vector0))
|
||||
(points (-> *debug-sphere-table* point))
|
||||
)
|
||||
(.lvf vf1 (&-> arg1 quad))
|
||||
(.mov vf2 arg2)
|
||||
(dotimes (s0-0 100)
|
||||
(.lvf vf3 (&-> points 0 quad))
|
||||
(.lvf vf4 (&-> points 1 quad))
|
||||
(.lvf vf5 (&-> points 2 quad))
|
||||
(set! points (the-as (inline-array vector) (-> points 3)))
|
||||
(.mul.x.vf vf3 vf3 vf2)
|
||||
(.mul.x.vf vf4 vf4 vf2)
|
||||
(.mul.x.vf vf5 vf5 vf2)
|
||||
(.add.vf vf3 vf3 vf1)
|
||||
(.add.vf vf4 vf4 vf1)
|
||||
(.add.vf vf5 vf5 vf1)
|
||||
(.svf (&-> s4-0 quad) vf3)
|
||||
(.svf (&-> s3-0 quad) vf4)
|
||||
(.svf (&-> s2-0 quad) vf5)
|
||||
(add-debug-line #t arg0 s4-0 s3-0 arg3 #f (the rgba -1))
|
||||
(add-debug-line #t arg0 s4-0 s2-0 arg3 #f (the rgba -1))
|
||||
)
|
||||
(let ((s4-0 (new-stack-vector0))
|
||||
(s3-0 (new-stack-vector0))
|
||||
(s2-0 (new-stack-vector0))
|
||||
(points (-> *debug-sphere-table* point))
|
||||
)
|
||||
(.lvf vf1 (&-> arg1 quad))
|
||||
(.mov vf2 arg2)
|
||||
(dotimes (s0-0 100)
|
||||
(.lvf vf3 (&-> points 0 quad))
|
||||
(.lvf vf4 (&-> points 1 quad))
|
||||
(.lvf vf5 (&-> points 2 quad))
|
||||
(set! points (the-as (inline-array vector) (-> points 3)))
|
||||
(.mul.x.vf vf3 vf3 vf2)
|
||||
(.mul.x.vf vf4 vf4 vf2)
|
||||
(.mul.x.vf vf5 vf5 vf2)
|
||||
(.add.vf vf3 vf3 vf1)
|
||||
(.add.vf vf4 vf4 vf1)
|
||||
(.add.vf vf5 vf5 vf1)
|
||||
(.svf (&-> s4-0 quad) vf3)
|
||||
(.svf (&-> s3-0 quad) vf4)
|
||||
(.svf (&-> s2-0 quad) vf5)
|
||||
(add-debug-line #t arg0 s4-0 s3-0 arg3 #f (the rgba -1))
|
||||
(add-debug-line #t arg0 s4-0 s2-0 arg3 #f (the rgba -1))
|
||||
)
|
||||
)
|
||||
(none)
|
||||
)
|
||||
(let ((v0-2 0))
|
||||
)
|
||||
(none)
|
||||
)
|
||||
)
|
||||
|
|
|
@ -6,15 +6,17 @@
|
|||
;; dgos: GAME, ENGINE
|
||||
|
||||
|
||||
(defun transform-float-point ((arg0 vector) (arg1 vector))
|
||||
|
||||
(defun transform-float-point ((in vector) (out vector))
|
||||
"Transform point in and store the result in out.
|
||||
This uses the cached vf register transformation matrix
|
||||
Note that the input/output order of the arguments is swapped from usual"
|
||||
(with-vf0
|
||||
(with-vf (vf4 vf1 vf2 vf3 vf9 vf8 vf6)
|
||||
(rlet ((acc :class vf)
|
||||
(Q :class vf)
|
||||
(vf5 :class vf)
|
||||
)
|
||||
(.lvf vf5 (&-> arg0 quad))
|
||||
(.lvf vf5 (&-> in quad))
|
||||
(.mul.w.vf acc vf4 vf5)
|
||||
(.add.mul.x.vf acc vf1 vf5 acc)
|
||||
(.add.mul.y.vf acc vf2 vf5 acc)
|
||||
|
@ -26,146 +28,154 @@
|
|||
(.max.x.vf vf5 vf5 vf0 :mask #b1000)
|
||||
(.min.x.vf vf5 vf5 vf6 :mask #b1000)
|
||||
(vftoi4.xyzw vf5 vf5)
|
||||
(.svf (&-> arg1 quad) vf5)
|
||||
arg1
|
||||
(.svf (&-> out quad) vf5)
|
||||
out
|
||||
)
|
||||
)
|
||||
)
|
||||
)
|
||||
|
||||
|
||||
(defun-debug add-debug-point ((arg0 symbol) (arg1 bucket-id) (arg2 vector))
|
||||
(if (not arg0)
|
||||
(return #f)
|
||||
)
|
||||
;;;;;;;;;;;;;;;;;;
|
||||
;; Debug Draw
|
||||
;;;;;;;;;;;;;;;;;;
|
||||
|
||||
;; All of these functions are super slow and probably very old.
|
||||
;; They do a DMA packet per thing drawn.
|
||||
|
||||
(defun-debug add-debug-point ((enable-draw symbol) (bucket bucket-id) (pt vector))
|
||||
"Draw a point."
|
||||
(if (not enable-draw)
|
||||
(return #f)
|
||||
)
|
||||
(let ((s5-0 (new 'stack 'vector4w-2)))
|
||||
(set! (-> arg2 w) 1.0)
|
||||
(when (transform-point-qword! (the-as vector (-> s5-0 quad)) arg2)
|
||||
(let* ((v1-7 (-> *display* frames (-> *display* on-screen) frame debug-buf))
|
||||
(a2-1 (-> v1-7 base))
|
||||
;; transform the input point and convert to fixed point
|
||||
(set! (-> pt w) 1.0)
|
||||
(when (transform-point-qword! (the-as vector4w (-> s5-0 quad)) pt)
|
||||
(let* ((v1-7 (-> *display* frames (-> *display* on-screen) frame debug-buf))
|
||||
(a2-1 (-> v1-7 base))
|
||||
)
|
||||
(let ((a0-6 (the-as (pointer uint64) (-> v1-7 base))))
|
||||
(let* ((a1-3 v1-7)
|
||||
(a3-0 (the-as dma-packet (-> a1-3 base)))
|
||||
)
|
||||
;; for now, don't set the length
|
||||
(set! (-> a3-0 dma) (new 'static 'dma-tag :id (dma-tag-id cnt)))
|
||||
(set! (-> a3-0 vif0) (new 'static 'vif-tag))
|
||||
(set! (-> a3-0 vif1) (new 'static 'vif-tag :cmd (vif-cmd direct) :msk #x1))
|
||||
(set! (-> a1-3 base) (&+ (the-as pointer a3-0) 16))
|
||||
)
|
||||
|
||||
;; add a giftag to draw a primitive
|
||||
(let* ((a1-4 v1-7)
|
||||
(a3-2 (the-as gs-gif-tag (-> a1-4 base)))
|
||||
)
|
||||
(set! (-> a3-2 tag)
|
||||
(new 'static 'gif-tag64
|
||||
:nloop #x1
|
||||
:eop #x1
|
||||
:pre #x1
|
||||
:prim #x4c
|
||||
:nreg #x8
|
||||
)
|
||||
)
|
||||
(set! (-> a3-2 regs)
|
||||
(new 'static 'gif-tag-regs
|
||||
:regs0 (gif-reg-id rgbaq)
|
||||
:regs1 (gif-reg-id xyzf2)
|
||||
:regs2 (gif-reg-id rgbaq)
|
||||
:regs3 (gif-reg-id xyzf2)
|
||||
:regs4 (gif-reg-id rgbaq)
|
||||
:regs5 (gif-reg-id xyzf2)
|
||||
:regs6 (gif-reg-id rgbaq)
|
||||
:regs7 (gif-reg-id xyzf2)
|
||||
)
|
||||
)
|
||||
(set! (-> a1-4 base) (&+ (the-as pointer a3-2) 16))
|
||||
)
|
||||
|
||||
;; add the data.
|
||||
(set! (-> s5-0 vector 1 x) 255)
|
||||
(set! (-> s5-0 vector 1 y) 128)
|
||||
(set! (-> s5-0 vector 1 z) 128)
|
||||
(set! (-> s5-0 vector 1 w) 128)
|
||||
(+! (-> s5-0 vector 0 y) 160)
|
||||
(let* ((a1-11 v1-7)
|
||||
(a3-4 (the-as vector4w-2 (-> a1-11 base)))
|
||||
)
|
||||
(set! (-> a3-4 quad 0) (-> (&-> s5-0 quad 1) 0))
|
||||
(set! (-> a3-4 quad 1) (-> s5-0 quad 0))
|
||||
(set! (-> a1-11 base) (&+ (the-as pointer a3-4) 32))
|
||||
)
|
||||
(+! (-> s5-0 vector 0 x) -256)
|
||||
(+! (-> s5-0 vector 0 y) -160)
|
||||
(set! (-> s5-0 vector 1 x) 128)
|
||||
(set! (-> s5-0 vector 1 y) 255)
|
||||
(let* ((a1-18 v1-7)
|
||||
(a3-6 (the-as vector4w-2 (-> a1-18 base)))
|
||||
)
|
||||
(set! (-> a3-6 quad 0) (-> (&-> s5-0 quad 1) 0))
|
||||
(set! (-> a3-6 quad 1) (-> s5-0 quad 0))
|
||||
(set! (-> a1-18 base) (&+ (the-as pointer a3-6) 32))
|
||||
)
|
||||
(+! (-> s5-0 vector 0 x) 512)
|
||||
(set! (-> s5-0 vector 1 y) 128)
|
||||
(set! (-> s5-0 vector 1 z) 255)
|
||||
(let* ((a1-23 v1-7)
|
||||
(a3-8 (the-as vector4w-2 (-> a1-23 base)))
|
||||
)
|
||||
(set! (-> a3-8 quad 0) (-> (&-> s5-0 quad 1) 0))
|
||||
(set! (-> a3-8 quad 1) (-> s5-0 quad 0))
|
||||
(set! (-> a1-23 base) (&+ (the-as pointer a3-8) 32))
|
||||
)
|
||||
(+! (-> s5-0 vector 0 x) -256)
|
||||
(+! (-> s5-0 vector 0 y) -160)
|
||||
(set! (-> s5-0 vector 1 x) 255)
|
||||
(set! (-> s5-0 vector 1 y) 128)
|
||||
(let* ((a3-10 v1-7)
|
||||
(a1-30 (the-as vector4w-2 (-> a3-10 base)))
|
||||
)
|
||||
(set! (-> a1-30 quad 0) (-> (&-> s5-0 quad 1) 0))
|
||||
(set! (-> a1-30 quad 1) (-> s5-0 quad 0))
|
||||
(set! (-> a3-10 base) (&+ (the-as pointer a1-30) 32))
|
||||
)
|
||||
|
||||
;; update the lengths
|
||||
(let ((a3-14 (/ (the-as int (+ (&- (the-as pointer -16) (the-as uint a0-6)) (the-as int (-> v1-7 base)))) 16)))
|
||||
(cond
|
||||
((nonzero? a3-14)
|
||||
(logior! (-> a0-6 0) (shr (shl a3-14 48) 48))
|
||||
(logior! (-> a0-6 1) (shl (shr (shl a3-14 48) 48) 32))
|
||||
)
|
||||
(else
|
||||
(set! (-> v1-7 base) a0-6)
|
||||
)
|
||||
)
|
||||
)
|
||||
)
|
||||
|
||||
;; add to bucket
|
||||
(let ((a3-20 (-> v1-7 base)))
|
||||
(let ((a0-7 (the-as dma-packet (-> v1-7 base))))
|
||||
(set! (-> a0-7 dma) (new 'static 'dma-tag :id (dma-tag-id next)))
|
||||
(set! (-> a0-7 vif0) (new 'static 'vif-tag))
|
||||
(set! (-> a0-7 vif1) (new 'static 'vif-tag))
|
||||
(set! (-> v1-7 base) (&+ (the-as pointer a0-7) 16))
|
||||
)
|
||||
(dma-bucket-insert-tag
|
||||
(-> *display* frames (-> *display* on-screen) frame bucket-group)
|
||||
bucket
|
||||
a2-1
|
||||
(the-as (pointer dma-tag) a3-20)
|
||||
)
|
||||
(let ((a0-6 (the-as (pointer uint64) (-> v1-7 base))))
|
||||
(let* ((a1-3 v1-7)
|
||||
(a3-0 (the-as dma-packet (-> a1-3 base)))
|
||||
)
|
||||
(set! (-> a3-0 dma) (new 'static 'dma-tag :id (dma-tag-id cnt)))
|
||||
(set! (-> a3-0 vif0) (new 'static 'vif-tag))
|
||||
(set!
|
||||
(-> a3-0 vif1)
|
||||
(new 'static 'vif-tag :cmd (vif-cmd direct) :msk #x1)
|
||||
)
|
||||
(set! (-> a1-3 base) (&+ (the-as pointer a3-0) 16))
|
||||
)
|
||||
(let* ((a1-4 v1-7)
|
||||
(a3-2 (the-as gs-gif-tag (-> a1-4 base)))
|
||||
)
|
||||
(set!
|
||||
(-> a3-2 tag)
|
||||
(new 'static 'gif-tag64
|
||||
:nloop #x1
|
||||
:eop #x1
|
||||
:pre #x1
|
||||
:prim #x4c
|
||||
:nreg #x8
|
||||
)
|
||||
)
|
||||
(set!
|
||||
(-> a3-2 regs)
|
||||
(new 'static 'gif-tag-regs
|
||||
:regs0 (gif-reg-id rgbaq)
|
||||
:regs1 (gif-reg-id xyzf2)
|
||||
:regs2 (gif-reg-id rgbaq)
|
||||
:regs3 (gif-reg-id xyzf2)
|
||||
:regs4 (gif-reg-id rgbaq)
|
||||
:regs5 (gif-reg-id xyzf2)
|
||||
:regs6 (gif-reg-id rgbaq)
|
||||
:regs7 (gif-reg-id xyzf2)
|
||||
)
|
||||
)
|
||||
(set! (-> a1-4 base) (&+ (the-as pointer a3-2) 16))
|
||||
)
|
||||
(set! (-> s5-0 vector 1 x) 255)
|
||||
(set! (-> s5-0 vector 1 y) 128)
|
||||
(set! (-> s5-0 vector 1 z) 128)
|
||||
(set! (-> s5-0 vector 1 w) 128)
|
||||
(set! (-> s5-0 vector 0 y) (+ (-> s5-0 vector 0 y) 160))
|
||||
(let* ((a1-11 v1-7)
|
||||
(a3-4 (the-as vector4w-2 (-> a1-11 base)))
|
||||
)
|
||||
(set! (-> a3-4 quad 0) (-> (&-> s5-0 quad 1) 0))
|
||||
(set! (-> a3-4 quad 1) (-> s5-0 quad 0))
|
||||
(set! (-> a1-11 base) (&+ (the-as pointer a3-4) 32))
|
||||
)
|
||||
(set! (-> s5-0 vector 0 x) (+ (-> s5-0 vector 0 x) -256))
|
||||
(set! (-> s5-0 vector 0 y) (+ (-> s5-0 vector 0 y) -160))
|
||||
(set! (-> s5-0 vector 1 x) 128)
|
||||
(set! (-> s5-0 vector 1 y) 255)
|
||||
(let* ((a1-18 v1-7)
|
||||
(a3-6 (the-as vector4w-2 (-> a1-18 base)))
|
||||
)
|
||||
(set! (-> a3-6 quad 0) (-> (&-> s5-0 quad 1) 0))
|
||||
(set! (-> a3-6 quad 1) (-> s5-0 quad 0))
|
||||
(set! (-> a1-18 base) (&+ (the-as pointer a3-6) 32))
|
||||
)
|
||||
(set! (-> s5-0 vector 0 x) (+ (-> s5-0 vector 0 x) 512))
|
||||
(set! (-> s5-0 vector 1 y) 128)
|
||||
(set! (-> s5-0 vector 1 z) 255)
|
||||
(let* ((a1-23 v1-7)
|
||||
(a3-8 (the-as vector4w-2 (-> a1-23 base)))
|
||||
)
|
||||
(set! (-> a3-8 quad 0) (-> (&-> s5-0 quad 1) 0))
|
||||
(set! (-> a3-8 quad 1) (-> s5-0 quad 0))
|
||||
(set! (-> a1-23 base) (&+ (the-as pointer a3-8) 32))
|
||||
)
|
||||
(set! (-> s5-0 vector 0 x) (+ (-> s5-0 vector 0 x) -256))
|
||||
(set! (-> s5-0 vector 0 y) (+ (-> s5-0 vector 0 y) -160))
|
||||
(set! (-> s5-0 vector 1 x) 255)
|
||||
(set! (-> s5-0 vector 1 y) 128)
|
||||
(let* ((a3-10 v1-7)
|
||||
(a1-30 (the-as vector4w-2 (-> a3-10 base)))
|
||||
)
|
||||
(set! (-> a1-30 quad 0) (-> (&-> s5-0 quad 1) 0))
|
||||
(set! (-> a1-30 quad 1) (-> s5-0 quad 0))
|
||||
(set! (-> a3-10 base) (&+ (the-as pointer a1-30) 32))
|
||||
)
|
||||
(let ((a3-14 (/ (the-as int (+ (&- (the-as pointer -16) (the-as uint a0-6)) (the-as int (-> v1-7 base)))) 16)))
|
||||
(cond
|
||||
((nonzero? a3-14)
|
||||
(set!
|
||||
(-> a0-6 0)
|
||||
(logior (-> a0-6 0) (the-as uint (shr (shl a3-14 48) 48)))
|
||||
)
|
||||
(set!
|
||||
(-> a0-6 1)
|
||||
(logior (-> a0-6 1) (the-as uint (shl (shr (shl a3-14 48) 48) 32)))
|
||||
)
|
||||
)
|
||||
(else
|
||||
(set! (-> v1-7 base) a0-6)
|
||||
)
|
||||
)
|
||||
)
|
||||
)
|
||||
(let ((a3-20 (-> v1-7 base)))
|
||||
(let ((a0-7 (the-as dma-packet (-> v1-7 base))))
|
||||
(set! (-> a0-7 dma) (new 'static 'dma-tag :id (dma-tag-id next)))
|
||||
(set! (-> a0-7 vif0) (new 'static 'vif-tag))
|
||||
(set! (-> a0-7 vif1) (new 'static 'vif-tag))
|
||||
(set! (-> v1-7 base) (&+ (the-as pointer a0-7) 16))
|
||||
)
|
||||
(dma-bucket-insert-tag
|
||||
(-> *display* frames (-> *display* on-screen) frame bucket-group)
|
||||
arg1
|
||||
a2-1
|
||||
(the-as (pointer dma-tag) a3-20)
|
||||
)
|
||||
)
|
||||
)
|
||||
)
|
||||
)
|
||||
#f
|
||||
)
|
||||
|
||||
|
||||
(defun-debug internal-draw-debug-line ((arg0 bucket-id) (arg1 vector) (arg2 vector) (arg3 rgba) (arg4 symbol) (arg5 rgba))
|
||||
(local-vars (sv-80 vector))
|
||||
(set! sv-80 arg2)
|
||||
|
@ -214,8 +224,8 @@
|
|||
int
|
||||
(when
|
||||
(and
|
||||
(transform-point-qword! (the-as vector (-> s4-0 quad)) arg1)
|
||||
(transform-point-qword! (the-as vector (&-> s4-0 quad 1)) sv-80)
|
||||
(transform-point-qword! (the-as vector4w (-> s4-0 quad)) arg1)
|
||||
(transform-point-qword! (the-as vector4w (&-> s4-0 quad 1)) sv-80)
|
||||
)
|
||||
(let*
|
||||
((v1-28 (-> *display* frames (-> *display* on-screen) frame debug-buf))
|
||||
|
@ -389,7 +399,7 @@
|
|||
(defun-debug internal-draw-debug-text-3d ((arg0 bucket-id) (arg1 string) (arg2 vector) (arg3 rgba) (arg4 vector2h))
|
||||
(let ((s2-0 (new 'stack-no-clear 'vector4w)))
|
||||
(set! (-> s2-0 quad) (the-as uint128 0))
|
||||
(when (transform-point-qword! (the-as vector s2-0) arg2)
|
||||
(when (transform-point-qword! (the-as vector4w s2-0) arg2)
|
||||
(let* ((s3-0 (-> *display* frames (-> *display* on-screen) frame debug-buf))
|
||||
(s5-0 (-> s3-0 base))
|
||||
)
|
||||
|
@ -514,9 +524,9 @@
|
|||
(set! (-> arg4 w) 1.0)
|
||||
(when
|
||||
(and
|
||||
(transform-point-qword! (the-as vector (-> s5-0 quad)) arg2)
|
||||
(transform-point-qword! (the-as vector (&-> s5-0 quad 1)) arg3)
|
||||
(transform-point-qword! (the-as vector (&-> s5-0 quad 2)) arg4)
|
||||
(transform-point-qword! (the-as vector4w (-> s5-0 quad)) arg2)
|
||||
(transform-point-qword! (the-as vector4w (&-> s5-0 quad 1)) arg3)
|
||||
(transform-point-qword! (the-as vector4w (&-> s5-0 quad 2)) arg4)
|
||||
)
|
||||
(let* ((v1-9 (-> *display* frames (-> *display* on-screen) frame debug-buf))
|
||||
(a2-1 (-> v1-9 base))
|
||||
|
|
|
@ -245,6 +245,7 @@
|
|||
(water-tex1 60)
|
||||
;; merc1 61
|
||||
;; generic1 62
|
||||
(depth-cue 64)
|
||||
(bucket-65 65)
|
||||
(sprite 66)
|
||||
;; debug spheres? 67
|
||||
|
|
|
@ -5,3 +5,4 @@
|
|||
;; name in dgo: merc-vu1
|
||||
;; dgos: GAME, ENGINE
|
||||
|
||||
;; all this contains is the merc-vu1-block
|
||||
|
|
|
@ -180,10 +180,16 @@
|
|||
)
|
||||
|
||||
;; I believe this is used for the group 0's in 2d
|
||||
;; TODO prim.
|
||||
(set! (-> data sprite-2d-giftag tag)
|
||||
(new 'static 'gif-tag64 :nloop #x1 :eop #x1 :pre #x1 :prim #x75 :nreg #x9)
|
||||
)
|
||||
(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! (-> data sprite-2d-giftag regs)
|
||||
(new 'static 'gif-tag-regs
|
||||
:regs0 (gif-reg-id rgbaq)
|
||||
|
@ -201,8 +207,13 @@
|
|||
|
||||
;; group 1's in 2d
|
||||
(set! (-> data sprite-2d-giftag-2 tag)
|
||||
(new 'static 'gif-tag64 :nloop #x1 :eop #x1 :pre #x1 :prim #x55 :nreg #x9)
|
||||
)
|
||||
(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! (-> data sprite-2d-giftag-2 regs)
|
||||
(new 'static 'gif-tag-regs
|
||||
:regs0 (gif-reg-id rgbaq)
|
||||
|
@ -219,8 +230,15 @@
|
|||
|
||||
;; 3d's don't have different groups?
|
||||
(set! (-> data sprite-3d-giftag tag)
|
||||
(new 'static 'gif-tag64 :nloop #x1 :eop #x1 :pre #x1 :prim #x75 :nreg #xc)
|
||||
)
|
||||
(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 #xc
|
||||
)
|
||||
|
||||
)
|
||||
;; note that we have rgbaq's per vertex in 3d
|
||||
(set! (-> data sprite-3d-giftag regs)
|
||||
(new 'static 'gif-tag-regs
|
||||
|
@ -241,10 +259,16 @@
|
|||
|
||||
;; ??
|
||||
(set! (-> data clipped-giftag tag)
|
||||
(new 'static 'gif-tag64 :nloop #x1 :eop #x1 :pre #x1 :prim #x75 :nreg #x3)
|
||||
)
|
||||
(set!
|
||||
(-> data clipped-giftag regs)
|
||||
(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 #x3
|
||||
)
|
||||
)
|
||||
|
||||
(set! (-> data clipped-giftag regs)
|
||||
(new 'static 'gif-tag-regs
|
||||
:regs0 (gif-reg-id st)
|
||||
:regs1 (gif-reg-id rgbaq)
|
||||
|
@ -254,8 +278,15 @@
|
|||
|
||||
;; not sure what this is either
|
||||
(set! (-> data warp-giftag tag)
|
||||
(new 'static 'gif-tag64 :nloop #x1 :eop #x1 :pre #x1 :prim #x53 :nreg #xc)
|
||||
)
|
||||
(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! (-> data warp-giftag regs)
|
||||
(new 'static 'gif-tag-regs
|
||||
:regs0 (gif-reg-id st)
|
||||
|
|
|
@ -476,7 +476,7 @@
|
|||
;; WARN: Inline assembly instruction marked with TODO - [TODO.VCLIP]
|
||||
;; WARN: Unsupported inline assembly instruction kind - [cfc2.i v1, Clipping]
|
||||
;; WARN: Inline assembly instruction marked with TODO - [TODO.VFTOI4]
|
||||
(defun transform-point-qword! ((arg0 vector) (arg1 vector))
|
||||
(defun transform-point-qword! ((arg0 vector4w) (arg1 vector))
|
||||
(local-vars (v1-7 int))
|
||||
(rlet ((acc :class vf)
|
||||
(Q :class vf)
|
||||
|
|
1231
test/decompiler/reference/engine/gfx/sprite/sprite_REF.gc
Normal file
1231
test/decompiler/reference/engine/gfx/sprite/sprite_REF.gc
Normal file
File diff suppressed because it is too large
Load diff
|
@ -62,6 +62,8 @@ const std::unordered_set<std::string> g_functions_expected_to_reject = {
|
|||
// display
|
||||
"vblank-handler", // asm
|
||||
"vif1-handler", "vif1-handler-debug",
|
||||
// sprite. Don't know types yet.
|
||||
"add-to-sprite-aux-list",
|
||||
// ripple - asm
|
||||
"ripple-execute-init", "ripple-create-wave-table", "ripple-apply-wave-table",
|
||||
"ripple-matrix-scale",
|
||||
|
@ -153,6 +155,9 @@ const std::unordered_set<std::string> g_functions_to_skip_compiling = {
|
|||
// float to int
|
||||
"(method 10 bsp-header)",
|
||||
|
||||
// multiply defined.
|
||||
"(method 3 sprite-aux-list)",
|
||||
|
||||
// loader - decompiler bug with detecting handle macros
|
||||
"(method 10 external-art-buffer)"};
|
||||
|
||||
|
|
Loading…
Reference in a new issue