Fix out of bounds colors in fancy lighting

This commit is contained in:
Goodlyay 2024-05-17 18:09:04 -07:00
parent 44d808016c
commit 3e797338db

View File

@ -507,13 +507,11 @@ static cc_bool IsLit_Fast(int x, int y, int z) { return ClassicLighting_IsLit_Fa
CalculateChunkLightingAll(chunkIndex, cx, cy, cz); \ CalculateChunkLightingAll(chunkIndex, cx, cy, cz); \
} }
static PackedCol Color_Core(int x, int y, int z, int paletteFace, PackedCol outOfBoundsColor) { static PackedCol Color_Core(int x, int y, int z, int paletteFace) {
cc_uint8 lightData; cc_uint8 lightData;
int cx, cy, cz, chunkIndex; int cx, cy, cz, chunkIndex;
int chunkCoordsIndex; int chunkCoordsIndex;
if (!World_Contains(x, y, z)) return outOfBoundsColor;
cx = x >> CHUNK_SHIFT; cx = x >> CHUNK_SHIFT;
cy = y >> CHUNK_SHIFT; cy = y >> CHUNK_SHIFT;
cz = z >> CHUNK_SHIFT; cz = z >> CHUNK_SHIFT;
@ -539,20 +537,26 @@ static PackedCol Color_Core(int x, int y, int z, int paletteFace, PackedCol outO
return palettes[paletteFace][lightData]; return palettes[paletteFace][lightData];
} }
#define TRY_OOB_CASE(sun, shadow) if (!World_Contains(x, y, z)) return y >= Env.EdgeHeight ? sun : shadow
static PackedCol Color(int x, int y, int z) { static PackedCol Color(int x, int y, int z) {
return Color_Core(x, y, z, PALETTE_YMAX_INDEX, Env.SunCol); TRY_OOB_CASE(Env.SunCol, Env.ShadowCol);
return Color_Core(x, y, z, PALETTE_YMAX_INDEX);
} }
static PackedCol Color_YMaxSide(int x, int y, int z) { static PackedCol Color_YMaxSide(int x, int y, int z) {
return Color_Core(x, y, z, PALETTE_YMAX_INDEX, Env.SunCol); TRY_OOB_CASE(Env.SunCol, Env.ShadowCol);
return Color_Core(x, y, z, PALETTE_YMAX_INDEX);
} }
static PackedCol Color_YMinSide(int x, int y, int z) { static PackedCol Color_YMinSide(int x, int y, int z) {
return Color_Core(x, y, z, PALETTE_YMIN_INDEX, Env.SunYMin); TRY_OOB_CASE(Env.SunYMin, Env.ShadowYMin);
return Color_Core(x, y, z, PALETTE_YMIN_INDEX);
} }
static PackedCol Color_XSide(int x, int y, int z) { static PackedCol Color_XSide(int x, int y, int z) {
return Color_Core(x, y, z, PALETTE_XSIDE_INDEX, Env.SunXSide); TRY_OOB_CASE(Env.SunXSide, Env.ShadowXSide);
return Color_Core(x, y, z, PALETTE_XSIDE_INDEX);
} }
static PackedCol Color_ZSide(int x, int y, int z) { static PackedCol Color_ZSide(int x, int y, int z) {
return Color_Core(x, y, z, PALETTE_ZSIDE_INDEX, Env.SunZSide); TRY_OOB_CASE(Env.SunZSide, Env.ShadowZSide);
return Color_Core(x, y, z, PALETTE_ZSIDE_INDEX);
} }
static void LightHint(int startX, int startY, int startZ) { static void LightHint(int startX, int startY, int startZ) {