[jak 2] Add generic and warp (#2495)

This commit is contained in:
water111
2023-04-16 18:05:35 -04:00
committed by GitHub
parent 99fe918a1a
commit a27083f4ee
33 changed files with 7894 additions and 102 deletions
+1
View File
@@ -1076,6 +1076,7 @@ Mips2C_Line handle_normal_instr(Mips2C_Output& output,
case InstructionKind::PMULTH:
case InstructionKind::PMADDH:
case InstructionKind::PADDH:
case InstructionKind::PSUBH:
case InstructionKind::PMINH:
case InstructionKind::MOVZ:
case InstructionKind::MULT3:
+31 -23
View File
@@ -3919,6 +3919,14 @@
:flag-assert #x900000008
)
;; hack - added for warp.
(deftype gs-uv2 (uint64)
((u int16 :offset 0 :size 16) ;; Q4 fixed point
(v int16 :offset 16 :size 16) ;; Q4 fixed point
)
:flag-assert #x900000008
)
;; the GS's ST register sets the S and T values of the vertex texture coordinates.
;; The value Q is specified by the RGBAQ register.
(deftype gs-st (uint64)
@@ -4999,7 +5007,8 @@
(declare-type adgif-shader structure)
(deftype shader-ptr (uint32)
((shader uint32 :offset 8 :size 24))
((first-8 uint8 :offset 0 :size 8) ;; added
(shader uint32 :offset 8 :size 24))
:method-count-assert 9
:size-assert #x4
:flag-assert #x900000004
@@ -11803,12 +11812,12 @@
:type uint8
:bitfield #t
(texscroll 0)
(no-fade-out 1)
(no-fade-out 1) ;; translucent.
(ripple 2)
(emerc 3) ;; envmap??
(ignore-tod-for-envmap-tint 4) ;; color thing
(force-mercneric 5) ;; some mercneric-only effect
(cross-fade 6)
(cross-fade 6) ;; WARP?
(ignore-alpha 7)
)
@@ -11922,7 +11931,7 @@
(use-isometric uint8 :offset 41)
(use-attached-shader uint8 :offset 42)
(display-triangles uint8 :offset 43)
(death-vertex-skip uint16 :offset 44)
(death-vertex-skip uint16 :offset 44) ;; 172
(death-start-vertex uint16 :offset 46)
(death-effect uint32 :offset 48)
(use-translucent uint8 :offset 52)
@@ -24445,8 +24454,8 @@
(define-extern foreground-wrapup (function none))
(define-extern *default-shadow-settings* shadow-settings)
(define-extern foreground-shadow (function draw-control (inline-array pris-mtx) pointer pointer))
(define-extern foreground-generic-merc-death (function object object none))
(define-extern foreground-generic-merc-add-fragments (function object object object none))
(define-extern foreground-generic-merc-death (function draw-control generic-merc-ctrl none))
(define-extern foreground-generic-merc-add-fragments (function merc-effect pointer mercneric-chain pointer))
(define-extern foreground-generic-merc (function draw-control pointer int pointer))
(define-extern foreground-merc (function draw-control (inline-array pris-mtx) pointer int int object pointer))
(define-extern foreground-emerc (function draw-control (inline-array pris-mtx) pointer object int int pointer))
@@ -24460,7 +24469,7 @@
;; generic-vu0 ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; (define-extern generic-vu0-block object) ;; vu-function
(define-extern generic-vu0-block vu-function)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; generic-vu1 ;;
@@ -24480,14 +24489,14 @@
;; generic-effect ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; (define-extern *target-lock* object) ;; symbol
(define-extern *target-lock* object) ;; symbol
(define-extern *generic-consts* generic-consts)
;; (define-extern generic-work-init function) ;; (function generic-dma-foreground-sink none)
;; (define-extern generic-upload-vu0 function) ;; (function none)
(define-extern generic-work-init (function generic-bucket-state none))
(define-extern generic-upload-vu0 (function none))
(define-extern upload-vu0-program (function vu-function pointer none))
;; (define-extern generic-initialize-without-sync function)
;; (define-extern generic-initialize function) ;; (function generic-dma-foreground-sink matrix vu-lights none)
;; (define-extern generic-wrapup function) ;; (function generic-dma-foreground-sink none)
(define-extern generic-initialize-without-sync (function matrix vu-lights none))
(define-extern generic-initialize (function generic-bucket-state matrix vu-lights none))
(define-extern generic-wrapup (function generic-bucket-state none))
;; (define-extern generic-dma-from-spr function) ;; function
;; (define-extern generic-light-proc function) ;; function
;; (define-extern generic-envmap-proc function) ;; function
@@ -24505,9 +24514,9 @@
;; (define-extern generic-copy-vtx-dclr-dtex function) ;; function
;; (define-extern generic-none function) ;; function
;; (define-extern generic-none-dma-wait function) ;; function
;; (define-extern *warp-data* object)
;; (define-extern generic-warp-source-proc function)
;; (define-extern generic-warp-source function)
(define-extern *warp-data* object)
(define-extern generic-warp-source-proc (function none))
(define-extern generic-warp-source (function gsf-buffer none))
;; (define-extern generic-warp-dest-proc function)
;; (define-extern generic-warp-dest function)
;; (define-extern generic-warp-envmap-dest function)
@@ -24518,31 +24527,30 @@
;; generic-merc ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
#|
(deftype invinitdata (structure)
((count uint8 :offset-assert 0)
(init-data uint8 :offset-assert 1)
(init-addr uint16 :offset-assert 2)
)
:pack-me
:method-count-assert 9
:size-assert #x4
:flag-assert #x900000004
)
|#
;; (define-extern mercneric-vu0-block object) ;; vu-function
;; (define-extern *inv-init-table* object) ;; (inline-array invinitdata)
;; (define-extern generic-merc-init-asm function) ;; (function none)
(define-extern mercneric-vu0-block vu-function)
(define-extern *inv-init-table* (inline-array invinitdata))
(define-extern generic-merc-init-asm (function none))
;; (define-extern mercneric-matrix-asm function) ;; function
;; (define-extern mercneric-shader-asm function) ;; function
;; (define-extern mercneric-bittable-asm function) ;; function
;; (define-extern mercneric-convert function) ;; function
;; (define-extern high-speed-reject function) ;; (function none)
;; (define-extern generic-translucent function)
(define-extern generic-translucent (function gsf-buffer none))
;; (define-extern generic-merc-query function)
;; (define-extern generic-merc-death function)
;; (define-extern generic-merc-execute-asm function) ;; (function none)
;; (define-extern generic-merc-do-chain function)
(define-extern generic-merc-do-chain (function mercneric-chain dma-buffer pointer))
(define-extern generic-merc-execute-all (function dma-buffer none))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+22 -2
View File
@@ -526,7 +526,8 @@
"(anon-function 39 kidesc-states)": [4, 5],
"(anon-function 56 hal2-course)": [4, 5],
"(anon-function 58 hal2-course)": [74],
"(method 142 gun-buoy)": [0, 2]
"(method 142 gun-buoy)": [0, 2],
"generic-merc-execute-all": [7, 15]
},
// Sometimes the game might use format strings that are fetched dynamically,
@@ -721,7 +722,26 @@
"(method 53 squid)",
"init-vortex-regs",
"render-vortex-quad",
"draw-large-polygon-vortex"
"draw-large-polygon-vortex",
"foreground-generic-merc",
"generic-merc-init-asm",
"mercneric-convert",
"high-speed-reject",
"generic-translucent",
"generic-merc-query",
"generic-merc-death",
"generic-merc-execute-asm",
"generic-merc-do-chain",
"generic-light-proc",
"generic-envmap-proc",
"generic-prepare-dma-double",
"generic-prepare-dma-single",
"generic-warp-source-proc",
"generic-warp-dest-proc",
"generic-warp-dest",
"generic-warp-envmap-dest",
"generic-no-light-proc"
],
"mips2c_jump_table_functions": {},
@@ -1903,5 +1903,6 @@
["L348", "vector"],
["L337", "vector"]
],
"bigmap": [["L127", "(pointer int64)", 16]]
"bigmap": [["L127", "(pointer int64)", 16]],
"generic-merc": [["L172", "(inline-array invinitdata)", 8]]
}
@@ -670,10 +670,64 @@
[[324, 327], "v1", "dma-packet"]
],
"fx-copy-buf": [
[[17, 22], "t3", "dma-packet"],
[[2, 8], "a2", "dma-packet"],
[[122, 127], "t0", "dma-packet"],
[[24, 66], "t3", "dma-packet"]
[[17, 23], "t3", "gs-gif-tag"],
[27, "t3", "(pointer gs-reg)"],
[30, "t3", "(pointer gs-reg)"],
[32, "t3", "(pointer gs-frame)"],
[34, "t3", "(pointer gs-reg)"],
[36, "t3", "(pointer gs-zbuf)"],
[38, "t3", "(pointer gs-reg)"],
[40, "t3", "(pointer gs-test)"],
[42, "t3", "(pointer gs-reg)"],
[43, "t3", "(pointer gs-alpha)"],
[44, "t3", "(pointer gs-reg)"],
[46, "t3", "(pointer gs-prim)"],
[48, "t3", "(pointer gs-reg)"],
[50, "t3", "(pointer gs-rgbaq)"],
[52, "t3", "(pointer gs-reg)"],
[54, "t3", "(pointer gs-tex0)"],
[56, "t3", "(pointer gs-reg)"],
[57, "t3", "(pointer gs-tex1)"],
[59, "t3", "(pointer gs-reg)"],
[60, "t3", "(pointer gs-miptbp)"],
[62, "t3", "(pointer gs-reg)"],
[64, "t3", "(pointer gs-clamp)"],
[[69, 78], "t4", "gs-gif-tag"], // uv, xyz2
[87, "t6", "(pointer gs-uv2)"],
[96, "t6", "(pointer gs-xyz)"],
[103, "t6", "(pointer gs-uv2)"],
[113, "t6", "(pointer gs-xyz)"],
[[122, 128], "t0", "gs-gif-tag"],
[132, "a3", "(pointer gs-reg)"], // 63, texflush
[135, "a3", "(pointer gs-reg)"], // 76, frame
[137, "a3", "(pointer gs-frame)"],
[139, "a3", "(pointer gs-reg)"], // 78, zbuf
[141, "a3", "(pointer gs-zbuf)"],
[143, "a3", "(pointer gs-reg)"], // 71, test
[145, "a3", "(pointer gs-test)"],
[147, "a3", "(pointer gs-reg)"], // 66, alpha
[148, "a3", "(pointer gs-alpha)"],
[150, "a3", "(pointer gs-reg)"], // 1, rgbaq
[152, "a3", "(pointer gs-rgbaq)"],
[154, "a3", "(pointer gs-reg)"], // 6, tex0
[156, "a3", "(pointer gs-tex0)"],
[158, "a3", "(pointer gs-reg)"], // 20, tex1
[160, "a3", "(pointer gs-tex1)"],
[162, "a3", "(pointer gs-reg)"], // 52, miptbp
[163, "a3", "(pointer gs-miptbp)"],
[165, "a3", "(pointer gs-reg)"], // 8, clamp
[174, "a3", "(pointer gs-clamp)"],
[[192, 199], "v1", "(pointer uint64)"]
],
"foreground-generic-merc-add-fragments": [
[[5, 54], "a3", "merc-fragment-control"],
[[5, 57], "v1", "merc-fragment"],
[28, "t4", "foreground-work"],
[[16, 19], "a1", "dma-packet"],
[21, "t3", "(pointer int32)"],
[[38, 41], "a1", "dma-packet"],
[[49, 52], "a1", "dma-packet"]
],
"(method 12 setting-control)": [[17, "s4", "connection"]],
"(method 14 setting-control)": [[6, "v1", "connection"]],
@@ -9804,6 +9858,8 @@
[[47, 57], "v1", "(pointer uint32)"]
],
"generic-vu1-init-buf": [[[24, 32], "v1", "dma-packet"]],
"generic-vu1-init-buf-special": [[[27, 37], "v1", "dma-packet"]],
"(method 11 drill-wall)": [
[159, "v0", "(pointer actor-group)"],
["_stack_", 16, "res-tag"]
@@ -11207,5 +11263,39 @@
[[12, 20], "a0", "vector4w"],
[[20, 27], "a0", "vector4w"],
[[29, 35], "v1", "vector4w"]
],
"generic-merc-execute-all": [
[76, "v1", "generic-work"],
[78, "v1", "generic-work"],
[80, "v1", "generic-work"],
[95, "a0", "generic-work"],
[143, "v1", "generic-work"],
[145, "v1", "generic-work"],
[147, "v1", "generic-work"]
],
"generic-work-init": [
[4, "a0", "generic-work"],
[[9, 19], "a0", "generic-work"],
[23, "a1", "generic-work"]
],
"generic-initialize-without-sync": [
[8, "a0", "generic-work"],
[21, "a0", "generic-work"]
],
"generic-initialize": [
[8, "a0", "generic-work"],
[21, "a0", "generic-work"]
],
"generic-wrapup": [
[1, "v1", "generic-work"],
[4, "v1", "generic-work"]
],
"generic-warp-source": [
[2, "at", "generic-work"]
]
}
+2 -2
View File
@@ -181,8 +181,8 @@ struct MercExtraInfo {
};
constexpr int kTextureScrollEffectBit = 1;
constexpr int kTransEffectBitJak1 = 2; // so far only confirmed for jak 1
constexpr int kRippleEffectBit = 4; // true in jak 1 and jak 2
constexpr int kTransEffectBit = 2; // true in 1 and 2
constexpr int kRippleEffectBit = 4; // true in jak 1 and jak 2
struct MercEffect {
//((frag-geo merc-fragment :offset-assert 0) ;; ?
+1 -1
View File
@@ -885,7 +885,7 @@ ConvertedMercEffect convert_merc_effect(const MercEffect& input_effect,
can_be_modified = true;
}
if (version == GameVersion::Jak1 && (input_effect.effect_bits & kTransEffectBitJak1)) {
if (input_effect.effect_bits & kTransEffectBit) {
use_alpha_blend = true;
}
+4 -1
View File
@@ -91,6 +91,8 @@ set(RUNTIME_SOURCE
mips2c/jak2_functions/debug.cpp
mips2c/jak2_functions/font.cpp
mips2c/jak2_functions/foreground.cpp
mips2c/jak2_functions/generic_merc.cpp
mips2c/jak2_functions/generic_effect.cpp
mips2c/jak2_functions/joint.cpp
mips2c/jak2_functions/lights.cpp
mips2c/jak2_functions/nav_control.cpp
@@ -151,6 +153,7 @@ set(RUNTIME_SOURCE
graphics/opengl_renderer/BucketRenderer.cpp
graphics/opengl_renderer/CollideMeshRenderer.cpp
graphics/opengl_renderer/debug_gui.cpp
graphics/opengl_renderer/DepthCue.cpp
graphics/opengl_renderer/DirectRenderer.cpp
graphics/opengl_renderer/DirectRenderer2.cpp
graphics/opengl_renderer/EyeRenderer.cpp
@@ -168,7 +171,7 @@ set(RUNTIME_SOURCE
graphics/opengl_renderer/SkyRenderer.cpp
graphics/opengl_renderer/TextureUploadHandler.cpp
graphics/opengl_renderer/VisDataHandler.cpp
graphics/opengl_renderer/DepthCue.cpp
graphics/opengl_renderer/Warp.cpp
graphics/texture/jak1_tpage_dir.cpp
graphics/texture/jak2_tpage_dir.cpp
graphics/texture/TextureConverter.cpp
@@ -13,6 +13,7 @@
#include "game/graphics/opengl_renderer/SkyRenderer.h"
#include "game/graphics/opengl_renderer/TextureUploadHandler.h"
#include "game/graphics/opengl_renderer/VisDataHandler.h"
#include "game/graphics/opengl_renderer/Warp.h"
#include "game/graphics/opengl_renderer/background/Shrub.h"
#include "game/graphics/opengl_renderer/background/TFragment.h"
#include "game/graphics/opengl_renderer/background/Tie3.h"
@@ -154,6 +155,9 @@ void OpenGLRenderer::init_bucket_renderers_jak2() {
init_bucket_renderer<Merc2>(
fmt::format("merc-l{}-pris", i), BucketCategory::MERC,
GET_BUCKET_ID_FOR_LIST(BucketId::MERC_L0_PRIS, BucketId::MERC_L1_PRIS, i));
init_bucket_renderer<Generic2>(
fmt::format("gmerc-l{}-pris", i), BucketCategory::GENERIC,
GET_BUCKET_ID_FOR_LIST(BucketId::GMERC_L0_PRIS, BucketId::GMERC_L1_PRIS, i));
init_bucket_renderer<TextureUploadHandler>(
fmt::format("tex-l{}-pris2", i), BucketCategory::TEX,
@@ -207,6 +211,7 @@ void OpenGLRenderer::init_bucket_renderers_jak2() {
init_bucket_renderer<LightningRenderer>("effects", BucketCategory::OTHER, BucketId::EFFECTS);
init_bucket_renderer<TextureUploadHandler>("tex-all-warp", BucketCategory::TEX,
BucketId::TEX_ALL_WARP);
init_bucket_renderer<Warp>("warp", BucketCategory::GENERIC, BucketId::GMERC_WARP);
init_bucket_renderer<DirectRenderer>("debug-no-zbuf1", BucketCategory::OTHER,
BucketId::DEBUG_NO_ZBUF1, 0x8000);
init_bucket_renderer<TextureUploadHandler>("tex-all-map", BucketCategory::TEX,
+35
View File
@@ -0,0 +1,35 @@
#include "Warp.h"
Warp::Warp(const std::string& name, int id) : BucketRenderer(name, id), m_generic(name, id) {}
Warp::~Warp() {}
void Warp::draw_debug_window() {
m_generic.draw_debug_window();
}
void Warp::render(DmaFollower& dma, SharedRenderState* render_state, ScopedProfilerNode& prof) {
m_fb_copier.copy_now(render_state->render_fb_w, render_state->render_fb_h,
render_state->render_fb_x, render_state->render_fb_y,
render_state->render_fb);
render_state->texture_pool->move_existing_to_vram(m_warp_src_tex, m_tbp);
m_generic.render_in_mode(dma, render_state, prof, Generic2::Mode::NORMAL);
}
void Warp::init_shaders(ShaderLibrary& shaders) {
m_generic.init_shaders(shaders);
}
void Warp::init_textures(TexturePool& tex_pool, GameVersion version) {
TextureInput in;
// point to fb copier's texture.
in.gpu_texture = m_fb_copier.texture();
in.w = 32;
in.h = 32;
in.debug_page_name = "PC-WARP";
in.debug_name = "PC-WARP";
in.id = tex_pool.allocate_pc_port_texture(version);
m_warp_src_tex = tex_pool.give_texture_and_load_to_vram(in, m_tbp);
m_generic.init_textures(tex_pool, version);
}
+22
View File
@@ -0,0 +1,22 @@
#pragma once
#include "game/graphics/opengl_renderer/BucketRenderer.h"
#include "game/graphics/opengl_renderer/Warp.h"
#include "game/graphics/opengl_renderer/foreground/Generic2.h"
#include "game/graphics/opengl_renderer/opengl_utils.h"
class Warp : public BucketRenderer {
public:
Warp(const std::string& name, int id);
~Warp();
void render(DmaFollower& dma, SharedRenderState* render_state, ScopedProfilerNode& prof) override;
void draw_debug_window() override;
void init_shaders(ShaderLibrary& shaders) override;
void init_textures(TexturePool& tex_pool, GameVersion version) override;
private:
Generic2 m_generic;
FramebufferCopier m_fb_copier;
GpuTexture* m_warp_src_tex = nullptr;
u32 m_tbp = 1216; // hack, jak 2
};
@@ -80,7 +80,11 @@ void Generic2::render_in_mode(DmaFollower& dma,
auto p = prof.make_scoped_child("dma");
switch (mode) {
case Mode::NORMAL:
process_dma(dma, render_state->next_bucket);
if (render_state->version == GameVersion::Jak1) {
process_dma_jak1(dma, render_state->next_bucket);
} else {
process_dma_jak2(dma, render_state->next_bucket);
}
break;
case Mode::LIGHTNING:
process_dma_lightning(dma, render_state->next_bucket);
@@ -13,10 +13,7 @@ class Generic2 : public BucketRenderer {
~Generic2();
void render(DmaFollower& dma, SharedRenderState* render_state, ScopedProfilerNode& prof) override;
enum class Mode {
NORMAL,
LIGHTNING,
};
enum class Mode { NORMAL, LIGHTNING };
void render_in_mode(DmaFollower& dma,
SharedRenderState* render_state,
@@ -45,8 +42,9 @@ class Generic2 : public BucketRenderer {
void draws_to_buckets();
void reset_buffers();
void process_matrices();
void process_dma(DmaFollower& dma, u32 next_bucket);
void process_dma_jak1(DmaFollower& dma, u32 next_bucket);
void process_dma_lightning(DmaFollower& dma, u32 next_bucket);
void process_dma_jak2(DmaFollower& dma, u32 next_bucket);
void setup_draws(bool enable_at);
void do_draws(SharedRenderState* render_state, ScopedProfilerNode& prof);
void do_draws_for_alpha(SharedRenderState* render_state,
@@ -211,5 +209,6 @@ class Generic2 : public BucketRenderer {
GLuint alpha_reject, color_mult, fog_color, scale, mat_23, mat_32, mat_33, fog_consts,
hvdf_offset;
GLuint gfx_hack_no_tex;
GLuint warp_sample_mode;
} m_ogl;
};
@@ -312,7 +312,7 @@ u32 Generic2::handle_fragments_after_unpack_v4_32(const u8* data,
return off;
}
void Generic2::process_dma(DmaFollower& dma, u32 next_bucket) {
void Generic2::process_dma_jak1(DmaFollower& dma, u32 next_bucket) {
reset_buffers();
// handle the stuff at the beginning.
@@ -391,6 +391,137 @@ bool is_nop_zero(const DmaTransfer& xf) {
xf.vifcode1().kind == VifCode::Kind::NOP;
}
bool is_jak2_end(const DmaTransfer& xf) {
return xf.size_bytes == 160 && xf.vifcode0().kind == VifCode::Kind::FLUSHA &&
xf.vifcode1().kind == VifCode::Kind::DIRECT;
}
void Generic2::process_dma_jak2(DmaFollower& dma, u32 next_bucket) {
reset_buffers();
auto first_data = dma.read_and_advance();
// handle the stuff at the beginning.
// if the engine didn't run the generic renderer setup function, this bucket will end here.
if (is_nop_zero(first_data) && next_bucket == dma.current_tag_offset()) {
return;
}
// next, the generic setup. This reads the data generated by generic-init-buf.
auto v0k = first_data.vifcode0().kind;
ASSERT((v0k == VifCode::Kind::MARK || v0k == VifCode::Kind::NOP) &&
first_data.vifcode1().kind == VifCode::Kind::NOP);
// setup packet 1 is GS settings
auto direct_setup = dma.read_and_advance();
ASSERT(direct_setup.size_bytes == 32 && direct_setup.vifcode0().kind == VifCode::Kind::NOP &&
direct_setup.vifcode1().kind == VifCode::Kind::DIRECT);
u64 zbuf_val;
memcpy(&zbuf_val, direct_setup.data + 16, 8);
m_drawing_config.zmsk = GsZbuf(zbuf_val).zmsk();
auto constants = dma.read_and_advance();
ASSERT(constants.size_bytes == 128);
ASSERT(constants.vifcode0().kind == VifCode::Kind::STCYCL);
ASSERT(constants.vifcode1().kind == VifCode::Kind::UNPACK_V4_32);
memcpy(&m_drawing_config.pfog0, constants.data + 0, 4);
memcpy(&m_drawing_config.fog_min, constants.data + 4, 4);
memcpy(&m_drawing_config.fog_max, constants.data + 8, 4);
memcpy(m_drawing_config.hvdf_offset.data(), constants.data + 32, 16);
auto vu_setup = dma.read_and_advance();
ASSERT(vu_setup.size_bytes == 32);
// this sets offset/base to 0, sets row to 0 and runs program 0 to set up VU regs
// todo: any setup required from running this program.
// if there was nothing rendered by generic on this frame in this bucket, the bucket will end
// here.
if (is_nop_zero(first_data) && next_bucket == dma.current_tag_offset()) {
return;
}
// 0: NOP NOP
// loop over "fragments"
// each "fragment" consists of a series of uploads, followed by a MSCAL VIFCODE that runs
// VU program that does vertex transformation and sends to the GS.
Fragment* continued_fragment = nullptr;
auto vif_transfer = dma.read_and_advance();
while (is_nop_zero(vif_transfer)) {
vif_transfer = dma.read_and_advance();
}
while (!is_jak2_end(vif_transfer)) {
if (continued_fragment) {
ASSERT(vif_transfer.vifcode0().kind == VifCode::Kind::NOP);
auto up = vif_transfer.vifcode1();
ASSERT(up.kind == VifCode::Kind::UNPACK_V3_32);
ASSERT(vif_transfer.size_bytes * 4 / 48 == up.num);
ASSERT(up.num == continued_fragment->vtx_count);
unpack_vtx_positions(&m_verts[continued_fragment->vtx_idx], vif_transfer.data,
continued_fragment->vtx_count);
continued_fragment = nullptr;
auto call = dma.read_and_advance();
ASSERT(call.size_bytes == 0);
ASSERT(call.vifcode1().kind == VifCode::Kind::MSCAL);
if (check_for_end_of_generic_data(dma, next_bucket)) {
return;
}
} else {
auto v1 = vif_transfer.vifcode1();
if (vif_transfer.vifcode0().kind != VifCode::Kind::STCYCL ||
vif_transfer.vifcode1().kind != VifCode::Kind::UNPACK_V4_32) {
fmt::print("failing tag: {} {} {}\n", vif_transfer.vifcode0().print(),
vif_transfer.vifcode1().print(), vif_transfer.size_bytes);
}
ASSERT(vif_transfer.vifcode0().kind == VifCode::Kind::STCYCL);
ASSERT(v1.kind == VifCode::Kind::UNPACK_V4_32);
u32 unpack_bytes = v1.num * 16;
auto& frag = next_frag();
u32 off = handle_fragments_after_unpack_v4_32(vif_transfer.data, 0, unpack_bytes,
vif_transfer.size_bytes, &frag, false);
if (check_for_end_of_generic_data(dma, next_bucket)) {
return;
}
if (off < vif_transfer.size_bytes) {
u32 stcycl_reset;
memcpy(&stcycl_reset, vif_transfer.data + off, 4);
ASSERT(VifCode(stcycl_reset).kind == VifCode::Kind::STCYCL);
off += 4;
// while (off < vif_transfer.size_bytes) {
u32 next;
memcpy(&next, vif_transfer.data + off, 4);
VifCode next_unpack(next);
ASSERT(next_unpack.kind == VifCode::Kind::UNPACK_V4_32);
auto& continue_frag = next_frag();
off = handle_fragments_after_unpack_v4_32(vif_transfer.data, off, next_unpack.num * 16,
vif_transfer.size_bytes, &continue_frag, true);
continued_fragment = &continue_frag;
ASSERT(off == vif_transfer.size_bytes);
// }
}
}
vif_transfer = dma.read_and_advance();
while (is_nop_zero(vif_transfer)) {
vif_transfer = dma.read_and_advance();
}
}
// ending:
// 0: NOP NOP
// 160: FLUSHA DIRECT
// 0: NOP NOP
auto end = dma.read_and_advance();
(void)end;
ASSERT(next_bucket == dma.current_tag_offset());
}
void unpack_vertex(Generic2::Vertex* out, const u8* in, int count) {
for (int i = 0; i < count; i++) {
// st:
@@ -80,6 +80,7 @@ void Generic2::init_shaders(ShaderLibrary& shaders) {
m_ogl.fog_consts = glGetUniformLocation(id, "fog_constants");
m_ogl.hvdf_offset = glGetUniformLocation(id, "hvdf_offset");
m_ogl.gfx_hack_no_tex = glGetUniformLocation(id, "gfx_hack_no_tex");
m_ogl.warp_sample_mode = glGetUniformLocation(id, "warp_sample_mode");
}
void Generic2::opengl_bind_and_setup_proj(SharedRenderState* render_state) {
@@ -256,6 +257,12 @@ void Generic2::setup_opengl_tex(u16 unit,
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
}
if (render_state->version == GameVersion::Jak2 && tbp_to_lookup == 1216) {
glUniform1ui(m_ogl.warp_sample_mode, 1);
} else {
glUniform1ui(m_ogl.warp_sample_mode, 0);
}
}
void Generic2::do_draws_for_alpha(SharedRenderState* render_state,
@@ -149,3 +149,65 @@ void FullScreenDraw::draw(const math::Vector4f& color,
prof.add_draw_call();
glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
}
FramebufferCopier::FramebufferCopier() {
glGenFramebuffers(1, &m_fbo);
glBindFramebuffer(GL_FRAMEBUFFER, m_fbo);
glGenTextures(1, &m_fbo_texture);
glBindTexture(GL_TEXTURE_2D, m_fbo_texture);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, m_fbo_width, m_fbo_height, 0, GL_RGB, GL_UNSIGNED_BYTE,
NULL);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, m_fbo_texture, 0);
ASSERT(glCheckFramebufferStatus(GL_FRAMEBUFFER) == GL_FRAMEBUFFER_COMPLETE);
glBindTexture(GL_TEXTURE_2D, 0);
}
FramebufferCopier::~FramebufferCopier() {
glDeleteTextures(1, &m_fbo_texture);
glDeleteFramebuffers(1, &m_fbo);
}
void FramebufferCopier::copy_now(int render_fb_w,
int render_fb_h,
int render_fb_x,
int render_fb_y,
GLuint render_fb) {
if (m_fbo_width != render_fb_w || m_fbo_height != render_fb_h) {
m_fbo_width = render_fb_w;
m_fbo_height = render_fb_h;
glBindTexture(GL_TEXTURE_2D, m_fbo_texture);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, m_fbo_width, m_fbo_height, 0, GL_RGB, GL_UNSIGNED_BYTE,
NULL);
glBindTexture(GL_TEXTURE_2D, 0);
}
glBindFramebuffer(GL_READ_FRAMEBUFFER, render_fb);
glBindFramebuffer(GL_DRAW_FRAMEBUFFER, m_fbo);
glBlitFramebuffer(render_fb_x, // srcX0
render_fb_y, // srcY0
render_fb_x + render_fb_w, // srcX1
render_fb_y + render_fb_h, // srcY1
0, // dstX0
0, // dstY0
m_fbo_width, // dstX1
m_fbo_height, // dstY1
GL_COLOR_BUFFER_BIT, // mask
GL_NEAREST // filter
);
glBindFramebuffer(GL_FRAMEBUFFER, render_fb);
}
@@ -56,4 +56,22 @@ class FullScreenDraw {
private:
GLuint m_vao;
GLuint m_vertex_buffer;
};
class FramebufferCopier {
public:
FramebufferCopier();
~FramebufferCopier();
FramebufferCopier(const FramebufferCopier&) = delete;
FramebufferCopier& operator=(const FramebufferCopier&) = delete;
void copy_now(int render_fb_w,
int render_fb_h,
int render_fb_x,
int render_fb_y,
GLuint render_fb);
u64 texture() const { return m_fbo_texture; }
private:
GLuint m_fbo = 0, m_fbo_texture = 0;
int m_fbo_width = 640, m_fbo_height = 480;
};
@@ -11,6 +11,7 @@ uniform vec4 scale;
uniform float mat_23;
uniform float mat_33;
uniform vec4 hvdf_offset;
uniform uint warp_sample_mode;
out vec2 tex_coord;
@@ -19,6 +20,9 @@ out float fog;
out flat uvec2 tex_info;
const float warp_off = 1.f - (416.f/512.f);
const float warp_mult = 512.f/416.f;
void main() {
// lq.xy vf22, 0(vi10) texture load?
// lq_buffer(Mask::xy, vu.vf22, vu.vi10);
@@ -50,7 +54,11 @@ void main() {
// itof12.xyz vf18, vf22 texture int to float
// vu.vf18.itof12(Mask::xyz, vu.vf22);
tex_coord = tex_coord_in / 4096.f; // TODO, more and wrong.
tex_coord = tex_coord_in / 4096.f;
if (warp_sample_mode == 1) {
tex_coord = vec2(tex_coord.x, (1.0f - tex_coord.y - warp_off) * warp_mult);
}
// mul.xyz vf12, vf12, Q persepective divide
// gen.vtx_p0.mul(Mask::xyz, gen.vtx_p0, vu.Q);
+663
View File
@@ -679,4 +679,667 @@ void link() {
} // namespace Mips2C
//--------------------------MIPS2C---------------------
// clang-format off
#include "game/mips2c/mips2c_private.h"
#include "game/kernel/jak2/kscheme.h"
using ::jak2::intern_from_c;
namespace Mips2C::jak2 {
namespace foreground_generic_merc {
struct Cache {
void* fake_scratchpad_data; // *fake-scratchpad-data*
void* foreground; // *foreground*
void* merc_global_stats; // *merc-global-stats*
void* foreground_generic_merc_add_fragments; // foreground-generic-merc-add-fragments
void* foreground_generic_merc_death; // foreground-generic-merc-death
} cache;
u64 execute(void* ctxt) {
auto* c = (ExecutionContext*)ctxt;
bool bc = false;
u32 call_addr = 0;
c->daddiu(sp, sp, -112); // daddiu sp, sp, -112
c->sd(ra, 0, sp); // sd ra, 0(sp)
c->sq(s1, 16, sp); // sq s1, 16(sp)
c->sq(s2, 32, sp); // sq s2, 32(sp)
c->sq(s3, 48, sp); // sq s3, 48(sp)
c->sq(s4, 64, sp); // sq s4, 64(sp)
c->sq(s5, 80, sp); // sq s5, 80(sp)
c->sq(gp, 96, sp); // sq gp, 96(sp)
c->mov64(gp, a0); // or gp, a0, r0
get_fake_spad_addr2(v1, cache.fake_scratchpad_data, 0, c);// lui v1, 28672
c->daddu(v1, r0, v1); // daddu v1, r0, v1
c->sw(a2, 16, v1); // sw a2, 16(v1)
c->sw(a1, 20, v1); // sw a1, 20(v1)
c->lb(v1, 78, gp); // lb v1, 78(gp)
c->dsll(v1, v1, 3); // dsll v1, v1, 3
c->daddu(v1, gp, v1); // daddu v1, gp, v1
c->lwu(s5, 28, v1); // lwu s5, 28(v1)
c->daddiu(s3, a1, 16); // daddiu s3, a1, 16
c->addiu(s4, r0, 0); // addiu s4, r0, 0
//beq r0, r0, L153 // beq r0, r0, L153
// nop // sll r0, r0, 0
goto block_77; // branch always
block_1:
c->load_symbol2(v1, cache.foreground); // lw v1, *foreground*(s7)
c->daddiu(v1, v1, 2384); // daddiu v1, v1, 2384
c->dsll(a0, s4, 3); // dsll a0, s4, 3
c->daddu(a0, v1, a0); // daddu a0, v1, a0
c->lbu(a0, 130, a0); // lbu a0, 130(a0)
c->daddiu(a0, a0, -1); // daddiu a0, a0, -1
c->daddiu(a1, s7, 4); // daddiu a1, s7, 4
c->movz(a1, s7, a0); // movz a1, s7, a0
if (((s64)c->sgpr64(s7)) == ((s64)c->sgpr64(a1))) {// beql s7, a1, L120
c->mov64(v1, a1); // or v1, a1, r0
goto block_4;
}
c->dsll(a0, s4, 3); // dsll a0, s4, 3
c->daddu(v1, v1, a0); // daddu v1, v1, a0
c->lbu(v1, 128, v1); // lbu v1, 128(v1)
c->daddiu(a0, v1, -2); // daddiu a0, v1, -2
c->daddiu(v1, s7, 4); // daddiu v1, s7, 4
c->movn(v1, s7, a0); // movn v1, s7, a0
block_4:
bc = c->sgpr64(s7) == c->sgpr64(v1); // beq s7, v1, L152
c->mov64(v1, s7); // or v1, s7, r0
if (bc) {goto block_76;} // branch non-likely
c->mov64(s1, s3); // or s1, s3, r0
c->dsll(v1, s4, 5); // dsll v1, s4, 5
c->daddiu(v1, v1, 156); // daddiu v1, v1, 156
c->daddu(s2, v1, s5); // daddu s2, v1, s5
c->load_symbol2(v1, cache.merc_global_stats); // lw v1, *merc-global-stats*(s7)
c->daddiu(v1, v1, 32); // daddiu v1, v1, 32
c->lhu(a0, 2, v1); // lhu a0, 2(v1)
c->lhu(a1, 18, s2); // lhu a1, 18(s2)
c->daddu(a0, a0, a1); // daddu a0, a0, a1
c->sh(a0, 2, v1); // sh a0, 2(v1)
c->lwu(a0, 4, v1); // lwu a0, 4(v1)
c->lhu(a1, 22, s2); // lhu a1, 22(s2)
c->daddu(a0, a0, a1); // daddu a0, a0, a1
c->sw(a0, 4, v1); // sw a0, 4(v1)
c->lwu(a0, 8, v1); // lwu a0, 8(v1)
c->lhu(a1, 24, s2); // lhu a1, 24(s2)
c->daddu(a0, a0, a1); // daddu a0, a0, a1
c->sw(a0, 8, v1); // sw a0, 8(v1)
c->load_symbol2(v1, cache.foreground); // lw v1, *foreground*(s7)
c->daddiu(v1, v1, 2384); // daddiu v1, v1, 2384
c->daddiu(a1, s1, 16); // daddiu a1, s1, 16
c->daddu(a2, r0, v1); // daddu a2, r0, v1
c->addiu(a0, r0, 7); // addiu a0, r0, 7
// nop // sll r0, r0, 0
c->daddiu(a3, a0, -4); // daddiu a3, a0, -4
c->mov64(a1, a1); // or a1, a1, r0
bc = ((s64)c->sgpr64(a3)) < 0; // bltz a3, L122
c->mov64(a2, a2); // or a2, a2, r0
if (bc) {goto block_7;} // branch non-likely
block_6:
// nop // sll r0, r0, 0
c->lq(t2, 0, a2); // lq t2, 0(a2)
// nop // sll r0, r0, 0
c->lq(a3, 16, a2); // lq a3, 16(a2)
c->daddiu(a0, a0, -4); // daddiu a0, a0, -4
c->lq(t0, 32, a2); // lq t0, 32(a2)
c->daddiu(a1, a1, 64); // daddiu a1, a1, 64
c->lq(t1, 48, a2); // lq t1, 48(a2)
c->daddiu(a2, a2, 64); // daddiu a2, a2, 64
c->sq(t2, -64, a1); // sq t2, -64(a1)
c->daddiu(t2, a0, -4); // daddiu t2, a0, -4
c->sq(a3, -48, a1); // sq a3, -48(a1)
// nop // sll r0, r0, 0
c->sq(t0, -32, a1); // sq t0, -32(a1)
bc = ((s64)c->sgpr64(t2)) >= 0; // bgez t2, L121
c->sq(t1, -16, a1); // sq t1, -16(a1)
if (bc) {goto block_6;} // branch non-likely
block_7:
bc = c->sgpr64(a0) == 0; // beq a0, r0, L123
c->lq(a3, 0, a2); // lq a3, 0(a2)
if (bc) {goto block_12;} // branch non-likely
c->daddiu(a2, a2, 16); // daddiu a2, a2, 16
c->daddiu(a1, a1, 16); // daddiu a1, a1, 16
c->daddiu(a0, a0, -1); // daddiu a0, a0, -1
c->sq(a3, -16, a1); // sq a3, -16(a1)
bc = c->sgpr64(a0) == 0; // beq a0, r0, L123
c->lq(a3, 0, a2); // lq a3, 0(a2)
if (bc) {goto block_12;} // branch non-likely
c->daddiu(a2, a2, 16); // daddiu a2, a2, 16
c->daddiu(a1, a1, 16); // daddiu a1, a1, 16
c->daddiu(a0, a0, -1); // daddiu a0, a0, -1
c->sq(a3, -16, a1); // sq a3, -16(a1)
bc = c->sgpr64(a0) == 0; // beq a0, r0, L123
c->lq(a3, 0, a2); // lq a3, 0(a2)
if (bc) {goto block_12;} // branch non-likely
c->daddiu(a2, a2, 16); // daddiu a2, a2, 16
c->daddiu(a1, a1, 16); // daddiu a1, a1, 16
c->daddiu(a0, a0, -1); // daddiu a0, a0, -1
c->sq(a3, -16, a1); // sq a3, -16(a1)
bc = c->sgpr64(a0) == 0; // beq a0, r0, L123
c->lq(a3, 0, a2); // lq a3, 0(a2)
if (bc) {goto block_12;} // branch non-likely
c->daddiu(a2, a2, 16); // daddiu a2, a2, 16
c->daddiu(a1, a1, 16); // daddiu a1, a1, 16
c->daddiu(a0, a0, -1); // daddiu a0, a0, -1
c->sq(a3, -16, a1); // sq a3, -16(a1)
block_12:
c->gprs[a0].du64[0] = 0; // or a0, r0, r0
c->daddiu(a1, s1, 128); // daddiu a1, s1, 128
c->daddiu(a2, s5, 28); // daddiu a2, s5, 28
c->addiu(a0, r0, 8); // addiu a0, r0, 8
c->daddiu(a3, a0, -4); // daddiu a3, a0, -4
c->mov64(a1, a1); // or a1, a1, r0
bc = ((s64)c->sgpr64(a3)) < 0; // bltz a3, L125
c->mov64(a2, a2); // or a2, a2, r0
if (bc) {goto block_14;} // branch non-likely
block_13:
// nop // sll r0, r0, 0
c->lq(t2, 0, a2); // lq t2, 0(a2)
// nop // sll r0, r0, 0
c->lq(a3, 16, a2); // lq a3, 16(a2)
c->daddiu(a0, a0, -4); // daddiu a0, a0, -4
c->lq(t0, 32, a2); // lq t0, 32(a2)
c->daddiu(a1, a1, 64); // daddiu a1, a1, 64
c->lq(t1, 48, a2); // lq t1, 48(a2)
c->daddiu(a2, a2, 64); // daddiu a2, a2, 64
c->sq(t2, -64, a1); // sq t2, -64(a1)
c->daddiu(t2, a0, -4); // daddiu t2, a0, -4
c->sq(a3, -48, a1); // sq a3, -48(a1)
// nop // sll r0, r0, 0
c->sq(t0, -32, a1); // sq t0, -32(a1)
bc = ((s64)c->sgpr64(t2)) >= 0; // bgez t2, L124
c->sq(t1, -16, a1); // sq t1, -16(a1)
if (bc) {goto block_13;} // branch non-likely
block_14:
bc = c->sgpr64(a0) == 0; // beq a0, r0, L126
c->lq(a3, 0, a2); // lq a3, 0(a2)
if (bc) {goto block_19;} // branch non-likely
c->daddiu(a2, a2, 16); // daddiu a2, a2, 16
c->daddiu(a1, a1, 16); // daddiu a1, a1, 16
c->daddiu(a0, a0, -1); // daddiu a0, a0, -1
c->sq(a3, -16, a1); // sq a3, -16(a1)
bc = c->sgpr64(a0) == 0; // beq a0, r0, L126
c->lq(a3, 0, a2); // lq a3, 0(a2)
if (bc) {goto block_19;} // branch non-likely
c->daddiu(a2, a2, 16); // daddiu a2, a2, 16
c->daddiu(a1, a1, 16); // daddiu a1, a1, 16
c->daddiu(a0, a0, -1); // daddiu a0, a0, -1
c->sq(a3, -16, a1); // sq a3, -16(a1)
bc = c->sgpr64(a0) == 0; // beq a0, r0, L126
c->lq(a3, 0, a2); // lq a3, 0(a2)
if (bc) {goto block_19;} // branch non-likely
c->daddiu(a2, a2, 16); // daddiu a2, a2, 16
c->daddiu(a1, a1, 16); // daddiu a1, a1, 16
c->daddiu(a0, a0, -1); // daddiu a0, a0, -1
c->sq(a3, -16, a1); // sq a3, -16(a1)
bc = c->sgpr64(a0) == 0; // beq a0, r0, L126
c->lq(a3, 0, a2); // lq a3, 0(a2)
if (bc) {goto block_19;} // branch non-likely
c->daddiu(a2, a2, 16); // daddiu a2, a2, 16
c->daddiu(a1, a1, 16); // daddiu a1, a1, 16
c->daddiu(a0, a0, -1); // daddiu a0, a0, -1
c->sq(a3, -16, a1); // sq a3, -16(a1)
block_19:
c->gprs[a0].du64[0] = 0; // or a0, r0, r0
c->lbu(a0, 17, s2); // lbu a0, 17(s2)
c->andi(a1, a0, 32); // andi a1, a0, 32
bc = c->sgpr64(a1) == 0; // beq a1, r0, L127
// nop // sll r0, r0, 0
if (bc) {goto block_21;} // branch non-likely
c->addiu(a0, r0, 1); // addiu a0, r0, 1
c->sb(a0, 182, s1); // sb a0, 182(s1)
//beq r0, r0, L129 // beq r0, r0, L129
// nop // sll r0, r0, 0
goto block_24; // branch always
block_21:
c->andi(a0, a0, 64); // andi a0, a0, 64
bc = c->sgpr64(a0) == 0; // beq a0, r0, L128
// nop // sll r0, r0, 0
if (bc) {goto block_23;} // branch non-likely
c->addiu(a0, r0, 2); // addiu a0, r0, 2
c->sb(a0, 182, s1); // sb a0, 182(s1)
//beq r0, r0, L129 // beq r0, r0, L129
// nop // sll r0, r0, 0
goto block_24; // branch always
block_23:
c->sb(r0, 182, s1); // sb r0, 182(s1)
c->gprs[a0].du64[0] = 0; // or a0, r0, r0
block_24:
c->lbu(a0, 26, s2); // lbu a0, 26(s2)
c->lbu(a1, 182, s1); // lbu a1, 182(s1)
bc = c->sgpr64(a1) == 0; // beq a1, r0, L130
// nop // sll r0, r0, 0
if (bc) {goto block_26;} // branch non-likely
c->addiu(a0, r0, 2432); // addiu a0, r0, 2432
get_fake_spad_addr2(a1, cache.fake_scratchpad_data, 0, c);// lui a1, 28672
c->daddu(a0, a0, a1); // daddu a0, a0, a1
//beq r0, r0, L131 // beq r0, r0, L131
// nop // sll r0, r0, 0
goto block_27; // branch always
block_26:
get_fake_spad_addr2(a1, cache.fake_scratchpad_data, 0, c);// lui a1, 28672
c->lwu(a1, 52, a1); // lwu a1, 52(a1)
c->daddiu(a1, a1, 24); // daddiu a1, a1, 24
c->addiu(a2, r0, 48); // addiu a2, r0, 48
c->multu3(a0, a2, a0); // multu3 a0, a2, a0
c->daddu(a0, a1, a0); // daddu a0, a1, a0
block_27:
get_fake_spad_addr2(a1, cache.fake_scratchpad_data, 0, c);// lui a1, 28672
c->sw(a0, 48, a1); // sw a0, 48(a1)
c->lwu(a1, 4, a0); // lwu a1, 4(a0)
bc = c->sgpr64(a1) == 0; // beq a1, r0, L132
c->mov64(a2, s7); // or a2, s7, r0
if (bc) {goto block_29;} // branch non-likely
c->sw(s1, 0, a1); // sw s1, 0(a1)
c->mov64(a1, s1); // or a1, s1, r0
block_29:
c->lwu(a1, 0, a0); // lwu a1, 0(a0)
bc = c->sgpr64(a1) != 0; // bne a1, r0, L133
c->mov64(a1, s7); // or a1, s7, r0
if (bc) {goto block_31;} // branch non-likely
c->sw(s1, 0, a0); // sw s1, 0(a0)
c->mov64(a1, s1); // or a1, s1, r0
block_31:
c->daddiu(a1, s1, 12); // daddiu a1, s1, 12
c->sw(a1, 4, a0); // sw a1, 4(a0)
c->dsll(a0, s4, 3); // dsll a0, s4, 3
c->daddiu(a0, a0, 124); // daddiu a0, a0, 124
c->daddu(a0, a0, v1); // daddu a0, a0, v1
c->lwu(a1, 0, a0); // lwu a1, 0(a0)
c->sw(a1, 160, s1); // sw a1, 160(s1)
c->lbu(a1, 5, a0); // lbu a1, 5(a0)
c->sb(a1, 183, s1); // sb a1, 183(s1)
c->lbu(a0, 7, a0); // lbu a0, 7(a0)
c->sb(a0, 186, s1); // sb a0, 186(s1)
c->lw(v1, 112, v1); // lw v1, 112(v1)
c->sb(v1, 168, s1); // sb v1, 168(s1)
get_fake_spad_addr2(v1, cache.fake_scratchpad_data, 0, c);// lui v1, 28672
c->lwu(v1, 16, v1); // lwu v1, 16(v1)
c->sb(v1, 169, s1); // sb v1, 169(s1)
bc = c->sgpr64(v1) == 0; // beq v1, r0, L134
c->mov64(v1, s7); // or v1, s7, r0
if (bc) {goto block_33;} // branch non-likely
c->sb(r0, 168, s1); // sb r0, 168(s1)
c->gprs[v1].du64[0] = 0; // or v1, r0, r0
block_33:
c->sb(r0, 170, s1); // sb r0, 170(s1)
c->addiu(v1, r0, 1); // addiu v1, r0, 1
c->sb(v1, 171, s1); // sb v1, 171(s1)
c->sh(r0, 172, s1); // sh r0, 172(s1)
c->addiu(v1, r0, 255); // addiu v1, r0, 255
c->sb(v1, 184, s1); // sb v1, 184(s1)
c->addiu(v1, r0, 0); // addiu v1, r0, 0
c->lbu(a0, 17, s2); // lbu a0, 17(s2)
c->andi(a0, a0, 2); // andi a0, a0, 2
bc = c->sgpr64(a0) == 0; // beq a0, r0, L135
c->mov64(a0, s7); // or a0, s7, r0
if (bc) {goto block_35;} // branch non-likely
c->addiu(v1, r0, 1); // addiu v1, r0, 1
c->mov64(a0, v1); // or a0, v1, r0
block_35:
c->lhu(a0, 4, gp); // lhu a0, 4(gp)
c->andi(a0, a0, 1024); // andi a0, a0, 1024
if (((s64)c->sgpr64(a0)) != ((s64)0)) { // bnel a0, r0, L136
c->daddiu(a0, s7, 4); // daddiu a0, s7, 4
goto block_40;
}
c->lhu(a0, 4, gp); // lhu a0, 4(gp)
c->andi(a0, a0, 2048); // andi a0, a0, 2048
if (((s64)c->sgpr64(a0)) == ((s64)0)) { // beql a0, r0, L136
c->mov64(a0, s7); // or a0, s7, r0
goto block_40;
}
c->daddiu(a0, s7, 4); // daddiu a0, s7, 4
c->lbu(a1, 17, s2); // lbu a1, 17(s2)
c->andi(a1, a1, 64); // andi a1, a1, 64
c->movz(a0, s7, a1); // movz a0, s7, a1
block_40:
bc = c->sgpr64(s7) == c->sgpr64(a0); // beq s7, a0, L137
c->mov64(a0, s7); // or a0, s7, r0
if (bc) {goto block_42;} // branch non-likely
c->lbu(v1, 206, gp); // lbu v1, 206(gp)
c->sb(v1, 184, s1); // sb v1, 184(s1)
c->addiu(v1, r0, 1); // addiu v1, r0, 1
c->mov64(a0, v1); // or a0, v1, r0
block_42:
c->sb(v1, 180, s1); // sb v1, 180(s1)
c->lbu(v1, 17, s2); // lbu v1, 17(s2)
c->andi(v1, v1, 64); // andi v1, v1, 64
bc = c->sgpr64(v1) == 0; // beq v1, r0, L138
// nop // sll r0, r0, 0
if (bc) {goto block_44;} // branch non-likely
c->addiu(v1, r0, 4); // addiu v1, r0, 4
c->sb(v1, 185, s1); // sb v1, 185(s1)
//beq r0, r0, L140 // beq r0, r0, L140
// nop // sll r0, r0, 0
goto block_47; // branch always
block_44:
c->lhu(v1, 4, gp); // lhu v1, 4(gp)
c->andi(v1, v1, 8192); // andi v1, v1, 8192
bc = c->sgpr64(v1) == 0; // beq v1, r0, L139
// nop // sll r0, r0, 0
if (bc) {goto block_46;} // branch non-likely
c->addiu(v1, r0, 4); // addiu v1, r0, 4
c->sb(v1, 185, s1); // sb v1, 185(s1)
//beq r0, r0, L140 // beq r0, r0, L140
// nop // sll r0, r0, 0
goto block_47; // branch always
block_46:
c->sb(r0, 185, s1); // sb r0, 185(s1)
c->gprs[v1].du64[0] = 0; // or v1, r0, r0
block_47:
c->lbu(v1, 92, gp); // lbu v1, 92(gp)
bc = c->sgpr64(v1) == 0; // beq v1, r0, L141
c->mov64(v1, s7); // or v1, s7, r0
if (bc) {goto block_49;} // branch non-likely
c->load_symbol2(t9, cache.foreground_generic_merc_death);// lw t9, foreground-generic-merc-death(s7)
c->mov64(a0, gp); // or a0, gp, r0
c->mov64(a1, s1); // or a1, s1, r0
call_addr = c->gprs[t9].du32[0]; // function call:
c->sll(v0, ra, 0); // sll v0, ra, 0
c->jalr(call_addr); // jalr ra, t9
c->mov64(v1, v0); // or v1, v0, r0
block_49:
c->sw(r0, 164, s1); // sw r0, 164(s1)
c->lbu(v1, 17, s2); // lbu v1, 17(s2)
c->andi(v1, v1, 4); // andi v1, v1, 4
if (((s64)c->sgpr64(v1)) == ((s64)0)) { // beql v1, r0, L142
c->mov64(v1, s7); // or v1, s7, r0
goto block_54;
}
c->lwu(v1, 80, gp); // lwu v1, 80(gp)
if (((s64)c->sgpr64(s7)) == ((s64)c->sgpr64(v1))) {// beql s7, v1, L142
c->mov64(v1, v1); // or v1, v1, r0
goto block_54;
}
c->lwu(v1, 80, gp); // lwu v1, 80(gp)
c->lwu(v1, 28, v1); // lwu v1, 28(v1)
block_54:
bc = c->sgpr64(s7) == c->sgpr64(v1); // beq s7, v1, L143
c->mov64(v1, s7); // or v1, s7, r0
if (bc) {goto block_56;} // branch non-likely
c->lwu(v1, 80, gp); // lwu v1, 80(gp)
c->lwu(v1, 32, v1); // lwu v1, 32(v1)
c->sw(v1, 164, s1); // sw v1, 164(s1)
block_56:
c->daddiu(a0, s1, 256); // daddiu a0, s1, 256
c->mov64(a1, s2); // or a1, s2, r0
c->addiu(v1, r0, 2); // addiu v1, r0, 2
c->daddiu(a2, v1, -4); // daddiu a2, v1, -4
c->mov64(a0, a0); // or a0, a0, r0
bc = ((s64)c->sgpr64(a2)) < 0; // bltz a2, L145
c->mov64(a1, a1); // or a1, a1, r0
if (bc) {goto block_58;} // branch non-likely
block_57:
// nop // sll r0, r0, 0
c->lq(t1, 0, a1); // lq t1, 0(a1)
// nop // sll r0, r0, 0
c->lq(a2, 16, a1); // lq a2, 16(a1)
c->daddiu(v1, v1, -4); // daddiu v1, v1, -4
c->lq(a3, 32, a1); // lq a3, 32(a1)
c->daddiu(a0, a0, 64); // daddiu a0, a0, 64
c->lq(t0, 48, a1); // lq t0, 48(a1)
c->daddiu(a1, a1, 64); // daddiu a1, a1, 64
c->sq(t1, -64, a0); // sq t1, -64(a0)
c->daddiu(t1, v1, -4); // daddiu t1, v1, -4
c->sq(a2, -48, a0); // sq a2, -48(a0)
// nop // sll r0, r0, 0
c->sq(a3, -32, a0); // sq a3, -32(a0)
bc = ((s64)c->sgpr64(t1)) >= 0; // bgez t1, L144
c->sq(t0, -16, a0); // sq t0, -16(a0)
if (bc) {goto block_57;} // branch non-likely
block_58:
bc = c->sgpr64(v1) == 0; // beq v1, r0, L146
c->lq(a2, 0, a1); // lq a2, 0(a1)
if (bc) {goto block_63;} // branch non-likely
c->daddiu(a1, a1, 16); // daddiu a1, a1, 16
c->daddiu(a0, a0, 16); // daddiu a0, a0, 16
c->daddiu(v1, v1, -1); // daddiu v1, v1, -1
c->sq(a2, -16, a0); // sq a2, -16(a0)
bc = c->sgpr64(v1) == 0; // beq v1, r0, L146
c->lq(a2, 0, a1); // lq a2, 0(a1)
if (bc) {goto block_63;} // branch non-likely
c->daddiu(a1, a1, 16); // daddiu a1, a1, 16
c->daddiu(a0, a0, 16); // daddiu a0, a0, 16
c->daddiu(v1, v1, -1); // daddiu v1, v1, -1
c->sq(a2, -16, a0); // sq a2, -16(a0)
bc = c->sgpr64(v1) == 0; // beq v1, r0, L146
c->lq(a2, 0, a1); // lq a2, 0(a1)
if (bc) {goto block_63;} // branch non-likely
c->daddiu(a1, a1, 16); // daddiu a1, a1, 16
c->daddiu(a0, a0, 16); // daddiu a0, a0, 16
c->daddiu(v1, v1, -1); // daddiu v1, v1, -1
c->sq(a2, -16, a0); // sq a2, -16(a0)
bc = c->sgpr64(v1) == 0; // beq v1, r0, L146
c->lq(a2, 0, a1); // lq a2, 0(a1)
if (bc) {goto block_63;} // branch non-likely
c->daddiu(a1, a1, 16); // daddiu a1, a1, 16
c->daddiu(a0, a0, 16); // daddiu a0, a0, 16
c->daddiu(v1, v1, -1); // daddiu v1, v1, -1
c->sq(a2, -16, a0); // sq a2, -16(a0)
block_63:
c->gprs[v1].du64[0] = 0; // or v1, r0, r0
c->addiu(v1, r0, 18); // addiu v1, r0, 18
c->lwu(a0, 28, s2); // lwu a0, 28(s2)
if (((s64)c->sgpr64(a0)) == ((s64)0)) { // beql a0, r0, L147
c->mov64(a0, s7); // or a0, s7, r0
goto block_66;
}
c->daddiu(a0, s7, 4); // daddiu a0, s7, 4
c->lwu(a1, 28, s2); // lwu a1, 28(s2)
c->lbu(a1, 1, a1); // lbu a1, 1(a1)
c->movz(a0, s7, a1); // movz a0, s7, a1
block_66:
bc = c->sgpr64(s7) == c->sgpr64(a0); // beq s7, a0, L151
c->mov64(a0, s7); // or a0, s7, r0
if (bc) {goto block_75;} // branch non-likely
c->addiu(a0, r0, 1); // addiu a0, r0, 1
c->sb(a0, 170, s1); // sb a0, 170(s1)
c->daddiu(a1, s1, 288); // daddiu a1, s1, 288
c->lwu(a0, 28, s2); // lwu a0, 28(s2)
c->lwu(a2, 28, s2); // lwu a2, 28(s2)
c->lbu(a2, 1, a2); // lbu a2, 1(a2)
c->dsll(a2, a2, 4); // dsll a2, a2, 4
c->daddu(a2, a0, a2); // daddu a2, a0, a2
c->addiu(a0, r0, 5); // addiu a0, r0, 5
c->daddiu(a3, a0, -4); // daddiu a3, a0, -4
c->mov64(a1, a1); // or a1, a1, r0
bc = ((s64)c->sgpr64(a3)) < 0; // bltz a3, L149
c->mov64(a2, a2); // or a2, a2, r0
if (bc) {goto block_69;} // branch non-likely
block_68:
// nop // sll r0, r0, 0
c->lq(t2, 0, a2); // lq t2, 0(a2)
// nop // sll r0, r0, 0
c->lq(a3, 16, a2); // lq a3, 16(a2)
c->daddiu(a0, a0, -4); // daddiu a0, a0, -4
c->lq(t0, 32, a2); // lq t0, 32(a2)
c->daddiu(a1, a1, 64); // daddiu a1, a1, 64
c->lq(t1, 48, a2); // lq t1, 48(a2)
c->daddiu(a2, a2, 64); // daddiu a2, a2, 64
c->sq(t2, -64, a1); // sq t2, -64(a1)
c->daddiu(t2, a0, -4); // daddiu t2, a0, -4
c->sq(a3, -48, a1); // sq a3, -48(a1)
// nop // sll r0, r0, 0
c->sq(t0, -32, a1); // sq t0, -32(a1)
bc = ((s64)c->sgpr64(t2)) >= 0; // bgez t2, L148
c->sq(t1, -16, a1); // sq t1, -16(a1)
if (bc) {goto block_68;} // branch non-likely
block_69:
bc = c->sgpr64(a0) == 0; // beq a0, r0, L150
c->lq(a3, 0, a2); // lq a3, 0(a2)
if (bc) {goto block_74;} // branch non-likely
c->daddiu(a2, a2, 16); // daddiu a2, a2, 16
c->daddiu(a1, a1, 16); // daddiu a1, a1, 16
c->daddiu(a0, a0, -1); // daddiu a0, a0, -1
c->sq(a3, -16, a1); // sq a3, -16(a1)
bc = c->sgpr64(a0) == 0; // beq a0, r0, L150
c->lq(a3, 0, a2); // lq a3, 0(a2)
if (bc) {goto block_74;} // branch non-likely
c->daddiu(a2, a2, 16); // daddiu a2, a2, 16
c->daddiu(a1, a1, 16); // daddiu a1, a1, 16
c->daddiu(a0, a0, -1); // daddiu a0, a0, -1
c->sq(a3, -16, a1); // sq a3, -16(a1)
bc = c->sgpr64(a0) == 0; // beq a0, r0, L150
c->lq(a3, 0, a2); // lq a3, 0(a2)
if (bc) {goto block_74;} // branch non-likely
c->daddiu(a2, a2, 16); // daddiu a2, a2, 16
c->daddiu(a1, a1, 16); // daddiu a1, a1, 16
c->daddiu(a0, a0, -1); // daddiu a0, a0, -1
c->sq(a3, -16, a1); // sq a3, -16(a1)
bc = c->sgpr64(a0) == 0; // beq a0, r0, L150
c->lq(a3, 0, a2); // lq a3, 0(a2)
if (bc) {goto block_74;} // branch non-likely
c->daddiu(a2, a2, 16); // daddiu a2, a2, 16
c->daddiu(a1, a1, 16); // daddiu a1, a1, 16
c->daddiu(a0, a0, -1); // daddiu a0, a0, -1
c->sq(a3, -16, a1); // sq a3, -16(a1)
block_74:
c->gprs[a0].du64[0] = 0; // or a0, r0, r0
c->daddiu(v1, v1, 5); // daddiu v1, v1, 5
c->mov64(a0, v1); // or a0, v1, r0
block_75:
c->lui(a0, 4096); // lui a0, 4096
c->daddiu(a1, v1, -1); // daddiu a1, v1, -1
c->dsll32(a1, a1, 16); // dsll32 a1, a1, 16
c->dsrl32(a1, a1, 16); // dsrl32 a1, a1, 16
c->or_(a0, a0, a1); // or a0, a0, a1
c->sd(a0, 0, s1); // sd a0, 0(s1)
c->sw(v1, 8, s1); // sw v1, 8(s1)
c->sw(r0, 12, s1); // sw r0, 12(s1)
c->dsll(v1, v1, 4); // dsll v1, v1, 4
c->daddu(a1, s3, v1); // daddu a1, s3, v1
c->mov64(v1, a1); // or v1, a1, r0
get_fake_spad_addr2(v1, cache.fake_scratchpad_data, 0, c);// lui v1, 28672
c->lwu(a2, 48, v1); // lwu a2, 48(v1)
c->load_symbol2(t9, cache.foreground_generic_merc_add_fragments);// lw t9, foreground-generic-merc-add-fragments(s7)
c->mov64(a0, s2); // or a0, s2, r0
call_addr = c->gprs[t9].du32[0]; // function call:
c->sll(v0, ra, 0); // sll v0, ra, 0
c->jalr(call_addr); // jalr ra, t9
c->mov64(s3, v0); // or s3, v0, r0
c->mov64(v1, s3); // or v1, s3, r0
block_76:
c->daddiu(s4, s4, 1); // daddiu s4, s4, 1
block_77:
c->lwu(v1, 52, s5); // lwu v1, 52(s5)
c->slt(v1, s4, v1); // slt v1, s4, v1
bc = c->sgpr64(v1) != 0; // bne v1, r0, L119
// nop // sll r0, r0, 0
if (bc) {goto block_1;} // branch non-likely
c->mov64(v1, s7); // or v1, s7, r0
c->mov64(v1, s7); // or v1, s7, r0
c->mov64(v0, s3); // or v0, s3, r0
c->ld(ra, 0, sp); // ld ra, 0(sp)
c->lq(gp, 96, sp); // lq gp, 96(sp)
c->lq(s5, 80, sp); // lq s5, 80(sp)
c->lq(s4, 64, sp); // lq s4, 64(sp)
c->lq(s3, 48, sp); // lq s3, 48(sp)
c->lq(s2, 32, sp); // lq s2, 32(sp)
c->lq(s1, 16, sp); // lq s1, 16(sp)
//jr ra // jr ra
c->daddiu(sp, sp, 112); // daddiu sp, sp, 112
goto end_of_function; // return
// nop // sll r0, r0, 0
// nop // sll r0, r0, 0
// nop // sll r0, r0, 0
end_of_function:
return c->gprs[v0].du64[0];
}
void link() {
cache.fake_scratchpad_data = intern_from_c("*fake-scratchpad-data*").c();
cache.foreground = intern_from_c("*foreground*").c();
cache.merc_global_stats = intern_from_c("*merc-global-stats*").c();
cache.foreground_generic_merc_add_fragments = intern_from_c("foreground-generic-merc-add-fragments").c();
cache.foreground_generic_merc_death = intern_from_c("foreground-generic-merc-death").c();
gLinkedFunctionTable.reg("foreground-generic-merc", execute, 256);
}
} // namespace foreground_generic_merc
} // namespace Mips2C
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
+9
View File
@@ -348,6 +348,7 @@ struct ExecutionContext {
u64 args[8] = {gprs[a0].du64[0], gprs[a1].du64[0], gprs[a2].du64[0], gprs[a3].du64[0],
gprs[t0].du64[0], gprs[t1].du64[0], gprs[t2].du64[0], gprs[t3].du64[0]};
#ifdef __linux__
ASSERT(addr);
gprs[v0].du64[0] = _call_goal8_asm_linux(g_ee_main_mem + addr, args, 0, gprs[s6].du64[0],
gprs[s7].du64[0], g_ee_main_mem);
#elif _WIN32
@@ -703,6 +704,14 @@ struct ExecutionContext {
}
}
void psubh(int dest, int rs, int rt) {
auto s = gpr_src(rs);
auto t = gpr_src(rt);
for (int i = 0; i < 8; i++) {
gprs[dest].du16[i] = s.du16[i] - t.du16[i];
}
}
void pminh(int dest, int rs, int rt) {
auto s = gpr_src(rs);
auto t = gpr_src(rt);
+33 -2
View File
@@ -220,6 +220,24 @@ namespace method_53_squid { extern void link(); }
namespace init_vortex_regs { extern void link(); }
namespace draw_large_polygon_vortex { extern void link(); }
namespace render_vortex_quad { extern void link(); }
namespace foreground_generic_merc { extern void link(); }
namespace generic_merc_init_asm { extern void link(); }
namespace mercneric_convert { extern void link(); }
namespace high_speed_reject { extern void link(); }
namespace generic_translucent { extern void link(); }
namespace generic_merc_query { extern void link(); }
namespace generic_merc_death { extern void link(); }
namespace generic_merc_execute_asm { extern void link(); }
namespace generic_merc_do_chain { extern void link(); }
namespace generic_light_proc { extern void link(); }
namespace generic_envmap_proc { extern void link(); }
namespace generic_prepare_dma_double { extern void link(); }
namespace generic_prepare_dma_single { extern void link(); }
namespace generic_warp_source_proc { extern void link(); }
namespace generic_warp_dest_proc { extern void link(); }
namespace generic_warp_dest { extern void link(); }
namespace generic_warp_envmap_dest { extern void link(); }
namespace generic_no_light_proc { extern void link(); }
}
// clang-format on
@@ -350,7 +368,9 @@ PerGameVersion<std::unordered_map<std::string, std::vector<void (*)()>>> gMips2C
jak2::method_10_collide_cache_prim::link, jak2::method_17_collide_cache::link,
jak2::method_9_collide_puss_work::link, jak2::method_10_collide_puss_work::link}},
{"bones", {jak2::bones_mtx_calc::link}},
{"foreground", {jak2::foreground_check_longest_edge_asm::link, jak2::foreground_merc::link}},
{"foreground",
{jak2::foreground_check_longest_edge_asm::link, jak2::foreground_merc::link,
jak2::foreground_generic_merc::link}},
{"lights",
{jak2::add_light_sphere_to_light_group::link, jak2::light_hash_add_items::link,
jak2::light_hash_count_items::link, jak2::light_hash_get_bucket_index::link}},
@@ -369,7 +389,18 @@ PerGameVersion<std::unordered_map<std::string, std::vector<void (*)()>>> gMips2C
{"squid-setup", {jak2::method_53_squid::link}},
{"vortex",
{jak2::init_vortex_regs::link, jak2::draw_large_polygon_vortex::link,
jak2::render_vortex_quad::link}}}};
jak2::render_vortex_quad::link}},
{"generic-merc",
{jak2::generic_merc_init_asm::link, jak2::mercneric_convert::link,
jak2::high_speed_reject::link, jak2::generic_translucent::link,
jak2::generic_merc_query::link, jak2::generic_merc_death::link,
jak2::generic_merc_execute_asm::link, jak2::generic_merc_do_chain::link}},
{"generic-effect",
{jak2::generic_light_proc::link, jak2::generic_envmap_proc::link,
jak2::generic_prepare_dma_double::link, jak2::generic_prepare_dma_single::link,
jak2::generic_warp_source_proc::link, jak2::generic_warp_dest_proc::link,
jak2::generic_warp_dest::link, jak2::generic_warp_envmap_dest::link,
jak2::generic_no_light_proc::link}}}};
void LinkedFunctionTable::reg(const std::string& name, u64 (*exec)(void*), u32 stack_size) {
const auto& it = m_executes.insert({name, {exec, Ptr<u8>()}});
+2 -1
View File
@@ -1363,7 +1363,8 @@
;; check if this effect uses "ripple"
(when (logtest? (-> geom effect effect-idx effect-bits) 4)
(when (-> arg0 ripple)
(if *ripple-force-generic*
;; fall back to generic if there's a ripple query to respond to.
(if (or *ripple-force-generic* (-> arg0 ripple query))
(set! pc-force-mercneric #t)
(set! pc-merc-vtx-update #t)
)
+1 -1
View File
@@ -1387,7 +1387,7 @@
(bones-init gp-0)
(bones-mtx-calc-execute)
;; generic-merc/shadow have VU0/CPU parts that need bones, run them here.
;;(generic-merc-execute-all gp-0)
(generic-merc-execute-all gp-0)
;;(shadow-execute-all gp-0)
)
(lightning-draw-all)
+114 -17
View File
@@ -571,13 +571,87 @@
(defun foreground-shadow ((arg0 draw-control) (arg1 (inline-array pris-mtx)) (arg2 pointer))
arg2
)
;; todo foreground-generic-merc-death
;; todo foreground-generic-merc-add-fragments
;; todo foreground-generic-merc
(defun foreground-generic-merc ((arg0 draw-control) (arg1 pointer) (arg2 int))
(defun foreground-generic-merc-death ((arg0 draw-control) (arg1 generic-merc-ctrl))
"Modify a generic-merc-ctrl to set up merc-death effect."
;; possibly disable drawing if requested
(when (and (>= (the-as int (- (-> arg0 death-timer-org) (-> arg0 death-timer)))
(the-as int (-> arg0 death-draw-overlap))
)
(!= (-> arg0 death-draw-overlap) 255)
)
(set! (-> arg1 header display-triangles) (the-as uint 0))
0
)
;; update the vertices that we're querying.
(when (not (paused?))
(let ((v1-6 (+ (-> arg0 death-vertex-skip) (rand-vu-int-count (the-as int (-> arg0 death-vertex-skip))))))
(set! (-> arg1 header death-vertex-skip) v1-6)
(set! (-> arg1 header death-effect) (-> arg0 death-effect))
(set! (-> arg1 header death-start-vertex)
(/ (* v1-6 (- (-> arg0 death-timer-org) (-> arg0 death-timer))) (-> arg0 death-timer-org))
)
)
)
(none)
)
(defun foreground-generic-merc-add-fragments ((arg0 merc-effect) (arg1 pointer) (arg2 mercneric-chain))
"Add fragments from a merc-effect to the generic chain."
(let ((v1-0 (-> arg0 frag-geo))
(a3-0 (the-as structure (-> arg0 frag-ctrl)))
(a0-1 (-> arg0 frag-count))
)
;; loop over fragments, adding matrix refs.
(dotimes (t0-0 (the-as int a0-1))
(let ((t1-2 (+ (* (-> (the-as merc-fragment-control a3-0) mat-xfer-count) 2) 4))
(t2-0 (-> v1-0 header mm-quadword-size))
)
(set! (-> (the-as dma-packet arg1) dma)
(new 'static 'dma-tag :id (dma-tag-id ref) :addr (the-as int v1-0) :qwc t2-0)
)
(set! (-> (the-as dma-packet arg1) vif0) (new 'static 'vif-tag))
(set! (-> (the-as dma-packet arg1) vif1) (new 'static 'vif-tag))
(when (nonzero? t0-0)
(set! (-> (the-as (pointer int32) (-> arg2 next)) 0) (the-as int arg1))
(set! (-> arg2 next) (the-as uint (&+ arg1 12)))
)
(let ((a1-1 (the-as object (&+ arg1 16))))
(dotimes (t3-6 (the-as int (-> (the-as merc-fragment-control a3-0) mat-xfer-count)))
(let ((t5-4
(-> (scratchpad-object foreground-work)
regs
mtxs
(-> (the-as merc-fragment-control a3-0) mat-dest-data t3-6 matrix-number)
)
)
)
(set! (-> (the-as dma-packet a1-1) dma)
(new 'static 'dma-tag :qwc #x7 :id (dma-tag-id ref) :addr (the-as int t5-4))
)
)
(set! (-> (the-as dma-packet a1-1) vif0) (new 'static 'vif-tag))
(set! (-> (the-as dma-packet a1-1) vif1) (new 'static 'vif-tag))
(set! a1-1 (&+ (the-as pointer a1-1) 16))
)
(set! (-> (the-as dma-packet a1-1) dma) (new 'static 'dma-tag :id (dma-tag-id end)))
(set! (-> (the-as dma-packet a1-1) vif0) (new 'static 'vif-tag))
(set! (-> (the-as dma-packet a1-1) vif1) (new 'static 'vif-tag))
(set! arg1 (&+ (the-as pointer a1-1) 16))
)
(set! a3-0 (&+ a3-0 t1-2))
(set! v1-0 (the-as merc-fragment (+ (the-as uint v1-0) (* t2-0 16))))
)
)
)
arg1
)
(def-mips2c foreground-generic-merc (function draw-control pointer int pointer))
(def-mips2c foreground-merc (function draw-control (inline-array pris-mtx) pointer int int object pointer))
(define-extern foreground-emerc (function draw-control (inline-array pris-mtx) pointer object int int pointer))
@@ -605,6 +679,7 @@
;;(.sll v1-6 v1-5 7)
(set! v1-6 (shl v1-5 7))
)
(let ((a0-1 (scratchpad-object foreground-work)))
;;(.addu t0-0 arg2 v1-6)
(set! t0-0 (&+ arg2 v1-6))
@@ -681,7 +756,6 @@
(dotimes (i 128) (set! (-> transferred-matrices i) 0))
(let ((merc-ctrl (-> dc lod-set lod (-> dc cur-lod) geo)))
;; loop to: grab matrices and populate flags
(dotimes (effect-idx (-> merc-ctrl header effect-count))
@@ -794,9 +868,11 @@
;; look for uses.
(dotimes (i (-> mctrl header effect-count))
;;(format 0 "effect ~d, texture ~d~%" i (-> mctrl effect i texture-index))
(set! (-> use-flags (-> mctrl effect i texture-index)) 1)
(when (logtest? (-> (-> dc lod-set lod (-> dc cur-lod) geo) effect i effect-bits) (effect-bits ripple texscroll))
(set! has-ripple-or-texscroll #t)
(when (= 0 (-> *foreground* merc-bucket-info effect i merc-path))
(set! (-> use-flags (-> mctrl effect i texture-index)) 1)
(when (logtest? (-> (-> dc lod-set lod (-> dc cur-lod) geo) effect i effect-bits) (effect-bits ripple texscroll))
(set! has-ripple-or-texscroll #t)
)
)
)
@@ -1190,19 +1266,40 @@
)
)
;; massive hack use merc for everything..
;; reassign for PC. For the most part, we reassign everything to merc. The exceptions are:
;; - "warp" effect is on: this special effect isn't supported by PC merc
;; - "death" effect is on: this requires the renderer to return transformed vertices.
;; - "force-mercneric" is on: this is used rarely, and on stuff that doesn't seem to have
;; - ripple query?
(when (or (nonzero? (-> (scratchpad-object foreground-work) regs mercneric-used))
(nonzero? (-> (scratchpad-object foreground-work) regs emerc-used))
)
(set! (-> (scratchpad-object foreground-work) regs mercneric-used) 0)
(set! (-> (scratchpad-object foreground-work) regs emerc-used) 0)
(set! (-> (scratchpad-object foreground-work) regs merc-used) 1)
(dotimes (effect-idx (the-as int (-> geo header effect-count)))
(set! (-> bucket-info effect effect-idx merc-path) 0)
(when (logtest? (-> geo effect effect-idx effect-usage) 1)
(set! (-> bucket-info effect effect-idx ignore-alpha) 1)
)
;; technically we should use generic for ripple query, but the only user is dark eco,
;; which doesn't actually do anything with the result of the query.
(when #t ;;(not (and (-> dc ripple) (-> dc ripple query)))
(set! (-> (scratchpad-object foreground-work) regs mercneric-used) 0)
(set! (-> (scratchpad-object foreground-work) regs emerc-used) 0)
(set! (-> (scratchpad-object foreground-work) regs merc-used) 1)
(dotimes (effect-idx (the-as int (-> geo header effect-count)))
(cond
((or (logtest? (-> geo effect effect-idx effect-bits) (effect-bits cross-fade))
(logtest? (-> geo effect effect-idx effect-bits) (effect-bits force-mercneric))
(nonzero? (-> dc death-timer))
)
;; (format *stdcon* "[fg] ~S to generic~%" (-> dc process name))
(set! (-> bucket-info effect effect-idx merc-path) 2)
(set! (-> (scratchpad-object foreground-work) regs mercneric-used) 1)
)
(else
(set! (-> bucket-info effect effect-idx merc-path) 0)
)
)
(when (logtest? (-> geo effect effect-idx effect-usage) 1)
(set! (-> bucket-info effect effect-idx ignore-alpha) 1)
)
)
)
)
@@ -7,9 +7,246 @@
;; DECOMP BEGINS
;; definition for symbol *target-lock*, type object
(define *target-lock* (the-as object 0))
;; definition for symbol *generic-consts*, type generic-consts
(define *generic-consts*
(new 'static 'generic-consts
:dma-header (new 'static 'dma-packet
:dma (new 'static 'dma-tag :id (dma-tag-id cnt))
:vif0 (new 'static 'vif-tag :imm #x404 :cmd (vif-cmd stcycl))
:vif1 (new 'static 'vif-tag :cmd (vif-cmd unpack-v4-32))
)
:vif-header (new 'static 'array uint32 4 #x1000404 #x1000404 #x1000404 #x6c000000)
:dma-ref-vtxs (new 'static 'dma-packet :dma (new 'static 'dma-tag :id (dma-tag-id ref)))
:dma-cnt-call (new 'static 'dma-packet :dma (new 'static 'dma-tag :id (dma-tag-id cnt)))
:matrix (new 'static 'matrix :vector (new 'static 'inline-array vector 4
(new 'static 'vector :x 1.0)
(new 'static 'vector :y 1.0)
(new 'static 'vector :z 1.0)
(new 'static 'vector :w 1.0)
)
)
:base-strgif (new 'static 'generic-gif-tag
:fan-prim (new 'static 'gif-tag-prim
:pre #x1
:prim (new 'static 'gs-prim :prim (gs-prim-type tri-fan) :iip #x1 :tme #x1 :fge #x1 :abe #x1)
:nreg #x3
)
:str-prim (new 'static 'gif-tag-prim
:pre #x1
:prim (new 'static 'gs-prim :prim (gs-prim-type tri-strip) :iip #x1 :tme #x1 :fge #x1 :abe #x1)
:nreg #x3
)
:regs (new 'static 'gif-tag-regs-32 :regs0 (gif-reg-id st) :regs1 (gif-reg-id rgbaq) :regs2 (gif-reg-id xyzf2))
)
:alpha-opaque (new 'static 'gs-adcmd :cmds (gs-reg64 alpha-1))
:alpha-translucent (new 'static 'gs-adcmd :cmds (gs-reg64 alpha-1) :x #x44)
:ztest-normal (new 'static 'gs-adcmd :cmds (gs-reg64 test-1) :x #x5026b)
:ztest-opaque (new 'static 'gs-adcmd :cmds (gs-reg64 test-1) :x #x5000a)
:adcmd-offsets (new 'static 'array uint8 16 #x0 #x20 #x20 #x20 #x0 #x30 #x30 #x30 #x0 #x30 #x30 #x30 #x0 #x30 #x30 #x30)
:stcycle-tag #x1000103
:unpack-vtx-tag #x68000000
:unpack-clr-tag #x6e004000
:unpack-tex-tag #x65000000
:mscal-tag #x14000006
:reset-cycle-tag #x1000404
:dma-tag-cnt #x10000000
:envmap (new 'static 'generic-envmap-consts
:consts (new 'static 'vector :x 1.0 :z 0.5 :w 0.5)
:strgif (new 'static 'generic-gif-tag
:fan-prim (new 'static 'gif-tag-prim
:pre #x1
:prim (new 'static 'gs-prim :prim (gs-prim-type tri-fan) :iip #x1 :tme #x1 :abe #x1)
:nreg #x3
)
:str-prim (new 'static 'gif-tag-prim
:pre #x1
:prim (new 'static 'gs-prim :prim (gs-prim-type tri-strip) :iip #x1 :tme #x1 :abe #x1)
:nreg #x3
)
:regs (new 'static 'gif-tag-regs-32 :regs0 (gif-reg-id st) :regs1 (gif-reg-id rgbaq) :regs2 (gif-reg-id xyzf2))
)
:colors (new 'static 'vector4w :x -2139062144 :y -2139062144 :z -2139062144 :w -2139062144)
)
:light-consts (new 'static 'vector :x 255.0 :y 8388608.0)
)
)
(define-extern *default-envmap-shader* adgif-shader)
(defun generic-work-init ((arg0 generic-bucket-state))
(quad-copy!
(the-as pointer (-> (scratchpad-object generic-work) fx-buf work))
(the-as pointer *generic-consts*)
27
)
(set! (-> (scratchpad-object generic-work) saves gifbuf-adr) (-> arg0 gifbuf-adr))
(set! (-> (scratchpad-object generic-work) saves inbuf-adr) (-> arg0 inbuf-adr))
(set! (-> (scratchpad-object generic-work) saves cur-outbuf)
(the-as uint (-> (scratchpad-object generic-work) fx-buf))
)
(let* ((v1-6 *default-envmap-shader*)
(a0-9 (-> (scratchpad-object generic-work) fx-buf work consts envmap shader))
(a1-2 (-> v1-6 quad 0 quad))
(a2-1 (-> v1-6 quad 1 quad))
(a3-0 (-> v1-6 quad 2 quad))
(t0-0 (-> v1-6 quad 3 quad))
(v0-1 (-> v1-6 quad 4 quad))
)
(set! (-> a0-9 quad 0 quad) a1-2)
(set! (-> a0-9 quad 1 quad) a2-1)
(set! (-> a0-9 quad 2 quad) a3-0)
(set! (-> a0-9 quad 3 quad) t0-0)
(set! (-> a0-9 quad 4 quad) v0-1)
)
(none)
)
(defun generic-upload-vu0 ()
(none)
)
(defun generic-initialize-without-sync ((arg0 matrix) (arg1 vu-lights))
;(upload-vu0-program generic-vu0-block (the-as pointer #x70000054))
(let ((a2-0 (-> (scratchpad-object generic-work) fx-buf work consts matrix))
(v1-1 (-> arg0 quad 0))
(a0-3 (-> arg0 quad 1))
(a1-2 (-> arg0 quad 2))
(a3-0 (-> arg0 trans quad))
)
(set! (-> a2-0 quad 0) v1-1)
(set! (-> a2-0 quad 1) a0-3)
(set! (-> a2-0 quad 2) a1-2)
(set! (-> a2-0 trans quad) a3-0)
)
(if arg1
(quad-copy! (the-as pointer (-> (scratchpad-object generic-work) fx-buf work lights)) (the-as pointer arg1) 7)
)
0
(none)
)
(defun generic-initialize ((arg0 generic-bucket-state) (arg1 matrix) (arg2 vu-lights))
(generic-work-init arg0)
(generic-upload-vu0)
(let ((a2-1 (-> (scratchpad-object generic-work) fx-buf work consts matrix))
(v1-1 (-> arg1 quad 0))
(a0-2 (-> arg1 quad 1))
(a1-1 (-> arg1 quad 2))
(a3-0 (-> arg1 trans quad))
)
(set! (-> a2-1 quad 0) v1-1)
(set! (-> a2-1 quad 1) a0-2)
(set! (-> a2-1 quad 2) a1-1)
(set! (-> a2-1 trans quad) a3-0)
)
(if arg2
(quad-copy! (the-as pointer (-> (scratchpad-object generic-work) fx-buf work lights)) (the-as pointer arg2) 7)
)
0
(none)
)
(defun generic-wrapup ((arg0 generic-bucket-state))
(set! (-> arg0 gifbuf-adr) (-> (scratchpad-object generic-work) saves gifbuf-adr))
(set! (-> arg0 inbuf-adr) (-> (scratchpad-object generic-work) saves inbuf-adr))
(none)
)
(defun upload-vu0-program ((func vu-function) (wait-ptr pointer))
"Upload and block until done.
Generating the DMA is highly optimized."
(none)
)
;; definition for function generic-dma-from-spr
;; ERROR: function was not converted to expressions. Cannot decompile.
;; definition for function generic-light-proc
;; INFO: function output is handled by mips2c
(def-mips2c generic-light-proc function)
;; definition for function generic-envmap-proc
;; INFO: function output is handled by mips2c
(def-mips2c generic-envmap-proc function)
;; definition for function generic-prepare-dma-double
;; INFO: function output is handled by mips2c
(def-mips2c generic-prepare-dma-double function)
;; definition for function generic-prepare-dma-single
;; INFO: function output is handled by mips2c
(def-mips2c generic-prepare-dma-single function)
;; definition for function generic-envmap-dproc
;; ERROR: function has no type analysis. Cannot decompile.
;; definition for function generic-interp-dproc
;; ERROR: function was not converted to expressions. Cannot decompile.
;; definition for function generic-no-light-proc
;; ERROR: function has no type analysis. Cannot decompile.
;; definition for function generic-no-light-dproc-only
;; ERROR: function has no type analysis. Cannot decompile.
;; definition for function generic-no-light-dproc
;; ERROR: function has no type analysis. Cannot decompile.
;; definition for function generic-no-light+envmap
;; ERROR: function was not converted to expressions. Cannot decompile.
;; definition for function generic-no-light
;; ERROR: function was not converted to expressions. Cannot decompile.
;; definition for function generic-envmap-only-proc
;; ERROR: function was not converted to expressions. Cannot decompile.
;; definition for function generic-light
;; ERROR: function was not converted to expressions. Cannot decompile.
;; definition for function generic-copy-vtx-dclr-dtex
;; ERROR: function has no type analysis. Cannot decompile.
;; definition for function generic-none
;; ERROR: function has no type analysis. Cannot decompile.
;; definition for function generic-none-dma-wait
;; ERROR: function was not converted to expressions. Cannot decompile.
;; definition for symbol *warp-data*, type object
(define *warp-data* (the-as object (malloc 'global 1024)))
;; definition for function generic-warp-source-proc
;; INFO: function output is handled by mips2c
(def-mips2c generic-warp-source-proc (function none))
;; definition for function generic-warp-source
;; ERROR: Unsupported inline assembly instruction kind - [lui at, 28672]
(defun generic-warp-source ((arg0 gsf-buffer))
(set! (-> (scratchpad-object generic-work) saves gsf-buf) arg0)
(generic-warp-source-proc)
(none)
)
;; definition for function generic-warp-dest-proc
;; INFO: function output is handled by mips2c
(def-mips2c generic-warp-dest-proc function)
;; definition for function generic-warp-dest
;; INFO: function output is handled by mips2c
(def-mips2c generic-warp-dest function)
;; definition for function generic-warp-envmap-dest
;; INFO: function output is handled by mips2c
(def-mips2c generic-warp-envmap-dest function)
;; definition for function generic-debug-light-proc
;; ERROR: function was not converted to expressions. Cannot decompile.
;; definition (debug) for function generic-post-debug
;; ERROR: function has no type analysis. Cannot decompile.
@@ -7,3 +7,129 @@
;; DECOMP BEGINS
(define mercneric-vu0-block (new 'static 'vu-function #|:length #xbe :origin #x118 :qlength 95|#))
(deftype invinitdata (structure)
((count uint8 :offset-assert 0)
(init-data uint8 :offset-assert 1)
(init-addr uint16 :offset-assert 2)
)
:pack-me
:method-count-assert 9
:size-assert #x4
:flag-assert #x900000004
)
(define *inv-init-table* (new 'static 'inline-array invinitdata 8
(new 'static 'invinitdata :count #x48 :init-addr #x1)
(new 'static 'invinitdata :count #x43 :init-data #xc :init-addr #x11)
(new 'static 'invinitdata :count #x3d :init-data #x18 :init-addr #x21)
(new 'static 'invinitdata :count #x38 :init-data #x22 :init-addr #xe0)
(new 'static 'invinitdata :count #x38 :init-data #x24 :init-addr #xe1)
(new 'static 'invinitdata :count #x33 :init-data #x30 :init-addr #xf1)
(new 'static 'invinitdata :count #x2e :init-data #x3a :init-addr #x190)
(new 'static 'invinitdata :count #x2d :init-data #x3c :init-addr #x191)
)
)
;; definition for function generic-merc-init-asm
;; INFO: function output is handled by mips2c
(def-mips2c generic-merc-init-asm (function none))
;; definition for function mercneric-matrix-asm
;; ERROR: function was not converted to expressions. Cannot decompile.
;; definition for function mercneric-shader-asm
;; ERROR: function was not converted to expressions. Cannot decompile.
;; definition for function mercneric-bittable-asm
;; ERROR: function has no type analysis. Cannot decompile.
;; definition for function mercneric-convert
;; INFO: function output is handled by mips2c
(def-mips2c mercneric-convert function)
;; definition for function high-speed-reject
;; INFO: function output is handled by mips2c
(def-mips2c high-speed-reject function)
;; definition for function generic-translucent
;; INFO: function output is handled by mips2c
(def-mips2c generic-translucent (function gsf-buffer none))
;; definition for function generic-merc-query
;; INFO: function output is handled by mips2c
(def-mips2c generic-merc-query function)
;; definition for function generic-merc-death
;; INFO: function output is handled by mips2c
(def-mips2c generic-merc-death function)
;; definition for function generic-merc-execute-asm
;; INFO: function output is handled by mips2c
(def-mips2c generic-merc-execute-asm function)
;; definition for function generic-merc-do-chain
;; INFO: function output is handled by mips2c
(def-mips2c generic-merc-do-chain (function mercneric-chain dma-buffer pointer))
(defun generic-merc-execute-all ((arg0 dma-buffer))
"Run EE processing on all generic merc chains."
(let ((s4-0 (-> *foreground* foreground-grid))
(gp-0 (-> *display* frames (-> *display* on-screen) global-buf base))
)
(with-profiler 'generic-merc *profile-generic-merc-color*
;; reset profiling
(reset! (-> *perf-stats* data (perf-stat-bucket mercneric)))
(set! (-> (scratchpad-object generic-work) saves to-vu0-waits) (the-as uint 0))
(set! (-> (scratchpad-object generic-work) saves to-spr-waits) (the-as uint 0))
(set! (-> (scratchpad-object generic-work) saves from-spr-waits) (the-as uint 0))
(flush-cache 0)
;; init generic
(generic-initialize-without-sync (-> *math-camera* perspective) *default-lights*)
(generic-merc-init-asm)
(set! (-> (scratchpad-object generic-work) in-buf merc shadow write-limit) (the-as int (&+ (-> arg0 end) -262144)))
;; loop over grid of chains (levels x textures) and do the chain.
(dotimes (s3-1 7)
(dotimes (s2-1 7)
(generic-merc-do-chain (-> s4-0 level-buckets s3-1 data s2-1 mercneric) arg0)
)
)
;; do separate warp chain
(generic-merc-do-chain (-> s4-0 warp-chain) arg0)
;; finish profiling
(read! (-> *perf-stats* data (perf-stat-bucket mercneric)))
(update-wait-stats
(-> *perf-stats* data 38)
(-> (scratchpad-object generic-work) saves to-vu0-waits)
(-> (scratchpad-object generic-work) saves to-spr-waits)
(-> (scratchpad-object generic-work) saves from-spr-waits)
)
)
;; update dma memory usage stats.
(let ((v1-66 *dma-mem-usage*))
(when (nonzero? v1-66)
(set! (-> v1-66 length) (max 90 (-> v1-66 length)))
(set! (-> v1-66 data 89 name) "pris-generic")
(+! (-> v1-66 data 89 count) 1)
(+! (-> v1-66 data 89 used)
(&- (-> *display* frames (-> *display* on-screen) global-buf base) (the-as uint gp-0))
)
(set! (-> v1-66 data 89 total) (-> v1-66 data 89 used))
)
)
)
(none)
)
+23 -23
View File
@@ -114,27 +114,28 @@
(none)
)
; (defun generic-vu1-init-buf-special ((arg0 bucket-id) (arg1 gs-zbuf))
; (let ((s5-0 (-> *display* frames (-> *display* on-screen) bucket-group arg0)))
; (when (!= s5-0 (-> s5-0 last))
; (let* ((s4-0 (-> *display* frames (-> *display* on-screen) global-buf))
; (s3-1 (-> s4-0 base))
; )
; (fx-copy-buf s4-0)
; (generic-init-buf s4-0 arg1)
; (let ((v1-12 (-> s4-0 base)))
; (set! (-> (the-as (pointer uint64) v1-12)) (logior #x20000000 (shr (shl (-> s5-0 next) 33) 1)))
; (s.w! (+ v1-12 8) 0)
; (s.w! (+ v1-12 12) 0)
; (set! (-> s4-0 base) (&+ v1-12 16))
; )
; (set! (-> s5-0 next) (the-as uint s3-1))
; )
; )
; )
; 0
; (none)
; )
(defun generic-vu1-init-buf-special ((arg0 bucket-id) (arg1 gs-zbuf))
(let ((s5-0 (-> *display* frames (-> *display* on-screen) bucket-group arg0)))
(when (!= s5-0 (-> s5-0 last))
(let* ((s4-0 (-> *display* frames (-> *display* on-screen) global-buf))
(s3-1 (-> s4-0 base))
)
;; this is like the normal one, but runs fx-copy-buf first, copying the framebuffer.
;(fx-copy-buf s4-0)
(generic-init-buf s4-0 arg1)
(let ((v1-12 (the-as dma-packet (-> s4-0 base))))
(set! (-> v1-12 dma) (new 'static 'dma-tag :id (dma-tag-id next) :addr (-> s5-0 next)))
(set! (-> v1-12 vif0) (new 'static 'vif-tag))
(set! (-> v1-12 vif1) (new 'static 'vif-tag))
(set! (-> s4-0 base) (the-as pointer (&+ v1-12 16)))
)
(set! (-> s5-0 next) (the-as uint s3-1))
)
)
)
0
(none)
)
;; definition for function generic-vu1-init-buffers
(defun generic-vu1-init-buffers ()
@@ -186,8 +187,7 @@
)
(generic-vu1-init-buf (bucket-id effects) gp-0)
)
;; no warp yet
;(generic-vu1-init-buf-special (bucket-id gmerc-warp) s5-0)
(generic-vu1-init-buf-special (bucket-id gmerc-warp) s5-0)
)
)
(none)
@@ -218,7 +218,8 @@
;; a pointer to an adgif-shader, stored in bits 8-32. This allows them to fit into
;; an adgif shader easily.
(deftype shader-ptr (uint32)
((shader uint32 :offset 8 :size 24)
((first-8 uint8 :offset 0 :size 8) ;; added
(shader uint32 :offset 8 :size 24)
)
:method-count-assert 9
:size-assert #x4
+16
View File
@@ -7,3 +7,19 @@
;; DECOMP BEGINS
(define *warp-shader* (new 'static 'adgif-shader
:reg-0 #x6
:reg-1 #x14
:reg-3 #x8
:reg-4-u32 (gs-reg32 alpha-1)
:tex0 (new 'static 'gs-tex0 :tbp0 #x4c0 :tbw #x8 :tw #x9 :th #x9 :tcc #x1)
:tex1 (new 'static 'gs-tex1 :mmag #x1)
:clamp (new 'static 'gs-clamp
:wms (gs-tex-wrap-mode region-clamp)
:wmt (gs-tex-wrap-mode region-clamp)
:maxu #x1ff
:maxv #x19f
)
:next (new 'static 'shader-ptr :first-8 #x34)
)
)
+13 -15
View File
@@ -188,8 +188,7 @@
(not (-> *setting-control* user-current pilot-exit))
)
(('bubbler)
;; TODO warp effect
(and ;; (handle->process (-> self warp-handle))
(and (handle->process (-> self warp-handle))
(or (and (-> self next-state) (= (-> self next-state name) 'idle)) (not (under-warp-check self)))
)
)
@@ -230,19 +229,18 @@
((-> arg3 param 1)
(set-under-fog-interp! 1.0)
(when (not (handle->process (-> self warp-handle)))
;; TODO warp effect
;; (let ((s2-0 (camera-matrix))
;; (s3-0 (new 'stack-no-clear 'vector))
;; (gp-0 (new 'stack-no-clear 'vector))
;; (s5-0 (new 'stack-no-clear 'quaternion))
;; )
;; (set! (-> gp-0 quad) (-> (camera-pos) quad))
;; (vector-normalize-copy! s3-0 (-> s2-0 vector 2) 1.0)
;; (matrix->quaternion s5-0 s2-0)
;; (set! (-> self warp-handle)
;; (ppointer->handle (process-spawn under-warp gp-0 s5-0 (-> self level) :to *display-pool*))
;; )
;; )
(let ((s2-0 (camera-matrix))
(s3-0 (new 'stack-no-clear 'vector))
(gp-0 (new 'stack-no-clear 'vector))
(s5-0 (new 'stack-no-clear 'quaternion))
)
(set! (-> gp-0 quad) (-> (camera-pos) quad))
(vector-normalize-copy! s3-0 (-> s2-0 vector 2) 1.0)
(matrix->quaternion s5-0 s2-0)
(set! (-> self warp-handle)
(ppointer->handle (process-spawn under-warp gp-0 s5-0 (-> self level) :to *display-pool*))
)
)
(set! v0-0 (sound-play "mech-under-amb"))
(set! (-> self ambient-sound-id) (the-as sound-id v0-0))
v0-0
+2 -1
View File
@@ -330,7 +330,8 @@
;; definition of type shader-ptr
(deftype shader-ptr (uint32)
((shader uint32 :offset 8 :size 24)
((first-8 uint8 :offset 0 :size 8)
(shader uint32 :offset 8 :size 24)
)
:method-count-assert 9
:size-assert #x4