summaryrefslogtreecommitdiff
path: root/src/3d/renderer_draw.cc
diff options
context:
space:
mode:
authorskal <pascal.massimino@gmail.com>2026-03-08 10:38:19 +0100
committerskal <pascal.massimino@gmail.com>2026-03-08 10:38:19 +0100
commit21b061b951ec3a65bc479fabeb2d9565e08a807e (patch)
tree24755d905463c8a507a34624ab3edf7295c8e0c5 /src/3d/renderer_draw.cc
parent5f64a20daa81a6182d4898dcd6f86870ad0bf9d5 (diff)
fix: transpose matrices on GPU upload (row-major → column-major)
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 <noreply@anthropic.com>
Diffstat (limited to 'src/3d/renderer_draw.cc')
-rw-r--r--src/3d/renderer_draw.cc57
1 files changed, 16 insertions, 41 deletions
diff --git a/src/3d/renderer_draw.cc b/src/3d/renderer_draw.cc
index 8a08998..d4a35a8 100644
--- a/src/3d/renderer_draw.cc
+++ b/src/3d/renderer_draw.cc
@@ -9,63 +9,38 @@
void Renderer3D::update_uniforms(const Scene& scene, const Camera& camera,
float time) {
- GlobalUniforms globals;
- globals.view_proj = camera.get_projection_matrix() * camera.get_view_matrix();
- globals.inv_view_proj = globals.view_proj.inverse();
- globals.camera_pos_time =
- vec4(camera.position.x, camera.position.y, camera.position.z, time);
- globals.params =
+ const mat4 vp = camera.get_projection_matrix() * camera.get_view_matrix();
+ const GlobalUniforms globals = GlobalUniforms::make(
+ vp,
+ vec4(camera.position.x, camera.position.y, camera.position.z, time),
vec4((float)std::min((size_t)kMaxObjects, scene.objects.size()), 0.0f,
- 0.0f, 0.0f);
- globals.resolution = vec2((float)width_, (float)height_);
- globals.padding = vec2(0.0f, 0.0f);
+ 0.0f, 0.0f),
+ vec2((float)width_, (float)height_));
wgpuQueueWriteBuffer(queue_, global_uniform_buffer_, 0, &globals,
sizeof(GlobalUniforms));
std::vector<ObjectData> obj_data;
for (const auto& obj : scene.objects) {
- ObjectData data;
- data.model = obj.get_model_matrix();
-
- // Calculate Inverse for point transformation
- data.inv_model = data.model.inverse();
-
- data.color = obj.color;
float type_id = 0.0f;
switch (obj.type) {
- case ObjectType::SPHERE:
- type_id = 1.0f;
- break;
- case ObjectType::BOX:
- type_id = 2.0f;
- break;
- case ObjectType::CUBE:
- type_id = 2.0f;
- break; // CUBE is same as BOX for shader
- case ObjectType::TORUS:
- type_id = 3.0f;
- break;
- case ObjectType::PLANE:
- type_id = 4.0f;
- break;
- case ObjectType::MESH:
- type_id = 5.0f;
- break;
- default:
- type_id = 0.0f;
- break;
+ case ObjectType::SPHERE: type_id = 1.0f; break;
+ case ObjectType::BOX: type_id = 2.0f; break;
+ case ObjectType::CUBE: type_id = 2.0f; break; // CUBE is same as BOX
+ case ObjectType::TORUS: type_id = 3.0f; break;
+ case ObjectType::PLANE: type_id = 4.0f; break;
+ case ObjectType::MESH: type_id = 5.0f; break;
+ default: type_id = 0.0f; break;
}
float plane_distance = 0.0f;
if (obj.type == ObjectType::PLANE && obj.shared_user_data) {
- // Safely cast shared_user_data to PlaneData* and get distance
plane_distance = ((PlaneData*)(obj.shared_user_data.get()))->distance;
}
- data.params =
- vec4(type_id, plane_distance, obj.local_extent.x, obj.local_extent.y);
- obj_data.push_back(data);
+ obj_data.push_back(ObjectData::make(
+ obj.get_model_matrix(), obj.color,
+ vec4(type_id, plane_distance, obj.local_extent.x, obj.local_extent.y)));
if (obj_data.size() >= kMaxObjects)
break;
}