feat: add a checkbox to enable/disable the debug renderer in the testbed

This commit is contained in:
Sébastien Crozet
2023-11-04 18:12:38 +01:00
parent 556ba1f998
commit ab68a8386a
3 changed files with 35 additions and 18 deletions

View File

@@ -7,17 +7,23 @@ use rapier::pipeline::{
}; };
#[derive(Resource)] #[derive(Resource)]
pub struct DebugRenderPipelineResource(pub DebugRenderPipeline); pub struct DebugRenderPipelineResource {
pub pipeline: DebugRenderPipeline,
pub enabled: bool,
}
#[derive(Default)] #[derive(Default)]
pub struct RapierDebugRenderPlugin {} pub struct RapierDebugRenderPlugin {}
impl Plugin for RapierDebugRenderPlugin { impl Plugin for RapierDebugRenderPlugin {
fn build(&self, app: &mut App) { fn build(&self, app: &mut App) {
app.insert_resource(DebugRenderPipelineResource(DebugRenderPipeline::new( app.insert_resource(DebugRenderPipelineResource {
pipeline: DebugRenderPipeline::new(
Default::default(), Default::default(),
!DebugRenderMode::RIGID_BODY_AXES & !DebugRenderMode::COLLIDER_AABBS, !DebugRenderMode::RIGID_BODY_AXES & !DebugRenderMode::COLLIDER_AABBS,
))) ),
enabled: false,
})
.add_systems(Update, debug_render_scene); .add_systems(Update, debug_render_scene);
} }
} }
@@ -46,12 +52,13 @@ impl<'a> DebugRenderBackend for BevyLinesRenderBackend<'a> {
} }
fn debug_render_scene( fn debug_render_scene(
mut pipeline: ResMut<DebugRenderPipelineResource>, mut debug_render: ResMut<DebugRenderPipelineResource>,
harness: NonSend<Harness>, harness: NonSend<Harness>,
gizmos: Gizmos, gizmos: Gizmos,
) { ) {
if debug_render.enabled {
let mut backend = BevyLinesRenderBackend { gizmos }; let mut backend = BevyLinesRenderBackend { gizmos };
pipeline.0.render( debug_render.pipeline.render(
&mut backend, &mut backend,
&harness.physics.bodies, &harness.physics.bodies,
&harness.physics.colliders, &harness.physics.colliders,
@@ -59,4 +66,5 @@ fn debug_render_scene(
&harness.physics.multibody_joints, &harness.physics.multibody_joints,
&harness.physics.narrow_phase, &harness.physics.narrow_phase,
); );
}
} }

View File

@@ -3,6 +3,7 @@ use std::mem;
use bevy::prelude::*; use bevy::prelude::*;
use crate::debug_render::{DebugRenderPipelineResource, RapierDebugRenderPlugin};
use crate::physics::{PhysicsEvents, PhysicsSnapshot, PhysicsState}; use crate::physics::{PhysicsEvents, PhysicsSnapshot, PhysicsState};
use crate::plugin::TestbedPlugin; use crate::plugin::TestbedPlugin;
use crate::ui; use crate::ui;
@@ -391,7 +392,7 @@ impl TestbedApp {
.add_plugins(DefaultPlugins.set(window_plugin)) .add_plugins(DefaultPlugins.set(window_plugin))
.add_plugins(OrbitCameraPlugin) .add_plugins(OrbitCameraPlugin)
.add_plugins(WireframePlugin) .add_plugins(WireframePlugin)
// .add_plugins(debug_render::RapierDebugRenderPlugin::default()) .add_plugins(RapierDebugRenderPlugin::default())
.add_plugins(bevy_egui::EguiPlugin); .add_plugins(bevy_egui::EguiPlugin);
#[cfg(target_arch = "wasm32")] #[cfg(target_arch = "wasm32")]
@@ -1083,6 +1084,7 @@ fn update_testbed(
builders: ResMut<SceneBuilders>, builders: ResMut<SceneBuilders>,
mut graphics: NonSendMut<GraphicsManager>, mut graphics: NonSendMut<GraphicsManager>,
mut state: ResMut<TestbedState>, mut state: ResMut<TestbedState>,
mut debug_render: ResMut<DebugRenderPipelineResource>,
mut harness: NonSendMut<Harness>, mut harness: NonSendMut<Harness>,
#[cfg(feature = "other-backends")] mut other_backends: NonSendMut<OtherBackends>, #[cfg(feature = "other-backends")] mut other_backends: NonSendMut<OtherBackends>,
mut plugins: NonSendMut<Plugins>, mut plugins: NonSendMut<Plugins>,
@@ -1127,7 +1129,7 @@ fn update_testbed(
// Update UI // Update UI
{ {
let harness = &mut *harness; let harness = &mut *harness;
ui::update_ui(&mut ui_context, &mut state, harness); ui::update_ui(&mut ui_context, &mut state, harness, &mut debug_render);
for plugin in &mut plugins.0 { for plugin in &mut plugins.0 {
plugin.update_ui( plugin.update_ui(

View File

@@ -1,6 +1,7 @@
use rapier::counters::Counters; use rapier::counters::Counters;
use rapier::math::Real; use rapier::math::Real;
use crate::debug_render::DebugRenderPipelineResource;
use crate::harness::Harness; use crate::harness::Harness;
use crate::testbed::{ use crate::testbed::{
RunMode, TestbedActionFlags, TestbedState, TestbedStateFlags, PHYSX_BACKEND_PATCH_FRICTION, RunMode, TestbedActionFlags, TestbedState, TestbedStateFlags, PHYSX_BACKEND_PATCH_FRICTION,
@@ -11,7 +12,12 @@ use crate::PhysicsState;
use bevy_egui::egui::Slider; use bevy_egui::egui::Slider;
use bevy_egui::{egui, EguiContexts}; use bevy_egui::{egui, EguiContexts};
pub fn update_ui(ui_context: &mut EguiContexts, state: &mut TestbedState, harness: &mut Harness) { pub fn update_ui(
ui_context: &mut EguiContexts,
state: &mut TestbedState,
harness: &mut Harness,
debug_render: &mut DebugRenderPipelineResource,
) {
egui::Window::new("Parameters").show(ui_context.ctx_mut(), |ui| { egui::Window::new("Parameters").show(ui_context.ctx_mut(), |ui| {
if state.backend_names.len() > 1 && !state.example_names.is_empty() { if state.backend_names.len() > 1 && !state.example_names.is_empty() {
let mut changed = false; let mut changed = false;
@@ -157,6 +163,7 @@ pub fn update_ui(ui_context: &mut EguiContexts, state: &mut TestbedState, harnes
ui.checkbox(&mut sleep, "sleep enabled"); ui.checkbox(&mut sleep, "sleep enabled");
// ui.checkbox(&mut contact_points, "draw contacts"); // ui.checkbox(&mut contact_points, "draw contacts");
// ui.checkbox(&mut wireframe, "draw wireframes"); // ui.checkbox(&mut wireframe, "draw wireframes");
ui.checkbox(&mut debug_render.enabled, "debug render enabled");
state.flags.set(TestbedStateFlags::SLEEP, sleep); state.flags.set(TestbedStateFlags::SLEEP, sleep);
// state // state