use super::DebugColor;
use crate::dynamics::{
ImpulseJoint, ImpulseJointHandle, Multibody, MultibodyLink, RigidBody, RigidBodyHandle,
};
use crate::geometry::{Aabb, Collider, ContactPair};
use crate::math::{Pose, Vector};
use crate::prelude::{ColliderHandle, MultibodyJointHandle};
#[derive(Copy, Clone)]
pub enum DebugRenderObject<'a> {
RigidBody(RigidBodyHandle, &'a RigidBody),
Collider(ColliderHandle, &'a Collider),
ColliderAabb(ColliderHandle, &'a Collider, &'a Aabb),
ImpulseJoint(ImpulseJointHandle, &'a ImpulseJoint),
MultibodyJoint(MultibodyJointHandle, &'a Multibody, &'a MultibodyLink),
ContactPair(&'a ContactPair, &'a Collider, &'a Collider),
}
pub trait DebugRenderBackend {
fn filter_object(&self, _object: DebugRenderObject) -> bool {
true
}
fn draw_line(&mut self, object: DebugRenderObject, a: Vector, b: Vector, color: DebugColor);
fn draw_polyline(
&mut self,
object: DebugRenderObject,
vertices: &[Vector],
indices: &[[u32; 2]],
transform: &Pose,
scale: Vector,
color: DebugColor,
) {
for idx in indices {
let a = *transform * (vertices[idx[0] as usize] * scale);
let b = *transform * (vertices[idx[1] as usize] * scale);
self.draw_line(object, a, b, color);
}
}
fn draw_line_strip(
&mut self,
object: DebugRenderObject,
vertices: &[Vector],
transform: &Pose,
scale: Vector,
color: DebugColor,
closed: bool,
) {
for vtx in vertices.windows(2) {
let a = *transform * (vtx[0] * scale);
let b = *transform * (vtx[1] * scale);
self.draw_line(object, a, b, color);
}
if closed && vertices.len() > 2 {
let a = *transform * (vertices[0] * scale);
let b = *transform * (*vertices.last().unwrap() * scale);
self.draw_line(object, a, b, color);
}
}
}