Start setting up texture animation for jak 3. (#3524)

For now, this just adds sky (clouds and fog), darkjak, and skull gem.

There are some unknown issues with drawing the skull gems still, but I
think it's unrelated to texture animations.

Also fixes https://github.com/open-goal/jak-project/issues/3523
pull/3266/head
water111 2024-05-18 11:23:48 -04:00 committed by GitHub
parent a61f24a168
commit 271007e552
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
20 changed files with 4238 additions and 633 deletions

View File

@ -42,7 +42,9 @@ std::vector<std::string> jak2_slots = {
"cas-toxic-slime-scroll-dest",
};
std::vector<std::string> jak3_slots = {};
std::vector<std::string> jak3_slots = {
"skull-gem-dest", "jakc-arm", "jakc-eyebrow", "jakc-face", "jakc-finger", "jakc-hair",
};
} // namespace

View File

@ -6754,7 +6754,12 @@
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(deftype texture-anim-layer (structure)
((extra vector :inline :offset 240)
((interpolated-color vector :inline) ;; added
(interpolated-scale-offset vector :inline)
(interpolated-st-scale-offset vector :inline)
(interpolated-qs vector :inline)
(interpolated-rot vector :inline)
(extra vector :inline :offset 240)
(func (function dma-buffer uint int int texture-anim-layer float int) :offset-assert 256) ;; guessed by decompiler
(func-id symbol :offset-assert 256 :overlay-at func) ;; guessed by decompiler
(init-func (function texture-anim-layer int) :offset-assert 260) ;; guessed by decompiler
@ -6766,6 +6771,8 @@
(test gs-test :offset-assert 280) ;; gs-test
(alpha gs-alpha :offset-assert 288) ;; gs-alpha
(clamp gs-clamp :offset-assert 296) ;; gs-clamp
(start-vectors vector 5 :inline :offset 80 :score -10) ;; added
(start-color vector :inline :offset 80)
(start-scale vector2 :inline :offset 96)
(start-offset vector2 :inline :offset 104)
@ -6774,6 +6781,8 @@
(start-qs vector :inline :offset 128)
(start-rot degrees :offset 144) ;; degrees
(start-st-rot degrees :offset 148) ;; degrees
(end-vectors vector 5 :inline :offset 160 :score -10) ;; added
(end-color vector :inline :offset 160)
(end-scale vector2 :inline :offset 176)
(end-offset vector2 :inline :offset 184)
@ -30975,57 +30984,57 @@
;; texture-anim ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; (define-extern *texture-anim-work* object) ;; texture-anim-work
;; (define-extern texture-anim-layer-interp function) ;; (function texture-anim-layer float none)
;; (define-extern texture-anim-layer-add-shader function) ;; (function dma-buffer texture-anim-layer int none)
;; (define-extern texture-anim-layer-add-clut-shader function) ;; (function dma-buffer texture-anim-layer int none)
;; (define-extern texture-anim-layer-draw function) ;; (function dma-buffer int int texture-anim-layer none)
;; (define-extern default-texture-anim-layer-func function) ;; (function dma-buffer uint int int texture-anim-layer float int)
;; (define-extern blend-clut-texture-anim-layer-func function) ;; (function dma-buffer uint int int texture-anim-layer float int)
;; (define-extern add-clut-texture-anim-layer-func function)
;; (define-extern dest-blend-clut-texture-anim-layer-func function)
;; (define-extern move-rg-to-ba-texture-anim-layer-func function) ;; (function dma-buffer uint int int texture-anim-layer float int)
;; (define-extern fill-rgb-texture-anim-layer-func function) ;; (function dma-buffer uint int int texture-anim-layer float int)
;; (define-extern texture-anim-draw-mip-shader function)
;; (define-extern clear-texture-ids function)
;; (define-extern texture-anim-draw-mips function)
(define-extern *texture-anim-work* texture-anim-work)
(define-extern texture-anim-layer-interp (function texture-anim-layer float none))
(define-extern texture-anim-layer-add-shader (function dma-buffer texture-anim-layer int none))
(define-extern texture-anim-layer-add-clut-shader (function dma-buffer texture-anim-layer int none))
(define-extern texture-anim-layer-draw (function dma-buffer int int texture-anim-layer none))
(define-extern default-texture-anim-layer-func (function dma-buffer uint int int texture-anim-layer float int))
(define-extern blend-clut-texture-anim-layer-func (function dma-buffer uint int int texture-anim-layer float int))
(define-extern add-clut-texture-anim-layer-func (function dma-buffer uint int int texture-anim-layer float int))
(define-extern dest-blend-clut-texture-anim-layer-func (function dma-buffer uint int int texture-anim-layer float int))
(define-extern move-rg-to-ba-texture-anim-layer-func (function dma-buffer uint int int texture-anim-layer float int))
(define-extern fill-rgb-texture-anim-layer-func (function dma-buffer uint int int texture-anim-layer float int))
(define-extern texture-anim-draw-mip-shader (function dma-buffer texture int none))
(define-extern clear-texture-ids (function texture none))
(define-extern texture-anim-draw-mips (function dma-buffer texture none))
(define-extern update-texture-anim (function bucket-id texture-anim-array none))
;; (define-extern no-alpha-texture-anim-layer-func function) ;; (function dma-buffer uint int int texture-anim-layer float int)
;; (define-extern copy-alpha-texture-anim-layer-func function) ;; (function dma-buffer uint int int texture-anim-layer float int)
;; (define-extern copy-clut-alpha-texture-anim-layer-func function) ;; (function dma-buffer uint int int texture-anim-layer float int)
;; (define-extern set-alpha-texture-anim-layer-func function) ;; (function dma-buffer uint int int texture-anim-layer float int)
;; (define-extern set-clut-alpha-texture-anim-layer-func function) ;; (function dma-buffer uint int int texture-anim-layer float int)
;; (define-extern dest-texture-init function) ;; (function texture-anim none)
;; (define-extern src-texture-init function) ;; (function texture-anim-layer none)
;; (define-extern src-texture-init-mt8 function) ;; (function texture-anim-layer none)
;; (define-extern make-noise-texture function) ;; (function pointer int int int none)
;; (define-extern make-cloud-clut function) ;; (function (pointer uint32) float float none)
;; (define-extern texture-anim-cloud-clut-upload function) ;; (function dma-buffer texture-anim none)
;; (define-extern texture-anim-cloud-clut-init function) ;; (function texture-anim none)
;; (define-extern make-slime-clut function) ;; (function (pointer uint32) none)
;; (define-extern texture-anim-slime-clut-upload function) ;; (function dma-buffer texture-anim none)
;; (define-extern texture-anim-slime-clut-init function) ;; (function texture-anim none)
;; (define-extern make-ramp-clut function) ;; (function (pointer uint32) pointer object none)
;; (define-extern make-alpha-ramp-clut function) ;; (function (pointer uint32) none)
;; (define-extern noise-texture-init function) ;; (function texture-anim-layer none)
;; (define-extern texture-anim-alpha-ramp-clut-upload function) ;; (function dma-buffer texture-anim none)
;; (define-extern texture-anim-alpha-ramp-clut-init function) ;; (function texture-anim none)
;; (define-extern texture-anim-overide-size-init function) ;; (function texture-anim none)
;; (define-extern texture-anim-change-mt8h-init function) ;; (function texture-anim none)
;; (define-extern *texture-anim-pages-table* object)
;; (define-extern *texture-anim-mip-array* object)
(define-extern no-alpha-texture-anim-layer-func (function dma-buffer uint int int texture-anim-layer float int))
(define-extern copy-alpha-texture-anim-layer-func (function dma-buffer uint int int texture-anim-layer float int))
(define-extern copy-clut-alpha-texture-anim-layer-func (function dma-buffer uint int int texture-anim-layer float int))
(define-extern set-alpha-texture-anim-layer-func (function dma-buffer uint int int texture-anim-layer float int))
(define-extern set-clut-alpha-texture-anim-layer-func (function dma-buffer uint int int texture-anim-layer float int))
(define-extern dest-texture-init (function texture-anim none))
(define-extern src-texture-init (function texture-anim-layer none))
(define-extern src-texture-init-mt8 (function texture-anim-layer none))
(define-extern make-noise-texture (function pointer int int int none))
(define-extern make-cloud-clut (function (pointer uint32) float float none))
(define-extern texture-anim-cloud-clut-upload (function dma-buffer texture-anim none))
(define-extern texture-anim-cloud-clut-init (function texture-anim none))
(define-extern make-slime-clut (function (pointer uint32) none))
(define-extern texture-anim-slime-clut-upload (function dma-buffer texture-anim none))
(define-extern texture-anim-slime-clut-init (function texture-anim none))
(define-extern make-ramp-clut (function (pointer uint32) pointer object none))
(define-extern make-alpha-ramp-clut (function (pointer uint32) none))
(define-extern noise-texture-init (function texture-anim-layer none))
(define-extern texture-anim-alpha-ramp-clut-upload (function dma-buffer texture-anim none))
(define-extern texture-anim-alpha-ramp-clut-init (function texture-anim none))
(define-extern texture-anim-overide-size-init (function texture-anim none))
(define-extern texture-anim-change-mt8h-init (function texture-anim none))
(define-extern *texture-anim-pages-table* (pointer uint8))
(define-extern *texture-anim-mip-array* (pointer uint16))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; texture-anim-funcs ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; (define-extern noise-texture-anim-layer-func function) ;; (function dma-buffer uint int int texture-anim-layer float int)
;; (define-extern cloud-texture-anim-layer-func function) ;; (function dma-buffer uint int int texture-anim-layer float int)
;; (define-extern cloud-texture-anim-func function) ;; (function dma-buffer texture-anim int)
;; (define-extern fog-texture-anim-init function) ;; (function texture-anim int)
(define-extern noise-texture-anim-layer-func (function dma-buffer uint int int texture-anim-layer float int))
(define-extern cloud-texture-anim-layer-func (function dma-buffer uint int int texture-anim-layer float int))
(define-extern cloud-texture-anim-func (function dma-buffer texture-anim int))
(define-extern fog-texture-anim-init (function texture-anim int))
(define-extern *fog-texture-work* fog-texture-work)
;; (define-extern real-fog-texture-anim-func function) ;; (function dma-buffer texture-anim int)
;; (define-extern fog-texture-anim-func function) ;; (function dma-buffer texture-anim int)
(define-extern real-fog-texture-anim-func (function dma-buffer texture-anim int))
(define-extern fog-texture-anim-func (function dma-buffer texture-anim int))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; texture-anim-tables ;;

View File

@ -347,6 +347,19 @@
"VAGWAD.INT"
],
"animated_textures": [
// dark jak
"jakc-arm", "jakc-eyebrow", "jakc-face", "jakc-finger", "jakc-hair",
"jakc-arm-norm", "jakc-eyebrow-norm", "jakc-face-norm", "jakc-finger-norm", "jakc-hair-norm",
"jakc-arm-dark", "jakc-eyebrow-dark", "jakc-face-dark", "jakc-finger-dark", "jakc-hair-dark",
// Skull Gem
"skull-gem-dest",
"skull-gem-alpha-00",
"skull-gem-alpha-01",
"skull-gem-alpha-02"
],
"levels_to_extract": [
// wascity
"WASALL.DGO",

View File

@ -2460,5 +2460,9 @@
["L575", "vector4w"],
["L576", "vector4w"],
["L577", "vector4w"]
],
"texture-anim": [
["L198", "(pointer uint8)", 16],
["L197", "(pointer uint16)", 48]
]
}

View File

@ -2507,5 +2507,6 @@
"(post idle precur-bridge-blocks-break)": [
[16, "vector"],
[32, "vector"]
]
],
"texture-anim-layer-draw": [[16, "matrix"], [80, "matrix"], [144, "matrix"], [208, "matrix"]]
}

