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 From 65824e74f3a949343059b3bf5ab51bc7920f416d Mon Sep 17 00:00:00 2001 From: Sébastien Crozet Date: Thu, 28 Apr 2022 17:30:35 +0200 Subject: Add comments for the debug-renderer --- .../debug_render_pipeline/debug_render_backend.rs | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) (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 index 27a67e4..4fa86e4 100644 --- a/src/pipeline/debug_render_pipeline/debug_render_backend.rs +++ b/src/pipeline/debug_render_pipeline/debug_render_backend.rs @@ -6,16 +6,31 @@ use crate::math::{Isometry, Point, Real, Vector}; use crate::prelude::{ColliderHandle, MultibodyJointHandle}; use na::Scale; +/// The object currently being rendered by the debug-renderer. #[derive(Copy, Clone)] pub enum DebugRenderObject<'a> { + /// A rigid-body is being rendered. RigidBody(RigidBodyHandle, &'a RigidBody), + /// A collider is being rendered. Collider(ColliderHandle, &'a Collider), + /// An impulse-joint is being rendered. ImpulseJoint(ImpulseJointHandle, &'a ImpulseJoint), + /// A multibody joint is being rendered. MultibodyJoint(MultibodyJointHandle, &'a Multibody, &'a MultibodyLink), + /// Another element is being rendered. Other, } +/// Trait implemented by graphics backends responsible for rendering the physics scene. +/// +/// The only thing that is required from the graphics backend is to be able to render +/// a colored line. Note that the color is only a suggestion and is computed from the +/// `DebugRenderStyle`. The backend is free to apply its own style, for example based on +/// the `object` being rendered. pub trait DebugRenderBackend { + /// Draws a colored line. + /// + /// Note that this method can be called multiple time for the same `object`. fn draw_line( &mut self, object: DebugRenderObject, @@ -24,6 +39,7 @@ pub trait DebugRenderBackend { color: [f32; 4], ); + /// Draws a set of line. fn draw_polyline( &mut self, object: DebugRenderObject, @@ -40,6 +56,7 @@ pub trait DebugRenderBackend { } } + /// Draws a chain of line. fn draw_line_strip( &mut self, object: DebugRenderObject, -- cgit