diff --git a/CMakeLists.txt b/CMakeLists.txt index acbe8a1..51b10a6 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -164,15 +164,11 @@ if(NOT APPLE AND NOT EMSCRIPTEN) set(ALL_SHADER_HEADERS "${HEADERS_DIR}/postfx_vert_spv.h" "${HEADERS_DIR}/postfx_frag_spv.h" - "${HEADERS_DIR}/upscale_frag_spv.h" - "${HEADERS_DIR}/downscale_frag_spv.h" "${HEADERS_DIR}/crtpi_frag_spv.h" ) set(ALL_SHADER_SOURCES "${SHADERS_DIR}/postfx.vert" "${SHADERS_DIR}/postfx.frag" - "${SHADERS_DIR}/upscale.frag" - "${SHADERS_DIR}/downscale.frag" "${SHADERS_DIR}/crtpi_frag.glsl" ) diff --git a/Makefile b/Makefile index 8345952..1d735e3 100644 --- a/Makefile +++ b/Makefile @@ -20,7 +20,7 @@ RESOURCE_FILE := release/windows/coffee.res # ============================================================================== SHADER_CMAKE := $(DIR_ROOT)tools/shaders/compile_spirv.cmake SHADERS_DIR := $(DIR_ROOT)data/shaders -HEADERS_DIR := $(DIR_ROOT)source/core/rendering/sdl3gpu +HEADERS_DIR := $(DIR_ROOT)source/core/rendering/sdl3gpu/spv ifeq ($(OS),Windows_NT) GLSLC := $(shell where glslc 2>NUL) else diff --git a/data/lang/ba_BA.json b/data/lang/ba_BA.json index 0324015..52038d9 100644 --- a/data/lang/ba_BA.json +++ b/data/lang/ba_BA.json @@ -83,7 +83,6 @@ "[SERVICE_MENU] SHADER": "Shader", "[SERVICE_MENU] SHADER_DISABLED": "Desactivat", "[SERVICE_MENU] SHADER_PRESET": "Preset", - "[SERVICE_MENU] SUPERSAMPLING": "Supermostreig", "[SERVICE_MENU] VSYNC": "Sincronisme vertical", "[SERVICE_MENU] INTEGER_SCALE": "Escalat sencer", "[SERVICE_MENU] FILTER": "Filtre", diff --git a/data/lang/en_UK.json b/data/lang/en_UK.json index 0df1cfc..0352f51 100644 --- a/data/lang/en_UK.json +++ b/data/lang/en_UK.json @@ -82,7 +82,6 @@ "[SERVICE_MENU] SHADER": "Shader", "[SERVICE_MENU] SHADER_DISABLED": "Disabled", "[SERVICE_MENU] SHADER_PRESET": "Preset", - "[SERVICE_MENU] SUPERSAMPLING": "Supersampling", "[SERVICE_MENU] VSYNC": "V-Sync", "[SERVICE_MENU] INTEGER_SCALE": "Integer Scale", "[SERVICE_MENU] FILTER": "Filter", diff --git a/data/lang/es_ES.json b/data/lang/es_ES.json index 0571492..06c2e2d 100644 --- a/data/lang/es_ES.json +++ b/data/lang/es_ES.json @@ -82,7 +82,6 @@ "[SERVICE_MENU] SHADER": "Shader", "[SERVICE_MENU] SHADER_DISABLED": "Desactivado", "[SERVICE_MENU] SHADER_PRESET": "Preset", - "[SERVICE_MENU] SUPERSAMPLING": "Supersampling", "[SERVICE_MENU] VSYNC": "Sincronismo vertical", "[SERVICE_MENU] INTEGER_SCALE": "Escalado proporcional", "[SERVICE_MENU] FILTER": "Filtro", diff --git a/data/shaders/downscale.frag b/data/shaders/downscale.frag deleted file mode 100644 index fe5b9b5..0000000 --- a/data/shaders/downscale.frag +++ /dev/null @@ -1,48 +0,0 @@ -#version 450 -layout(location = 0) in vec2 v_uv; -layout(location = 0) out vec4 out_color; - -layout(set = 2, binding = 0) uniform sampler2D source; - -layout(set = 3, binding = 0) uniform DownscaleUniforms { - int algorithm; // 0 = Lanczos2 (ventana 2, ±2 taps), 1 = Lanczos3 (ventana 3, ±3 taps) - float pad0; - float pad1; - float pad2; -} u; - -// Kernel Lanczos normalizado: sinc(t) * sinc(t/a) para |t| < a, 0 fuera. -float lanczos(float t, float a) { - t = abs(t); - if (t < 0.0001) { return 1.0; } - if (t >= a) { return 0.0; } - const float PI = 3.14159265358979; - float pt = PI * t; - return (a * sin(pt) * sin(pt / a)) / (pt * pt); -} - -void main() { - vec2 src_size = vec2(textureSize(source, 0)); - // Posición en coordenadas de texel (centros de texel en N+0.5) - vec2 p = v_uv * src_size; - vec2 p_floor = floor(p); - - float a = (u.algorithm == 0) ? 2.0 : 3.0; - int win = int(a); - - vec4 color = vec4(0.0); - float weight_sum = 0.0; - - for (int j = -win; j <= win; j++) { - for (int i = -win; i <= win; i++) { - // Centro del texel (i,j) relativo a p_floor - vec2 tap_center = p_floor + vec2(float(i), float(j)) + 0.5; - vec2 offset = tap_center - p; - float w = lanczos(offset.x, a) * lanczos(offset.y, a); - color += texture(source, tap_center / src_size) * w; - weight_sum += w; - } - } - - out_color = (weight_sum > 0.0) ? (color / weight_sum) : vec4(0.0, 0.0, 0.0, 1.0); -} diff --git a/data/shaders/postfx.frag b/data/shaders/postfx.frag index 238c7a7..7bf78ce 100644 --- a/data/shaders/postfx.frag +++ b/data/shaders/postfx.frag @@ -6,7 +6,9 @@ // xxd -i postfx.frag.spv > ../../source/core/rendering/sdl3gpu/postfx_frag_spv.h // // PostFXUniforms must match exactly the C++ struct in sdl3gpu_shader.hpp -// (8 floats, 32 bytes, std140/scalar layout). +// (16 floats = 4 × vec4 = 64 bytes, std140/scalar layout). +// IMPORTANT: Qualsevol canvi ací cal replicar-lo a mà a +// source/core/rendering/sdl3gpu/msl/postfx_frag.msl.h (no hi ha generador). layout(location = 0) in vec2 v_uv; layout(location = 0) out vec4 out_color; @@ -24,8 +26,13 @@ layout(set = 3, binding = 0) uniform PostFXUniforms { float bleeding; float pixel_scale; // physical pixels per logical pixel (vh / tex_height_) float time; // seconds since SDL init - float oversample; // supersampling factor (1.0 = off, 3.0 = 3×SS) - float flicker; // 0 = off, 1 = phosphor flicker ~50 Hz — 48 bytes total (3 × 16) + float flicker; // 0 = off, 1 = phosphor flicker ~50 Hz + float pad2; // padding per tancar vec4 #2 + // vec4 #3 — paràmetres de scanlines (exposats per preset YAML) + float scan_dark_ratio; // fracció de subfila fosca per fila lògica (1/3 ≈ 0.333) + float scan_dark_floor; // multiplicador de brillantor de la subfila fosca + float scan_edge_soft; // 0 = step dur; 1 = suavitzat d'1 píxel físic (estil crtpi) + float pad3; // padding per tancar a 64 bytes (4 × vec4) } u; // YCbCr helpers for NTSC bleeding @@ -69,11 +76,11 @@ void main() { vec3 base = texture(scene, uv).rgb; // Sangrado NTSC — difuminado horizontal de crominancia. - // step = 1 pixel lógico de juego en UV (corrige SS: textureSize.x = game_w * oversample). + // step = 1 pixel lógico de juego en UV. vec3 colour; if (u.bleeding > 0.0) { float tw = float(textureSize(scene, 0).x); - float step = u.oversample / tw; // 1 pixel lógico en UV + float step = 1.0 / tw; // 1 pixel lógico en UV vec3 ycc = rgb_to_ycc(base); vec3 ycc_l2 = rgb_to_ycc(texture(scene, uv - vec2(2.0*step, 0.0)).rgb); vec3 ycc_l1 = rgb_to_ycc(texture(scene, uv - vec2(1.0*step, 0.0)).rgb); @@ -96,15 +103,20 @@ void main() { colour = mix(colour, lin, u.gamma_strength); } - // Scanlines — 1 pixel físico oscuro por fila lógica. - // Modelo sustractivo: las filas de scanline se oscurecen, las demás no cambian. - // Esto evita el efecto de sobrebrillo en contenido con colores vivos. + // Scanlines — tècnica dels 3 subpíxels verticals per píxel lògic (aee/projecte_2026): + // franja fosca ocupant `scan_dark_ratio` al final de cada fila lògica. La transició es + // suavitza amb smoothstep d'ample ≈ 1 píxel físic (estil crtpi: filtratge analític + // continu), controlat per `scan_edge_soft`. A 0 és equivalent al step dur antic. if (u.scanline_strength > 0.0) { - float ps = max(1.0, round(u.pixel_scale)); - float frac_in_row = fract(uv.y * u.screen_height); - float row_pos = floor(frac_in_row * ps); - float is_dark = step(ps - 1.0, row_pos); - float scan = mix(1.0, 0.0, is_dark); + float ps = max(u.pixel_scale, 1.0); + float sub = fract(uv.y * u.screen_height); // [0,1) dins la fila lògica + float dark_center = 1.0 - u.scan_dark_ratio * 0.5; // centre de la franja fosca + float d = abs(sub - dark_center); + d = min(d, 1.0 - d); // wrap a la fila següent + float half_width = u.scan_dark_ratio * 0.5; + float softness = u.scan_edge_soft * 0.5 / ps; // mig píxel físic a cada costat + float band = 1.0 - smoothstep(half_width - softness, half_width + softness, d); + float scan = mix(1.0, u.scan_dark_floor, band); colour *= mix(1.0, scan, u.scanline_strength); } diff --git a/data/shaders/upscale.frag b/data/shaders/upscale.frag deleted file mode 100644 index fb9200d..0000000 --- a/data/shaders/upscale.frag +++ /dev/null @@ -1,15 +0,0 @@ -#version 450 - -// Vulkan GLSL fragment shader — Nearest-neighbour upscale pass -// Used as the first render pass when supersampling is active. -// Compile: glslc upscale.frag -o upscale.frag.spv -// xxd -i upscale.frag.spv > ../../source/core/rendering/sdl3gpu/upscale_frag_spv.h - -layout(location = 0) in vec2 v_uv; -layout(location = 0) out vec4 out_color; - -layout(set = 2, binding = 0) uniform sampler2D scene; - -void main() { - out_color = texture(scene, v_uv); -} diff --git a/source/core/input/global_inputs.cpp b/source/core/input/global_inputs.cpp index ba4cd70..a59db9e 100644 --- a/source/core/input/global_inputs.cpp +++ b/source/core/input/global_inputs.cpp @@ -6,15 +6,15 @@ #include // Para pair #include // Para vector -#include "core/audio/audio.hpp" // Para Audio -#include "core/input/input.hpp" // Para Input -#include "core/locale/lang.hpp" // Para getText, getLangFile, getLangName, getNextLangCode, loadFromFile -#include "core/rendering/screen.hpp" // Para Screen -#include "core/system/section.hpp" // Para Name, name, Options, options, AttractMode, attract_mode -#include "game/options.hpp" // Para Video, video, Settings, settings, Audio, audio, Window, window -#include "game/ui/notifier.hpp" // Para Notifier -#include "game/ui/service_menu.hpp" // Para ServiceMenu -#include "utils/utils.hpp" // Para boolToOnOff +#include "core/audio/audio.hpp" // Para Audio +#include "core/input/input.hpp" // Para Input +#include "core/locale/lang.hpp" // Para getText, getLangFile, getLangName, getNextLangCode, loadFromFile +#include "core/rendering/screen.hpp" // Para Screen +#include "core/system/section.hpp" // Para Name, name, Options, options, AttractMode, attract_mode +#include "game/options.hpp" // Para Video, video, Settings, settings, Audio, audio, Window, window +#include "game/ui/notifier.hpp" // Para Notifier +#include "game/ui/service_menu.hpp" // Para ServiceMenu +#include "utils/utils.hpp" // Para boolToOnOff namespace GlobalInputs { // Termina @@ -91,12 +91,6 @@ namespace GlobalInputs { } } - // Activa o desactiva el supersampling - void toggleSupersampling() { - Screen::toggleSupersampling(); - Notifier::get()->show({"SS: " + std::string(Options::video.supersampling.enabled ? "ON" : "OFF")}); - } - // Cambia al siguiente idioma void setNextLang() { const std::string CODE = "LANG"; @@ -227,10 +221,6 @@ namespace GlobalInputs { nextPreset(); return true; } - if (Input::get()->checkAction(Input::Action::TOGGLE_SUPERSAMPLING, Input::DO_NOT_ALLOW_REPEAT, Input::CHECK_KEYBOARD)) { - toggleSupersampling(); - return true; - } return false; } diff --git a/source/core/input/input.hpp b/source/core/input/input.hpp index faeb6f0..c3b229b 100644 --- a/source/core/input/input.hpp +++ b/source/core/input/input.hpp @@ -83,7 +83,6 @@ class Input { {Action::TOGGLE_VIDEO_POSTFX, KeyState(SDL_SCANCODE_F4)}, {Action::NEXT_SHADER, KeyState(SDL_SCANCODE_8)}, {Action::NEXT_POSTFX_PRESET, KeyState(SDL_SCANCODE_9)}, - {Action::TOGGLE_SUPERSAMPLING, KeyState(SDL_SCANCODE_0)}, {Action::TOGGLE_VIDEO_INTEGER_SCALE, KeyState(SDL_SCANCODE_F5)}, {Action::TOGGLE_VIDEO_VSYNC, KeyState(SDL_SCANCODE_F6)}, diff --git a/source/core/input/input_types.cpp b/source/core/input/input_types.cpp index 7c9efd7..3c6851b 100644 --- a/source/core/input/input_types.cpp +++ b/source/core/input/input_types.cpp @@ -24,7 +24,6 @@ const std::unordered_map ACTION_TO_STRING = { {InputAction::TOGGLE_VIDEO_POSTFX, "TOGGLE_VIDEO_POSTFX"}, {InputAction::NEXT_SHADER, "NEXT_SHADER"}, {InputAction::NEXT_POSTFX_PRESET, "NEXT_POSTFX_PRESET"}, - {InputAction::TOGGLE_SUPERSAMPLING, "TOGGLE_SUPERSAMPLING"}, {InputAction::TOGGLE_VIDEO_INTEGER_SCALE, "TOGGLE_VIDEO_INTEGER_SCALE"}, {InputAction::TOGGLE_VIDEO_VSYNC, "TOGGLE_VIDEO_VSYNC"}, {InputAction::RESET, "RESET"}, @@ -57,7 +56,6 @@ const std::unordered_map STRING_TO_ACTION = { {"TOGGLE_VIDEO_POSTFX", InputAction::TOGGLE_VIDEO_POSTFX}, {"NEXT_SHADER", InputAction::NEXT_SHADER}, {"NEXT_POSTFX_PRESET", InputAction::NEXT_POSTFX_PRESET}, - {"TOGGLE_SUPERSAMPLING", InputAction::TOGGLE_SUPERSAMPLING}, {"TOGGLE_VIDEO_INTEGER_SCALE", InputAction::TOGGLE_VIDEO_INTEGER_SCALE}, {"TOGGLE_VIDEO_VSYNC", InputAction::TOGGLE_VIDEO_VSYNC}, {"RESET", InputAction::RESET}, diff --git a/source/core/input/input_types.hpp b/source/core/input/input_types.hpp index acfa601..52308f7 100644 --- a/source/core/input/input_types.hpp +++ b/source/core/input/input_types.hpp @@ -35,7 +35,6 @@ enum class InputAction : std::uint8_t { // Acciones de entrada posibles en el j TOGGLE_VIDEO_POSTFX, NEXT_SHADER, NEXT_POSTFX_PRESET, - TOGGLE_SUPERSAMPLING, TOGGLE_VIDEO_INTEGER_SCALE, TOGGLE_VIDEO_VSYNC, RESET, diff --git a/source/core/rendering/screen.cpp b/source/core/rendering/screen.cpp index 5de4cb0..e528ecd 100644 --- a/source/core/rendering/screen.cpp +++ b/source/core/rendering/screen.cpp @@ -337,7 +337,6 @@ auto Screen::buildDebugInfoText() const -> std::string { } else { const std::string PRESET_NAME = Options::postfx_presets.empty() ? "" : Options::postfx_presets.at(static_cast(Options::video.shader.current_postfx_preset)).name; info_text += " - postfx " + toLower(PRESET_NAME); - if (Options::video.supersampling.enabled) { info_text += " (ss)"; } } return info_text; } @@ -381,10 +380,6 @@ void Screen::initShaders() { std::cout << "Screen::initShaders: SDL3GPUShader::init() = " << (OK ? "OK" : "FAILED") << '\n'; } if (self->shader_backend_ && self->shader_backend_->isHardwareAccelerated()) { - self->shader_backend_->setLinearUpscale(Options::video.supersampling.linear_upscale); - self->shader_backend_->setDownscaleAlgo(Options::video.supersampling.downscale_algo); - self->shader_backend_->setOversample(Options::video.supersampling.enabled ? 3 : 1); - if (!Options::video.shader.enabled) { // Passthrough: POSTFX con parámetros a cero self->shader_backend_->setActiveShader(Rendering::ShaderType::POSTFX); @@ -589,24 +584,9 @@ void Screen::nextCrtPiPreset() { } } -// Alterna supersampling -void Screen::toggleSupersampling() { - Options::video.supersampling.enabled = !Options::video.supersampling.enabled; - auto* self = Screen::get(); - if (self != nullptr && self->shader_backend_ && self->shader_backend_->isHardwareAccelerated()) { - self->shader_backend_->setOversample(Options::video.supersampling.enabled ? 3 : 1); - if (Options::video.shader.current_shader == Rendering::ShaderType::CRTPI) { - self->applyCurrentCrtPiPreset(); - } else { - self->applyCurrentPostFXPreset(); - } - } -} - // Aplica el preset PostFX activo al backend void Screen::applyCurrentPostFXPreset() { if (!shader_backend_) { return; } - shader_backend_->setOversample(Options::video.supersampling.enabled ? 3 : 1); Rendering::PostFXParams p{}; if (Options::video.shader.enabled && !Options::postfx_presets.empty()) { const auto& preset = Options::postfx_presets.at(static_cast(Options::video.shader.current_postfx_preset)); @@ -618,6 +598,9 @@ void Screen::applyCurrentPostFXPreset() { p.curvature = preset.curvature; p.bleeding = preset.bleeding; p.flicker = preset.flicker; + p.scan_dark_ratio = preset.scan_dark_ratio; + p.scan_dark_floor = preset.scan_dark_floor; + p.scan_edge_soft = preset.scan_edge_soft; std::cout << "Screen::applyCurrentPostFXPreset: preset='" << preset.name << "' scan=" << p.scanlines << " vign=" << p.vignette << " chroma=" << p.chroma << '\n'; } shader_backend_->setPostFXParams(p); diff --git a/source/core/rendering/screen.hpp b/source/core/rendering/screen.hpp index 92fc271..dfd72b4 100644 --- a/source/core/rendering/screen.hpp +++ b/source/core/rendering/screen.hpp @@ -44,13 +44,12 @@ class Screen { // --- Efectos visuales --- void shake(int desp = 2, float delay_s = 0.05F, float duration_s = 0.133F) { shake_effect_.enable(src_rect_, dst_rect_, desp, delay_s, duration_s); } void flash(Color color, float duration_s = 0.167F, float delay_s = 0.0F) { flash_effect_ = FlashEffect(true, duration_s, delay_s, color); } - static void toggleShaders(); // Alterna activar/desactivar shaders - static void nextShader(); // Cambia entre PostFX y CrtPi - static void nextPostFXPreset(); // Avanza al siguiente preset PostFX - static void nextCrtPiPreset(); // Avanza al siguiente preset CrtPi - static void toggleSupersampling(); // Alterna supersampling - void toggleFilter(); // Alterna SDL_SCALEMODE_NEAREST ↔ SDL_SCALEMODE_LINEAR - void applyFilter(); // Aplica Options::video.scale_mode a game_canvas_ + static void toggleShaders(); // Alterna activar/desactivar shaders + static void nextShader(); // Cambia entre PostFX y CrtPi + static void nextPostFXPreset(); // Avanza al siguiente preset PostFX + static void nextCrtPiPreset(); // Avanza al siguiente preset CrtPi + void toggleFilter(); // Alterna SDL_SCALEMODE_NEAREST ↔ SDL_SCALEMODE_LINEAR + void applyFilter(); // Aplica Options::video.scale_mode a game_canvas_ void toggleIntegerScale(); void toggleVSync(); // Alterna entre activar y desactivar el V-Sync void setVSync(bool enabled); // Establece el estado del V-Sync diff --git a/source/core/rendering/sdl3gpu/msl/crtpi_frag.msl.h b/source/core/rendering/sdl3gpu/msl/crtpi_frag.msl.h new file mode 100644 index 0000000..f7989ea --- /dev/null +++ b/source/core/rendering/sdl3gpu/msl/crtpi_frag.msl.h @@ -0,0 +1,144 @@ +#pragma once + +#ifdef __APPLE__ + +// Fragment shader del shader "crtpi" (algoritme CRT-Pi): scanlines amb +// pesos gaussians, multisample opcional, gamma i màscara de subpíxels. +namespace Rendering::Msl { + + inline constexpr const char* kCrtpiFrag = R"( +#include +using namespace metal; + +struct PostVOut { + float4 pos [[position]]; + float2 uv; +}; + +struct CrtPiUniforms { + float scanline_weight; + float scanline_gap_brightness; + float bloom_factor; + float input_gamma; + float output_gamma; + float mask_brightness; + float curvature_x; + float curvature_y; + int mask_type; + int enable_scanlines; + int enable_multisample; + int enable_gamma; + int enable_curvature; + int enable_sharper; + float texture_width; + float texture_height; +}; + +static float2 crtpi_distort(float2 coord, float2 screen_scale, float cx, float cy) { + float2 curvature = float2(cx, cy); + float2 barrel_scale = 1.0f - (0.23f * curvature); + coord *= screen_scale; + coord -= 0.5f; + float rsq = coord.x * coord.x + coord.y * coord.y; + coord += coord * (curvature * rsq); + coord *= barrel_scale; + if (abs(coord.x) >= 0.5f || abs(coord.y) >= 0.5f) { return float2(-1.0f); } + coord += 0.5f; + coord /= screen_scale; + return coord; +} + +static float crtpi_scan_weight(float dist, float sw, float gap) { + return max(1.0f - dist * dist * sw, gap); +} + +static float crtpi_scan_line(float dy, float filter_w, float sw, float gap, bool ms) { + float w = crtpi_scan_weight(dy, sw, gap); + if (ms) { + w += crtpi_scan_weight(dy - filter_w, sw, gap); + w += crtpi_scan_weight(dy + filter_w, sw, gap); + w *= 0.3333333f; + } + return w; +} + +fragment float4 crtpi_fs(PostVOut in [[stage_in]], + texture2d tex [[texture(0)]], + sampler samp [[sampler(0)]], + constant CrtPiUniforms& u [[buffer(0)]]) { + float2 tex_size = float2(u.texture_width, u.texture_height); + // Amplada del filtre de scanline analític. 768 = alçada de referència + // CRT a la qual es va tarar l'algoritme original; 3 = divisió per + // subpíxel (R/G/B) del multisample. El resultat escala amb la textura + // d'entrada, de manera que més alçada → filtre més fi. + const float CRT_REFERENCE_HEIGHT = 768.0f; + const float SUBPIXEL_DIV = 3.0f; + float filter_width = (CRT_REFERENCE_HEIGHT / u.texture_height) / SUBPIXEL_DIV; + float2 texcoord = in.uv; + + if (u.enable_curvature != 0) { + texcoord = crtpi_distort(texcoord, float2(1.0f, 1.0f), u.curvature_x, u.curvature_y); + if (texcoord.x < 0.0f) { return float4(0.0f, 0.0f, 0.0f, 1.0f); } + } + + float2 coord_in_pixels = texcoord * tex_size; + float2 tc; + float scan_weight; + + if (u.enable_sharper != 0) { + float2 temp = floor(coord_in_pixels) + 0.5f; + tc = temp / tex_size; + float2 deltas = coord_in_pixels - temp; + scan_weight = crtpi_scan_line(deltas.y, filter_width, u.scanline_weight, u.scanline_gap_brightness, u.enable_multisample != 0); + float2 signs = sign(deltas); + deltas.x *= 2.0f; + deltas = deltas * deltas; + deltas.y = deltas.y * deltas.y; + deltas.x *= 0.5f; + deltas.y *= 8.0f; + deltas /= tex_size; + deltas *= signs; + tc = tc + deltas; + } else { + float temp_y = floor(coord_in_pixels.y) + 0.5f; + float y_coord = temp_y / tex_size.y; + float dy = coord_in_pixels.y - temp_y; + scan_weight = crtpi_scan_line(dy, filter_width, u.scanline_weight, u.scanline_gap_brightness, u.enable_multisample != 0); + float sign_y = sign(dy); + dy = dy * dy; + dy = dy * dy; + dy *= 8.0f; + dy /= tex_size.y; + dy *= sign_y; + tc = float2(texcoord.x, y_coord + dy); + } + + float3 colour = tex.sample(samp, tc).rgb; + + if (u.enable_scanlines != 0) { + if (u.enable_gamma != 0) { colour = pow(colour, float3(u.input_gamma)); } + colour *= scan_weight * u.bloom_factor; + if (u.enable_gamma != 0) { colour = pow(colour, float3(1.0f / u.output_gamma)); } + } + + if (u.mask_type == 1) { + float wm = fract(in.pos.x * 0.5f); + float3 mask = (wm < 0.5f) ? float3(u.mask_brightness, 1.0f, u.mask_brightness) + : float3(1.0f, u.mask_brightness, 1.0f); + colour *= mask; + } else if (u.mask_type == 2) { + float wm = fract(in.pos.x * 0.3333333f); + float3 mask = float3(u.mask_brightness); + if (wm < 0.3333333f) mask.x = 1.0f; + else if (wm < 0.6666666f) mask.y = 1.0f; + else mask.z = 1.0f; + colour *= mask; + } + + return float4(colour, 1.0f); +} +)"; + +} // namespace Rendering::Msl + +#endif // __APPLE__ diff --git a/source/core/rendering/sdl3gpu/msl/postfx_frag.msl.h b/source/core/rendering/sdl3gpu/msl/postfx_frag.msl.h new file mode 100644 index 0000000..feb2a2e --- /dev/null +++ b/source/core/rendering/sdl3gpu/msl/postfx_frag.msl.h @@ -0,0 +1,151 @@ +#pragma once + +#ifdef __APPLE__ + +// Fragment shader del shader "postfx": vignette, chroma, scanlines, mask, +// gamma, curvature, bleeding i flicker. Els paràmetres venen via uniforms. +// +// IMPORTANT: mantenir sincronitzat a mà amb data/shaders/postfx.frag. SDL3 GPU +// compila aquest string MSL en runtime; no hi ha generador automàtic. Qualsevol +// canvi a la struct d'uniforms o a la lògica del GLSL cal replicar-lo ací al +// mateix commit. Mida total = 64 bytes (4 × vec4). +namespace Rendering::Msl { + + inline constexpr const char* kPostfxFrag = R"( +#include +using namespace metal; + +struct PostVOut { + float4 pos [[position]]; + float2 uv; +}; + +struct PostFXUniforms { + float vignette_strength; + float chroma_strength; + float scanline_strength; + float screen_height; + float mask_strength; + float gamma_strength; + float curvature; + float bleeding; + float pixel_scale; + float time; + float flicker; + float pad2; + // vec4 #3 — paràmetres de scanlines (exposats per preset YAML) + float scan_dark_ratio; + float scan_dark_floor; + float scan_edge_soft; + float pad3; +}; + +static float3 rgb_to_ycc(float3 rgb) { + return float3( + 0.299f*rgb.r + 0.587f*rgb.g + 0.114f*rgb.b, + -0.169f*rgb.r - 0.331f*rgb.g + 0.500f*rgb.b + 0.5f, + 0.500f*rgb.r - 0.419f*rgb.g - 0.081f*rgb.b + 0.5f + ); +} +static float3 ycc_to_rgb(float3 ycc) { + float y = ycc.x; + float cb = ycc.y - 0.5f; + float cr = ycc.z - 0.5f; + return clamp(float3( + y + 1.402f*cr, + y - 0.344f*cb - 0.714f*cr, + y + 1.772f*cb + ), 0.0f, 1.0f); +} + +fragment float4 postfx_fs(PostVOut in [[stage_in]], + texture2d scene [[texture(0)]], + sampler samp [[sampler(0)]], + constant PostFXUniforms& u [[buffer(0)]]) { + float2 uv = in.uv; + + if (u.curvature > 0.0f) { + float2 c = uv - 0.5f; + float rsq = dot(c, c); + float2 dist = float2(0.05f, 0.1f) * u.curvature; + float2 barrelScale = 1.0f - 0.23f * dist; + c += c * (dist * rsq); + c *= barrelScale; + if (abs(c.x) >= 0.5f || abs(c.y) >= 0.5f) { + return float4(0.0f, 0.0f, 0.0f, 1.0f); + } + uv = c + 0.5f; + } + + float3 base = scene.sample(samp, uv).rgb; + + float3 colour; + if (u.bleeding > 0.0f) { + float tw = float(scene.get_width()); + float step = 1.0f / tw; + float3 ycc = rgb_to_ycc(base); + float3 ycc_l2 = rgb_to_ycc(scene.sample(samp, uv - float2(2.0f*step, 0.0f)).rgb); + float3 ycc_l1 = rgb_to_ycc(scene.sample(samp, uv - float2(1.0f*step, 0.0f)).rgb); + float3 ycc_r1 = rgb_to_ycc(scene.sample(samp, uv + float2(1.0f*step, 0.0f)).rgb); + float3 ycc_r2 = rgb_to_ycc(scene.sample(samp, uv + float2(2.0f*step, 0.0f)).rgb); + ycc.yz = (ycc_l2.yz + ycc_l1.yz*2.0f + ycc.yz*2.0f + ycc_r1.yz*2.0f + ycc_r2.yz) / 8.0f; + colour = mix(base, ycc_to_rgb(ycc), u.bleeding); + } else { + colour = base; + } + + float ca = u.chroma_strength * 0.005f * (1.0f + 0.15f * sin(u.time * 7.3f)); + colour.r = scene.sample(samp, uv + float2(ca, 0.0f)).r; + colour.b = scene.sample(samp, uv - float2(ca, 0.0f)).b; + + if (u.gamma_strength > 0.0f) { + float3 lin = pow(colour, float3(2.4f)); + colour = mix(colour, lin, u.gamma_strength); + } + + // Scanlines — 3 subpíxels per fila lògica (2 brillants + 1 fosca). Transició + // suavitzada amb smoothstep d'ample ≈ 1 píxel físic (estil crtpi: filtratge + // analític continu). scan_edge_soft = 0 recupera el step dur de l'original. + if (u.scanline_strength > 0.0f) { + float ps = max(u.pixel_scale, 1.0f); + float sub = fract(uv.y * u.screen_height); + float dark_center = 1.0f - u.scan_dark_ratio * 0.5f; + float d = abs(sub - dark_center); + d = min(d, 1.0f - d); + float half_width = u.scan_dark_ratio * 0.5f; + float softness = u.scan_edge_soft * 0.5f / ps; + float band = 1.0f - smoothstep(half_width - softness, half_width + softness, d); + float scan = mix(1.0f, u.scan_dark_floor, band); + colour *= mix(1.0f, scan, u.scanline_strength); + } + + if (u.gamma_strength > 0.0f) { + float3 enc = pow(colour, float3(1.0f/2.2f)); + colour = mix(colour, enc, u.gamma_strength); + } + + float2 d = uv - 0.5f; + float vignette = 1.0f - dot(d, d) * u.vignette_strength; + colour *= clamp(vignette, 0.0f, 1.0f); + + if (u.mask_strength > 0.0f) { + float whichMask = fract(in.pos.x * 0.3333333f); + float3 mask = float3(0.80f); + if (whichMask < 0.3333333f) mask.x = 1.0f; + else if (whichMask < 0.6666667f) mask.y = 1.0f; + else mask.z = 1.0f; + colour = mix(colour, colour * mask, u.mask_strength); + } + + if (u.flicker > 0.0f) { + float flicker_wave = sin(u.time * 100.0f) * 0.5f + 0.5f; + colour *= 1.0f - u.flicker * 0.04f * flicker_wave; + } + + return float4(colour, 1.0f); +} +)"; + +} // namespace Rendering::Msl + +#endif // __APPLE__ diff --git a/source/core/rendering/sdl3gpu/msl/postfx_vert.msl.h b/source/core/rendering/sdl3gpu/msl/postfx_vert.msl.h new file mode 100644 index 0000000..dc50b38 --- /dev/null +++ b/source/core/rendering/sdl3gpu/msl/postfx_vert.msl.h @@ -0,0 +1,30 @@ +#pragma once + +#ifdef __APPLE__ + +// Vertex shader compartit per tots els pipelines de post-procés: +// fullscreen-triangle que cobreix tota l'àrea del swapchain amb UVs a [0,1]. +namespace Rendering::Msl { + + inline constexpr const char* kPostfxVert = R"( +#include +using namespace metal; + +struct PostVOut { + float4 pos [[position]]; + float2 uv; +}; + +vertex PostVOut postfx_vs(uint vid [[vertex_id]]) { + const float2 positions[3] = { {-1.0, -1.0}, {3.0, -1.0}, {-1.0, 3.0} }; + const float2 uvs[3] = { { 0.0, 1.0}, {2.0, 1.0}, { 0.0,-1.0} }; + PostVOut out; + out.pos = float4(positions[vid], 0.0, 1.0); + out.uv = uvs[vid]; + return out; +} +)"; + +} // namespace Rendering::Msl + +#endif // __APPLE__ diff --git a/source/core/rendering/sdl3gpu/sdl3gpu_shader.cpp b/source/core/rendering/sdl3gpu/sdl3gpu_shader.cpp index b1df6a4..d233ba5 100644 --- a/source/core/rendering/sdl3gpu/sdl3gpu_shader.cpp +++ b/source/core/rendering/sdl3gpu/sdl3gpu_shader.cpp @@ -2,349 +2,22 @@ #include -#include // std::min, std::max, std::floor -#include // std::floor, std::ceil +#include // std::min, std::max +#include // std::floor #include // memcpy, strlen #include // Para std::cout #ifndef __APPLE__ #include "core/rendering/sdl3gpu/spv/crtpi_frag_spv.h" -#include "core/rendering/sdl3gpu/spv/downscale_frag_spv.h" #include "core/rendering/sdl3gpu/spv/postfx_frag_spv.h" #include "core/rendering/sdl3gpu/spv/postfx_vert_spv.h" -#include "core/rendering/sdl3gpu/spv/upscale_frag_spv.h" #endif #ifdef __APPLE__ -// ============================================================================ -// MSL shaders (Metal Shading Language) — macOS -// ============================================================================ - -// NOLINTBEGIN(readability-identifier-naming) -static const char* POSTFX_VERT_MSL = R"( -#include -using namespace metal; - -struct PostVOut { - float4 pos [[position]]; - float2 uv; -}; - -vertex PostVOut postfx_vs(uint vid [[vertex_id]]) { - const float2 positions[3] = { {-1.0, -1.0}, {3.0, -1.0}, {-1.0, 3.0} }; - const float2 uvs[3] = { { 0.0, 1.0}, {2.0, 1.0}, { 0.0,-1.0} }; - PostVOut out; - out.pos = float4(positions[vid], 0.0, 1.0); - out.uv = uvs[vid]; - return out; -} -)"; - -static const char* POSTFX_FRAG_MSL = R"( -#include -using namespace metal; - -struct PostVOut { - float4 pos [[position]]; - float2 uv; -}; - -struct PostFXUniforms { - float vignette_strength; - float chroma_strength; - float scanline_strength; - float screen_height; - float mask_strength; - float gamma_strength; - float curvature; - float bleeding; - float pixel_scale; - float time; - float oversample; - float flicker; -}; - -static float3 rgb_to_ycc(float3 rgb) { - return float3( - 0.299f*rgb.r + 0.587f*rgb.g + 0.114f*rgb.b, - -0.169f*rgb.r - 0.331f*rgb.g + 0.500f*rgb.b + 0.5f, - 0.500f*rgb.r - 0.419f*rgb.g - 0.081f*rgb.b + 0.5f - ); -} -static float3 ycc_to_rgb(float3 ycc) { - float y = ycc.x; - float cb = ycc.y - 0.5f; - float cr = ycc.z - 0.5f; - return clamp(float3( - y + 1.402f*cr, - y - 0.344f*cb - 0.714f*cr, - y + 1.772f*cb - ), 0.0f, 1.0f); -} - -fragment float4 postfx_fs(PostVOut in [[stage_in]], - texture2d scene [[texture(0)]], - sampler samp [[sampler(0)]], - constant PostFXUniforms& u [[buffer(0)]]) { - float2 uv = in.uv; - - if (u.curvature > 0.0f) { - float2 c = uv - 0.5f; - float rsq = dot(c, c); - float2 dist = float2(0.05f, 0.1f) * u.curvature; - float2 barrelScale = 1.0f - 0.23f * dist; - c += c * (dist * rsq); - c *= barrelScale; - if (abs(c.x) >= 0.5f || abs(c.y) >= 0.5f) { - return float4(0.0f, 0.0f, 0.0f, 1.0f); - } - uv = c + 0.5f; - } - - float3 base = scene.sample(samp, uv).rgb; - - float3 colour; - if (u.bleeding > 0.0f) { - float tw = float(scene.get_width()); - float step = u.oversample / tw; - float3 ycc = rgb_to_ycc(base); - float3 ycc_l2 = rgb_to_ycc(scene.sample(samp, uv - float2(2.0f*step, 0.0f)).rgb); - float3 ycc_l1 = rgb_to_ycc(scene.sample(samp, uv - float2(1.0f*step, 0.0f)).rgb); - float3 ycc_r1 = rgb_to_ycc(scene.sample(samp, uv + float2(1.0f*step, 0.0f)).rgb); - float3 ycc_r2 = rgb_to_ycc(scene.sample(samp, uv + float2(2.0f*step, 0.0f)).rgb); - ycc.yz = (ycc_l2.yz + ycc_l1.yz*2.0f + ycc.yz*2.0f + ycc_r1.yz*2.0f + ycc_r2.yz) / 8.0f; - colour = mix(base, ycc_to_rgb(ycc), u.bleeding); - } else { - colour = base; - } - - float ca = u.chroma_strength * 0.005f * (1.0f + 0.15f * sin(u.time * 7.3f)); - colour.r = scene.sample(samp, uv + float2(ca, 0.0f)).r; - colour.b = scene.sample(samp, uv - float2(ca, 0.0f)).b; - - if (u.gamma_strength > 0.0f) { - float3 lin = pow(colour, float3(2.4f)); - colour = mix(colour, lin, u.gamma_strength); - } - - const float SCAN_DARK_RATIO = 0.333f; - const float SCAN_DARK_FLOOR = 0.42f; - if (u.scanline_strength > 0.0f) { - float ps = max(1.0f, round(u.pixel_scale)); - float frac_in_row = fract(uv.y * u.screen_height); - float row_pos = floor(frac_in_row * ps); - float bright_rows = (ps < 2.0f) ? ps : ((ps < 3.0f) ? 1.0f : floor(ps * (1.0f - SCAN_DARK_RATIO))); - float is_dark = step(bright_rows, row_pos); - float scan = mix(1.0f, SCAN_DARK_FLOOR, is_dark); - colour *= mix(1.0f, scan, u.scanline_strength); - } - - if (u.gamma_strength > 0.0f) { - float3 enc = pow(colour, float3(1.0f/2.2f)); - colour = mix(colour, enc, u.gamma_strength); - } - - float2 d = uv - 0.5f; - float vignette = 1.0f - dot(d, d) * u.vignette_strength; - colour *= clamp(vignette, 0.0f, 1.0f); - - if (u.mask_strength > 0.0f) { - float whichMask = fract(in.pos.x * 0.3333333f); - float3 mask = float3(0.80f); - if (whichMask < 0.3333333f) mask.x = 1.0f; - else if (whichMask < 0.6666667f) mask.y = 1.0f; - else mask.z = 1.0f; - colour = mix(colour, colour * mask, u.mask_strength); - } - - if (u.flicker > 0.0f) { - float flicker_wave = sin(u.time * 100.0f) * 0.5f + 0.5f; - colour *= 1.0f - u.flicker * 0.04f * flicker_wave; - } - - return float4(colour, 1.0f); -} -)"; -static const char* UPSCALE_FRAG_MSL = R"( -#include -using namespace metal; -struct VertOut { float4 pos [[position]]; float2 uv; }; -fragment float4 upscale_fs(VertOut in [[stage_in]], - texture2d scene [[texture(0)]], - sampler smp [[sampler(0)]]) -{ - return scene.sample(smp, in.uv); -} -)"; - -static const char* DOWNSCALE_FRAG_MSL = R"( -#include -using namespace metal; -struct VertOut { float4 pos [[position]]; float2 uv; }; -struct DownscaleUniforms { int algorithm; float pad0; float pad1; float pad2; }; - -static float lanczos_w(float t, float a) { - t = abs(t); - if (t < 0.0001f) { return 1.0f; } - if (t >= a) { return 0.0f; } - const float PI = 3.14159265358979f; - float pt = PI * t; - return (a * sin(pt) * sin(pt / a)) / (pt * pt); -} - -fragment float4 downscale_fs(VertOut in [[stage_in]], - texture2d source [[texture(0)]], - sampler smp [[sampler(0)]], - constant DownscaleUniforms& u [[buffer(0)]]) -{ - float2 src_size = float2(source.get_width(), source.get_height()); - float2 p = in.uv * src_size; - float2 p_floor = floor(p); - float a = (u.algorithm == 0) ? 2.0f : 3.0f; - int win = int(a); - float4 color = float4(0.0f); - float weight_sum = 0.0f; - for (int j = -win; j <= win; j++) { - for (int i = -win; i <= win; i++) { - float2 tap_center = p_floor + float2(float(i), float(j)) + 0.5f; - float2 offset = tap_center - p; - float w = lanczos_w(offset.x, a) * lanczos_w(offset.y, a); - color += source.sample(smp, tap_center / src_size) * w; - weight_sum += w; - } - } - return (weight_sum > 0.0f) ? (color / weight_sum) : float4(0.0f, 0.0f, 0.0f, 1.0f); -} -)"; -static const char* CRTPI_FRAG_MSL = R"( -#include -using namespace metal; - -struct PostVOut { - float4 pos [[position]]; - float2 uv; -}; - -struct CrtPiUniforms { - float scanline_weight; - float scanline_gap_brightness; - float bloom_factor; - float input_gamma; - float output_gamma; - float mask_brightness; - float curvature_x; - float curvature_y; - int mask_type; - int enable_scanlines; - int enable_multisample; - int enable_gamma; - int enable_curvature; - int enable_sharper; - float texture_width; - float texture_height; -}; - -static float2 crtpi_distort(float2 coord, float2 screen_scale, float cx, float cy) { - float2 curvature = float2(cx, cy); - float2 barrel_scale = 1.0f - (0.23f * curvature); - coord *= screen_scale; - coord -= 0.5f; - float rsq = coord.x * coord.x + coord.y * coord.y; - coord += coord * (curvature * rsq); - coord *= barrel_scale; - if (abs(coord.x) >= 0.5f || abs(coord.y) >= 0.5f) { return float2(-1.0f); } - coord += 0.5f; - coord /= screen_scale; - return coord; -} - -static float crtpi_scan_weight(float dist, float sw, float gap) { - return max(1.0f - dist * dist * sw, gap); -} - -static float crtpi_scan_line(float dy, float filter_w, float sw, float gap, bool ms) { - float w = crtpi_scan_weight(dy, sw, gap); - if (ms) { - w += crtpi_scan_weight(dy - filter_w, sw, gap); - w += crtpi_scan_weight(dy + filter_w, sw, gap); - w *= 0.3333333f; - } - return w; -} - -fragment float4 crtpi_fs(PostVOut in [[stage_in]], - texture2d tex [[texture(0)]], - sampler samp [[sampler(0)]], - constant CrtPiUniforms& u [[buffer(0)]]) { - float2 tex_size = float2(u.texture_width, u.texture_height); - float filter_width = (768.0f / u.texture_height) / 3.0f; - float2 texcoord = in.uv; - - if (u.enable_curvature != 0) { - texcoord = crtpi_distort(texcoord, float2(1.0f, 1.0f), u.curvature_x, u.curvature_y); - if (texcoord.x < 0.0f) { return float4(0.0f, 0.0f, 0.0f, 1.0f); } - } - - float2 coord_in_pixels = texcoord * tex_size; - float2 tc; - float scan_weight; - - if (u.enable_sharper != 0) { - float2 temp = floor(coord_in_pixels) + 0.5f; - tc = temp / tex_size; - float2 deltas = coord_in_pixels - temp; - scan_weight = crtpi_scan_line(deltas.y, filter_width, u.scanline_weight, u.scanline_gap_brightness, u.enable_multisample != 0); - float2 signs = sign(deltas); - deltas.x *= 2.0f; - deltas = deltas * deltas; - deltas.y = deltas.y * deltas.y; - deltas.x *= 0.5f; - deltas.y *= 8.0f; - deltas /= tex_size; - deltas *= signs; - tc = tc + deltas; - } else { - float temp_y = floor(coord_in_pixels.y) + 0.5f; - float y_coord = temp_y / tex_size.y; - float dy = coord_in_pixels.y - temp_y; - scan_weight = crtpi_scan_line(dy, filter_width, u.scanline_weight, u.scanline_gap_brightness, u.enable_multisample != 0); - float sign_y = sign(dy); - dy = dy * dy; - dy = dy * dy; - dy *= 8.0f; - dy /= tex_size.y; - dy *= sign_y; - tc = float2(texcoord.x, y_coord + dy); - } - - float3 colour = tex.sample(samp, tc).rgb; - - if (u.enable_scanlines != 0) { - if (u.enable_gamma != 0) { colour = pow(colour, float3(u.input_gamma)); } - colour *= scan_weight * u.bloom_factor; - if (u.enable_gamma != 0) { colour = pow(colour, float3(1.0f / u.output_gamma)); } - } - - if (u.mask_type == 1) { - float wm = fract(in.pos.x * 0.5f); - float3 mask = (wm < 0.5f) ? float3(u.mask_brightness, 1.0f, u.mask_brightness) - : float3(1.0f, u.mask_brightness, 1.0f); - colour *= mask; - } else if (u.mask_type == 2) { - float wm = fract(in.pos.x * 0.3333333f); - float3 mask = float3(u.mask_brightness); - if (wm < 0.3333333f) mask.x = 1.0f; - else if (wm < 0.6666666f) mask.y = 1.0f; - else mask.z = 1.0f; - colour *= mask; - } - - return float4(colour, 1.0f); -} -)"; -// NOLINTEND(readability-identifier-naming) - -#endif // __APPLE__ +#include "core/rendering/sdl3gpu/msl/crtpi_frag.msl.h" +#include "core/rendering/sdl3gpu/msl/postfx_frag.msl.h" +#include "core/rendering/sdl3gpu/msl/postfx_vert.msl.h" +#endif namespace Rendering { @@ -374,7 +47,6 @@ namespace Rendering { game_width_ = static_cast(fw); game_height_ = static_cast(fh); uniforms_.screen_height = static_cast(game_height_); - uniforms_.oversample = static_cast(oversample_); // 1. GPU disabled by config if (preferred_driver_ == "none") { @@ -412,7 +84,7 @@ namespace Rendering { SDL_SetGPUSwapchainParameters(device_, window_, SDL_GPU_SWAPCHAINCOMPOSITION_SDR, bestPresentMode(vsync_)); } - // 3. Create scene texture (always game resolution) + // 3. Create scene texture (game resolution) SDL_GPUTextureCreateInfo tex_info = {}; tex_info.type = SDL_GPU_TEXTURETYPE_2D; tex_info.format = SDL_GPU_TEXTUREFORMAT_B8G8R8A8_UNORM; @@ -428,9 +100,7 @@ namespace Rendering { return false; } - ss_factor_ = 0; - - // 4. Create upload transfer buffer (always game resolution) + // 4. Create upload transfer buffer (game resolution) SDL_GPUTransferBufferCreateInfo tb_info = {}; tb_info.usage = SDL_GPU_TRANSFERBUFFERUSAGE_UPLOAD; tb_info.size = static_cast(game_width_ * game_height_ * 4); @@ -441,7 +111,7 @@ namespace Rendering { return false; } - // 5. Create samplers + // 5. Create nearest sampler SDL_GPUSamplerCreateInfo samp_info = {}; samp_info.min_filter = SDL_GPU_FILTER_NEAREST; samp_info.mag_filter = SDL_GPU_FILTER_NEAREST; @@ -456,20 +126,6 @@ namespace Rendering { return false; } - SDL_GPUSamplerCreateInfo lsamp_info = {}; - lsamp_info.min_filter = SDL_GPU_FILTER_LINEAR; - lsamp_info.mag_filter = SDL_GPU_FILTER_LINEAR; - lsamp_info.mipmap_mode = SDL_GPU_SAMPLERMIPMAPMODE_NEAREST; - lsamp_info.address_mode_u = SDL_GPU_SAMPLERADDRESSMODE_CLAMP_TO_EDGE; - lsamp_info.address_mode_v = SDL_GPU_SAMPLERADDRESSMODE_CLAMP_TO_EDGE; - lsamp_info.address_mode_w = SDL_GPU_SAMPLERADDRESSMODE_CLAMP_TO_EDGE; - linear_sampler_ = SDL_CreateGPUSampler(device_, &lsamp_info); - if (linear_sampler_ == nullptr) { - std::cout << "SDL3GPUShader: failed to create linear sampler: " << SDL_GetError() << '\n'; - cleanup(); - return false; - } - // 6. Create pipelines if (!createPipeline()) { cleanup(); @@ -486,15 +142,14 @@ namespace Rendering { } // --------------------------------------------------------------------------- - // createPipeline — PostFX + Upscale + PostFX offscreen + Downscale pipelines + // createPipeline — PostFX → swapchain // --------------------------------------------------------------------------- - auto SDL3GPUShader::createPipeline() -> bool { // NOLINT(readability-function-cognitive-complexity) + auto SDL3GPUShader::createPipeline() -> bool { const SDL_GPUTextureFormat SWAPCHAIN_FMT = SDL_GetGPUSwapchainTextureFormat(device_, window_); - // ---- PostFX pipeline (→ swapchain) ---- #ifdef __APPLE__ - SDL_GPUShader* vert = createShaderMSL(device_, POSTFX_VERT_MSL, "postfx_vs", SDL_GPU_SHADERSTAGE_VERTEX, 0, 0); - SDL_GPUShader* frag = createShaderMSL(device_, POSTFX_FRAG_MSL, "postfx_fs", SDL_GPU_SHADERSTAGE_FRAGMENT, 1, 1); + SDL_GPUShader* vert = createShaderMSL(device_, Msl::kPostfxVert, "postfx_vs", SDL_GPU_SHADERSTAGE_VERTEX, 0, 0); + SDL_GPUShader* frag = createShaderMSL(device_, Msl::kPostfxFrag, "postfx_fs", SDL_GPU_SHADERSTAGE_FRAGMENT, 1, 1); #else SDL_GPUShader* vert = createShaderSPIRV(device_, kpostfx_vert_spv, kpostfx_vert_spv_size, "main", SDL_GPU_SHADERSTAGE_VERTEX, 0, 0); SDL_GPUShader* frag = createShaderSPIRV(device_, kpostfx_frag_spv, kpostfx_frag_spv_size, "main", SDL_GPU_SHADERSTAGE_FRAGMENT, 1, 1); @@ -534,114 +189,6 @@ namespace Rendering { return false; } - // ---- Upscale pipeline (scene → scaled_texture_) ---- -#ifdef __APPLE__ - SDL_GPUShader* uvert = createShaderMSL(device_, POSTFX_VERT_MSL, "postfx_vs", SDL_GPU_SHADERSTAGE_VERTEX, 0, 0); - SDL_GPUShader* ufrag = createShaderMSL(device_, UPSCALE_FRAG_MSL, "upscale_fs", SDL_GPU_SHADERSTAGE_FRAGMENT, 1, 0); -#else - SDL_GPUShader* uvert = createShaderSPIRV(device_, kpostfx_vert_spv, kpostfx_vert_spv_size, "main", SDL_GPU_SHADERSTAGE_VERTEX, 0, 0); - SDL_GPUShader* ufrag = createShaderSPIRV(device_, kupscale_frag_spv, kupscale_frag_spv_size, "main", SDL_GPU_SHADERSTAGE_FRAGMENT, 1, 0); -#endif - - if ((uvert == nullptr) || (ufrag == nullptr)) { - if (uvert != nullptr) { SDL_ReleaseGPUShader(device_, uvert); } - if (ufrag != nullptr) { SDL_ReleaseGPUShader(device_, ufrag); } - return false; - } - - SDL_GPUColorTargetDescription upscale_ct = {}; - upscale_ct.format = SDL_GPU_TEXTUREFORMAT_B8G8R8A8_UNORM; - upscale_ct.blend_state = no_blend; - - SDL_GPUGraphicsPipelineCreateInfo upscale_pi = {}; - upscale_pi.vertex_shader = uvert; - upscale_pi.fragment_shader = ufrag; - upscale_pi.vertex_input_state = no_input; - upscale_pi.primitive_type = SDL_GPU_PRIMITIVETYPE_TRIANGLELIST; - upscale_pi.target_info.num_color_targets = 1; - upscale_pi.target_info.color_target_descriptions = &upscale_ct; - - upscale_pipeline_ = SDL_CreateGPUGraphicsPipeline(device_, &upscale_pi); - SDL_ReleaseGPUShader(device_, uvert); - SDL_ReleaseGPUShader(device_, ufrag); - - if (upscale_pipeline_ == nullptr) { - std::cout << "SDL3GPUShader: upscale pipeline creation failed: " << SDL_GetError() << '\n'; - return false; - } - - // ---- PostFX offscreen pipeline (→ B8G8R8A8 texture, for Lanczos path) ---- -#ifdef __APPLE__ - SDL_GPUShader* ofvert = createShaderMSL(device_, POSTFX_VERT_MSL, "postfx_vs", SDL_GPU_SHADERSTAGE_VERTEX, 0, 0); - SDL_GPUShader* offrag = createShaderMSL(device_, POSTFX_FRAG_MSL, "postfx_fs", SDL_GPU_SHADERSTAGE_FRAGMENT, 1, 1); -#else - SDL_GPUShader* ofvert = createShaderSPIRV(device_, kpostfx_vert_spv, kpostfx_vert_spv_size, "main", SDL_GPU_SHADERSTAGE_VERTEX, 0, 0); - SDL_GPUShader* offrag = createShaderSPIRV(device_, kpostfx_frag_spv, kpostfx_frag_spv_size, "main", SDL_GPU_SHADERSTAGE_FRAGMENT, 1, 1); -#endif - - if ((ofvert == nullptr) || (offrag == nullptr)) { - if (ofvert != nullptr) { SDL_ReleaseGPUShader(device_, ofvert); } - if (offrag != nullptr) { SDL_ReleaseGPUShader(device_, offrag); } - return false; - } - - SDL_GPUColorTargetDescription offscreen_ct = {}; - offscreen_ct.format = SDL_GPU_TEXTUREFORMAT_B8G8R8A8_UNORM; - offscreen_ct.blend_state = no_blend; - - SDL_GPUGraphicsPipelineCreateInfo offscreen_pi = {}; - offscreen_pi.vertex_shader = ofvert; - offscreen_pi.fragment_shader = offrag; - offscreen_pi.vertex_input_state = no_input; - offscreen_pi.primitive_type = SDL_GPU_PRIMITIVETYPE_TRIANGLELIST; - offscreen_pi.target_info.num_color_targets = 1; - offscreen_pi.target_info.color_target_descriptions = &offscreen_ct; - - postfx_offscreen_pipeline_ = SDL_CreateGPUGraphicsPipeline(device_, &offscreen_pi); - SDL_ReleaseGPUShader(device_, ofvert); - SDL_ReleaseGPUShader(device_, offrag); - - if (postfx_offscreen_pipeline_ == nullptr) { - std::cout << "SDL3GPUShader: PostFX offscreen pipeline creation failed: " << SDL_GetError() << '\n'; - return false; - } - - // ---- Downscale pipeline (Lanczos → swapchain) ---- -#ifdef __APPLE__ - SDL_GPUShader* dvert = createShaderMSL(device_, POSTFX_VERT_MSL, "postfx_vs", SDL_GPU_SHADERSTAGE_VERTEX, 0, 0); - SDL_GPUShader* dfrag = createShaderMSL(device_, DOWNSCALE_FRAG_MSL, "downscale_fs", SDL_GPU_SHADERSTAGE_FRAGMENT, 1, 1); -#else - SDL_GPUShader* dvert = createShaderSPIRV(device_, kpostfx_vert_spv, kpostfx_vert_spv_size, "main", SDL_GPU_SHADERSTAGE_VERTEX, 0, 0); - SDL_GPUShader* dfrag = createShaderSPIRV(device_, kdownscale_frag_spv, kdownscale_frag_spv_size, "main", SDL_GPU_SHADERSTAGE_FRAGMENT, 1, 1); -#endif - - if ((dvert == nullptr) || (dfrag == nullptr)) { - if (dvert != nullptr) { SDL_ReleaseGPUShader(device_, dvert); } - if (dfrag != nullptr) { SDL_ReleaseGPUShader(device_, dfrag); } - return false; - } - - SDL_GPUColorTargetDescription downscale_ct = {}; - downscale_ct.format = SWAPCHAIN_FMT; - downscale_ct.blend_state = no_blend; - - SDL_GPUGraphicsPipelineCreateInfo downscale_pi = {}; - downscale_pi.vertex_shader = dvert; - downscale_pi.fragment_shader = dfrag; - downscale_pi.vertex_input_state = no_input; - downscale_pi.primitive_type = SDL_GPU_PRIMITIVETYPE_TRIANGLELIST; - downscale_pi.target_info.num_color_targets = 1; - downscale_pi.target_info.color_target_descriptions = &downscale_ct; - - downscale_pipeline_ = SDL_CreateGPUGraphicsPipeline(device_, &downscale_pi); - SDL_ReleaseGPUShader(device_, dvert); - SDL_ReleaseGPUShader(device_, dfrag); - - if (downscale_pipeline_ == nullptr) { - std::cout << "SDL3GPUShader: downscale pipeline creation failed: " << SDL_GetError() << '\n'; - return false; - } - return true; } @@ -652,8 +199,8 @@ namespace Rendering { const SDL_GPUTextureFormat SWAPCHAIN_FMT = SDL_GetGPUSwapchainTextureFormat(device_, window_); #ifdef __APPLE__ - SDL_GPUShader* vert = createShaderMSL(device_, POSTFX_VERT_MSL, "postfx_vs", SDL_GPU_SHADERSTAGE_VERTEX, 0, 0); - SDL_GPUShader* frag = createShaderMSL(device_, CRTPI_FRAG_MSL, "crtpi_fs", SDL_GPU_SHADERSTAGE_FRAGMENT, 1, 1); + SDL_GPUShader* vert = createShaderMSL(device_, Msl::kPostfxVert, "postfx_vs", SDL_GPU_SHADERSTAGE_VERTEX, 0, 0); + SDL_GPUShader* frag = createShaderMSL(device_, Msl::kCrtpiFrag, "crtpi_fs", SDL_GPU_SHADERSTAGE_FRAGMENT, 1, 1); #else SDL_GPUShader* vert = createShaderSPIRV(device_, kpostfx_vert_spv, kpostfx_vert_spv_size, "main", SDL_GPU_SHADERSTAGE_VERTEX, 0, 0); SDL_GPUShader* frag = createShaderSPIRV(device_, kcrtpi_frag_spv, kcrtpi_frag_spv_size, "main", SDL_GPU_SHADERSTAGE_FRAGMENT, 1, 1); @@ -691,7 +238,7 @@ namespace Rendering { } // --------------------------------------------------------------------------- - // uploadPixels — direct memcpy, GPU handles upscale + // uploadPixels — direct memcpy // --------------------------------------------------------------------------- void SDL3GPUShader::uploadPixels(const Uint32* pixels, int width, int height) { if (!is_initialized_ || (upload_buffer_ == nullptr)) { return; } @@ -707,24 +254,11 @@ namespace Rendering { } // --------------------------------------------------------------------------- - // render — 3-path: CrtPi direct, PostFX+Lanczos, PostFX direct + // render — CrtPi direct OR PostFX direct → swapchain // --------------------------------------------------------------------------- - void SDL3GPUShader::render() { // NOLINT(readability-function-cognitive-complexity) + void SDL3GPUShader::render() { if (!is_initialized_) { return; } - // SS factor calculation - if (oversample_ > 1 && game_height_ > 0) { - int win_w = 0; - int win_h = 0; - SDL_GetWindowSizeInPixels(window_, &win_w, &win_h); - const float ZOOM = static_cast(win_h) / static_cast(game_height_); - const int NEED_FACTOR = calcSsFactor(ZOOM); - if (NEED_FACTOR != ss_factor_) { - SDL_WaitForGPUIdle(device_); - recreateScaledTexture(NEED_FACTOR); - } - } - SDL_GPUCommandBuffer* cmd = SDL_AcquireGPUCommandBuffer(device_); if (cmd == nullptr) { std::cout << "SDL3GPUShader: SDL_AcquireGPUCommandBuffer failed: " << SDL_GetError() << '\n'; @@ -750,25 +284,6 @@ namespace Rendering { SDL_EndGPUCopyPass(copy); } - // ---- Upscale pass: scene → scaled_texture_ ---- - if (oversample_ > 1 && scaled_texture_ != nullptr && upscale_pipeline_ != nullptr) { - SDL_GPUColorTargetInfo upscale_target = {}; - upscale_target.texture = scaled_texture_; - upscale_target.load_op = SDL_GPU_LOADOP_DONT_CARE; - upscale_target.store_op = SDL_GPU_STOREOP_STORE; - - SDL_GPURenderPass* upass = SDL_BeginGPURenderPass(cmd, &upscale_target, 1, nullptr); - if (upass != nullptr) { - SDL_BindGPUGraphicsPipeline(upass, upscale_pipeline_); - SDL_GPUTextureSamplerBinding ubinding = {}; - ubinding.texture = scene_texture_; - ubinding.sampler = (linear_upscale_ && linear_sampler_ != nullptr) ? linear_sampler_ : sampler_; - SDL_BindGPUFragmentSamplers(upass, 0, &ubinding, 1); - SDL_DrawGPUPrimitives(upass, 3, 1, 0, 0); - SDL_EndGPURenderPass(upass); - } - } - // ---- Acquire swapchain texture ---- SDL_GPUTexture* swapchain = nullptr; Uint32 sw = 0; @@ -802,117 +317,37 @@ namespace Rendering { vx = std::floor((static_cast(sw) - vw) * 0.5F); vy = std::floor((static_cast(sh) - vh) * 0.5F); - if (oversample_ > 1 && ss_factor_ > 0) { - uniforms_.pixel_scale = static_cast(ss_factor_); - } else { - uniforms_.pixel_scale = (game_height_ > 0) ? (vh / static_cast(game_height_)) : 1.0F; - } + uniforms_.pixel_scale = (game_height_ > 0) ? (vh / static_cast(game_height_)) : 1.0F; uniforms_.time = static_cast(SDL_GetTicks()) / 1000.0F; - uniforms_.oversample = (oversample_ > 1 && ss_factor_ > 0) - ? static_cast(ss_factor_) - : 1.0F; - // ---- Path A: CrtPi direct ---- - if (active_shader_ == ShaderType::CRTPI && crtpi_pipeline_ != nullptr) { - SDL_GPUColorTargetInfo ct = {}; - ct.texture = swapchain; - ct.load_op = SDL_GPU_LOADOP_CLEAR; - ct.store_op = SDL_GPU_STOREOP_STORE; - ct.clear_color = {.r = 0.0F, .g = 0.0F, .b = 0.0F, .a = 1.0F}; + SDL_GPUColorTargetInfo ct = {}; + ct.texture = swapchain; + ct.load_op = SDL_GPU_LOADOP_CLEAR; + ct.store_op = SDL_GPU_STOREOP_STORE; + ct.clear_color = {.r = 0.0F, .g = 0.0F, .b = 0.0F, .a = 1.0F}; - SDL_GPURenderPass* pass = SDL_BeginGPURenderPass(cmd, &ct, 1, nullptr); - if (pass != nullptr) { + SDL_GPURenderPass* pass = SDL_BeginGPURenderPass(cmd, &ct, 1, nullptr); + if (pass != nullptr) { + SDL_GPUViewport vp = {.x = vx, .y = vy, .w = vw, .h = vh, .min_depth = 0.0F, .max_depth = 1.0F}; + SDL_SetGPUViewport(pass, &vp); + + SDL_GPUTextureSamplerBinding binding = {}; + binding.texture = scene_texture_; + binding.sampler = sampler_; + SDL_BindGPUFragmentSamplers(pass, 0, &binding, 1); + + if (active_shader_ == ShaderType::CRTPI && crtpi_pipeline_ != nullptr) { SDL_BindGPUGraphicsPipeline(pass, crtpi_pipeline_); - SDL_GPUViewport vp = {.x = vx, .y = vy, .w = vw, .h = vh, .min_depth = 0.0F, .max_depth = 1.0F}; - SDL_SetGPUViewport(pass, &vp); - - SDL_GPUTextureSamplerBinding binding = {}; - binding.texture = scene_texture_; - binding.sampler = sampler_; - SDL_BindGPUFragmentSamplers(pass, 0, &binding, 1); - crtpi_uniforms_.texture_width = static_cast(game_width_); crtpi_uniforms_.texture_height = static_cast(game_height_); SDL_PushGPUFragmentUniformData(cmd, 0, &crtpi_uniforms_, sizeof(CrtPiUniforms)); - - SDL_DrawGPUPrimitives(pass, 3, 1, 0, 0); - SDL_EndGPURenderPass(pass); - } - - SDL_SubmitGPUCommandBuffer(cmd); - return; - } - - // ---- Path B: PostFX + Lanczos (SS active + algo selected) ---- - const bool USE_LANCZOS = (oversample_ > 1 && downscale_algo_ > 0 && scaled_texture_ != nullptr && postfx_texture_ != nullptr && postfx_offscreen_pipeline_ != nullptr && downscale_pipeline_ != nullptr); - - if (USE_LANCZOS) { - // Pass B1: PostFX → postfx_texture_ - SDL_GPUColorTargetInfo postfx_ct = {}; - postfx_ct.texture = postfx_texture_; - postfx_ct.load_op = SDL_GPU_LOADOP_CLEAR; - postfx_ct.store_op = SDL_GPU_STOREOP_STORE; - postfx_ct.clear_color = {.r = 0.0F, .g = 0.0F, .b = 0.0F, .a = 1.0F}; - - SDL_GPURenderPass* ppass = SDL_BeginGPURenderPass(cmd, &postfx_ct, 1, nullptr); - if (ppass != nullptr) { - SDL_BindGPUGraphicsPipeline(ppass, postfx_offscreen_pipeline_); - SDL_GPUTextureSamplerBinding pbinding = {}; - pbinding.texture = scaled_texture_; - pbinding.sampler = sampler_; - SDL_BindGPUFragmentSamplers(ppass, 0, &pbinding, 1); - SDL_PushGPUFragmentUniformData(cmd, 0, &uniforms_, sizeof(PostFXUniforms)); - SDL_DrawGPUPrimitives(ppass, 3, 1, 0, 0); - SDL_EndGPURenderPass(ppass); - } - - // Pass B2: Lanczos downscale → swapchain - SDL_GPUColorTargetInfo ds_ct = {}; - ds_ct.texture = swapchain; - ds_ct.load_op = SDL_GPU_LOADOP_CLEAR; - ds_ct.store_op = SDL_GPU_STOREOP_STORE; - ds_ct.clear_color = {.r = 0.0F, .g = 0.0F, .b = 0.0F, .a = 1.0F}; - - SDL_GPURenderPass* dpass = SDL_BeginGPURenderPass(cmd, &ds_ct, 1, nullptr); - if (dpass != nullptr) { - SDL_BindGPUGraphicsPipeline(dpass, downscale_pipeline_); - SDL_GPUViewport vp = {.x = vx, .y = vy, .w = vw, .h = vh, .min_depth = 0.0F, .max_depth = 1.0F}; - SDL_SetGPUViewport(dpass, &vp); - SDL_GPUTextureSamplerBinding dbinding = {}; - dbinding.texture = postfx_texture_; - dbinding.sampler = sampler_; - SDL_BindGPUFragmentSamplers(dpass, 0, &dbinding, 1); - DownscaleUniforms du = {.algorithm = downscale_algo_ - 1, .pad0 = 0.0F, .pad1 = 0.0F, .pad2 = 0.0F}; - SDL_PushGPUFragmentUniformData(cmd, 0, &du, sizeof(DownscaleUniforms)); - SDL_DrawGPUPrimitives(dpass, 3, 1, 0, 0); - SDL_EndGPURenderPass(dpass); - } - } else { - // ---- Path C: PostFX direct → swapchain ---- - SDL_GPUColorTargetInfo ct = {}; - ct.texture = swapchain; - ct.load_op = SDL_GPU_LOADOP_CLEAR; - ct.store_op = SDL_GPU_STOREOP_STORE; - ct.clear_color = {.r = 0.0F, .g = 0.0F, .b = 0.0F, .a = 1.0F}; - - SDL_GPURenderPass* pass = SDL_BeginGPURenderPass(cmd, &ct, 1, nullptr); - if (pass != nullptr) { + } else { SDL_BindGPUGraphicsPipeline(pass, pipeline_); - SDL_GPUViewport vp = {.x = vx, .y = vy, .w = vw, .h = vh, .min_depth = 0.0F, .max_depth = 1.0F}; - SDL_SetGPUViewport(pass, &vp); - - SDL_GPUTexture* input_texture = (oversample_ > 1 && scaled_texture_ != nullptr) ? scaled_texture_ : scene_texture_; - SDL_GPUSampler* active_sampler = (oversample_ > 1 && linear_sampler_ != nullptr) ? linear_sampler_ : sampler_; - - SDL_GPUTextureSamplerBinding binding = {}; - binding.texture = input_texture; - binding.sampler = active_sampler; - SDL_BindGPUFragmentSamplers(pass, 0, &binding, 1); - SDL_PushGPUFragmentUniformData(cmd, 0, &uniforms_, sizeof(PostFXUniforms)); - SDL_DrawGPUPrimitives(pass, 3, 1, 0, 0); - SDL_EndGPURenderPass(pass); } + + SDL_DrawGPUPrimitives(pass, 3, 1, 0, 0); + SDL_EndGPURenderPass(pass); } SDL_SubmitGPUCommandBuffer(cmd); @@ -942,13 +377,7 @@ namespace Rendering { release_pipeline(pipeline_); release_pipeline(crtpi_pipeline_); - release_pipeline(postfx_offscreen_pipeline_); - release_pipeline(upscale_pipeline_); - release_pipeline(downscale_pipeline_); release_texture(scene_texture_); - release_texture(scaled_texture_); - release_texture(postfx_texture_); - ss_factor_ = 0; if (upload_buffer_ != nullptr) { SDL_ReleaseGPUTransferBuffer(device_, upload_buffer_); upload_buffer_ = nullptr; @@ -957,10 +386,6 @@ namespace Rendering { SDL_ReleaseGPUSampler(device_, sampler_); sampler_ = nullptr; } - if (linear_sampler_ != nullptr) { - SDL_ReleaseGPUSampler(device_, linear_sampler_); - linear_sampler_ = nullptr; - } } } @@ -1035,6 +460,9 @@ namespace Rendering { uniforms_.curvature = p.curvature; uniforms_.bleeding = p.bleeding; uniforms_.flicker = p.flicker; + uniforms_.scan_dark_ratio = p.scan_dark_ratio; + uniforms_.scan_dark_floor = p.scan_dark_floor; + uniforms_.scan_edge_soft = p.scan_edge_soft; } void SDL3GPUShader::setCrtPiParams(const CrtPiParams& p) { @@ -1080,28 +508,6 @@ namespace Rendering { integer_scale_ = integer_scale; } - void SDL3GPUShader::setOversample(int factor) { - const int NEW_FACTOR = std::max(1, factor); - if (NEW_FACTOR == oversample_) { return; } - oversample_ = NEW_FACTOR; - if (is_initialized_) { - reinitTexturesAndBuffer(); - } - } - - void SDL3GPUShader::setLinearUpscale(bool linear) { - linear_upscale_ = linear; - } - - void SDL3GPUShader::setDownscaleAlgo(int algo) { - downscale_algo_ = std::max(0, std::min(algo, 2)); - } - - auto SDL3GPUShader::getSsTextureSize() const -> std::pair { - if (ss_factor_ <= 1) { return {0, 0}; } - return {game_width_ * ss_factor_, game_height_ * ss_factor_}; - } - // --------------------------------------------------------------------------- // reinitTexturesAndBuffer // --------------------------------------------------------------------------- @@ -1113,18 +519,12 @@ namespace Rendering { SDL_ReleaseGPUTexture(device_, scene_texture_); scene_texture_ = nullptr; } - if (scaled_texture_ != nullptr) { - SDL_ReleaseGPUTexture(device_, scaled_texture_); - scaled_texture_ = nullptr; - } - ss_factor_ = 0; if (upload_buffer_ != nullptr) { SDL_ReleaseGPUTransferBuffer(device_, upload_buffer_); upload_buffer_ = nullptr; } uniforms_.screen_height = static_cast(game_height_); - uniforms_.oversample = static_cast(oversample_); SDL_GPUTextureCreateInfo tex_info = {}; tex_info.type = SDL_GPU_TEXTURETYPE_2D; @@ -1151,55 +551,7 @@ namespace Rendering { return false; } - std::cout << "SDL3GPUShader: reinit — scene " << game_width_ << "x" << game_height_ << ", SS " << (oversample_ > 1 ? "on" : "off") << '\n'; - return true; - } - - auto SDL3GPUShader::calcSsFactor(float zoom) -> int { - const int MULTIPLE = 3; - const int N = static_cast(std::ceil(zoom / static_cast(MULTIPLE))); - return std::max(1, N) * MULTIPLE; - } - - auto SDL3GPUShader::recreateScaledTexture(int factor) -> bool { - if (scaled_texture_ != nullptr) { - SDL_ReleaseGPUTexture(device_, scaled_texture_); - scaled_texture_ = nullptr; - } - if (postfx_texture_ != nullptr) { - SDL_ReleaseGPUTexture(device_, postfx_texture_); - postfx_texture_ = nullptr; - } - ss_factor_ = 0; - - const int W = game_width_ * factor; - const int H = game_height_ * factor; - - SDL_GPUTextureCreateInfo info = {}; - info.type = SDL_GPU_TEXTURETYPE_2D; - info.format = SDL_GPU_TEXTUREFORMAT_B8G8R8A8_UNORM; - info.usage = SDL_GPU_TEXTUREUSAGE_SAMPLER | SDL_GPU_TEXTUREUSAGE_COLOR_TARGET; - info.width = static_cast(W); - info.height = static_cast(H); - info.layer_count_or_depth = 1; - info.num_levels = 1; - - scaled_texture_ = SDL_CreateGPUTexture(device_, &info); - if (scaled_texture_ == nullptr) { - std::cout << "SDL3GPUShader: failed to create scaled texture " << W << "x" << H << ": " << SDL_GetError() << '\n'; - return false; - } - - postfx_texture_ = SDL_CreateGPUTexture(device_, &info); - if (postfx_texture_ == nullptr) { - std::cout << "SDL3GPUShader: failed to create postfx texture " << W << "x" << H << ": " << SDL_GetError() << '\n'; - SDL_ReleaseGPUTexture(device_, scaled_texture_); - scaled_texture_ = nullptr; - return false; - } - - ss_factor_ = factor; - std::cout << "SDL3GPUShader: scaled+postfx textures " << W << "x" << H << " (factor " << factor << "x)" << '\n'; + std::cout << "SDL3GPUShader: reinit — scene " << game_width_ << "x" << game_height_ << '\n'; return true; } diff --git a/source/core/rendering/sdl3gpu/sdl3gpu_shader.hpp b/source/core/rendering/sdl3gpu/sdl3gpu_shader.hpp index 25626bb..90d5e62 100644 --- a/source/core/rendering/sdl3gpu/sdl3gpu_shader.hpp +++ b/source/core/rendering/sdl3gpu/sdl3gpu_shader.hpp @@ -4,25 +4,32 @@ #include #include -#include #include "core/rendering/shader_backend.hpp" // PostFX uniforms pushed to fragment stage each frame. -// 12 floats = 48 bytes — meets Metal/Vulkan 16-byte alignment requirement. +// 16 floats = 64 bytes (4 × vec4) — std140/scalar layout for Vulkan + Metal. struct PostFXUniforms { + // vec4 #0 float vignette_strength; float chroma_strength; float scanline_strength; float screen_height; + // vec4 #1 float mask_strength; float gamma_strength; float curvature; float bleeding; + // vec4 #2 float pixel_scale; float time; - float oversample; float flicker; + float pad2; + // vec4 #3 — paràmetres de scanlines exposats al preset YAML + float scan_dark_ratio; + float scan_dark_floor; + float scan_edge_soft; + float pad3; }; // CrtPi uniforms pushed to fragment stage each frame. @@ -46,22 +53,13 @@ struct CrtPiUniforms { float texture_height; }; -// Downscale uniforms for Lanczos downscale fragment stage. -// 1 int + 3 floats = 16 bytes. -struct DownscaleUniforms { - int algorithm; - float pad0; - float pad1; - float pad2; -}; - namespace Rendering { /** * @brief Backend de shaders usando SDL3 GPU API (Metal en macOS, Vulkan/SPIR-V en Win/Linux) * * Pipeline: Surface pixels (CPU) → SDL_GPUTransferBuffer → SDL_GPUTexture (scene) - * → [Upscale →] PostFX/CrtPi render pass → [Lanczos downscale →] swapchain → present + * → PostFX/CrtPi render pass → swapchain → present */ class SDL3GPUShader : public ShaderBackend { public: @@ -85,13 +83,6 @@ namespace Rendering { void setPostFXParams(const PostFXParams& p) override; void setVSync(bool vsync) override; void setScaleMode(bool integer_scale) override; - void setOversample(int factor) override; - - void setLinearUpscale(bool linear) override; - [[nodiscard]] auto isLinearUpscale() const -> bool override { return linear_upscale_; } - void setDownscaleAlgo(int algo) override; - [[nodiscard]] auto getDownscaleAlgo() const -> int override { return downscale_algo_; } - [[nodiscard]] auto getSsTextureSize() const -> std::pair override; void setActiveShader(ShaderType type) override; void setCrtPiParams(const CrtPiParams& p) override; @@ -116,39 +107,27 @@ namespace Rendering { auto createPipeline() -> bool; auto createCrtPiPipeline() -> bool; auto reinitTexturesAndBuffer() -> bool; - auto recreateScaledTexture(int factor) -> bool; - static auto calcSsFactor(float zoom) -> int; [[nodiscard]] auto bestPresentMode(bool vsync) const -> SDL_GPUPresentMode; SDL_Window* window_ = nullptr; SDL_GPUDevice* device_ = nullptr; SDL_GPUGraphicsPipeline* pipeline_ = nullptr; SDL_GPUGraphicsPipeline* crtpi_pipeline_ = nullptr; - SDL_GPUGraphicsPipeline* postfx_offscreen_pipeline_ = nullptr; - SDL_GPUGraphicsPipeline* upscale_pipeline_ = nullptr; - SDL_GPUGraphicsPipeline* downscale_pipeline_ = nullptr; SDL_GPUTexture* scene_texture_ = nullptr; - SDL_GPUTexture* scaled_texture_ = nullptr; - SDL_GPUTexture* postfx_texture_ = nullptr; SDL_GPUTransferBuffer* upload_buffer_ = nullptr; SDL_GPUSampler* sampler_ = nullptr; - SDL_GPUSampler* linear_sampler_ = nullptr; - PostFXUniforms uniforms_{.vignette_strength = 0.6F, .chroma_strength = 0.15F, .scanline_strength = 0.7F, .screen_height = 192.0F, .pixel_scale = 1.0F, .oversample = 1.0F}; + PostFXUniforms uniforms_{.vignette_strength = 0.6F, .chroma_strength = 0.15F, .scanline_strength = 0.7F, .screen_height = 192.0F, .pixel_scale = 1.0F, .scan_dark_ratio = 0.333F, .scan_dark_floor = 0.42F, .scan_edge_soft = 1.0F}; CrtPiUniforms crtpi_uniforms_{.scanline_weight = 6.0F, .scanline_gap_brightness = 0.12F, .bloom_factor = 3.5F, .input_gamma = 2.4F, .output_gamma = 2.2F, .mask_brightness = 0.80F, .curvature_x = 0.05F, .curvature_y = 0.10F, .mask_type = 2, .enable_scanlines = 1, .enable_multisample = 1, .enable_gamma = 1}; ShaderType active_shader_ = ShaderType::POSTFX; int game_width_ = 0; int game_height_ = 0; - int ss_factor_ = 0; - int oversample_ = 1; - int downscale_algo_ = 1; std::string driver_name_; std::string preferred_driver_; bool is_initialized_ = false; bool vsync_ = true; bool integer_scale_ = false; - bool linear_upscale_ = false; }; } // namespace Rendering diff --git a/source/core/rendering/sdl3gpu/spv/downscale_frag_spv.h b/source/core/rendering/sdl3gpu/spv/downscale_frag_spv.h deleted file mode 100644 index cf0f341..0000000 --- a/source/core/rendering/sdl3gpu/spv/downscale_frag_spv.h +++ /dev/null @@ -1,4254 +0,0 @@ -#pragma once -#include -#include -static const uint8_t kdownscale_frag_spv[] = { - 0x03, - 0x02, - 0x23, - 0x07, - 0x00, - 0x00, - 0x01, - 0x00, - 0x0b, - 0x00, - 0x0d, - 0x00, - 0xb1, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x11, - 0x00, - 0x02, - 0x00, - 0x01, - 0x00, - 0x00, - 0x00, - 0x11, - 0x00, - 0x02, - 0x00, - 0x32, - 0x00, - 0x00, - 0x00, - 0x0b, - 0x00, - 0x06, - 0x00, - 0x01, - 0x00, - 0x00, - 0x00, - 0x47, - 0x4c, - 0x53, - 0x4c, - 0x2e, - 0x73, - 0x74, - 0x64, - 0x2e, - 0x34, - 0x35, - 0x30, - 0x00, - 0x00, - 0x00, - 0x00, - 0x0e, - 0x00, - 0x03, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x01, - 0x00, - 0x00, - 0x00, - 0x0f, - 0x00, - 0x07, - 0x00, - 0x04, - 0x00, - 0x00, - 0x00, - 0x04, - 0x00, - 0x00, - 0x00, - 0x6d, - 0x61, - 0x69, - 0x6e, - 0x00, - 0x00, - 0x00, - 0x00, - 0x41, - 0x00, - 0x00, - 0x00, - 0xa4, - 0x00, - 0x00, - 0x00, - 0x10, - 0x00, - 0x03, - 0x00, - 0x04, - 0x00, - 0x00, - 0x00, - 0x07, - 0x00, - 0x00, - 0x00, - 0x03, - 0x00, - 0x03, - 0x00, - 0x02, - 0x00, - 0x00, - 0x00, - 0xc2, - 0x01, - 0x00, - 0x00, - 0x04, - 0x00, - 0x0a, - 0x00, - 0x47, - 0x4c, - 0x5f, - 0x47, - 0x4f, - 0x4f, - 0x47, - 0x4c, - 0x45, - 0x5f, - 0x63, - 0x70, - 0x70, - 0x5f, - 0x73, - 0x74, - 0x79, - 0x6c, - 0x65, - 0x5f, - 0x6c, - 0x69, - 0x6e, - 0x65, - 0x5f, - 0x64, - 0x69, - 0x72, - 0x65, - 0x63, - 0x74, - 0x69, - 0x76, - 0x65, - 0x00, - 0x00, - 0x04, - 0x00, - 0x08, - 0x00, - 0x47, - 0x4c, - 0x5f, - 0x47, - 0x4f, - 0x4f, - 0x47, - 0x4c, - 0x45, - 0x5f, - 0x69, - 0x6e, - 0x63, - 0x6c, - 0x75, - 0x64, - 0x65, - 0x5f, - 0x64, - 0x69, - 0x72, - 0x65, - 0x63, - 0x74, - 0x69, - 0x76, - 0x65, - 0x00, - 0x05, - 0x00, - 0x04, - 0x00, - 0x04, - 0x00, - 0x00, - 0x00, - 0x6d, - 0x61, - 0x69, - 0x6e, - 0x00, - 0x00, - 0x00, - 0x00, - 0x05, - 0x00, - 0x06, - 0x00, - 0x0b, - 0x00, - 0x00, - 0x00, - 0x6c, - 0x61, - 0x6e, - 0x63, - 0x7a, - 0x6f, - 0x73, - 0x28, - 0x66, - 0x31, - 0x3b, - 0x66, - 0x31, - 0x3b, - 0x00, - 0x00, - 0x05, - 0x00, - 0x03, - 0x00, - 0x09, - 0x00, - 0x00, - 0x00, - 0x74, - 0x00, - 0x00, - 0x00, - 0x05, - 0x00, - 0x03, - 0x00, - 0x0a, - 0x00, - 0x00, - 0x00, - 0x61, - 0x00, - 0x00, - 0x00, - 0x05, - 0x00, - 0x03, - 0x00, - 0x1e, - 0x00, - 0x00, - 0x00, - 0x70, - 0x74, - 0x00, - 0x00, - 0x05, - 0x00, - 0x05, - 0x00, - 0x33, - 0x00, - 0x00, - 0x00, - 0x73, - 0x72, - 0x63, - 0x5f, - 0x73, - 0x69, - 0x7a, - 0x65, - 0x00, - 0x00, - 0x00, - 0x00, - 0x05, - 0x00, - 0x04, - 0x00, - 0x37, - 0x00, - 0x00, - 0x00, - 0x73, - 0x6f, - 0x75, - 0x72, - 0x63, - 0x65, - 0x00, - 0x00, - 0x05, - 0x00, - 0x03, - 0x00, - 0x3f, - 0x00, - 0x00, - 0x00, - 0x70, - 0x00, - 0x00, - 0x00, - 0x05, - 0x00, - 0x04, - 0x00, - 0x41, - 0x00, - 0x00, - 0x00, - 0x76, - 0x5f, - 0x75, - 0x76, - 0x00, - 0x00, - 0x00, - 0x00, - 0x05, - 0x00, - 0x04, - 0x00, - 0x45, - 0x00, - 0x00, - 0x00, - 0x70, - 0x5f, - 0x66, - 0x6c, - 0x6f, - 0x6f, - 0x72, - 0x00, - 0x05, - 0x00, - 0x03, - 0x00, - 0x48, - 0x00, - 0x00, - 0x00, - 0x61, - 0x00, - 0x00, - 0x00, - 0x05, - 0x00, - 0x07, - 0x00, - 0x49, - 0x00, - 0x00, - 0x00, - 0x44, - 0x6f, - 0x77, - 0x6e, - 0x73, - 0x63, - 0x61, - 0x6c, - 0x65, - 0x55, - 0x6e, - 0x69, - 0x66, - 0x6f, - 0x72, - 0x6d, - 0x73, - 0x00, - 0x00, - 0x00, - 0x06, - 0x00, - 0x06, - 0x00, - 0x49, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x61, - 0x6c, - 0x67, - 0x6f, - 0x72, - 0x69, - 0x74, - 0x68, - 0x6d, - 0x00, - 0x00, - 0x00, - 0x06, - 0x00, - 0x05, - 0x00, - 0x49, - 0x00, - 0x00, - 0x00, - 0x01, - 0x00, - 0x00, - 0x00, - 0x70, - 0x61, - 0x64, - 0x30, - 0x00, - 0x00, - 0x00, - 0x00, - 0x06, - 0x00, - 0x05, - 0x00, - 0x49, - 0x00, - 0x00, - 0x00, - 0x02, - 0x00, - 0x00, - 0x00, - 0x70, - 0x61, - 0x64, - 0x31, - 0x00, - 0x00, - 0x00, - 0x00, - 0x06, - 0x00, - 0x05, - 0x00, - 0x49, - 0x00, - 0x00, - 0x00, - 0x03, - 0x00, - 0x00, - 0x00, - 0x70, - 0x61, - 0x64, - 0x32, - 0x00, - 0x00, - 0x00, - 0x00, - 0x05, - 0x00, - 0x03, - 0x00, - 0x4b, - 0x00, - 0x00, - 0x00, - 0x75, - 0x00, - 0x00, - 0x00, - 0x05, - 0x00, - 0x03, - 0x00, - 0x54, - 0x00, - 0x00, - 0x00, - 0x77, - 0x69, - 0x6e, - 0x00, - 0x05, - 0x00, - 0x04, - 0x00, - 0x59, - 0x00, - 0x00, - 0x00, - 0x63, - 0x6f, - 0x6c, - 0x6f, - 0x72, - 0x00, - 0x00, - 0x00, - 0x05, - 0x00, - 0x05, - 0x00, - 0x5b, - 0x00, - 0x00, - 0x00, - 0x77, - 0x65, - 0x69, - 0x67, - 0x68, - 0x74, - 0x5f, - 0x73, - 0x75, - 0x6d, - 0x00, - 0x00, - 0x05, - 0x00, - 0x03, - 0x00, - 0x5c, - 0x00, - 0x00, - 0x00, - 0x6a, - 0x00, - 0x00, - 0x00, - 0x05, - 0x00, - 0x03, - 0x00, - 0x67, - 0x00, - 0x00, - 0x00, - 0x69, - 0x00, - 0x00, - 0x00, - 0x05, - 0x00, - 0x05, - 0x00, - 0x72, - 0x00, - 0x00, - 0x00, - 0x74, - 0x61, - 0x70, - 0x5f, - 0x63, - 0x65, - 0x6e, - 0x74, - 0x65, - 0x72, - 0x00, - 0x00, - 0x05, - 0x00, - 0x04, - 0x00, - 0x7d, - 0x00, - 0x00, - 0x00, - 0x6f, - 0x66, - 0x66, - 0x73, - 0x65, - 0x74, - 0x00, - 0x00, - 0x05, - 0x00, - 0x03, - 0x00, - 0x81, - 0x00, - 0x00, - 0x00, - 0x77, - 0x00, - 0x00, - 0x00, - 0x05, - 0x00, - 0x04, - 0x00, - 0x82, - 0x00, - 0x00, - 0x00, - 0x70, - 0x61, - 0x72, - 0x61, - 0x6d, - 0x00, - 0x00, - 0x00, - 0x05, - 0x00, - 0x04, - 0x00, - 0x87, - 0x00, - 0x00, - 0x00, - 0x70, - 0x61, - 0x72, - 0x61, - 0x6d, - 0x00, - 0x00, - 0x00, - 0x05, - 0x00, - 0x04, - 0x00, - 0x8a, - 0x00, - 0x00, - 0x00, - 0x70, - 0x61, - 0x72, - 0x61, - 0x6d, - 0x00, - 0x00, - 0x00, - 0x05, - 0x00, - 0x04, - 0x00, - 0x8e, - 0x00, - 0x00, - 0x00, - 0x70, - 0x61, - 0x72, - 0x61, - 0x6d, - 0x00, - 0x00, - 0x00, - 0x05, - 0x00, - 0x05, - 0x00, - 0xa4, - 0x00, - 0x00, - 0x00, - 0x6f, - 0x75, - 0x74, - 0x5f, - 0x63, - 0x6f, - 0x6c, - 0x6f, - 0x72, - 0x00, - 0x00, - 0x00, - 0x47, - 0x00, - 0x04, - 0x00, - 0x37, - 0x00, - 0x00, - 0x00, - 0x21, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x47, - 0x00, - 0x04, - 0x00, - 0x37, - 0x00, - 0x00, - 0x00, - 0x22, - 0x00, - 0x00, - 0x00, - 0x02, - 0x00, - 0x00, - 0x00, - 0x47, - 0x00, - 0x04, - 0x00, - 0x41, - 0x00, - 0x00, - 0x00, - 0x1e, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x47, - 0x00, - 0x03, - 0x00, - 0x49, - 0x00, - 0x00, - 0x00, - 0x02, - 0x00, - 0x00, - 0x00, - 0x48, - 0x00, - 0x05, - 0x00, - 0x49, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x23, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x48, - 0x00, - 0x05, - 0x00, - 0x49, - 0x00, - 0x00, - 0x00, - 0x01, - 0x00, - 0x00, - 0x00, - 0x23, - 0x00, - 0x00, - 0x00, - 0x04, - 0x00, - 0x00, - 0x00, - 0x48, - 0x00, - 0x05, - 0x00, - 0x49, - 0x00, - 0x00, - 0x00, - 0x02, - 0x00, - 0x00, - 0x00, - 0x23, - 0x00, - 0x00, - 0x00, - 0x08, - 0x00, - 0x00, - 0x00, - 0x48, - 0x00, - 0x05, - 0x00, - 0x49, - 0x00, - 0x00, - 0x00, - 0x03, - 0x00, - 0x00, - 0x00, - 0x23, - 0x00, - 0x00, - 0x00, - 0x0c, - 0x00, - 0x00, - 0x00, - 0x47, - 0x00, - 0x04, - 0x00, - 0x4b, - 0x00, - 0x00, - 0x00, - 0x21, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x47, - 0x00, - 0x04, - 0x00, - 0x4b, - 0x00, - 0x00, - 0x00, - 0x22, - 0x00, - 0x00, - 0x00, - 0x03, - 0x00, - 0x00, - 0x00, - 0x47, - 0x00, - 0x04, - 0x00, - 0xa4, - 0x00, - 0x00, - 0x00, - 0x1e, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x13, - 0x00, - 0x02, - 0x00, - 0x02, - 0x00, - 0x00, - 0x00, - 0x21, - 0x00, - 0x03, - 0x00, - 0x03, - 0x00, - 0x00, - 0x00, - 0x02, - 0x00, - 0x00, - 0x00, - 0x16, - 0x00, - 0x03, - 0x00, - 0x06, - 0x00, - 0x00, - 0x00, - 0x20, - 0x00, - 0x00, - 0x00, - 0x20, - 0x00, - 0x04, - 0x00, - 0x07, - 0x00, - 0x00, - 0x00, - 0x07, - 0x00, - 0x00, - 0x00, - 0x06, - 0x00, - 0x00, - 0x00, - 0x21, - 0x00, - 0x05, - 0x00, - 0x08, - 0x00, - 0x00, - 0x00, - 0x06, - 0x00, - 0x00, - 0x00, - 0x07, - 0x00, - 0x00, - 0x00, - 0x07, - 0x00, - 0x00, - 0x00, - 0x2b, - 0x00, - 0x04, - 0x00, - 0x06, - 0x00, - 0x00, - 0x00, - 0x10, - 0x00, - 0x00, - 0x00, - 0x17, - 0xb7, - 0xd1, - 0x38, - 0x14, - 0x00, - 0x02, - 0x00, - 0x11, - 0x00, - 0x00, - 0x00, - 0x2b, - 0x00, - 0x04, - 0x00, - 0x06, - 0x00, - 0x00, - 0x00, - 0x15, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x80, - 0x3f, - 0x2b, - 0x00, - 0x04, - 0x00, - 0x06, - 0x00, - 0x00, - 0x00, - 0x1c, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x2b, - 0x00, - 0x04, - 0x00, - 0x06, - 0x00, - 0x00, - 0x00, - 0x1f, - 0x00, - 0x00, - 0x00, - 0xdb, - 0x0f, - 0x49, - 0x40, - 0x17, - 0x00, - 0x04, - 0x00, - 0x31, - 0x00, - 0x00, - 0x00, - 0x06, - 0x00, - 0x00, - 0x00, - 0x02, - 0x00, - 0x00, - 0x00, - 0x20, - 0x00, - 0x04, - 0x00, - 0x32, - 0x00, - 0x00, - 0x00, - 0x07, - 0x00, - 0x00, - 0x00, - 0x31, - 0x00, - 0x00, - 0x00, - 0x19, - 0x00, - 0x09, - 0x00, - 0x34, - 0x00, - 0x00, - 0x00, - 0x06, - 0x00, - 0x00, - 0x00, - 0x01, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x01, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x1b, - 0x00, - 0x03, - 0x00, - 0x35, - 0x00, - 0x00, - 0x00, - 0x34, - 0x00, - 0x00, - 0x00, - 0x20, - 0x00, - 0x04, - 0x00, - 0x36, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x35, - 0x00, - 0x00, - 0x00, - 0x3b, - 0x00, - 0x04, - 0x00, - 0x36, - 0x00, - 0x00, - 0x00, - 0x37, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x15, - 0x00, - 0x04, - 0x00, - 0x39, - 0x00, - 0x00, - 0x00, - 0x20, - 0x00, - 0x00, - 0x00, - 0x01, - 0x00, - 0x00, - 0x00, - 0x2b, - 0x00, - 0x04, - 0x00, - 0x39, - 0x00, - 0x00, - 0x00, - 0x3a, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x17, - 0x00, - 0x04, - 0x00, - 0x3c, - 0x00, - 0x00, - 0x00, - 0x39, - 0x00, - 0x00, - 0x00, - 0x02, - 0x00, - 0x00, - 0x00, - 0x20, - 0x00, - 0x04, - 0x00, - 0x40, - 0x00, - 0x00, - 0x00, - 0x01, - 0x00, - 0x00, - 0x00, - 0x31, - 0x00, - 0x00, - 0x00, - 0x3b, - 0x00, - 0x04, - 0x00, - 0x40, - 0x00, - 0x00, - 0x00, - 0x41, - 0x00, - 0x00, - 0x00, - 0x01, - 0x00, - 0x00, - 0x00, - 0x1e, - 0x00, - 0x06, - 0x00, - 0x49, - 0x00, - 0x00, - 0x00, - 0x39, - 0x00, - 0x00, - 0x00, - 0x06, - 0x00, - 0x00, - 0x00, - 0x06, - 0x00, - 0x00, - 0x00, - 0x06, - 0x00, - 0x00, - 0x00, - 0x20, - 0x00, - 0x04, - 0x00, - 0x4a, - 0x00, - 0x00, - 0x00, - 0x02, - 0x00, - 0x00, - 0x00, - 0x49, - 0x00, - 0x00, - 0x00, - 0x3b, - 0x00, - 0x04, - 0x00, - 0x4a, - 0x00, - 0x00, - 0x00, - 0x4b, - 0x00, - 0x00, - 0x00, - 0x02, - 0x00, - 0x00, - 0x00, - 0x20, - 0x00, - 0x04, - 0x00, - 0x4c, - 0x00, - 0x00, - 0x00, - 0x02, - 0x00, - 0x00, - 0x00, - 0x39, - 0x00, - 0x00, - 0x00, - 0x2b, - 0x00, - 0x04, - 0x00, - 0x06, - 0x00, - 0x00, - 0x00, - 0x50, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x40, - 0x2b, - 0x00, - 0x04, - 0x00, - 0x06, - 0x00, - 0x00, - 0x00, - 0x51, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x40, - 0x40, - 0x20, - 0x00, - 0x04, - 0x00, - 0x53, - 0x00, - 0x00, - 0x00, - 0x07, - 0x00, - 0x00, - 0x00, - 0x39, - 0x00, - 0x00, - 0x00, - 0x17, - 0x00, - 0x04, - 0x00, - 0x57, - 0x00, - 0x00, - 0x00, - 0x06, - 0x00, - 0x00, - 0x00, - 0x04, - 0x00, - 0x00, - 0x00, - 0x20, - 0x00, - 0x04, - 0x00, - 0x58, - 0x00, - 0x00, - 0x00, - 0x07, - 0x00, - 0x00, - 0x00, - 0x57, - 0x00, - 0x00, - 0x00, - 0x2c, - 0x00, - 0x07, - 0x00, - 0x57, - 0x00, - 0x00, - 0x00, - 0x5a, - 0x00, - 0x00, - 0x00, - 0x1c, - 0x00, - 0x00, - 0x00, - 0x1c, - 0x00, - 0x00, - 0x00, - 0x1c, - 0x00, - 0x00, - 0x00, - 0x1c, - 0x00, - 0x00, - 0x00, - 0x2b, - 0x00, - 0x04, - 0x00, - 0x06, - 0x00, - 0x00, - 0x00, - 0x7a, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x3f, - 0x15, - 0x00, - 0x04, - 0x00, - 0x83, - 0x00, - 0x00, - 0x00, - 0x20, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x2b, - 0x00, - 0x04, - 0x00, - 0x83, - 0x00, - 0x00, - 0x00, - 0x84, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x2b, - 0x00, - 0x04, - 0x00, - 0x83, - 0x00, - 0x00, - 0x00, - 0x8b, - 0x00, - 0x00, - 0x00, - 0x01, - 0x00, - 0x00, - 0x00, - 0x2b, - 0x00, - 0x04, - 0x00, - 0x39, - 0x00, - 0x00, - 0x00, - 0x9f, - 0x00, - 0x00, - 0x00, - 0x01, - 0x00, - 0x00, - 0x00, - 0x20, - 0x00, - 0x04, - 0x00, - 0xa3, - 0x00, - 0x00, - 0x00, - 0x03, - 0x00, - 0x00, - 0x00, - 0x57, - 0x00, - 0x00, - 0x00, - 0x3b, - 0x00, - 0x04, - 0x00, - 0xa3, - 0x00, - 0x00, - 0x00, - 0xa4, - 0x00, - 0x00, - 0x00, - 0x03, - 0x00, - 0x00, - 0x00, - 0x2c, - 0x00, - 0x07, - 0x00, - 0x57, - 0x00, - 0x00, - 0x00, - 0xaf, - 0x00, - 0x00, - 0x00, - 0x1c, - 0x00, - 0x00, - 0x00, - 0x1c, - 0x00, - 0x00, - 0x00, - 0x1c, - 0x00, - 0x00, - 0x00, - 0x15, - 0x00, - 0x00, - 0x00, - 0x36, - 0x00, - 0x05, - 0x00, - 0x02, - 0x00, - 0x00, - 0x00, - 0x04, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x03, - 0x00, - 0x00, - 0x00, - 0xf8, - 0x00, - 0x02, - 0x00, - 0x05, - 0x00, - 0x00, - 0x00, - 0x3b, - 0x00, - 0x04, - 0x00, - 0x32, - 0x00, - 0x00, - 0x00, - 0x33, - 0x00, - 0x00, - 0x00, - 0x07, - 0x00, - 0x00, - 0x00, - 0x3b, - 0x00, - 0x04, - 0x00, - 0x32, - 0x00, - 0x00, - 0x00, - 0x3f, - 0x00, - 0x00, - 0x00, - 0x07, - 0x00, - 0x00, - 0x00, - 0x3b, - 0x00, - 0x04, - 0x00, - 0x32, - 0x00, - 0x00, - 0x00, - 0x45, - 0x00, - 0x00, - 0x00, - 0x07, - 0x00, - 0x00, - 0x00, - 0x3b, - 0x00, - 0x04, - 0x00, - 0x07, - 0x00, - 0x00, - 0x00, - 0x48, - 0x00, - 0x00, - 0x00, - 0x07, - 0x00, - 0x00, - 0x00, - 0x3b, - 0x00, - 0x04, - 0x00, - 0x53, - 0x00, - 0x00, - 0x00, - 0x54, - 0x00, - 0x00, - 0x00, - 0x07, - 0x00, - 0x00, - 0x00, - 0x3b, - 0x00, - 0x04, - 0x00, - 0x58, - 0x00, - 0x00, - 0x00, - 0x59, - 0x00, - 0x00, - 0x00, - 0x07, - 0x00, - 0x00, - 0x00, - 0x3b, - 0x00, - 0x04, - 0x00, - 0x07, - 0x00, - 0x00, - 0x00, - 0x5b, - 0x00, - 0x00, - 0x00, - 0x07, - 0x00, - 0x00, - 0x00, - 0x3b, - 0x00, - 0x04, - 0x00, - 0x53, - 0x00, - 0x00, - 0x00, - 0x5c, - 0x00, - 0x00, - 0x00, - 0x07, - 0x00, - 0x00, - 0x00, - 0x3b, - 0x00, - 0x04, - 0x00, - 0x53, - 0x00, - 0x00, - 0x00, - 0x67, - 0x00, - 0x00, - 0x00, - 0x07, - 0x00, - 0x00, - 0x00, - 0x3b, - 0x00, - 0x04, - 0x00, - 0x32, - 0x00, - 0x00, - 0x00, - 0x72, - 0x00, - 0x00, - 0x00, - 0x07, - 0x00, - 0x00, - 0x00, - 0x3b, - 0x00, - 0x04, - 0x00, - 0x32, - 0x00, - 0x00, - 0x00, - 0x7d, - 0x00, - 0x00, - 0x00, - 0x07, - 0x00, - 0x00, - 0x00, - 0x3b, - 0x00, - 0x04, - 0x00, - 0x07, - 0x00, - 0x00, - 0x00, - 0x81, - 0x00, - 0x00, - 0x00, - 0x07, - 0x00, - 0x00, - 0x00, - 0x3b, - 0x00, - 0x04, - 0x00, - 0x07, - 0x00, - 0x00, - 0x00, - 0x82, - 0x00, - 0x00, - 0x00, - 0x07, - 0x00, - 0x00, - 0x00, - 0x3b, - 0x00, - 0x04, - 0x00, - 0x07, - 0x00, - 0x00, - 0x00, - 0x87, - 0x00, - 0x00, - 0x00, - 0x07, - 0x00, - 0x00, - 0x00, - 0x3b, - 0x00, - 0x04, - 0x00, - 0x07, - 0x00, - 0x00, - 0x00, - 0x8a, - 0x00, - 0x00, - 0x00, - 0x07, - 0x00, - 0x00, - 0x00, - 0x3b, - 0x00, - 0x04, - 0x00, - 0x07, - 0x00, - 0x00, - 0x00, - 0x8e, - 0x00, - 0x00, - 0x00, - 0x07, - 0x00, - 0x00, - 0x00, - 0x3b, - 0x00, - 0x04, - 0x00, - 0x58, - 0x00, - 0x00, - 0x00, - 0xa7, - 0x00, - 0x00, - 0x00, - 0x07, - 0x00, - 0x00, - 0x00, - 0x3d, - 0x00, - 0x04, - 0x00, - 0x35, - 0x00, - 0x00, - 0x00, - 0x38, - 0x00, - 0x00, - 0x00, - 0x37, - 0x00, - 0x00, - 0x00, - 0x64, - 0x00, - 0x04, - 0x00, - 0x34, - 0x00, - 0x00, - 0x00, - 0x3b, - 0x00, - 0x00, - 0x00, - 0x38, - 0x00, - 0x00, - 0x00, - 0x67, - 0x00, - 0x05, - 0x00, - 0x3c, - 0x00, - 0x00, - 0x00, - 0x3d, - 0x00, - 0x00, - 0x00, - 0x3b, - 0x00, - 0x00, - 0x00, - 0x3a, - 0x00, - 0x00, - 0x00, - 0x6f, - 0x00, - 0x04, - 0x00, - 0x31, - 0x00, - 0x00, - 0x00, - 0x3e, - 0x00, - 0x00, - 0x00, - 0x3d, - 0x00, - 0x00, - 0x00, - 0x3e, - 0x00, - 0x03, - 0x00, - 0x33, - 0x00, - 0x00, - 0x00, - 0x3e, - 0x00, - 0x00, - 0x00, - 0x3d, - 0x00, - 0x04, - 0x00, - 0x31, - 0x00, - 0x00, - 0x00, - 0x42, - 0x00, - 0x00, - 0x00, - 0x41, - 0x00, - 0x00, - 0x00, - 0x3d, - 0x00, - 0x04, - 0x00, - 0x31, - 0x00, - 0x00, - 0x00, - 0x43, - 0x00, - 0x00, - 0x00, - 0x33, - 0x00, - 0x00, - 0x00, - 0x85, - 0x00, - 0x05, - 0x00, - 0x31, - 0x00, - 0x00, - 0x00, - 0x44, - 0x00, - 0x00, - 0x00, - 0x42, - 0x00, - 0x00, - 0x00, - 0x43, - 0x00, - 0x00, - 0x00, - 0x3e, - 0x00, - 0x03, - 0x00, - 0x3f, - 0x00, - 0x00, - 0x00, - 0x44, - 0x00, - 0x00, - 0x00, - 0x3d, - 0x00, - 0x04, - 0x00, - 0x31, - 0x00, - 0x00, - 0x00, - 0x46, - 0x00, - 0x00, - 0x00, - 0x3f, - 0x00, - 0x00, - 0x00, - 0x0c, - 0x00, - 0x06, - 0x00, - 0x31, - 0x00, - 0x00, - 0x00, - 0x47, - 0x00, - 0x00, - 0x00, - 0x01, - 0x00, - 0x00, - 0x00, - 0x08, - 0x00, - 0x00, - 0x00, - 0x46, - 0x00, - 0x00, - 0x00, - 0x3e, - 0x00, - 0x03, - 0x00, - 0x45, - 0x00, - 0x00, - 0x00, - 0x47, - 0x00, - 0x00, - 0x00, - 0x41, - 0x00, - 0x05, - 0x00, - 0x4c, - 0x00, - 0x00, - 0x00, - 0x4d, - 0x00, - 0x00, - 0x00, - 0x4b, - 0x00, - 0x00, - 0x00, - 0x3a, - 0x00, - 0x00, - 0x00, - 0x3d, - 0x00, - 0x04, - 0x00, - 0x39, - 0x00, - 0x00, - 0x00, - 0x4e, - 0x00, - 0x00, - 0x00, - 0x4d, - 0x00, - 0x00, - 0x00, - 0xaa, - 0x00, - 0x05, - 0x00, - 0x11, - 0x00, - 0x00, - 0x00, - 0x4f, - 0x00, - 0x00, - 0x00, - 0x4e, - 0x00, - 0x00, - 0x00, - 0x3a, - 0x00, - 0x00, - 0x00, - 0xa9, - 0x00, - 0x06, - 0x00, - 0x06, - 0x00, - 0x00, - 0x00, - 0x52, - 0x00, - 0x00, - 0x00, - 0x4f, - 0x00, - 0x00, - 0x00, - 0x50, - 0x00, - 0x00, - 0x00, - 0x51, - 0x00, - 0x00, - 0x00, - 0x3e, - 0x00, - 0x03, - 0x00, - 0x48, - 0x00, - 0x00, - 0x00, - 0x52, - 0x00, - 0x00, - 0x00, - 0x3d, - 0x00, - 0x04, - 0x00, - 0x06, - 0x00, - 0x00, - 0x00, - 0x55, - 0x00, - 0x00, - 0x00, - 0x48, - 0x00, - 0x00, - 0x00, - 0x6e, - 0x00, - 0x04, - 0x00, - 0x39, - 0x00, - 0x00, - 0x00, - 0x56, - 0x00, - 0x00, - 0x00, - 0x55, - 0x00, - 0x00, - 0x00, - 0x3e, - 0x00, - 0x03, - 0x00, - 0x54, - 0x00, - 0x00, - 0x00, - 0x56, - 0x00, - 0x00, - 0x00, - 0x3e, - 0x00, - 0x03, - 0x00, - 0x59, - 0x00, - 0x00, - 0x00, - 0x5a, - 0x00, - 0x00, - 0x00, - 0x3e, - 0x00, - 0x03, - 0x00, - 0x5b, - 0x00, - 0x00, - 0x00, - 0x1c, - 0x00, - 0x00, - 0x00, - 0x3d, - 0x00, - 0x04, - 0x00, - 0x39, - 0x00, - 0x00, - 0x00, - 0x5d, - 0x00, - 0x00, - 0x00, - 0x54, - 0x00, - 0x00, - 0x00, - 0x7e, - 0x00, - 0x04, - 0x00, - 0x39, - 0x00, - 0x00, - 0x00, - 0x5e, - 0x00, - 0x00, - 0x00, - 0x5d, - 0x00, - 0x00, - 0x00, - 0x3e, - 0x00, - 0x03, - 0x00, - 0x5c, - 0x00, - 0x00, - 0x00, - 0x5e, - 0x00, - 0x00, - 0x00, - 0xf9, - 0x00, - 0x02, - 0x00, - 0x5f, - 0x00, - 0x00, - 0x00, - 0xf8, - 0x00, - 0x02, - 0x00, - 0x5f, - 0x00, - 0x00, - 0x00, - 0xf6, - 0x00, - 0x04, - 0x00, - 0x61, - 0x00, - 0x00, - 0x00, - 0x62, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0xf9, - 0x00, - 0x02, - 0x00, - 0x63, - 0x00, - 0x00, - 0x00, - 0xf8, - 0x00, - 0x02, - 0x00, - 0x63, - 0x00, - 0x00, - 0x00, - 0x3d, - 0x00, - 0x04, - 0x00, - 0x39, - 0x00, - 0x00, - 0x00, - 0x64, - 0x00, - 0x00, - 0x00, - 0x5c, - 0x00, - 0x00, - 0x00, - 0x3d, - 0x00, - 0x04, - 0x00, - 0x39, - 0x00, - 0x00, - 0x00, - 0x65, - 0x00, - 0x00, - 0x00, - 0x54, - 0x00, - 0x00, - 0x00, - 0xb3, - 0x00, - 0x05, - 0x00, - 0x11, - 0x00, - 0x00, - 0x00, - 0x66, - 0x00, - 0x00, - 0x00, - 0x64, - 0x00, - 0x00, - 0x00, - 0x65, - 0x00, - 0x00, - 0x00, - 0xfa, - 0x00, - 0x04, - 0x00, - 0x66, - 0x00, - 0x00, - 0x00, - 0x60, - 0x00, - 0x00, - 0x00, - 0x61, - 0x00, - 0x00, - 0x00, - 0xf8, - 0x00, - 0x02, - 0x00, - 0x60, - 0x00, - 0x00, - 0x00, - 0x3d, - 0x00, - 0x04, - 0x00, - 0x39, - 0x00, - 0x00, - 0x00, - 0x68, - 0x00, - 0x00, - 0x00, - 0x54, - 0x00, - 0x00, - 0x00, - 0x7e, - 0x00, - 0x04, - 0x00, - 0x39, - 0x00, - 0x00, - 0x00, - 0x69, - 0x00, - 0x00, - 0x00, - 0x68, - 0x00, - 0x00, - 0x00, - 0x3e, - 0x00, - 0x03, - 0x00, - 0x67, - 0x00, - 0x00, - 0x00, - 0x69, - 0x00, - 0x00, - 0x00, - 0xf9, - 0x00, - 0x02, - 0x00, - 0x6a, - 0x00, - 0x00, - 0x00, - 0xf8, - 0x00, - 0x02, - 0x00, - 0x6a, - 0x00, - 0x00, - 0x00, - 0xf6, - 0x00, - 0x04, - 0x00, - 0x6c, - 0x00, - 0x00, - 0x00, - 0x6d, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0xf9, - 0x00, - 0x02, - 0x00, - 0x6e, - 0x00, - 0x00, - 0x00, - 0xf8, - 0x00, - 0x02, - 0x00, - 0x6e, - 0x00, - 0x00, - 0x00, - 0x3d, - 0x00, - 0x04, - 0x00, - 0x39, - 0x00, - 0x00, - 0x00, - 0x6f, - 0x00, - 0x00, - 0x00, - 0x67, - 0x00, - 0x00, - 0x00, - 0x3d, - 0x00, - 0x04, - 0x00, - 0x39, - 0x00, - 0x00, - 0x00, - 0x70, - 0x00, - 0x00, - 0x00, - 0x54, - 0x00, - 0x00, - 0x00, - 0xb3, - 0x00, - 0x05, - 0x00, - 0x11, - 0x00, - 0x00, - 0x00, - 0x71, - 0x00, - 0x00, - 0x00, - 0x6f, - 0x00, - 0x00, - 0x00, - 0x70, - 0x00, - 0x00, - 0x00, - 0xfa, - 0x00, - 0x04, - 0x00, - 0x71, - 0x00, - 0x00, - 0x00, - 0x6b, - 0x00, - 0x00, - 0x00, - 0x6c, - 0x00, - 0x00, - 0x00, - 0xf8, - 0x00, - 0x02, - 0x00, - 0x6b, - 0x00, - 0x00, - 0x00, - 0x3d, - 0x00, - 0x04, - 0x00, - 0x31, - 0x00, - 0x00, - 0x00, - 0x73, - 0x00, - 0x00, - 0x00, - 0x45, - 0x00, - 0x00, - 0x00, - 0x3d, - 0x00, - 0x04, - 0x00, - 0x39, - 0x00, - 0x00, - 0x00, - 0x74, - 0x00, - 0x00, - 0x00, - 0x67, - 0x00, - 0x00, - 0x00, - 0x6f, - 0x00, - 0x04, - 0x00, - 0x06, - 0x00, - 0x00, - 0x00, - 0x75, - 0x00, - 0x00, - 0x00, - 0x74, - 0x00, - 0x00, - 0x00, - 0x3d, - 0x00, - 0x04, - 0x00, - 0x39, - 0x00, - 0x00, - 0x00, - 0x76, - 0x00, - 0x00, - 0x00, - 0x5c, - 0x00, - 0x00, - 0x00, - 0x6f, - 0x00, - 0x04, - 0x00, - 0x06, - 0x00, - 0x00, - 0x00, - 0x77, - 0x00, - 0x00, - 0x00, - 0x76, - 0x00, - 0x00, - 0x00, - 0x50, - 0x00, - 0x05, - 0x00, - 0x31, - 0x00, - 0x00, - 0x00, - 0x78, - 0x00, - 0x00, - 0x00, - 0x75, - 0x00, - 0x00, - 0x00, - 0x77, - 0x00, - 0x00, - 0x00, - 0x81, - 0x00, - 0x05, - 0x00, - 0x31, - 0x00, - 0x00, - 0x00, - 0x79, - 0x00, - 0x00, - 0x00, - 0x73, - 0x00, - 0x00, - 0x00, - 0x78, - 0x00, - 0x00, - 0x00, - 0x50, - 0x00, - 0x05, - 0x00, - 0x31, - 0x00, - 0x00, - 0x00, - 0x7b, - 0x00, - 0x00, - 0x00, - 0x7a, - 0x00, - 0x00, - 0x00, - 0x7a, - 0x00, - 0x00, - 0x00, - 0x81, - 0x00, - 0x05, - 0x00, - 0x31, - 0x00, - 0x00, - 0x00, - 0x7c, - 0x00, - 0x00, - 0x00, - 0x79, - 0x00, - 0x00, - 0x00, - 0x7b, - 0x00, - 0x00, - 0x00, - 0x3e, - 0x00, - 0x03, - 0x00, - 0x72, - 0x00, - 0x00, - 0x00, - 0x7c, - 0x00, - 0x00, - 0x00, - 0x3d, - 0x00, - 0x04, - 0x00, - 0x31, - 0x00, - 0x00, - 0x00, - 0x7e, - 0x00, - 0x00, - 0x00, - 0x72, - 0x00, - 0x00, - 0x00, - 0x3d, - 0x00, - 0x04, - 0x00, - 0x31, - 0x00, - 0x00, - 0x00, - 0x7f, - 0x00, - 0x00, - 0x00, - 0x3f, - 0x00, - 0x00, - 0x00, - 0x83, - 0x00, - 0x05, - 0x00, - 0x31, - 0x00, - 0x00, - 0x00, - 0x80, - 0x00, - 0x00, - 0x00, - 0x7e, - 0x00, - 0x00, - 0x00, - 0x7f, - 0x00, - 0x00, - 0x00, - 0x3e, - 0x00, - 0x03, - 0x00, - 0x7d, - 0x00, - 0x00, - 0x00, - 0x80, - 0x00, - 0x00, - 0x00, - 0x41, - 0x00, - 0x05, - 0x00, - 0x07, - 0x00, - 0x00, - 0x00, - 0x85, - 0x00, - 0x00, - 0x00, - 0x7d, - 0x00, - 0x00, - 0x00, - 0x84, - 0x00, - 0x00, - 0x00, - 0x3d, - 0x00, - 0x04, - 0x00, - 0x06, - 0x00, - 0x00, - 0x00, - 0x86, - 0x00, - 0x00, - 0x00, - 0x85, - 0x00, - 0x00, - 0x00, - 0x3e, - 0x00, - 0x03, - 0x00, - 0x82, - 0x00, - 0x00, - 0x00, - 0x86, - 0x00, - 0x00, - 0x00, - 0x3d, - 0x00, - 0x04, - 0x00, - 0x06, - 0x00, - 0x00, - 0x00, - 0x88, - 0x00, - 0x00, - 0x00, - 0x48, - 0x00, - 0x00, - 0x00, - 0x3e, - 0x00, - 0x03, - 0x00, - 0x87, - 0x00, - 0x00, - 0x00, - 0x88, - 0x00, - 0x00, - 0x00, - 0x39, - 0x00, - 0x06, - 0x00, - 0x06, - 0x00, - 0x00, - 0x00, - 0x89, - 0x00, - 0x00, - 0x00, - 0x0b, - 0x00, - 0x00, - 0x00, - 0x82, - 0x00, - 0x00, - 0x00, - 0x87, - 0x00, - 0x00, - 0x00, - 0x41, - 0x00, - 0x05, - 0x00, - 0x07, - 0x00, - 0x00, - 0x00, - 0x8c, - 0x00, - 0x00, - 0x00, - 0x7d, - 0x00, - 0x00, - 0x00, - 0x8b, - 0x00, - 0x00, - 0x00, - 0x3d, - 0x00, - 0x04, - 0x00, - 0x06, - 0x00, - 0x00, - 0x00, - 0x8d, - 0x00, - 0x00, - 0x00, - 0x8c, - 0x00, - 0x00, - 0x00, - 0x3e, - 0x00, - 0x03, - 0x00, - 0x8a, - 0x00, - 0x00, - 0x00, - 0x8d, - 0x00, - 0x00, - 0x00, - 0x3d, - 0x00, - 0x04, - 0x00, - 0x06, - 0x00, - 0x00, - 0x00, - 0x8f, - 0x00, - 0x00, - 0x00, - 0x48, - 0x00, - 0x00, - 0x00, - 0x3e, - 0x00, - 0x03, - 0x00, - 0x8e, - 0x00, - 0x00, - 0x00, - 0x8f, - 0x00, - 0x00, - 0x00, - 0x39, - 0x00, - 0x06, - 0x00, - 0x06, - 0x00, - 0x00, - 0x00, - 0x90, - 0x00, - 0x00, - 0x00, - 0x0b, - 0x00, - 0x00, - 0x00, - 0x8a, - 0x00, - 0x00, - 0x00, - 0x8e, - 0x00, - 0x00, - 0x00, - 0x85, - 0x00, - 0x05, - 0x00, - 0x06, - 0x00, - 0x00, - 0x00, - 0x91, - 0x00, - 0x00, - 0x00, - 0x89, - 0x00, - 0x00, - 0x00, - 0x90, - 0x00, - 0x00, - 0x00, - 0x3e, - 0x00, - 0x03, - 0x00, - 0x81, - 0x00, - 0x00, - 0x00, - 0x91, - 0x00, - 0x00, - 0x00, - 0x3d, - 0x00, - 0x04, - 0x00, - 0x35, - 0x00, - 0x00, - 0x00, - 0x92, - 0x00, - 0x00, - 0x00, - 0x37, - 0x00, - 0x00, - 0x00, - 0x3d, - 0x00, - 0x04, - 0x00, - 0x31, - 0x00, - 0x00, - 0x00, - 0x93, - 0x00, - 0x00, - 0x00, - 0x72, - 0x00, - 0x00, - 0x00, - 0x3d, - 0x00, - 0x04, - 0x00, - 0x31, - 0x00, - 0x00, - 0x00, - 0x94, - 0x00, - 0x00, - 0x00, - 0x33, - 0x00, - 0x00, - 0x00, - 0x88, - 0x00, - 0x05, - 0x00, - 0x31, - 0x00, - 0x00, - 0x00, - 0x95, - 0x00, - 0x00, - 0x00, - 0x93, - 0x00, - 0x00, - 0x00, - 0x94, - 0x00, - 0x00, - 0x00, - 0x57, - 0x00, - 0x05, - 0x00, - 0x57, - 0x00, - 0x00, - 0x00, - 0x96, - 0x00, - 0x00, - 0x00, - 0x92, - 0x00, - 0x00, - 0x00, - 0x95, - 0x00, - 0x00, - 0x00, - 0x3d, - 0x00, - 0x04, - 0x00, - 0x06, - 0x00, - 0x00, - 0x00, - 0x97, - 0x00, - 0x00, - 0x00, - 0x81, - 0x00, - 0x00, - 0x00, - 0x8e, - 0x00, - 0x05, - 0x00, - 0x57, - 0x00, - 0x00, - 0x00, - 0x98, - 0x00, - 0x00, - 0x00, - 0x96, - 0x00, - 0x00, - 0x00, - 0x97, - 0x00, - 0x00, - 0x00, - 0x3d, - 0x00, - 0x04, - 0x00, - 0x57, - 0x00, - 0x00, - 0x00, - 0x99, - 0x00, - 0x00, - 0x00, - 0x59, - 0x00, - 0x00, - 0x00, - 0x81, - 0x00, - 0x05, - 0x00, - 0x57, - 0x00, - 0x00, - 0x00, - 0x9a, - 0x00, - 0x00, - 0x00, - 0x99, - 0x00, - 0x00, - 0x00, - 0x98, - 0x00, - 0x00, - 0x00, - 0x3e, - 0x00, - 0x03, - 0x00, - 0x59, - 0x00, - 0x00, - 0x00, - 0x9a, - 0x00, - 0x00, - 0x00, - 0x3d, - 0x00, - 0x04, - 0x00, - 0x06, - 0x00, - 0x00, - 0x00, - 0x9b, - 0x00, - 0x00, - 0x00, - 0x81, - 0x00, - 0x00, - 0x00, - 0x3d, - 0x00, - 0x04, - 0x00, - 0x06, - 0x00, - 0x00, - 0x00, - 0x9c, - 0x00, - 0x00, - 0x00, - 0x5b, - 0x00, - 0x00, - 0x00, - 0x81, - 0x00, - 0x05, - 0x00, - 0x06, - 0x00, - 0x00, - 0x00, - 0x9d, - 0x00, - 0x00, - 0x00, - 0x9c, - 0x00, - 0x00, - 0x00, - 0x9b, - 0x00, - 0x00, - 0x00, - 0x3e, - 0x00, - 0x03, - 0x00, - 0x5b, - 0x00, - 0x00, - 0x00, - 0x9d, - 0x00, - 0x00, - 0x00, - 0xf9, - 0x00, - 0x02, - 0x00, - 0x6d, - 0x00, - 0x00, - 0x00, - 0xf8, - 0x00, - 0x02, - 0x00, - 0x6d, - 0x00, - 0x00, - 0x00, - 0x3d, - 0x00, - 0x04, - 0x00, - 0x39, - 0x00, - 0x00, - 0x00, - 0x9e, - 0x00, - 0x00, - 0x00, - 0x67, - 0x00, - 0x00, - 0x00, - 0x80, - 0x00, - 0x05, - 0x00, - 0x39, - 0x00, - 0x00, - 0x00, - 0xa0, - 0x00, - 0x00, - 0x00, - 0x9e, - 0x00, - 0x00, - 0x00, - 0x9f, - 0x00, - 0x00, - 0x00, - 0x3e, - 0x00, - 0x03, - 0x00, - 0x67, - 0x00, - 0x00, - 0x00, - 0xa0, - 0x00, - 0x00, - 0x00, - 0xf9, - 0x00, - 0x02, - 0x00, - 0x6a, - 0x00, - 0x00, - 0x00, - 0xf8, - 0x00, - 0x02, - 0x00, - 0x6c, - 0x00, - 0x00, - 0x00, - 0xf9, - 0x00, - 0x02, - 0x00, - 0x62, - 0x00, - 0x00, - 0x00, - 0xf8, - 0x00, - 0x02, - 0x00, - 0x62, - 0x00, - 0x00, - 0x00, - 0x3d, - 0x00, - 0x04, - 0x00, - 0x39, - 0x00, - 0x00, - 0x00, - 0xa1, - 0x00, - 0x00, - 0x00, - 0x5c, - 0x00, - 0x00, - 0x00, - 0x80, - 0x00, - 0x05, - 0x00, - 0x39, - 0x00, - 0x00, - 0x00, - 0xa2, - 0x00, - 0x00, - 0x00, - 0xa1, - 0x00, - 0x00, - 0x00, - 0x9f, - 0x00, - 0x00, - 0x00, - 0x3e, - 0x00, - 0x03, - 0x00, - 0x5c, - 0x00, - 0x00, - 0x00, - 0xa2, - 0x00, - 0x00, - 0x00, - 0xf9, - 0x00, - 0x02, - 0x00, - 0x5f, - 0x00, - 0x00, - 0x00, - 0xf8, - 0x00, - 0x02, - 0x00, - 0x61, - 0x00, - 0x00, - 0x00, - 0x3d, - 0x00, - 0x04, - 0x00, - 0x06, - 0x00, - 0x00, - 0x00, - 0xa5, - 0x00, - 0x00, - 0x00, - 0x5b, - 0x00, - 0x00, - 0x00, - 0xba, - 0x00, - 0x05, - 0x00, - 0x11, - 0x00, - 0x00, - 0x00, - 0xa6, - 0x00, - 0x00, - 0x00, - 0xa5, - 0x00, - 0x00, - 0x00, - 0x1c, - 0x00, - 0x00, - 0x00, - 0xf7, - 0x00, - 0x03, - 0x00, - 0xa9, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0xfa, - 0x00, - 0x04, - 0x00, - 0xa6, - 0x00, - 0x00, - 0x00, - 0xa8, - 0x00, - 0x00, - 0x00, - 0xae, - 0x00, - 0x00, - 0x00, - 0xf8, - 0x00, - 0x02, - 0x00, - 0xa8, - 0x00, - 0x00, - 0x00, - 0x3d, - 0x00, - 0x04, - 0x00, - 0x57, - 0x00, - 0x00, - 0x00, - 0xaa, - 0x00, - 0x00, - 0x00, - 0x59, - 0x00, - 0x00, - 0x00, - 0x3d, - 0x00, - 0x04, - 0x00, - 0x06, - 0x00, - 0x00, - 0x00, - 0xab, - 0x00, - 0x00, - 0x00, - 0x5b, - 0x00, - 0x00, - 0x00, - 0x50, - 0x00, - 0x07, - 0x00, - 0x57, - 0x00, - 0x00, - 0x00, - 0xac, - 0x00, - 0x00, - 0x00, - 0xab, - 0x00, - 0x00, - 0x00, - 0xab, - 0x00, - 0x00, - 0x00, - 0xab, - 0x00, - 0x00, - 0x00, - 0xab, - 0x00, - 0x00, - 0x00, - 0x88, - 0x00, - 0x05, - 0x00, - 0x57, - 0x00, - 0x00, - 0x00, - 0xad, - 0x00, - 0x00, - 0x00, - 0xaa, - 0x00, - 0x00, - 0x00, - 0xac, - 0x00, - 0x00, - 0x00, - 0x3e, - 0x00, - 0x03, - 0x00, - 0xa7, - 0x00, - 0x00, - 0x00, - 0xad, - 0x00, - 0x00, - 0x00, - 0xf9, - 0x00, - 0x02, - 0x00, - 0xa9, - 0x00, - 0x00, - 0x00, - 0xf8, - 0x00, - 0x02, - 0x00, - 0xae, - 0x00, - 0x00, - 0x00, - 0x3e, - 0x00, - 0x03, - 0x00, - 0xa7, - 0x00, - 0x00, - 0x00, - 0xaf, - 0x00, - 0x00, - 0x00, - 0xf9, - 0x00, - 0x02, - 0x00, - 0xa9, - 0x00, - 0x00, - 0x00, - 0xf8, - 0x00, - 0x02, - 0x00, - 0xa9, - 0x00, - 0x00, - 0x00, - 0x3d, - 0x00, - 0x04, - 0x00, - 0x57, - 0x00, - 0x00, - 0x00, - 0xb0, - 0x00, - 0x00, - 0x00, - 0xa7, - 0x00, - 0x00, - 0x00, - 0x3e, - 0x00, - 0x03, - 0x00, - 0xa4, - 0x00, - 0x00, - 0x00, - 0xb0, - 0x00, - 0x00, - 0x00, - 0xfd, - 0x00, - 0x01, - 0x00, - 0x38, - 0x00, - 0x01, - 0x00, - 0x36, - 0x00, - 0x05, - 0x00, - 0x06, - 0x00, - 0x00, - 0x00, - 0x0b, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x08, - 0x00, - 0x00, - 0x00, - 0x37, - 0x00, - 0x03, - 0x00, - 0x07, - 0x00, - 0x00, - 0x00, - 0x09, - 0x00, - 0x00, - 0x00, - 0x37, - 0x00, - 0x03, - 0x00, - 0x07, - 0x00, - 0x00, - 0x00, - 0x0a, - 0x00, - 0x00, - 0x00, - 0xf8, - 0x00, - 0x02, - 0x00, - 0x0c, - 0x00, - 0x00, - 0x00, - 0x3b, - 0x00, - 0x04, - 0x00, - 0x07, - 0x00, - 0x00, - 0x00, - 0x1e, - 0x00, - 0x00, - 0x00, - 0x07, - 0x00, - 0x00, - 0x00, - 0x3d, - 0x00, - 0x04, - 0x00, - 0x06, - 0x00, - 0x00, - 0x00, - 0x0d, - 0x00, - 0x00, - 0x00, - 0x09, - 0x00, - 0x00, - 0x00, - 0x0c, - 0x00, - 0x06, - 0x00, - 0x06, - 0x00, - 0x00, - 0x00, - 0x0e, - 0x00, - 0x00, - 0x00, - 0x01, - 0x00, - 0x00, - 0x00, - 0x04, - 0x00, - 0x00, - 0x00, - 0x0d, - 0x00, - 0x00, - 0x00, - 0x3e, - 0x00, - 0x03, - 0x00, - 0x09, - 0x00, - 0x00, - 0x00, - 0x0e, - 0x00, - 0x00, - 0x00, - 0x3d, - 0x00, - 0x04, - 0x00, - 0x06, - 0x00, - 0x00, - 0x00, - 0x0f, - 0x00, - 0x00, - 0x00, - 0x09, - 0x00, - 0x00, - 0x00, - 0xb8, - 0x00, - 0x05, - 0x00, - 0x11, - 0x00, - 0x00, - 0x00, - 0x12, - 0x00, - 0x00, - 0x00, - 0x0f, - 0x00, - 0x00, - 0x00, - 0x10, - 0x00, - 0x00, - 0x00, - 0xf7, - 0x00, - 0x03, - 0x00, - 0x14, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0xfa, - 0x00, - 0x04, - 0x00, - 0x12, - 0x00, - 0x00, - 0x00, - 0x13, - 0x00, - 0x00, - 0x00, - 0x14, - 0x00, - 0x00, - 0x00, - 0xf8, - 0x00, - 0x02, - 0x00, - 0x13, - 0x00, - 0x00, - 0x00, - 0xfe, - 0x00, - 0x02, - 0x00, - 0x15, - 0x00, - 0x00, - 0x00, - 0xf8, - 0x00, - 0x02, - 0x00, - 0x14, - 0x00, - 0x00, - 0x00, - 0x3d, - 0x00, - 0x04, - 0x00, - 0x06, - 0x00, - 0x00, - 0x00, - 0x17, - 0x00, - 0x00, - 0x00, - 0x09, - 0x00, - 0x00, - 0x00, - 0x3d, - 0x00, - 0x04, - 0x00, - 0x06, - 0x00, - 0x00, - 0x00, - 0x18, - 0x00, - 0x00, - 0x00, - 0x0a, - 0x00, - 0x00, - 0x00, - 0xbe, - 0x00, - 0x05, - 0x00, - 0x11, - 0x00, - 0x00, - 0x00, - 0x19, - 0x00, - 0x00, - 0x00, - 0x17, - 0x00, - 0x00, - 0x00, - 0x18, - 0x00, - 0x00, - 0x00, - 0xf7, - 0x00, - 0x03, - 0x00, - 0x1b, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0xfa, - 0x00, - 0x04, - 0x00, - 0x19, - 0x00, - 0x00, - 0x00, - 0x1a, - 0x00, - 0x00, - 0x00, - 0x1b, - 0x00, - 0x00, - 0x00, - 0xf8, - 0x00, - 0x02, - 0x00, - 0x1a, - 0x00, - 0x00, - 0x00, - 0xfe, - 0x00, - 0x02, - 0x00, - 0x1c, - 0x00, - 0x00, - 0x00, - 0xf8, - 0x00, - 0x02, - 0x00, - 0x1b, - 0x00, - 0x00, - 0x00, - 0x3d, - 0x00, - 0x04, - 0x00, - 0x06, - 0x00, - 0x00, - 0x00, - 0x20, - 0x00, - 0x00, - 0x00, - 0x09, - 0x00, - 0x00, - 0x00, - 0x85, - 0x00, - 0x05, - 0x00, - 0x06, - 0x00, - 0x00, - 0x00, - 0x21, - 0x00, - 0x00, - 0x00, - 0x1f, - 0x00, - 0x00, - 0x00, - 0x20, - 0x00, - 0x00, - 0x00, - 0x3e, - 0x00, - 0x03, - 0x00, - 0x1e, - 0x00, - 0x00, - 0x00, - 0x21, - 0x00, - 0x00, - 0x00, - 0x3d, - 0x00, - 0x04, - 0x00, - 0x06, - 0x00, - 0x00, - 0x00, - 0x22, - 0x00, - 0x00, - 0x00, - 0x0a, - 0x00, - 0x00, - 0x00, - 0x3d, - 0x00, - 0x04, - 0x00, - 0x06, - 0x00, - 0x00, - 0x00, - 0x23, - 0x00, - 0x00, - 0x00, - 0x1e, - 0x00, - 0x00, - 0x00, - 0x0c, - 0x00, - 0x06, - 0x00, - 0x06, - 0x00, - 0x00, - 0x00, - 0x24, - 0x00, - 0x00, - 0x00, - 0x01, - 0x00, - 0x00, - 0x00, - 0x0d, - 0x00, - 0x00, - 0x00, - 0x23, - 0x00, - 0x00, - 0x00, - 0x85, - 0x00, - 0x05, - 0x00, - 0x06, - 0x00, - 0x00, - 0x00, - 0x25, - 0x00, - 0x00, - 0x00, - 0x22, - 0x00, - 0x00, - 0x00, - 0x24, - 0x00, - 0x00, - 0x00, - 0x3d, - 0x00, - 0x04, - 0x00, - 0x06, - 0x00, - 0x00, - 0x00, - 0x26, - 0x00, - 0x00, - 0x00, - 0x1e, - 0x00, - 0x00, - 0x00, - 0x3d, - 0x00, - 0x04, - 0x00, - 0x06, - 0x00, - 0x00, - 0x00, - 0x27, - 0x00, - 0x00, - 0x00, - 0x0a, - 0x00, - 0x00, - 0x00, - 0x88, - 0x00, - 0x05, - 0x00, - 0x06, - 0x00, - 0x00, - 0x00, - 0x28, - 0x00, - 0x00, - 0x00, - 0x26, - 0x00, - 0x00, - 0x00, - 0x27, - 0x00, - 0x00, - 0x00, - 0x0c, - 0x00, - 0x06, - 0x00, - 0x06, - 0x00, - 0x00, - 0x00, - 0x29, - 0x00, - 0x00, - 0x00, - 0x01, - 0x00, - 0x00, - 0x00, - 0x0d, - 0x00, - 0x00, - 0x00, - 0x28, - 0x00, - 0x00, - 0x00, - 0x85, - 0x00, - 0x05, - 0x00, - 0x06, - 0x00, - 0x00, - 0x00, - 0x2a, - 0x00, - 0x00, - 0x00, - 0x25, - 0x00, - 0x00, - 0x00, - 0x29, - 0x00, - 0x00, - 0x00, - 0x3d, - 0x00, - 0x04, - 0x00, - 0x06, - 0x00, - 0x00, - 0x00, - 0x2b, - 0x00, - 0x00, - 0x00, - 0x1e, - 0x00, - 0x00, - 0x00, - 0x3d, - 0x00, - 0x04, - 0x00, - 0x06, - 0x00, - 0x00, - 0x00, - 0x2c, - 0x00, - 0x00, - 0x00, - 0x1e, - 0x00, - 0x00, - 0x00, - 0x85, - 0x00, - 0x05, - 0x00, - 0x06, - 0x00, - 0x00, - 0x00, - 0x2d, - 0x00, - 0x00, - 0x00, - 0x2b, - 0x00, - 0x00, - 0x00, - 0x2c, - 0x00, - 0x00, - 0x00, - 0x88, - 0x00, - 0x05, - 0x00, - 0x06, - 0x00, - 0x00, - 0x00, - 0x2e, - 0x00, - 0x00, - 0x00, - 0x2a, - 0x00, - 0x00, - 0x00, - 0x2d, - 0x00, - 0x00, - 0x00, - 0xfe, - 0x00, - 0x02, - 0x00, - 0x2e, - 0x00, - 0x00, - 0x00, - 0x38, - 0x00, - 0x01, - 0x00, -}; -static const size_t kdownscale_frag_spv_size = 4248; diff --git a/source/core/rendering/sdl3gpu/spv/postfx_frag_spv.h b/source/core/rendering/sdl3gpu/spv/postfx_frag_spv.h index 42edebe..f452224 100644 --- a/source/core/rendering/sdl3gpu/spv/postfx_frag_spv.h +++ b/source/core/rendering/sdl3gpu/spv/postfx_frag_spv.h @@ -14,7 +14,7 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x0d, 0x00, - 0xdd, + 0xf6, 0x01, 0x00, 0x00, @@ -102,7 +102,7 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, - 0xa1, + 0xba, 0x01, 0x00, 0x00, @@ -648,7 +648,7 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x06, 0x00, - 0x06, + 0x05, 0x00, 0x6f, 0x00, @@ -658,17 +658,13 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, - 0x6f, - 0x76, + 0x66, + 0x6c, + 0x69, + 0x63, + 0x6b, 0x65, 0x72, - 0x73, - 0x61, - 0x6d, - 0x70, - 0x6c, - 0x65, - 0x00, 0x00, 0x06, 0x00, @@ -682,14 +678,118 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, + 0x70, + 0x61, + 0x64, + 0x32, + 0x00, + 0x00, + 0x00, + 0x00, + 0x06, + 0x00, + 0x07, + 0x00, + 0x6f, + 0x00, + 0x00, + 0x00, + 0x0c, + 0x00, + 0x00, + 0x00, + 0x73, + 0x63, + 0x61, + 0x6e, + 0x5f, + 0x64, + 0x61, + 0x72, + 0x6b, + 0x5f, + 0x72, + 0x61, + 0x74, + 0x69, + 0x6f, + 0x00, + 0x06, + 0x00, + 0x07, + 0x00, + 0x6f, + 0x00, + 0x00, + 0x00, + 0x0d, + 0x00, + 0x00, + 0x00, + 0x73, + 0x63, + 0x61, + 0x6e, + 0x5f, + 0x64, + 0x61, + 0x72, + 0x6b, + 0x5f, 0x66, 0x6c, - 0x69, - 0x63, - 0x6b, - 0x65, + 0x6f, + 0x6f, 0x72, 0x00, + 0x06, + 0x00, + 0x07, + 0x00, + 0x6f, + 0x00, + 0x00, + 0x00, + 0x0e, + 0x00, + 0x00, + 0x00, + 0x73, + 0x63, + 0x61, + 0x6e, + 0x5f, + 0x65, + 0x64, + 0x67, + 0x65, + 0x5f, + 0x73, + 0x6f, + 0x66, + 0x74, + 0x00, + 0x00, + 0x06, + 0x00, + 0x05, + 0x00, + 0x6f, + 0x00, + 0x00, + 0x00, + 0x0f, + 0x00, + 0x00, + 0x00, + 0x70, + 0x61, + 0x64, + 0x33, + 0x00, + 0x00, + 0x00, + 0x00, 0x05, 0x00, 0x03, @@ -846,7 +946,7 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x03, 0x00, - 0xcd, + 0xca, 0x00, 0x00, 0x00, @@ -858,7 +958,7 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x04, 0x00, - 0xce, + 0xcb, 0x00, 0x00, 0x00, @@ -874,7 +974,7 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x04, 0x00, - 0xd1, + 0xce, 0x00, 0x00, 0x00, @@ -890,26 +990,26 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x04, 0x00, + 0xd7, + 0x00, + 0x00, + 0x00, + 0x70, + 0x61, + 0x72, + 0x61, + 0x6d, + 0x00, + 0x00, + 0x00, + 0x05, + 0x00, + 0x04, + 0x00, 0xda, 0x00, 0x00, 0x00, - 0x70, - 0x61, - 0x72, - 0x61, - 0x6d, - 0x00, - 0x00, - 0x00, - 0x05, - 0x00, - 0x04, - 0x00, - 0xdd, - 0x00, - 0x00, - 0x00, 0x79, 0x63, 0x63, @@ -922,7 +1022,7 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x04, 0x00, - 0xe5, + 0xe2, 0x00, 0x00, 0x00, @@ -938,7 +1038,7 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x04, 0x00, - 0xe8, + 0xe5, 0x00, 0x00, 0x00, @@ -954,7 +1054,7 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x04, 0x00, - 0xf0, + 0xed, 0x00, 0x00, 0x00, @@ -970,7 +1070,7 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x04, 0x00, - 0xf3, + 0xf0, 0x00, 0x00, 0x00, @@ -986,7 +1086,7 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x04, 0x00, - 0xfb, + 0xf8, 0x00, 0x00, 0x00, @@ -1002,7 +1102,7 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x04, 0x00, - 0x16, + 0x13, 0x01, 0x00, 0x00, @@ -1018,7 +1118,7 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x04, 0x00, - 0x18, + 0x15, 0x01, 0x00, 0x00, @@ -1034,7 +1134,7 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x03, 0x00, - 0x21, + 0x1e, 0x01, 0x00, 0x00, @@ -1046,7 +1146,7 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x03, 0x00, - 0x47, + 0x44, 0x01, 0x00, 0x00, @@ -1058,7 +1158,7 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x03, 0x00, - 0x58, + 0x55, 0x01, 0x00, 0x00, @@ -1068,61 +1168,109 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x05, 0x00, - 0x05, + 0x03, 0x00, - 0x5e, + 0x5a, 0x01, 0x00, 0x00, - 0x66, - 0x72, - 0x61, - 0x63, - 0x5f, - 0x69, - 0x6e, - 0x5f, - 0x72, - 0x6f, - 0x77, - 0x00, - 0x05, - 0x00, - 0x04, - 0x00, - 0x66, - 0x01, - 0x00, - 0x00, - 0x72, - 0x6f, - 0x77, - 0x5f, - 0x70, - 0x6f, 0x73, + 0x75, + 0x62, 0x00, 0x05, 0x00, - 0x04, + 0x05, 0x00, - 0x6b, + 0x62, 0x01, 0x00, 0x00, - 0x69, - 0x73, - 0x5f, 0x64, 0x61, 0x72, 0x6b, + 0x5f, + 0x63, + 0x65, + 0x6e, + 0x74, + 0x65, + 0x72, + 0x00, + 0x05, + 0x00, + 0x03, + 0x00, + 0x68, + 0x01, + 0x00, + 0x00, + 0x64, + 0x00, + 0x00, + 0x00, + 0x05, + 0x00, + 0x05, + 0x00, + 0x71, + 0x01, + 0x00, + 0x00, + 0x68, + 0x61, + 0x6c, + 0x66, + 0x5f, + 0x77, + 0x69, + 0x64, + 0x74, + 0x68, + 0x00, + 0x00, + 0x05, + 0x00, + 0x05, + 0x00, + 0x75, + 0x01, + 0x00, + 0x00, + 0x73, + 0x6f, + 0x66, + 0x74, + 0x6e, + 0x65, + 0x73, + 0x73, + 0x00, + 0x00, + 0x00, 0x00, 0x05, 0x00, 0x04, 0x00, - 0x70, + 0x7c, + 0x01, + 0x00, + 0x00, + 0x62, + 0x61, + 0x6e, + 0x64, + 0x00, + 0x00, + 0x00, + 0x00, + 0x05, + 0x00, + 0x04, + 0x00, + 0x86, 0x01, 0x00, 0x00, @@ -1138,7 +1286,7 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x03, 0x00, - 0x7e, + 0x97, 0x01, 0x00, 0x00, @@ -1150,7 +1298,7 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x03, 0x00, - 0x89, + 0xa2, 0x01, 0x00, 0x00, @@ -1162,7 +1310,7 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x05, 0x00, - 0x8d, + 0xa6, 0x01, 0x00, 0x00, @@ -1182,7 +1330,7 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x05, 0x00, - 0x9f, + 0xb8, 0x01, 0x00, 0x00, @@ -1202,7 +1350,7 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x06, 0x00, - 0xa1, + 0xba, 0x01, 0x00, 0x00, @@ -1226,7 +1374,7 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x04, 0x00, - 0xa8, + 0xc1, 0x01, 0x00, 0x00, @@ -1242,7 +1390,7 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x06, 0x00, - 0xc7, + 0xe0, 0x01, 0x00, 0x00, @@ -1530,6 +1678,86 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, + 0x48, + 0x00, + 0x05, + 0x00, + 0x6f, + 0x00, + 0x00, + 0x00, + 0x0c, + 0x00, + 0x00, + 0x00, + 0x23, + 0x00, + 0x00, + 0x00, + 0x30, + 0x00, + 0x00, + 0x00, + 0x48, + 0x00, + 0x05, + 0x00, + 0x6f, + 0x00, + 0x00, + 0x00, + 0x0d, + 0x00, + 0x00, + 0x00, + 0x23, + 0x00, + 0x00, + 0x00, + 0x34, + 0x00, + 0x00, + 0x00, + 0x48, + 0x00, + 0x05, + 0x00, + 0x6f, + 0x00, + 0x00, + 0x00, + 0x0e, + 0x00, + 0x00, + 0x00, + 0x23, + 0x00, + 0x00, + 0x00, + 0x38, + 0x00, + 0x00, + 0x00, + 0x48, + 0x00, + 0x05, + 0x00, + 0x6f, + 0x00, + 0x00, + 0x00, + 0x0f, + 0x00, + 0x00, + 0x00, + 0x23, + 0x00, + 0x00, + 0x00, + 0x3c, + 0x00, + 0x00, + 0x00, 0x47, 0x00, 0x04, @@ -1614,7 +1842,7 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x04, 0x00, - 0xa1, + 0xba, 0x01, 0x00, 0x00, @@ -2076,7 +2304,7 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x1e, 0x00, - 0x0e, + 0x12, 0x00, 0x6f, 0x00, @@ -2130,6 +2358,22 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, 0x20, 0x00, 0x04, @@ -2514,27 +2758,11 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x04, 0x00, - 0x72, - 0x00, - 0x00, - 0x00, - 0xc8, - 0x00, - 0x00, - 0x00, - 0x0a, - 0x00, - 0x00, - 0x00, - 0x2b, - 0x00, - 0x04, - 0x00, 0x06, 0x00, 0x00, 0x00, - 0xd4, + 0xd1, 0x00, 0x00, 0x00, @@ -2550,7 +2778,7 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, - 0x0f, + 0x0c, 0x01, 0x00, 0x00, @@ -2566,7 +2794,7 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, - 0x22, + 0x1f, 0x01, 0x00, 0x00, @@ -2582,7 +2810,7 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, - 0x25, + 0x22, 0x01, 0x00, 0x00, @@ -2598,7 +2826,7 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, - 0x27, + 0x24, 0x01, 0x00, 0x00, @@ -2614,7 +2842,7 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, - 0x28, + 0x25, 0x01, 0x00, 0x00, @@ -2630,7 +2858,7 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, - 0x2b, + 0x28, 0x01, 0x00, 0x00, @@ -2646,7 +2874,7 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, - 0x41, + 0x3e, 0x01, 0x00, 0x00, @@ -2662,7 +2890,7 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, - 0x49, + 0x46, 0x01, 0x00, 0x00, @@ -2678,19 +2906,19 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, - 0x4a, + 0x47, 0x01, 0x00, 0x00, - 0x49, + 0x46, 0x01, 0x00, 0x00, - 0x49, + 0x46, 0x01, 0x00, 0x00, - 0x49, + 0x46, 0x01, 0x00, 0x00, @@ -2702,7 +2930,7 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, - 0x52, + 0x4f, 0x01, 0x00, 0x00, @@ -2718,7 +2946,7 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, - 0x59, + 0x56, 0x01, 0x00, 0x00, @@ -2734,7 +2962,7 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, - 0x61, + 0x5d, 0x01, 0x00, 0x00, @@ -2746,11 +2974,59 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x04, 0x00, + 0x72, + 0x00, + 0x00, + 0x00, + 0x63, + 0x01, + 0x00, + 0x00, + 0x0c, + 0x00, + 0x00, + 0x00, + 0x2b, + 0x00, + 0x04, + 0x00, + 0x72, + 0x00, + 0x00, + 0x00, + 0x76, + 0x01, + 0x00, + 0x00, + 0x0e, + 0x00, + 0x00, + 0x00, + 0x2b, + 0x00, + 0x04, + 0x00, + 0x72, + 0x00, + 0x00, + 0x00, + 0x87, + 0x01, + 0x00, + 0x00, + 0x0d, + 0x00, + 0x00, + 0x00, + 0x2b, + 0x00, + 0x04, + 0x00, 0x06, 0x00, 0x00, 0x00, - 0x80, + 0x99, 0x01, 0x00, 0x00, @@ -2766,19 +3042,19 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, - 0x81, + 0x9a, 0x01, 0x00, 0x00, - 0x80, + 0x99, 0x01, 0x00, 0x00, - 0x80, + 0x99, 0x01, 0x00, 0x00, - 0x80, + 0x99, 0x01, 0x00, 0x00, @@ -2790,7 +3066,7 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, - 0x99, + 0xb2, 0x01, 0x00, 0x00, @@ -2802,7 +3078,7 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x04, 0x00, - 0xa0, + 0xb9, 0x01, 0x00, 0x00, @@ -2818,11 +3094,11 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x04, 0x00, - 0xa0, + 0xb9, 0x01, 0x00, 0x00, - 0xa1, + 0xba, 0x01, 0x00, 0x00, @@ -2834,7 +3110,7 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x04, 0x00, - 0xa2, + 0xbb, 0x01, 0x00, 0x00, @@ -2854,7 +3130,7 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, - 0xa5, + 0xbe, 0x01, 0x00, 0x00, @@ -2870,7 +3146,7 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, - 0xa9, + 0xc2, 0x01, 0x00, 0x00, @@ -2886,19 +3162,19 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, - 0xaa, + 0xc3, 0x01, 0x00, 0x00, - 0xa9, + 0xc2, 0x01, 0x00, 0x00, - 0xa9, + 0xc2, 0x01, 0x00, 0x00, - 0xa9, + 0xc2, 0x01, 0x00, 0x00, @@ -2910,7 +3186,7 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, - 0xb2, + 0xcb, 0x01, 0x00, 0x00, @@ -2926,11 +3202,11 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, - 0xc1, + 0xda, 0x01, 0x00, 0x00, - 0x0b, + 0x0a, 0x00, 0x00, 0x00, @@ -2942,7 +3218,7 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, - 0xca, + 0xe3, 0x01, 0x00, 0x00, @@ -2958,7 +3234,7 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, - 0xd1, + 0xea, 0x01, 0x00, 0x00, @@ -3130,7 +3406,23 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, - 0xcd, + 0xca, + 0x00, + 0x00, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0x3b, + 0x00, + 0x04, + 0x00, + 0x08, + 0x00, + 0x00, + 0x00, + 0xcb, 0x00, 0x00, 0x00, @@ -3162,7 +3454,7 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, - 0xd1, + 0xd7, 0x00, 0x00, 0x00, @@ -3194,7 +3486,7 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, - 0xdd, + 0xe2, 0x00, 0x00, 0x00, @@ -3226,7 +3518,7 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, - 0xe8, + 0xed, 0x00, 0x00, 0x00, @@ -3258,7 +3550,7 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, - 0xf3, + 0xf8, 0x00, 0x00, 0x00, @@ -3274,23 +3566,7 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, - 0xfb, - 0x00, - 0x00, - 0x00, - 0x07, - 0x00, - 0x00, - 0x00, - 0x3b, - 0x00, - 0x04, - 0x00, - 0x08, - 0x00, - 0x00, - 0x00, - 0x16, + 0x13, 0x01, 0x00, 0x00, @@ -3306,7 +3582,7 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, - 0x18, + 0x15, 0x01, 0x00, 0x00, @@ -3322,7 +3598,7 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, - 0x21, + 0x1e, 0x01, 0x00, 0x00, @@ -3338,7 +3614,7 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, - 0x47, + 0x44, 0x01, 0x00, 0x00, @@ -3354,7 +3630,7 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, - 0x58, + 0x55, 0x01, 0x00, 0x00, @@ -3370,7 +3646,7 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, - 0x5e, + 0x5a, 0x01, 0x00, 0x00, @@ -3386,7 +3662,7 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, - 0x66, + 0x62, 0x01, 0x00, 0x00, @@ -3402,7 +3678,7 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, - 0x6b, + 0x68, 0x01, 0x00, 0x00, @@ -3418,7 +3694,55 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, - 0x70, + 0x71, + 0x01, + 0x00, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0x3b, + 0x00, + 0x04, + 0x00, + 0x13, + 0x00, + 0x00, + 0x00, + 0x75, + 0x01, + 0x00, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0x3b, + 0x00, + 0x04, + 0x00, + 0x13, + 0x00, + 0x00, + 0x00, + 0x7c, + 0x01, + 0x00, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0x3b, + 0x00, + 0x04, + 0x00, + 0x13, + 0x00, + 0x00, + 0x00, + 0x86, 0x01, 0x00, 0x00, @@ -3434,7 +3758,7 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, - 0x7e, + 0x97, 0x01, 0x00, 0x00, @@ -3450,7 +3774,7 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, - 0x89, + 0xa2, 0x01, 0x00, 0x00, @@ -3466,7 +3790,7 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, - 0x8d, + 0xa6, 0x01, 0x00, 0x00, @@ -3482,7 +3806,7 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, - 0x9f, + 0xb8, 0x01, 0x00, 0x00, @@ -3498,7 +3822,7 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, - 0xa8, + 0xc1, 0x01, 0x00, 0x00, @@ -3514,7 +3838,7 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, - 0xc7, + 0xe0, 0x01, 0x00, 0x00, @@ -4686,7 +5010,7 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, - 0x1f, + 0x1c, 0x01, 0x00, 0x00, @@ -4798,19 +5122,11 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, - 0x41, + 0x3d, 0x00, - 0x05, + 0x04, 0x00, - 0x74, - 0x00, - 0x00, - 0x00, - 0xc9, - 0x00, - 0x00, - 0x00, - 0x71, + 0x06, 0x00, 0x00, 0x00, @@ -4818,34 +5134,6 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, - 0x3d, - 0x00, - 0x04, - 0x00, - 0x06, - 0x00, - 0x00, - 0x00, - 0xca, - 0x00, - 0x00, - 0x00, - 0xc9, - 0x00, - 0x00, - 0x00, - 0x3d, - 0x00, - 0x04, - 0x00, - 0x06, - 0x00, - 0x00, - 0x00, - 0xcb, - 0x00, - 0x00, - 0x00, 0xbf, 0x00, 0x00, @@ -4858,15 +5146,15 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, - 0xcc, + 0xc9, 0x00, 0x00, 0x00, - 0xca, + 0x63, 0x00, 0x00, 0x00, - 0xcb, + 0xc8, 0x00, 0x00, 0x00, @@ -4878,7 +5166,7 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, - 0xcc, + 0xc9, 0x00, 0x00, 0x00, @@ -4890,7 +5178,7 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, - 0xcf, + 0xcc, 0x00, 0x00, 0x00, @@ -4902,7 +5190,51 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x03, 0x00, - 0xce, + 0xcb, + 0x00, + 0x00, + 0x00, + 0xcc, + 0x00, + 0x00, + 0x00, + 0x39, + 0x00, + 0x05, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0xcd, + 0x00, + 0x00, + 0x00, + 0x0b, + 0x00, + 0x00, + 0x00, + 0xcb, + 0x00, + 0x00, + 0x00, + 0x3e, + 0x00, + 0x03, + 0x00, + 0xca, + 0x00, + 0x00, + 0x00, + 0xcd, + 0x00, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0xb2, 0x00, 0x00, 0x00, @@ -4910,6 +5242,166 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, + 0xb4, + 0x00, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x69, + 0x00, + 0x00, + 0x00, + 0xd0, + 0x00, + 0x00, + 0x00, + 0x6b, + 0x00, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0xd2, + 0x00, + 0x00, + 0x00, + 0xc7, + 0x00, + 0x00, + 0x00, + 0x85, + 0x00, + 0x05, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0xd3, + 0x00, + 0x00, + 0x00, + 0xd1, + 0x00, + 0x00, + 0x00, + 0xd2, + 0x00, + 0x00, + 0x00, + 0x50, + 0x00, + 0x05, + 0x00, + 0x69, + 0x00, + 0x00, + 0x00, + 0xd4, + 0x00, + 0x00, + 0x00, + 0xd3, + 0x00, + 0x00, + 0x00, + 0x62, + 0x00, + 0x00, + 0x00, + 0x83, + 0x00, + 0x05, + 0x00, + 0x69, + 0x00, + 0x00, + 0x00, + 0xd5, + 0x00, + 0x00, + 0x00, + 0xd0, + 0x00, + 0x00, + 0x00, + 0xd4, + 0x00, + 0x00, + 0x00, + 0x57, + 0x00, + 0x05, + 0x00, + 0xa8, + 0x00, + 0x00, + 0x00, + 0xd6, + 0x00, + 0x00, + 0x00, + 0xcf, + 0x00, + 0x00, + 0x00, + 0xd5, + 0x00, + 0x00, + 0x00, + 0x4f, + 0x00, + 0x08, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0xd8, + 0x00, + 0x00, + 0x00, + 0xd6, + 0x00, + 0x00, + 0x00, + 0xd6, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x01, + 0x00, + 0x00, + 0x00, + 0x02, + 0x00, + 0x00, + 0x00, + 0x3e, + 0x00, + 0x03, + 0x00, + 0xd7, + 0x00, + 0x00, + 0x00, + 0xd8, + 0x00, + 0x00, + 0x00, 0x39, 0x00, 0x05, @@ -4918,7 +5410,7 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, - 0xd0, + 0xd9, 0x00, 0x00, 0x00, @@ -4926,809 +5418,681 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, + 0xd7, + 0x00, + 0x00, + 0x00, + 0x3e, + 0x00, + 0x03, + 0x00, + 0xce, + 0x00, + 0x00, + 0x00, + 0xd9, + 0x00, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0xb2, + 0x00, + 0x00, + 0x00, + 0xdb, + 0x00, + 0x00, + 0x00, + 0xb4, + 0x00, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x69, + 0x00, + 0x00, + 0x00, + 0xdc, + 0x00, + 0x00, + 0x00, + 0x6b, + 0x00, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0xdd, + 0x00, + 0x00, + 0x00, + 0xc7, + 0x00, + 0x00, + 0x00, + 0x85, + 0x00, + 0x05, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0xde, + 0x00, + 0x00, + 0x00, + 0x63, + 0x00, + 0x00, + 0x00, + 0xdd, + 0x00, + 0x00, + 0x00, + 0x50, + 0x00, + 0x05, + 0x00, + 0x69, + 0x00, + 0x00, + 0x00, + 0xdf, + 0x00, + 0x00, + 0x00, + 0xde, + 0x00, + 0x00, + 0x00, + 0x62, + 0x00, + 0x00, + 0x00, + 0x83, + 0x00, + 0x05, + 0x00, + 0x69, + 0x00, + 0x00, + 0x00, + 0xe0, + 0x00, + 0x00, + 0x00, + 0xdc, + 0x00, + 0x00, + 0x00, + 0xdf, + 0x00, + 0x00, + 0x00, + 0x57, + 0x00, + 0x05, + 0x00, + 0xa8, + 0x00, + 0x00, + 0x00, + 0xe1, + 0x00, + 0x00, + 0x00, + 0xdb, + 0x00, + 0x00, + 0x00, + 0xe0, + 0x00, + 0x00, + 0x00, + 0x4f, + 0x00, + 0x08, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0xe3, + 0x00, + 0x00, + 0x00, + 0xe1, + 0x00, + 0x00, + 0x00, + 0xe1, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x01, + 0x00, + 0x00, + 0x00, + 0x02, + 0x00, + 0x00, + 0x00, + 0x3e, + 0x00, + 0x03, + 0x00, + 0xe2, + 0x00, + 0x00, + 0x00, + 0xe3, + 0x00, + 0x00, + 0x00, + 0x39, + 0x00, + 0x05, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0xe4, + 0x00, + 0x00, + 0x00, + 0x0b, + 0x00, + 0x00, + 0x00, + 0xe2, + 0x00, + 0x00, + 0x00, + 0x3e, + 0x00, + 0x03, + 0x00, + 0xda, + 0x00, + 0x00, + 0x00, + 0xe4, + 0x00, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0xb2, + 0x00, + 0x00, + 0x00, + 0xe6, + 0x00, + 0x00, + 0x00, + 0xb4, + 0x00, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x69, + 0x00, + 0x00, + 0x00, + 0xe7, + 0x00, + 0x00, + 0x00, + 0x6b, + 0x00, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0xe8, + 0x00, + 0x00, + 0x00, + 0xc7, + 0x00, + 0x00, + 0x00, + 0x85, + 0x00, + 0x05, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0xe9, + 0x00, + 0x00, + 0x00, + 0x63, + 0x00, + 0x00, + 0x00, + 0xe8, + 0x00, + 0x00, + 0x00, + 0x50, + 0x00, + 0x05, + 0x00, + 0x69, + 0x00, + 0x00, + 0x00, + 0xea, + 0x00, + 0x00, + 0x00, + 0xe9, + 0x00, + 0x00, + 0x00, + 0x62, + 0x00, + 0x00, + 0x00, + 0x81, + 0x00, + 0x05, + 0x00, + 0x69, + 0x00, + 0x00, + 0x00, + 0xeb, + 0x00, + 0x00, + 0x00, + 0xe7, + 0x00, + 0x00, + 0x00, + 0xea, + 0x00, + 0x00, + 0x00, + 0x57, + 0x00, + 0x05, + 0x00, + 0xa8, + 0x00, + 0x00, + 0x00, + 0xec, + 0x00, + 0x00, + 0x00, + 0xe6, + 0x00, + 0x00, + 0x00, + 0xeb, + 0x00, + 0x00, + 0x00, + 0x4f, + 0x00, + 0x08, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0xee, + 0x00, + 0x00, + 0x00, + 0xec, + 0x00, + 0x00, + 0x00, + 0xec, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x01, + 0x00, + 0x00, + 0x00, + 0x02, + 0x00, + 0x00, + 0x00, + 0x3e, + 0x00, + 0x03, + 0x00, + 0xed, + 0x00, + 0x00, + 0x00, + 0xee, + 0x00, + 0x00, + 0x00, + 0x39, + 0x00, + 0x05, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0xef, + 0x00, + 0x00, + 0x00, + 0x0b, + 0x00, + 0x00, + 0x00, + 0xed, + 0x00, + 0x00, + 0x00, + 0x3e, + 0x00, + 0x03, + 0x00, + 0xe5, + 0x00, + 0x00, + 0x00, + 0xef, + 0x00, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0xb2, + 0x00, + 0x00, + 0x00, + 0xf1, + 0x00, + 0x00, + 0x00, + 0xb4, + 0x00, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x69, + 0x00, + 0x00, + 0x00, + 0xf2, + 0x00, + 0x00, + 0x00, + 0x6b, + 0x00, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0xf3, + 0x00, + 0x00, + 0x00, + 0xc7, + 0x00, + 0x00, + 0x00, + 0x85, + 0x00, + 0x05, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0xf4, + 0x00, + 0x00, + 0x00, + 0xd1, + 0x00, + 0x00, + 0x00, + 0xf3, + 0x00, + 0x00, + 0x00, + 0x50, + 0x00, + 0x05, + 0x00, + 0x69, + 0x00, + 0x00, + 0x00, + 0xf5, + 0x00, + 0x00, + 0x00, + 0xf4, + 0x00, + 0x00, + 0x00, + 0x62, + 0x00, + 0x00, + 0x00, + 0x81, + 0x00, + 0x05, + 0x00, + 0x69, + 0x00, + 0x00, + 0x00, + 0xf6, + 0x00, + 0x00, + 0x00, + 0xf2, + 0x00, + 0x00, + 0x00, + 0xf5, + 0x00, + 0x00, + 0x00, + 0x57, + 0x00, + 0x05, + 0x00, + 0xa8, + 0x00, + 0x00, + 0x00, + 0xf7, + 0x00, + 0x00, + 0x00, + 0xf1, + 0x00, + 0x00, + 0x00, + 0xf6, + 0x00, + 0x00, + 0x00, + 0x4f, + 0x00, + 0x08, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0xf9, + 0x00, + 0x00, + 0x00, + 0xf7, + 0x00, + 0x00, + 0x00, + 0xf7, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x01, + 0x00, + 0x00, + 0x00, + 0x02, + 0x00, + 0x00, + 0x00, + 0x3e, + 0x00, + 0x03, + 0x00, + 0xf8, + 0x00, + 0x00, + 0x00, + 0xf9, + 0x00, + 0x00, + 0x00, + 0x39, + 0x00, + 0x05, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0xfa, + 0x00, + 0x00, + 0x00, + 0x0b, + 0x00, + 0x00, + 0x00, + 0xf8, + 0x00, + 0x00, + 0x00, + 0x3e, + 0x00, + 0x03, + 0x00, + 0xf0, + 0x00, + 0x00, + 0x00, + 0xfa, + 0x00, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0xfb, + 0x00, + 0x00, + 0x00, 0xce, 0x00, 0x00, 0x00, - 0x3e, - 0x00, - 0x03, - 0x00, - 0xcd, - 0x00, - 0x00, - 0x00, - 0xd0, - 0x00, - 0x00, - 0x00, - 0x3d, - 0x00, - 0x04, - 0x00, - 0xb2, - 0x00, - 0x00, - 0x00, - 0xd2, - 0x00, - 0x00, - 0x00, - 0xb4, - 0x00, - 0x00, - 0x00, - 0x3d, - 0x00, - 0x04, - 0x00, - 0x69, - 0x00, - 0x00, - 0x00, - 0xd3, - 0x00, - 0x00, - 0x00, - 0x6b, - 0x00, - 0x00, - 0x00, - 0x3d, - 0x00, - 0x04, - 0x00, - 0x06, - 0x00, - 0x00, - 0x00, - 0xd5, - 0x00, - 0x00, - 0x00, - 0xc7, - 0x00, - 0x00, - 0x00, - 0x85, - 0x00, - 0x05, - 0x00, - 0x06, - 0x00, - 0x00, - 0x00, - 0xd6, - 0x00, - 0x00, - 0x00, - 0xd4, - 0x00, - 0x00, - 0x00, - 0xd5, - 0x00, - 0x00, - 0x00, - 0x50, - 0x00, - 0x05, - 0x00, - 0x69, - 0x00, - 0x00, - 0x00, - 0xd7, - 0x00, - 0x00, - 0x00, - 0xd6, - 0x00, - 0x00, - 0x00, - 0x62, - 0x00, - 0x00, - 0x00, - 0x83, - 0x00, - 0x05, - 0x00, - 0x69, - 0x00, - 0x00, - 0x00, - 0xd8, - 0x00, - 0x00, - 0x00, - 0xd3, - 0x00, - 0x00, - 0x00, - 0xd7, - 0x00, - 0x00, - 0x00, - 0x57, - 0x00, - 0x05, - 0x00, - 0xa8, - 0x00, - 0x00, - 0x00, - 0xd9, - 0x00, - 0x00, - 0x00, - 0xd2, - 0x00, - 0x00, - 0x00, - 0xd8, - 0x00, - 0x00, - 0x00, 0x4f, 0x00, - 0x08, - 0x00, 0x07, 0x00, - 0x00, - 0x00, - 0xdb, - 0x00, - 0x00, - 0x00, - 0xd9, - 0x00, - 0x00, - 0x00, - 0xd9, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x01, - 0x00, - 0x00, - 0x00, - 0x02, - 0x00, - 0x00, - 0x00, - 0x3e, - 0x00, - 0x03, - 0x00, - 0xda, - 0x00, - 0x00, - 0x00, - 0xdb, - 0x00, - 0x00, - 0x00, - 0x39, - 0x00, - 0x05, - 0x00, - 0x07, - 0x00, - 0x00, - 0x00, - 0xdc, - 0x00, - 0x00, - 0x00, - 0x0b, - 0x00, - 0x00, - 0x00, - 0xda, - 0x00, - 0x00, - 0x00, - 0x3e, - 0x00, - 0x03, - 0x00, - 0xd1, - 0x00, - 0x00, - 0x00, - 0xdc, - 0x00, - 0x00, - 0x00, - 0x3d, - 0x00, - 0x04, - 0x00, - 0xb2, - 0x00, - 0x00, - 0x00, - 0xde, - 0x00, - 0x00, - 0x00, - 0xb4, - 0x00, - 0x00, - 0x00, - 0x3d, - 0x00, - 0x04, - 0x00, 0x69, 0x00, 0x00, 0x00, - 0xdf, - 0x00, - 0x00, - 0x00, - 0x6b, - 0x00, - 0x00, - 0x00, - 0x3d, - 0x00, - 0x04, - 0x00, - 0x06, - 0x00, - 0x00, - 0x00, - 0xe0, - 0x00, - 0x00, - 0x00, - 0xc7, - 0x00, - 0x00, - 0x00, - 0x85, - 0x00, - 0x05, - 0x00, - 0x06, - 0x00, - 0x00, - 0x00, - 0xe1, - 0x00, - 0x00, - 0x00, - 0x63, - 0x00, - 0x00, - 0x00, - 0xe0, - 0x00, - 0x00, - 0x00, - 0x50, - 0x00, - 0x05, - 0x00, - 0x69, - 0x00, - 0x00, - 0x00, - 0xe2, - 0x00, - 0x00, - 0x00, - 0xe1, - 0x00, - 0x00, - 0x00, - 0x62, - 0x00, - 0x00, - 0x00, - 0x83, - 0x00, - 0x05, - 0x00, - 0x69, - 0x00, - 0x00, - 0x00, - 0xe3, - 0x00, - 0x00, - 0x00, - 0xdf, - 0x00, - 0x00, - 0x00, - 0xe2, - 0x00, - 0x00, - 0x00, - 0x57, - 0x00, - 0x05, - 0x00, - 0xa8, - 0x00, - 0x00, - 0x00, - 0xe4, - 0x00, - 0x00, - 0x00, - 0xde, - 0x00, - 0x00, - 0x00, - 0xe3, - 0x00, - 0x00, - 0x00, - 0x4f, - 0x00, - 0x08, - 0x00, - 0x07, - 0x00, - 0x00, - 0x00, - 0xe6, - 0x00, - 0x00, - 0x00, - 0xe4, - 0x00, - 0x00, - 0x00, - 0xe4, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x01, - 0x00, - 0x00, - 0x00, - 0x02, - 0x00, - 0x00, - 0x00, - 0x3e, - 0x00, - 0x03, - 0x00, - 0xe5, - 0x00, - 0x00, - 0x00, - 0xe6, - 0x00, - 0x00, - 0x00, - 0x39, - 0x00, - 0x05, - 0x00, - 0x07, - 0x00, - 0x00, - 0x00, - 0xe7, - 0x00, - 0x00, - 0x00, - 0x0b, - 0x00, - 0x00, - 0x00, - 0xe5, - 0x00, - 0x00, - 0x00, - 0x3e, - 0x00, - 0x03, - 0x00, - 0xdd, - 0x00, - 0x00, - 0x00, - 0xe7, - 0x00, - 0x00, - 0x00, - 0x3d, - 0x00, - 0x04, - 0x00, - 0xb2, - 0x00, - 0x00, - 0x00, - 0xe9, - 0x00, - 0x00, - 0x00, - 0xb4, - 0x00, - 0x00, - 0x00, - 0x3d, - 0x00, - 0x04, - 0x00, - 0x69, - 0x00, - 0x00, - 0x00, - 0xea, - 0x00, - 0x00, - 0x00, - 0x6b, - 0x00, - 0x00, - 0x00, - 0x3d, - 0x00, - 0x04, - 0x00, - 0x06, - 0x00, - 0x00, - 0x00, - 0xeb, - 0x00, - 0x00, - 0x00, - 0xc7, - 0x00, - 0x00, - 0x00, - 0x85, - 0x00, - 0x05, - 0x00, - 0x06, - 0x00, - 0x00, - 0x00, - 0xec, - 0x00, - 0x00, - 0x00, - 0x63, - 0x00, - 0x00, - 0x00, - 0xeb, - 0x00, - 0x00, - 0x00, - 0x50, - 0x00, - 0x05, - 0x00, - 0x69, - 0x00, - 0x00, - 0x00, - 0xed, - 0x00, - 0x00, - 0x00, - 0xec, - 0x00, - 0x00, - 0x00, - 0x62, - 0x00, - 0x00, - 0x00, - 0x81, - 0x00, - 0x05, - 0x00, - 0x69, - 0x00, - 0x00, - 0x00, - 0xee, - 0x00, - 0x00, - 0x00, - 0xea, - 0x00, - 0x00, - 0x00, - 0xed, - 0x00, - 0x00, - 0x00, - 0x57, - 0x00, - 0x05, - 0x00, - 0xa8, - 0x00, - 0x00, - 0x00, - 0xef, - 0x00, - 0x00, - 0x00, - 0xe9, - 0x00, - 0x00, - 0x00, - 0xee, - 0x00, - 0x00, - 0x00, - 0x4f, - 0x00, - 0x08, - 0x00, - 0x07, - 0x00, - 0x00, - 0x00, - 0xf1, - 0x00, - 0x00, - 0x00, - 0xef, - 0x00, - 0x00, - 0x00, - 0xef, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x01, - 0x00, - 0x00, - 0x00, - 0x02, - 0x00, - 0x00, - 0x00, - 0x3e, - 0x00, - 0x03, - 0x00, - 0xf0, - 0x00, - 0x00, - 0x00, - 0xf1, - 0x00, - 0x00, - 0x00, - 0x39, - 0x00, - 0x05, - 0x00, - 0x07, - 0x00, - 0x00, - 0x00, - 0xf2, - 0x00, - 0x00, - 0x00, - 0x0b, - 0x00, - 0x00, - 0x00, - 0xf0, - 0x00, - 0x00, - 0x00, - 0x3e, - 0x00, - 0x03, - 0x00, - 0xe8, - 0x00, - 0x00, - 0x00, - 0xf2, - 0x00, - 0x00, - 0x00, - 0x3d, - 0x00, - 0x04, - 0x00, - 0xb2, - 0x00, - 0x00, - 0x00, - 0xf4, - 0x00, - 0x00, - 0x00, - 0xb4, - 0x00, - 0x00, - 0x00, - 0x3d, - 0x00, - 0x04, - 0x00, - 0x69, - 0x00, - 0x00, - 0x00, - 0xf5, - 0x00, - 0x00, - 0x00, - 0x6b, - 0x00, - 0x00, - 0x00, - 0x3d, - 0x00, - 0x04, - 0x00, - 0x06, - 0x00, - 0x00, - 0x00, - 0xf6, - 0x00, - 0x00, - 0x00, - 0xc7, - 0x00, - 0x00, - 0x00, - 0x85, - 0x00, - 0x05, - 0x00, - 0x06, - 0x00, - 0x00, - 0x00, - 0xf7, - 0x00, - 0x00, - 0x00, - 0xd4, - 0x00, - 0x00, - 0x00, - 0xf6, - 0x00, - 0x00, - 0x00, - 0x50, - 0x00, - 0x05, - 0x00, - 0x69, - 0x00, - 0x00, - 0x00, - 0xf8, - 0x00, - 0x00, - 0x00, - 0xf7, - 0x00, - 0x00, - 0x00, - 0x62, - 0x00, - 0x00, - 0x00, - 0x81, - 0x00, - 0x05, - 0x00, - 0x69, - 0x00, - 0x00, - 0x00, - 0xf9, - 0x00, - 0x00, - 0x00, - 0xf5, - 0x00, - 0x00, - 0x00, - 0xf8, - 0x00, - 0x00, - 0x00, - 0x57, - 0x00, - 0x05, - 0x00, - 0xa8, - 0x00, - 0x00, - 0x00, - 0xfa, - 0x00, - 0x00, - 0x00, - 0xf4, - 0x00, - 0x00, - 0x00, - 0xf9, - 0x00, - 0x00, - 0x00, - 0x4f, - 0x00, - 0x08, - 0x00, - 0x07, - 0x00, - 0x00, - 0x00, 0xfc, 0x00, 0x00, 0x00, - 0xfa, - 0x00, - 0x00, - 0x00, - 0xfa, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x01, - 0x00, - 0x00, - 0x00, - 0x02, - 0x00, - 0x00, - 0x00, - 0x3e, - 0x00, - 0x03, - 0x00, 0xfb, 0x00, 0x00, 0x00, - 0xfc, + 0xfb, 0x00, 0x00, 0x00, - 0x39, + 0x01, 0x00, - 0x05, + 0x00, + 0x00, + 0x02, + 0x00, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, 0x00, 0x07, 0x00, @@ -5738,45 +6102,41 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, - 0x0b, + 0xda, 0x00, 0x00, 0x00, - 0xfb, - 0x00, - 0x00, - 0x00, - 0x3e, - 0x00, - 0x03, - 0x00, - 0xf3, - 0x00, - 0x00, - 0x00, - 0xfd, - 0x00, - 0x00, - 0x00, - 0x3d, - 0x00, - 0x04, + 0x4f, 0x00, 0x07, 0x00, + 0x69, + 0x00, 0x00, 0x00, 0xfe, 0x00, 0x00, 0x00, - 0xd1, + 0xfd, 0x00, 0x00, 0x00, - 0x4f, + 0xfd, 0x00, - 0x07, + 0x00, + 0x00, + 0x01, + 0x00, + 0x00, + 0x00, + 0x02, + 0x00, + 0x00, + 0x00, + 0x8e, + 0x00, + 0x05, 0x00, 0x69, 0x00, @@ -5790,79 +6150,7 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, - 0xfe, - 0x00, - 0x00, - 0x00, - 0x01, - 0x00, - 0x00, - 0x00, - 0x02, - 0x00, - 0x00, - 0x00, - 0x3d, - 0x00, - 0x04, - 0x00, - 0x07, - 0x00, - 0x00, - 0x00, - 0x00, - 0x01, - 0x00, - 0x00, - 0xdd, - 0x00, - 0x00, - 0x00, - 0x4f, - 0x00, - 0x07, - 0x00, - 0x69, - 0x00, - 0x00, - 0x00, - 0x01, - 0x01, - 0x00, - 0x00, - 0x00, - 0x01, - 0x00, - 0x00, - 0x00, - 0x01, - 0x00, - 0x00, - 0x01, - 0x00, - 0x00, - 0x00, - 0x02, - 0x00, - 0x00, - 0x00, - 0x8e, - 0x00, - 0x05, - 0x00, - 0x69, - 0x00, - 0x00, - 0x00, - 0x02, - 0x01, - 0x00, - 0x00, - 0x01, - 0x01, - 0x00, - 0x00, - 0xd4, + 0xd1, 0x00, 0x00, 0x00, @@ -5874,18 +6162,18 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, - 0x03, + 0x00, 0x01, 0x00, 0x00, + 0xfc, + 0x00, + 0x00, + 0x00, 0xff, 0x00, 0x00, 0x00, - 0x02, - 0x01, - 0x00, - 0x00, 0x3d, 0x00, 0x04, @@ -5894,11 +6182,11 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, - 0x04, + 0x01, 0x01, 0x00, 0x00, - 0xcd, + 0xca, 0x00, 0x00, 0x00, @@ -5910,15 +6198,15 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, - 0x05, + 0x02, 0x01, 0x00, 0x00, - 0x04, + 0x01, 0x01, 0x00, 0x00, - 0x04, + 0x01, 0x01, 0x00, 0x00, @@ -5938,15 +6226,15 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, - 0x06, + 0x03, 0x01, 0x00, 0x00, - 0x05, + 0x02, 0x01, 0x00, 0x00, - 0xd4, + 0xd1, 0x00, 0x00, 0x00, @@ -5958,7 +6246,11 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, - 0x07, + 0x04, + 0x01, + 0x00, + 0x00, + 0x00, 0x01, 0x00, 0x00, @@ -5966,10 +6258,6 @@ static const uint8_t kpostfx_frag_spv[] = { 0x01, 0x00, 0x00, - 0x06, - 0x01, - 0x00, - 0x00, 0x3d, 0x00, 0x04, @@ -5978,19 +6266,87 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, + 0x05, + 0x01, + 0x00, + 0x00, + 0xe5, + 0x00, + 0x00, + 0x00, + 0x4f, + 0x00, + 0x07, + 0x00, + 0x69, + 0x00, + 0x00, + 0x00, + 0x06, + 0x01, + 0x00, + 0x00, + 0x05, + 0x01, + 0x00, + 0x00, + 0x05, + 0x01, + 0x00, + 0x00, + 0x01, + 0x00, + 0x00, + 0x00, + 0x02, + 0x00, + 0x00, + 0x00, + 0x8e, + 0x00, + 0x05, + 0x00, + 0x69, + 0x00, + 0x00, + 0x00, + 0x07, + 0x01, + 0x00, + 0x00, + 0x06, + 0x01, + 0x00, + 0x00, + 0xd1, + 0x00, + 0x00, + 0x00, + 0x81, + 0x00, + 0x05, + 0x00, + 0x69, + 0x00, + 0x00, + 0x00, 0x08, 0x01, 0x00, 0x00, - 0xe8, + 0x04, + 0x01, 0x00, 0x00, - 0x00, - 0x4f, - 0x00, 0x07, + 0x01, 0x00, - 0x69, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x07, 0x00, 0x00, 0x00, @@ -5998,25 +6354,13 @@ static const uint8_t kpostfx_frag_spv[] = { 0x01, 0x00, 0x00, - 0x08, - 0x01, - 0x00, - 0x00, - 0x08, - 0x01, - 0x00, - 0x00, - 0x01, + 0xf0, 0x00, 0x00, 0x00, - 0x02, + 0x4f, 0x00, - 0x00, - 0x00, - 0x8e, - 0x00, - 0x05, + 0x07, 0x00, 0x69, 0x00, @@ -6030,7 +6374,15 @@ static const uint8_t kpostfx_frag_spv[] = { 0x01, 0x00, 0x00, - 0xd4, + 0x09, + 0x01, + 0x00, + 0x00, + 0x01, + 0x00, + 0x00, + 0x00, + 0x02, 0x00, 0x00, 0x00, @@ -6046,7 +6398,7 @@ static const uint8_t kpostfx_frag_spv[] = { 0x01, 0x00, 0x00, - 0x07, + 0x08, 0x01, 0x00, 0x00, @@ -6054,25 +6406,9 @@ static const uint8_t kpostfx_frag_spv[] = { 0x01, 0x00, 0x00, - 0x3d, + 0x50, 0x00, - 0x04, - 0x00, - 0x07, - 0x00, - 0x00, - 0x00, - 0x0c, - 0x01, - 0x00, - 0x00, - 0xf3, - 0x00, - 0x00, - 0x00, - 0x4f, - 0x00, - 0x07, + 0x05, 0x00, 0x69, 0x00, @@ -6090,54 +6426,6 @@ static const uint8_t kpostfx_frag_spv[] = { 0x01, 0x00, 0x00, - 0x01, - 0x00, - 0x00, - 0x00, - 0x02, - 0x00, - 0x00, - 0x00, - 0x81, - 0x00, - 0x05, - 0x00, - 0x69, - 0x00, - 0x00, - 0x00, - 0x0e, - 0x01, - 0x00, - 0x00, - 0x0b, - 0x01, - 0x00, - 0x00, - 0x0d, - 0x01, - 0x00, - 0x00, - 0x50, - 0x00, - 0x05, - 0x00, - 0x69, - 0x00, - 0x00, - 0x00, - 0x10, - 0x01, - 0x00, - 0x00, - 0x0f, - 0x01, - 0x00, - 0x00, - 0x0f, - 0x01, - 0x00, - 0x00, 0x88, 0x00, 0x05, @@ -6146,15 +6434,15 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, - 0x11, - 0x01, - 0x00, - 0x00, 0x0e, 0x01, 0x00, 0x00, - 0x10, + 0x0b, + 0x01, + 0x00, + 0x00, + 0x0d, 0x01, 0x00, 0x00, @@ -6166,11 +6454,11 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, - 0x12, + 0x0f, 0x01, 0x00, 0x00, - 0xcd, + 0xca, 0x00, 0x00, 0x00, @@ -6186,11 +6474,11 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, - 0x13, + 0x10, 0x01, 0x00, 0x00, - 0x11, + 0x0e, 0x01, 0x00, 0x00, @@ -6202,11 +6490,11 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x03, 0x00, - 0x12, + 0x0f, 0x01, 0x00, 0x00, - 0x13, + 0x10, 0x01, 0x00, 0x00, @@ -6218,11 +6506,11 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, - 0x14, + 0x11, 0x01, 0x00, 0x00, - 0xcd, + 0xca, 0x00, 0x00, 0x00, @@ -6238,11 +6526,11 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, - 0x15, + 0x12, 0x01, 0x00, 0x00, - 0x11, + 0x0e, 0x01, 0x00, 0x00, @@ -6254,11 +6542,11 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x03, 0x00, - 0x14, + 0x11, 0x01, 0x00, 0x00, - 0x15, + 0x12, 0x01, 0x00, 0x00, @@ -6270,7 +6558,7 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, - 0x17, + 0x14, 0x01, 0x00, 0x00, @@ -6286,11 +6574,11 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, - 0x19, + 0x16, 0x01, 0x00, 0x00, - 0xcd, + 0xca, 0x00, 0x00, 0x00, @@ -6298,11 +6586,11 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x03, 0x00, - 0x18, + 0x15, 0x01, 0x00, 0x00, - 0x19, + 0x16, 0x01, 0x00, 0x00, @@ -6314,7 +6602,7 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, - 0x1a, + 0x17, 0x01, 0x00, 0x00, @@ -6322,7 +6610,7 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, - 0x18, + 0x15, 0x01, 0x00, 0x00, @@ -6334,7 +6622,7 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, - 0x1b, + 0x18, 0x01, 0x00, 0x00, @@ -6354,11 +6642,11 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, - 0x1c, + 0x19, 0x01, 0x00, 0x00, - 0x1b, + 0x18, 0x01, 0x00, 0x00, @@ -6370,19 +6658,19 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, - 0x1d, + 0x1a, 0x01, 0x00, 0x00, - 0x1c, + 0x19, 0x01, 0x00, 0x00, - 0x1c, + 0x19, 0x01, 0x00, 0x00, - 0x1c, + 0x19, 0x01, 0x00, 0x00, @@ -6394,7 +6682,7 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, - 0x1e, + 0x1b, 0x01, 0x00, 0x00, @@ -6406,6 +6694,10 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, + 0x14, + 0x01, + 0x00, + 0x00, 0x17, 0x01, 0x00, @@ -6414,19 +6706,15 @@ static const uint8_t kpostfx_frag_spv[] = { 0x01, 0x00, 0x00, - 0x1d, - 0x01, - 0x00, - 0x00, 0x3e, 0x00, 0x03, 0x00, - 0x16, + 0x13, 0x01, 0x00, 0x00, - 0x1e, + 0x1b, 0x01, 0x00, 0x00, @@ -6442,7 +6730,7 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x02, 0x00, - 0x1f, + 0x1c, 0x01, 0x00, 0x00, @@ -6454,7 +6742,7 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, - 0x20, + 0x1d, 0x01, 0x00, 0x00, @@ -6466,11 +6754,11 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x03, 0x00, - 0x16, + 0x13, 0x01, 0x00, 0x00, - 0x20, + 0x1d, 0x01, 0x00, 0x00, @@ -6498,7 +6786,7 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, - 0x23, + 0x20, 0x01, 0x00, 0x00, @@ -6506,7 +6794,7 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, - 0x22, + 0x1f, 0x01, 0x00, 0x00, @@ -6518,11 +6806,11 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, - 0x24, + 0x21, 0x01, 0x00, 0x00, - 0x23, + 0x20, 0x01, 0x00, 0x00, @@ -6534,15 +6822,15 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, - 0x26, + 0x23, 0x01, 0x00, 0x00, - 0x24, + 0x21, 0x01, 0x00, 0x00, - 0x25, + 0x22, 0x01, 0x00, 0x00, @@ -6554,7 +6842,7 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, - 0x29, + 0x26, 0x01, 0x00, 0x00, @@ -6562,7 +6850,7 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, - 0x28, + 0x25, 0x01, 0x00, 0x00, @@ -6574,10 +6862,54 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, + 0x27, + 0x01, + 0x00, + 0x00, + 0x26, + 0x01, + 0x00, + 0x00, + 0x85, + 0x00, + 0x05, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x29, + 0x01, + 0x00, + 0x00, + 0x27, + 0x01, + 0x00, + 0x00, + 0x28, + 0x01, + 0x00, + 0x00, + 0x0c, + 0x00, + 0x06, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, 0x2a, 0x01, 0x00, 0x00, + 0x01, + 0x00, + 0x00, + 0x00, + 0x0d, + 0x00, + 0x00, + 0x00, 0x29, 0x01, 0x00, @@ -6590,7 +6922,11 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, - 0x2c, + 0x2b, + 0x01, + 0x00, + 0x00, + 0x24, 0x01, 0x00, 0x00, @@ -6598,54 +6934,6 @@ static const uint8_t kpostfx_frag_spv[] = { 0x01, 0x00, 0x00, - 0x2b, - 0x01, - 0x00, - 0x00, - 0x0c, - 0x00, - 0x06, - 0x00, - 0x06, - 0x00, - 0x00, - 0x00, - 0x2d, - 0x01, - 0x00, - 0x00, - 0x01, - 0x00, - 0x00, - 0x00, - 0x0d, - 0x00, - 0x00, - 0x00, - 0x2c, - 0x01, - 0x00, - 0x00, - 0x85, - 0x00, - 0x05, - 0x00, - 0x06, - 0x00, - 0x00, - 0x00, - 0x2e, - 0x01, - 0x00, - 0x00, - 0x27, - 0x01, - 0x00, - 0x00, - 0x2d, - 0x01, - 0x00, - 0x00, 0x81, 0x00, 0x05, @@ -6654,7 +6942,7 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, - 0x2f, + 0x2c, 0x01, 0x00, 0x00, @@ -6662,7 +6950,7 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, - 0x2e, + 0x2b, 0x01, 0x00, 0x00, @@ -6674,15 +6962,15 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, - 0x30, + 0x2d, 0x01, 0x00, 0x00, - 0x26, + 0x23, 0x01, 0x00, 0x00, - 0x2f, + 0x2c, 0x01, 0x00, 0x00, @@ -6690,11 +6978,11 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x03, 0x00, - 0x21, + 0x1e, 0x01, 0x00, 0x00, - 0x30, + 0x2d, 0x01, 0x00, 0x00, @@ -6706,7 +6994,7 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, - 0x31, + 0x2e, 0x01, 0x00, 0x00, @@ -6722,7 +7010,7 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, - 0x32, + 0x2f, 0x01, 0x00, 0x00, @@ -6738,11 +7026,11 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, - 0x33, + 0x30, 0x01, 0x00, 0x00, - 0x21, + 0x1e, 0x01, 0x00, 0x00, @@ -6754,11 +7042,11 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, - 0x34, + 0x31, 0x01, 0x00, 0x00, - 0x33, + 0x30, 0x01, 0x00, 0x00, @@ -6774,15 +7062,15 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, - 0x35, - 0x01, - 0x00, - 0x00, 0x32, 0x01, 0x00, 0x00, - 0x34, + 0x2f, + 0x01, + 0x00, + 0x00, + 0x31, 0x01, 0x00, 0x00, @@ -6794,15 +7082,15 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, - 0x36, + 0x33, 0x01, 0x00, 0x00, - 0x31, + 0x2e, 0x01, 0x00, 0x00, - 0x35, + 0x32, 0x01, 0x00, 0x00, @@ -6814,11 +7102,11 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, - 0x37, + 0x34, 0x01, 0x00, 0x00, - 0x36, + 0x33, 0x01, 0x00, 0x00, @@ -6834,11 +7122,11 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, - 0x38, + 0x35, 0x01, 0x00, 0x00, - 0x16, + 0x13, 0x01, 0x00, 0x00, @@ -6850,11 +7138,11 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x03, 0x00, - 0x38, + 0x35, 0x01, 0x00, 0x00, - 0x37, + 0x34, 0x01, 0x00, 0x00, @@ -6866,7 +7154,7 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, - 0x39, + 0x36, 0x01, 0x00, 0x00, @@ -6882,7 +7170,7 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, - 0x3a, + 0x37, 0x01, 0x00, 0x00, @@ -6898,11 +7186,11 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, - 0x3b, + 0x38, 0x01, 0x00, 0x00, - 0x21, + 0x1e, 0x01, 0x00, 0x00, @@ -6914,11 +7202,11 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, - 0x3c, + 0x39, 0x01, 0x00, 0x00, - 0x3b, + 0x38, 0x01, 0x00, 0x00, @@ -6934,15 +7222,15 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, - 0x3d, - 0x01, - 0x00, - 0x00, 0x3a, 0x01, 0x00, 0x00, - 0x3c, + 0x37, + 0x01, + 0x00, + 0x00, + 0x39, 0x01, 0x00, 0x00, @@ -6954,15 +7242,15 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, - 0x3e, + 0x3b, 0x01, 0x00, 0x00, - 0x39, + 0x36, 0x01, 0x00, 0x00, - 0x3d, + 0x3a, 0x01, 0x00, 0x00, @@ -6974,11 +7262,11 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, - 0x3f, + 0x3c, 0x01, 0x00, 0x00, - 0x3e, + 0x3b, 0x01, 0x00, 0x00, @@ -6994,11 +7282,11 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, - 0x40, + 0x3d, 0x01, 0x00, 0x00, - 0x16, + 0x13, 0x01, 0x00, 0x00, @@ -7010,11 +7298,11 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x03, 0x00, - 0x40, + 0x3d, 0x01, 0x00, 0x00, - 0x3f, + 0x3c, 0x01, 0x00, 0x00, @@ -7026,7 +7314,7 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, - 0x42, + 0x3f, 0x01, 0x00, 0x00, @@ -7034,7 +7322,7 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, - 0x41, + 0x3e, 0x01, 0x00, 0x00, @@ -7046,11 +7334,11 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, - 0x43, + 0x40, 0x01, 0x00, 0x00, - 0x42, + 0x3f, 0x01, 0x00, 0x00, @@ -7062,11 +7350,11 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, - 0x44, + 0x41, 0x01, 0x00, 0x00, - 0x43, + 0x40, 0x01, 0x00, 0x00, @@ -7078,7 +7366,7 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x03, 0x00, - 0x46, + 0x43, 0x01, 0x00, 0x00, @@ -7090,15 +7378,15 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x04, 0x00, - 0x44, + 0x41, 0x01, 0x00, 0x00, - 0x45, + 0x42, 0x01, 0x00, 0x00, - 0x46, + 0x43, 0x01, 0x00, 0x00, @@ -7106,7 +7394,7 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x02, 0x00, - 0x45, + 0x42, 0x01, 0x00, 0x00, @@ -7118,11 +7406,11 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, - 0x48, + 0x45, 0x01, 0x00, 0x00, - 0x16, + 0x13, 0x01, 0x00, 0x00, @@ -7134,7 +7422,7 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, - 0x4b, + 0x48, 0x01, 0x00, 0x00, @@ -7146,159 +7434,159 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, + 0x45, + 0x01, + 0x00, + 0x00, + 0x47, + 0x01, + 0x00, + 0x00, + 0x3e, + 0x00, + 0x03, + 0x00, + 0x44, + 0x01, + 0x00, + 0x00, 0x48, 0x01, 0x00, 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0x49, + 0x01, + 0x00, + 0x00, + 0x13, + 0x01, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0x4a, + 0x01, + 0x00, + 0x00, + 0x44, + 0x01, + 0x00, + 0x00, + 0x41, + 0x00, + 0x05, + 0x00, + 0x74, + 0x00, + 0x00, + 0x00, + 0x4b, + 0x01, + 0x00, + 0x00, + 0x71, + 0x00, + 0x00, + 0x00, + 0x3e, + 0x01, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x4c, + 0x01, + 0x00, + 0x00, + 0x4b, + 0x01, + 0x00, + 0x00, + 0x50, + 0x00, + 0x06, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0x4d, + 0x01, + 0x00, + 0x00, + 0x4c, + 0x01, + 0x00, + 0x00, + 0x4c, + 0x01, + 0x00, + 0x00, + 0x4c, + 0x01, + 0x00, + 0x00, + 0x0c, + 0x00, + 0x08, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0x4e, + 0x01, + 0x00, + 0x00, + 0x01, + 0x00, + 0x00, + 0x00, + 0x2e, + 0x00, + 0x00, + 0x00, + 0x49, + 0x01, + 0x00, + 0x00, 0x4a, 0x01, 0x00, 0x00, - 0x3e, - 0x00, - 0x03, - 0x00, - 0x47, - 0x01, - 0x00, - 0x00, - 0x4b, - 0x01, - 0x00, - 0x00, - 0x3d, - 0x00, - 0x04, - 0x00, - 0x07, - 0x00, - 0x00, - 0x00, - 0x4c, - 0x01, - 0x00, - 0x00, - 0x16, - 0x01, - 0x00, - 0x00, - 0x3d, - 0x00, - 0x04, - 0x00, - 0x07, - 0x00, - 0x00, - 0x00, 0x4d, 0x01, 0x00, 0x00, - 0x47, - 0x01, - 0x00, - 0x00, - 0x41, - 0x00, - 0x05, - 0x00, - 0x74, - 0x00, - 0x00, - 0x00, - 0x4e, - 0x01, - 0x00, - 0x00, - 0x71, - 0x00, - 0x00, - 0x00, - 0x41, - 0x01, - 0x00, - 0x00, - 0x3d, - 0x00, - 0x04, - 0x00, - 0x06, - 0x00, - 0x00, - 0x00, - 0x4f, - 0x01, - 0x00, - 0x00, - 0x4e, - 0x01, - 0x00, - 0x00, - 0x50, - 0x00, - 0x06, - 0x00, - 0x07, - 0x00, - 0x00, - 0x00, - 0x50, - 0x01, - 0x00, - 0x00, - 0x4f, - 0x01, - 0x00, - 0x00, - 0x4f, - 0x01, - 0x00, - 0x00, - 0x4f, - 0x01, - 0x00, - 0x00, - 0x0c, - 0x00, - 0x08, - 0x00, - 0x07, - 0x00, - 0x00, - 0x00, - 0x51, - 0x01, - 0x00, - 0x00, - 0x01, - 0x00, - 0x00, - 0x00, - 0x2e, - 0x00, - 0x00, - 0x00, - 0x4c, - 0x01, - 0x00, - 0x00, - 0x4d, - 0x01, - 0x00, - 0x00, - 0x50, - 0x01, - 0x00, - 0x00, 0x3e, 0x00, 0x03, 0x00, - 0x16, + 0x13, 0x01, 0x00, 0x00, - 0x51, + 0x4e, 0x01, 0x00, 0x00, @@ -7306,7 +7594,7 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x02, 0x00, - 0x46, + 0x43, 0x01, 0x00, 0x00, @@ -7314,7 +7602,7 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x02, 0x00, - 0x46, + 0x43, 0x01, 0x00, 0x00, @@ -7326,7 +7614,7 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, - 0x53, + 0x50, 0x01, 0x00, 0x00, @@ -7334,7 +7622,7 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, - 0x52, + 0x4f, 0x01, 0x00, 0x00, @@ -7346,11 +7634,11 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, - 0x54, + 0x51, 0x01, 0x00, 0x00, - 0x53, + 0x50, 0x01, 0x00, 0x00, @@ -7362,11 +7650,11 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, - 0x55, + 0x52, 0x01, 0x00, 0x00, - 0x54, + 0x51, 0x01, 0x00, 0x00, @@ -7378,7 +7666,7 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x03, 0x00, - 0x57, + 0x54, 0x01, 0x00, 0x00, @@ -7390,15 +7678,15 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x04, 0x00, - 0x55, + 0x52, 0x01, 0x00, 0x00, - 0x56, + 0x53, 0x01, 0x00, 0x00, - 0x57, + 0x54, 0x01, 0x00, 0x00, @@ -7406,7 +7694,7 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x02, 0x00, - 0x56, + 0x53, 0x01, 0x00, 0x00, @@ -7418,7 +7706,7 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, - 0x5a, + 0x57, 0x01, 0x00, 0x00, @@ -7426,7 +7714,7 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, - 0x59, + 0x56, 0x01, 0x00, 0x00, @@ -7438,35 +7726,11 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, - 0x5b, + 0x58, 0x01, 0x00, 0x00, - 0x5a, - 0x01, - 0x00, - 0x00, - 0x0c, - 0x00, - 0x06, - 0x00, - 0x06, - 0x00, - 0x00, - 0x00, - 0x5c, - 0x01, - 0x00, - 0x00, - 0x01, - 0x00, - 0x00, - 0x00, - 0x01, - 0x00, - 0x00, - 0x00, - 0x5b, + 0x57, 0x01, 0x00, 0x00, @@ -7478,7 +7742,7 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, - 0x5d, + 0x59, 0x01, 0x00, 0x00, @@ -7490,23 +7754,23 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, + 0x58, + 0x01, + 0x00, + 0x00, 0x63, 0x00, 0x00, 0x00, - 0x5c, - 0x01, - 0x00, - 0x00, 0x3e, 0x00, 0x03, 0x00, - 0x58, + 0x55, 0x01, 0x00, 0x00, - 0x5d, + 0x59, 0x01, 0x00, 0x00, @@ -7518,7 +7782,7 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, - 0x5f, + 0x5b, 0x01, 0x00, 0x00, @@ -7538,11 +7802,11 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, - 0x60, + 0x5c, 0x01, 0x00, 0x00, - 0x5f, + 0x5b, 0x01, 0x00, 0x00, @@ -7554,7 +7818,7 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, - 0x62, + 0x5e, 0x01, 0x00, 0x00, @@ -7562,7 +7826,7 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, - 0x61, + 0x5d, 0x01, 0x00, 0x00, @@ -7574,11 +7838,11 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, - 0x63, + 0x5f, 0x01, 0x00, 0x00, - 0x62, + 0x5e, 0x01, 0x00, 0x00, @@ -7590,15 +7854,15 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, - 0x64, - 0x01, - 0x00, - 0x00, 0x60, 0x01, 0x00, 0x00, - 0x63, + 0x5c, + 0x01, + 0x00, + 0x00, + 0x5f, 0x01, 0x00, 0x00, @@ -7610,7 +7874,7 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, - 0x65, + 0x61, 0x01, 0x00, 0x00, @@ -7622,7 +7886,7 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, - 0x64, + 0x60, 0x01, 0x00, 0x00, @@ -7630,43 +7894,47 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x03, 0x00, - 0x5e, + 0x5a, 0x01, 0x00, 0x00, + 0x61, + 0x01, + 0x00, + 0x00, + 0x41, + 0x00, + 0x05, + 0x00, + 0x74, + 0x00, + 0x00, + 0x00, + 0x64, + 0x01, + 0x00, + 0x00, + 0x71, + 0x00, + 0x00, + 0x00, + 0x63, + 0x01, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, 0x65, 0x01, 0x00, 0x00, - 0x3d, - 0x00, - 0x04, - 0x00, - 0x06, - 0x00, - 0x00, - 0x00, - 0x67, - 0x01, - 0x00, - 0x00, - 0x5e, - 0x01, - 0x00, - 0x00, - 0x3d, - 0x00, - 0x04, - 0x00, - 0x06, - 0x00, - 0x00, - 0x00, - 0x68, - 0x01, - 0x00, - 0x00, - 0x58, + 0x64, 0x01, 0x00, 0x00, @@ -7678,39 +7946,35 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, - 0x69, + 0x66, 0x01, 0x00, 0x00, + 0x65, + 0x01, + 0x00, + 0x00, + 0x2c, + 0x00, + 0x00, + 0x00, + 0x83, + 0x00, + 0x05, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, 0x67, 0x01, 0x00, 0x00, - 0x68, - 0x01, - 0x00, - 0x00, - 0x0c, - 0x00, - 0x06, - 0x00, - 0x06, + 0x63, 0x00, 0x00, 0x00, - 0x6a, - 0x01, - 0x00, - 0x00, - 0x01, - 0x00, - 0x00, - 0x00, - 0x08, - 0x00, - 0x00, - 0x00, - 0x69, + 0x66, 0x01, 0x00, 0x00, @@ -7718,11 +7982,11 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x03, 0x00, - 0x66, + 0x62, 0x01, 0x00, 0x00, - 0x6a, + 0x67, 0x01, 0x00, 0x00, @@ -7734,11 +7998,27 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, - 0x6c, + 0x69, 0x01, 0x00, 0x00, - 0x58, + 0x5a, + 0x01, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x6a, + 0x01, + 0x00, + 0x00, + 0x62, 0x01, 0x00, 0x00, @@ -7750,7 +8030,47 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, - 0x6d, + 0x6b, + 0x01, + 0x00, + 0x00, + 0x69, + 0x01, + 0x00, + 0x00, + 0x6a, + 0x01, + 0x00, + 0x00, + 0x0c, + 0x00, + 0x06, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x6c, + 0x01, + 0x00, + 0x00, + 0x01, + 0x00, + 0x00, + 0x00, + 0x04, + 0x00, + 0x00, + 0x00, + 0x6b, + 0x01, + 0x00, + 0x00, + 0x3e, + 0x00, + 0x03, + 0x00, + 0x68, 0x01, 0x00, 0x00, @@ -7758,8 +8078,20 @@ static const uint8_t kpostfx_frag_spv[] = { 0x01, 0x00, 0x00, - 0x63, + 0x3d, 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x6d, + 0x01, + 0x00, + 0x00, + 0x68, + 0x01, 0x00, 0x00, 0x3d, @@ -7774,7 +8106,27 @@ static const uint8_t kpostfx_frag_spv[] = { 0x01, 0x00, 0x00, - 0x66, + 0x68, + 0x01, + 0x00, + 0x00, + 0x83, + 0x00, + 0x05, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x6f, + 0x01, + 0x00, + 0x00, + 0x63, + 0x00, + 0x00, + 0x00, + 0x6e, 0x01, 0x00, 0x00, @@ -7786,7 +8138,7 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, - 0x6f, + 0x70, 0x01, 0x00, 0x00, @@ -7794,7 +8146,7 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, - 0x30, + 0x25, 0x00, 0x00, 0x00, @@ -7802,91 +8154,15 @@ static const uint8_t kpostfx_frag_spv[] = { 0x01, 0x00, 0x00, - 0x6e, - 0x01, - 0x00, - 0x00, - 0x3e, - 0x00, - 0x03, - 0x00, - 0x6b, - 0x01, - 0x00, - 0x00, 0x6f, 0x01, 0x00, 0x00, - 0x3d, - 0x00, - 0x04, - 0x00, - 0x06, - 0x00, - 0x00, - 0x00, - 0x71, - 0x01, - 0x00, - 0x00, - 0x6b, - 0x01, - 0x00, - 0x00, - 0x0c, - 0x00, - 0x08, - 0x00, - 0x06, - 0x00, - 0x00, - 0x00, - 0x72, - 0x01, - 0x00, - 0x00, - 0x01, - 0x00, - 0x00, - 0x00, - 0x2e, - 0x00, - 0x00, - 0x00, - 0x63, - 0x00, - 0x00, - 0x00, - 0x62, - 0x00, - 0x00, - 0x00, - 0x71, - 0x01, - 0x00, - 0x00, 0x3e, 0x00, 0x03, 0x00, - 0x70, - 0x01, - 0x00, - 0x00, - 0x72, - 0x01, - 0x00, - 0x00, - 0x3d, - 0x00, - 0x04, - 0x00, - 0x06, - 0x00, - 0x00, - 0x00, - 0x73, + 0x68, 0x01, 0x00, 0x00, @@ -7902,7 +8178,7 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, - 0x74, + 0x72, 0x01, 0x00, 0x00, @@ -7910,7 +8186,7 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, - 0x52, + 0x63, 0x01, 0x00, 0x00, @@ -7922,7 +8198,39 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, - 0x75, + 0x73, + 0x01, + 0x00, + 0x00, + 0x72, + 0x01, + 0x00, + 0x00, + 0x85, + 0x00, + 0x05, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x74, + 0x01, + 0x00, + 0x00, + 0x73, + 0x01, + 0x00, + 0x00, + 0x2c, + 0x00, + 0x00, + 0x00, + 0x3e, + 0x00, + 0x03, + 0x00, + 0x71, 0x01, 0x00, 0x00, @@ -7930,6 +8238,230 @@ static const uint8_t kpostfx_frag_spv[] = { 0x01, 0x00, 0x00, + 0x41, + 0x00, + 0x05, + 0x00, + 0x74, + 0x00, + 0x00, + 0x00, + 0x77, + 0x01, + 0x00, + 0x00, + 0x71, + 0x00, + 0x00, + 0x00, + 0x76, + 0x01, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x78, + 0x01, + 0x00, + 0x00, + 0x77, + 0x01, + 0x00, + 0x00, + 0x85, + 0x00, + 0x05, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x79, + 0x01, + 0x00, + 0x00, + 0x78, + 0x01, + 0x00, + 0x00, + 0x2c, + 0x00, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x7a, + 0x01, + 0x00, + 0x00, + 0x55, + 0x01, + 0x00, + 0x00, + 0x88, + 0x00, + 0x05, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x7b, + 0x01, + 0x00, + 0x00, + 0x79, + 0x01, + 0x00, + 0x00, + 0x7a, + 0x01, + 0x00, + 0x00, + 0x3e, + 0x00, + 0x03, + 0x00, + 0x75, + 0x01, + 0x00, + 0x00, + 0x7b, + 0x01, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x7d, + 0x01, + 0x00, + 0x00, + 0x71, + 0x01, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x7e, + 0x01, + 0x00, + 0x00, + 0x75, + 0x01, + 0x00, + 0x00, + 0x83, + 0x00, + 0x05, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x7f, + 0x01, + 0x00, + 0x00, + 0x7d, + 0x01, + 0x00, + 0x00, + 0x7e, + 0x01, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x80, + 0x01, + 0x00, + 0x00, + 0x71, + 0x01, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x81, + 0x01, + 0x00, + 0x00, + 0x75, + 0x01, + 0x00, + 0x00, + 0x81, + 0x00, + 0x05, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x82, + 0x01, + 0x00, + 0x00, + 0x80, + 0x01, + 0x00, + 0x00, + 0x81, + 0x01, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x83, + 0x01, + 0x00, + 0x00, + 0x68, + 0x01, + 0x00, + 0x00, 0x0c, 0x00, 0x08, @@ -7938,7 +8470,123 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, - 0x76, + 0x84, + 0x01, + 0x00, + 0x00, + 0x01, + 0x00, + 0x00, + 0x00, + 0x31, + 0x00, + 0x00, + 0x00, + 0x7f, + 0x01, + 0x00, + 0x00, + 0x82, + 0x01, + 0x00, + 0x00, + 0x83, + 0x01, + 0x00, + 0x00, + 0x83, + 0x00, + 0x05, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x85, + 0x01, + 0x00, + 0x00, + 0x63, + 0x00, + 0x00, + 0x00, + 0x84, + 0x01, + 0x00, + 0x00, + 0x3e, + 0x00, + 0x03, + 0x00, + 0x7c, + 0x01, + 0x00, + 0x00, + 0x85, + 0x01, + 0x00, + 0x00, + 0x41, + 0x00, + 0x05, + 0x00, + 0x74, + 0x00, + 0x00, + 0x00, + 0x88, + 0x01, + 0x00, + 0x00, + 0x71, + 0x00, + 0x00, + 0x00, + 0x87, + 0x01, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x89, + 0x01, + 0x00, + 0x00, + 0x88, + 0x01, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x8a, + 0x01, + 0x00, + 0x00, + 0x7c, + 0x01, + 0x00, + 0x00, + 0x0c, + 0x00, + 0x08, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x8b, 0x01, 0x00, 0x00, @@ -7954,11 +8602,107 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, - 0x73, + 0x89, 0x01, 0x00, 0x00, - 0x75, + 0x8a, + 0x01, + 0x00, + 0x00, + 0x3e, + 0x00, + 0x03, + 0x00, + 0x86, + 0x01, + 0x00, + 0x00, + 0x8b, + 0x01, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x8c, + 0x01, + 0x00, + 0x00, + 0x86, + 0x01, + 0x00, + 0x00, + 0x41, + 0x00, + 0x05, + 0x00, + 0x74, + 0x00, + 0x00, + 0x00, + 0x8d, + 0x01, + 0x00, + 0x00, + 0x71, + 0x00, + 0x00, + 0x00, + 0x4f, + 0x01, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x8e, + 0x01, + 0x00, + 0x00, + 0x8d, + 0x01, + 0x00, + 0x00, + 0x0c, + 0x00, + 0x08, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x8f, + 0x01, + 0x00, + 0x00, + 0x01, + 0x00, + 0x00, + 0x00, + 0x2e, + 0x00, + 0x00, + 0x00, + 0x63, + 0x00, + 0x00, + 0x00, + 0x8c, + 0x01, + 0x00, + 0x00, + 0x8e, 0x01, 0x00, 0x00, @@ -7970,11 +8714,11 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, - 0x77, + 0x90, 0x01, 0x00, 0x00, - 0x16, + 0x13, 0x01, 0x00, 0x00, @@ -7986,15 +8730,15 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, - 0x78, + 0x91, 0x01, 0x00, 0x00, - 0x77, + 0x90, 0x01, 0x00, 0x00, - 0x76, + 0x8f, 0x01, 0x00, 0x00, @@ -8002,11 +8746,11 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x03, 0x00, - 0x16, + 0x13, 0x01, 0x00, 0x00, - 0x78, + 0x91, 0x01, 0x00, 0x00, @@ -8014,7 +8758,7 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x02, 0x00, - 0x57, + 0x54, 0x01, 0x00, 0x00, @@ -8022,7 +8766,7 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x02, 0x00, - 0x57, + 0x54, 0x01, 0x00, 0x00, @@ -8034,7 +8778,7 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, - 0x79, + 0x92, 0x01, 0x00, 0x00, @@ -8042,7 +8786,7 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, - 0x41, + 0x3e, 0x01, 0x00, 0x00, @@ -8054,11 +8798,11 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, - 0x7a, + 0x93, 0x01, 0x00, 0x00, - 0x79, + 0x92, 0x01, 0x00, 0x00, @@ -8070,11 +8814,11 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, - 0x7b, + 0x94, 0x01, 0x00, 0x00, - 0x7a, + 0x93, 0x01, 0x00, 0x00, @@ -8086,7 +8830,7 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x03, 0x00, - 0x7d, + 0x96, 0x01, 0x00, 0x00, @@ -8098,15 +8842,15 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x04, 0x00, - 0x7b, + 0x94, 0x01, 0x00, 0x00, - 0x7c, + 0x95, 0x01, 0x00, 0x00, - 0x7d, + 0x96, 0x01, 0x00, 0x00, @@ -8114,7 +8858,7 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x02, 0x00, - 0x7c, + 0x95, 0x01, 0x00, 0x00, @@ -8126,11 +8870,11 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, - 0x7f, + 0x98, 0x01, 0x00, 0x00, - 0x16, + 0x13, 0x01, 0x00, 0x00, @@ -8142,7 +8886,7 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, - 0x82, + 0x9b, 0x01, 0x00, 0x00, @@ -8154,11 +8898,11 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, - 0x7f, + 0x98, 0x01, 0x00, 0x00, - 0x81, + 0x9a, 0x01, 0x00, 0x00, @@ -8166,11 +8910,11 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x03, 0x00, - 0x7e, + 0x97, 0x01, 0x00, 0x00, - 0x82, + 0x9b, 0x01, 0x00, 0x00, @@ -8182,11 +8926,11 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, - 0x83, + 0x9c, 0x01, 0x00, 0x00, - 0x16, + 0x13, 0x01, 0x00, 0x00, @@ -8198,11 +8942,11 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, - 0x84, + 0x9d, 0x01, 0x00, 0x00, - 0x7e, + 0x97, 0x01, 0x00, 0x00, @@ -8214,7 +8958,7 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, - 0x85, + 0x9e, 0x01, 0x00, 0x00, @@ -8222,7 +8966,7 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, - 0x41, + 0x3e, 0x01, 0x00, 0x00, @@ -8234,11 +8978,11 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, - 0x86, + 0x9f, 0x01, 0x00, 0x00, - 0x85, + 0x9e, 0x01, 0x00, 0x00, @@ -8250,19 +8994,19 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, - 0x87, + 0xa0, 0x01, 0x00, 0x00, - 0x86, + 0x9f, 0x01, 0x00, 0x00, - 0x86, + 0x9f, 0x01, 0x00, 0x00, - 0x86, + 0x9f, 0x01, 0x00, 0x00, @@ -8274,7 +9018,7 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, - 0x88, + 0xa1, 0x01, 0x00, 0x00, @@ -8286,15 +9030,15 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, - 0x83, + 0x9c, 0x01, 0x00, 0x00, - 0x84, + 0x9d, 0x01, 0x00, 0x00, - 0x87, + 0xa0, 0x01, 0x00, 0x00, @@ -8302,11 +9046,11 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x03, 0x00, - 0x16, + 0x13, 0x01, 0x00, 0x00, - 0x88, + 0xa1, 0x01, 0x00, 0x00, @@ -8314,7 +9058,7 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x02, 0x00, - 0x7d, + 0x96, 0x01, 0x00, 0x00, @@ -8322,7 +9066,7 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x02, 0x00, - 0x7d, + 0x96, 0x01, 0x00, 0x00, @@ -8334,7 +9078,7 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, - 0x8a, + 0xa3, 0x01, 0x00, 0x00, @@ -8350,7 +9094,7 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, - 0x8b, + 0xa4, 0x01, 0x00, 0x00, @@ -8370,15 +9114,15 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, - 0x8c, + 0xa5, 0x01, 0x00, 0x00, - 0x8a, + 0xa3, 0x01, 0x00, 0x00, - 0x8b, + 0xa4, 0x01, 0x00, 0x00, @@ -8386,11 +9130,11 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x03, 0x00, - 0x89, + 0xa2, 0x01, 0x00, 0x00, - 0x8c, + 0xa5, 0x01, 0x00, 0x00, @@ -8402,11 +9146,11 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, - 0x8e, + 0xa7, 0x01, 0x00, 0x00, - 0x89, + 0xa2, 0x01, 0x00, 0x00, @@ -8418,11 +9162,11 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, - 0x8f, + 0xa8, 0x01, 0x00, 0x00, - 0x89, + 0xa2, 0x01, 0x00, 0x00, @@ -8434,15 +9178,15 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, - 0x90, + 0xa9, 0x01, 0x00, 0x00, - 0x8e, + 0xa7, 0x01, 0x00, 0x00, - 0x8f, + 0xa8, 0x01, 0x00, 0x00, @@ -8454,7 +9198,7 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, - 0x91, + 0xaa, 0x01, 0x00, 0x00, @@ -8474,11 +9218,11 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, - 0x92, + 0xab, 0x01, 0x00, 0x00, - 0x91, + 0xaa, 0x01, 0x00, 0x00, @@ -8490,15 +9234,15 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, - 0x93, + 0xac, 0x01, 0x00, 0x00, - 0x90, + 0xa9, 0x01, 0x00, 0x00, - 0x92, + 0xab, 0x01, 0x00, 0x00, @@ -8510,7 +9254,7 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, - 0x94, + 0xad, 0x01, 0x00, 0x00, @@ -8518,7 +9262,7 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, - 0x93, + 0xac, 0x01, 0x00, 0x00, @@ -8526,11 +9270,11 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x03, 0x00, - 0x8d, + 0xa6, 0x01, 0x00, 0x00, - 0x94, + 0xad, 0x01, 0x00, 0x00, @@ -8542,11 +9286,11 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, - 0x95, + 0xae, 0x01, 0x00, 0x00, - 0x8d, + 0xa6, 0x01, 0x00, 0x00, @@ -8558,7 +9302,7 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, - 0x96, + 0xaf, 0x01, 0x00, 0x00, @@ -8570,7 +9314,7 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, - 0x95, + 0xae, 0x01, 0x00, 0x00, @@ -8590,11 +9334,11 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, - 0x97, + 0xb0, 0x01, 0x00, 0x00, - 0x16, + 0x13, 0x01, 0x00, 0x00, @@ -8606,15 +9350,15 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, - 0x98, + 0xb1, 0x01, 0x00, 0x00, - 0x97, + 0xb0, 0x01, 0x00, 0x00, - 0x96, + 0xaf, 0x01, 0x00, 0x00, @@ -8622,11 +9366,11 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x03, 0x00, - 0x16, + 0x13, 0x01, 0x00, 0x00, - 0x98, + 0xb1, 0x01, 0x00, 0x00, @@ -8638,7 +9382,7 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, - 0x9a, + 0xb3, 0x01, 0x00, 0x00, @@ -8646,7 +9390,7 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, - 0x99, + 0xb2, 0x01, 0x00, 0x00, @@ -8658,11 +9402,11 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, - 0x9b, + 0xb4, 0x01, 0x00, 0x00, - 0x9a, + 0xb3, 0x01, 0x00, 0x00, @@ -8674,11 +9418,11 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, - 0x9c, + 0xb5, 0x01, 0x00, 0x00, - 0x9b, + 0xb4, 0x01, 0x00, 0x00, @@ -8690,7 +9434,7 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x03, 0x00, - 0x9e, + 0xb7, 0x01, 0x00, 0x00, @@ -8702,15 +9446,15 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x04, 0x00, - 0x9c, + 0xb5, 0x01, 0x00, 0x00, - 0x9d, + 0xb6, 0x01, 0x00, 0x00, - 0x9e, + 0xb7, 0x01, 0x00, 0x00, @@ -8718,7 +9462,7 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x02, 0x00, - 0x9d, + 0xb6, 0x01, 0x00, 0x00, @@ -8726,15 +9470,15 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x05, 0x00, - 0xa2, + 0xbb, 0x01, 0x00, 0x00, - 0xa3, + 0xbc, 0x01, 0x00, 0x00, - 0xa1, + 0xba, 0x01, 0x00, 0x00, @@ -8750,11 +9494,11 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, - 0xa4, + 0xbd, 0x01, 0x00, 0x00, - 0xa3, + 0xbc, 0x01, 0x00, 0x00, @@ -8766,15 +9510,15 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, - 0xa6, + 0xbf, 0x01, 0x00, 0x00, - 0xa4, + 0xbd, 0x01, 0x00, 0x00, - 0xa5, + 0xbe, 0x01, 0x00, 0x00, @@ -8786,7 +9530,7 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, - 0xa7, + 0xc0, 0x01, 0x00, 0x00, @@ -8798,7 +9542,7 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, - 0xa6, + 0xbf, 0x01, 0x00, 0x00, @@ -8806,11 +9550,11 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x03, 0x00, - 0x9f, + 0xb8, 0x01, 0x00, 0x00, - 0xa7, + 0xc0, 0x01, 0x00, 0x00, @@ -8818,11 +9562,11 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x03, 0x00, - 0xa8, + 0xc1, 0x01, 0x00, 0x00, - 0xaa, + 0xc3, 0x01, 0x00, 0x00, @@ -8834,11 +9578,11 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, - 0xab, + 0xc4, 0x01, 0x00, 0x00, - 0x9f, + 0xb8, 0x01, 0x00, 0x00, @@ -8850,15 +9594,15 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, - 0xac, + 0xc5, 0x01, 0x00, 0x00, - 0xab, + 0xc4, 0x01, 0x00, 0x00, - 0xa5, + 0xbe, 0x01, 0x00, 0x00, @@ -8866,7 +9610,7 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x03, 0x00, - 0xae, + 0xc7, 0x01, 0x00, 0x00, @@ -8878,15 +9622,15 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x04, 0x00, - 0xac, + 0xc5, 0x01, 0x00, 0x00, - 0xad, + 0xc6, 0x01, 0x00, 0x00, - 0xb0, + 0xc9, 0x01, 0x00, 0x00, @@ -8894,7 +9638,7 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x02, 0x00, - 0xad, + 0xc6, 0x01, 0x00, 0x00, @@ -8906,11 +9650,11 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, - 0xaf, + 0xc8, 0x01, 0x00, 0x00, - 0xa8, + 0xc1, 0x01, 0x00, 0x00, @@ -8922,7 +9666,7 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x03, 0x00, - 0xaf, + 0xc8, 0x01, 0x00, 0x00, @@ -8934,7 +9678,7 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x02, 0x00, - 0xae, + 0xc7, 0x01, 0x00, 0x00, @@ -8942,7 +9686,7 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x02, 0x00, - 0xb0, + 0xc9, 0x01, 0x00, 0x00, @@ -8954,11 +9698,11 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, - 0xb1, + 0xca, 0x01, 0x00, 0x00, - 0x9f, + 0xb8, 0x01, 0x00, 0x00, @@ -8970,15 +9714,15 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, - 0xb3, + 0xcc, 0x01, 0x00, 0x00, - 0xb1, + 0xca, 0x01, 0x00, 0x00, - 0xb2, + 0xcb, 0x01, 0x00, 0x00, @@ -8986,7 +9730,7 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x03, 0x00, - 0xb5, + 0xce, 0x01, 0x00, 0x00, @@ -8998,15 +9742,15 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x04, 0x00, - 0xb3, + 0xcc, 0x01, 0x00, 0x00, - 0xb4, + 0xcd, 0x01, 0x00, 0x00, - 0xb7, + 0xd0, 0x01, 0x00, 0x00, @@ -9014,7 +9758,7 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x02, 0x00, - 0xb4, + 0xcd, 0x01, 0x00, 0x00, @@ -9026,11 +9770,11 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, - 0xb6, + 0xcf, 0x01, 0x00, 0x00, - 0xa8, + 0xc1, 0x01, 0x00, 0x00, @@ -9042,7 +9786,7 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x03, 0x00, - 0xb6, + 0xcf, 0x01, 0x00, 0x00, @@ -9054,7 +9798,259 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x02, 0x00, - 0xb5, + 0xce, + 0x01, + 0x00, + 0x00, + 0xf8, + 0x00, + 0x02, + 0x00, + 0xd0, + 0x01, + 0x00, + 0x00, + 0x41, + 0x00, + 0x05, + 0x00, + 0x13, + 0x00, + 0x00, + 0x00, + 0xd1, + 0x01, + 0x00, + 0x00, + 0xc1, + 0x01, + 0x00, + 0x00, + 0x1e, + 0x00, + 0x00, + 0x00, + 0x3e, + 0x00, + 0x03, + 0x00, + 0xd1, + 0x01, + 0x00, + 0x00, + 0x63, + 0x00, + 0x00, + 0x00, + 0xf9, + 0x00, + 0x02, + 0x00, + 0xce, + 0x01, + 0x00, + 0x00, + 0xf8, + 0x00, + 0x02, + 0x00, + 0xce, + 0x01, + 0x00, + 0x00, + 0xf9, + 0x00, + 0x02, + 0x00, + 0xc7, + 0x01, + 0x00, + 0x00, + 0xf8, + 0x00, + 0x02, + 0x00, + 0xc7, + 0x01, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0xd2, + 0x01, + 0x00, + 0x00, + 0x13, + 0x01, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0xd3, + 0x01, + 0x00, + 0x00, + 0x13, + 0x01, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0xd4, + 0x01, + 0x00, + 0x00, + 0xc1, + 0x01, + 0x00, + 0x00, + 0x85, + 0x00, + 0x05, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0xd5, + 0x01, + 0x00, + 0x00, + 0xd3, + 0x01, + 0x00, + 0x00, + 0xd4, + 0x01, + 0x00, + 0x00, + 0x41, + 0x00, + 0x05, + 0x00, + 0x74, + 0x00, + 0x00, + 0x00, + 0xd6, + 0x01, + 0x00, + 0x00, + 0x71, + 0x00, + 0x00, + 0x00, + 0xb2, + 0x01, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0xd7, + 0x01, + 0x00, + 0x00, + 0xd6, + 0x01, + 0x00, + 0x00, + 0x50, + 0x00, + 0x06, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0xd8, + 0x01, + 0x00, + 0x00, + 0xd7, + 0x01, + 0x00, + 0x00, + 0xd7, + 0x01, + 0x00, + 0x00, + 0xd7, + 0x01, + 0x00, + 0x00, + 0x0c, + 0x00, + 0x08, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0xd9, + 0x01, + 0x00, + 0x00, + 0x01, + 0x00, + 0x00, + 0x00, + 0x2e, + 0x00, + 0x00, + 0x00, + 0xd2, + 0x01, + 0x00, + 0x00, + 0xd5, + 0x01, + 0x00, + 0x00, + 0xd8, + 0x01, + 0x00, + 0x00, + 0x3e, + 0x00, + 0x03, + 0x00, + 0x13, + 0x01, + 0x00, + 0x00, + 0xd9, + 0x01, + 0x00, + 0x00, + 0xf9, + 0x00, + 0x02, + 0x00, + 0xb7, 0x01, 0x00, 0x00, @@ -9070,143 +10066,11 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x05, 0x00, - 0x13, - 0x00, - 0x00, - 0x00, - 0xb8, - 0x01, - 0x00, - 0x00, - 0xa8, - 0x01, - 0x00, - 0x00, - 0x1e, - 0x00, - 0x00, - 0x00, - 0x3e, - 0x00, - 0x03, - 0x00, - 0xb8, - 0x01, - 0x00, - 0x00, - 0x63, - 0x00, - 0x00, - 0x00, - 0xf9, - 0x00, - 0x02, - 0x00, - 0xb5, - 0x01, - 0x00, - 0x00, - 0xf8, - 0x00, - 0x02, - 0x00, - 0xb5, - 0x01, - 0x00, - 0x00, - 0xf9, - 0x00, - 0x02, - 0x00, - 0xae, - 0x01, - 0x00, - 0x00, - 0xf8, - 0x00, - 0x02, - 0x00, - 0xae, - 0x01, - 0x00, - 0x00, - 0x3d, - 0x00, - 0x04, - 0x00, - 0x07, - 0x00, - 0x00, - 0x00, - 0xb9, - 0x01, - 0x00, - 0x00, - 0x16, - 0x01, - 0x00, - 0x00, - 0x3d, - 0x00, - 0x04, - 0x00, - 0x07, - 0x00, - 0x00, - 0x00, - 0xba, - 0x01, - 0x00, - 0x00, - 0x16, - 0x01, - 0x00, - 0x00, - 0x3d, - 0x00, - 0x04, - 0x00, - 0x07, - 0x00, - 0x00, - 0x00, - 0xbb, - 0x01, - 0x00, - 0x00, - 0xa8, - 0x01, - 0x00, - 0x00, - 0x85, - 0x00, - 0x05, - 0x00, - 0x07, - 0x00, - 0x00, - 0x00, - 0xbc, - 0x01, - 0x00, - 0x00, - 0xba, - 0x01, - 0x00, - 0x00, - 0xbb, - 0x01, - 0x00, - 0x00, - 0x41, - 0x00, - 0x05, - 0x00, 0x74, 0x00, 0x00, 0x00, - 0xbd, + 0xdb, 0x01, 0x00, 0x00, @@ -9214,7 +10078,7 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, - 0x99, + 0xda, 0x01, 0x00, 0x00, @@ -9226,131 +10090,11 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, - 0xbe, + 0xdc, 0x01, 0x00, 0x00, - 0xbd, - 0x01, - 0x00, - 0x00, - 0x50, - 0x00, - 0x06, - 0x00, - 0x07, - 0x00, - 0x00, - 0x00, - 0xbf, - 0x01, - 0x00, - 0x00, - 0xbe, - 0x01, - 0x00, - 0x00, - 0xbe, - 0x01, - 0x00, - 0x00, - 0xbe, - 0x01, - 0x00, - 0x00, - 0x0c, - 0x00, - 0x08, - 0x00, - 0x07, - 0x00, - 0x00, - 0x00, - 0xc0, - 0x01, - 0x00, - 0x00, - 0x01, - 0x00, - 0x00, - 0x00, - 0x2e, - 0x00, - 0x00, - 0x00, - 0xb9, - 0x01, - 0x00, - 0x00, - 0xbc, - 0x01, - 0x00, - 0x00, - 0xbf, - 0x01, - 0x00, - 0x00, - 0x3e, - 0x00, - 0x03, - 0x00, - 0x16, - 0x01, - 0x00, - 0x00, - 0xc0, - 0x01, - 0x00, - 0x00, - 0xf9, - 0x00, - 0x02, - 0x00, - 0x9e, - 0x01, - 0x00, - 0x00, - 0xf8, - 0x00, - 0x02, - 0x00, - 0x9e, - 0x01, - 0x00, - 0x00, - 0x41, - 0x00, - 0x05, - 0x00, - 0x74, - 0x00, - 0x00, - 0x00, - 0xc2, - 0x01, - 0x00, - 0x00, - 0x71, - 0x00, - 0x00, - 0x00, - 0xc1, - 0x01, - 0x00, - 0x00, - 0x3d, - 0x00, - 0x04, - 0x00, - 0x06, - 0x00, - 0x00, - 0x00, - 0xc3, - 0x01, - 0x00, - 0x00, - 0xc2, + 0xdb, 0x01, 0x00, 0x00, @@ -9362,11 +10106,11 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, - 0xc4, + 0xdd, 0x01, 0x00, 0x00, - 0xc3, + 0xdc, 0x01, 0x00, 0x00, @@ -9378,7 +10122,7 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x03, 0x00, - 0xc6, + 0xdf, 0x01, 0x00, 0x00, @@ -9390,15 +10134,15 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x04, 0x00, - 0xc4, + 0xdd, 0x01, 0x00, 0x00, - 0xc5, + 0xde, 0x01, 0x00, 0x00, - 0xc6, + 0xdf, 0x01, 0x00, 0x00, @@ -9406,7 +10150,7 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x02, 0x00, - 0xc5, + 0xde, 0x01, 0x00, 0x00, @@ -9418,7 +10162,7 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, - 0xc8, + 0xe1, 0x01, 0x00, 0x00, @@ -9426,7 +10170,7 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, - 0x28, + 0x25, 0x01, 0x00, 0x00, @@ -9438,11 +10182,11 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, - 0xc9, + 0xe2, 0x01, 0x00, 0x00, - 0xc8, + 0xe1, 0x01, 0x00, 0x00, @@ -9454,15 +10198,15 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, - 0xcb, + 0xe4, 0x01, 0x00, 0x00, - 0xc9, + 0xe2, 0x01, 0x00, 0x00, - 0xca, + 0xe3, 0x01, 0x00, 0x00, @@ -9474,7 +10218,7 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, - 0xcc, + 0xe5, 0x01, 0x00, 0x00, @@ -9486,7 +10230,7 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, - 0xcb, + 0xe4, 0x01, 0x00, 0x00, @@ -9498,11 +10242,11 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, - 0xcd, + 0xe6, 0x01, 0x00, 0x00, - 0xcc, + 0xe5, 0x01, 0x00, 0x00, @@ -9518,11 +10262,11 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, - 0xce, + 0xe7, 0x01, 0x00, 0x00, - 0xcd, + 0xe6, 0x01, 0x00, 0x00, @@ -9534,11 +10278,11 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x03, 0x00, - 0xc7, + 0xe0, 0x01, 0x00, 0x00, - 0xce, + 0xe7, 0x01, 0x00, 0x00, @@ -9550,7 +10294,7 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, - 0xcf, + 0xe8, 0x01, 0x00, 0x00, @@ -9558,7 +10302,7 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, - 0xc1, + 0xda, 0x01, 0x00, 0x00, @@ -9570,11 +10314,11 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, - 0xd0, + 0xe9, 0x01, 0x00, 0x00, - 0xcf, + 0xe8, 0x01, 0x00, 0x00, @@ -9586,15 +10330,15 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, - 0xd2, + 0xeb, 0x01, 0x00, 0x00, - 0xd0, + 0xe9, 0x01, 0x00, 0x00, - 0xd1, + 0xea, 0x01, 0x00, 0x00, @@ -9606,11 +10350,11 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, - 0xd3, + 0xec, 0x01, 0x00, 0x00, - 0xc7, + 0xe0, 0x01, 0x00, 0x00, @@ -9622,15 +10366,15 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, - 0xd4, + 0xed, 0x01, 0x00, 0x00, - 0xd2, + 0xeb, 0x01, 0x00, 0x00, - 0xd3, + 0xec, 0x01, 0x00, 0x00, @@ -9642,7 +10386,7 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, - 0xd5, + 0xee, 0x01, 0x00, 0x00, @@ -9650,7 +10394,7 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, - 0xd4, + 0xed, 0x01, 0x00, 0x00, @@ -9662,11 +10406,11 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, - 0xd6, + 0xef, 0x01, 0x00, 0x00, - 0x16, + 0x13, 0x01, 0x00, 0x00, @@ -9678,15 +10422,15 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, - 0xd7, + 0xf0, 0x01, 0x00, 0x00, - 0xd6, + 0xef, 0x01, 0x00, 0x00, - 0xd5, + 0xee, 0x01, 0x00, 0x00, @@ -9694,11 +10438,11 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x03, 0x00, - 0x16, + 0x13, 0x01, 0x00, 0x00, - 0xd7, + 0xf0, 0x01, 0x00, 0x00, @@ -9706,7 +10450,7 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x02, 0x00, - 0xc6, + 0xdf, 0x01, 0x00, 0x00, @@ -9714,7 +10458,7 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x02, 0x00, - 0xc6, + 0xdf, 0x01, 0x00, 0x00, @@ -9726,11 +10470,11 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, - 0xd8, + 0xf1, 0x01, 0x00, 0x00, - 0x16, + 0x13, 0x01, 0x00, 0x00, @@ -9742,11 +10486,11 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, - 0xd9, + 0xf2, 0x01, 0x00, 0x00, - 0xd8, + 0xf1, 0x01, 0x00, 0x00, @@ -9762,11 +10506,11 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, - 0xda, + 0xf3, 0x01, 0x00, 0x00, - 0xd8, + 0xf1, 0x01, 0x00, 0x00, @@ -9782,11 +10526,11 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, - 0xdb, + 0xf4, 0x01, 0x00, 0x00, - 0xd8, + 0xf1, 0x01, 0x00, 0x00, @@ -9802,19 +10546,19 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, - 0xdc, + 0xf5, 0x01, 0x00, 0x00, - 0xd9, + 0xf2, 0x01, 0x00, 0x00, - 0xda, + 0xf3, 0x01, 0x00, 0x00, - 0xdb, + 0xf4, 0x01, 0x00, 0x00, @@ -9830,7 +10574,7 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, - 0xdc, + 0xf5, 0x01, 0x00, 0x00, @@ -11243,4 +11987,4 @@ static const uint8_t kpostfx_frag_spv[] = { 0x01, 0x00, }; -static const size_t kpostfx_frag_spv_size = 11240; +static const size_t kpostfx_frag_spv_size = 11984; diff --git a/source/core/rendering/sdl3gpu/spv/upscale_frag_spv.h b/source/core/rendering/sdl3gpu/spv/upscale_frag_spv.h deleted file mode 100644 index 46e7c30..0000000 --- a/source/core/rendering/sdl3gpu/spv/upscale_frag_spv.h +++ /dev/null @@ -1,634 +0,0 @@ -#pragma once -#include -#include -static const uint8_t kupscale_frag_spv[] = { - 0x03, - 0x02, - 0x23, - 0x07, - 0x00, - 0x00, - 0x01, - 0x00, - 0x0b, - 0x00, - 0x0d, - 0x00, - 0x14, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x11, - 0x00, - 0x02, - 0x00, - 0x01, - 0x00, - 0x00, - 0x00, - 0x0b, - 0x00, - 0x06, - 0x00, - 0x01, - 0x00, - 0x00, - 0x00, - 0x47, - 0x4c, - 0x53, - 0x4c, - 0x2e, - 0x73, - 0x74, - 0x64, - 0x2e, - 0x34, - 0x35, - 0x30, - 0x00, - 0x00, - 0x00, - 0x00, - 0x0e, - 0x00, - 0x03, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x01, - 0x00, - 0x00, - 0x00, - 0x0f, - 0x00, - 0x07, - 0x00, - 0x04, - 0x00, - 0x00, - 0x00, - 0x04, - 0x00, - 0x00, - 0x00, - 0x6d, - 0x61, - 0x69, - 0x6e, - 0x00, - 0x00, - 0x00, - 0x00, - 0x09, - 0x00, - 0x00, - 0x00, - 0x11, - 0x00, - 0x00, - 0x00, - 0x10, - 0x00, - 0x03, - 0x00, - 0x04, - 0x00, - 0x00, - 0x00, - 0x07, - 0x00, - 0x00, - 0x00, - 0x03, - 0x00, - 0x03, - 0x00, - 0x02, - 0x00, - 0x00, - 0x00, - 0xc2, - 0x01, - 0x00, - 0x00, - 0x04, - 0x00, - 0x0a, - 0x00, - 0x47, - 0x4c, - 0x5f, - 0x47, - 0x4f, - 0x4f, - 0x47, - 0x4c, - 0x45, - 0x5f, - 0x63, - 0x70, - 0x70, - 0x5f, - 0x73, - 0x74, - 0x79, - 0x6c, - 0x65, - 0x5f, - 0x6c, - 0x69, - 0x6e, - 0x65, - 0x5f, - 0x64, - 0x69, - 0x72, - 0x65, - 0x63, - 0x74, - 0x69, - 0x76, - 0x65, - 0x00, - 0x00, - 0x04, - 0x00, - 0x08, - 0x00, - 0x47, - 0x4c, - 0x5f, - 0x47, - 0x4f, - 0x4f, - 0x47, - 0x4c, - 0x45, - 0x5f, - 0x69, - 0x6e, - 0x63, - 0x6c, - 0x75, - 0x64, - 0x65, - 0x5f, - 0x64, - 0x69, - 0x72, - 0x65, - 0x63, - 0x74, - 0x69, - 0x76, - 0x65, - 0x00, - 0x05, - 0x00, - 0x04, - 0x00, - 0x04, - 0x00, - 0x00, - 0x00, - 0x6d, - 0x61, - 0x69, - 0x6e, - 0x00, - 0x00, - 0x00, - 0x00, - 0x05, - 0x00, - 0x05, - 0x00, - 0x09, - 0x00, - 0x00, - 0x00, - 0x6f, - 0x75, - 0x74, - 0x5f, - 0x63, - 0x6f, - 0x6c, - 0x6f, - 0x72, - 0x00, - 0x00, - 0x00, - 0x05, - 0x00, - 0x04, - 0x00, - 0x0d, - 0x00, - 0x00, - 0x00, - 0x73, - 0x63, - 0x65, - 0x6e, - 0x65, - 0x00, - 0x00, - 0x00, - 0x05, - 0x00, - 0x04, - 0x00, - 0x11, - 0x00, - 0x00, - 0x00, - 0x76, - 0x5f, - 0x75, - 0x76, - 0x00, - 0x00, - 0x00, - 0x00, - 0x47, - 0x00, - 0x04, - 0x00, - 0x09, - 0x00, - 0x00, - 0x00, - 0x1e, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x47, - 0x00, - 0x04, - 0x00, - 0x0d, - 0x00, - 0x00, - 0x00, - 0x21, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x47, - 0x00, - 0x04, - 0x00, - 0x0d, - 0x00, - 0x00, - 0x00, - 0x22, - 0x00, - 0x00, - 0x00, - 0x02, - 0x00, - 0x00, - 0x00, - 0x47, - 0x00, - 0x04, - 0x00, - 0x11, - 0x00, - 0x00, - 0x00, - 0x1e, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x13, - 0x00, - 0x02, - 0x00, - 0x02, - 0x00, - 0x00, - 0x00, - 0x21, - 0x00, - 0x03, - 0x00, - 0x03, - 0x00, - 0x00, - 0x00, - 0x02, - 0x00, - 0x00, - 0x00, - 0x16, - 0x00, - 0x03, - 0x00, - 0x06, - 0x00, - 0x00, - 0x00, - 0x20, - 0x00, - 0x00, - 0x00, - 0x17, - 0x00, - 0x04, - 0x00, - 0x07, - 0x00, - 0x00, - 0x00, - 0x06, - 0x00, - 0x00, - 0x00, - 0x04, - 0x00, - 0x00, - 0x00, - 0x20, - 0x00, - 0x04, - 0x00, - 0x08, - 0x00, - 0x00, - 0x00, - 0x03, - 0x00, - 0x00, - 0x00, - 0x07, - 0x00, - 0x00, - 0x00, - 0x3b, - 0x00, - 0x04, - 0x00, - 0x08, - 0x00, - 0x00, - 0x00, - 0x09, - 0x00, - 0x00, - 0x00, - 0x03, - 0x00, - 0x00, - 0x00, - 0x19, - 0x00, - 0x09, - 0x00, - 0x0a, - 0x00, - 0x00, - 0x00, - 0x06, - 0x00, - 0x00, - 0x00, - 0x01, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x01, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x1b, - 0x00, - 0x03, - 0x00, - 0x0b, - 0x00, - 0x00, - 0x00, - 0x0a, - 0x00, - 0x00, - 0x00, - 0x20, - 0x00, - 0x04, - 0x00, - 0x0c, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x0b, - 0x00, - 0x00, - 0x00, - 0x3b, - 0x00, - 0x04, - 0x00, - 0x0c, - 0x00, - 0x00, - 0x00, - 0x0d, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x17, - 0x00, - 0x04, - 0x00, - 0x0f, - 0x00, - 0x00, - 0x00, - 0x06, - 0x00, - 0x00, - 0x00, - 0x02, - 0x00, - 0x00, - 0x00, - 0x20, - 0x00, - 0x04, - 0x00, - 0x10, - 0x00, - 0x00, - 0x00, - 0x01, - 0x00, - 0x00, - 0x00, - 0x0f, - 0x00, - 0x00, - 0x00, - 0x3b, - 0x00, - 0x04, - 0x00, - 0x10, - 0x00, - 0x00, - 0x00, - 0x11, - 0x00, - 0x00, - 0x00, - 0x01, - 0x00, - 0x00, - 0x00, - 0x36, - 0x00, - 0x05, - 0x00, - 0x02, - 0x00, - 0x00, - 0x00, - 0x04, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x03, - 0x00, - 0x00, - 0x00, - 0xf8, - 0x00, - 0x02, - 0x00, - 0x05, - 0x00, - 0x00, - 0x00, - 0x3d, - 0x00, - 0x04, - 0x00, - 0x0b, - 0x00, - 0x00, - 0x00, - 0x0e, - 0x00, - 0x00, - 0x00, - 0x0d, - 0x00, - 0x00, - 0x00, - 0x3d, - 0x00, - 0x04, - 0x00, - 0x0f, - 0x00, - 0x00, - 0x00, - 0x12, - 0x00, - 0x00, - 0x00, - 0x11, - 0x00, - 0x00, - 0x00, - 0x57, - 0x00, - 0x05, - 0x00, - 0x07, - 0x00, - 0x00, - 0x00, - 0x13, - 0x00, - 0x00, - 0x00, - 0x0e, - 0x00, - 0x00, - 0x00, - 0x12, - 0x00, - 0x00, - 0x00, - 0x3e, - 0x00, - 0x03, - 0x00, - 0x09, - 0x00, - 0x00, - 0x00, - 0x13, - 0x00, - 0x00, - 0x00, - 0xfd, - 0x00, - 0x01, - 0x00, - 0x38, - 0x00, - 0x01, - 0x00, -}; -static const size_t kupscale_frag_spv_size = 628; diff --git a/source/core/rendering/shader_backend.hpp b/source/core/rendering/shader_backend.hpp index ed44de8..f1395c3 100644 --- a/source/core/rendering/shader_backend.hpp +++ b/source/core/rendering/shader_backend.hpp @@ -4,7 +4,6 @@ #include #include -#include namespace Rendering { @@ -24,6 +23,10 @@ namespace Rendering { float curvature = 0.0F; float bleeding = 0.0F; float flicker = 0.0F; + // Forma de les scanlines — 3 subpíxels per fila lògica per defecte. + float scan_dark_ratio{0.333F}; + float scan_dark_floor{0.42F}; + float scan_edge_soft{1.0F}; }; /** @@ -66,15 +69,6 @@ namespace Rendering { virtual void setPostFXParams(const PostFXParams& /*p*/) {} virtual void setVSync(bool /*vsync*/) {} virtual void setScaleMode(bool /*integer_scale*/) {} - virtual void setOversample(int /*factor*/) {} - - virtual void setLinearUpscale(bool /*linear*/) {} - [[nodiscard]] virtual auto isLinearUpscale() const -> bool { return false; } - - virtual void setDownscaleAlgo(int /*algo*/) {} - [[nodiscard]] virtual auto getDownscaleAlgo() const -> int { return 0; } - - [[nodiscard]] virtual auto getSsTextureSize() const -> std::pair { return {0, 0}; } [[nodiscard]] virtual auto isHardwareAccelerated() const -> bool = 0; diff --git a/source/core/system/defaults.hpp b/source/core/system/defaults.hpp index b679c23..d2da590 100644 --- a/source/core/system/defaults.hpp +++ b/source/core/system/defaults.hpp @@ -188,9 +188,6 @@ namespace Defaults::Video { constexpr bool INTEGER_SCALE = true; constexpr bool GPU_ACCELERATION = true; constexpr bool SHADER_ENABLED = false; - constexpr bool SUPERSAMPLING = false; - constexpr bool LINEAR_UPSCALE = false; - constexpr int DOWNSCALE_ALGO = 1; } // namespace Defaults::Video namespace Defaults::Music { diff --git a/source/game/options.cpp b/source/game/options.cpp index c607698..f58a500 100644 --- a/source/game/options.cpp +++ b/source/game/options.cpp @@ -25,14 +25,20 @@ namespace Options { GamepadManager gamepad_manager; // Opciones de mando para cada jugador Keyboard keyboard; // Opciones para el teclado PendingChanges pending_changes; // Opciones que se aplican al cerrar - std::vector postfx_presets = { - {.name = "CRT", .vignette = 0.15F, .scanlines = 0.7F, .chroma = 0.2F, .mask = 0.5F, .gamma = 0.1F, .curvature = 0.0F, .bleeding = 0.0F, .flicker = 0.0F}, - {.name = "NTSC", .vignette = 0.4F, .scanlines = 0.5F, .chroma = 0.2F, .mask = 0.3F, .gamma = 0.3F, .curvature = 0.0F, .bleeding = 0.6F, .flicker = 0.0F}, - {.name = "Curved", .vignette = 0.5F, .scanlines = 0.6F, .chroma = 0.1F, .mask = 0.4F, .gamma = 0.4F, .curvature = 0.8F, .bleeding = 0.0F, .flicker = 0.0F}, - {.name = "Scanlines", .vignette = 0.0F, .scanlines = 0.8F, .chroma = 0.0F, .mask = 0.0F, .gamma = 0.0F, .curvature = 0.0F, .bleeding = 0.0F, .flicker = 0.0F}, - {.name = "Subtle", .vignette = 0.3F, .scanlines = 0.4F, .chroma = 0.05F, .mask = 0.0F, .gamma = 0.2F, .curvature = 0.0F, .bleeding = 0.0F, .flicker = 0.0F}, - {.name = "CRT Live", .vignette = 0.15F, .scanlines = 0.6F, .chroma = 0.3F, .mask = 0.3F, .gamma = 0.1F, .curvature = 0.0F, .bleeding = 0.4F, .flicker = 0.8F}, - }; + namespace { + auto defaultPostFXPresets() -> std::vector { + return { + {.name = "CRT", .vignette = 0.6F, .scanlines = 0.7F, .chroma = 0.15F, .mask = 0.6F, .gamma = 0.8F, .curvature = 0.0F, .bleeding = 0.0F, .flicker = 0.0F}, + {.name = "NTSC", .vignette = 0.4F, .scanlines = 0.5F, .chroma = 0.2F, .mask = 0.4F, .gamma = 0.5F, .curvature = 0.0F, .bleeding = 0.6F, .flicker = 0.0F}, + {.name = "Curved", .vignette = 0.5F, .scanlines = 0.6F, .chroma = 0.1F, .mask = 0.5F, .gamma = 0.7F, .curvature = 0.8F, .bleeding = 0.0F, .flicker = 0.0F}, + {.name = "Scanlines", .vignette = 0.0F, .scanlines = 0.8F, .chroma = 0.0F, .mask = 0.0F, .gamma = 0.0F, .curvature = 0.0F, .bleeding = 0.0F, .flicker = 0.0F}, + {.name = "Subtle", .vignette = 0.3F, .scanlines = 0.4F, .chroma = 0.05F, .mask = 0.0F, .gamma = 0.3F, .curvature = 0.0F, .bleeding = 0.0F, .flicker = 0.0F}, + {.name = "CRT Live", .vignette = 0.5F, .scanlines = 0.6F, .chroma = 0.3F, .mask = 0.3F, .gamma = 0.4F, .curvature = 0.0F, .bleeding = 0.4F, .flicker = 0.8F}, + }; + } + } // namespace + + std::vector postfx_presets = defaultPostFXPresets(); std::string postfx_file_path; std::vector crtpi_presets; std::string crtpi_file_path; @@ -94,6 +100,9 @@ namespace Options { parseField(p, "curvature", preset.curvature); parseField(p, "bleeding", preset.bleeding); parseField(p, "flicker", preset.flicker); + parseField(p, "scan_dark_ratio", preset.scan_dark_ratio); + parseField(p, "scan_dark_floor", preset.scan_dark_floor); + parseField(p, "scan_edge_soft", preset.scan_edge_soft); postfx_presets.push_back(preset); } } @@ -130,6 +139,10 @@ namespace Options { return false; } + if (postfx_presets.empty()) { + postfx_presets = defaultPostFXPresets(); + } + std::ofstream file(postfx_file_path); if (!file.is_open()) { std::cout << "Error: " << postfx_file_path << " can't be opened for writing" << '\n'; @@ -146,73 +159,27 @@ namespace Options { file << "# curvature: CRT barrel distortion\n"; file << "# bleeding: NTSC horizontal colour bleeding\n"; file << "# flicker: phosphor CRT flicker ~50 Hz (0.0 = off, 1.0 = max)\n"; + file << "# scan_dark_ratio: fracció obscura dins de cada fila lògica (1/3 ≈ 0.333)\n"; + file << "# scan_dark_floor: brillantor mínima de la subfila fosca\n"; + file << "# scan_edge_soft: 0 = step dur, 1 = transició d'1 píxel físic (estil crtpi)\n"; file << "\n"; file << "presets:\n"; - file << " - name: \"CRT\"\n"; - file << " vignette: 0.15\n"; - file << " scanlines: 0.7\n"; - file << " chroma: 0.2\n"; - file << " mask: 0.5\n"; - file << " gamma: 0.1\n"; - file << " curvature: 0.0\n"; - file << " bleeding: 0.0\n"; - file << " flicker: 0.0\n"; - file << " - name: \"NTSC\"\n"; - file << " vignette: 0.4\n"; - file << " scanlines: 0.5\n"; - file << " chroma: 0.2\n"; - file << " mask: 0.3\n"; - file << " gamma: 0.3\n"; - file << " curvature: 0.0\n"; - file << " bleeding: 0.6\n"; - file << " flicker: 0.0\n"; - file << " - name: \"Curved\"\n"; - file << " vignette: 0.5\n"; - file << " scanlines: 0.6\n"; - file << " chroma: 0.1\n"; - file << " mask: 0.4\n"; - file << " gamma: 0.4\n"; - file << " curvature: 0.8\n"; - file << " bleeding: 0.0\n"; - file << " flicker: 0.0\n"; - file << " - name: \"Scanlines\"\n"; - file << " vignette: 0.0\n"; - file << " scanlines: 0.8\n"; - file << " chroma: 0.0\n"; - file << " mask: 0.0\n"; - file << " gamma: 0.0\n"; - file << " curvature: 0.0\n"; - file << " bleeding: 0.0\n"; - file << " flicker: 0.0\n"; - file << " - name: \"Subtle\"\n"; - file << " vignette: 0.3\n"; - file << " scanlines: 0.4\n"; - file << " chroma: 0.05\n"; - file << " mask: 0.0\n"; - file << " gamma: 0.2\n"; - file << " curvature: 0.0\n"; - file << " bleeding: 0.0\n"; - file << " flicker: 0.0\n"; - file << " - name: \"CRT Live\"\n"; - file << " vignette: 0.15\n"; - file << " scanlines: 0.6\n"; - file << " chroma: 0.3\n"; - file << " mask: 0.3\n"; - file << " gamma: 0.1\n"; - file << " curvature: 0.0\n"; - file << " bleeding: 0.4\n"; - file << " flicker: 0.8\n"; + for (const auto& preset : postfx_presets) { + file << " - name: \"" << preset.name << "\"\n"; + file << " vignette: " << preset.vignette << "\n"; + file << " scanlines: " << preset.scanlines << "\n"; + file << " chroma: " << preset.chroma << "\n"; + file << " mask: " << preset.mask << "\n"; + file << " gamma: " << preset.gamma << "\n"; + file << " curvature: " << preset.curvature << "\n"; + file << " bleeding: " << preset.bleeding << "\n"; + file << " flicker: " << preset.flicker << "\n"; + file << " scan_dark_ratio: " << preset.scan_dark_ratio << "\n"; + file << " scan_dark_floor: " << preset.scan_dark_floor << "\n"; + file << " scan_edge_soft: " << preset.scan_edge_soft << "\n"; + } file.close(); - - // Cargar los presets recién escritos - postfx_presets.clear(); - postfx_presets.push_back({"CRT", 0.15F, 0.7F, 0.2F, 0.5F, 0.1F, 0.0F, 0.0F, 0.0F}); - postfx_presets.push_back({"NTSC", 0.4F, 0.5F, 0.2F, 0.3F, 0.3F, 0.0F, 0.6F, 0.0F}); - postfx_presets.push_back({"Curved", 0.5F, 0.6F, 0.1F, 0.4F, 0.4F, 0.8F, 0.0F, 0.0F}); - postfx_presets.push_back({"Scanlines", 0.0F, 0.8F, 0.0F, 0.0F, 0.0F, 0.0F, 0.0F, 0.0F}); - postfx_presets.push_back({"Subtle", 0.3F, 0.4F, 0.05F, 0.0F, 0.2F, 0.0F, 0.0F, 0.0F}); - postfx_presets.push_back({"CRT Live", 0.15F, 0.6F, 0.3F, 0.3F, 0.1F, 0.0F, 0.4F, 0.8F}); video.shader.current_postfx_preset = 0; return true; @@ -376,13 +343,6 @@ namespace Options { video.shader.current_shader = (shader_name == "crtpi") ? Rendering::ShaderType::CRTPI : Rendering::ShaderType::POSTFX; } } - - if (vid.contains("supersampling")) { - const auto& ss_node = vid["supersampling"]; - parseField(ss_node, "enabled", video.supersampling.enabled); - parseField(ss_node, "linear_upscale", video.supersampling.linear_upscale); - parseField(ss_node, "downscale_algo", video.supersampling.downscale_algo); - } } void loadAudioFromYaml(const fkyaml::node& yaml) { @@ -564,10 +524,6 @@ namespace Options { file << " postfx_preset: \"" << postfx_name << "\"\n"; file << " crtpi_preset: \"" << crtpi_name << "\"\n"; } - file << " supersampling:\n"; - file << " enabled: " << boolToString(video.supersampling.enabled) << "\n"; - file << " linear_upscale: " << boolToString(video.supersampling.linear_upscale) << "\n"; - file << " downscale_algo: " << video.supersampling.downscale_algo << "\n"; file << "\n"; // AUDIO diff --git a/source/game/options.hpp b/source/game/options.hpp index a0cf525..2dafcd6 100644 --- a/source/game/options.hpp +++ b/source/game/options.hpp @@ -30,11 +30,15 @@ namespace Options { float vignette{0.6F}; float scanlines{0.7F}; float chroma{0.15F}; - float mask{0.0F}; - float gamma{0.0F}; + float mask{0.6F}; + float gamma{0.8F}; float curvature{0.0F}; float bleeding{0.0F}; float flicker{0.0F}; + // Forma de les scanlines (3 subpíxels per fila lògica per defecte). + float scan_dark_ratio{0.333F}; + float scan_dark_floor{0.42F}; + float scan_edge_soft{1.0F}; }; struct CrtPiPreset { @@ -66,12 +70,6 @@ namespace Options { std::string preferred_driver; }; - struct Supersampling { - bool enabled{Defaults::Video::SUPERSAMPLING}; - bool linear_upscale{Defaults::Video::LINEAR_UPSCALE}; - int downscale_algo{Defaults::Video::DOWNSCALE_ALGO}; - }; - struct ShaderConfig { bool enabled{Defaults::Video::SHADER_ENABLED}; Rendering::ShaderType current_shader{Rendering::ShaderType::POSTFX}; @@ -88,7 +86,6 @@ namespace Options { bool integer_scale = Defaults::Video::INTEGER_SCALE; std::string info; GPU gpu{}; - Supersampling supersampling{}; ShaderConfig shader{}; }; diff --git a/source/game/ui/service_menu.cpp b/source/game/ui/service_menu.cpp index 06d2520..d2b01f2 100644 --- a/source/game/ui/service_menu.cpp +++ b/source/game/ui/service_menu.cpp @@ -375,11 +375,6 @@ void ServiceMenu::addVideoOptions() { addVideoShaderOption(); addVideoPresetOption(); - options_.push_back(std::make_unique( - Lang::getText("[SERVICE_MENU] SUPERSAMPLING"), - SettingsGroup::VIDEO, - &Options::video.supersampling.enabled)); - options_.push_back(std::make_unique( Lang::getText("[SERVICE_MENU] VSYNC"), SettingsGroup::VIDEO, @@ -702,13 +697,6 @@ void ServiceMenu::setHiddenOptions() { } } - { - auto* option = getOptionByCaption(Lang::getText("[SERVICE_MENU] SUPERSAMPLING")); - if (option != nullptr) { - option->setHidden(!HW_ACCEL || !Options::video.shader.enabled || Options::video.shader.current_shader != Rendering::ShaderType::POSTFX); - } - } - #ifdef __EMSCRIPTEN__ // En la versión web no tiene sentido exponer: permitir apagar el sistema // (no aplica al navegador) ni salir del juego (lo gestiona el navegador). diff --git a/tools/shaders/compile_spirv.cmake b/tools/shaders/compile_spirv.cmake index e41ad2f..07a8e17 100644 --- a/tools/shaders/compile_spirv.cmake +++ b/tools/shaders/compile_spirv.cmake @@ -15,8 +15,6 @@ cmake_policy(SET CMP0007 NEW) set(SHADER_SOURCES "postfx.vert" "postfx.frag" - "upscale.frag" - "downscale.frag" "crtpi_frag.glsl" ) @@ -24,15 +22,11 @@ set(SHADER_SOURCES set(SHADER_VARS "kpostfx_vert_spv" "kpostfx_frag_spv" - "kupscale_frag_spv" - "kdownscale_frag_spv" "kcrtpi_frag_spv" ) # Flags extra de glslc para cada shader (vacío si no hay) set(SHADER_FLAGS - "" - "" "" "" "-fshader-stage=frag"