View File

@ -10851,6 +10851,9 @@
["_stack_", 76, "float"],
["_stack_", 100, "float"]
],
"real-wang-texture-anim-func": [
[[3, 31], "v1", "mood-context"]
],
"(method 24 sky-work)": [
[256, "s4", "(pointer int32)"],
[261, "s4", "(pointer int32)"]
@ -11102,5 +11105,40 @@
],
"(method 10 neon-baron)": [[11, "s5", "uint"]],
"(method 15 neon-baron)": [[29, "s5", "int"]],
"(method 16 neon-baron)": [[5, "a1", "int"]]
"(method 16 neon-baron)": [[5, "a1", "int"]],
"texture-anim-layer-add-clut-shader": [
[[23, 30], "a3", "dma-packet"],
[[32, 39], "a3", "gs-gif-tag"],
[49, "a1", "(pointer gs-tex0)"],
[51, "a1", "(pointer gs-reg64)"],
[52, "a1", "(pointer gs-tex1)"],
[54, "a1", "(pointer gs-reg64)"],
[56, "a1", "(pointer gs-test)"],
[58, "a1", "(pointer gs-reg64)"],
[60, "a1", "(pointer gs-clamp)"],
[62, "a1", "(pointer gs-reg64)"],
[64, "a1", "(pointer gs-alpha)"],
[66, "a1", "(pointer gs-reg64)"]
],
"texture-anim-layer-draw": [
[[24, 182], "s4", "(pointer uint128)"]
],
"update-texture-anim": [
[213, "v1", "(pointer uint128)"],
[[214, 230], "t0", "vector4w"],
[[230, 238], "t0", "vector4w"],
[[239, 247], "v1", "vector4w"]
],
"(method 9 texture-anim-layer)": [
[5, "v1", "symbol"],
[11, "v1", "symbol"]
],
"(method 9 texture-anim)": [
[5, "v1", "symbol"],
[11, "v1", "symbol"],
["_stack_", 16, "texture-page"]
],
"real-fog-texture-anim-func": [
[[6, 160], "s2", "(pointer uint32)"]
]
}

View File

