Two runtime blockers discovered after merging the sky/weather/lighting branch: 1. GLSL reserved word: mesh.frag + mesh_instanced.frag used \`int active\` as a local. On GLSL ES / some drivers \`active\` is a reserved identifier and compile fails hard (\"ERROR: 0:38: 'active' : Reserved word\"). Renamed to \`activeLights\`. 2. SkyRenderer.EnsureMeshUploaded called DatCollection.Get<GfxObj> without the _datLock that wraps the streaming pipeline's dat reads. DatBinReader has shared buffer state; concurrent reads race and throw ArgumentOutOfRangeException from Vec2Duv.Unpack deep in the mesh parse. Wrapped both Get<GfxObj> and GfxObjMesh.Build in try/catch and cache a null entry on failure so we don't retry every frame and crash the render loop. Full fix would plumb _datLock into the sky renderer, left as a TODO. Client now stable end-to-end — in-world, spawn stream flowing, animation + audio + sky + light UBO all live. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> |
||
|---|---|---|
| .. | ||
| debug_line.frag | ||
| debug_line.vert | ||
| mesh.frag | ||
| mesh.vert | ||
| mesh_instanced.frag | ||
| mesh_instanced.vert | ||
| particle.frag | ||
| particle.vert | ||
| sky.frag | ||
| sky.vert | ||
| terrain.frag | ||
| terrain.vert | ||
| ui_text.frag | ||
| ui_text.vert | ||