diff options
Diffstat (limited to 'src/pipeline/debug_render_pipeline/debug_render_backend.rs')
| -rw-r--r-- | src/pipeline/debug_render_pipeline/debug_render_backend.rs | 66 |
1 files changed, 66 insertions, 0 deletions
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<Real>, + b: Point<Real>, + color: [f32; 4], + ); + + fn draw_polyline( + &mut self, + object: DebugRenderObject, + vertices: &[Point<Real>], + indices: &[[u32; 2]], + transform: &Isometry<Real>, + scale: &Vector<Real>, + 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<Real>], + transform: &Isometry<Real>, + scale: &Vector<Real>, + 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); + } + } + } +} |
