diff --git a/Cargo.lock b/Cargo.lock index fd0fad60e7..0b715a2d72 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1372,6 +1372,7 @@ version = "0.1.0" dependencies = [ "bevy", "bevy-inspector-egui", + "bevy_egui", "bevy_mod_picking", "bevy_transform_gizmo", ] @@ -9961,7 +9962,7 @@ version = "1.6.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "97fee6b57c6a41524a810daee9286c02d7752c4253064d0b05472833a438f675" dependencies = [ - "cfg-if 1.0.0", + "cfg-if 0.1.10", "static_assertions", ] @@ -10317,9 +10318,9 @@ checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" [[package]] name = "wasm-bindgen" -version = "0.2.84" +version = "0.2.87" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "31f8dcbc21f30d9b8f2ea926ecb58f6b91192c17e9d33594b3df58b2007ca53b" +checksum = "7706a72ab36d8cb1f80ffbf0e071533974a60d0a308d01a5d0375bf60499a342" dependencies = [ "cfg-if 1.0.0", "wasm-bindgen-macro", @@ -10327,16 +10328,16 @@ dependencies = [ [[package]] name = "wasm-bindgen-backend" -version = "0.2.84" +version = "0.2.87" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95ce90fd5bcc06af55a641a86428ee4229e44e07033963a2290a8e241607ccb9" +checksum = "5ef2b6d3c510e9625e5fe6f509ab07d66a760f0885d858736483c32ed7809abd" dependencies = [ "bumpalo", "log", "once_cell", "proc-macro2", "quote", - "syn 1.0.107", + "syn 2.0.22", "wasm-bindgen-shared", ] @@ -10354,9 +10355,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.84" +version = "0.2.87" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c21f77c0bedc37fd5dc21f897894a5ca01e7bb159884559461862ae90c0b4c5" +checksum = "dee495e55982a3bd48105a7b947fd2a9b4a8ae3010041b9e0faab3f9cd028f1d" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -10364,22 +10365,22 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.84" +version = "0.2.87" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2aff81306fcac3c7515ad4e177f521b5c9a15f2b08f4e32d823066102f35a5f6" +checksum = "54681b18a46765f095758388f2d0cf16eb8d4169b639ab575a8f5693af210c7b" dependencies = [ "proc-macro2", "quote", - "syn 1.0.107", + "syn 2.0.22", "wasm-bindgen-backend", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-shared" -version = "0.2.84" +version = "0.2.87" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0046fef7e28c3804e5e38bfa31ea2a0f73905319b677e57ebe37e49358989b5d" +checksum = "ca6ad05a4870b2bf5fe995117d3728437bd27d7cd5f06f13c17443ef369775a1" [[package]] name = "wasm-streams" diff --git a/crates/programs/bevy-experiments/Cargo.toml b/crates/programs/bevy-experiments/Cargo.toml index 309aaf0d97..f6a9a9fcbb 100644 --- a/crates/programs/bevy-experiments/Cargo.toml +++ b/crates/programs/bevy-experiments/Cargo.toml @@ -10,7 +10,9 @@ bevy = "0.10.1" bevy_transform_gizmo = "0.7" bevy_mod_picking = { version = "0.13", features=["backend_raycast"]} bevy-inspector-egui = {version = "0.18.3", features=["highlight_changes"]} +bevy_egui = { version = "0.20.3", default-features=false, features=["default_fonts"]} -#[profile.release] -#opt-level = "z" -#lto = "fat" +[profile.release] +opt-level = "z" +lto = "fat" +codegen-units = 1 diff --git a/crates/programs/bevy-experiments/assets/cameraProxy.glb b/crates/programs/bevy-experiments/assets/cameraProxy.glb new file mode 100644 index 0000000000..209f63e1a8 Binary files /dev/null and b/crates/programs/bevy-experiments/assets/cameraProxy.glb differ diff --git a/crates/programs/bevy-experiments/index.html b/crates/programs/bevy-experiments/index.html index c256fcca28..83d43e5edd 100644 --- a/crates/programs/bevy-experiments/index.html +++ b/crates/programs/bevy-experiments/index.html @@ -1,5 +1,14 @@ + + + + diff --git a/crates/programs/bevy-experiments/src/camera.rs b/crates/programs/bevy-experiments/src/camera.rs index 170923711f..6404eab371 100644 --- a/crates/programs/bevy-experiments/src/camera.rs +++ b/crates/programs/bevy-experiments/src/camera.rs @@ -1,19 +1,38 @@ +use bevy::render::camera::RenderTarget; +use bevy::render::render_resource::{TextureUsages, TextureFormat, TextureDimension, Extent3d, TextureDescriptor}; use bevy::window::CursorGrabMode; use bevy::{input::mouse::MouseMotion, prelude::*}; use bevy_mod_picking::prelude::RaycastPickCamera; +use bevy_transform_gizmo::GizmoTransformable; use std::f32::consts::*; use std::fmt; pub(crate) const RADIANS_PER_DOT: f32 = 1.0 / 180.0; +const RENDER_WIDTH: u32 = 1920; +const RENDER_HEIGHT: u32 = 1080; + +#[derive(Component)] +pub(crate) struct RenderCam; + +#[derive(Component)] +pub(crate) struct ViewportCam; + pub(crate) fn camera_setup( mut commands: Commands, asset_server: Res, + mut images: ResMut>, + mut materials: ResMut>, ) { - commands.spawn(( + // viewport camera + commands.spawn((( Camera3dBundle { transform: Transform::from_xyz(0.3, 2.0, 5.0).looking_at(Vec3::new(0.0, 1.0, 0.0), Vec3::Y), + camera: Camera { + order: 0, + ..default() + }, ..default() }, EnvironmentMapLight { @@ -23,7 +42,70 @@ pub(crate) fn camera_setup( RaycastPickCamera::default(), bevy_transform_gizmo::GizmoPickSource::default(), CameraController::default(), - )); + ), ViewportCam)); + + + + // render cam + + + let output_texture_handle = { + let size = Extent3d { + width: RENDER_WIDTH, + height: RENDER_HEIGHT, + ..default() + }; + let mut export_texture = Image { + texture_descriptor: TextureDescriptor { + label: None, + size, + dimension: TextureDimension::D2, + format: TextureFormat::Rgba8UnormSrgb, + mip_level_count: 1, + sample_count: 1, + usage: TextureUsages::COPY_DST + | TextureUsages::COPY_SRC + | TextureUsages::RENDER_ATTACHMENT, + view_formats: &[], + }, + ..default() + }; + export_texture.resize(size); + images.add(export_texture) + }; + + + let camera_proxy_mesh = asset_server.load("cameraProxy.glb#Mesh0/Primitive0"); + let camera_proxy_mat = materials.add(StandardMaterial { + base_color: Color::BLACK, + ..default() + }); + commands.spawn(((MaterialMeshBundle:: { + mesh: camera_proxy_mesh, + material: camera_proxy_mat, + transform: Transform::from_xyz(0.0, 2.0, 5.0) + .with_rotation(Quat::from_rotation_x(TAU/2.0)) + .with_scale(Vec3::new(0.2, 0.2, 0.2)), + ..default() + }), GizmoTransformable)) + .with_children(|parent| { + parent.spawn((( + Camera3dBundle { + transform: Transform::from_xyz(0.0, 0.0, 2.0).with_rotation(Quat::from_rotation_x(TAU/2.0)), + camera: Camera { + order: 1, + target: RenderTarget::Image(output_texture_handle.clone()), + ..default() + }, + ..default() + }, + EnvironmentMapLight { + diffuse_map: asset_server.load("pisa_diffuse_rgb9e5_zstd.ktx2"), + specular_map: asset_server.load("pisa_specular_rgb9e5_zstd.ktx2"), + }, + ), RenderCam)); + }); + } #[derive(Component)] @@ -61,7 +143,7 @@ impl Default for CameraController { key_up: KeyCode::E, key_down: KeyCode::Q, key_run: KeyCode::LShift, - mouse_key_enable_mouse: MouseButton::Left, + mouse_key_enable_mouse: MouseButton::Right, keyboard_key_enable_mouse: KeyCode::M, walk_speed: 5.0, run_speed: 15.0, @@ -206,3 +288,12 @@ fn camera_controller( } } } + +pub(crate) struct SnapToRenderCam; + +pub(crate) fn snap_to_render_cam(mut viewport_query: Query<&mut Transform, (With, Without)>, mut render_query: Query<&GlobalTransform, (With, Without)>) { + let view_tran: &mut Transform = &mut viewport_query.get_single_mut().unwrap(); + let rend_tran: &GlobalTransform = render_query.get_single_mut().unwrap(); + *view_tran = (*rend_tran).into(); +} + diff --git a/crates/programs/bevy-experiments/src/main.rs b/crates/programs/bevy-experiments/src/main.rs index 807014565a..e15693fb59 100644 --- a/crates/programs/bevy-experiments/src/main.rs +++ b/crates/programs/bevy-experiments/src/main.rs @@ -1,5 +1,5 @@ use bevy::{ - prelude::*, + prelude::*, window::{PresentMode, WindowMode}, }; //use bevy_inspector_egui::quick::WorldInspectorPlugin; @@ -9,22 +9,37 @@ mod skybox; mod camera; mod animation; mod light; +mod ui; use bevy_mod_picking::{prelude::*, DefaultPickingPlugins}; -use bevy_transform_gizmo::{TransformGizmoPlugin}; +use bevy_transform_gizmo::TransformGizmoPlugin; +use::bevy_egui::EguiPlugin; use gizmo::{make_pickable, gizmo_system, SelectRoot, set_selection}; use light::light_setup; -use camera::{camera_setup, CameraControllerPlugin}; +use camera::{camera_setup, snap_to_render_cam, CameraControllerPlugin, SnapToRenderCam}; use animation::{animation_setup, animation_system}; use skybox::skybox_setup; +use ui::ui_system; fn main() { App::new() - .add_plugins(DefaultPlugins) + .add_plugins(DefaultPlugins.set(WindowPlugin { + primary_window: Some(Window { + present_mode: PresentMode::AutoNoVsync, // Reduces input lag. + fit_canvas_to_parent: true, + //mode: WindowMode::Fullscreen, + ..default() + }), + ..default() + })) .add_plugin(CameraControllerPlugin) - .add_plugins(DefaultPickingPlugins.build().disable::().disable::()) + .add_plugins(DefaultPickingPlugins.build() + .disable::() + .disable::() + ) .add_plugin(TransformGizmoPlugin::default()) + .add_plugin(EguiPlugin) //.add_plugin(WorldInspectorPlugin::new()) .add_startup_system(setup) .add_startup_system(light_setup) @@ -35,8 +50,12 @@ fn main() { .add_system(animation_system) .add_system(make_pickable) .add_event::() + .add_event::() .add_system(set_selection.run_if(on_event::())) - .run(); + .add_system(ui_system) + .add_system(snap_to_render_cam.run_if(on_event::())) + .run(); + } #[derive(Component)] @@ -60,11 +79,9 @@ fn setup(mut meshes: ResMut>, mut materials: ResMut { + commands.spawn(MaterialMeshBundle:: { mesh: floor, material: floor_mat, ..default() - })); + }); } - - diff --git a/crates/programs/bevy-experiments/src/ui.rs b/crates/programs/bevy-experiments/src/ui.rs new file mode 100644 index 0000000000..e8c37e6333 --- /dev/null +++ b/crates/programs/bevy-experiments/src/ui.rs @@ -0,0 +1,15 @@ +use bevy::prelude::*; +use bevy_egui::{egui, EguiContexts}; +use crate::camera::SnapToRenderCam; + +pub(crate) fn ui_system(mut ev: EventWriter::, mut contexts: EguiContexts) { + egui::Area::new("") + .fixed_pos(egui::pos2(5.0, 5.0)) + .show(contexts.ctx_mut(), |ui| { + if ui.button("Snap To Render Camera").clicked() { + ev.send(SnapToRenderCam); + } + } + ); +} +