Bug fixes:
- Release static GL objects (UBOs, logo texture) before the context is
destroyed via new Renderer::shutdown()
- Fix max point/spot light warnings never firing
- Show frame time in ms instead of seconds
- Size the viewport framebuffer in physical pixels on HiDPI displays
- Stop double-flipping OBJ UVs; add flip_uvs option to load_obj for
models with a top-left UV origin (backpack)
Build:
- Track header dependencies (-MMD -MP) so header edits trigger rebuilds
- Create build/ automatically
Error handling:
- Add gldebug module: KHR_debug output routed to the logger in debug
builds, object labels, and error/status string helpers
- Validate inputs and check GL errors when creating textures, meshes,
framebuffers, uniform buffers and shaders; FrameBuffer::resize() and
Renderer::init() now report failure
Resources:
- Add ResourceCache: shares textures and shaders by path and substitutes
fallbacks (magenta checkerboard texture, unlit shader, cube mesh) for
assets that fail to load; specular maps are optional
- load_obj never fails, a broken model becomes a fallback cube
- Renderer draws submeshes with broken materials using the fallback
material instead of skipping them
- Add Texture::create_from_pixels, Shader::create_from_source and
Mesh::create_cube
- Cache uniform locations in Shader, looked up with string_view so
hits don't allocate; missing uniforms warn once
Performance:
- Add CpuTimer and GpuTimer (GL_TIME_ELAPSED, non-blocking readback)
and a Performance section in the UI with averaged overlay numbers
- Sample material textures once per fragment and apply material colors
after accumulating lights
- Pass camera position through CameraBlock instead of inverting the
view matrix per fragment
- Compute the normal matrix on the CPU instead of per vertex
- Skip spot light work for fragments outside the outer cone