From 2350f4060f5a27ab0b9f34d15b81b5465b9810b6 Mon Sep 17 00:00:00 2001 From: Sergio Valor Date: Mon, 20 Apr 2026 09:58:14 +0200 Subject: [PATCH] refactor(core/rendering): nomenar magic numbers al shader CRT-Pi (HC-08) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit crtpi_frag.msl tenia la línia float filter_width = (768.0f / u.texture_height) / 3.0f; amb dues constants soltes (768 i 3) sense explicar. Ara es declaren al mateix shader com CRT_REFERENCE_HEIGHT i SUBPIXEL_DIV amb un comentari explicant que 768 és l'alçada CRT de referència on es va tarar el filtre i 3 el nombre de subpíxels (R/G/B) del multisample. Build + smoke 5s xvfb OK (exit 124). Co-Authored-By: Claude Opus 4.7 (1M context) --- docs/audit-core-rendering.md | 5 +++-- source/core/rendering/sdl3gpu/msl/crtpi_frag.msl.h | 8 +++++++- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/docs/audit-core-rendering.md b/docs/audit-core-rendering.md index e0fc9d1..de9f210 100644 --- a/docs/audit-core-rendering.md +++ b/docs/audit-core-rendering.md @@ -49,7 +49,7 @@ Los IDs se mantienen estables una vez asignados. Cada entrada apunta al(los) fic | HC-05 | `render_info.cpp:19` + `notifier.hpp:43` | `TEXT_SIZE=8` duplicado | Menor | PENDING | constante global font | | HC-06 | `render_info.cpp:64,138-139,193-195` | `segments_[3]` hardcode del segmento tiempo | Importante | DONE | constants `FPS/DRIVER/SHADER/TIME_SEGMENT` | | HC-07 | `render_info.cpp:207` | `% 3` hardcode nº de entradas enum | Menor | DONE | `Defaults::RENDER_INFO_POSITION_COUNT` | -| HC-08 | `crtpi_pipeline.cpp:97` | `768.0f / h / 3.0f` magic en shader | Menor | PENDING | uniforme o comentario | +| HC-08 | `crtpi_pipeline.cpp:97` | `768.0f / h / 3.0f` magic en shader | Menor | DONE | `CRT_REFERENCE_HEIGHT` / `SUBPIXEL_DIV` a l'MSL amb explicació | | HC-09 | `render_info.cpp:179-183,194-195` | shadow offset +1,+1 magic | Menor | DONE | `SHADOW_OFFSET_PX` | | HC-10 | `gif.cpp:162` | `processImageDescriptor` params `[[maybe_unused]]` vestigiales | Menor | DONE | signatura sense `gct` ni `resolution_bits`; `RGB` també esborrat | @@ -133,4 +133,5 @@ Los IDs se mantienen estables una vez asignados. Cada entrada apunta al(los) fic - `bbb397a` — HC-06 + HC-07 + HC-09 + PATCH-08: constants nominals a `render_info` (segments, shadow offset, position count) i dedup init - `be94a43` — DUP-01 + DUP-06 + HC-03 + HC-10 + PATCH-05: neteja parser GIF (extension single-skip, constants nominals LZW/GCT, signatura sense args morts, un sol parse per construcció de `Surface`) - `8b413af` — HC-02: `Rendering::OPAQUE_ALPHA` a `canvas.hpp` reemplaça `0xFF000000U` repetit -- `` — INC-06 + INC-07: eliminats assignaments redundants `Sprite::pos_` a `MovingSprite`; designated initializer uniforme +- `da66a7c` — INC-06 + INC-07: eliminats assignaments redundants `Sprite::pos_` a `MovingSprite`; designated initializer uniforme +- `` — HC-08: constants nominals a l'MSL de CRT-Pi amb explicació del 768/3 diff --git a/source/core/rendering/sdl3gpu/msl/crtpi_frag.msl.h b/source/core/rendering/sdl3gpu/msl/crtpi_frag.msl.h index e770feb..f7989ea 100644 --- a/source/core/rendering/sdl3gpu/msl/crtpi_frag.msl.h +++ b/source/core/rendering/sdl3gpu/msl/crtpi_frag.msl.h @@ -67,7 +67,13 @@ fragment float4 crtpi_fs(PostVOut in [[stage_in]], 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; + // 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) {