use bevoids::prelude::*; use bevy::prelude::*; const BOID_MIN_SPEED: f32 = 300.0; const BOID_MAX_SPEED: f32 = 700.0; const BOID_COHESION: f32 = 0.05; const BOID_SEPARATION: f32 = 0.4; const BOID_ALIGNMENT: f32 = 0.14; const BOID_BORDER_TURN_STRENGTH: f32 = 50.0; const BOID_FOV: u32 = 240; const BOID_VIEW_RANGE: f32 = 120.0; const BOID_PROTECTED_RANGE: f32 = 60.0; const BORDER_WIDTH: f32 = 1200.0; const BORDER_HEIGHT: f32 = 700.0; const BORDER_MARGIN: f32 = 600.0; fn main() { App::new() .add_plugins((DefaultPlugins, BoidsPlugin)) .insert_resource(BoidsConfig { space: BoidSpace::ThreeDimensional, debug: false, }) .insert_resource(AmbientLight { color: Color::WHITE, brightness: 150.0, }) .add_systems(Startup, setup) .run() } fn setup( mut commands: Commands, mut meshes: ResMut>, mut materials: ResMut>, ) { commands.spawn(Camera3dBundle { transform: Transform::from_xyz( -BORDER_WIDTH / 1.1, BORDER_HEIGHT / 1.1, -BORDER_WIDTH / 1.1, ) .looking_at(Vec3::new(0.0, -BORDER_HEIGHT / 2.0, 0.0), Vec3::Y), ..default() }); commands.spawn(PbrBundle { mesh: meshes .add(Plane3d::default().mesh().size(BORDER_WIDTH, BORDER_WIDTH)) .into(), material: materials.add(StandardMaterial::from(Color::LIME_GREEN)), transform: Transform::from_xyz(0.0, -BORDER_HEIGHT / 2.0, 0.0), ..default() }); for x in -5..5 { for y in -5..5 { for z in -5..5 { let spacer = 10.0; commands.spawn(( PbrBundle { mesh: meshes.add(Cuboid::new(7.5, 7.5, 20.0)).into(), material: materials.add(StandardMaterial::from(Color::RED)), transform: Transform::from_xyz( x as f32 * spacer, y as f32 * spacer, z as f32 * spacer, ), ..default() }, Boid::new( BoidSpeed::new(BOID_MIN_SPEED, BOID_MAX_SPEED), BoidTurningStrength::new( BOID_COHESION, BOID_SEPARATION, BOID_ALIGNMENT, BOID_BORDER_TURN_STRENGTH, ), BoidViewConfig::new(BOID_FOV, BOID_PROTECTED_RANGE, BOID_VIEW_RANGE), ), BoidBorder { left: Some((-BORDER_WIDTH / 2.0, BORDER_MARGIN)), right: Some((BORDER_WIDTH / 2.0, BORDER_MARGIN)), top: Some((BORDER_HEIGHT / 2.0, BORDER_MARGIN)), bottom: Some((-BORDER_HEIGHT / 2.0, BORDER_MARGIN)), front: Some((-BORDER_WIDTH / 2.0, BORDER_MARGIN)), back: Some((BORDER_WIDTH / 2.0, BORDER_MARGIN)), }, )); } } } }