Addresses the 'doors, windows, and alpha-keyed parts render bright pink' issue the user observed after the Phase 2a visual checkpoint. SurfaceDecoder gains a second overload taking an optional Palette parameter. When the render surface format is PFID_INDEX16 and a palette is supplied, each 16-bit value in SourceData is treated as an index into Palette.Colors (a List<ColorARGB>) and the corresponding ARGB color's channels are written to the output buffer. The original no-palette overload is preserved so the Task 3 unit tests that confirm INDEX16 -> magenta fallback still describe their behavior correctly (INDEX16 without a palette still returns magenta). TextureCache now resolves the RenderSurface's DefaultPaletteId via the dats and passes the resulting Palette (or null) to the decoder. mesh.frag adds an alpha cutout: fragments with sampled alpha < 0.5 are discarded. Without this, transparent regions of alpha-keyed textures (doors, windows, foliage cutouts) would render as opaque rectangles using the texture's background color. This is the standard alpha-tested approach, simpler than full alpha blending and matches how AC's original client rendered these surfaces. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
14 lines
426 B
GLSL
14 lines
426 B
GLSL
#version 430 core
|
|
in vec2 vTex;
|
|
out vec4 fragColor;
|
|
|
|
uniform sampler2D uDiffuse;
|
|
|
|
void main() {
|
|
vec4 sampled = texture(uDiffuse, vTex);
|
|
// Alpha cutout for doors, windows, vegetation, and other alpha-keyed textures.
|
|
// Without this, zero-alpha pixels in palette-indexed textures render as opaque
|
|
// rectangles where the transparent parts should be.
|
|
if (sampled.a < 0.5) discard;
|
|
fragColor = sampled;
|
|
}
|