Engine:
- Create, resize and update functions now restore the bindings they
touch instead of leaving their own objects bound or resetting to 0
(Texture, FrameBuffer, Mesh, UniformBuffer)
- Texture::bind/unbind switch back to texture unit 0 afterwards, so
later texture binds can't replace a material's specular map
- Add gl_get_binding() helper to read the current binding
- Renderer remembers the wireframe mode (new is_wireframe());
draw_debug_wireframes restores it instead of always disabling it,
which fixes H having no effect while debug wireframes are shown
main.cpp (same behavior and UI):
- main() only sets up the window and renderer; all GL resources live
in run() and are released before Renderer::shutdown()
- One function per scene and a shared create_textured_material()
- Split app state into AppState, CameraInput and PerformanceStats;
drop the duplicate delta_time and static toggle variables
- Move the scene pass to render_scene() and the overlay to
draw_overlay(); name the light box and overlay constants
- Clear the mouse callback before AppState is destroyed
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