@ -80,6 +80,7 @@ set(RUNTIME_SOURCE
graphics/opengl_renderer/sprite/Sprite3_Glow.cpp
graphics/opengl_renderer/sprite/Sprite3.cpp
graphics/opengl_renderer/TextureAnimator.cpp
graphics/opengl_renderer/TextureAnimatorDefs.cpp
graphics/opengl_renderer/TextureUploadHandler.cpp
graphics/opengl_renderer/VisDataHandler.cpp
graphics/opengl_renderer/Warp.cpp

View File

@ -97,10 +97,9 @@ OpenGLRenderer::OpenGLRenderer(std::shared_ptr<TexturePool> texture_pool,
case GameVersion::Jak1:
break;
case GameVersion::Jak2:
m_texture_animator = std::make_shared<TextureAnimator>(m_render_state.shaders, common_level);
break;
case GameVersion::Jak3:
// for now, no texture animation for jak3...
m_texture_animator =
std::make_shared<TextureAnimator>(m_render_state.shaders, common_level, m_version);
break;
default:
ASSERT(false);
@ -130,7 +129,6 @@ void OpenGLRenderer::init_bucket_renderers_jak3() {
using namespace jak3;
m_bucket_renderers.resize((int)BucketId::MAX_BUCKETS);
m_bucket_categories.resize((int)BucketId::MAX_BUCKETS, BucketCategory::OTHER);
std::shared_ptr<TextureAnimator> texture_animator = nullptr; // todo tex anim
{
auto p = scoped_prof("render-inits");
@ -140,7 +138,7 @@ void OpenGLRenderer::init_bucket_renderers_jak3() {
// 4
init_bucket_renderer<TextureUploadHandler>("tex-lcom-sky-pre", BucketCategory::TEX,
BucketId::TEX_LCOM_SKY_PRE, texture_animator);
BucketId::TEX_LCOM_SKY_PRE, m_texture_animator);
init_bucket_renderer<DirectRenderer>("sky", BucketCategory::OTHER, BucketId::SKY, 1024 * 8);
init_bucket_renderer<OceanMidAndFar>("ocean-mid-far", BucketCategory::OCEAN,
@ -156,7 +154,7 @@ void OpenGLRenderer::init_bucket_renderers_jak3() {
init_bucket_renderer<TextureUploadHandler>(
fmt::format("tex-l{}-tfrag", i), BucketCategory::TEX,
GET_BUCKET_ID_FOR_LIST(BucketId::TEX_L0_TFRAG, BucketId::TEX_L1_TFRAG, i),
texture_animator);
m_texture_animator);
// 11
init_bucket_renderer<TFragment>(
fmt::format("tfrag-l{}-tfrag", i), BucketCategory::TFRAG,
@ -230,7 +228,7 @@ void OpenGLRenderer::init_bucket_renderers_jak3() {
// 340
init_bucket_renderer<TextureUploadHandler>("tex-lcom-tfrag", BucketCategory::TEX,
BucketId::TEX_LCOM_TFRAG, texture_animator);
BucketId::TEX_LCOM_TFRAG, m_texture_animator);
init_bucket_renderer<Merc2BucketRenderer>("merc-lcom-tfrag", BucketCategory::MERC,
BucketId::MERC_LCOM_TFRAG, m_merc2);
init_bucket_renderer<Generic2BucketRenderer>("gmerc-lcom-tfrag", BucketCategory::GENERIC,
@ -238,7 +236,7 @@ void OpenGLRenderer::init_bucket_renderers_jak3() {
Generic2::Mode::NORMAL);
// 345
init_bucket_renderer<TextureUploadHandler>("tex-lcom-shrub", BucketCategory::TEX,
BucketId::TEX_LCOM_SHRUB, texture_animator);
BucketId::TEX_LCOM_SHRUB, m_texture_animator);
init_bucket_renderer<Merc2BucketRenderer>("merc-lcom-shrub", BucketCategory::MERC,
BucketId::MERC_LCOM_SHRUB, m_merc2);
// 351
@ -247,11 +245,11 @@ void OpenGLRenderer::init_bucket_renderers_jak3() {
init_bucket_renderer<TextureUploadHandler>(
fmt::format("tex-l{}-pris", i), BucketCategory::TEX,
GET_BUCKET_ID_FOR_LIST(BucketId::TEX_L0_PRIS, BucketId::TEX_L1_PRIS, i),
texture_animator);
m_texture_animator);
init_bucket_renderer<TextureUploadHandler>(
fmt::format("tex-l{}-pris2", i), BucketCategory::TEX,
GET_BUCKET_ID_FOR_LIST(BucketId::TEX_L0_PRIS2, BucketId::TEX_L1_PRIS2, i),
texture_animator);
m_texture_animator);
init_bucket_renderer<Merc2BucketRenderer>(
fmt::format("merc-l{}-pris", i), BucketCategory::MERC,
@ -272,7 +270,7 @@ void OpenGLRenderer::init_bucket_renderers_jak3() {
// 401
init_bucket_renderer<TextureUploadHandler>("tex-lcom-pris", BucketCategory::TEX,
BucketId::TEX_LCOM_PRIS, texture_animator);
BucketId::TEX_LCOM_PRIS, m_texture_animator);
init_bucket_renderer<Merc2BucketRenderer>("merc-lcom-pris", BucketCategory::MERC,
BucketId::MERC_LCOM_PRIS, m_merc2);
init_bucket_renderer<Generic2BucketRenderer>("gmerc-lcom-pris", BucketCategory::GENERIC,
@ -281,7 +279,7 @@ void OpenGLRenderer::init_bucket_renderers_jak3() {
// 461
init_bucket_renderer<TextureUploadHandler>("tex-lcom-sky-post", BucketCategory::TEX,
BucketId::TEX_LCOM_SKY_POST, texture_animator);
BucketId::TEX_LCOM_SKY_POST, m_texture_animator);
init_bucket_renderer<OceanNear>("ocean-near", BucketCategory::OCEAN, BucketId::OCEAN_NEAR);
// 463
@ -291,7 +289,7 @@ void OpenGLRenderer::init_bucket_renderers_jak3() {
init_bucket_renderer<TextureUploadHandler>(
fmt::format("tex-l{}-water", i), BucketCategory::TEX,
GET_BUCKET_ID_FOR_LIST(BucketId::TEX_L0_WATER, BucketId::TEX_L1_WATER, i),
texture_animator);
m_texture_animator);
init_bucket_renderer<Merc2BucketRenderer>(
fmt::format("merc-l{}-water", i), BucketCategory::MERC,
GET_BUCKET_ID_FOR_LIST(BucketId::MERC_L0_WATER, BucketId::MERC_L1_WATER, i), m_merc2);
@ -308,20 +306,20 @@ void OpenGLRenderer::init_bucket_renderers_jak3() {
// 563
init_bucket_renderer<TextureUploadHandler>("tex-lcom-water", BucketCategory::TEX,
BucketId::TEX_LCOM_WATER, texture_animator);
BucketId::TEX_LCOM_WATER, m_texture_animator);
init_bucket_renderer<Merc2BucketRenderer>("merc-lcom-water", BucketCategory::MERC,
BucketId::MERC_LCOM_WATER, m_merc2);
// 568
init_bucket_renderer<TextureUploadHandler>("tex-sprite", BucketCategory::TEX,
BucketId::TEX_SPRITE, texture_animator);
BucketId::TEX_SPRITE, m_texture_animator);
init_bucket_renderer<Sprite3>("particles", BucketCategory::SPRITE, BucketId::PARTICLES);
init_bucket_renderer<Generic2BucketRenderer>("generic-sprite-3", BucketCategory::OTHER,
BucketId::GENERIC_SPRITE_3, m_generic2,
Generic2::Mode::LIGHTNING);
// 575
init_bucket_renderer<TextureUploadHandler>("tex-warp", BucketCategory::TEX, BucketId::TEX_WARP,
texture_animator);
m_texture_animator);
init_bucket_renderer<Warp>("generic-warp", BucketCategory::GENERIC, BucketId::GENERIC_WARP,
m_generic2);
@ -329,16 +327,16 @@ void OpenGLRenderer::init_bucket_renderers_jak3() {
BucketId::DEBUG_NO_ZBUF1, m_texture_animator, true);
// 578
init_bucket_renderer<TextureUploadHandler>("tex-hud-hud-alpha", BucketCategory::TEX,
BucketId::TEX_HUD_HUD_ALPHA, texture_animator);
BucketId::TEX_HUD_HUD_ALPHA, m_texture_animator);
init_bucket_renderer<TextureUploadHandler>("tex-hud-hud-alpha", BucketCategory::TEX,
BucketId::TEX_HUD_HUD_ALPHA, texture_animator);
BucketId::TEX_HUD_HUD_ALPHA, m_texture_animator);
init_bucket_renderer<ProgressRenderer>("hud-draw-hud-alpha", BucketCategory::OTHER,
BucketId::HUD_DRAW_HUD_ALPHA, 0x8000);
init_bucket_renderer<TextureUploadHandler>("tex-hud-pris2", BucketCategory::TEX,
BucketId::TEX_HUD_PRIS2, texture_animator);
BucketId::TEX_HUD_PRIS2, m_texture_animator);
init_bucket_renderer<TextureUploadHandler>("hud-draw-pris2", BucketCategory::TEX,
BucketId::HUD_DRAW_PRIS2, texture_animator);
BucketId::HUD_DRAW_PRIS2, m_texture_animator);
init_bucket_renderer<ProgressRenderer>("progress", BucketCategory::OTHER, BucketId::BUCKET582,
0x8000);

View File

@ -208,6 +208,9 @@ int output_slot_by_idx(GameVersion version, const std::string& name) {
case GameVersion::Jak2:
v = &jak2_animated_texture_slots();
break;
case GameVersion::Jak3:
v = &jak3_animated_texture_slots();
break;
default:
case GameVersion::Jak1:
ASSERT_NOT_REACHED();
@ -352,12 +355,26 @@ Psm32ToPsm8Scrambler::Psm32ToPsm8Scrambler(int w, int h, int write_tex_width, in
}
}
TextureAnimator::TextureAnimator(ShaderLibrary& shaders, const tfrag3::Level* common_level)
const std::vector<std::string>& animated_texture_slots(GameVersion version) {
switch (version) {
case GameVersion::Jak2:
return jak2_animated_texture_slots();
case GameVersion::Jak3:
return jak3_animated_texture_slots();
default:
ASSERT_NOT_REACHED();
}
}
TextureAnimator::TextureAnimator(ShaderLibrary& shaders,
const tfrag3::Level* common_level,
GameVersion version)
: m_common_level(common_level),
m_psm32_to_psm8_8_8(8, 8, 8, 64),
m_psm32_to_psm8_16_16(16, 16, 16, 64),
m_psm32_to_psm8_32_32(32, 32, 16, 64),
m_psm32_to_psm8_64_64(64, 64, 64, 64),
m_version(version),
m_sky_blend_texture(kFinalSkyTextureSize, kFinalSkyTextureSize, GL_UNSIGNED_INT_8_8_8_8_REV),
m_sky_final_texture(kFinalSkyTextureSize, kFinalSkyTextureSize, GL_UNSIGNED_INT_8_8_8_8_REV),
m_sky_hires_blend_texture(kFinalSkyHiresTextureSize,
@ -462,12 +479,22 @@ TextureAnimator::TextureAnimator(ShaderLibrary& shaders, const tfrag3::Level* co
m_index_to_clut_addr[i] = clx + cly * 16;
}
m_public_output_slots.resize(jak2_animated_texture_slots().size(), m_dummy_texture);
m_public_output_slots.resize(animated_texture_slots(m_version).size(), m_dummy_texture);
m_private_output_slots = m_public_output_slots;
m_output_debug_flags.resize(jak2_animated_texture_slots().size());
m_output_debug_flags.resize(animated_texture_slots(m_version).size());
// animation-specific stuff
setup_texture_anims();
setup_texture_anims_common();
switch (m_version) {
case GameVersion::Jak2:
setup_texture_anims_jak2();
break;
case GameVersion::Jak3:
setup_texture_anims_jak3();
break;
default:
ASSERT_NOT_REACHED();
}
setup_sky();
}
@ -485,7 +512,7 @@ int TextureAnimator::create_fixed_anim_array(const std::vector<FixedAnimDef>& de
anim.def = def;
// set up the destination texture.
anim.dest_slot = output_slot_by_idx(GameVersion::Jak2, anim.def.tex_name);
anim.dest_slot = output_slot_by_idx(m_version, anim.def.tex_name);
auto* dtex = tex_by_name(m_common_level, anim.def.tex_name);
if (anim.def.override_size) {
anim.fbt.emplace(anim.def.override_size->x(), anim.def.override_size->y(),
@ -552,7 +579,7 @@ void TextureAnimator::draw_debug_window() {
imgui_show_tex(m_sky_hires_noise_textures[i].new_tex);
}
auto& slots = jak2_animated_texture_slots();
auto& slots = animated_texture_slots(m_version);
for (size_t i = 0; i < slots.size(); i++) {
ImGui::Text("Slot %d %s (%d)", (int)i, slots[i].c_str(), (int)m_private_output_slots[i]);
imgui_show_tex(m_private_output_slots[i]);
@ -562,7 +589,7 @@ void TextureAnimator::draw_debug_window() {
}
void TextureAnimator::copy_private_to_public() {
auto& slots = jak2_animated_texture_slots();
auto& slots = animated_texture_slots(m_version);
for (size_t i = 0; i < slots.size(); i++) {
if (m_output_debug_flags[i].b) {
m_public_output_slots[i] = m_dummy_texture;
@ -598,7 +625,7 @@ void TextureAnimator::add_to_clut_blender_group(int idx,
grp.blenders.emplace_back(prefix,
std::array<std::string, 2>{prefix + suffix0, prefix + suffix1}, dgo,
m_common_level, &m_opengl_texture_pool);
grp.outputs.push_back(output_slot_by_idx(GameVersion::Jak2, prefix));
grp.outputs.push_back(output_slot_by_idx(m_version, prefix));
m_private_output_slots.at(grp.outputs.back()) = grp.blenders.back().texture();
}
}
@ -984,7 +1011,7 @@ void TextureAnimator::force_to_gpu(int tbp) {
PcTextureId TextureAnimator::get_id_for_tbp(TexturePool* pool, u64 tbp, u64 other_id) {
const auto& it = m_ids_by_vram.find(tbp | (other_id << 32));
if (it == m_ids_by_vram.end()) {
auto ret = pool->allocate_pc_port_texture(GameVersion::Jak2);
auto ret = pool->allocate_pc_port_texture(m_version);
m_ids_by_vram[tbp] = ret;
return ret;
} else {
@ -2047,471 +2074,6 @@ void TextureAnimator::run_fixed_animation(FixedAnim& anim, float time) {
glBindTexture(GL_TEXTURE_2D, 0);
}
void TextureAnimator::setup_texture_anims() {
// DARKJAK
m_darkjak_clut_blender_idx = create_clut_blender_group(
{"jakbsmall-eyebrow", "jakbsmall-face", "jakbsmall-finger", "jakbsmall-hair"}, "-norm",
"-dark", {});
// PRISON
// MISSING EYELID
m_jakb_prison_clut_blender_idx = create_clut_blender_group(
{"jak-orig-arm-formorph", "jak-orig-eyebrow-formorph", "jak-orig-finger-formorph"}, "-start",
"-end", "LDJAKBRN.DGO");
add_to_clut_blender_group(m_jakb_prison_clut_blender_idx,
{"jakb-facelft", "jakb-facert", "jakb-hairtrans"}, "-norm", "-dark",
"LDJAKBRN.DGO");
// ORACLE
// MISSING FINGER
m_jakb_oracle_clut_blender_idx = create_clut_blender_group(
{"jakb-eyebrow", "jakb-eyelid", "jakb-facelft", "jakb-facert", "jakb-hairtrans"}, "-norm",
"-dark", "ORACLE.DGO");
// NEST
// MISSING FINGER
m_jakb_nest_clut_blender_idx = create_clut_blender_group(
{"jakb-eyebrow", "jakb-eyelid", "jakb-facelft", "jakb-facert", "jakb-hairtrans"}, "-norm",
"-dark", "NEB.DGO");
// KOR (doesn't work??)
m_kor_transform_clut_blender_idx = create_clut_blender_group(
{
// "kor-eyeeffect-formorph",
// "kor-hair-formorph",
// "kor-head-formorph",
// "kor-head-formorph-noreflect",
// "kor-lowercaps-formorph",
// "kor-uppercaps-formorph",
},
"-start", "-end", {});
// Skull Gem
{
FixedAnimDef skull_gem;
skull_gem.move_to_pool = true;
skull_gem.tex_name = "skull-gem-dest";
skull_gem.color = math::Vector4<u8>{0, 0, 0, 0x80};
// overriden in texture-finish.gc
skull_gem.override_size = math::Vector2<int>(32, 32);
auto& skull_gem_0 = skull_gem.layers.emplace_back();
skull_gem_0.end_time = 300.;
skull_gem_0.tex_name = "skull-gem-alpha-00";
skull_gem_0.set_blend_b2_d1();
skull_gem_0.set_no_z_write_no_z_test();
auto& skull_gem_1 = skull_gem.layers.emplace_back();
skull_gem_1.end_time = 300.;
skull_gem_1.tex_name = "skull-gem-alpha-01";
skull_gem_1.set_blend_b2_d1();
skull_gem_1.set_no_z_write_no_z_test();
auto& skull_gem_2 = skull_gem.layers.emplace_back();
skull_gem_2.end_time = 300.;
skull_gem_2.tex_name = "skull-gem-alpha-02";
skull_gem_2.set_blend_b2_d1();
skull_gem_2.set_no_z_write_no_z_test();
m_skull_gem_fixed_anim_array_idx = create_fixed_anim_array({skull_gem});
}
// Bomb
{
FixedAnimDef bomb;
bomb.tex_name = "bomb-gradient";
bomb.color = math::Vector4<u8>{0, 0, 0, 0x80};
auto& bomb_0 = bomb.layers.emplace_back();
bomb_0.end_time = 300.;
bomb_0.tex_name = "bomb-gradient-rim";
bomb_0.set_blend_b2_d1();
bomb_0.set_no_z_write_no_z_test();
// :test (new 'static 'gs-test :ate #x1 :afail #x3 :zte #x1 :ztst (gs-ztest always))
bomb_0.channel_masks[3] = false; // no alpha writes.
auto& bomb_1 = bomb.layers.emplace_back();
bomb_1.end_time = 300.;
bomb_1.tex_name = "bomb-gradient-flames";
bomb_1.set_blend_b2_d1();
bomb_1.set_no_z_write_no_z_test();
// :test (new 'static 'gs-test :ate #x1 :afail #x3 :zte #x1 :ztst (gs-ztest always))
bomb_1.channel_masks[3] = false; // no alpha writes.
m_bomb_fixed_anim_array_idx = create_fixed_anim_array({bomb});
}
// CAS conveyor
{
FixedAnimDef conveyor_0;
conveyor_0.tex_name = "cas-conveyor-dest";
conveyor_0.color = math::Vector4<u8>(0, 0, 0, 0x80);
conveyor_0.override_size = math::Vector2<int>(64, 32);
auto& c0 = conveyor_0.layers.emplace_back();
c0.set_blend_b2_d1();
c0.set_no_z_write_no_z_test();
// :test (new 'static 'gs-test :ate #x1 :afail #x3 :zte #x1 :ztst (gs-ztest always))
c0.channel_masks[3] = false; // no alpha writes.
c0.end_time = 300.;
c0.tex_name = "cas-conveyor";
FixedAnimDef conveyor_1;
conveyor_1.tex_name = "cas-conveyor-dest-01";
conveyor_1.color = math::Vector4<u8>(0, 0, 0, 0x80);
conveyor_1.override_size = math::Vector2<int>(64, 32);
auto& c1 = conveyor_1.layers.emplace_back();
c1.set_blend_b2_d1();
c1.set_no_z_write_no_z_test();
// :test (new 'static 'gs-test :ate #x1 :afail #x3 :zte #x1 :ztst (gs-ztest always))
c1.channel_masks[3] = false; // no alpha writes.
c1.end_time = 300.;
c1.tex_name = "cas-conveyor";
FixedAnimDef conveyor_2;
conveyor_2.tex_name = "cas-conveyor-dest-02";
conveyor_2.color = math::Vector4<u8>(0, 0, 0, 0x80);
conveyor_2.override_size = math::Vector2<int>(64, 32);
auto& c2 = conveyor_2.layers.emplace_back();
c2.set_blend_b2_d1();
c2.set_no_z_write_no_z_test();
// :test (new 'static 'gs-test :ate #x1 :afail #x3 :zte #x1 :ztst (gs-ztest always))
c2.channel_masks[3] = false; // no alpha writes.
c2.end_time = 300.;
c2.tex_name = "cas-conveyor";
FixedAnimDef conveyor_3;
conveyor_3.tex_name = "cas-conveyor-dest-03";
conveyor_3.color = math::Vector4<u8>(0, 0, 0, 0x80);
conveyor_3.override_size = math::Vector2<int>(64, 32);
auto& c3 = conveyor_3.layers.emplace_back();
c3.set_blend_b2_d1();
c3.set_no_z_write_no_z_test();
// :test (new 'static 'gs-test :ate #x1 :afail #x3 :zte #x1 :ztst (gs-ztest always))
c3.channel_masks[3] = false; // no alpha writes.
c3.end_time = 300.;
c3.tex_name = "cas-conveyor";
m_cas_conveyor_anim_array_idx =
create_fixed_anim_array({conveyor_0, conveyor_1, conveyor_2, conveyor_3});
}
// SECURITY
{
FixedAnimDef env;
env.color = math::Vector4<u8>(0, 0, 0, 0x80);
env.tex_name = "security-env-dest";
for (int i = 0; i < 2; i++) {
auto& env1 = env.layers.emplace_back();
env1.tex_name = "security-env-uscroll";
// :test (new 'static 'gs-test :ate #x1 :afail #x3 :zte #x1 :ztst (gs-ztest always))
env1.set_no_z_write_no_z_test();
env1.channel_masks[3] = false; // no alpha writes.
// :alpha (new 'static 'gs-alpha :b #x2 :d #x1)
env1.set_blend_b2_d1();
env1.end_time = 4800.f;
}
FixedAnimDef dot;
dot.color = math::Vector4<u8>(0, 0, 0, 0x80);
dot.tex_name = "security-dot-dest";
auto& cwhite = dot.layers.emplace_back();
cwhite.set_blend_b2_d1();
cwhite.set_no_z_write_no_z_test();
cwhite.tex_name = "common-white";
cwhite.end_time = 4800.f;
for (int i = 0; i < 2; i++) {
auto& dsrc = dot.layers.emplace_back();
dsrc.set_blend_b2_d1();
dsrc.set_no_z_write_no_z_test();
dsrc.end_time = 600.f;
dsrc.tex_name = "security-dot-src";
}
m_security_anim_array_idx = create_fixed_anim_array({env, dot});
}
// WATERFALL
{
FixedAnimDef waterfall;
waterfall.color = math::Vector4<u8>(0, 0, 0, 0x80);
waterfall.tex_name = "waterfall-dest";
for (int i = 0; i < 4; i++) {
auto& src = waterfall.layers.emplace_back();
src.set_blend_b1_d1();
src.set_no_z_write_no_z_test();
src.end_time = 450.f;
src.tex_name = "waterfall";
}
m_waterfall_anim_array_idx = create_fixed_anim_array({waterfall});
}
{
FixedAnimDef waterfall;
waterfall.color = math::Vector4<u8>(0, 0, 0, 0x80);
waterfall.tex_name = "waterfall-dest";
for (int i = 0; i < 4; i++) {
auto& src = waterfall.layers.emplace_back();
src.set_blend_b1_d1();
src.set_no_z_write_no_z_test();
src.end_time = 450.f;
src.tex_name = "waterfall";
}
m_waterfall_b_anim_array_idx = create_fixed_anim_array({waterfall});
}
// LAVA
{
FixedAnimDef lava;
lava.color = math::Vector4<u8>(0, 0, 0, 0x80);
lava.tex_name = "dig-lava-01-dest";
for (int i = 0; i < 2; i++) {
auto& src = lava.layers.emplace_back();
src.set_blend_b1_d1();
src.set_no_z_write_no_z_test();
src.end_time = 3600.f;
src.tex_name = "dig-lava-01";
}
m_lava_anim_array_idx = create_fixed_anim_array({lava});
}
{
FixedAnimDef lava;
lava.color = math::Vector4<u8>(0, 0, 0, 0x80);
lava.tex_name = "dig-lava-01-dest";
for (int i = 0; i < 2; i++) {
auto& src = lava.layers.emplace_back();
src.set_blend_b1_d1();
src.set_no_z_write_no_z_test();
src.end_time = 3600.f;
src.tex_name = "dig-lava-01";
}
m_lava_b_anim_array_idx = create_fixed_anim_array({lava});
}
// Stadiumb
{
FixedAnimDef def;
def.color = math::Vector4<u8>(0, 0, 0, 0x80);
def.tex_name = "stdmb-energy-wall-01-dest";
for (int i = 0; i < 2; i++) {
auto& src = def.layers.emplace_back();
src.set_blend_b1_d1();
src.set_no_z_write_no_z_test();
src.end_time = 300.f;
src.tex_name = "stdmb-energy-wall-01";
}
m_stadiumb_anim_array_idx = create_fixed_anim_array({def});
}
// Fortress pris
{
FixedAnimDef l_tread;
l_tread.color = math::Vector4<u8>(0, 0, 0, 0x80);
l_tread.tex_name = "robotank-tread-l-dest";
auto& l_src = l_tread.layers.emplace_back();
l_src.set_blend_b1_d1();
l_src.set_no_z_write_no_z_test();
l_src.channel_masks[3] = false; // no alpha writes.
l_src.end_time = 1.f;
l_src.tex_name = "robotank-tread";
FixedAnimDef r_tread;
r_tread.color = math::Vector4<u8>(0, 0, 0, 0x80);
r_tread.tex_name = "robotank-tread-r-dest";
auto& r_src = r_tread.layers.emplace_back();
r_src.set_blend_b1_d1();
r_src.set_no_z_write_no_z_test();
r_src.channel_masks[3] = false; // no alpha writes.
r_src.end_time = 1.f;
r_src.tex_name = "robotank-tread";
m_fortress_pris_anim_array_idx = create_fixed_anim_array({l_tread, r_tread});
}
// Fortress Warp
{
FixedAnimDef def;
def.color = math::Vector4<u8>(0, 0, 0, 0x80);
def.move_to_pool = true;
def.tex_name = "fort-roboscreen-dest";
auto& src = def.layers.emplace_back();
src.set_blend_b2_d1();
src.channel_masks[3] = false; // no alpha writes.
src.set_no_z_write_no_z_test();
src.end_time = 300.f;
src.tex_name = "fort-roboscreen-env";
m_fortress_warp_anim_array_idx = create_fixed_anim_array({def});
}
// metkor
{
FixedAnimDef def;
def.color = math::Vector4<u8>(0, 0, 0, 0x80);
def.tex_name = "squid-env-rim-dest";
def.move_to_pool = true;
{
auto& src = def.layers.emplace_back();
src.set_blend_b2_d1();
src.channel_masks[3] = false; // no alpha writes.
src.set_no_z_write_no_z_test();
src.set_clamp();
src.end_time = 1200.f;
src.tex_name = "metkor-head-env-noise";
}
{
auto& src = def.layers.emplace_back();
src.set_blend_b2_d1();
src.channel_masks[3] = false; // no alpha writes.
src.set_no_z_write_no_z_test();
src.set_clamp();
src.end_time = 1200.f;
src.tex_name = "metkor-head-env-scan";
}
{
auto& src = def.layers.emplace_back();
src.set_blend_b2_d1();
src.channel_masks[3] = false; // no alpha writes.
src.set_no_z_write_no_z_test();
src.set_clamp();
src.end_time = 1200.f;
src.tex_name = "metkor-head-env-rim";
}
{
auto& src = def.layers.emplace_back();
src.set_blend_b2_d1();
src.channel_masks[3] = false; // no alpha writes.
src.set_no_z_write_no_z_test();
src.set_clamp();
src.end_time = 1200.f;
src.tex_name = "metkor-head-env-rim";
}
{
auto& src = def.layers.emplace_back();
src.set_blend_b2_d1();
src.channel_masks[3] = false; // no alpha writes.
src.set_no_z_write_no_z_test();
src.set_clamp();
src.end_time = 1200.f;
src.tex_name = "environment-phong-rim";
}
m_metkor_anim_array_idx = create_fixed_anim_array({def});
}
// shield
{
FixedAnimDef def;
def.color = math::Vector4<u8>(0, 0, 0, 0x80);
def.tex_name = "squid-env-rim-dest";
def.move_to_pool = true;
{
auto& src = def.layers.emplace_back();
src.set_blend_b2_d1();
src.set_no_z_write_no_z_test();
src.set_clamp();
src.end_time = 1200.f;
src.tex_name = "common-white";
}
{
auto& src = def.layers.emplace_back();
src.set_blend_b2_d1();
src.channel_masks[3] = false; // no alpha writes.
src.set_no_z_write_no_z_test();
src.set_clamp();
src.end_time = 1200.f;
src.tex_name = "squid-env-uscroll";
}
{
auto& src = def.layers.emplace_back();
src.set_blend_b2_d1();
src.channel_masks[3] = false; // no alpha writes.
src.set_no_z_write_no_z_test();
src.set_clamp();
src.end_time = 1200.f;
src.tex_name = "squid-env-uscroll";
}
{
auto& src = def.layers.emplace_back();
src.set_blend_b2_d1();
src.channel_masks[3] = false; // no alpha writes.
src.set_no_z_write_no_z_test();
src.set_clamp();
src.end_time = 1200.f;
src.tex_name = "squid-env-rim-src";
}
{
auto& src = def.layers.emplace_back();
src.set_blend_b2_d1();
src.channel_masks[3] = false; // no alpha writes.
src.set_no_z_write_no_z_test();
src.set_clamp();
src.end_time = 1200.f;
src.tex_name = "squid-env-rim-src";
}
m_shield_anim_array_idx = create_fixed_anim_array({def});
}
// krew
{
FixedAnimDef def;
def.color = math::Vector4<u8>(0, 0, 0, 0x80);
def.tex_name = "krew-holo-dest";
def.move_to_pool = true;
{
auto& src = def.layers.emplace_back();
src.set_blend_b2_d1();
src.channel_masks[3] = false; // no alpha writes.
src.set_no_z_write_no_z_test();
src.set_clamp();
src.end_time = 1200.f;
src.tex_name = "metkor-head-env-noise";
}
{
auto& src = def.layers.emplace_back();
src.set_blend_b2_d1();
src.channel_masks[3] = false; // no alpha writes.
src.set_no_z_write_no_z_test();
src.set_clamp();
src.end_time = 1200.f;
src.tex_name = "metkor-head-env-scan";
}
{
auto& src = def.layers.emplace_back();
src.set_blend_b2_d1();
src.channel_masks[3] = false; // no alpha writes.
src.set_no_z_write_no_z_test();
src.set_clamp();
src.end_time = 1200.f;
src.tex_name = "metkor-head-env-rim";
}
{
auto& src = def.layers.emplace_back();
src.set_blend_b2_d1();
src.channel_masks[3] = false; // no alpha writes.
src.set_no_z_write_no_z_test();
src.set_clamp();
src.end_time = 1200.f;
src.tex_name = "metkor-head-env-rim";
}
{
auto& src = def.layers.emplace_back();
src.set_blend_b2_d1();
src.channel_masks[3] = false; // no alpha writes.
src.set_no_z_write_no_z_test();
src.set_clamp();
src.end_time = 1200.f;
src.tex_name = "metkor-phong-env";
}
m_krew_holo_anim_array_idx = create_fixed_anim_array({def});
}
}
// initial values of the random table for cloud texture generation.
constexpr Vector16ub kInitialRandomTable[TextureAnimator::kRandomTableSize] = {
{0x20, 0x19, 0x18, 0x17, 0x16, 0x15, 0x14, 0x13, 0x12, 0x11, 0x10, 0x89, 0x67, 0x45, 0x23, 0x1},
@ -2614,28 +2176,6 @@ void TextureAnimator::setup_sky() {
m_random_table, dim, m_random_index);
}
}
{
m_slime_output_slot = output_slot_by_idx(GameVersion::Jak2, "cas-toxic-slime-dest");
m_slime_scroll_output_slot =
output_slot_by_idx(GameVersion::Jak2, "cas-toxic-slime-scroll-dest");
const float max_times[4] = {600.f, 300.f, 150.f, 75.f};
const float scales[4] = {0.55, 0.6, 0.3, 0.1f};
for (int i = 0, dim = kFinalSlimeTextureSize >> (kNumSlimeNoiseLayers - 1);
i < kNumSlimeNoiseLayers; i++, dim *= 2) {
auto& tex = m_slime_noise_textures[i];
tex.temp_data.resize(dim * dim);
tex.max_time = max_times[i];
tex.scale = scales[i];
tex.dim = dim;
glGenTextures(1, &tex.new_tex);
m_random_index = update_opengl_noise_texture(tex.new_tex, tex.temp_data.data(),
m_random_table, dim, m_random_index);
glGenTextures(1, &tex.old_tex);
m_random_index = update_opengl_noise_texture(tex.old_tex, tex.temp_data.data(),
m_random_table, dim, m_random_index);
}
}
}
GLint TextureAnimator::run_clouds(const SkyInput& input, bool hires) {

View File

@ -246,7 +246,7 @@ class TexturePool;
class TextureAnimator {
public:
TextureAnimator(ShaderLibrary& shaders, const tfrag3::Level* common_level);
TextureAnimator(ShaderLibrary& shaders, const tfrag3::Level* common_level, GameVersion version);
~TextureAnimator();
void handle_texture_anim_data(DmaFollower& dma,
const u8* ee_mem,
@ -259,7 +259,10 @@ class TextureAnimator {
private:
void copy_private_to_public();
void setup_texture_anims();
void setup_texture_anims_common();
void setup_texture_anims_jak2();
void setup_texture_anims_jak3();
void setup_sky();
void handle_upload_clut_16_16(const DmaTransfer& tf, const u8* ee_mem);
void handle_generic_upload(const DmaTransfer& tf, const u8* ee_mem);
@ -429,6 +432,7 @@ class TextureAnimator {
static constexpr int kNumSlimeNoiseLayers = 4;
private:
GameVersion m_version;
Vector16ub m_random_table[kRandomTableSize];
int m_random_index = 0;
@ -451,3 +455,10 @@ class TextureAnimator {
int m_slime_output_slot = -1;
int m_slime_scroll_output_slot = -1;
};
int output_slot_by_idx(GameVersion version, const std::string& name);
int update_opengl_noise_texture(GLuint texture,
u8* temp,
Vector16ub* random_table,
int dim,
int random_index_in);

View File

@ -0,0 +1,494 @@
#include "game/graphics/opengl_renderer/TextureAnimator.h"
void TextureAnimator::setup_texture_anims_jak3() {
m_darkjak_clut_blender_idx = create_clut_blender_group(
{"jakc-arm", "jakc-eyebrow", "jakc-face", "jakc-finger", "jakc-hair"}, "-norm", "-dark", {});
}
void TextureAnimator::setup_texture_anims_common() {
// Skull Gem
{
FixedAnimDef skull_gem;
skull_gem.move_to_pool = true;
skull_gem.tex_name = "skull-gem-dest";
skull_gem.color = math::Vector4<u8>{0, 0, 0, 0x80};
// overriden in texture-finish.gc
skull_gem.override_size = math::Vector2<int>(32, 32);
auto& skull_gem_0 = skull_gem.layers.emplace_back();
skull_gem_0.end_time = 300.;
skull_gem_0.tex_name = "skull-gem-alpha-00";
skull_gem_0.set_blend_b2_d1();
skull_gem_0.set_no_z_write_no_z_test();
auto& skull_gem_1 = skull_gem.layers.emplace_back();
skull_gem_1.end_time = 300.;
skull_gem_1.tex_name = "skull-gem-alpha-01";
skull_gem_1.set_blend_b2_d1();
skull_gem_1.set_no_z_write_no_z_test();
auto& skull_gem_2 = skull_gem.layers.emplace_back();
skull_gem_2.end_time = 300.;
skull_gem_2.tex_name = "skull-gem-alpha-02";
skull_gem_2.set_blend_b2_d1();
skull_gem_2.set_no_z_write_no_z_test();
m_skull_gem_fixed_anim_array_idx = create_fixed_anim_array({skull_gem});
}
}
void TextureAnimator::setup_texture_anims_jak2() {
// DARKJAK
m_darkjak_clut_blender_idx = create_clut_blender_group(
{"jakbsmall-eyebrow", "jakbsmall-face", "jakbsmall-finger", "jakbsmall-hair"}, "-norm",
"-dark", {});
// PRISON
// MISSING EYELID
m_jakb_prison_clut_blender_idx = create_clut_blender_group(
{"jak-orig-arm-formorph", "jak-orig-eyebrow-formorph", "jak-orig-finger-formorph"}, "-start",
"-end", "LDJAKBRN.DGO");
add_to_clut_blender_group(m_jakb_prison_clut_blender_idx,
{"jakb-facelft", "jakb-facert", "jakb-hairtrans"}, "-norm", "-dark",
"LDJAKBRN.DGO");
// ORACLE
// MISSING FINGER
m_jakb_oracle_clut_blender_idx = create_clut_blender_group(
{"jakb-eyebrow", "jakb-eyelid", "jakb-facelft", "jakb-facert", "jakb-hairtrans"}, "-norm",
"-dark", "ORACLE.DGO");
// NEST
// MISSING FINGER
m_jakb_nest_clut_blender_idx = create_clut_blender_group(
{"jakb-eyebrow", "jakb-eyelid", "jakb-facelft", "jakb-facert", "jakb-hairtrans"}, "-norm",
"-dark", "NEB.DGO");
// KOR (doesn't work??)
m_kor_transform_clut_blender_idx = create_clut_blender_group(
{
// "kor-eyeeffect-formorph",
// "kor-hair-formorph",
// "kor-head-formorph",
// "kor-head-formorph-noreflect",
// "kor-lowercaps-formorph",
// "kor-uppercaps-formorph",
},
"-start", "-end", {});
// Bomb
{
FixedAnimDef bomb;
bomb.tex_name = "bomb-gradient";
bomb.color = math::Vector4<u8>{0, 0, 0, 0x80};
auto& bomb_0 = bomb.layers.emplace_back();
bomb_0.end_time = 300.;
bomb_0.tex_name = "bomb-gradient-rim";
bomb_0.set_blend_b2_d1();
bomb_0.set_no_z_write_no_z_test();
// :test (new 'static 'gs-test :ate #x1 :afail #x3 :zte #x1 :ztst (gs-ztest always))
bomb_0.channel_masks[3] = false; // no alpha writes.
auto& bomb_1 = bomb.layers.emplace_back();
bomb_1.end_time = 300.;
bomb_1.tex_name = "bomb-gradient-flames";
bomb_1.set_blend_b2_d1();
bomb_1.set_no_z_write_no_z_test();
// :test (new 'static 'gs-test :ate #x1 :afail #x3 :zte #x1 :ztst (gs-ztest always))
bomb_1.channel_masks[3] = false; // no alpha writes.
m_bomb_fixed_anim_array_idx = create_fixed_anim_array({bomb});
}
// CAS conveyor
{
FixedAnimDef conveyor_0;
conveyor_0.tex_name = "cas-conveyor-dest";
conveyor_0.color = math::Vector4<u8>(0, 0, 0, 0x80);
conveyor_0.override_size = math::Vector2<int>(64, 32);
auto& c0 = conveyor_0.layers.emplace_back();
c0.set_blend_b2_d1();
c0.set_no_z_write_no_z_test();
// :test (new 'static 'gs-test :ate #x1 :afail #x3 :zte #x1 :ztst (gs-ztest always))
c0.channel_masks[3] = false; // no alpha writes.
c0.end_time = 300.;
c0.tex_name = "cas-conveyor";
FixedAnimDef conveyor_1;
conveyor_1.tex_name = "cas-conveyor-dest-01";
conveyor_1.color = math::Vector4<u8>(0, 0, 0, 0x80);
conveyor_1.override_size = math::Vector2<int>(64, 32);
auto& c1 = conveyor_1.layers.emplace_back();
c1.set_blend_b2_d1();
c1.set_no_z_write_no_z_test();
// :test (new 'static 'gs-test :ate #x1 :afail #x3 :zte #x1 :ztst (gs-ztest always))
c1.channel_masks[3] = false; // no alpha writes.
c1.end_time = 300.;
c1.tex_name = "cas-conveyor";
FixedAnimDef conveyor_2;
conveyor_2.tex_name = "cas-conveyor-dest-02";
conveyor_2.color = math::Vector4<u8>(0, 0, 0, 0x80);
conveyor_2.override_size = math::Vector2<int>(64, 32);
auto& c2 = conveyor_2.layers.emplace_back();
c2.set_blend_b2_d1();
c2.set_no_z_write_no_z_test();
// :test (new 'static 'gs-test :ate #x1 :afail #x3 :zte #x1 :ztst (gs-ztest always))
c2.channel_masks[3] = false; // no alpha writes.
c2.end_time = 300.;
c2.tex_name = "cas-conveyor";
FixedAnimDef conveyor_3;
conveyor_3.tex_name = "cas-conveyor-dest-03";
conveyor_3.color = math::Vector4<u8>(0, 0, 0, 0x80);
conveyor_3.override_size = math::Vector2<int>(64, 32);
auto& c3 = conveyor_3.layers.emplace_back();
c3.set_blend_b2_d1();
c3.set_no_z_write_no_z_test();
// :test (new 'static 'gs-test :ate #x1 :afail #x3 :zte #x1 :ztst (gs-ztest always))
c3.channel_masks[3] = false; // no alpha writes.
c3.end_time = 300.;
c3.tex_name = "cas-conveyor";
m_cas_conveyor_anim_array_idx =
create_fixed_anim_array({conveyor_0, conveyor_1, conveyor_2, conveyor_3});
}
// SECURITY
{
FixedAnimDef env;
env.color = math::Vector4<u8>(0, 0, 0, 0x80);
env.tex_name = "security-env-dest";
for (int i = 0; i < 2; i++) {
auto& env1 = env.layers.emplace_back();
env1.tex_name = "security-env-uscroll";
// :test (new 'static 'gs-test :ate #x1 :afail #x3 :zte #x1 :ztst (gs-ztest always))
env1.set_no_z_write_no_z_test();
env1.channel_masks[3] = false; // no alpha writes.
// :alpha (new 'static 'gs-alpha :b #x2 :d #x1)
env1.set_blend_b2_d1();
env1.end_time = 4800.f;
}
FixedAnimDef dot;
dot.color = math::Vector4<u8>(0, 0, 0, 0x80);
dot.tex_name = "security-dot-dest";
auto& cwhite = dot.layers.emplace_back();
cwhite.set_blend_b2_d1();
cwhite.set_no_z_write_no_z_test();
cwhite.tex_name = "common-white";
cwhite.end_time = 4800.f;
for (int i = 0; i < 2; i++) {
auto& dsrc = dot.layers.emplace_back();
dsrc.set_blend_b2_d1();
dsrc.set_no_z_write_no_z_test();
dsrc.end_time = 600.f;
dsrc.tex_name = "security-dot-src";
}
m_security_anim_array_idx = create_fixed_anim_array({env, dot});
}
// WATERFALL
{
FixedAnimDef waterfall;
waterfall.color = math::Vector4<u8>(0, 0, 0, 0x80);
waterfall.tex_name = "waterfall-dest";
for (int i = 0; i < 4; i++) {
auto& src = waterfall.layers.emplace_back();
src.set_blend_b1_d1();
src.set_no_z_write_no_z_test();
src.end_time = 450.f;
src.tex_name = "waterfall";
}
m_waterfall_anim_array_idx = create_fixed_anim_array({waterfall});
}
{
FixedAnimDef waterfall;
waterfall.color = math::Vector4<u8>(0, 0, 0, 0x80);
waterfall.tex_name = "waterfall-dest";
for (int i = 0; i < 4; i++) {
auto& src = waterfall.layers.emplace_back();
src.set_blend_b1_d1();
src.set_no_z_write_no_z_test();
src.end_time = 450.f;
src.tex_name = "waterfall";
}
m_waterfall_b_anim_array_idx = create_fixed_anim_array({waterfall});
}
// LAVA
{
FixedAnimDef lava;
lava.color = math::Vector4<u8>(0, 0, 0, 0x80);
lava.tex_name = "dig-lava-01-dest";
for (int i = 0; i < 2; i++) {
auto& src = lava.layers.emplace_back();
src.set_blend_b1_d1();
src.set_no_z_write_no_z_test();
src.end_time = 3600.f;
src.tex_name = "dig-lava-01";
}
m_lava_anim_array_idx = create_fixed_anim_array({lava});
}
{
FixedAnimDef lava;
lava.color = math::Vector4<u8>(0, 0, 0, 0x80);
lava.tex_name = "dig-lava-01-dest";
for (int i = 0; i < 2; i++) {
auto& src = lava.layers.emplace_back();
src.set_blend_b1_d1();
src.set_no_z_write_no_z_test();
src.end_time = 3600.f;
src.tex_name = "dig-lava-01";
}
m_lava_b_anim_array_idx = create_fixed_anim_array({lava});
}
// Stadiumb
{
FixedAnimDef def;
def.color = math::Vector4<u8>(0, 0, 0, 0x80);
def.tex_name = "stdmb-energy-wall-01-dest";
for (int i = 0; i < 2; i++) {
auto& src = def.layers.emplace_back();
src.set_blend_b1_d1();
src.set_no_z_write_no_z_test();
src.end_time = 300.f;
src.tex_name = "stdmb-energy-wall-01";
}
m_stadiumb_anim_array_idx = create_fixed_anim_array({def});
}
// Fortress pris
{
FixedAnimDef l_tread;
l_tread.color = math::Vector4<u8>(0, 0, 0, 0x80);
l_tread.tex_name = "robotank-tread-l-dest";
auto& l_src = l_tread.layers.emplace_back();
l_src.set_blend_b1_d1();
l_src.set_no_z_write_no_z_test();
l_src.channel_masks[3] = false; // no alpha writes.
l_src.end_time = 1.f;
l_src.tex_name = "robotank-tread";
FixedAnimDef r_tread;
r_tread.color = math::Vector4<u8>(0, 0, 0, 0x80);
r_tread.tex_name = "robotank-tread-r-dest";
auto& r_src = r_tread.layers.emplace_back();
r_src.set_blend_b1_d1();
r_src.set_no_z_write_no_z_test();
r_src.channel_masks[3] = false; // no alpha writes.
r_src.end_time = 1.f;
r_src.tex_name = "robotank-tread";
m_fortress_pris_anim_array_idx = create_fixed_anim_array({l_tread, r_tread});
}
// Fortress Warp
{
FixedAnimDef def;
def.color = math::Vector4<u8>(0, 0, 0, 0x80);
def.move_to_pool = true;
def.tex_name = "fort-roboscreen-dest";
auto& src = def.layers.emplace_back();
src.set_blend_b2_d1();
src.channel_masks[3] = false; // no alpha writes.
src.set_no_z_write_no_z_test();
src.end_time = 300.f;
src.tex_name = "fort-roboscreen-env";
m_fortress_warp_anim_array_idx = create_fixed_anim_array({def});
}
// metkor
{
FixedAnimDef def;
def.color = math::Vector4<u8>(0, 0, 0, 0x80);
def.tex_name = "squid-env-rim-dest";
def.move_to_pool = true;
{
auto& src = def.layers.emplace_back();
src.set_blend_b2_d1();
src.channel_masks[3] = false; // no alpha writes.
src.set_no_z_write_no_z_test();
src.set_clamp();
src.end_time = 1200.f;
src.tex_name = "metkor-head-env-noise";
}
{
auto& src = def.layers.emplace_back();
src.set_blend_b2_d1();
src.channel_masks[3] = false; // no alpha writes.
src.set_no_z_write_no_z_test();
src.set_clamp();
src.end_time = 1200.f;
src.tex_name = "metkor-head-env-scan";
}
{
auto& src = def.layers.emplace_back();
src.set_blend_b2_d1();
src.channel_masks[3] = false; // no alpha writes.
src.set_no_z_write_no_z_test();
src.set_clamp();
src.end_time = 1200.f;
src.tex_name = "metkor-head-env-rim";
}
{
auto& src = def.layers.emplace_back();
src.set_blend_b2_d1();
src.channel_masks[3] = false; // no alpha writes.
src.set_no_z_write_no_z_test();
src.set_clamp();
src.end_time = 1200.f;
src.tex_name = "metkor-head-env-rim";
}
{
auto& src = def.layers.emplace_back();
src.set_blend_b2_d1();
src.channel_masks[3] = false; // no alpha writes.
src.set_no_z_write_no_z_test();
src.set_clamp();
src.end_time = 1200.f;
src.tex_name = "environment-phong-rim";
}
m_metkor_anim_array_idx = create_fixed_anim_array({def});
}
// shield
{
FixedAnimDef def;
def.color = math::Vector4<u8>(0, 0, 0, 0x80);
def.tex_name = "squid-env-rim-dest";
def.move_to_pool = true;
{
auto& src = def.layers.emplace_back();
src.set_blend_b2_d1();
src.set_no_z_write_no_z_test();
src.set_clamp();
src.end_time = 1200.f;
src.tex_name = "common-white";
}
{
auto& src = def.layers.emplace_back();
src.set_blend_b2_d1();
src.channel_masks[3] = false; // no alpha writes.
src.set_no_z_write_no_z_test();
src.set_clamp();
src.end_time = 1200.f;
src.tex_name = "squid-env-uscroll";
}
{
auto& src = def.layers.emplace_back();
src.set_blend_b2_d1();
src.channel_masks[3] = false; // no alpha writes.
src.set_no_z_write_no_z_test();
src.set_clamp();
src.end_time = 1200.f;
src.tex_name = "squid-env-uscroll";
}
{
auto& src = def.layers.emplace_back();
src.set_blend_b2_d1();
src.channel_masks[3] = false; // no alpha writes.
src.set_no_z_write_no_z_test();
src.set_clamp();
src.end_time = 1200.f;
src.tex_name = "squid-env-rim-src";
}
{
auto& src = def.layers.emplace_back();
src.set_blend_b2_d1();
src.channel_masks[3] = false; // no alpha writes.
src.set_no_z_write_no_z_test();
src.set_clamp();
src.end_time = 1200.f;
src.tex_name = "squid-env-rim-src";
}
m_shield_anim_array_idx = create_fixed_anim_array({def});
}
// krew
{
FixedAnimDef def;
def.color = math::Vector4<u8>(0, 0, 0, 0x80);
def.tex_name = "krew-holo-dest";
def.move_to_pool = true;
{
auto& src = def.layers.emplace_back();
src.set_blend_b2_d1();
src.channel_masks[3] = false; // no alpha writes.
src.set_no_z_write_no_z_test();
src.set_clamp();
src.end_time = 1200.f;
src.tex_name = "metkor-head-env-noise";
}
{
auto& src = def.layers.emplace_back();
src.set_blend_b2_d1();
src.channel_masks[3] = false; // no alpha writes.
src.set_no_z_write_no_z_test();
src.set_clamp();
src.end_time = 1200.f;
src.tex_name = "metkor-head-env-scan";
}
{
auto& src = def.layers.emplace_back();
src.set_blend_b2_d1();
src.channel_masks[3] = false; // no alpha writes.
src.set_no_z_write_no_z_test();
src.set_clamp();
src.end_time = 1200.f;
src.tex_name = "metkor-head-env-rim";
}
{
auto& src = def.layers.emplace_back();
src.set_blend_b2_d1();
src.channel_masks[3] = false; // no alpha writes.
src.set_no_z_write_no_z_test();
src.set_clamp();
src.end_time = 1200.f;
src.tex_name = "metkor-head-env-rim";
}
{
auto& src = def.layers.emplace_back();
src.set_blend_b2_d1();
src.channel_masks[3] = false; // no alpha writes.
src.set_no_z_write_no_z_test();
src.set_clamp();
src.end_time = 1200.f;
src.tex_name = "metkor-phong-env";
}
m_krew_holo_anim_array_idx = create_fixed_anim_array({def});
}
{
m_slime_output_slot = output_slot_by_idx(m_version, "cas-toxic-slime-dest");
m_slime_scroll_output_slot = output_slot_by_idx(m_version, "cas-toxic-slime-scroll-dest");
const float max_times[4] = {600.f, 300.f, 150.f, 75.f};
const float scales[4] = {0.55, 0.6, 0.3, 0.1f};
for (int i = 0, dim = kFinalSlimeTextureSize >> (kNumSlimeNoiseLayers - 1);
i < kNumSlimeNoiseLayers; i++, dim *= 2) {
auto& tex = m_slime_noise_textures[i];
tex.temp_data.resize(dim * dim);
tex.max_time = max_times[i];
tex.scale = scales[i];
tex.dim = dim;
glGenTextures(1, &tex.new_tex);
m_random_index = update_opengl_noise_texture(tex.new_tex, tex.temp_data.data(),
m_random_table, dim, m_random_index);
glGenTextures(1, &tex.old_tex);
m_random_index = update_opengl_noise_texture(tex.old_tex, tex.temp_data.data(),
m_random_table, dim, m_random_index);
}
}
}

View File

@ -349,7 +349,9 @@ void Hfrag::render_hfrag_level(Hfrag::HfragLevel* lev,
b = false;
}
lev->stats = {};
for (u32 bucket_idx = 0; bucket_idx < lev->hfrag->buckets.size(); bucket_idx++) {
// bucket 0 is not drawn, although there is data there.
for (u32 bucket_idx = 1; bucket_idx < lev->hfrag->buckets.size(); bucket_idx++) {
const auto& bucket = lev->hfrag->buckets[bucket_idx];
for (u32 corner_idx : bucket.corners) {
const auto& corner = lev->hfrag->corners[corner_idx];

View File

@ -678,8 +678,6 @@
(mem-copy! (the-as pointer s4-1) (the-as pointer this) #x2814)
(setup-stars s4-1 (-> s4-1 star-mat) (-> this upload-data))
(when (nonzero? (-> s4-1 star-colors 0 x))
(format *stdcon* "doing stars asm!~%")
(format *stdcon* "~`matrix`I~%" (-> s4-1 star-mat))
(stars-transform-asm s4-1)
)
(cond

View File

@ -9,3 +9,234 @@
;; DECOMP BEGINS
(defun noise-texture-anim-layer-func ((arg0 dma-buffer) (arg1 uint) (arg2 int) (arg3 int) (arg4 texture-anim-layer) (arg5 float))
(format 0 "unsupported noise-texture-anim-layer-func~%")
(break!)
0
)
(defun cloud-texture-anim-layer-func ((arg0 dma-buffer) (arg1 uint) (arg2 int) (arg3 int) (arg4 texture-anim-layer) (arg5 float))
(format 0 "unsupported cloud-texture-anim-layer-func~%")
(break!)
0
)
(defun cloud-texture-anim-func ((arg0 dma-buffer) (arg1 texture-anim))
(format 0 "unsupported cloud-texture-anim-func~%")
(break!)
0
)
(defun fog-texture-anim-init ((arg0 texture-anim))
(let ((gp-0 (new 'loading-level 'fog8x256))
(s4-0 (new 'loading-level 'clut16x16))
)
(when (and gp-0 s4-0)
(let ((v1-5 (new 'loading-level 'texture)))
(let ((a0-4 (the int (-> arg0 extra x)))
(a1-3 (the int (-> arg0 extra y)))
)
(set! (-> arg0 tex) v1-5)
(set! (-> v1-5 pad 0) (the-as uint gp-0))
(set! (-> v1-5 pad 1) (the-as uint s4-0))
(set! (-> v1-5 w) 256)
(set! (-> v1-5 h) 1)
(set! (-> v1-5 num-mips) (the-as uint 1))
(set! (-> v1-5 psm) (gs-psm mt8))
(set! (-> v1-5 clutpsm) (the-as uint 0))
(set! (-> v1-5 dest 0) (the-as uint (* a0-4 32)))
(set! (-> v1-5 clutdest) (the-as uint (* a1-3 32)))
)
(set! (-> v1-5 width 0) (the-as uint 4))
(set! (-> v1-5 masks data 0 mask quad) (the-as uint128 0))
(set! (-> v1-5 masks data 1 mask quad) (the-as uint128 0))
(set! (-> v1-5 masks data 2 mask quad) (the-as uint128 0))
)
0
(dotimes (v1-7 256)
(nop!)
(nop!)
(nop!)
(nop!)
(set! (-> gp-0 image v1-7) (the-as uint v1-7))
)
)
)
0
)
(define *fog-texture-work* (new 'static 'fog-texture-work :const (new 'static 'vector :x 0.00390625)))
(defun real-fog-texture-anim-func ((arg0 dma-buffer) (arg1 texture-anim))
(local-vars (v1-11 float))
(rlet ((vf1 :class vf)
(vf2 :class vf)
)
(let ((s4-0 (new 'stack-no-clear 'vector))
(s3-0 (new 'stack-no-clear 'vector))
(s1-0 *fog-texture-work*)
(s2-0 (the-as (pointer uint32) (-> arg1 tex pad 1)))
)
(let ((v1-1 (-> s1-0 color)))
(dotimes (a0-1 256)
(set! (-> s2-0 a0-1) (the-as uint v1-1))
)
)
(vector+! (-> s1-0 max-corner) (the-as vector (-> s1-0 corner)) (-> s1-0 corner 1))
(vector-float*! (-> s1-0 max-corner) (-> s1-0 max-corner) 0.5)
(vector+! (-> s1-0 min-corner) (-> s1-0 corner 2) (-> s1-0 corner 3))
(vector-float*! (-> s1-0 min-corner) (-> s1-0 min-corner) 0.5)
(when (< (-> s1-0 max-corner y) (-> s1-0 min-corner y))
(.lvf vf1 (&-> s1-0 min-corner quad))
(.lvf vf2 (&-> s1-0 max-corner quad))
(.svf (&-> s1-0 max-corner quad) vf1)
(.svf (&-> s1-0 min-corner quad) vf2)
(.mov v1-11 vf2)
)
(let* ((f0-3 (-> s1-0 corner 0 y))
(f2-0 (-> s1-0 corner 1 y))
(f1-1 (fmin f0-3 f2-0))
(f2-1 (fmax f0-3 f2-0))
(f3-0 (-> s1-0 corner 2 y))
(f0-4 (-> s1-0 corner 3 y))
(f1-3 (fmin (fmin f1-1 f3-0) f0-4))
(f0-5 (fmax (fmax f2-1 f3-0) f0-4))
)
(set! (-> s1-0 min-corner y) f1-3)
(set! (-> s1-0 max-corner y) f0-5)
)
(set! (-> s4-0 quad) (-> s1-0 min-corner quad))
(vector-! s3-0 (-> s1-0 max-corner) (-> s1-0 min-corner))
(vector-float/! s3-0 s3-0 256.0)
0.0
0.0
(let ((f0-9 (fmax 4096.0 (-> *math-camera* trans y)))
(f1-5 (-> arg1 extra z))
(f2-3 (-> s1-0 alpha-near))
(f3-1 (-> s1-0 alpha-far))
(f4-0 (-> s1-0 alpha-delta))
(f5-0 (-> s1-0 fog-near))
(f6-0 (-> s1-0 fog-far))
(f7-0 (-> s1-0 fog-delta))
)
(dotimes (v1-17 256)
(let* ((f8-0 (-> s4-0 y))
(f8-1 (cond
((= f8-0 0.0)
f3-1
)
((< f8-0 0.0)
(let ((f9-4 (fmin f6-0 (/ (* f0-9 (vector-length s4-0)) (- f8-0)))))
(+ f2-3 (* f4-0 (/ (fmax 0.0 (- f9-4 f5-0)) f7-0)))
)
)
(else
(let ((f9-8 (fmin f6-0 (/ (* f1-5 (vector-length s4-0)) f8-0))))
(+ f2-3 (* f4-0 (/ (fmax 0.0 (- f9-8 f5-0)) f7-0)))
)
)
)
)
)
(set! (-> s2-0 (-> *clut-translate* v1-17))
(logior (logand (-> s2-0 (-> *clut-translate* v1-17)) (the-as uint #xffffffff00ffffff))
(shr (shl (the int (* 128.0 f8-1)) 56) 32)
)
)
)
(vector+! s4-0 s4-0 s3-0)
)
)
)
(let ((s5-1 (-> arg1 tex))
(v1-20 *display*)
(a0-26 144)
)
(+! (-> v1-20 mem-reserve-size) a0-26)
(the-as
int
(when (not (-> v1-20 dma-buffer-overflow))
(let ((a2-3 (-> v1-20 frames (-> v1-20 on-screen) global-buf)))
(if (< (-> a2-3 real-buffer-end) (the-as int (&+ (-> a2-3 base) a0-26)))
(set! (-> v1-20 dma-buffer-overflow) #t)
)
)
(when (not (-> v1-20 dma-buffer-overflow))
;; PC port of texture upload:
(pc-texture-anim-flag upload-generic-vram arg0 :qwc 1)
(let ((upload-record (the texture-anim-pc-upload (-> arg0 base))))
(set! (-> upload-record data) (the-as pointer (-> s5-1 pad 0))) ;; the texture data
(set! (-> upload-record width) (-> s5-1 w)) ;; see fog-texture-anim-init, there's not cropping.
(set! (-> upload-record height) (-> s5-1 h))
(set! (-> upload-record dest) (-> s5-1 dest 0))
(set! (-> upload-record format) (-> s5-1 psm))
(set! (-> upload-record force-to-gpu) 1)
)
(&+! (-> arg0 base) 16)
;; original upload
; (dma-buffer-add-gs-set arg0
; (bitbltbuf
; (new 'static 'gs-bitbltbuf :dpsm (the-as int (-> s5-1 psm)) :dbp (-> s5-1 dest 0) :dbw (-> s5-1 width 0))
; )
; (trxpos (new 'static 'gs-trxpos))
; (trxreg (new 'static 'gs-trxreg :rrw (-> s5-1 w) :rrh (-> s5-1 h)))
; (trxdir (new 'static 'gs-trxdir))
; )
; (dma-buffer-add-ref-texture arg0 (the-as pointer (-> s5-1 pad 0)) (-> s5-1 w) (-> s5-1 h) (-> s5-1 psm))
;; PC port of clut upload
;;(upload-vram-data arg0 (the-as int (-> s5-1 clutdest)) (the-as pointer (-> s5-1 pad 1)) 16 16)
(pc-texture-anim-flag upload-clut-16-16 arg0 :qwc 1)
(let ((upload-record (the texture-anim-pc-upload (-> arg0 base))))
(set! (-> upload-record data) (the-as pointer (-> s5-1 pad 1))) ;; the clut16x16 object
(set! (-> upload-record width) 16)
(set! (-> upload-record height) 16)
(set! (-> upload-record dest) (-> s5-1 clutdest))
(set! (-> upload-record format) (gs-psm ct32))
)
(&+! (-> arg0 base) 16)
(set! (-> *texture-pool* ids (shr (-> s5-1 clutdest) 6)) (the-as uint 0))
; (let* ((v1-29 arg0)
; (a0-39 (-> v1-29 base))
; )
; (set! (-> (the-as (pointer int64) a0-39)) #x10000002)
; (s.w! (+ a0-39 8) 0)
; (let ((a1-52 #x50000002))
; (s.w! (+ a0-39 12) a1-52)
; )
; (set! (-> v1-29 base) (&+ a0-39 16))
; )
; (let* ((v1-30 arg0)
; (a0-41 (-> v1-30 base))
; )
; (set! (-> (the-as (pointer uint64) a0-41)) (make-u128 0 (the-as uint #x1000000000008001)))
; (let ((a1-55 (the-as uint #xeeeeeeeeeeeeeeee)))
; (s.d! (+ a0-41 8) a1-55)
; )
; (set! (-> v1-30 base) (&+ a0-41 16))
; )
; (let ((v1-31 (-> arg0 base)))
; (set! (-> (the-as (pointer int64) v1-31)) 0)
; (let ((a0-43 63))
; (s.d! (+ v1-31 8) a0-43)
; )
; (set! (-> arg0 base) (&+ v1-31 16))
; )
(let ((v1-34 (shr (-> s5-1 dest 0) 6)))
(dotimes (a0-44 3)
(set! (-> *texture-pool* ids (+ v1-34 a0-44)) (the-as uint 0))
)
)
#f
)
)
)
)
)
)
(defun fog-texture-anim-func ((arg0 dma-buffer) (arg1 texture-anim))
(real-fog-texture-anim-func arg0 arg1)
)

View File

@ -11,34 +11,41 @@
;; DECOMP BEGINS
(deftype texture-anim-layer (structure)
((extra vector :inline :offset 240)
(func (function dma-buffer uint int int texture-anim-layer float int))
(func-id symbol :overlay-at func)
(init-func (function texture-anim-layer int))
(init-func-id symbol :overlay-at init-func)
(tex texture)
(start-time float)
(end-time float)
(tex-name string)
(test gs-test)
(alpha gs-alpha)
(clamp gs-clamp)
(start-color vector :inline :offset 80)
(start-scale vector2 :inline :offset 96)
(start-offset vector2 :inline :offset 104)
(start-st-scale vector2 :inline :offset 112)
(start-st-offset vector2 :inline :offset 120)
(start-qs vector :inline :offset 128)
(start-rot degrees :offset 144)
(start-st-rot degrees :offset 148)
(end-color vector :inline :offset 160)
(end-scale vector2 :inline :offset 176)
(end-offset vector2 :inline :offset 184)
(end-st-scale vector2 :inline :offset 192)
(end-st-offset vector2 :inline :offset 200)
(end-qs vector :inline :offset 208)
(end-rot degrees :offset 224)
(end-st-rot degrees :offset 228)
((interpolated-color vector :inline)
(interpolated-scale-offset vector :inline)
(interpolated-st-scale-offset vector :inline)
(interpolated-qs vector :inline)
(interpolated-rot vector :inline)
(extra vector :inline :offset 240)
(func (function dma-buffer uint int int texture-anim-layer float int))
(func-id symbol :overlay-at func)
(init-func (function texture-anim-layer int))
(init-func-id symbol :overlay-at init-func)
(tex texture)
(start-time float)
(end-time float)
(tex-name string)
(test gs-test)
(alpha gs-alpha)
(clamp gs-clamp)
(start-vectors vector 5 :inline :offset 80) ;; added
(start-color vector :inline :offset 80)
(start-scale vector2 :inline :offset 96)
(start-offset vector2 :inline :offset 104)
(start-st-scale vector2 :inline :offset 112)
(start-st-offset vector2 :inline :offset 120)
(start-qs vector :inline :offset 128)
(start-rot degrees :offset 144)
(start-st-rot degrees :offset 148)
(end-vectors vector 5 :inline :offset 160) ;; added
(end-color vector :inline :offset 160)
(end-scale vector2 :inline :offset 176)
(end-offset vector2 :inline :offset 184)
(end-st-scale vector2 :inline :offset 192)
(end-st-offset vector2 :inline :offset 200)
(end-qs vector :inline :offset 208)
(end-rot degrees :offset 224)
(end-st-rot degrees :offset 228)
)
(:methods
(initialize-texture! (_type_) _type_)

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -18,11 +18,11 @@
)
(format #t "skipping init in texture-finish.~%")
; (init! *sky-texture-anim-array*)
; (init! *darkjak-texture-anim-array*)
; (init! *skull-gem-texture-anim-array*)
; (init! *default-water-texture-anim-array*)
; (init! *default-warp-texture-anim-array*)
(init! *sky-texture-anim-array*)
(init! *darkjak-texture-anim-array*)
(init! *skull-gem-texture-anim-array*)
(init! *default-water-texture-anim-array*)
(init! *default-warp-texture-anim-array*)
(kmemclose)

View File

@ -16,6 +16,10 @@
(none)
)
(defmethod cloth-system-cmd-handler ((this cloth-system) (cmds pair))
(format 0 "unimplemented cloth-system-cmd-handler~%")
(none)
)
(defmethod init! ((this cloth-base))
;; this looks more like run! than init to me.

View File

@ -3,34 +3,41 @@
;; definition of type texture-anim-layer
(deftype texture-anim-layer (structure)
((extra vector :inline :offset 240)
(func (function dma-buffer uint int int texture-anim-layer float int))
(func-id symbol :overlay-at func)
(init-func (function texture-anim-layer int))
(init-func-id symbol :overlay-at init-func)
(tex texture)
(start-time float)
(end-time float)
(tex-name string)
(test gs-test)
(alpha gs-alpha)
(clamp gs-clamp)
(start-color vector :inline :offset 80)
(start-scale vector2 :inline :offset 96)
(start-offset vector2 :inline :offset 104)
(start-st-scale vector2 :inline :offset 112)
(start-st-offset vector2 :inline :offset 120)
(start-qs vector :inline :offset 128)
(start-rot degrees :offset 144)
(start-st-rot degrees :offset 148)
(end-color vector :inline :offset 160)
(end-scale vector2 :inline :offset 176)
(end-offset vector2 :inline :offset 184)
(end-st-scale vector2 :inline :offset 192)
(end-st-offset vector2 :inline :offset 200)
(end-qs vector :inline :offset 208)
(end-rot degrees :offset 224)
(end-st-rot degrees :offset 228)
((interpolated-color vector :inline)
(interpolated-scale-offset vector :inline)
(interpolated-st-scale-offset vector :inline)
(interpolated-qs vector :inline)
(interpolated-rot vector :inline)
(extra vector :inline :offset 240)
(func (function dma-buffer uint int int texture-anim-layer float int))
(func-id symbol :overlay-at func)
(init-func (function texture-anim-layer int))
(init-func-id symbol :overlay-at init-func)
(tex texture)
(start-time float)
(end-time float)
(tex-name string)
(test gs-test)
(alpha gs-alpha)
(clamp gs-clamp)
(start-vectors vector 5 :inline :offset 80)
(start-color vector :inline :overlay-at (-> start-vectors 0))
(start-scale vector2 :inline :offset 96)
(start-offset vector2 :inline :offset 104)
(start-st-scale vector2 :inline :offset 112)
(start-st-offset vector2 :inline :offset 120)
(start-qs vector :inline :overlay-at (-> start-vectors 3))
(start-rot degrees :offset 144)
(start-st-rot degrees :offset 148)
(end-vectors vector 5 :inline :offset 160)
(end-color vector :inline :overlay-at (-> end-vectors 0))
(end-scale vector2 :inline :offset 176)
(end-offset vector2 :inline :offset 184)
(end-st-scale vector2 :inline :offset 192)
(end-st-offset vector2 :inline :offset 200)
(end-qs vector :inline :overlay-at (-> end-vectors 3))
(end-rot degrees :offset 224)
(end-st-rot degrees :offset 228)
)
(:methods
(initialize-texture! (_type_) _type_)