From 74342b5d1adbd097a7ffa2b631b11308136fe503 Mon Sep 17 00:00:00 2001 From: Adrian G L Date: Thu, 18 Sep 2025 10:47:02 +0200 Subject: [PATCH] feat: add camera-facing billboard quad rendering with rotation invariance --- src/main.rs | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/src/main.rs b/src/main.rs index 638ee6f..d2a8c69 100644 --- a/src/main.rs +++ b/src/main.rs @@ -220,6 +220,24 @@ fn main() { let my_vao = unsafe { create_vao(&vertices, &colors, &indices) }; + let billboard_vertices = vec![ + -0.5, -0.5, 0.0, + -0.5, 0.5, 0.0, + 0.5, 0.5, 0.0, + 0.5, -0.5, 0.0, + ]; + let billboard_indices = vec![ + 0, 1, 2, + 0, 2, 3, + ]; + let billboard_colors = vec![ + 1.0, 1.0, 1.0, 1.0, + 1.0, 1.0, 1.0, 1.0, + 1.0, 1.0, 1.0, 1.0, + 1.0, 1.0, 1.0, 1.0, + ]; + let billboard_vao = unsafe { create_vao(&billboard_vertices, &billboard_colors, &billboard_indices) }; + // == // Set up your shaders here // Basic usage of shader helper: @@ -356,6 +374,21 @@ fn main() { gl::UNSIGNED_INT, std::ptr::null(), ); + + // Draw billboard (camera-facing quad) + let translation_bill = glm::translation(&glm::vec3(0.0, 0.0, -2.0)); + let inv_rot_y = glm::rotation(cam_yaw, &glm::vec3(0.0, 1.0, 0.0)); + let inv_rot_x = glm::rotation(cam_pitch, &glm::vec3(1.0, 0.0, 0.0)); + let model_billboard = translation_bill * inv_rot_y * inv_rot_x; + let transform_bill = projection * view * model_billboard; + gl::UniformMatrix4fv(transform_loc, 1, gl::FALSE, transform_bill.as_ptr()); + gl::BindVertexArray(billboard_vao); + gl::DrawElements( + gl::TRIANGLES, + billboard_indices.len() as i32, + gl::UNSIGNED_INT, + std::ptr::null(), + ); } // Display the new color buffer on the display