From 21b061b951ec3a65bc479fabeb2d9565e08a807e Mon Sep 17 00:00:00 2001 From: skal Date: Sun, 8 Mar 2026 10:38:19 +0100 Subject: fix: transpose matrices on GPU upload (row-major → column-major) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit mini_math mat4 is row-major; WGSL mat4x4f is column-major. Matrices uploaded without transposing were interpreted as their own transpose on the GPU, causing RotatingCube and Renderer3D to render upside-down. - Add gpu_upload_mat4() to post_process_helper for standalone uploads - Add Uniforms::make() to RotatingCube::Uniforms (handles transpose) - Add GlobalUniforms::make() and ObjectData::make() to renderer.h - Update renderer_draw.cc and visual_debug.cc to use make() handoff(Gemini): matrix layout bug fixed across all rasterized effects. Co-Authored-By: Claude Sonnet 4.6 --- src/effects/rotating_cube_effect.h | 8 ++++++++ 1 file changed, 8 insertions(+) (limited to 'src/effects/rotating_cube_effect.h') diff --git a/src/effects/rotating_cube_effect.h b/src/effects/rotating_cube_effect.h index e773025..920be5c 100644 --- a/src/effects/rotating_cube_effect.h +++ b/src/effects/rotating_cube_effect.h @@ -28,6 +28,14 @@ class RotatingCube : public Effect { vec2 resolution; float aspect_ratio; float _pad; + + // Transpose matrices: mini_math is row-major, WGSL expects column-major. + static Uniforms make(const mat4& vp, const vec4& cam_pos_time, + const vec4& p, const vec2& res, float asp) { + return {mat4::transpose(vp), mat4::transpose(vp.inverse()), + cam_pos_time, p, + res, asp}; + } }; static_assert(sizeof(Uniforms) == 176, "Uniforms size mismatch"); -- cgit v1.2.3