diff --git a/common/dma/gs.h b/common/dma/gs.h index 75a2fd1cdd..c02698dbdc 100644 --- a/common/dma/gs.h +++ b/common/dma/gs.h @@ -149,6 +149,15 @@ struct GsZbuf { u64 data; }; +struct GsScissor { + GsScissor(u64 val) : data(val) {} + u32 x0() const { return data & 0b11111111111; } + u32 x1() const { return (data >> 16) & 0b11111111111; } + u32 y0() const { return (data >> 32) & 0b11111111111; } + u32 y1() const { return (data >> 48) & 0b11111111111; } + u64 data; +}; + struct GsTest { GsTest() = default; GsTest(u64 val) : data(val) {} diff --git a/decompiler/config/all-types.gc b/decompiler/config/all-types.gc index 78b0f562fd..83201160d1 100644 --- a/decompiler/config/all-types.gc +++ b/decompiler/config/all-types.gc @@ -535,7 +535,7 @@ (pris-tex1 51) (bucket-52 52) (bucket-53 53) - (bucket-54 54) ;; eye::update-eyes + (merc-eyes 54) ;; eye::update-eyes ;; merc1 52 ;; generic1 53 @@ -5109,12 +5109,13 @@ (deftype adgif-shader (structure) ((quad qword 5 :score -100 :inline :offset 0) (prims gs-reg64 10 :score -100 :offset 0) - (tex0 gs-tex0 :offset 0) - (tex1 gs-tex1 :offset 16) - (miptbp1 gs-miptbp :offset 32) - (clamp gs-clamp :offset 48) + (tex0 gs-tex0 :offset 0) ;; prims 1 + (tex1 gs-tex1 :offset 16) ;; prims 3 + (miptbp1 gs-miptbp :offset 32) ;; prims 5 + (clamp gs-clamp :offset 48) ;; prims 7 (clamp-reg gs-reg64 :offset 56) - (alpha gs-miptbp :offset 64) + (alpha gs-alpha :offset 64) ;; prims 9 + (alpha-as-miptb2 gs-miptbp :offset 64) (link-test link-test-flags :offset 8) (texture-id texture-id :offset 24) (next shader-ptr :offset 40) @@ -7945,9 +7946,10 @@ :flag-assert #xd00000020 ) +(declare-type merc-eye-anim-block structure) (deftype art-joint-anim (art-element) ;; figured out manually from custom inspect. - ((_unknown (pointer int16) :offset 4) ;; no clue. used in mem-usage and merc-eye-anim + ((eye-anim-data merc-eye-anim-block :offset 4) ;; no clue. used in mem-usage and merc-eye-anim (speed float :offset 20) (artist-base float :offset 24) (artist-step float :offset 28) @@ -8400,6 +8402,7 @@ (lid-scale int8 :offset-assert 6) (dword uint64 :offset 0) ) + :pack-me :method-count-assert 9 :size-assert #x8 :flag-assert #x900000008 @@ -8407,7 +8410,7 @@ (deftype merc-eye-anim-block (structure) ((max-frame int16 :offset-assert 0) - (data uint8 :dynamic :offset 8) + (data merc-eye-anim-frame :inline :dynamic :offset 8) ) :method-count-assert 9 :size-assert #x8 @@ -14009,7 +14012,7 @@ ;; - Types (deftype eye (structure) - ((data uint128 2 :offset-assert 0) + ((data vector 2 :inline :offset-assert 0 :score 100) (x float :offset 0) (y float :offset 4) (lid float :offset 8) @@ -21838,7 +21841,7 @@ ;; - Functions -(define-extern convert-eye-data (function box8s uint128 float)) +(define-extern convert-eye-data (function eye uint float)) (define-extern render-eyes (function dma-buffer eye-control int pointer)) (define-extern update-eyes (function none)) diff --git a/decompiler/config/jak1_ntsc_black_label/hacks.jsonc b/decompiler/config/jak1_ntsc_black_label/hacks.jsonc index 1967b5062b..356417ea9c 100644 --- a/decompiler/config/jak1_ntsc_black_label/hacks.jsonc +++ b/decompiler/config/jak1_ntsc_black_label/hacks.jsonc @@ -94,6 +94,9 @@ "vif1-handler", // F: weird asm for interrupt handler "vif1-handler-debug", + // texture + "adgif-shader<-texture!", + // vector "vector=", // asm branching diff --git a/decompiler/config/jak1_ntsc_black_label/stack_structures.jsonc b/decompiler/config/jak1_ntsc_black_label/stack_structures.jsonc index bec98f65c1..7b706b4118 100644 --- a/decompiler/config/jak1_ntsc_black_label/stack_structures.jsonc +++ b/decompiler/config/jak1_ntsc_black_label/stack_structures.jsonc @@ -5468,8 +5468,8 @@ ], "merc-eye-anim": [ - [16, "box8s"], // 2 vectors, could be a boundingbox, or something else - [48, "vector"] + [16, "eye"], // 2 vectors, could be a boundingbox, or something else + [48, "eye"] ], "placeholder-do-not-add-below!": [] diff --git a/decompiler/config/jak1_ntsc_black_label/type_casts.jsonc b/decompiler/config/jak1_ntsc_black_label/type_casts.jsonc index 640a0192b4..b99422ed70 100644 --- a/decompiler/config/jak1_ntsc_black_label/type_casts.jsonc +++ b/decompiler/config/jak1_ntsc_black_label/type_casts.jsonc @@ -7185,7 +7185,7 @@ "render-eyes": [ [[45, 52], "v1", "dma-gif-packet"], - [[52, 64], "s0", "(pointer uint64)"], + [[52, 64], "s0", "adgif-shader"], [[68, 74], "a0", "dma-packet"], [[77, 83], "a0", "gs-gif-tag"], [95, "a0", "(pointer gs-scissor)"], @@ -7209,7 +7209,7 @@ [366, "a0", "(pointer gs-test)"], [368, "a0", "(pointer gs-reg64)"], [[373, 380], "v1", "(inline-array vector4w)"], - [[380, 392], "s0", "(pointer uint64)"], + [[380, 392], "s0", "adgif-shader"], [[412, 418], "a2", "dma-packet"], [[421, 427], "a2", "gs-gif-tag"], [439, "a2", "(pointer gs-scissor)"], @@ -7227,7 +7227,7 @@ [614, "a0", "(pointer gs-test)"], [616, "a0", "(pointer gs-reg64)"], [[621, 628], "v1", "dma-gif-packet"], - [[628, 640], "s0", "(pointer uint64)"], + [[628, 640], "s0", "adgif-shader"], [641, "v1", "(inline-array dma-gif-packet)"], [[673, 679], "a2", "dma-packet"], [[682, 688], "a2", "gs-gif-tag"], @@ -7244,10 +7244,10 @@ ], "merc-eye-anim": [ - [[81, 86], "v1", "(pointer int64)"], - [[89, 94], "v1", "(pointer int64)"], - [[119, 125], "v1", "(pointer int64)"], - [[128, 134], "v1", "(pointer int64)"] + // [[81, 86], "v1", "(pointer int64)"], + // [[89, 94], "v1", "(pointer int64)"], + // [[119, 125], "v1", "(pointer int64)"], + // [[128, 134], "v1", "(pointer int64)"] ], "placeholder-do-not-add-below": [] diff --git a/game/CMakeLists.txt b/game/CMakeLists.txt index 988b1d779e..a46ddb76b0 100644 --- a/game/CMakeLists.txt +++ b/game/CMakeLists.txt @@ -74,6 +74,7 @@ set(RUNTIME_SOURCE graphics/opengl_renderer/BucketRenderer.cpp graphics/opengl_renderer/debug_gui.cpp graphics/opengl_renderer/DirectRenderer.cpp + graphics/opengl_renderer/EyeRenderer.cpp graphics/opengl_renderer/dma_helpers.cpp graphics/opengl_renderer/Loader.cpp graphics/opengl_renderer/MercProgram.cpp diff --git a/game/graphics/display.h b/game/graphics/display.h index d83419b906..a811dacb92 100644 --- a/game/graphics/display.h +++ b/game/graphics/display.h @@ -27,7 +27,7 @@ class GfxDisplay { int m_fullscreen_mode = 0; int m_fullscreen_screen; - int m_fullscreen_target_mode; + int m_fullscreen_target_mode = 0; int m_fullscreen_target_screen; public: diff --git a/game/graphics/opengl_renderer/AdgifHandler.h b/game/graphics/opengl_renderer/AdgifHandler.h index b928333bda..2b8c8d6b23 100644 --- a/game/graphics/opengl_renderer/AdgifHandler.h +++ b/game/graphics/opengl_renderer/AdgifHandler.h @@ -22,12 +22,11 @@ class AdgifHelper { std::string print() const { std::string result; - result += - fmt::format("[0] {}\n {}\n", register_address_name(m_data.tex0_addr), m_tex0.print()); - result += - fmt::format("[1] {}\n {}\n", register_address_name(m_data.tex1_addr), m_tex1.print()); + result += fmt::format("[0] {}\n {}", register_address_name(m_data.tex0_addr), m_tex0.print()); + result += fmt::format("[1] {}\n {}", register_address_name(m_data.tex1_addr), m_tex1.print()); result += fmt::format("[2] {}\n", register_address_name(m_data.mip_addr)); - result += fmt::format("[3] {}\n", register_address_name(m_data.clamp_addr)); + result += fmt::format("[3] {}\n 0x{:x}\n", register_address_name(m_data.clamp_addr), + m_data.clamp_data); result += fmt::format("[4] {}\n {}\n", register_address_name(m_data.alpha_addr), m_alpha.print()); return result; diff --git a/game/graphics/opengl_renderer/BucketRenderer.h b/game/graphics/opengl_renderer/BucketRenderer.h index af598ea697..efecb65055 100644 --- a/game/graphics/opengl_renderer/BucketRenderer.h +++ b/game/graphics/opengl_renderer/BucketRenderer.h @@ -38,6 +38,7 @@ enum class BucketId { MERC_PRIS_LEVEL0 = 49, PRIS_TEX_LEVEL1 = 51, MERC_PRIS_LEVEL1 = 52, + MERC_EYES_AFTER_PRIS = 54, MERC_AFTER_PRIS = 55, WATER_TEX_LEVEL0 = 57, MERC_WATER_LEVEL0 = 58, @@ -60,6 +61,8 @@ struct LevelVis { * The main renderer will contain a single SharedRenderState that's passed to all bucket renderers. * This allows bucket renders to share textures and shaders. */ +constexpr int EYE_TEX_WIDTH = 64; +constexpr int EYE_TEX_HEIGHT = 352; struct SharedRenderState { explicit SharedRenderState(std::shared_ptr _texture_pool) : texture_pool(_texture_pool) {} diff --git a/game/graphics/opengl_renderer/DirectRenderer.cpp b/game/graphics/opengl_renderer/DirectRenderer.cpp index 20e46fa8b4..bf3830a71c 100644 --- a/game/graphics/opengl_renderer/DirectRenderer.cpp +++ b/game/graphics/opengl_renderer/DirectRenderer.cpp @@ -1034,7 +1034,7 @@ void DirectRenderer::handle_xyzf2_common(u32 x, } } break; default: - fmt::print("prim type {} is unsupported.\n", (int)m_prim_building.kind); + fmt::print("prim type {} is unsupported in {}.\n", (int)m_prim_building.kind, name_and_id()); ASSERT(false); } diff --git a/game/graphics/opengl_renderer/EyeRenderer.cpp b/game/graphics/opengl_renderer/EyeRenderer.cpp new file mode 100644 index 0000000000..57da3d39b0 --- /dev/null +++ b/game/graphics/opengl_renderer/EyeRenderer.cpp @@ -0,0 +1,467 @@ +#include "EyeRenderer.h" +#include "game/graphics/opengl_renderer/AdgifHandler.h" + +#include "common/util/FileUtil.h" +#include "third-party/imgui/imgui.h" + +EyeRenderer::EyeRenderer(const std::string& name, BucketId id) : BucketRenderer(name, id) {} + +void EyeRenderer::render(DmaFollower& dma, + SharedRenderState* render_state, + ScopedProfilerNode& prof) { + m_debug.clear(); + + // skip if disabled + if (!m_enabled) { + while (dma.current_tag_offset() != render_state->next_bucket) { + dma.read_and_advance(); + } + return; + } + + // jump to bucket + auto data0 = dma.read_and_advance(); + ASSERT(data0.vif1() == 0); + ASSERT(data0.vif0() == 0); + ASSERT(data0.size_bytes == 0); + + // see if bucket is empty or not + if (dma.current_tag().kind == DmaTag::Kind::CALL) { + // renderer didn't run, let's just get out of here. + for (int i = 0; i < 4; i++) { + dma.read_and_advance(); + } + ASSERT(dma.current_tag_offset() == render_state->next_bucket); + return; + } + + handle_eye_dma2(dma, render_state, prof); + + while (dma.current_tag_offset() != render_state->next_bucket) { + auto data = dma.read_and_advance(); + m_debug += fmt::format("dma: {}\n", data.size_bytes); + } +} + +struct ScissorInfo { + int x0, x1; + int y0, y1; + std::string print() const { return fmt::format("x : [{}, {}], y : [{}, {}]", x0, x1, y0, y1); } +}; + +ScissorInfo decode_scissor(const DmaTransfer& dma) { + ASSERT(dma.vif0() == 0); + ASSERT(dma.vifcode1().kind == VifCode::Kind::DIRECT); + ASSERT(dma.size_bytes == 32); + + GifTag gifTag(dma.data); + ASSERT(gifTag.nloop() == 1); + ASSERT(gifTag.eop()); + ASSERT(!gifTag.pre()); + ASSERT(gifTag.flg() == GifTag::Format::PACKED); + ASSERT(gifTag.nreg() == 1); + + u8 reg_addr; + memcpy(®_addr, dma.data + 24, 1); + ASSERT((GsRegisterAddress)reg_addr == GsRegisterAddress::SCISSOR_1); + ScissorInfo result; + u64 val; + memcpy(&val, dma.data + 16, 8); + GsScissor reg(val); + result.x0 = reg.x0(); + result.x1 = reg.x1(); + result.y0 = reg.y0(); + result.y1 = reg.y1(); + return result; +} + +struct SpriteInfo { + u8 a; + u32 uv0[2]; + u32 uv1[2]; + u32 xyz0[3]; + u32 xyz1[3]; + + std::string print() const { + std::string result; + result += + fmt::format("a: {:x} uv: ({}, {}), ({}, {}) xyz: ({}, {}, {}), ({}, {}, {})", a, uv0[0], + uv0[1], uv1[0], uv1[1], xyz0[0], xyz0[1], xyz0[2], xyz1[0], xyz1[1], xyz1[2]); + return result; + } +}; + +SpriteInfo decode_sprite(const DmaTransfer& dma) { + /* + (new 'static 'dma-gif-packet + :dma-vif (new 'static 'dma-packet + :dma (new 'static 'dma-tag :qwc #x6 :id (dma-tag-id cnt)) + :vif1 (new 'static 'vif-tag :imm #x6 :cmd (vif-cmd direct) :msk #x1) + ) + :gif0 (new 'static 'gif-tag64 + :nloop #x1 + :eop #x1 + :pre #x1 + :prim (new 'static 'gs-prim :prim (gs-prim-type sprite) :tme #x1 :fst #x1) + :nreg #x5 + ) + :gif1 (new 'static 'gif-tag-regs + :regs0 (gif-reg-id rgbaq) + :regs1 (gif-reg-id uv) + :regs2 (gif-reg-id xyz2) + :regs3 (gif-reg-id uv) + :regs4 (gif-reg-id xyz2) + ) + ) + */ + + ASSERT(dma.vif0() == 0); + ASSERT(dma.vifcode1().kind == VifCode::Kind::DIRECT); + ASSERT(dma.size_bytes == 6 * 16); + + // note: not checking everything here. + GifTag gifTag(dma.data); + ASSERT(gifTag.nloop() == 1); + ASSERT(gifTag.eop()); + ASSERT(gifTag.pre()); + ASSERT(gifTag.flg() == GifTag::Format::PACKED); + ASSERT(gifTag.nreg() == 5); + + SpriteInfo result; + + // rgba + ASSERT(dma.data[16] == 128); // r + ASSERT(dma.data[16 + 4] == 128); // r + ASSERT(dma.data[16 + 8] == 128); // r + memcpy(&result.a, dma.data + 16 + 12, 1); // a + + // uv0 + memcpy(&result.uv0[0], &dma.data[32], 8); + + // xyz0 + memcpy(&result.xyz0[0], &dma.data[48], 12); + result.xyz0[2] >>= 4; + + // uv1 + memcpy(&result.uv1[0], &dma.data[64], 8); + + // xyz1 + memcpy(&result.xyz1[0], &dma.data[80], 12); + result.xyz1[2] >>= 4; + + return result; +} + +struct EyeDraw { + SpriteInfo sprite; + ScissorInfo scissor; + std::string print() const { return fmt::format("{}\n{}\n", sprite.print(), scissor.print()); } +}; + +EyeDraw read_eye_draw(DmaFollower& dma) { + auto scissor = decode_scissor(dma.read_and_advance()); + auto sprite = decode_sprite(dma.read_and_advance()); + return {sprite, scissor}; +} + +void EyeRenderer::draw_debug_window() { + ImGui::Text("Time: %.3f ms\n", m_average_time_ms); + ImGui::Text("Debug:\n%s", m_debug.c_str()); + ImGui::Checkbox("bilinear", &m_use_bilinear); + ImGui::Checkbox("alpha hack", &m_alpha_hack); +} + +u32 bilinear_sample_eye(const u8* tex, float tx, float ty, int texw) { + int tx0 = tx; + int ty0 = ty; + int tx1 = tx0 + 1; + int ty1 = ty0 + 1; + tx1 = std::min(tx1, texw - 1); + ty1 = std::min(ty1, texw - 1); + + u8 tex0[4]; + u8 tex1[4]; + u8 tex2[4]; + u8 tex3[4]; + memcpy(tex0, tex + (4 * (tx0 + ty0 * texw)), 4); + memcpy(tex1, tex + (4 * (tx1 + ty0 * texw)), 4); + memcpy(tex2, tex + (4 * (tx0 + ty1 * texw)), 4); + memcpy(tex3, tex + (4 * (tx1 + ty1 * texw)), 4); + + u8 result[4] = {0, 0, 0, 0}; + float x0w = float(tx1) - tx; + float y0w = float(ty1) - ty; + float weights[4] = {x0w * y0w, (1.f - x0w) * y0w, x0w * (1.f - y0w), (1.f - x0w) * (1.f - y0w)}; + + for (int i = 0; i < 4; i++) { + float total = 0; + total += weights[0] * tex0[i]; + total += weights[1] * tex1[i]; + total += weights[2] * tex2[i]; + total += weights[3] * tex3[i]; + result[i] = total; + } + + // clamp + u32 tex_out; + memcpy(&tex_out, result, 4); + return tex_out; +} + +template +void draw_eye_impl(u32* out, + const EyeDraw& draw, + const TextureRecord& tex, + int pair, + int lr, + bool flipx) { + // first, figure out the rectangle we'd cover if there was no scissoring + + int x0 = ((((int)draw.sprite.xyz0[0]) - 512) >> 4); + int x1 = ((((int)draw.sprite.xyz1[0]) - 512) >> 4); + if (flipx) { + std::swap(x0, x1); + } + + int y0 = ((((int)draw.sprite.xyz0[1]) - 512) >> 4); + int y1 = ((((int)draw.sprite.xyz1[1]) - 512) >> 4); + + // then the offset because the game tries to draw to a big texture, but we do an eye at a time + int x_off = lr * SINGLE_EYE_SIZE; + int y_off = pair * SINGLE_EYE_SIZE; + + // apply scissoring bounds + int x0s = std::max(x0, (int)draw.scissor.x0) - x_off; + int y0s = std::max(y0, (int)draw.scissor.y0) - y_off; + int x1s = std::min(x1, (int)draw.scissor.x1) - x_off; + int y1s = std::min(y1, (int)draw.scissor.y1) - y_off; + + // compute inverse lengths (of non-scissored) + float inv_xl = .999f / ((float)(x1 - x0)); + float inv_yl = .999f / ((float)(y1 - y0)); + + // starts + float tx0 = tex.w * (x0s - x0 + x_off) * inv_xl; + float ty0 = tex.h * (y0s - y0 + y_off) * inv_yl; + + // steps + float txs = tex.w * inv_xl; + float tys = tex.h * inv_yl; + + float ty = ty0; + for (int yd = y0s; yd < y1s; yd++) { + float tx = tx0; + for (int xd = x0s; xd < x1s; xd++) { + u32 val; + if (bilinear) { + val = bilinear_sample_eye(tex.data.data(), tx, ty, tex.w); + } else { + int tc = int(tx) + tex.w * int(ty); + memcpy(&val, tex.data.data() + (4 * tc), 4); + } + if (blend) { + if ((val >> 24) != 0) { + out[xd + yd * SINGLE_EYE_SIZE] = val; + } + } else { + out[xd + yd * SINGLE_EYE_SIZE] = val; + } + tx += txs; + } + ty += tys; + } +} + +template +void draw_eye(u32* out, + const EyeDraw& draw, + const TextureRecord& tex, + int pair, + int lr, + bool flipx, + bool bilinear) { + if (bilinear) { + draw_eye_impl(out, draw, tex, pair, lr, flipx); + } else { + draw_eye_impl(out, draw, tex, pair, lr, flipx); + } +} + +template +void EyeRenderer::handle_eye_dma2(DmaFollower& dma, + SharedRenderState* render_state, + ScopedProfilerNode&) { + Timer timer; + m_debug.clear(); + + // first should be the gs setup for render to texture + auto offset_setup = dma.read_and_advance(); + ASSERT(offset_setup.size_bytes == 128); + ASSERT(offset_setup.vifcode0().kind == VifCode::Kind::FLUSHA); + ASSERT(offset_setup.vifcode1().kind == VifCode::Kind::DIRECT); + + // next should be alpha setup + auto alpha_setup = dma.read_and_advance(); + ASSERT(alpha_setup.size_bytes == 32); + ASSERT(alpha_setup.vifcode0().kind == VifCode::Kind::NOP); + ASSERT(alpha_setup.vifcode1().kind == VifCode::Kind::DIRECT); + + // from the add to bucket + ASSERT(dma.current_tag().kind == DmaTag::Kind::NEXT); + ASSERT(dma.current_tag().qwc == 0); + ASSERT(dma.current_tag_vif0() == 0); + ASSERT(dma.current_tag_vif1() == 0); + dma.read_and_advance(); + + // now, loop over eyes. end condition is a 8 qw transfer to restore gs. + while (dma.current_tag().qwc != 8) { + // eye background setup + auto adgif0_dma = dma.read_and_advance(); + ASSERT(adgif0_dma.size_bytes == 96); // 5 adgifs a+d's plus tag + ASSERT(adgif0_dma.vif0() == 0); + ASSERT(adgif0_dma.vifcode1().kind == VifCode::Kind::DIRECT); + AdgifHelper adgif0(adgif0_dma.data + 16); + auto tex0 = render_state->texture_pool->lookup(adgif0.tex0().tbp0()); + if (DEBUG) { + m_debug += fmt::format("ADGIF0:\n{}\n", adgif0.print()); + m_debug += fmt::format("tex: {}\n", tex0->name); + } + + u32 pair_idx = -1; + // first draw. this is the background. It reads 0,0 of the texture uses that color everywhere. + // we'll also figure out the eye index here. + { + auto draw0 = read_eye_draw(dma); + ASSERT(draw0.sprite.uv0[0] == 0); + ASSERT(draw0.sprite.uv0[1] == 0); + ASSERT(draw0.sprite.uv1[0] == 0); + ASSERT(draw0.sprite.uv1[1] == 0); + if (DEBUG) { + m_debug += fmt::format("DRAW0\n{}", draw0.print()); + } + u32 tex_val; + memcpy(&tex_val, tex0->data.data(), 4); + + u32 y0 = (draw0.sprite.xyz0[1] - 512) >> 4; + pair_idx = y0 / SINGLE_EYE_SIZE; + for (auto& x : m_left) { + x = tex_val; + } + for (auto& x : m_right) { + x = tex_val; + } + } + + // up next is the pupil background + { + auto draw1 = read_eye_draw(dma); + auto draw2 = read_eye_draw(dma); + if (DEBUG) { + m_debug += fmt::format("DRAW1\n{}", draw1.print()); + m_debug += fmt::format("DRAW2\n{}", draw2.print()); + } + draw_eye(m_left, draw1, *tex0, pair_idx, 0, false, m_use_bilinear); + draw_eye(m_right, draw2, *tex0, pair_idx, 1, false, m_use_bilinear); + } + + // now we'll draw the iris on top of that + auto test1 = dma.read_and_advance(); + (void)test1; + auto adgif1_dma = dma.read_and_advance(); + ASSERT(adgif1_dma.size_bytes == 96); // 5 adgifs a+d's plus tag + ASSERT(adgif1_dma.vif0() == 0); + ASSERT(adgif1_dma.vifcode1().kind == VifCode::Kind::DIRECT); + AdgifHelper adgif1(adgif1_dma.data + 16); + auto tex1 = render_state->texture_pool->lookup(adgif1.tex0().tbp0()); + if (DEBUG) { + m_debug += fmt::format("ADGIF1:\n{}\n", adgif1.print()); + m_debug += fmt::format("tex: {}\n", tex1->name); + } + + { + auto draw1 = read_eye_draw(dma); + auto draw2 = read_eye_draw(dma); + if (DEBUG) { + m_debug += fmt::format("DRAW1\n{}", draw1.print()); + m_debug += fmt::format("DRAW2\n{}", draw2.print()); + } + draw_eye(m_left, draw1, *tex1, pair_idx, 0, false, m_use_bilinear); + draw_eye(m_right, draw2, *tex1, pair_idx, 1, false, m_use_bilinear); + } + + // and finally the eyelid + auto test2 = dma.read_and_advance(); + (void)test2; + auto adgif2_dma = dma.read_and_advance(); + ASSERT(adgif2_dma.size_bytes == 96); // 5 adgifs a+d's plus tag + ASSERT(adgif2_dma.vif0() == 0); + ASSERT(adgif2_dma.vifcode1().kind == VifCode::Kind::DIRECT); + AdgifHelper adgif2(adgif2_dma.data + 16); + auto tex2 = render_state->texture_pool->lookup(adgif2.tex0().tbp0()); + if (DEBUG) { + m_debug += fmt::format("ADGIF2:\n{}\n", adgif2.print()); + m_debug += fmt::format("tex: {}\n", tex2->name); + } + + { + auto draw1 = read_eye_draw(dma); + auto draw2 = read_eye_draw(dma); + if (DEBUG) { + m_debug += fmt::format("DRAW1\n{}", draw1.print()); + m_debug += fmt::format("DRAW2\n{}", draw2.print()); + } + draw_eye(m_left, draw1, *tex2, pair_idx, 0, false, m_use_bilinear); + draw_eye(m_right, draw2, *tex2, pair_idx, 1, true, m_use_bilinear); + } + + auto end = dma.read_and_advance(); + ASSERT(end.size_bytes == 0); + ASSERT(end.vif0() == 0); + ASSERT(end.vif1() == 0); + + if (m_alpha_hack) { + for (auto& a : m_left) { + a |= 0xff000000; + } + + for (auto& a : m_right) { + a |= 0xff000000; + } + } + + // upload to GPU: + auto left_tex = get_eye_tex(render_state, pair_idx, 0); + auto right_tex = get_eye_tex(render_state, pair_idx, 1); + glBindTexture(GL_TEXTURE_2D, left_tex->gpu_texture); + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 32, 32, 0, GL_RGBA, GL_UNSIGNED_INT_8_8_8_8_REV, + m_left); + glBindTexture(GL_TEXTURE_2D, right_tex->gpu_texture); + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 32, 32, 0, GL_RGBA, GL_UNSIGNED_INT_8_8_8_8_REV, + m_right); + } + + float time_ms = timer.getMs(); + m_average_time_ms = m_average_time_ms * 0.95 + time_ms * 0.05; +} + +TextureRecord* EyeRenderer::get_eye_tex(SharedRenderState* render_state, int pair_idx, int lr) { + int tbp = EYE_BASE_BLOCK + pair_idx * 2 + lr; + TextureRecord* existing = render_state->texture_pool->lookup(tbp); + if (existing) { + return existing; + } + + auto tex = std::make_shared(); + tex->name = fmt::format("{}-eye-{}", lr ? "left" : "right", pair_idx); + tex->only_on_gpu = true; + tex->on_gpu = true; + tex->do_gc = false; + tex->w = 32; + tex->h = 32; + GLuint gl_tex; + glGenTextures(1, &gl_tex); + tex->gpu_texture = gl_tex; + render_state->texture_pool->set_texture(tbp, tex); + + return tex.get(); +} \ No newline at end of file diff --git a/game/graphics/opengl_renderer/EyeRenderer.h b/game/graphics/opengl_renderer/EyeRenderer.h new file mode 100644 index 0000000000..6d797a6159 --- /dev/null +++ b/game/graphics/opengl_renderer/EyeRenderer.h @@ -0,0 +1,31 @@ +#pragma once + +#include +#include "game/graphics/opengl_renderer/BucketRenderer.h" +#include "game/graphics/pipelines/opengl.h" + +constexpr int EYE_BASE_BLOCK = 8160; +constexpr int NUM_EYE_PAIRS = 11; +constexpr int SINGLE_EYE_SIZE = 32; + +class EyeRenderer : public BucketRenderer { + public: + EyeRenderer(const std::string& name, BucketId id); + void render(DmaFollower& dma, SharedRenderState* render_state, ScopedProfilerNode& prof) override; + void draw_debug_window() override; + + template + void handle_eye_dma2(DmaFollower& dma, SharedRenderState* render_state, ScopedProfilerNode& prof); + + TextureRecord* get_eye_tex(SharedRenderState* render_state, int pair_idx, int lr); + + private: + std::string m_debug; + float m_average_time_ms = 0; + + bool m_use_bilinear = false; + bool m_alpha_hack = true; + + u32 m_left[SINGLE_EYE_SIZE * SINGLE_EYE_SIZE]; + u32 m_right[SINGLE_EYE_SIZE * SINGLE_EYE_SIZE]; +}; diff --git a/game/graphics/opengl_renderer/OpenGLRenderer.cpp b/game/graphics/opengl_renderer/OpenGLRenderer.cpp index bc26c6f8eb..5734d1f721 100644 --- a/game/graphics/opengl_renderer/OpenGLRenderer.cpp +++ b/game/graphics/opengl_renderer/OpenGLRenderer.cpp @@ -12,6 +12,7 @@ #include "game/graphics/opengl_renderer/tfrag/TFragment.h" #include "game/graphics/opengl_renderer/tfrag/Tie3.h" #include "game/graphics/opengl_renderer/MercRenderer.h" +#include "game/graphics/opengl_renderer/EyeRenderer.h" // for the vif callback #include "game/kernel/kmachine.h" @@ -168,8 +169,8 @@ void OpenGLRenderer::init_bucket_renderers() { init_bucket_renderer("merc-pris-1", BucketId::MERC_PRIS_LEVEL1); // 52 // 53 - // 54? - init_bucket_renderer("merc-after-pris", BucketId::MERC_AFTER_PRIS); // 55 + init_bucket_renderer("merc-eyes-after-pris", BucketId::MERC_EYES_AFTER_PRIS); // 54 + init_bucket_renderer("merc-after-pris", BucketId::MERC_AFTER_PRIS); // 55 // 56? //----------------------- diff --git a/game/graphics/pipelines/opengl.cpp b/game/graphics/pipelines/opengl.cpp index 60cdc20132..effb122b08 100644 --- a/game/graphics/pipelines/opengl.cpp +++ b/game/graphics/pipelines/opengl.cpp @@ -35,7 +35,7 @@ struct GraphicsData { // vsync std::mutex sync_mutex; std::condition_variable sync_cv; - bool vsync_enabled; + bool vsync_enabled = true; // dma chain transfer std::mutex dma_mutex; diff --git a/goal_src/engine/anim/joint.gc b/goal_src/engine/anim/joint.gc index 3e122b14c6..941b5b21f9 100644 --- a/goal_src/engine/anim/joint.gc +++ b/goal_src/engine/anim/joint.gc @@ -311,11 +311,11 @@ (+! (-> arg0 data 66 total) (logand -16 (+ v1-22 15))) ) ) - (when (and (nonzero? (-> obj _unknown)) (-> obj _unknown)) + (when (and (nonzero? (-> obj eye-anim-data)) (-> obj eye-anim-data)) (set! (-> arg0 length) (max 109 (-> arg0 length))) (set! (-> arg0 data 108 name) "eye-anim") (+! (-> arg0 data 108 count) 1) - (let ((v1-41 (* (* (+ (-> obj _unknown 0) 1) 2) 8))) + (let ((v1-41 (* (* (+ (-> obj eye-anim-data max-frame) 1) 2) 8))) (+! (-> arg0 data 108 used) v1-41) (+! (-> arg0 data 108 total) (logand -16 (+ v1-41 15))) ) diff --git a/goal_src/engine/data/art-h.gc b/goal_src/engine/data/art-h.gc index a1b4ed6241..2794501746 100644 --- a/goal_src/engine/data/art-h.gc +++ b/goal_src/engine/data/art-h.gc @@ -176,9 +176,10 @@ ) ;; joint animation. +(declare-type merc-eye-anim-block structure) (deftype art-joint-anim (art-element) ;; figured out manually from custom inspect. - ((_unknown (pointer int16) :offset 4) ;; no clue. used in mem-usage (maybe merc eye data.) + ((eye-anim-data merc-eye-anim-block :offset 4) ;; guessed on the name here, it's not in the inspect. (speed float :offset 20) (artist-base float :offset 24) (artist-step float :offset 28) diff --git a/goal_src/engine/dma/dma-h.gc b/goal_src/engine/dma/dma-h.gc index 98611f04cd..59d8f1ec7a 100644 --- a/goal_src/engine/dma/dma-h.gc +++ b/goal_src/engine/dma/dma-h.gc @@ -269,7 +269,7 @@ (pris-tex1 51) (bucket-52 52) ;; merc (bucket-53 53) - (bucket-54 54) ;; eye::update-eyes + (merc-eyes 54) ;; eye::update-eyes ;; merc1 52 ;; generic1 53 diff --git a/goal_src/engine/draw/drawable.gc b/goal_src/engine/draw/drawable.gc index d28bcebf65..a33cd68fcb 100644 --- a/goal_src/engine/draw/drawable.gc +++ b/goal_src/engine/draw/drawable.gc @@ -1088,7 +1088,7 @@ ;; bones ;; gmerc ;; shadow - ;; eyes + (update-eyes) (when (logtest? (vu1-renderer-mask sprite) *vu1-enable-user*) (swap-fake-shadow-buffers) (sprite-draw *display*) diff --git a/goal_src/engine/draw/process-drawable.gc b/goal_src/engine/draw/process-drawable.gc index 6e5fddecf2..fe8a1bb590 100644 --- a/goal_src/engine/draw/process-drawable.gc +++ b/goal_src/engine/draw/process-drawable.gc @@ -965,9 +965,9 @@ (if (logtest? (-> obj skel status) 72) (merc-blend-shape obj) ) - ; (if (logtest? (-> obj skel status) 384) - ; (merc-eye-anim obj) - ; ) + (if (logtest? (-> obj skel status) 384) + (merc-eye-anim obj) + ) (label cfg-27) (let ((a0-17 (-> gp-0 effect))) (if a0-17 diff --git a/goal_src/engine/gfx/eye-h.gc b/goal_src/engine/gfx/eye-h.gc index 85bbcce824..408211d829 100644 --- a/goal_src/engine/gfx/eye-h.gc +++ b/goal_src/engine/gfx/eye-h.gc @@ -7,11 +7,12 @@ (define-extern get-eye-block (function int int int)) (define-extern merc-eye-anim (function process-drawable none)) +(define-extern update-eyes (function none)) ;; DECOMP BEGINS (deftype eye (structure) - ((data uint128 2 :offset-assert 0) + ((data vector 2 :inline :offset-assert 0) (x float :offset 0) (y float :offset 4) (lid float :offset 8) diff --git a/goal_src/engine/gfx/eye.gc b/goal_src/engine/gfx/eye.gc index 497e71d074..683d42262d 100644 --- a/goal_src/engine/gfx/eye.gc +++ b/goal_src/engine/gfx/eye.gc @@ -7,52 +7,64 @@ ;; DECOMP BEGINS -(define *eye-work* (new 'static 'eye-work - :sprite-tmpl - (new 'static 'dma-gif-packet - :dma-vif - (new 'static 'dma-packet - :dma - (new 'static 'dma-tag :qwc #x6 :id (dma-tag-id cnt)) - :vif1 - (new 'static 'vif-tag :imm #x6 :cmd (vif-cmd direct) :msk #x1) - ) - :gif - (new 'static 'array uint64 2 #x508b400000008001 #x53531) - ) - :sprite-tmpl2 - (new 'static 'dma-gif-packet - :dma-vif - (new 'static 'dma-packet - :dma - (new 'static 'dma-tag :qwc #x6 :id (dma-tag-id cnt)) - :vif1 - (new 'static 'vif-tag :imm #x6 :cmd (vif-cmd direct) :msk #x1) - ) - :gif - (new 'static 'array uint64 2 #x50ab400000008001 #x53531) - ) - :adgif-tmpl - (new 'static 'dma-gif-packet - :dma-vif - (new 'static 'dma-packet - :dma - (new 'static 'dma-tag :qwc #x6 :id (dma-tag-id cnt)) - :vif1 - (new 'static 'vif-tag :imm #x6 :cmd (vif-cmd direct) :msk #x1) - ) - :gif - (new 'static 'array uint64 2 #x1000000000008005 #xe) - ) - :blink-table - (new 'static 'array float 10 0.0 0.667 0.9 1.0 1.0 1.0 1.0 0.333 0.1 0.0) - ) +(define *eye-work* + (new 'static 'eye-work + :sprite-tmpl + (new 'static 'dma-gif-packet + :dma-vif (new 'static 'dma-packet + :dma (new 'static 'dma-tag :qwc #x6 :id (dma-tag-id cnt)) + :vif1 (new 'static 'vif-tag :imm #x6 :cmd (vif-cmd direct) :msk #x1) + ) + :gif0 (new 'static 'gif-tag64 + :nloop #x1 + :eop #x1 + :pre #x1 + :prim (new 'static 'gs-prim :prim (gs-prim-type sprite) :tme #x1 :fst #x1) + :nreg #x5 + ) + :gif1 (new 'static 'gif-tag-regs + :regs0 (gif-reg-id rgbaq) + :regs1 (gif-reg-id uv) + :regs2 (gif-reg-id xyz2) + :regs3 (gif-reg-id uv) + :regs4 (gif-reg-id xyz2) + ) + ) + :sprite-tmpl2 + (new 'static 'dma-gif-packet + :dma-vif (new 'static 'dma-packet + :dma (new 'static 'dma-tag :qwc #x6 :id (dma-tag-id cnt)) + :vif1 (new 'static 'vif-tag :imm #x6 :cmd (vif-cmd direct) :msk #x1) + ) + :gif0 (new 'static 'gif-tag64 + :nloop #x1 + :eop #x1 + :pre #x1 + :prim (new 'static 'gs-prim :prim (gs-prim-type sprite) :tme #x1 :abe #x1 :fst #x1) + :nreg #x5 + ) + :gif1 (new 'static 'gif-tag-regs + :regs0 (gif-reg-id rgbaq) + :regs1 (gif-reg-id uv) + :regs2 (gif-reg-id xyz2) + :regs3 (gif-reg-id uv) + :regs4 (gif-reg-id xyz2) + ) + ) + :adgif-tmpl + (new 'static 'dma-gif-packet + :dma-vif (new 'static 'dma-packet + :dma (new 'static 'dma-tag :qwc #x6 :id (dma-tag-id cnt)) + :vif1 (new 'static 'vif-tag :imm #x6 :cmd (vif-cmd direct) :msk #x1) + ) + :gif0 (new 'static 'gif-tag64 :nloop #x5 :eop #x1 :nreg #x1) + :gif1 (new 'static 'gif-tag-regs :regs0 (gif-reg-id a+d)) + ) + :blink-table + (new 'static 'array float 10 0.0 0.667 0.9 1.0 1.0 1.0 1.0 0.333 0.1 0.0) + ) ) -;; WARN: Stack slot offset 16 signed mismatch -;; WARN: Stack slot offset 16 signed mismatch -;; WARN: Stack slot offset 16 signed mismatch -;; WARN: Stack slot offset 16 signed mismatch (defun render-eyes ((arg0 dma-buffer) (arg1 eye-control) (arg2 int)) (local-vars (sv-16 float)) (let ((s4-0 32) @@ -65,17 +77,21 @@ ) (set! sv-16 (* 16.0 (+ (the float (+ s3-0 16)) (* 32.0 (-> arg1 right y))))) (let ((s1-0 (-> arg1 shaders 0))) + ;; ADGIF 0 (let ((v1-6 (the-as object (-> arg0 base)))) (set! (-> (the-as dma-gif-packet v1-6) dma-vif quad) (-> *eye-work* adgif-tmpl dma-vif quad)) (set! (-> (the-as dma-gif-packet v1-6) quad 1) (-> *eye-work* adgif-tmpl quad 1)) - (let ((s0-0 (the-as (pointer uint64) (&+ (the-as pointer v1-6) 32)))) - (quad-copy! s0-0 (the-as pointer s1-0) 5) - (set! (-> s0-0 6) (the-as uint #x7c0007c005)) - (set! (-> s0-0 8) (the-as uint 68)) - (set! (-> s0-0 9) (the-as uint 66)) + (let ((s0-0 (the-as adgif-shader (&+ (the-as pointer v1-6) 32)))) + (quad-copy! (the-as pointer s0-0) (the-as pointer s1-0) 5) + (set! (-> s0-0 clamp) + (new 'static 'gs-clamp :wms (gs-tex-wrap-mode clamp) :wmt (gs-tex-wrap-mode clamp) :maxu #x1f :maxv #x1f) + ) + (set! (-> s0-0 alpha) (new 'static 'gs-alpha :b #x1 :d #x1)) + (set! (-> s0-0 prims 9) (gs-reg64 alpha-1)) ) ) (&+! (-> arg0 base) 112) + ;; SCISSOR0 (let* ((v1-12 arg0) (a0-6 (the-as object (-> v1-12 base))) ) @@ -119,6 +135,7 @@ (set! (-> (the-as (pointer gs-reg64) a0-10) 1) (gs-reg64 scissor-1)) (set! (-> v1-14 base) (&+ a0-10 16)) ) + ;; SPRITE0 (let ((v1-15 (the-as (inline-array vector4w) (-> arg0 base)))) (set! (-> v1-15 0 quad) (-> *eye-work* sprite-tmpl dma-vif quad)) (set! (-> v1-15 1 quad) (-> *eye-work* sprite-tmpl quad 1)) @@ -132,6 +149,7 @@ (let ((v1-20 (ash 16 (-> s1-0 tex0 tw))) (a0-30 (ash 16 (-> s1-0 tex0 th))) ) + ;; SCISSOR1 (let* ((a1-22 arg0) (a2-7 (the-as object (-> a1-22 base))) ) @@ -175,6 +193,7 @@ (set! (-> (the-as (pointer gs-reg64) a2-11) 1) (gs-reg64 scissor-1)) (set! (-> a1-24 base) (&+ a2-11 16)) ) + ;; SPRITE1 (let* ((f0-6 (* 256.0 (-> arg1 left iris-scale))) (a1-25 (the-as (inline-array vector4w) (-> arg0 base))) (a2-13 (the int (- f28-0 f0-6))) @@ -182,6 +201,7 @@ (a3-9 (the int (+ f28-0 f0-6))) (t1-0 (the int (+ f26-0 f0-6))) ) + ;; (format 0 "eye: ~f ~f~%" f28-0 f26-0) (set! (-> a1-25 0 quad) (-> *eye-work* sprite-tmpl dma-vif quad)) (set! (-> a1-25 1 quad) (-> *eye-work* sprite-tmpl quad 1)) (set-vector! (-> a1-25 2) 128 128 128 128) @@ -191,6 +211,7 @@ (set-vector! (-> a1-25 6) a3-9 t1-0 #xffffff 0) ) (set! (-> arg0 base) (the-as pointer (-> (the-as (inline-array vector4w) (-> arg0 base)) 7))) + ;; SCISSOR2 (let* ((a1-29 arg0) (a2-17 (the-as object (-> a1-29 base))) ) @@ -234,6 +255,7 @@ (set! (-> (the-as (pointer gs-reg64) a2-21) 1) (gs-reg64 scissor-1)) (set! (-> a1-31 base) (&+ a2-21 16)) ) + ;; SPRITE2 (let* ((f0-10 (* 256.0 (-> arg1 right iris-scale))) (a1-32 (the-as (inline-array vector4w) (-> arg0 base))) (a2-23 (the int (- f30-0 f0-10))) @@ -299,11 +321,13 @@ (let ((v1-28 (the-as object (-> arg0 base)))) (set! (-> (the-as (inline-array vector4w) v1-28) 0 quad) (-> *eye-work* adgif-tmpl dma-vif quad)) (set! (-> (the-as (inline-array vector4w) v1-28) 1 quad) (-> *eye-work* adgif-tmpl quad 1)) - (let ((s0-1 (the-as (pointer uint64) (&+ (the-as pointer v1-28) 32)))) - (quad-copy! s0-1 (the-as pointer s1-1) 5) - (set! (-> s0-1 6) (the-as uint #x7c0007c005)) - (set! (-> s0-1 8) (the-as uint 68)) - (set! (-> s0-1 9) (the-as uint 66)) + (let ((s0-1 (the-as adgif-shader (&+ (the-as pointer v1-28) 32)))) + (quad-copy! (the-as pointer s0-1) (the-as pointer s1-1) 5) + (set! (-> s0-1 clamp) + (new 'static 'gs-clamp :wms (gs-tex-wrap-mode clamp) :wmt (gs-tex-wrap-mode clamp) :maxu #x1f :maxv #x1f) + ) + (set! (-> s0-1 alpha) (new 'static 'gs-alpha :b #x1 :d #x1)) + (set! (-> s0-1 prims 9) (gs-reg64 alpha-1)) ) ) (&+! (-> arg0 base) 112) @@ -482,11 +506,13 @@ (let ((v1-43 (the-as object (-> arg0 base)))) (set! (-> (the-as dma-gif-packet v1-43) dma-vif quad) (-> *eye-work* adgif-tmpl dma-vif quad)) (set! (-> (the-as dma-gif-packet v1-43) quad 1) (-> *eye-work* adgif-tmpl quad 1)) - (let ((s0-2 (the-as (pointer uint64) (&+ (the-as pointer v1-43) 32)))) - (quad-copy! s0-2 (the-as pointer s1-2) 5) - (set! (-> s0-2 6) (the-as uint #x7c0007c005)) - (set! (-> s0-2 8) (the-as uint 1)) - (set! (-> s0-2 9) (the-as uint 66)) + (let ((s0-2 (the-as adgif-shader (&+ (the-as pointer v1-43) 32)))) + (quad-copy! (the-as pointer s0-2) (the-as pointer s1-2) 5) + (set! (-> s0-2 clamp) + (new 'static 'gs-clamp :wms (gs-tex-wrap-mode clamp) :wmt (gs-tex-wrap-mode clamp) :maxu #x1f :maxv #x1f) + ) + (set! (-> s0-2 alpha) (new 'static 'gs-alpha :a #x1)) + (set! (-> s0-2 prims 9) (gs-reg64 alpha-1)) ) ) (set! (-> arg0 base) (-> (the-as (inline-array dma-gif-packet) (-> arg0 base)) 3 gif)) @@ -629,6 +655,7 @@ ) (defun update-eyes () + ;; Setup GS for level 0 eyes (let* ((s5-0 (-> *display* frames (-> *display* on-screen) frame global-buf)) (gp-0 (-> s5-0 base)) ) @@ -690,6 +717,8 @@ ) ) ) + + ;; Setup GS for level 1 eyes (let* ((s5-1 (-> *display* frames (-> *display* on-screen) frame global-buf)) (gp-1 (-> s5-1 base)) ) @@ -751,6 +780,8 @@ ) ) ) + + ;; Setup GS for common eyes (let* ((s5-2 (-> *display* frames (-> *display* on-screen) frame global-buf)) (gp-2 (-> s5-2 base)) ) @@ -806,21 +837,27 @@ ) (dma-bucket-insert-tag (-> *display* frames (-> *display* on-screen) frame bucket-group) - (bucket-id bucket-54) + (bucket-id merc-eyes) gp-2 (the-as (pointer dma-tag) a3-5) ) ) ) + + ;; rendering of eyes. (dotimes (gp-3 11) + + ;; grab the eye and the process (let* ((s5-3 (-> *eye-control-array* data gp-3)) (v1-40 (handle->process (-> s5-3 process))) ) + ;; see if we need the eye (when (and v1-40 (logtest? (-> (the-as process-drawable v1-40) skel status) 256) (logtest? (-> (the-as process-drawable v1-40) draw status) (draw-status was-drawn)) ) (when (-> s5-3 shaders) + ;; update blinking (when (not (paused?)) (cond ((and (>= (-> s5-3 left lid) 0.0) (>= (-> s5-3 right lid) 0.0)) @@ -840,8 +877,10 @@ ) ) ) + ;; pick between level and common eyes (cond ((>= (the-as uint 1) (-> s5-3 level)) + ;; level eyes (let* ((s3-0 (-> *display* frames (-> *display* on-screen) frame global-buf)) (s4-0 (-> s3-0 base)) ) @@ -855,11 +894,12 @@ ) (dma-bucket-insert-tag (-> *display* frames (-> *display* on-screen) frame bucket-group) - (the-as bucket-id (if (zero? (-> s5-3 level)) - 48 - 51 - ) - ) + (bucket-id merc-eyes) + ; (the-as bucket-id (if (zero? (-> s5-3 level)) + ; 48 + ; 51 + ; ) + ; ) s4-0 (the-as (pointer dma-tag) a3-6) ) @@ -880,7 +920,7 @@ ) (dma-bucket-insert-tag (-> *display* frames (-> *display* on-screen) frame bucket-group) - (bucket-id bucket-54) + (bucket-id merc-eyes) s4-1 (the-as (pointer dma-tag) a3-7) ) @@ -1066,7 +1106,7 @@ ) (dma-bucket-insert-tag (-> *display* frames (-> *display* on-screen) frame bucket-group) - (bucket-id bucket-54) + (bucket-id merc-eyes) gp-6 (the-as (pointer dma-tag) a3-10) ) @@ -1076,7 +1116,12 @@ (none) ) +;; definition for function get-eye-block (defun get-eye-block ((arg0 int) (arg1 int)) + (#when PC_PORT + ;; hack to make this easier to figure out on the PC side. + (return (+ *eyes-base-block* (* arg0 2) arg1)) + ) (let ((v1-0 arg0) (a0-4 (-> ct32-24-block-table (* arg1 4))) ) @@ -1084,9 +1129,9 @@ ) ) -(defun convert-eye-data ((arg0 box8s) (arg1 uint128)) +;; definition for function convert-eye-data +(defun convert-eye-data ((arg0 eye) (arg1 uint)) (local-vars - (r0-0 uint128) (v0-0 float) (v1-0 uint128) (v1-1 uint128) @@ -1098,133 +1143,111 @@ (rlet ((vf1 :class vf) (vf2 :class vf) ) - (.pextlb v1-0 arg1 r0-0) - (.pextlh v1-1 v1-0 r0-0) + (.pextlb v1-0 arg1 0) + (.pextlh v1-1 v1-0 0) (.pw.sra v1-2 v1-1 16) (.mov vf1 v1-2) - (.pextlb v1-3 r0-0 arg1) - (.pextuh v1-4 r0-0 v1-3) + (.pextlb v1-3 0 arg1) + (.pextuh v1-4 0 v1-3) (.pw.sll v1-5 v1-4 6) (.mov vf2 v1-5) (vitof15.xyzw vf1 vf1) (vitof12.xyzw vf2 vf2) - (.svf (&-> arg0 min quad) vf1) - (.svf (&-> arg0 max quad) vf2) + (.svf (&-> arg0 data 0 quad) vf1) + (.svf (&-> arg0 data 1 quad) vf2) (.mov v0-0 vf2) v0-0 ) ) -(defun merc-eye-anim ((arg0 process-drawable)) - ; (let* ((s5-0 (-> arg0 draw mgeo header eye-ctrl)) - ; (a0-1 (-> arg0 skel root-channel 0)) - ; (s4-0 (-> a0-1 frame-group)) - ; ) - ; (when (and (logtest? (-> arg0 skel status) 256) - ; (nonzero? s5-0) - ; (> (-> arg0 skel active-channels) 0) - ; s4-0 - ; (nonzero? (-> s4-0 _unknown)) - ; ) - ; (let* ((v1-15 (-> *eye-control-array* data (-> s5-0 eye-slot))) - ; (s3-1 (min (the int (-> a0-1 frame-num)) (-> s4-0 _unknown 0))) - ; (s2-1 (min (+ (the int (-> a0-1 frame-num)) 1) (-> s4-0 _unknown 0))) - ; (f0-4 (-> a0-1 frame-num)) - ; (f30-0 (- f0-4 (* (the float (the int (/ f0-4 1.0))) 1.0))) - ; ) - ; (set! (-> v1-15 process) (process->handle arg0)) - ; (set! (-> v1-15 shaders) (the-as (inline-array adgif-shader) (-> s5-0 iris-shader))) - ; (set! (-> v1-15 level) (the-as uint (-> (if (-> arg0 entity) - ; (-> arg0 entity extra level) - ; (-> *level* level-default) - ; ) - ; index - ; ) - ; ) - ; ) - ; (let ((s1-0 (new 'stack-no-clear 'box8s)) - ; (s0-0 (new 'stack-no-clear 'vector)) - ; ) - ; (cond - ; ((-> s4-0 _unknown) - ; (convert-eye-data - ; s1-0 - ; (the-as - ; uint128 - ; (-> (the-as (pointer int64) (&+ (the-as (pointer int64) (-> s4-0 _unknown)) (* (* s3-1 2) 8))) 1) - ; ) - ; ) - ; (convert-eye-data - ; (the-as box8s s0-0) - ; (the-as - ; uint128 - ; (-> (the-as (pointer int64) (&+ (the-as (pointer int64) (-> s4-0 _unknown)) (* (* s2-1 2) 8))) 1) - ; ) - ; ) - ; (vector4-lerp! - ; (the-as vector (+ (the-as uint (-> *eye-control-array* data 0 left)) (* 96 (-> s5-0 eye-slot)))) - ; (the-as vector (-> s1-0 data)) - ; (the-as vector (&-> s0-0 x)) - ; f30-0 - ; ) - ; (vector4-lerp! - ; (the-as vector (&+ (&-> *eye-control-array* data 0 left iris-scale) (* 96 (-> s5-0 eye-slot)))) - ; (-> s1-0 max) - ; (&+ s0-0 16) - ; f30-0 - ; ) - ; (convert-eye-data - ; s1-0 - ; (the-as - ; uint128 - ; (-> (the-as (pointer int64) (&+ (the-as (pointer int64) (-> s4-0 _unknown)) (* (+ (* s3-1 2) 1) 8))) 1) - ; ) - ; ) - ; (convert-eye-data - ; (the-as box8s s0-0) - ; (the-as - ; uint128 - ; (-> (the-as (pointer int64) (&+ (the-as (pointer int64) (-> s4-0 _unknown)) (* (+ (* s2-1 2) 1) 8))) 1) - ; ) - ; ) - ; (vector4-lerp! - ; (the-as vector (+ (the-as uint (-> *eye-control-array* data 0 right)) (* 96 (-> s5-0 eye-slot)))) - ; (the-as vector (-> s1-0 data)) - ; (the-as vector (&-> s0-0 x)) - ; f30-0 - ; ) - ; (vector4-lerp! - ; (the-as vector (&+ (&-> *eye-control-array* data 0 right iris-scale) (* 96 (-> s5-0 eye-slot)))) - ; (-> s1-0 max) - ; (&+ s0-0 16) - ; f30-0 - ; ) - ; ) - ; (else - ; (let ((v1-37 (-> *eye-control-array* data (-> s5-0 eye-slot)))) - ; (set! (-> v1-37 left x) 0.0) - ; (set! (-> v1-37 left y) 0.0) - ; (set! (-> v1-37 left lid) -1.0) - ; (set! (-> v1-37 left iris-scale) 1.0) - ; (set! (-> v1-37 left pupil-scale) 1.0) - ; (set! (-> v1-37 left lid-scale) 1.0) - ; (set! (-> v1-37 right x) 0.0) - ; (set! (-> v1-37 right y) 0.0) - ; (set! (-> v1-37 right lid) -1.0) - ; (set! (-> v1-37 right iris-scale) 1.0) - ; (set! (-> v1-37 right pupil-scale) 1.0) - ; (set! (-> v1-37 right lid-scale) 1.0) - ; ) - ; ) - ; ) - ; ) - ; ) - ; (logior! (-> arg0 skel status) 128) - ; ) - ; ) - ; (if (logtest? (-> arg0 skel status) 128) - ; (set! (-> arg0 skel status) (logand -129 (-> arg0 skel status))) - ; ) +;; definition for function merc-eye-anim +;; INFO: Return type mismatch int vs none. +(defun merc-eye-anim ((arg0 manipy)) + (let* ((s5-0 (-> arg0 draw mgeo header eye-ctrl)) + (a0-1 (-> arg0 skel root-channel 0)) + (s4-0 (-> a0-1 frame-group)) + ) + (when (and (logtest? (-> arg0 skel status) 256) + (nonzero? s5-0) + (> (-> arg0 skel active-channels) 0) + s4-0 + (nonzero? (-> s4-0 eye-anim-data)) + ) + (let* ((v1-15 (-> *eye-control-array* data (-> s5-0 eye-slot))) + (s3-1 (min (the int (-> a0-1 frame-num)) (-> s4-0 eye-anim-data max-frame))) + (s2-1 (min (+ (the int (-> a0-1 frame-num)) 1) (-> s4-0 eye-anim-data max-frame))) + (f0-4 (-> a0-1 frame-num)) + (f30-0 (- f0-4 (* (the float (the int (/ f0-4 1.0))) 1.0))) + ) + (set! (-> v1-15 process) (process->handle arg0)) + (set! (-> v1-15 shaders) (the-as (inline-array adgif-shader) (-> s5-0 iris-shader))) + (set! (-> v1-15 level) (the-as uint (-> (if (-> arg0 entity) + (-> arg0 entity extra level) + (-> *level* level-default) + ) + index + ) + ) + ) + (let ((s1-0 (new 'stack-no-clear 'eye)) + (s0-0 (new 'stack-no-clear 'eye)) + ) + (cond + ((-> s4-0 eye-anim-data) + (convert-eye-data s1-0 (-> s4-0 eye-anim-data data (* s3-1 2) dword)) + (convert-eye-data s0-0 (-> s4-0 eye-anim-data data (* s2-1 2) dword)) + (vector4-lerp! + (the-as vector (+ (the-as uint (-> *eye-control-array* data 0 left)) (* 96 (-> s5-0 eye-slot)))) + (the-as vector (-> s1-0 data)) + (the-as vector (-> s0-0 data)) + f30-0 + ) + (vector4-lerp! + (the-as vector (+ (the-as uint (-> *eye-control-array* data 0 left data 1)) (* 96 (-> s5-0 eye-slot)))) + (-> s1-0 data 1) + (-> s0-0 data 1) + f30-0 + ) + (convert-eye-data s1-0 (-> s4-0 eye-anim-data data (+ (* s3-1 2) 1) dword)) + (convert-eye-data s0-0 (-> s4-0 eye-anim-data data (+ (* s2-1 2) 1) dword)) + (vector4-lerp! + (the-as vector (+ (the-as uint (-> *eye-control-array* data 0 right)) (* 96 (-> s5-0 eye-slot)))) + (the-as vector (-> s1-0 data)) + (the-as vector (-> s0-0 data)) + f30-0 + ) + (vector4-lerp! + (the-as vector (+ (the-as uint (-> *eye-control-array* data 0 right data 1)) (* 96 (-> s5-0 eye-slot)))) + (-> s1-0 data 1) + (-> s0-0 data 1) + f30-0 + ) + ) + (else + (let ((v1-37 (-> *eye-control-array* data (-> s5-0 eye-slot)))) + (set! (-> v1-37 left data 0 x) 0.0) + (set! (-> v1-37 left data 0 y) 0.0) + (set! (-> v1-37 left data 0 z) -1.0) + (set! (-> v1-37 left data 1 x) 1.0) + (set! (-> v1-37 left data 1 y) 1.0) + (set! (-> v1-37 left data 1 z) 1.0) + (set! (-> v1-37 right data 0 x) 0.0) + (set! (-> v1-37 right data 0 y) 0.0) + (set! (-> v1-37 right data 0 z) -1.0) + (set! (-> v1-37 right data 1 x) 1.0) + (set! (-> v1-37 right data 1 y) 1.0) + (set! (-> v1-37 right data 1 z) 1.0) + ) + ) + ) + ) + ) + (logior! (-> arg0 skel status) 128) + ) + ) + (if (logtest? (-> arg0 skel status) 128) + (set! (-> arg0 skel status) (logand -129 (-> arg0 skel status))) + ) 0 (none) ) diff --git a/goal_src/engine/gfx/merc/merc-h.gc b/goal_src/engine/gfx/merc/merc-h.gc index 44ac701500..bbb98a7af3 100644 --- a/goal_src/engine/gfx/merc/merc-h.gc +++ b/goal_src/engine/gfx/merc/merc-h.gc @@ -235,6 +235,7 @@ (lid-scale int8 :offset-assert 6) (dword uint64 :offset 0) ) + :pack-me :method-count-assert 9 :size-assert #x8 :flag-assert #x900000008 @@ -242,7 +243,7 @@ (deftype merc-eye-anim-block (structure) ((max-frame int16 :offset-assert 0) - (data uint8 :dynamic :offset 8) + (data merc-eye-anim-frame :inline :dynamic :offset 8) ) :method-count-assert 9 :size-assert #x8 diff --git a/goal_src/engine/gfx/sky/sky-tng.gc b/goal_src/engine/gfx/sky/sky-tng.gc index 2c3e0a3f75..2cfaff170b 100644 --- a/goal_src/engine/gfx/sky/sky-tng.gc +++ b/goal_src/engine/gfx/sky/sky-tng.gc @@ -26,7 +26,6 @@ :dma (new 'static 'dma-tag :qwc #x6 :id (dma-tag-id cnt)) :vif1 (new 'static 'vif-tag :imm #x6 :cmd (vif-cmd direct) :msk #x1) ) - #| :gif0 (new 'static 'gif-tag64 :nloop #x1 :eop #x1 @@ -41,8 +40,7 @@ :regs3 (gif-reg-id uv) :regs4 (gif-reg-id xyzf2) ) - |# - :gif (new 'static 'array uint64 2 #x508b400000008001 #x43431) + ) ;; sprite with texture and abe (alpha blend enable) :blend-tmpl (new 'static 'dma-gif-packet @@ -50,7 +48,6 @@ :dma (new 'static 'dma-tag :qwc #x6 :id (dma-tag-id cnt)) :vif1 (new 'static 'vif-tag :imm #x6 :cmd (vif-cmd direct) :msk #x1) ) - #| :gif0 (new 'static 'gif-tag64 :nloop #x1 :eop #x1 @@ -65,8 +62,6 @@ :regs3 (gif-reg-id uv) :regs4 (gif-reg-id xyzf2) ) - |# - :gif (new 'static 'array uint64 2 #x50ab400000008001 #x43431) ) :sky-data (new 'static 'inline-array qword 5 (new 'static 'qword :data (new 'static 'array uint32 4 #x0 #x0 #x0 #x80)) @@ -787,10 +782,7 @@ ) ) (set! (-> (the-as (pointer gs-reg64) a0-15) 3) (gs-reg64 test-1)) - (set! - (-> (the-as (pointer gs-alpha) a0-15) 4) - (new 'static 'gs-alpha :b #x1 :d #x1) - ) + (set! (-> (the-as (pointer gs-alpha) a0-15) 4) (new 'static 'gs-alpha :b #x1 :d #x1)) (set! (-> (the-as (pointer gs-reg64) a0-15) 5) (gs-reg64 alpha-1)) (set! (-> v1-16 base) (&+ a0-15 48)) ) @@ -1116,10 +1108,7 @@ :wmt (gs-tex-wrap-mode clamp) ) ) - (set! - (-> (the-as adgif-shader s4-0) alpha) - (new 'static 'gs-miptbp :tbp1 #x68 :tbw2 #x20) - ) + (set! (-> (the-as adgif-shader s4-0) alpha) (new 'static 'gs-alpha :b #x2 :c #x2 :d #x1 :fix #x80)) ) (cond (*sky-drawn* @@ -1180,10 +1169,7 @@ :wmt (gs-tex-wrap-mode clamp) ) ) - (set! - (-> (the-as adgif-shader s4-0) alpha) - (new 'static 'gs-miptbp :tbp1 #x68 :tbw2 #x20) - ) + (set! (-> (the-as adgif-shader s4-0) alpha) (new 'static 'gs-alpha :b #x2 :c #x2 :d #x1 :fix #x80)) ) (cond (*cloud-drawn* diff --git a/goal_src/engine/gfx/sprite/sprite.gc b/goal_src/engine/gfx/sprite/sprite.gc index 4f2fdae4dd..d564d95b3c 100644 --- a/goal_src/engine/gfx/sprite/sprite.gc +++ b/goal_src/engine/gfx/sprite/sprite.gc @@ -321,7 +321,7 @@ :wmt (gs-tex-wrap-mode region-clamp) :maxu 639 :maxv 239)) (set! (-> data screen-shader prims 9) (gs-reg64 alpha-1)) - (set! (-> data screen-shader alpha) (new 'static 'gs-miptbp :tbp1 #x44)) + (set! (-> data screen-shader alpha) (new 'static 'gs-alpha :b #x1 :d #x1)) ;; sin/cosine table (set! (-> data sincos-01 z) 0.999998) @@ -857,8 +857,8 @@ ) (adgif-shader<-texture-simple! dma-adgif-data *shadow-middot-texture*) (if (logtest? (-> in-adgif-data flags) 1) - (set! (-> dma-adgif-data alpha) (new 'static 'gs-miptbp :tbp1 72)) - (set! (-> dma-adgif-data alpha) (new 'static 'gs-miptbp :tbp1 66)) + (set! (-> dma-adgif-data alpha) (new 'static 'gs-alpha :b #x2 :d #x1)) + (set! (-> dma-adgif-data alpha) (new 'static 'gs-alpha :a #x2 :d #x1)) ) ) (&+! (-> dma-buff base) 80) diff --git a/goal_src/engine/gfx/texture-h.gc b/goal_src/engine/gfx/texture-h.gc index 6d3b387606..70057ad3bb 100644 --- a/goal_src/engine/gfx/texture-h.gc +++ b/goal_src/engine/gfx/texture-h.gc @@ -315,7 +315,8 @@ (clamp-reg gs-reg64 :offset 56) ;; or prims 7 ;; alpha blending. NOTE: this can also be miptbp2 (mip 4+ settings) - (alpha gs-miptbp :offset 64) + (alpha gs-alpha :offset 64) + (alpha-as-miptb2 gs-miptbp :offset 64) ;; prims 9 diff --git a/goal_src/engine/gfx/texture.gc b/goal_src/engine/gfx/texture.gc index 1432923c1a..67302401fb 100644 --- a/goal_src/engine/gfx/texture.gc +++ b/goal_src/engine/gfx/texture.gc @@ -2407,8 +2407,7 @@ ;; hack - if we have a lot of mips, set alpha to miptbp. ;; and modify the adgif thing to have a (miptbp2-1 54) (when (< (the-as uint 4) (-> arg1 num-mips)) - (set! - (-> arg0 alpha) + (set! (-> arg0 alpha-as-miptb2) (new 'static 'gs-miptbp :tbp1 (-> arg1 dest 4) :tbw1 (-> arg1 width 4) @@ -2577,7 +2576,7 @@ (adgif-shader<-texture! arg0 arg1) ) (set! (-> arg0 clamp) (new 'static 'gs-clamp :wms (gs-tex-wrap-mode clamp) :wmt (gs-tex-wrap-mode clamp))) - (set! (-> arg0 alpha) (new 'static 'gs-miptbp :tbp1 68)) + (set! (-> arg0 alpha) (new 'static 'gs-alpha :b #x1 :d #x1)) (set! (-> arg0 prims 1) (gs-reg64 tex0-1)) (set! (-> arg0 prims 3) (gs-reg64 tex1-1)) (set! (-> arg0 prims 5) (gs-reg64 miptbp1-1)) diff --git a/goal_src/engine/gfx/tie/prototype.gc b/goal_src/engine/gfx/tie/prototype.gc index d8cc211a1a..92bfe11ea8 100644 --- a/goal_src/engine/gfx/tie/prototype.gc +++ b/goal_src/engine/gfx/tie/prototype.gc @@ -22,7 +22,7 @@ (adgif-shader-login-no-remap s4-1) (set! (-> s4-1 tex1) (new 'static 'gs-tex1 :mmag #x1 :mmin #x1)) (set! (-> s4-1 clamp) (new 'static 'gs-clamp :wms (gs-tex-wrap-mode clamp) :wmt (gs-tex-wrap-mode clamp))) - (set! (-> s4-1 alpha) (new 'static 'gs-miptbp :tbp1 #x58)) + (set! (-> s4-1 alpha) (new 'static 'gs-alpha :b #x2 :c #x1 :d #x1)) (set! (-> s4-1 prims 1) (gs-reg64 tex0-1)) (set! (-> s4-1 prims 3) (gs-reg64 tex1-1)) (set! (-> s4-1 prims 5) (gs-reg64 miptbp1-1)) diff --git a/goal_src/engine/level/level.gc b/goal_src/engine/level/level.gc index 1112384c05..8bb1679c68 100644 --- a/goal_src/engine/level/level.gc +++ b/goal_src/engine/level/level.gc @@ -783,7 +783,7 @@ :wmt (gs-tex-wrap-mode clamp) ) ) - (set! (-> s0-2 alpha) (new 'static 'gs-miptbp :tbp1 #x58)) + (set! (-> s0-2 alpha) (new 'static 'gs-alpha :b #x2 :c #x1 :d #x1)) (set! (-> s0-2 prims 1) (gs-reg64 tex0-1)) (set! (-> s0-2 prims 3) (gs-reg64 tex1-1)) (set! (-> s0-2 prims 5) (gs-reg64 miptbp1-1)) diff --git a/goal_src/engine/level/load-boundary.gc b/goal_src/engine/level/load-boundary.gc index ade4a2b2e1..cb5fd9c4bd 100644 --- a/goal_src/engine/level/load-boundary.gc +++ b/goal_src/engine/level/load-boundary.gc @@ -102,7 +102,7 @@ ) (let ((s5-0 (the-as adgif-shader (-> arg1 base)))) (adgif-shader<-texture-simple! s5-0 (lookup-texture-by-id arg0)) - (set! (-> s5-0 alpha) (new 'static 'gs-miptbp :tbp1 #x44)) + (set! (-> s5-0 alpha) (new 'static 'gs-alpha :b #x1 :d #x1)) (set! (-> s5-0 tex0 tfx) 0) (set! (-> s5-0 tex1 mmag) 0) (set! (-> s5-0 clamp) (new 'static 'gs-clamp)) diff --git a/goal_src/engine/sparticle/sparticle-launcher.gc b/goal_src/engine/sparticle/sparticle-launcher.gc index 4750e0e23c..4847ae6f02 100644 --- a/goal_src/engine/sparticle/sparticle-launcher.gc +++ b/goal_src/engine/sparticle/sparticle-launcher.gc @@ -188,9 +188,7 @@ (set! (-> arg0 clamp-reg) (gs-reg64 zbuf-1)) ;; this is sometimes "gs-miptbp" instead. (set! (-> arg0 prims 9) (gs-reg64 alpha-1)) - - ;; should probably fix this type eventually... - (set! (-> arg0 alpha) (the gs-miptbp (new 'static 'gs-alpha :b #x1 :d #x1))) + (set! (-> arg0 alpha) (new 'static 'gs-alpha :b #x1 :d #x1)) ;; clamp is actually zbuf for sparticles, not gs-clamp. (set! (-> arg0 clamp) (the gs-clamp (new 'static 'gs-zbuf :zbp #x1c0 :psm (gs-psm ct24) :zmsk #x1))) @@ -506,7 +504,7 @@ ;; first time we get here, set up the adgif shader. (set! *death-adgif* (new 'static 'adgif-shader)) (particle-adgif *death-adgif* (new 'static 'texture-id :index #x18 :page #x2)) - (set! (-> *death-adgif* alpha) (new 'static 'gs-miptbp :tbp1 #x48)) ;; I think this is actually an alpha? + (set! (-> *death-adgif* alpha) (new 'static 'gs-alpha :b #x2 :d #x1)) ) ;; copy the death-adgif to the adgif of our particle diff --git a/goal_src/engine/sparticle/sparticle.gc b/goal_src/engine/sparticle/sparticle.gc index 05355a929a..78e6e84eb3 100644 --- a/goal_src/engine/sparticle/sparticle.gc +++ b/goal_src/engine/sparticle/sparticle.gc @@ -107,9 +107,7 @@ (-> gp-0 adgifdata-table s4-1) (the-as texture #f) ) - (set! (-> gp-0 adgifdata-table s4-1 alpha) - (new 'static 'gs-miptbp :tbp1 #x48) - ) + (set! (-> gp-0 adgifdata-table s4-1 alpha) (new 'static 'gs-alpha :b #x2 :d #x1)) ) ) gp-0 diff --git a/goal_src/engine/target/sidekick.gc b/goal_src/engine/target/sidekick.gc index 40439e366c..9abb25e54c 100644 --- a/goal_src/engine/target/sidekick.gc +++ b/goal_src/engine/target/sidekick.gc @@ -211,9 +211,9 @@ (if (logtest? (-> self skel status) 72) (merc-blend-shape self) ) - ; (if (logtest? (-> self skel status) 384) - ; (merc-eye-anim self) - ; ) + (if (logtest? (-> self skel status) 384) + (merc-eye-anim self) + ) (none) ) ) diff --git a/goalc/compiler/compilation/Static.cpp b/goalc/compiler/compilation/Static.cpp index 0be48714d5..9ac4f3042c 100644 --- a/goalc/compiler/compilation/Static.cpp +++ b/goalc/compiler/compilation/Static.cpp @@ -352,7 +352,21 @@ Val* Compiler::compile_bitfield_definition(const goos::Object& form, if (is_integer(field_info.result_type) || field_info.result_type.base_type() == "pointer") { // first, try as a constant s64 value = 0; - if (!try_getting_constant_integer(field_value, &value, env)) { + bool got_constant = false; + got_constant = try_getting_constant_integer(field_value, &value, env); + if (!got_constant && is_bitfield(field_info.result_type) && !allow_dynamic_construction) { + auto static_result = compile_static(field_value, env); + if (static_result.is_constant_data()) { + auto constant_data = static_result.constant(); + if (constant_data.size() == 8) { + typecheck(field_value, field_info.result_type, static_result.typespec(), + "Type of static constant"); + got_constant = true; + value = constant_data.value_64(); + } + } + } + if (!got_constant) { // failed to get as constant, add to dynamic or error. if (allow_dynamic_construction) { DynamicDef dyn; diff --git a/test/decompiler/reference/engine/anim/joint_REF.gc b/test/decompiler/reference/engine/anim/joint_REF.gc index d0553418b3..935137ee41 100644 --- a/test/decompiler/reference/engine/anim/joint_REF.gc +++ b/test/decompiler/reference/engine/anim/joint_REF.gc @@ -347,11 +347,11 @@ (+! (-> arg0 data 66 total) (logand -16 (+ v1-22 15))) ) ) - (when (and (nonzero? (-> obj _unknown)) (-> obj _unknown)) + (when (and (nonzero? (-> obj eye-anim-data)) (-> obj eye-anim-data)) (set! (-> arg0 length) (max 109 (-> arg0 length))) (set! (-> arg0 data 108 name) "eye-anim") (+! (-> arg0 data 108 count) 1) - (let ((v1-41 (* (* (+ (-> obj _unknown 0) 1) 2) 8))) + (let ((v1-41 (* (* (+ (-> obj eye-anim-data max-frame) 1) 2) 8))) (+! (-> arg0 data 108 used) v1-41) (+! (-> arg0 data 108 total) (logand -16 (+ v1-41 15))) ) diff --git a/test/decompiler/reference/engine/data/art-h_REF.gc b/test/decompiler/reference/engine/data/art-h_REF.gc index de0e24fdc3..fbe513c03c 100644 --- a/test/decompiler/reference/engine/data/art-h_REF.gc +++ b/test/decompiler/reference/engine/data/art-h_REF.gc @@ -257,7 +257,7 @@ ;; definition of type art-joint-anim (deftype art-joint-anim (art-element) - ((_unknown (pointer int16) :offset 4) + ((eye-anim-data merc-eye-anim-block :offset 4) (speed float :offset 20) (artist-base float :offset 24) (artist-step float :offset 28) diff --git a/test/decompiler/reference/engine/draw/process-drawable_REF.gc b/test/decompiler/reference/engine/draw/process-drawable_REF.gc index ae65c90b56..5db0477a84 100644 --- a/test/decompiler/reference/engine/draw/process-drawable_REF.gc +++ b/test/decompiler/reference/engine/draw/process-drawable_REF.gc @@ -976,7 +976,7 @@ (merc-blend-shape obj) ) (if (logtest? (-> obj skel status) 384) - (merc-eye-anim (the-as manipy obj)) + (merc-eye-anim obj) ) (label cfg-27) (let ((a0-17 (-> gp-0 effect))) diff --git a/test/decompiler/reference/engine/game/generic-obs_REF.gc b/test/decompiler/reference/engine/game/generic-obs_REF.gc index 6c3f33b037..b38d7d5f4c 100644 --- a/test/decompiler/reference/engine/game/generic-obs_REF.gc +++ b/test/decompiler/reference/engine/game/generic-obs_REF.gc @@ -61,7 +61,7 @@ (merc-blend-shape self) ) (if (logtest? (-> self skel status) 384) - (merc-eye-anim (the-as manipy self)) + (merc-eye-anim self) ) ) (else diff --git a/test/decompiler/reference/engine/gfx/eye-h_REF.gc b/test/decompiler/reference/engine/gfx/eye-h_REF.gc index 605ee772e9..85349c702e 100644 --- a/test/decompiler/reference/engine/gfx/eye-h_REF.gc +++ b/test/decompiler/reference/engine/gfx/eye-h_REF.gc @@ -3,13 +3,13 @@ ;; definition of type eye (deftype eye (structure) - ((data uint128 2 :offset-assert 0) - (x float :offset 0) - (y float :offset 4) - (lid float :offset 8) - (iris-scale float :offset 16) - (pupil-scale float :offset 20) - (lid-scale float :offset 24) + ((data vector 2 :inline :offset-assert 0) + (x float :offset 0) + (y float :offset 4) + (lid float :offset 8) + (iris-scale float :offset 16) + (pupil-scale float :offset 20) + (lid-scale float :offset 24) ) :method-count-assert 9 :size-assert #x20 @@ -20,12 +20,12 @@ (defmethod inspect eye ((obj eye)) (format #t "[~8x] ~A~%" obj 'eye) (format #t "~Tdata[2] @ #x~X~%" (-> obj data)) - (format #t "~Tx: ~f~%" (-> obj x)) - (format #t "~Ty: ~f~%" (-> obj y)) - (format #t "~Tlid: ~f~%" (-> obj lid)) - (format #t "~Tiris-scale: ~f~%" (-> obj iris-scale)) - (format #t "~Tpupil-scale: ~f~%" (-> obj pupil-scale)) - (format #t "~Tlid-scale: ~f~%" (-> obj lid-scale)) + (format #t "~Tx: ~f~%" (-> obj data 0 x)) + (format #t "~Ty: ~f~%" (-> obj data 0 y)) + (format #t "~Tlid: ~f~%" (-> obj data 0 z)) + (format #t "~Tiris-scale: ~f~%" (-> obj data 1 x)) + (format #t "~Tpupil-scale: ~f~%" (-> obj data 1 y)) + (format #t "~Tlid-scale: ~f~%" (-> obj data 1 z)) obj ) diff --git a/test/decompiler/reference/engine/gfx/eye_REF.gc b/test/decompiler/reference/engine/gfx/eye_REF.gc index ad9c451a9d..ea190206dd 100644 --- a/test/decompiler/reference/engine/gfx/eye_REF.gc +++ b/test/decompiler/reference/engine/gfx/eye_REF.gc @@ -57,20 +57,22 @@ (s3-0 (+ (* arg2 32) 32)) (s2-0 (* arg2 32)) ) - (let ((f28-0 (* 16.0 (+ (the float (+ s4-0 16)) (* 32.0 (-> arg1 left x))))) - (f26-0 (* 16.0 (+ (the float (+ s3-0 16)) (* 32.0 (-> arg1 left y))))) - (f30-0 (* 16.0 (+ (the float (+ s4-0 48)) (* 32.0 (-> arg1 right x))))) + (let ((f28-0 (* 16.0 (+ (the float (+ s4-0 16)) (* 32.0 (-> arg1 left data 0 x))))) + (f26-0 (* 16.0 (+ (the float (+ s3-0 16)) (* 32.0 (-> arg1 left data 0 y))))) + (f30-0 (* 16.0 (+ (the float (+ s4-0 48)) (* 32.0 (-> arg1 right data 0 x))))) ) - (set! sv-16 (* 16.0 (+ (the float (+ s3-0 16)) (* 32.0 (-> arg1 right y))))) + (set! sv-16 (* 16.0 (+ (the float (+ s3-0 16)) (* 32.0 (-> arg1 right data 0 y))))) (let ((s1-0 (-> arg1 shaders 0))) (let ((v1-6 (the-as object (-> arg0 base)))) (set! (-> (the-as dma-gif-packet v1-6) dma-vif quad) (-> *eye-work* adgif-tmpl dma-vif quad)) (set! (-> (the-as dma-gif-packet v1-6) quad 1) (-> *eye-work* adgif-tmpl quad 1)) - (let ((s0-0 (the-as (pointer uint64) (&+ (the-as pointer v1-6) 32)))) - (quad-copy! s0-0 (the-as pointer s1-0) 5) - (set! (-> s0-0 6) (the-as uint #x7c0007c005)) - (set! (-> s0-0 8) (the-as uint 68)) - (set! (-> s0-0 9) (the-as uint 66)) + (let ((s0-0 (the-as adgif-shader (&+ (the-as pointer v1-6) 32)))) + (quad-copy! (the-as pointer s0-0) (the-as pointer s1-0) 5) + (set! (-> s0-0 clamp) + (new 'static 'gs-clamp :wms (gs-tex-wrap-mode clamp) :wmt (gs-tex-wrap-mode clamp) :maxu #x1f :maxv #x1f) + ) + (set! (-> s0-0 alpha) (new 'static 'gs-alpha :b #x1 :d #x1)) + (set! (-> s0-0 prims 9) (gs-reg64 alpha-1)) ) ) (&+! (-> arg0 base) 112) @@ -173,7 +175,7 @@ (set! (-> (the-as (pointer gs-reg64) a2-11) 1) (gs-reg64 scissor-1)) (set! (-> a1-24 base) (&+ a2-11 16)) ) - (let* ((f0-6 (* 256.0 (-> arg1 left iris-scale))) + (let* ((f0-6 (* 256.0 (-> arg1 left data 1 x))) (a1-25 (the-as (inline-array vector4w) (-> arg0 base))) (a2-13 (the int (- f28-0 f0-6))) (t0-5 (the int (- f26-0 f0-6))) @@ -232,7 +234,7 @@ (set! (-> (the-as (pointer gs-reg64) a2-21) 1) (gs-reg64 scissor-1)) (set! (-> a1-31 base) (&+ a2-21 16)) ) - (let* ((f0-10 (* 256.0 (-> arg1 right iris-scale))) + (let* ((f0-10 (* 256.0 (-> arg1 right data 1 x))) (a1-32 (the-as (inline-array vector4w) (-> arg0 base))) (a2-23 (the int (- f30-0 f0-10))) (t0-11 (the int (- sv-16 f0-10))) @@ -297,11 +299,13 @@ (let ((v1-28 (the-as object (-> arg0 base)))) (set! (-> (the-as (inline-array vector4w) v1-28) 0 quad) (-> *eye-work* adgif-tmpl dma-vif quad)) (set! (-> (the-as (inline-array vector4w) v1-28) 1 quad) (-> *eye-work* adgif-tmpl quad 1)) - (let ((s0-1 (the-as (pointer uint64) (&+ (the-as pointer v1-28) 32)))) - (quad-copy! s0-1 (the-as pointer s1-1) 5) - (set! (-> s0-1 6) (the-as uint #x7c0007c005)) - (set! (-> s0-1 8) (the-as uint 68)) - (set! (-> s0-1 9) (the-as uint 66)) + (let ((s0-1 (the-as adgif-shader (&+ (the-as pointer v1-28) 32)))) + (quad-copy! (the-as pointer s0-1) (the-as pointer s1-1) 5) + (set! (-> s0-1 clamp) + (new 'static 'gs-clamp :wms (gs-tex-wrap-mode clamp) :wmt (gs-tex-wrap-mode clamp) :maxu #x1f :maxv #x1f) + ) + (set! (-> s0-1 alpha) (new 'static 'gs-alpha :b #x1 :d #x1)) + (set! (-> s0-1 prims 9) (gs-reg64 alpha-1)) ) ) (&+! (-> arg0 base) 112) @@ -351,7 +355,7 @@ (set! (-> (the-as (pointer gs-reg64) a2-31) 1) (gs-reg64 scissor-1)) (set! (-> a1-47 base) (&+ a2-31 16)) ) - (let* ((f0-14 (* 256.0 (-> arg1 left pupil-scale))) + (let* ((f0-14 (* 256.0 (-> arg1 left data 1 y))) (a1-48 (the-as (inline-array vector4w) (-> arg0 base))) (a2-33 (the int (- f28-0 f0-14))) (t0-17 (the int (- f26-0 f0-14))) @@ -415,7 +419,7 @@ (set! (-> (the-as (pointer gs-reg64) a2-41) 1) (gs-reg64 scissor-1)) (set! (-> a1-54 base) (&+ a2-41 16)) ) - (let* ((f0-18 (* 256.0 (-> arg1 right pupil-scale))) + (let* ((f0-18 (* 256.0 (-> arg1 right data 1 y))) (a1-55 (the-as (inline-array vector4w) (-> arg0 base))) (a2-43 (the int (- f30-0 f0-18))) (t0-23 (the int (- sv-16 f0-18))) @@ -480,20 +484,22 @@ (let ((v1-43 (the-as object (-> arg0 base)))) (set! (-> (the-as dma-gif-packet v1-43) dma-vif quad) (-> *eye-work* adgif-tmpl dma-vif quad)) (set! (-> (the-as dma-gif-packet v1-43) quad 1) (-> *eye-work* adgif-tmpl quad 1)) - (let ((s0-2 (the-as (pointer uint64) (&+ (the-as pointer v1-43) 32)))) - (quad-copy! s0-2 (the-as pointer s1-2) 5) - (set! (-> s0-2 6) (the-as uint #x7c0007c005)) - (set! (-> s0-2 8) (the-as uint 1)) - (set! (-> s0-2 9) (the-as uint 66)) + (let ((s0-2 (the-as adgif-shader (&+ (the-as pointer v1-43) 32)))) + (quad-copy! (the-as pointer s0-2) (the-as pointer s1-2) 5) + (set! (-> s0-2 clamp) + (new 'static 'gs-clamp :wms (gs-tex-wrap-mode clamp) :wmt (gs-tex-wrap-mode clamp) :maxu #x1f :maxv #x1f) + ) + (set! (-> s0-2 alpha) (new 'static 'gs-alpha :a #x1)) + (set! (-> s0-2 prims 9) (gs-reg64 alpha-1)) ) ) (set! (-> arg0 base) (-> (the-as (inline-array dma-gif-packet) (-> arg0 base)) 3 gif)) (let ((v1-50 (ash 16 (-> s1-2 tex0 tw))) (a0-66 (ash 16 (-> s1-2 tex0 th))) ) - (when (< (-> arg1 left lid) 0.0) - (let ((f0-23 (+ 1.0 (-> arg1 left lid)))) - (set! (-> arg1 left lid) (+ f0-23 (* (- 1.0 f0-23) (-> arg1 blink)))) + (when (< (-> arg1 left data 0 z) 0.0) + (let ((f0-23 (+ 1.0 (-> arg1 left data 0 z)))) + (set! (-> arg1 left data 0 z) (+ f0-23 (* (- 1.0 f0-23) (-> arg1 blink)))) ) ) (let* ((a1-70 arg0) @@ -539,12 +545,12 @@ (set! (-> (the-as (pointer gs-reg64) a2-51) 1) (gs-reg64 scissor-1)) (set! (-> a1-72 base) (&+ a2-51 16)) ) - (let* ((f0-27 (+ (the float (+ s3-0 -32)) (* 32.0 (-> arg1 left lid)))) + (let* ((f0-27 (+ (the float (+ s3-0 -32)) (* 32.0 (-> arg1 left data 0 z)))) (a1-74 (the-as (inline-array vector4w) (-> arg0 base))) (a2-53 (* s4-0 16)) (t0-29 (the int (* 16.0 f0-27))) (a3-52 (* (+ s4-0 32) 16)) - (t1-6 (the int (* 16.0 (+ f0-27 (* 32.0 (-> arg1 left lid-scale)))))) + (t1-6 (the int (* 16.0 (+ f0-27 (* 32.0 (-> arg1 left data 1 z)))))) ) (set! (-> a1-74 0 quad) (-> *eye-work* sprite-tmpl2 dma-vif quad)) (set! (-> a1-74 1 quad) (-> *eye-work* sprite-tmpl2 quad 1)) @@ -555,9 +561,9 @@ (set-vector! (-> a1-74 6) a3-52 t1-6 #xffffff 0) ) (set! (-> arg0 base) (the-as pointer (-> (the-as (inline-array vector4w) (-> arg0 base)) 7))) - (when (< (-> arg1 right lid) 0.0) - (let ((f0-33 (+ 1.0 (-> arg1 right lid)))) - (set! (-> arg1 right lid) (+ f0-33 (* (- 1.0 f0-33) (-> arg1 blink)))) + (when (< (-> arg1 right data 0 z) 0.0) + (let ((f0-33 (+ 1.0 (-> arg1 right data 0 z)))) + (set! (-> arg1 right data 0 z) (+ f0-33 (* (- 1.0 f0-33) (-> arg1 blink)))) ) ) (let* ((a1-80 arg0) @@ -602,12 +608,12 @@ (set! (-> (the-as (pointer gs-reg64) a2-61) 1) (gs-reg64 scissor-1)) (set! (-> a1-82 base) (&+ a2-61 16)) ) - (let* ((f0-37 (+ (the float (+ s3-0 -32)) (* 32.0 (-> arg1 right lid)))) + (let* ((f0-37 (+ (the float (+ s3-0 -32)) (* 32.0 (-> arg1 right data 0 z)))) (a1-84 (the-as (inline-array vector4w) (-> arg0 base))) (a2-64 (* (+ s4-0 64) 16)) (t0-35 (the int (* 16.0 f0-37))) (a3-63 (* (+ s4-0 32) 16)) - (t1-7 (the int (* 16.0 (+ f0-37 (* 32.0 (-> arg1 left lid-scale)))))) + (t1-7 (the int (* 16.0 (+ f0-37 (* 32.0 (-> arg1 left data 1 z)))))) ) (set! (-> a1-84 0 quad) (-> *eye-work* sprite-tmpl2 dma-vif quad)) (set! (-> a1-84 1 quad) (-> *eye-work* sprite-tmpl2 quad 1)) @@ -806,7 +812,7 @@ ) (dma-bucket-insert-tag (-> *display* frames (-> *display* on-screen) frame bucket-group) - (bucket-id bucket-54) + (bucket-id merc-eyes) gp-2 (the-as (pointer dma-tag) a3-5) ) @@ -823,7 +829,7 @@ (when (-> s5-3 shaders) (when (not (paused?)) (cond - ((and (>= (-> s5-3 left lid) 0.0) (>= (-> s5-3 right lid) 0.0)) + ((and (>= (-> s5-3 left data 0 z) 0.0) (>= (-> s5-3 right data 0 z) 0.0)) (set! (-> s5-3 random-time) (the-as uint 60)) (set! (-> s5-3 blink) 0.0) ) @@ -880,7 +886,7 @@ ) (dma-bucket-insert-tag (-> *display* frames (-> *display* on-screen) frame bucket-group) - (bucket-id bucket-54) + (bucket-id merc-eyes) s4-1 (the-as (pointer dma-tag) a3-7) ) @@ -1066,7 +1072,7 @@ ) (dma-bucket-insert-tag (-> *display* frames (-> *display* on-screen) frame bucket-group) - (bucket-id bucket-54) + (bucket-id merc-eyes) gp-6 (the-as (pointer dma-tag) a3-10) ) @@ -1086,7 +1092,7 @@ ) ;; definition for function convert-eye-data -(defun convert-eye-data ((arg0 box8s) (arg1 uint128)) +(defun convert-eye-data ((arg0 eye) (arg1 uint)) (local-vars (v0-0 float) (v1-0 uint128) @@ -1109,8 +1115,8 @@ (.mov vf2 v1-5) (vitof15.xyzw vf1 vf1) (vitof12.xyzw vf2 vf2) - (.svf (&-> arg0 min quad) vf1) - (.svf (&-> arg0 max quad) vf2) + (.svf (&-> arg0 data 0 quad) vf1) + (.svf (&-> arg0 data 1 quad) vf2) (.mov v0-0 vf2) v0-0 ) @@ -1118,7 +1124,7 @@ ;; definition for function merc-eye-anim ;; INFO: Return type mismatch int vs none. -(defun merc-eye-anim ((arg0 manipy)) +(defun merc-eye-anim ((arg0 process-drawable)) (let* ((s5-0 (-> arg0 draw mgeo header eye-ctrl)) (a0-1 (-> arg0 skel root-channel 0)) (s4-0 (-> a0-1 frame-group)) @@ -1127,11 +1133,11 @@ (nonzero? s5-0) (> (-> arg0 skel active-channels) 0) s4-0 - (nonzero? (-> s4-0 _unknown)) + (nonzero? (-> s4-0 eye-anim-data)) ) (let* ((v1-15 (-> *eye-control-array* data (-> s5-0 eye-slot))) - (s3-1 (min (the int (-> a0-1 frame-num)) (-> s4-0 _unknown 0))) - (s2-1 (min (+ (the int (-> a0-1 frame-num)) 1) (-> s4-0 _unknown 0))) + (s3-1 (min (the int (-> a0-1 frame-num)) (-> s4-0 eye-anim-data max-frame))) + (s2-1 (min (+ (the int (-> a0-1 frame-num)) 1) (-> s4-0 eye-anim-data max-frame))) (f0-4 (-> a0-1 frame-num)) (f30-0 (- f0-4 (* (the float (the int (/ f0-4 1.0))) 1.0))) ) @@ -1145,78 +1151,54 @@ ) ) ) - (let ((s1-0 (new 'stack-no-clear 'box8s)) - (s0-0 (new 'stack-no-clear 'vector)) + (let ((s1-0 (new 'stack-no-clear 'eye)) + (s0-0 (new 'stack-no-clear 'eye)) ) (cond - ((-> s4-0 _unknown) - (convert-eye-data - s1-0 - (the-as - uint128 - (-> (the-as (pointer int64) (&+ (the-as (pointer int64) (-> s4-0 _unknown)) (* (* s3-1 2) 8))) 1) - ) - ) - (convert-eye-data - (the-as box8s s0-0) - (the-as - uint128 - (-> (the-as (pointer int64) (&+ (the-as (pointer int64) (-> s4-0 _unknown)) (* (* s2-1 2) 8))) 1) - ) - ) + ((-> s4-0 eye-anim-data) + (convert-eye-data s1-0 (-> s4-0 eye-anim-data data (* s3-1 2) dword)) + (convert-eye-data s0-0 (-> s4-0 eye-anim-data data (* s2-1 2) dword)) (vector4-lerp! (the-as vector (+ (the-as uint (-> *eye-control-array* data 0 left)) (* 96 (-> s5-0 eye-slot)))) (the-as vector (-> s1-0 data)) - (the-as vector (&-> s0-0 x)) + (the-as vector (-> s0-0 data)) f30-0 ) (vector4-lerp! - (the-as vector (&+ (&-> *eye-control-array* data 0 left iris-scale) (* 96 (-> s5-0 eye-slot)))) - (-> s1-0 max) - (&+ s0-0 16) + (the-as vector (+ (the-as uint (-> *eye-control-array* data 0 left data 1)) (* 96 (-> s5-0 eye-slot)))) + (-> s1-0 data 1) + (-> s0-0 data 1) f30-0 ) - (convert-eye-data - s1-0 - (the-as - uint128 - (-> (the-as (pointer int64) (&+ (the-as (pointer int64) (-> s4-0 _unknown)) (* (+ (* s3-1 2) 1) 8))) 1) - ) - ) - (convert-eye-data - (the-as box8s s0-0) - (the-as - uint128 - (-> (the-as (pointer int64) (&+ (the-as (pointer int64) (-> s4-0 _unknown)) (* (+ (* s2-1 2) 1) 8))) 1) - ) - ) + (convert-eye-data s1-0 (-> s4-0 eye-anim-data data (+ (* s3-1 2) 1) dword)) + (convert-eye-data s0-0 (-> s4-0 eye-anim-data data (+ (* s2-1 2) 1) dword)) (vector4-lerp! (the-as vector (+ (the-as uint (-> *eye-control-array* data 0 right)) (* 96 (-> s5-0 eye-slot)))) (the-as vector (-> s1-0 data)) - (the-as vector (&-> s0-0 x)) + (the-as vector (-> s0-0 data)) f30-0 ) (vector4-lerp! - (the-as vector (&+ (&-> *eye-control-array* data 0 right iris-scale) (* 96 (-> s5-0 eye-slot)))) - (-> s1-0 max) - (&+ s0-0 16) + (the-as vector (+ (the-as uint (-> *eye-control-array* data 0 right data 1)) (* 96 (-> s5-0 eye-slot)))) + (-> s1-0 data 1) + (-> s0-0 data 1) f30-0 ) ) (else (let ((v1-37 (-> *eye-control-array* data (-> s5-0 eye-slot)))) - (set! (-> v1-37 left x) 0.0) - (set! (-> v1-37 left y) 0.0) - (set! (-> v1-37 left lid) -1.0) - (set! (-> v1-37 left iris-scale) 1.0) - (set! (-> v1-37 left pupil-scale) 1.0) - (set! (-> v1-37 left lid-scale) 1.0) - (set! (-> v1-37 right x) 0.0) - (set! (-> v1-37 right y) 0.0) - (set! (-> v1-37 right lid) -1.0) - (set! (-> v1-37 right iris-scale) 1.0) - (set! (-> v1-37 right pupil-scale) 1.0) - (set! (-> v1-37 right lid-scale) 1.0) + (set! (-> v1-37 left data 0 x) 0.0) + (set! (-> v1-37 left data 0 y) 0.0) + (set! (-> v1-37 left data 0 z) -1.0) + (set! (-> v1-37 left data 1 x) 1.0) + (set! (-> v1-37 left data 1 y) 1.0) + (set! (-> v1-37 left data 1 z) 1.0) + (set! (-> v1-37 right data 0 x) 0.0) + (set! (-> v1-37 right data 0 y) 0.0) + (set! (-> v1-37 right data 0 z) -1.0) + (set! (-> v1-37 right data 1 x) 1.0) + (set! (-> v1-37 right data 1 y) 1.0) + (set! (-> v1-37 right data 1 z) 1.0) ) ) ) diff --git a/test/decompiler/reference/engine/gfx/merc/merc-h_REF.gc b/test/decompiler/reference/engine/gfx/merc/merc-h_REF.gc index 7b74d9a496..bab630e364 100644 --- a/test/decompiler/reference/engine/gfx/merc/merc-h_REF.gc +++ b/test/decompiler/reference/engine/gfx/merc/merc-h_REF.gc @@ -423,6 +423,7 @@ (lid-scale int8 :offset-assert 6) (dword uint64 :offset 0) ) + :pack-me :method-count-assert 9 :size-assert #x8 :flag-assert #x900000008 @@ -443,8 +444,8 @@ ;; definition of type merc-eye-anim-block (deftype merc-eye-anim-block (structure) - ((max-frame int16 :offset-assert 0) - (data uint8 :dynamic :offset 8) + ((max-frame int16 :offset-assert 0) + (data merc-eye-anim-frame :inline :dynamic :offset 8) ) :method-count-assert 9 :size-assert #x8 diff --git a/test/decompiler/reference/engine/gfx/sky/sky-tng_REF.gc b/test/decompiler/reference/engine/gfx/sky/sky-tng_REF.gc index 719b5f5cc7..a2863e6c62 100644 --- a/test/decompiler/reference/engine/gfx/sky/sky-tng_REF.gc +++ b/test/decompiler/reference/engine/gfx/sky/sky-tng_REF.gc @@ -890,7 +890,7 @@ (set! (-> (the-as adgif-shader s4-0) clamp) (new 'static 'gs-clamp :wms (gs-tex-wrap-mode clamp) :wmt (gs-tex-wrap-mode clamp)) ) - (set! (-> (the-as adgif-shader s4-0) alpha) (new 'static 'gs-miptbp :tbp1 #x68 :tbw2 #x20)) + (set! (-> (the-as adgif-shader s4-0) alpha) (new 'static 'gs-alpha :b #x2 :c #x2 :d #x1 :fix #x80)) ) (cond (*sky-drawn* @@ -929,7 +929,7 @@ (set! (-> (the-as adgif-shader s4-0) clamp) (new 'static 'gs-clamp :wms (gs-tex-wrap-mode clamp) :wmt (gs-tex-wrap-mode clamp)) ) - (set! (-> (the-as adgif-shader s4-0) alpha) (new 'static 'gs-miptbp :tbp1 #x68 :tbw2 #x20)) + (set! (-> (the-as adgif-shader s4-0) alpha) (new 'static 'gs-alpha :b #x2 :c #x2 :d #x1 :fix #x80)) ) (cond (*cloud-drawn* diff --git a/test/decompiler/reference/engine/gfx/sprite/sprite_REF.gc b/test/decompiler/reference/engine/gfx/sprite/sprite_REF.gc index 55a32c1f01..87ea57a1ee 100644 --- a/test/decompiler/reference/engine/gfx/sprite/sprite_REF.gc +++ b/test/decompiler/reference/engine/gfx/sprite/sprite_REF.gc @@ -354,7 +354,7 @@ ) ) (set! (-> data screen-shader prims 9) (gs-reg64 alpha-1)) - (set! (-> data screen-shader alpha) (new 'static 'gs-miptbp :tbp1 #x44)) + (set! (-> data screen-shader alpha) (new 'static 'gs-alpha :b #x1 :d #x1)) (set! (-> data sincos-01 z) 0.999998) (set! (-> data sincos-23 z) -0.16666014) (set! (-> data sincos-45 z) 0.008326521) @@ -797,8 +797,8 @@ ) (adgif-shader<-texture-simple! dma-adgif-data *shadow-middot-texture*) (if (logtest? (-> in-adgif-data flags) 1) - (set! (-> dma-adgif-data alpha) (new 'static 'gs-miptbp :tbp1 #x48)) - (set! (-> dma-adgif-data alpha) (new 'static 'gs-miptbp :tbp1 #x42)) + (set! (-> dma-adgif-data alpha) (new 'static 'gs-alpha :b #x2 :d #x1)) + (set! (-> dma-adgif-data alpha) (new 'static 'gs-alpha :a #x2 :d #x1)) ) ) (&+! (-> dma-buff base) 80) diff --git a/test/decompiler/reference/engine/gfx/texture-h_REF.gc b/test/decompiler/reference/engine/gfx/texture-h_REF.gc index 7dcd429b34..560c642ad6 100644 --- a/test/decompiler/reference/engine/gfx/texture-h_REF.gc +++ b/test/decompiler/reference/engine/gfx/texture-h_REF.gc @@ -308,17 +308,18 @@ ;; definition of type adgif-shader (deftype adgif-shader (structure) - ((quad qword 5 :inline :offset 0) - (prims gs-reg64 10 :offset 0) - (tex0 gs-tex0 :offset 0) - (tex1 gs-tex1 :offset 16) - (miptbp1 gs-miptbp :offset 32) - (clamp gs-clamp :offset 48) - (clamp-reg gs-reg64 :offset 56) - (alpha gs-miptbp :offset 64) - (link-test link-test-flags :offset 8) - (texture-id texture-id :offset 24) - (next shader-ptr :offset 40) + ((quad qword 5 :inline :offset 0) + (prims gs-reg64 10 :offset 0) + (tex0 gs-tex0 :offset 0) + (tex1 gs-tex1 :offset 16) + (miptbp1 gs-miptbp :offset 32) + (clamp gs-clamp :offset 48) + (clamp-reg gs-reg64 :offset 56) + (alpha gs-alpha :offset 64) + (alpha-as-miptb2 gs-miptbp :offset 64) + (link-test link-test-flags :offset 8) + (texture-id texture-id :offset 24) + (next shader-ptr :offset 40) ) :method-count-assert 9 :size-assert #x50 diff --git a/test/decompiler/reference/engine/gfx/texture_REF.gc b/test/decompiler/reference/engine/gfx/texture_REF.gc index 40ad50a231..a885914237 100644 --- a/test/decompiler/reference/engine/gfx/texture_REF.gc +++ b/test/decompiler/reference/engine/gfx/texture_REF.gc @@ -2529,47 +2529,7 @@ ) ;; definition for function adgif-shader<-texture! -(defun adgif-shader<-texture! ((arg0 adgif-shader) (arg1 texture)) - (set! (-> arg0 tex1 mxl) (+ (-> arg1 num-mips) -1)) - (set! (-> arg0 tex1 l) (-> arg1 mip-shift)) - (set! (-> arg0 tex1 mmag) (logand (-> arg1 tex1-control) 1)) - (set! (-> arg0 tex1 mmin) (shr (-> arg1 tex1-control) 1)) - (set! (-> arg0 tex0) (new 'static 'gs-tex0 - :tcc #x1 - :cld #x1 - :cpsm (-> arg1 clutpsm) - :cbp (-> arg1 clutdest) - :tfx (-> arg0 tex0 tfx) - :th (log2 (-> arg1 h)) - :tw (log2 (-> arg1 w)) - :tbw (-> arg1 width 0) - :tbp0 (-> arg1 dest 0) - :psm (the-as int (-> arg1 psm)) - ) - ) - (set! (-> arg0 miptbp1) (new 'static 'gs-miptbp - :tbp1 (-> arg1 dest 1) - :tbw1 (-> arg1 width 1) - :tbp2 (-> arg1 dest 2) - :tbw2 (-> arg1 width 2) - :tbp3 (-> arg1 dest 3) - :tbw3 (-> arg1 width 3) - ) - ) - (when (< (the-as uint 4) (-> arg1 num-mips)) - (set! (-> arg0 alpha) (new 'static 'gs-miptbp - :tbp1 (-> arg1 dest 4) - :tbw1 (-> arg1 width 4) - :tbp2 (-> arg1 dest 5) - :tbw2 (-> arg1 width 5) - :tbp3 (-> arg1 dest 6) - :tbw3 (-> arg1 width 6) - ) - ) - (set! (-> (&-> arg0 quad 4 vector4w z) 0) 54) - ) - arg0 - ) +;; ERROR: function was not converted to expressions. Cannot decompile. ;; definition for function adgif-shader-update! ;; INFO: Return type mismatch gs-tex1 vs none. @@ -2686,7 +2646,7 @@ (adgif-shader<-texture! arg0 arg1) ) (set! (-> arg0 clamp) (new 'static 'gs-clamp :wms (gs-tex-wrap-mode clamp) :wmt (gs-tex-wrap-mode clamp))) - (set! (-> arg0 alpha) (new 'static 'gs-miptbp :tbp1 #x44)) + (set! (-> arg0 alpha) (new 'static 'gs-alpha :b #x1 :d #x1)) (set! (-> arg0 prims 1) (gs-reg64 tex0-1)) (set! (-> arg0 prims 3) (gs-reg64 tex1-1)) (set! (-> arg0 prims 5) (gs-reg64 miptbp1-1)) diff --git a/test/decompiler/reference/engine/gfx/tie/prototype_REF.gc b/test/decompiler/reference/engine/gfx/tie/prototype_REF.gc index fa68682de7..e24ebea1e1 100644 --- a/test/decompiler/reference/engine/gfx/tie/prototype_REF.gc +++ b/test/decompiler/reference/engine/gfx/tie/prototype_REF.gc @@ -18,7 +18,7 @@ (adgif-shader-login-no-remap s4-1) (set! (-> s4-1 tex1) (new 'static 'gs-tex1 :mmag #x1 :mmin #x1)) (set! (-> s4-1 clamp) (new 'static 'gs-clamp :wms (gs-tex-wrap-mode clamp) :wmt (gs-tex-wrap-mode clamp))) - (set! (-> s4-1 alpha) (new 'static 'gs-miptbp :tbp1 #x58)) + (set! (-> s4-1 alpha) (new 'static 'gs-alpha :b #x2 :c #x1 :d #x1)) (set! (-> s4-1 prims 1) (gs-reg64 tex0-1)) (set! (-> s4-1 prims 3) (gs-reg64 tex1-1)) (set! (-> s4-1 prims 5) (gs-reg64 miptbp1-1)) diff --git a/test/decompiler/reference/engine/level/level_REF.gc b/test/decompiler/reference/engine/level/level_REF.gc index 6c6f26dc23..981ca91d67 100644 --- a/test/decompiler/reference/engine/level/level_REF.gc +++ b/test/decompiler/reference/engine/level/level_REF.gc @@ -596,7 +596,7 @@ (adgif-shader-login-no-remap s0-2) (set! (-> s0-2 tex1) (new 'static 'gs-tex1 :mmag #x1 :mmin #x1)) (set! (-> s0-2 clamp) (new 'static 'gs-clamp :wms (gs-tex-wrap-mode clamp) :wmt (gs-tex-wrap-mode clamp))) - (set! (-> s0-2 alpha) (new 'static 'gs-miptbp :tbp1 #x58)) + (set! (-> s0-2 alpha) (new 'static 'gs-alpha :b #x2 :c #x1 :d #x1)) (set! (-> s0-2 prims 1) (gs-reg64 tex0-1)) (set! (-> s0-2 prims 3) (gs-reg64 tex1-1)) (set! (-> s0-2 prims 5) (gs-reg64 miptbp1-1)) diff --git a/test/decompiler/reference/engine/level/load-boundary_REF.gc b/test/decompiler/reference/engine/level/load-boundary_REF.gc index a9f919ca12..b5b75d2057 100644 --- a/test/decompiler/reference/engine/level/load-boundary_REF.gc +++ b/test/decompiler/reference/engine/level/load-boundary_REF.gc @@ -51,7 +51,7 @@ ) (let ((s5-0 (the-as adgif-shader (-> arg1 base)))) (adgif-shader<-texture-simple! s5-0 (lookup-texture-by-id arg0)) - (set! (-> s5-0 alpha) (new 'static 'gs-miptbp :tbp1 #x44)) + (set! (-> s5-0 alpha) (new 'static 'gs-alpha :b #x1 :d #x1)) (set! (-> s5-0 tex0 tfx) 0) (set! (-> s5-0 tex1 mmag) 0) (set! (-> s5-0 clamp) (new 'static 'gs-clamp)) diff --git a/test/decompiler/reference/engine/sparticle/sparticle-launcher_REF.gc b/test/decompiler/reference/engine/sparticle/sparticle-launcher_REF.gc index 14bf03565b..26fa91aab3 100644 --- a/test/decompiler/reference/engine/sparticle/sparticle-launcher_REF.gc +++ b/test/decompiler/reference/engine/sparticle/sparticle-launcher_REF.gc @@ -409,7 +409,7 @@ (set! (-> arg0 prims 5) (gs-reg64 miptbp1-1)) (set! (-> arg0 clamp-reg) (gs-reg64 zbuf-1)) (set! (-> arg0 prims 9) (gs-reg64 alpha-1)) - (set! (-> arg0 alpha) (new 'static 'gs-miptbp :tbp1 #x44)) + (set! (-> arg0 alpha) (new 'static 'gs-alpha :b #x1 :d #x1)) (set! (-> arg0 clamp) (new 'static 'gs-clamp :minu #x1c :minv #x101)) 0 (none) @@ -653,7 +653,7 @@ (when (not *death-adgif*) (set! *death-adgif* (new 'static 'adgif-shader)) (particle-adgif *death-adgif* (new 'static 'texture-id :index #x18 :page #x2)) - (set! (-> *death-adgif* alpha) (new 'static 'gs-miptbp :tbp1 #x48)) + (set! (-> *death-adgif* alpha) (new 'static 'gs-alpha :b #x2 :d #x1)) ) (let ((v1-14 (-> *death-adgif* quad 0 quad))) (set! (-> gp-0 adgif quad 0 quad) v1-14) diff --git a/test/decompiler/reference/engine/sparticle/sparticle_REF.gc b/test/decompiler/reference/engine/sparticle/sparticle_REF.gc index e98ec04545..5f1ba5c726 100644 --- a/test/decompiler/reference/engine/sparticle/sparticle_REF.gc +++ b/test/decompiler/reference/engine/sparticle/sparticle_REF.gc @@ -78,7 +78,7 @@ ) (set! (-> gp-0 cpuinfo-table s4-1 adgif) (-> gp-0 adgifdata-table s4-1)) (adgif-shader<-texture-simple! (-> gp-0 adgifdata-table s4-1) (the-as texture #f)) - (set! (-> gp-0 adgifdata-table s4-1 alpha) (new 'static 'gs-miptbp :tbp1 #x48)) + (set! (-> gp-0 adgifdata-table s4-1 alpha) (new 'static 'gs-alpha :b #x2 :d #x1)) ) ) gp-0 diff --git a/test/decompiler/reference/engine/target/sidekick_REF.gc b/test/decompiler/reference/engine/target/sidekick_REF.gc index 31177339ea..d7cc57ec81 100644 --- a/test/decompiler/reference/engine/target/sidekick_REF.gc +++ b/test/decompiler/reference/engine/target/sidekick_REF.gc @@ -207,7 +207,7 @@ (merc-blend-shape self) ) (if (logtest? (-> self skel status) 384) - (merc-eye-anim (the-as manipy self)) + (merc-eye-anim self) ) (none) )