Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- use crate::collision::Collider;
- use crate::shader::Shader;
- use nalgebra::{Matrix4, Vector3};
- use gl;
- /// Renders wireframe AABBs for debugging.
- pub struct DebugRenderer {
- vao: u32,
- vbo: u32,
- shader: Shader,
- }
- impl DebugRenderer {
- /// Initialize the debug line VAO/VBO and load the debug shader.
- pub fn new() -> Self {
- // 12 edges × 2 verts × 3 coords = 72 floats
- let lines: [f32; 72] = [
- // bottom square
- 0.0,0.0,0.0, 1.0,0.0,0.0,
- 1.0,0.0,0.0, 1.0,0.0,1.0,
- 1.0,0.0,1.0, 0.0,0.0,1.0,
- 0.0,0.0,1.0, 0.0,0.0,0.0,
- // top square
- 0.0,1.0,0.0, 1.0,1.0,0.0,
- 1.0,1.0,0.0, 1.0,1.0,1.0,
- 1.0,1.0,1.0, 0.0,1.0,1.0,
- 0.0,1.0,1.0, 0.0,1.0,0.0,
- // verticals
- 0.0,0.0,0.0, 0.0,1.0,0.0,
- 1.0,0.0,0.0, 1.0,1.0,0.0,
- 1.0,0.0,1.0, 1.0,1.0,1.0,
- 0.0,0.0,1.0, 0.0,1.0,1.0,
- ];
- let mut vao = 0;
- let mut vbo = 0;
- unsafe {
- gl::GenVertexArrays(1, &mut vao);
- gl::GenBuffers(1, &mut vbo);
- gl::BindVertexArray(vao);
- gl::BindBuffer(gl::ARRAY_BUFFER, vbo);
- gl::BufferData(
- gl::ARRAY_BUFFER,
- (lines.len() * std::mem::size_of::<f32>()) as isize,
- lines.as_ptr() as *const _,
- gl::STATIC_DRAW,
- );
- gl::VertexAttribPointer(
- 0,
- 3,
- gl::FLOAT,
- gl::FALSE,
- 3 * std::mem::size_of::<f32>() as i32,
- std::ptr::null(),
- );
- gl::EnableVertexAttribArray(0);
- gl::BindVertexArray(0);
- }
- // Load the simple debug shader
- let shader = Shader::new(
- "src/shaders/debug_vertex.glsl",
- "src/shaders/debug_fragment.glsl",
- );
- println!("DEBUG SHADER ID = {}", shader.id);
- DebugRenderer { vao, vbo, shader }
- }
- /// Draws the AABB collider in bright green lines, disabling depth test so it always shows.
- pub fn draw_collider(
- &self,
- view: &Matrix4<f32>,
- proj: &Matrix4<f32>,
- collider: &Collider,
- ) {
- // Compute model matrix to scale/translate unit cube into the collider AABB
- let scale = collider.max - collider.min;
- let translate = collider.min;
- let model = Matrix4::new_translation(&translate)
- * Matrix4::new_nonuniform_scaling(&scale);
- // Disable depth test so wireframe always draws on top
- unsafe { gl::Disable(gl::DEPTH_TEST); }
- // Use debug shader
- self.shader.use_program();
- self.shader.set_mat4("model", &model);
- self.shader.set_mat4("view", &view);
- self.shader.set_mat4("projection", &proj);
- self.shader.set_vec3("objectColor", &Vector3::new(0.5, 1.0, 0.5));
- // Render lines
- unsafe {
- gl::BindVertexArray(self.vao);
- gl::DrawArrays(gl::LINES, 0, 24);
- gl::BindVertexArray(0);
- }
- // Re-enable depth test for subsequent draws
- unsafe { gl::Enable(gl::DEPTH_TEST); }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement