[graphics] eyes (#1169)

* first draft eye renderer

* working

* working
This commit is contained in:
water111
2022-02-15 19:37:51 -05:00
committed by GitHub
parent b36199f4f8
commit c9fc4f0bf9
50 changed files with 926 additions and 443 deletions
+9
View File
@@ -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) {}
+13 -10
View File
@@ -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))
@@ -94,6 +94,9 @@
"vif1-handler", // F: weird asm for interrupt handler
"vif1-handler-debug",
// texture
"adgif-shader<-texture!",
// vector
"vector=", // asm branching
@@ -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!": []
@@ -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": []
+1
View File
@@ -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
+1 -1
View File
@@ -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:
+4 -5
View File
@@ -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;
@@ -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<TexturePool> _texture_pool)
: texture_pool(_texture_pool) {}
@@ -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);
}
@@ -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<false>(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(&reg_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 <bool blend, bool bilinear>
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 <bool blend>
void draw_eye(u32* out,
const EyeDraw& draw,
const TextureRecord& tex,
int pair,
int lr,
bool flipx,
bool bilinear) {
if (bilinear) {
draw_eye_impl<blend, true>(out, draw, tex, pair, lr, flipx);
} else {
draw_eye_impl<blend, false>(out, draw, tex, pair, lr, flipx);
}
}
template <bool DEBUG>
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<false>(m_left, draw1, *tex0, pair_idx, 0, false, m_use_bilinear);
draw_eye<false>(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<true>(m_left, draw1, *tex1, pair_idx, 0, false, m_use_bilinear);
draw_eye<true>(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<false>(m_left, draw1, *tex2, pair_idx, 0, false, m_use_bilinear);
draw_eye<false>(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<TextureRecord>();
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();
}
@@ -0,0 +1,31 @@
#pragma once
#include <string>
#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 <bool DEBUG>
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];
};
@@ -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<MercRenderer>("merc-pris-1", BucketId::MERC_PRIS_LEVEL1); // 52
// 53
// 54?
init_bucket_renderer<MercRenderer>("merc-after-pris", BucketId::MERC_AFTER_PRIS); // 55
init_bucket_renderer<EyeRenderer>("merc-eyes-after-pris", BucketId::MERC_EYES_AFTER_PRIS); // 54
init_bucket_renderer<MercRenderer>("merc-after-pris", BucketId::MERC_AFTER_PRIS); // 55
// 56?
//-----------------------
+1 -1
View File
@@ -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;
+2 -2
View File
@@ -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)))
)
+2 -1
View File
@@ -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)
+1 -1
View File
@@ -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
+1 -1
View File
@@ -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*)
+3 -3
View File
@@ -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
+2 -1
View File
@@ -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)
+208 -185
View File
@@ -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)
)
+2 -1
View File
@@ -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
+4 -18
View File
@@ -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*
+3 -3
View File
@@ -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)
+2 -1
View File
@@ -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
+2 -3
View File
@@ -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))
+1 -1
View File
@@ -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))
+1 -1
View File
@@ -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))
+1 -1
View File
@@ -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))
@@ -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
+1 -3
View File
@@ -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
+3 -3
View File
@@ -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)
)
)
+15 -1
View File
@@ -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;
+2 -2
View File
@@ -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)))
)
+1 -1
View File
@@ -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)
+1 -1
View File
@@ -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)))
+1 -1
View File
@@ -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
+13 -13
View File
@@ -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
)
+77 -95
View File
@@ -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)
)
)
)
+3 -2
View File
@@ -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
+2 -2
View File
@@ -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*
+3 -3
View File
@@ -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)
+12 -11
View File
@@ -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
+2 -42
View File
@@ -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))
+1 -1
View File
@@ -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))
+1 -1
View File
@@ -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))
+1 -1
View File
@@ -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))
+2 -2
View File
@@ -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)
+1 -1
View File
@@ -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
+1 -1
View File
@@ -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)
)