aboutsummaryrefslogtreecommitdiff
path: root/src_testbed/debug_render.rs
blob: 31385469073027904996df7ebf3bf8308b6db6e0 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
#![allow(clippy::unnecessary_cast)] // Casts are needed for switching between f32/f64.

use crate::harness::Harness;
use bevy::gizmos::gizmos::Gizmos;
use bevy::prelude::*;
use rapier::math::{Point, Real};
use rapier::pipeline::{
    DebugRenderBackend, DebugRenderMode, DebugRenderObject, DebugRenderPipeline,
};

#[derive(Resource)]
pub struct DebugRenderPipelineResource {
    pub pipeline: DebugRenderPipeline,
    pub enabled: bool,
}

#[derive(Default)]
pub struct RapierDebugRenderPlugin {}

impl Plugin for RapierDebugRenderPlugin {
    fn build(&self, app: &mut App) {
        app.insert_resource(DebugRenderPipelineResource {
            pipeline: DebugRenderPipeline::new(
                Default::default(),
                !DebugRenderMode::RIGID_BODY_AXES & !DebugRenderMode::COLLIDER_AABBS,
            ),
            enabled: false,
        })
        .add_systems(Update, debug_render_scene);
    }
}

struct BevyLinesRenderBackend<'w, 's> {
    gizmos: Gizmos<'w, 's>,
}

impl<'w, 's> DebugRenderBackend for BevyLinesRenderBackend<'w, 's> {
    #[cfg(feature = "dim2")]
    fn draw_line(&mut self, _: DebugRenderObject, a: Point<Real>, b: Point<Real>, color: [f32; 4]) {
        self.gizmos.line(
            [a.x as f32, a.y as f32, 1.0e-8].into(),
            [b.x as f32, b.y as f32, 1.0e-8].into(),
            Color::hsla(color[0], color[1], color[2], color[3]),
        )
    }
    #[cfg(feature = "dim3")]
    fn draw_line(&mut self, _: DebugRenderObject, a: Point<Real>, b: Point<Real>, color: [f32; 4]) {
        self.gizmos.line(
            [a.x as f32, a.y as f32, a.z as f32].into(),
            [b.x as f32, b.y as f32, b.z as f32].into(),
            Color::hsla(color[0], color[1], color[2], color[3]),
        )
    }
}

fn debug_render_scene(
    mut debug_render: ResMut<DebugRenderPipelineResource>,
    harness: NonSend<Harness>,
    gizmos: Gizmos,
) {
    if debug_render.enabled {
        let mut backend = BevyLinesRenderBackend { gizmos };
        debug_render.pipeline.render(
            &mut backend,
            &harness.physics.bodies,
            &harness.physics.colliders,
            &harness.physics.impulse_joints,
            &harness.physics.multibody_joints,
            &harness.physics.narrow_phase,
        );
    }
}