From fee17192e312f40aac7884f93fc49927dca538fb Mon Sep 17 00:00:00 2001 From: fredrikr79 Date: Thu, 2 Oct 2025 12:06:58 +0200 Subject: [PATCH] fix normal transform --- gloom-rs/shaders/simple.vert | 7 ++++--- gloom-rs/src/draw.rs | 13 +++++++------ 2 files changed, 11 insertions(+), 9 deletions(-) diff --git a/gloom-rs/shaders/simple.vert b/gloom-rs/shaders/simple.vert index a74a0dd..e2587e5 100644 --- a/gloom-rs/shaders/simple.vert +++ b/gloom-rs/shaders/simple.vert @@ -3,14 +3,15 @@ layout(location=0) in vec3 position; layout(location=1) in vec4 vertex_colors; layout(location=2) in vec3 normal; -uniform mat4 transform; +uniform mat4 mvp_transform; +uniform mat4 model_transform; out vec4 fragment_colors; out vec3 normal_vec; void main() { - gl_Position = transform * vec4(position, 1.0f); + gl_Position = mvp_transform * vec4(position, 1.0f); fragment_colors = vertex_colors; - normal_vec = normalize(vec3(transform * vec4(normal, 0.0f))); + normal_vec = normalize(mat3(model_transform) * normal); } diff --git a/gloom-rs/src/draw.rs b/gloom-rs/src/draw.rs index c20267a..d72bf63 100644 --- a/gloom-rs/src/draw.rs +++ b/gloom-rs/src/draw.rs @@ -12,7 +12,7 @@ use crate::toolbox; unsafe fn draw_scene(node: &SceneNode, view_projection_matrix: &glm::Mat4, - mut transformation_so_far: glm::Mat4, + mut model_transform: glm::Mat4, shader: &Shader, elapsed: f32 ) { @@ -29,10 +29,12 @@ unsafe fn draw_scene(node: &SceneNode, model_matrix = glm::translate(&model_matrix, &-node.reference_point); // combine with parent - transformation_so_far = transformation_so_far * model_matrix; + model_transform = model_transform * model_matrix; - let loc = shader.get_uniform_location("transform"); - gl::UniformMatrix4fv(loc, 1, gl::FALSE, (view_projection_matrix * transformation_so_far).as_ptr()); + let mvp_location = shader.get_uniform_location("mvp_transform"); + gl::UniformMatrix4fv(mvp_location, 1, gl::FALSE, (view_projection_matrix * model_transform).as_ptr()); + let model_location = shader.get_uniform_location("model_transform"); + gl::UniformMatrix4fv(model_location, 1, gl::FALSE, model_transform.as_ptr()); if node.index_count >= 0 { gl::BindVertexArray(node.vao_id); @@ -40,7 +42,7 @@ unsafe fn draw_scene(node: &SceneNode, } for &child in &node.children { - draw_scene(&*child, view_projection_matrix, transformation_so_far, shader, elapsed); + draw_scene(&*child, view_projection_matrix, model_transform, shader, elapsed); } } @@ -56,7 +58,6 @@ pub enum Nodes { } pub struct World { - meshes: HashMap, pub nodes: HashMap>>>, }