mirror of
https://github.com/open-goal/jak-project.git
synced 2024-10-20 21:27:52 -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 {
|
goos::Object SetFormFormElement::to_form_for_define(const Env& env) const {
|
||||||
if (m_cast_for_define) {
|
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(
|
return pretty_print::build_list(
|
||||||
fmt::format("define"), m_dst->to_form(env),
|
fmt::format("define"), m_dst->to_form(env),
|
||||||
pretty_print::build_list(fmt::format("the-as {}", m_cast_for_define->print()),
|
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;
|
BitFieldDef bfd;
|
||||||
bfd.field_name = constant.field_name;
|
bfd.field_name = constant.field_name;
|
||||||
bfd.is_signed = constant.is_signed;
|
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 =
|
bfd.value =
|
||||||
pool.alloc_single_element_form<ConstantTokenElement>(nullptr, *constant.enum_constant);
|
pool.alloc_single_element_form<ConstantTokenElement>(nullptr, *constant.enum_constant);
|
||||||
} else {
|
} else {
|
||||||
|
|
|
@ -530,6 +530,7 @@
|
||||||
(water-tex1 60)
|
(water-tex1 60)
|
||||||
;; merc1 61
|
;; merc1 61
|
||||||
;; generic1 62
|
;; generic1 62
|
||||||
|
(depth-cue 64)
|
||||||
(bucket-65 65)
|
(bucket-65 65)
|
||||||
(sprite 66)
|
(sprite 66)
|
||||||
;; debug spheres? 67
|
;; debug spheres? 67
|
||||||
|
@ -5075,7 +5076,7 @@
|
||||||
(define-extern math-cam-start-smoothing (function float float quaternion))
|
(define-extern math-cam-start-smoothing (function float float quaternion))
|
||||||
(define-extern move-target-from-pad (function transform int transform))
|
(define-extern move-target-from-pad (function transform int transform))
|
||||||
(define-extern transform-point-vector! (function vector vector symbol))
|
(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 transform-point-vector-scale! (function vector vector float))
|
||||||
(define-extern init-for-transform (function matrix none))
|
(define-extern init-for-transform (function matrix none))
|
||||||
|
|
||||||
|
@ -15698,7 +15699,7 @@
|
||||||
|
|
||||||
;; - Functions
|
;; - 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-set-stencil function)
|
||||||
(define-extern depth-cue-draw-depth function)
|
(define-extern depth-cue-draw-depth function)
|
||||||
(define-extern depth-cue-calc-z function)
|
(define-extern depth-cue-calc-z function)
|
||||||
|
@ -15706,7 +15707,7 @@
|
||||||
|
|
||||||
;; - Unknowns
|
;; - Unknowns
|
||||||
|
|
||||||
;;(define-extern *depth-cue-work* object) ;; unknown type
|
(define-extern *depth-cue-work* depth-cue-work)
|
||||||
|
|
||||||
|
|
||||||
;; ----------------------
|
;; ----------------------
|
||||||
|
|
|
@ -97,10 +97,6 @@
|
||||||
// vector
|
// vector
|
||||||
"vector=", // asm branching
|
"vector=", // asm branching
|
||||||
|
|
||||||
// texture
|
|
||||||
// "adgif-shader<-texture-with-update!", // F: asm branching
|
|
||||||
// "(method 9 texture-page-dir)",
|
|
||||||
|
|
||||||
// collide-mesh-h
|
// collide-mesh-h
|
||||||
"(method 11 collide-mesh-cache)",
|
"(method 11 collide-mesh-cache)",
|
||||||
|
|
||||||
|
@ -117,6 +113,9 @@
|
||||||
"clear-frame-accumulator", // F: asm branching
|
"clear-frame-accumulator", // F: asm branching
|
||||||
"cspace<-parented-transformq-joint!",
|
"cspace<-parented-transformq-joint!",
|
||||||
|
|
||||||
|
// sprite
|
||||||
|
"add-to-sprite-aux-list", // fine, but don't know types yet.
|
||||||
|
|
||||||
// merc-blend-shape
|
// merc-blend-shape
|
||||||
"setup-blerc-chains-for-one-fragment", // F: asm branching
|
"setup-blerc-chains-for-one-fragment", // F: asm branching
|
||||||
"blerc-execute", // F: asm branching
|
"blerc-execute", // F: asm branching
|
||||||
|
@ -526,8 +525,6 @@
|
||||||
|
|
||||||
"(method 12 perf-stat)": [0],
|
"(method 12 perf-stat)": [0],
|
||||||
"(method 11 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],
|
"raw-ray-sphere-intersect": [0, 1, 2, 3, 4, 5],
|
||||||
"ray-cylinder-intersect": [0, 1, 2, 3, 4, 5],
|
"ray-cylinder-intersect": [0, 1, 2, 3, 4, 5],
|
||||||
"ray-triangle-intersect": [0, 1, 2, 3, 4],
|
"ray-triangle-intersect": [0, 1, 2, 3, 4],
|
||||||
|
|
|
@ -1282,7 +1282,8 @@
|
||||||
["L509", "(inline-array list-field)", true, 12],
|
["L509", "(inline-array list-field)", true, 12],
|
||||||
["L123", "_lambda_", true],
|
["L123", "_lambda_", true],
|
||||||
["L119", "_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.
|
// please do not add things after this entry! git is dumb.
|
||||||
|
|
|
@ -1467,18 +1467,14 @@
|
||||||
[170, "a0", "art-joint-anim"]
|
[170, "a0", "art-joint-anim"]
|
||||||
],
|
],
|
||||||
|
|
||||||
"anim-tester-start": [
|
"anim-tester-start": [[20, "t9", "(function process function none)"]],
|
||||||
[20, "t9", "(function process function none)"]
|
|
||||||
],
|
|
||||||
|
|
||||||
"anim-tester-set-name": [
|
"anim-tester-set-name": [
|
||||||
[[34, 51], "s3", "anim-test-obj"],
|
[[34, 51], "s3", "anim-test-obj"],
|
||||||
[[40, 63], "s5", "anim-test-sequence"]
|
[[40, 63], "s5", "anim-test-sequence"]
|
||||||
],
|
],
|
||||||
|
|
||||||
"anim-tester-add-sequence": [
|
"anim-tester-add-sequence": [[[33, 102], "s5", "anim-test-obj"]],
|
||||||
[[33, 102], "s5", "anim-test-obj"]
|
|
||||||
],
|
|
||||||
|
|
||||||
"(anon-function 11 anim-tester)": [
|
"(anon-function 11 anim-tester)": [
|
||||||
[[23, 113], "s4", "anim-test-obj"],
|
[[23, 113], "s4", "anim-test-obj"],
|
||||||
|
@ -1579,5 +1575,17 @@
|
||||||
[[62, 67], "a1", "dma-packet"]
|
[[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": []
|
"placeholder-do-not-add-below": []
|
||||||
}
|
}
|
||||||
|
|
|
@ -2162,6 +2162,7 @@
|
||||||
},
|
},
|
||||||
|
|
||||||
"add-debug-point": {
|
"add-debug-point": {
|
||||||
|
"args": ["enable-draw", "bucket", "pt"],
|
||||||
"vars": {
|
"vars": {
|
||||||
"a0-6": ["a0-6", "(pointer uint64)"],
|
"a0-6": ["a0-6", "(pointer uint64)"],
|
||||||
"a0-7": ["a0-7", "dma-packet"],
|
"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);
|
auto name = decompile_int_enum_from_int(field.type(), ts, bitfield_value);
|
||||||
def.enum_constant = fmt::format("({} {})", field.type().print(), name);
|
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);
|
result.push_back(def);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -73,6 +73,13 @@ struct BitFieldConstantDef {
|
||||||
u64 value = -1;
|
u64 value = -1;
|
||||||
std::optional<std::string> enum_constant;
|
std::optional<std::string> enum_constant;
|
||||||
std::string field_name;
|
std::string field_name;
|
||||||
|
|
||||||
|
struct NestedField {
|
||||||
|
TypeSpec field_type;
|
||||||
|
std::vector<BitFieldConstantDef> fields;
|
||||||
|
};
|
||||||
|
|
||||||
|
std::optional<NestedField> nested_field;
|
||||||
};
|
};
|
||||||
|
|
||||||
template <typename T>
|
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"
|
"Apply camera transformation to point, returning fixed point 28.4 position"
|
||||||
(rlet ((acc :class vf)
|
(rlet ((acc :class vf)
|
||||||
(Q :class vf)
|
(Q :class vf)
|
||||||
|
|
|
@ -5,7 +5,6 @@
|
||||||
;; name in dgo: debug-sphere
|
;; name in dgo: debug-sphere
|
||||||
;; dgos: GAME, ENGINE
|
;; dgos: GAME, ENGINE
|
||||||
|
|
||||||
;; definition of type debug-sphere-table
|
|
||||||
(deftype debug-sphere-table (basic)
|
(deftype debug-sphere-table (basic)
|
||||||
((point vector 300 :inline :offset-assert 16)
|
((point vector 300 :inline :offset-assert 16)
|
||||||
)
|
)
|
||||||
|
@ -14,9 +13,6 @@
|
||||||
:flag-assert #x9000012d0
|
: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))
|
(defun make-debug-sphere-table ((arg0 debug-sphere-table))
|
||||||
(local-vars (sv-80 int))
|
(local-vars (sv-80 int))
|
||||||
(let ((s5-0 (new-stack-vector0))
|
(let ((s5-0 (new-stack-vector0))
|
||||||
|
@ -31,41 +27,17 @@
|
||||||
(s1-0 (new-stack-vector0))
|
(s1-0 (new-stack-vector0))
|
||||||
(s0-0 (new-stack-vector0))
|
(s0-0 (new-stack-vector0))
|
||||||
)
|
)
|
||||||
(set!
|
(set! (-> s2-0 y) (+ (-> s5-0 y) (* (cos (* 3276.8 (the float s3-0))) f30-0)))
|
||||||
(-> s2-0 y)
|
|
||||||
(+ (-> s5-0 y) (* (cos (* 3276.8 (the float s3-0))) f30-0))
|
|
||||||
)
|
|
||||||
(set! (-> s1-0 y) (-> s2-0 y))
|
(set! (-> s1-0 y) (-> s2-0 y))
|
||||||
(set!
|
(set! (-> s0-0 y) (+ (-> s5-0 y) (* (cos (* 3276.8 (the float (+ s3-0 1)))) f30-0)))
|
||||||
(-> s0-0 y)
|
|
||||||
(+ (-> s5-0 y) (* (cos (* 3276.8 (the float (+ s3-0 1)))) f30-0))
|
|
||||||
)
|
|
||||||
(set! sv-80 0)
|
(set! sv-80 0)
|
||||||
(while (< sv-80 10)
|
(while (< sv-80 10)
|
||||||
(set!
|
(set! (-> s2-0 x) (+ (-> s5-0 x) (* (cos (* 6553.6 (the float sv-80))) f28-0)))
|
||||||
(-> s2-0 x)
|
(set! (-> s2-0 z) (+ (-> s5-0 z) (* (sin (* 6553.6 (the float sv-80))) f28-0)))
|
||||||
(+ (-> s5-0 x) (* (cos (* 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!
|
(set! (-> s0-0 x) (+ (-> s5-0 x) (* (cos (* 6553.6 (the float sv-80))) f26-0)))
|
||||||
(-> s2-0 z)
|
(set! (-> s0-0 z) (+ (-> s5-0 z) (* (sin (* 6553.6 (the float sv-80))) f26-0)))
|
||||||
(+ (-> 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 quad) (-> s2-0 quad))
|
||||||
(set! (-> arg0 point (+ s4-0 1) quad) (-> s1-0 quad))
|
(set! (-> arg0 point (+ s4-0 1) quad) (-> s1-0 quad))
|
||||||
(set! (-> arg0 point (+ s4-0 2) quad) (-> s0-0 quad))
|
(set! (-> arg0 point (+ s4-0 2) quad) (-> s0-0 quad))
|
||||||
|
@ -75,23 +47,14 @@
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
(let ((v0-10 0))
|
|
||||||
)
|
|
||||||
(none)
|
(none)
|
||||||
)
|
)
|
||||||
|
|
||||||
;; definition for symbol *debug-sphere-table*, type debug-sphere-table
|
|
||||||
(define *debug-sphere-table* (new 'static '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*)
|
(make-debug-sphere-table *debug-sphere-table*)
|
||||||
|
|
||||||
;; definition for function add-debug-sphere-from-table
|
(defun add-debug-sphere-from-table ((arg0 bucket-id) (arg1 vector) (arg2 float) (arg3 rgba))
|
||||||
;; INFO: Return type mismatch int vs none.
|
"Draw a wireframe sphere"
|
||||||
;; Used lq/sq
|
|
||||||
(defun
|
|
||||||
add-debug-sphere-from-table
|
|
||||||
((arg0 bucket-id) (arg1 vector) (arg2 float) (arg3 rgba))
|
|
||||||
(rlet ((vf1 :class vf)
|
(rlet ((vf1 :class vf)
|
||||||
(vf2 :class vf)
|
(vf2 :class vf)
|
||||||
(vf3 :class vf)
|
(vf3 :class vf)
|
||||||
|
@ -123,8 +86,6 @@
|
||||||
(add-debug-line #t arg0 s4-0 s2-0 arg3 #f (the rgba -1))
|
(add-debug-line #t arg0 s4-0 s2-0 arg3 #f (the rgba -1))
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
(let ((v0-2 0))
|
|
||||||
)
|
|
||||||
(none)
|
(none)
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
|
|
@ -6,15 +6,17 @@
|
||||||
;; dgos: GAME, ENGINE
|
;; 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-vf0
|
||||||
(with-vf (vf4 vf1 vf2 vf3 vf9 vf8 vf6)
|
(with-vf (vf4 vf1 vf2 vf3 vf9 vf8 vf6)
|
||||||
(rlet ((acc :class vf)
|
(rlet ((acc :class vf)
|
||||||
(Q :class vf)
|
(Q :class vf)
|
||||||
(vf5 :class vf)
|
(vf5 :class vf)
|
||||||
)
|
)
|
||||||
(.lvf vf5 (&-> arg0 quad))
|
(.lvf vf5 (&-> in quad))
|
||||||
(.mul.w.vf acc vf4 vf5)
|
(.mul.w.vf acc vf4 vf5)
|
||||||
(.add.mul.x.vf acc vf1 vf5 acc)
|
(.add.mul.x.vf acc vf1 vf5 acc)
|
||||||
(.add.mul.y.vf acc vf2 vf5 acc)
|
(.add.mul.y.vf acc vf2 vf5 acc)
|
||||||
|
@ -26,21 +28,30 @@
|
||||||
(.max.x.vf vf5 vf5 vf0 :mask #b1000)
|
(.max.x.vf vf5 vf5 vf0 :mask #b1000)
|
||||||
(.min.x.vf vf5 vf5 vf6 :mask #b1000)
|
(.min.x.vf vf5 vf5 vf6 :mask #b1000)
|
||||||
(vftoi4.xyzw vf5 vf5)
|
(vftoi4.xyzw vf5 vf5)
|
||||||
(.svf (&-> arg1 quad) vf5)
|
(.svf (&-> out quad) vf5)
|
||||||
arg1
|
out
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
(defun-debug add-debug-point ((arg0 symbol) (arg1 bucket-id) (arg2 vector))
|
;;;;;;;;;;;;;;;;;;
|
||||||
(if (not arg0)
|
;; 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)
|
(return #f)
|
||||||
)
|
)
|
||||||
(let ((s5-0 (new 'stack 'vector4w-2)))
|
(let ((s5-0 (new 'stack 'vector4w-2)))
|
||||||
(set! (-> arg2 w) 1.0)
|
;; transform the input point and convert to fixed point
|
||||||
(when (transform-point-qword! (the-as vector (-> s5-0 quad)) arg2)
|
(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))
|
(let* ((v1-7 (-> *display* frames (-> *display* on-screen) frame debug-buf))
|
||||||
(a2-1 (-> v1-7 base))
|
(a2-1 (-> v1-7 base))
|
||||||
)
|
)
|
||||||
|
@ -48,19 +59,18 @@
|
||||||
(let* ((a1-3 v1-7)
|
(let* ((a1-3 v1-7)
|
||||||
(a3-0 (the-as dma-packet (-> a1-3 base)))
|
(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 dma) (new 'static 'dma-tag :id (dma-tag-id cnt)))
|
||||||
(set! (-> a3-0 vif0) (new 'static 'vif-tag))
|
(set! (-> a3-0 vif0) (new 'static 'vif-tag))
|
||||||
(set!
|
(set! (-> a3-0 vif1) (new 'static 'vif-tag :cmd (vif-cmd direct) :msk #x1))
|
||||||
(-> a3-0 vif1)
|
|
||||||
(new 'static 'vif-tag :cmd (vif-cmd direct) :msk #x1)
|
|
||||||
)
|
|
||||||
(set! (-> a1-3 base) (&+ (the-as pointer a3-0) 16))
|
(set! (-> a1-3 base) (&+ (the-as pointer a3-0) 16))
|
||||||
)
|
)
|
||||||
|
|
||||||
|
;; add a giftag to draw a primitive
|
||||||
(let* ((a1-4 v1-7)
|
(let* ((a1-4 v1-7)
|
||||||
(a3-2 (the-as gs-gif-tag (-> a1-4 base)))
|
(a3-2 (the-as gs-gif-tag (-> a1-4 base)))
|
||||||
)
|
)
|
||||||
(set!
|
(set! (-> a3-2 tag)
|
||||||
(-> a3-2 tag)
|
|
||||||
(new 'static 'gif-tag64
|
(new 'static 'gif-tag64
|
||||||
:nloop #x1
|
:nloop #x1
|
||||||
:eop #x1
|
:eop #x1
|
||||||
|
@ -69,8 +79,7 @@
|
||||||
:nreg #x8
|
:nreg #x8
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
(set!
|
(set! (-> a3-2 regs)
|
||||||
(-> a3-2 regs)
|
|
||||||
(new 'static 'gif-tag-regs
|
(new 'static 'gif-tag-regs
|
||||||
:regs0 (gif-reg-id rgbaq)
|
:regs0 (gif-reg-id rgbaq)
|
||||||
:regs1 (gif-reg-id xyzf2)
|
:regs1 (gif-reg-id xyzf2)
|
||||||
|
@ -84,11 +93,13 @@
|
||||||
)
|
)
|
||||||
(set! (-> a1-4 base) (&+ (the-as pointer a3-2) 16))
|
(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 x) 255)
|
||||||
(set! (-> s5-0 vector 1 y) 128)
|
(set! (-> s5-0 vector 1 y) 128)
|
||||||
(set! (-> s5-0 vector 1 z) 128)
|
(set! (-> s5-0 vector 1 z) 128)
|
||||||
(set! (-> s5-0 vector 1 w) 128)
|
(set! (-> s5-0 vector 1 w) 128)
|
||||||
(set! (-> s5-0 vector 0 y) (+ (-> s5-0 vector 0 y) 160))
|
(+! (-> s5-0 vector 0 y) 160)
|
||||||
(let* ((a1-11 v1-7)
|
(let* ((a1-11 v1-7)
|
||||||
(a3-4 (the-as vector4w-2 (-> a1-11 base)))
|
(a3-4 (the-as vector4w-2 (-> a1-11 base)))
|
||||||
)
|
)
|
||||||
|
@ -96,8 +107,8 @@
|
||||||
(set! (-> a3-4 quad 1) (-> s5-0 quad 0))
|
(set! (-> a3-4 quad 1) (-> s5-0 quad 0))
|
||||||
(set! (-> a1-11 base) (&+ (the-as pointer a3-4) 32))
|
(set! (-> a1-11 base) (&+ (the-as pointer a3-4) 32))
|
||||||
)
|
)
|
||||||
(set! (-> s5-0 vector 0 x) (+ (-> s5-0 vector 0 x) -256))
|
(+! (-> s5-0 vector 0 x) -256)
|
||||||
(set! (-> s5-0 vector 0 y) (+ (-> s5-0 vector 0 y) -160))
|
(+! (-> s5-0 vector 0 y) -160)
|
||||||
(set! (-> s5-0 vector 1 x) 128)
|
(set! (-> s5-0 vector 1 x) 128)
|
||||||
(set! (-> s5-0 vector 1 y) 255)
|
(set! (-> s5-0 vector 1 y) 255)
|
||||||
(let* ((a1-18 v1-7)
|
(let* ((a1-18 v1-7)
|
||||||
|
@ -107,7 +118,7 @@
|
||||||
(set! (-> a3-6 quad 1) (-> s5-0 quad 0))
|
(set! (-> a3-6 quad 1) (-> s5-0 quad 0))
|
||||||
(set! (-> a1-18 base) (&+ (the-as pointer a3-6) 32))
|
(set! (-> a1-18 base) (&+ (the-as pointer a3-6) 32))
|
||||||
)
|
)
|
||||||
(set! (-> s5-0 vector 0 x) (+ (-> s5-0 vector 0 x) 512))
|
(+! (-> s5-0 vector 0 x) 512)
|
||||||
(set! (-> s5-0 vector 1 y) 128)
|
(set! (-> s5-0 vector 1 y) 128)
|
||||||
(set! (-> s5-0 vector 1 z) 255)
|
(set! (-> s5-0 vector 1 z) 255)
|
||||||
(let* ((a1-23 v1-7)
|
(let* ((a1-23 v1-7)
|
||||||
|
@ -117,8 +128,8 @@
|
||||||
(set! (-> a3-8 quad 1) (-> s5-0 quad 0))
|
(set! (-> a3-8 quad 1) (-> s5-0 quad 0))
|
||||||
(set! (-> a1-23 base) (&+ (the-as pointer a3-8) 32))
|
(set! (-> a1-23 base) (&+ (the-as pointer a3-8) 32))
|
||||||
)
|
)
|
||||||
(set! (-> s5-0 vector 0 x) (+ (-> s5-0 vector 0 x) -256))
|
(+! (-> s5-0 vector 0 x) -256)
|
||||||
(set! (-> s5-0 vector 0 y) (+ (-> s5-0 vector 0 y) -160))
|
(+! (-> s5-0 vector 0 y) -160)
|
||||||
(set! (-> s5-0 vector 1 x) 255)
|
(set! (-> s5-0 vector 1 x) 255)
|
||||||
(set! (-> s5-0 vector 1 y) 128)
|
(set! (-> s5-0 vector 1 y) 128)
|
||||||
(let* ((a3-10 v1-7)
|
(let* ((a3-10 v1-7)
|
||||||
|
@ -128,17 +139,13 @@
|
||||||
(set! (-> a1-30 quad 1) (-> s5-0 quad 0))
|
(set! (-> a1-30 quad 1) (-> s5-0 quad 0))
|
||||||
(set! (-> a3-10 base) (&+ (the-as pointer a1-30) 32))
|
(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)))
|
(let ((a3-14 (/ (the-as int (+ (&- (the-as pointer -16) (the-as uint a0-6)) (the-as int (-> v1-7 base)))) 16)))
|
||||||
(cond
|
(cond
|
||||||
((nonzero? a3-14)
|
((nonzero? a3-14)
|
||||||
(set!
|
(logior! (-> a0-6 0) (shr (shl a3-14 48) 48))
|
||||||
(-> a0-6 0)
|
(logior! (-> a0-6 1) (shl (shr (shl a3-14 48) 48) 32))
|
||||||
(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
|
(else
|
||||||
(set! (-> v1-7 base) a0-6)
|
(set! (-> v1-7 base) a0-6)
|
||||||
|
@ -146,6 +153,8 @@
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
|
||||||
|
;; add to bucket
|
||||||
(let ((a3-20 (-> v1-7 base)))
|
(let ((a3-20 (-> v1-7 base)))
|
||||||
(let ((a0-7 (the-as dma-packet (-> 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 dma) (new 'static 'dma-tag :id (dma-tag-id next)))
|
||||||
|
@ -155,7 +164,7 @@
|
||||||
)
|
)
|
||||||
(dma-bucket-insert-tag
|
(dma-bucket-insert-tag
|
||||||
(-> *display* frames (-> *display* on-screen) frame bucket-group)
|
(-> *display* frames (-> *display* on-screen) frame bucket-group)
|
||||||
arg1
|
bucket
|
||||||
a2-1
|
a2-1
|
||||||
(the-as (pointer dma-tag) a3-20)
|
(the-as (pointer dma-tag) a3-20)
|
||||||
)
|
)
|
||||||
|
@ -166,6 +175,7 @@
|
||||||
#f
|
#f
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
(defun-debug internal-draw-debug-line ((arg0 bucket-id) (arg1 vector) (arg2 vector) (arg3 rgba) (arg4 symbol) (arg5 rgba))
|
(defun-debug internal-draw-debug-line ((arg0 bucket-id) (arg1 vector) (arg2 vector) (arg3 rgba) (arg4 symbol) (arg5 rgba))
|
||||||
(local-vars (sv-80 vector))
|
(local-vars (sv-80 vector))
|
||||||
(set! sv-80 arg2)
|
(set! sv-80 arg2)
|
||||||
|
@ -214,8 +224,8 @@
|
||||||
int
|
int
|
||||||
(when
|
(when
|
||||||
(and
|
(and
|
||||||
(transform-point-qword! (the-as vector (-> s4-0 quad)) arg1)
|
(transform-point-qword! (the-as vector4w (-> 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 1)) sv-80)
|
||||||
)
|
)
|
||||||
(let*
|
(let*
|
||||||
((v1-28 (-> *display* frames (-> *display* on-screen) frame debug-buf))
|
((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))
|
(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)))
|
(let ((s2-0 (new 'stack-no-clear 'vector4w)))
|
||||||
(set! (-> s2-0 quad) (the-as uint128 0))
|
(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))
|
(let* ((s3-0 (-> *display* frames (-> *display* on-screen) frame debug-buf))
|
||||||
(s5-0 (-> s3-0 base))
|
(s5-0 (-> s3-0 base))
|
||||||
)
|
)
|
||||||
|
@ -514,9 +524,9 @@
|
||||||
(set! (-> arg4 w) 1.0)
|
(set! (-> arg4 w) 1.0)
|
||||||
(when
|
(when
|
||||||
(and
|
(and
|
||||||
(transform-point-qword! (the-as vector (-> s5-0 quad)) arg2)
|
(transform-point-qword! (the-as vector4w (-> s5-0 quad)) arg2)
|
||||||
(transform-point-qword! (the-as vector (&-> s5-0 quad 1)) arg3)
|
(transform-point-qword! (the-as vector4w (&-> 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 2)) arg4)
|
||||||
)
|
)
|
||||||
(let* ((v1-9 (-> *display* frames (-> *display* on-screen) frame debug-buf))
|
(let* ((v1-9 (-> *display* frames (-> *display* on-screen) frame debug-buf))
|
||||||
(a2-1 (-> v1-9 base))
|
(a2-1 (-> v1-9 base))
|
||||||
|
|
|
@ -245,6 +245,7 @@
|
||||||
(water-tex1 60)
|
(water-tex1 60)
|
||||||
;; merc1 61
|
;; merc1 61
|
||||||
;; generic1 62
|
;; generic1 62
|
||||||
|
(depth-cue 64)
|
||||||
(bucket-65 65)
|
(bucket-65 65)
|
||||||
(sprite 66)
|
(sprite 66)
|
||||||
;; debug spheres? 67
|
;; debug spheres? 67
|
||||||
|
|
|
@ -5,3 +5,4 @@
|
||||||
;; name in dgo: merc-vu1
|
;; name in dgo: merc-vu1
|
||||||
;; dgos: GAME, ENGINE
|
;; dgos: GAME, ENGINE
|
||||||
|
|
||||||
|
;; all this contains is the merc-vu1-block
|
||||||
|
|
|
@ -180,9 +180,15 @@
|
||||||
)
|
)
|
||||||
|
|
||||||
;; I believe this is used for the group 0's in 2d
|
;; I believe this is used for the group 0's in 2d
|
||||||
;; TODO prim.
|
|
||||||
(set! (-> data sprite-2d-giftag tag)
|
(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)
|
(set! (-> data sprite-2d-giftag regs)
|
||||||
(new 'static 'gif-tag-regs
|
(new 'static 'gif-tag-regs
|
||||||
|
@ -201,7 +207,12 @@
|
||||||
|
|
||||||
;; group 1's in 2d
|
;; group 1's in 2d
|
||||||
(set! (-> data sprite-2d-giftag-2 tag)
|
(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)
|
(set! (-> data sprite-2d-giftag-2 regs)
|
||||||
(new 'static 'gif-tag-regs
|
(new 'static 'gif-tag-regs
|
||||||
|
@ -219,7 +230,14 @@
|
||||||
|
|
||||||
;; 3d's don't have different groups?
|
;; 3d's don't have different groups?
|
||||||
(set! (-> data sprite-3d-giftag tag)
|
(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
|
;; note that we have rgbaq's per vertex in 3d
|
||||||
(set! (-> data sprite-3d-giftag regs)
|
(set! (-> data sprite-3d-giftag regs)
|
||||||
|
@ -241,10 +259,16 @@
|
||||||
|
|
||||||
;; ??
|
;; ??
|
||||||
(set! (-> data clipped-giftag tag)
|
(set! (-> data clipped-giftag tag)
|
||||||
(new 'static 'gif-tag64 :nloop #x1 :eop #x1 :pre #x1 :prim #x75 :nreg #x3)
|
(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)
|
|
||||||
|
(set! (-> data clipped-giftag regs)
|
||||||
(new 'static 'gif-tag-regs
|
(new 'static 'gif-tag-regs
|
||||||
:regs0 (gif-reg-id st)
|
:regs0 (gif-reg-id st)
|
||||||
:regs1 (gif-reg-id rgbaq)
|
:regs1 (gif-reg-id rgbaq)
|
||||||
|
@ -254,8 +278,15 @@
|
||||||
|
|
||||||
;; not sure what this is either
|
;; not sure what this is either
|
||||||
(set! (-> data warp-giftag tag)
|
(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)
|
(set! (-> data warp-giftag regs)
|
||||||
(new 'static 'gif-tag-regs
|
(new 'static 'gif-tag-regs
|
||||||
:regs0 (gif-reg-id st)
|
:regs0 (gif-reg-id st)
|
||||||
|
|
|
@ -476,7 +476,7 @@
|
||||||
;; WARN: Inline assembly instruction marked with TODO - [TODO.VCLIP]
|
;; WARN: Inline assembly instruction marked with TODO - [TODO.VCLIP]
|
||||||
;; WARN: Unsupported inline assembly instruction kind - [cfc2.i v1, Clipping]
|
;; WARN: Unsupported inline assembly instruction kind - [cfc2.i v1, Clipping]
|
||||||
;; WARN: Inline assembly instruction marked with TODO - [TODO.VFTOI4]
|
;; 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))
|
(local-vars (v1-7 int))
|
||||||
(rlet ((acc :class vf)
|
(rlet ((acc :class vf)
|
||||||
(Q :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
|
// display
|
||||||
"vblank-handler", // asm
|
"vblank-handler", // asm
|
||||||
"vif1-handler", "vif1-handler-debug",
|
"vif1-handler", "vif1-handler-debug",
|
||||||
|
// sprite. Don't know types yet.
|
||||||
|
"add-to-sprite-aux-list",
|
||||||
// ripple - asm
|
// ripple - asm
|
||||||
"ripple-execute-init", "ripple-create-wave-table", "ripple-apply-wave-table",
|
"ripple-execute-init", "ripple-create-wave-table", "ripple-apply-wave-table",
|
||||||
"ripple-matrix-scale",
|
"ripple-matrix-scale",
|
||||||
|
@ -153,6 +155,9 @@ const std::unordered_set<std::string> g_functions_to_skip_compiling = {
|
||||||
// float to int
|
// float to int
|
||||||
"(method 10 bsp-header)",
|
"(method 10 bsp-header)",
|
||||||
|
|
||||||
|
// multiply defined.
|
||||||
|
"(method 3 sprite-aux-list)",
|
||||||
|
|
||||||
// loader - decompiler bug with detecting handle macros
|
// loader - decompiler bug with detecting handle macros
|
||||||
"(method 10 external-art-buffer)"};
|
"(method 10 external-art-buffer)"};
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue