Skip to content

[Audit][High] getLightSafe returns MAX_LIGHT for Y >= 256 causing light leak at chunk tops #702

@MichaelFisher1997

Description

@MichaelFisher1997

🔍 Module Scanned\n (automated audit scan)\n\n## 📝 Summary\nThe function in incorrectly returns when (i.e., y >= 256). This causes sky light to "leak" through the tops of chunks when meshing at subchunk boundaries, because the sampling code uses to query light values for positions that may be exactly at the chunk boundary (y=256).\n\n## 📍 Location\n- File: \n- Function/Scope: \n\n## 🔴 Severity: High\n- High: Memory leaks, race conditions, incorrect rendering, broken features\n\n## 💥 Impact\nWhen chunks are at the top of the world (y=256 boundary), the greedy mesher queries for face lighting at positions that fall at the chunk boundary. If the queried y is >= 256, the function returns (full daylight) even though the position is outside the world bounds. This causes:\n- Light leaking: Sky-colored faces rendered where they shouldn't be\n- Incorrect AO/lighting: The meshing system relies on accurate light values at boundaries\n- Visual artifacts: Players may see unexpected bright spots at chunk edges\n\n## 🔎 Evidence\n\n\nCompare to which has a different (also potentially incorrect) behavior for Y >= 256:\n\n\nNote: has debug asserts that would panic on y >= 256, but is supposed to be the safe version and yet returns incorrect data for this edge case.\n\n## 🛠️ Proposed Fix\nChange line 152 in to return 0 light for y >= CHUNK_SIZE_Y, consistent with other out-of-bounds handling:\n\n\n\n## ✅ Acceptance Criteria\n- [ ] All unit tests in pass with Zig 0.16.0 + SDL3 Dev Environment

Compiler: 0.16.0
assets/shaders/vulkan/debug_shadow.frag
assets/shaders/vulkan/lpv_propagate.comp
assets/shaders/vulkan/ui_tex.frag
assets/shaders/vulkan/g_pass.frag
assets/shaders/vulkan/ssao_blur.frag
assets/shaders/vulkan/shadow.vert
assets/shaders/vulkan/taa.frag
assets/shaders/vulkan/culling.comp
assets/shaders/vulkan/debug_shadow.vert
assets/shaders/vulkan/shadow.frag
assets/shaders/vulkan/bloom_downsample.vert
assets/shaders/vulkan/bloom_upsample.vert
assets/shaders/vulkan/debug_shadow.vert
assets/shaders/vulkan/fxaa.vert
assets/shaders/vulkan/post_process.vert
assets/shaders/vulkan/shadow.vert
assets/shaders/vulkan/sky.vert
assets/shaders/vulkan/ssao.vert
assets/shaders/vulkan/taa.vert
assets/shaders/vulkan/terrain.vert
assets/shaders/vulkan/ui.vert
assets/shaders/vulkan/ui_tex.vert
assets/shaders/vulkan/water.vert
assets/shaders/vulkan/bloom_downsample.frag
assets/shaders/vulkan/bloom_upsample.frag
assets/shaders/vulkan/debug_shadow.frag
assets/shaders/vulkan/fxaa.frag
assets/shaders/vulkan/g_pass.frag
assets/shaders/vulkan/post_process.frag
assets/shaders/vulkan/shadow.frag
assets/shaders/vulkan/sky.frag
assets/shaders/vulkan/ssao.frag
assets/shaders/vulkan/ssao_blur.frag
assets/shaders/vulkan/taa.frag
assets/shaders/vulkan/terrain.frag
assets/shaders/vulkan/terrain_debug.frag
assets/shaders/vulkan/ui.frag
assets/shaders/vulkan/ui_tex.frag
assets/shaders/vulkan/water.frag
assets/shaders/vulkan/culling.comp
assets/shaders/vulkan/depth_pyramid.comp
assets/shaders/vulkan/lpv_inject.comp
assets/shaders/vulkan/lpv_propagate.comp
assets/shaders/vulkan/mesh.comp
assets/shaders/vulkan/water.frag
assets/shaders/vulkan/terrain.frag
assets/shaders/vulkan/lpv_inject.comp
assets/shaders/vulkan/mesh.comp
assets/shaders/vulkan/taa.vert
assets/shaders/vulkan/depth_pyramid.comp
assets/shaders/vulkan/ui_tex.vert
assets/shaders/vulkan/water.vert
assets/shaders/vulkan/ssao.vert
assets/shaders/vulkan/ui.frag
assets/shaders/vulkan/sky.vert
assets/shaders/vulkan/terrain.vert
assets/shaders/vulkan/ui.vert
assets/shaders/vulkan/ssao.frag
assets/shaders/vulkan/sky.frag\n- [ ] returns when y >= CHUNK_SIZE_Y (not MAX_LIGHT)\n- [ ] behavior is consistent with which returns for out-of-bounds coordinates\n- [ ] The fix has been verified with Zig 0.16.0 + SDL3 Dev Environment
Compiler: 0.16.0
assets/shaders/vulkan/terrain.vert
assets/shaders/vulkan/debug_shadow.frag
assets/shaders/vulkan/sky.frag
assets/shaders/vulkan/lpv_inject.comp
assets/shaders/vulkan/ui_tex.frag
assets/shaders/vulkan/depth_pyramid.comp
assets/shaders/vulkan/debug_shadow.vert
assets/shaders/vulkan/taa.frag
assets/shaders/vulkan/g_pass.frag
assets/shaders/vulkan/ui.frag
assets/shaders/vulkan/shadow.vert
assets/shaders/vulkan/culling.comp
assets/shaders/vulkan/ssao.vert
assets/shaders/vulkan/terrain.frag
assets/shaders/vulkan/lpv_propagate.comp
assets/shaders/vulkan/taa.vert
assets/shaders/vulkan/ui_tex.vert
assets/shaders/vulkan/water.frag
assets/shaders/vulkan/ssao.frag
assets/shaders/vulkan/bloom_downsample.vert
assets/shaders/vulkan/bloom_upsample.vert
assets/shaders/vulkan/debug_shadow.vert
assets/shaders/vulkan/fxaa.vert
assets/shaders/vulkan/post_process.vert
assets/shaders/vulkan/shadow.vert
assets/shaders/vulkan/sky.vert
assets/shaders/vulkan/ssao.vert
assets/shaders/vulkan/taa.vert
assets/shaders/vulkan/terrain.vert
assets/shaders/vulkan/ui.vert
assets/shaders/vulkan/ui_tex.vert
assets/shaders/vulkan/water.vert
assets/shaders/vulkan/bloom_downsample.frag
assets/shaders/vulkan/bloom_upsample.frag
assets/shaders/vulkan/debug_shadow.frag
assets/shaders/vulkan/fxaa.frag
assets/shaders/vulkan/g_pass.frag
assets/shaders/vulkan/post_process.frag
assets/shaders/vulkan/shadow.frag
assets/shaders/vulkan/sky.frag
assets/shaders/vulkan/ssao.frag
assets/shaders/vulkan/ssao_blur.frag
assets/shaders/vulkan/taa.frag
assets/shaders/vulkan/terrain.frag
assets/shaders/vulkan/terrain_debug.frag
assets/shaders/vulkan/ui.frag
assets/shaders/vulkan/ui_tex.frag
assets/shaders/vulkan/water.frag
assets/shaders/vulkan/culling.comp
assets/shaders/vulkan/depth_pyramid.comp
assets/shaders/vulkan/lpv_inject.comp
assets/shaders/vulkan/lpv_propagate.comp
assets/shaders/vulkan/mesh.comp
assets/shaders/vulkan/shadow.frag
assets/shaders/vulkan/ui.vert
assets/shaders/vulkan/mesh.comp
assets/shaders/vulkan/water.vert
assets/shaders/vulkan/ssao_blur.frag
assets/shaders/vulkan/sky.vert\n\n## 📚 References\n- World coordinate system: chunks are 16x256x16, with Y ranging from 0 to 255 (256 layers)\n- function at line 67 has meaning y must be < 256\n- is designed to be the safe version of but has inconsistent boundary handling\n

Metadata

Metadata

Assignees

No one assigned

    Labels

    automated-auditIssues found by automated opencode audit scansbugSomething isn't workingenhancementNew feature or request

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions