use bevy::{
core_pipeline::tonemapping::Tonemapping, prelude::*, render::camera::Viewport,
window::WindowResized,
};
use bevy_editor_cam::prelude::*;
fn main() {
App::new()
.add_plugins((
DefaultPlugins,
MeshPickingPlugin,
DefaultEditorCamPlugins,
bevy_framepace::FramepacePlugin,
))
.add_systems(Startup, setup)
.add_systems(Update, set_camera_viewports)
.run();
}
fn setup(mut commands: Commands, asset_server: Res<AssetServer>) {
spawn_helmets(27, &asset_server, &mut commands);
let diffuse_map = asset_server.load("environment_maps/diffuse_rgb9e5_zstd.ktx2");
let specular_map = asset_server.load("environment_maps/specular_rgb9e5_zstd.ktx2");
commands.spawn((
Camera3d::default(),
Transform::from_xyz(0.0, 2.0, -1.0).looking_at(Vec3::ZERO, Vec3::Y),
Camera {
hdr: true,
clear_color: ClearColorConfig::None,
..default()
},
EnvironmentMapLight {
intensity: 1000.0,
diffuse_map: diffuse_map.clone(),
specular_map: specular_map.clone(),
rotation: default(),
affects_lightmapped_mesh_diffuse: true,
},
EditorCam::default(),
bevy_editor_cam::extensions::independent_skybox::IndependentSkybox::new(
diffuse_map.clone(),
500.0,
default(),
),
LeftCamera,
));
commands.spawn((
Camera3d::default(),
Transform::from_xyz(1.0, 1.0, 1.5).looking_at(Vec3::ZERO, Vec3::Y),
Camera {
order: 10,
hdr: true,
clear_color: ClearColorConfig::None,
..default()
},
Projection::Orthographic(OrthographicProjection {
scale: 0.01,
..OrthographicProjection::default_3d()
}),
Tonemapping::AcesFitted,
EnvironmentMapLight {
intensity: 1000.0,
diffuse_map: diffuse_map.clone(),
specular_map: specular_map.clone(),
rotation: default(),
affects_lightmapped_mesh_diffuse: true,
},
EditorCam::default(),
bevy_editor_cam::extensions::independent_skybox::IndependentSkybox::new(
diffuse_map,
500.0,
default(),
),
RightCamera,
));
}
#[derive(Component)]
struct LeftCamera;
#[derive(Component)]
struct RightCamera;
fn set_camera_viewports(
windows: Query<&Window>,
mut resize_events: EventReader<WindowResized>,
mut left_camera: Query<&mut Camera, (With<LeftCamera>, Without<RightCamera>)>,
mut right_camera: Query<&mut Camera, With<RightCamera>>,
) {
for resize_event in resize_events.read() {
let window = windows.get(resize_event.window).unwrap();
let mut left_camera = left_camera.single_mut().unwrap();
left_camera.viewport = Some(Viewport {
physical_position: UVec2::new(0, 0),
physical_size: UVec2::new(
window.resolution.physical_width() / 2,
window.resolution.physical_height(),
),
..default()
});
let mut right_camera = right_camera.single_mut().unwrap();
right_camera.viewport = Some(Viewport {
physical_position: UVec2::new(window.resolution.physical_width() / 2, 0),
physical_size: UVec2::new(
window.resolution.physical_width() / 2,
window.resolution.physical_height(),
),
..default()
});
}
}
fn spawn_helmets(n: usize, asset_server: &AssetServer, commands: &mut Commands) {
let half_width = (((n as f32).powf(1.0 / 3.0) - 1.0) / 2.0) as i32;
let scene = asset_server.load("models/PlaneEngine/scene.gltf#Scene0");
let width = -half_width..=half_width;
for x in width.clone() {
for y in width.clone() {
for z in width.clone() {
commands.spawn((
SceneRoot(scene.clone()),
Transform::from_translation(IVec3::new(x, y, z).as_vec3() * 2.0)
.with_scale(Vec3::splat(1.)),
));
}
}
}
}