bevy_mod_physx 0.9.0

PhysX plugin for Bevy
Documentation
use bevy::prelude::*;
use bevy_inspector_egui::bevy_egui::{EguiContexts, EguiPrimaryContextPass};
use bevy_inspector_egui::egui::{self, Align2, Window};
use bevy_mod_physx::prelude::*;

// add this import via a dev-dep on bevy_egui = "0.27" (compatible with your setup)
// use bevy_egui::{EguiPrimaryContextPass, EguiStartupSet};

pub struct DebugRenderPlugin;

impl Plugin for DebugRenderPlugin {
    fn build(&self, app: &mut App) {
        app.add_systems(Update, debug_render_toggle);
        app.add_systems(EguiPrimaryContextPass, display_debug_render_ui);

        app.insert_resource(DebugRenderSettings {
            scale: 0., // global toggle for everything
            ..DebugRenderSettings::enable()
        });
    }
}

fn debug_render_toggle(
    input: Res<ButtonInput<KeyCode>>,
    mut settings: ResMut<DebugRenderSettings>,
) {
    if input.just_pressed(KeyCode::F11) {
        settings.scale = if settings.scale == 0. { 1. } else { 0. };
    }
}

fn display_debug_render_ui(
    mut egui_contexts: EguiContexts,
    mut settings: ResMut<DebugRenderSettings>,
) {
    const TOOLTIP_MARGIN: f32 = 10.;
    let Ok(egui_ctx) = egui_contexts.ctx_mut() else { return; };

    Window::new("debug_render_ui")
        .anchor(Align2::RIGHT_TOP, egui::vec2(-TOOLTIP_MARGIN, TOOLTIP_MARGIN))
        .title_bar(false)
        .auto_sized()
        .resizable(false)
        .show(egui_ctx, |ui| {
            macro_rules! checkbox {
                ($setting: ident, $desc: literal) => {
                    let orig_value = settings.$setting > 0.;
                    let mut value = orig_value;
                    ui.checkbox(&mut value, $desc);
                    if orig_value != value {
                        settings.$setting = if value { 1. } else { 0. };
                    }
                };
            }

            checkbox!(scale, "Debug Render");

            if settings.scale > 0. {
                checkbox!(world_axes, "world_axes");
                checkbox!(body_axes, "body_axes");
                checkbox!(body_mass_axes, "body_mass_axes");
                checkbox!(body_lin_velocity, "body_lin_velocity");
                checkbox!(body_ang_velocity, "body_ang_velocity");
                checkbox!(contact_point, "contact_point");
                checkbox!(contact_normal, "contact_normal");
                checkbox!(contact_error, "contact_error");
                checkbox!(contact_force, "contact_force");
                checkbox!(actor_axes, "actor_axes");
                checkbox!(collision_aabbs, "collision_aabbs");
                checkbox!(collision_shapes, "collision_shapes");
                checkbox!(collision_axes, "collision_axes");
                checkbox!(collision_compounds, "collision_compounds");
                checkbox!(collision_fnormals, "collision_fnormals");
                checkbox!(collision_edges, "collision_edges");
                checkbox!(collision_static, "collision_static");
                checkbox!(collision_dynamic, "collision_dynamic");
                checkbox!(joint_local_frames, "joint_local_frames");
                checkbox!(joint_limits, "joint_limits");
                checkbox!(cull_box, "cull_box");
                checkbox!(mbp_regions, "mbp_regions");
                checkbox!(simulation_mesh, "simulation_mesh");
                checkbox!(sdf, "sdf");
            }
        });
}