mirror of
https://github.com/open-goal/jak-project
synced 2026-07-08 14:36:52 -04:00
@@ -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) {}
|
||||
|
||||
@@ -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": []
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -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(®_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?
|
||||
|
||||
//-----------------------
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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)))
|
||||
)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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*)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
@@ -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)
|
||||
)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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*
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
|
||||
@@ -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))
|
||||
|
||||
@@ -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))
|
||||
|
||||
@@ -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))
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
)
|
||||
)
|
||||
|
||||
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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)
|
||||
)
|
||||
|
||||
Reference in New Issue
Block a user