From bc2ae4b512b8bc7a2b61dd24d9685289453681c5 Mon Sep 17 00:00:00 2001 From: Sébastien Crozet Date: Fri, 22 Apr 2022 15:45:53 +0200 Subject: Add a basic lines-based debug-renderer --- .../debug_render_pipeline/debug_render_backend.rs | 66 ++++++++++++++++++++++ 1 file changed, 66 insertions(+) create mode 100644 src/pipeline/debug_render_pipeline/debug_render_backend.rs (limited to 'src/pipeline/debug_render_pipeline/debug_render_backend.rs') diff --git a/src/pipeline/debug_render_pipeline/debug_render_backend.rs b/src/pipeline/debug_render_pipeline/debug_render_backend.rs new file mode 100644 index 0000000..27a67e4 --- /dev/null +++ b/src/pipeline/debug_render_pipeline/debug_render_backend.rs @@ -0,0 +1,66 @@ +use crate::dynamics::{ + ImpulseJoint, ImpulseJointHandle, Multibody, MultibodyLink, RigidBody, RigidBodyHandle, +}; +use crate::geometry::Collider; +use crate::math::{Isometry, Point, Real, Vector}; +use crate::prelude::{ColliderHandle, MultibodyJointHandle}; +use na::Scale; + +#[derive(Copy, Clone)] +pub enum DebugRenderObject<'a> { + RigidBody(RigidBodyHandle, &'a RigidBody), + Collider(ColliderHandle, &'a Collider), + ImpulseJoint(ImpulseJointHandle, &'a ImpulseJoint), + MultibodyJoint(MultibodyJointHandle, &'a Multibody, &'a MultibodyLink), + Other, +} + +pub trait DebugRenderBackend { + fn draw_line( + &mut self, + object: DebugRenderObject, + a: Point, + b: Point, + color: [f32; 4], + ); + + fn draw_polyline( + &mut self, + object: DebugRenderObject, + vertices: &[Point], + indices: &[[u32; 2]], + transform: &Isometry, + scale: &Vector, + color: [f32; 4], + ) { + for idx in indices { + let a = transform * (Scale::from(*scale) * vertices[idx[0] as usize]); + let b = transform * (Scale::from(*scale) * vertices[idx[1] as usize]); + self.draw_line(object, a, b, color); + } + } + + fn draw_line_strip( + &mut self, + object: DebugRenderObject, + vertices: &[Point], + transform: &Isometry, + scale: &Vector, + color: [f32; 4], + closed: bool, + ) { + for vtx in vertices.windows(2) { + let a = transform * (Scale::from(*scale) * vtx[0]); + let b = transform * (Scale::from(*scale) * vtx[1]); + self.draw_line(object, a, b, color); + } + + if closed { + if vertices.len() > 2 { + let a = transform * (Scale::from(*scale) * vertices[0]); + let b = transform * (Scale::from(*scale) * vertices.last().unwrap()); + self.draw_line(object, a, b, color); + } + } + } +} -- cgit