bevy_boxddd 0.2.0

Bevy integration for the boxddd Rust bindings to Box3D
Documentation
#[path = "support/mod.rs"]
mod support;

use bevy::color::palettes::css::{LIME, ORANGE, TURQUOISE, WHITE};
use bevy::prelude::*;
use bevy_boxddd::prelude::*;

fn main() {
    App::new()
        .add_plugins(support::teaching_default_plugins(
            "boxddd Bevy Debug Gizmos",
        ))
        .add_plugins(BoxdddPhysicsPlugin::new(BoxdddPhysicsSettings::default()))
        .add_systems(Startup, setup)
        .add_systems(Update, draw_collider_gizmos)
        .run();
}

fn setup(
    mut commands: Commands,
    mut meshes: ResMut<Assets<Mesh>>,
    mut materials: ResMut<Assets<StandardMaterial>>,
) {
    commands.spawn((
        Camera3d::default(),
        Transform::from_xyz(-7.0, 5.0, 10.0).looking_at(Vec3::new(0.0, 1.0, 0.0), Vec3::Y),
    ));

    commands.spawn((
        PointLight {
            intensity: 5_000_000.0,
            range: 60.0,
            shadow_maps_enabled: true,
            ..default()
        },
        Transform::from_xyz(5.0, 8.0, 4.0),
    ));

    commands.spawn((
        Mesh3d(meshes.add(Cuboid::new(14.0, 0.4, 14.0))),
        MeshMaterial3d(materials.add(Color::srgb(0.20, 0.23, 0.22))),
        Transform::from_xyz(0.0, -0.2, 0.0),
        RigidBody::Static,
        Collider::cuboid(7.0, 0.2, 7.0),
    ));

    commands.spawn((
        Mesh3d(meshes.add(Cuboid::new(0.9, 0.9, 0.9))),
        MeshMaterial3d(materials.add(Color::srgb(0.24, 0.45, 0.85))),
        Transform::from_xyz(-1.4, 3.0, 0.0).with_rotation(Quat::from_rotation_z(0.35)),
        RigidBody::Dynamic,
        Collider::cube(0.45),
        PhysicsMaterial {
            restitution: 0.1,
            ..default()
        },
    ));

    commands.spawn((
        Mesh3d(meshes.add(Sphere::new(0.45).mesh().uv(32, 18))),
        MeshMaterial3d(materials.add(Color::srgb(0.94, 0.58, 0.23))),
        Transform::from_xyz(0.0, 4.6, 0.0),
        RigidBody::Dynamic,
        Collider::sphere(0.45),
        PhysicsMaterial {
            restitution: 0.25,
            ..default()
        },
    ));

    commands.spawn((
        Mesh3d(meshes.add(Capsule3d::new(0.28, 0.9))),
        MeshMaterial3d(materials.add(Color::srgb(0.34, 0.68, 0.40))),
        Transform::from_xyz(1.5, 6.2, 0.0).with_rotation(Quat::from_rotation_x(0.4)),
        RigidBody::Dynamic,
        Collider::capsule_y(0.45, 0.28),
        PhysicsMaterial {
            restitution: 0.2,
            ..default()
        },
    ));
}

fn draw_collider_gizmos(mut gizmos: Gizmos, colliders: Query<(&Transform, &Collider)>) {
    for (transform, collider) in &colliders {
        match *collider {
            Collider::Cuboid { half_extents } => {
                gizmos.cube(
                    transform.with_scale(half_extents * 2.0),
                    if half_extents.y < 0.3 {
                        WHITE
                    } else {
                        TURQUOISE
                    },
                );
            }
            Collider::Sphere { radius, center } => {
                gizmos.sphere(transform.transform_point(center), radius, ORANGE);
            }
            Collider::Capsule {
                point1,
                point2,
                radius,
            } => {
                let start = transform.transform_point(point1);
                let end = transform.transform_point(point2);
                gizmos.line(start, end, LIME);
                gizmos.sphere(start, radius, LIME);
                gizmos.sphere(end, radius, LIME);
            }
            _ => {}
        }
    }
}