From eb51d6711b9bebcba63118c4963c196f032fdb99 Mon Sep 17 00:00:00 2001 From: Paul Sajna Date: Mon, 3 Jul 2023 16:58:49 -0700 Subject: [PATCH] separate positionable render camera --- Cargo.lock | 27 ++--- crates/programs/bevy-experiments/Cargo.toml | 8 +- .../bevy-experiments/assets/cameraProxy.glb | Bin 0 -> 5872 bytes crates/programs/bevy-experiments/index.html | 9 ++ .../programs/bevy-experiments/src/camera.rs | 97 +++++++++++++++++- crates/programs/bevy-experiments/src/main.rs | 37 +++++-- crates/programs/bevy-experiments/src/ui.rs | 15 +++ 7 files changed, 164 insertions(+), 29 deletions(-) create mode 100644 crates/programs/bevy-experiments/assets/cameraProxy.glb create mode 100644 crates/programs/bevy-experiments/src/ui.rs 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 0000000000000000000000000000000000000000..209f63e1a85396c4976e806c26a2fbe07961b2c6 GIT binary patch literal 5872 zcmb7GTWlQV75<>%me7RI04WWyOam!lvzeLQ*<0{T633y2*bBA^N!`R=ugCV5^^P;U zYwQ>&n~-n^MO7=cRV9=v2viZFQngiEWb@F6z7T!5f;M9oOqnERVLO$1LRK_QYdWpQ}gpq7X?=%XAxi_1$ zx*ZfFNzr;FDJ6?3ITdclB5_$x0yh*jZ@Rf^wn)s5E-Imc0d8;F8*_uUdNS&1t zo$EI9llgLf+S$yO%VvJ0Qs(8H@JOb=d!RehYYnS6)7P_WpOBWq!a&!7&P=9n&yXmj zWjc&}aWtP}muP)<E`~t{-hN&XG~5RMZH)an4O}dQzSVa z7IH?VNH2*Ljd8dcKEa5RNT#CHO(GtRrV_FomLd{$7!wsmj1yCgM#&VFWLZ+gWGcb` zqH!Ktp5B_lZ4Dxb5mA&9@kBfoODUoxMiWXZ875|eB1aV^nMfw(R7&9}Wve`4e^+Oe z-aa~3Pa8ClmTffimsjL3Uy+}Ner0~kXpK=8X^c+({?1+dcJ*2Bc)bJf!B~efGF#U7 z>BaFf-4ZD-Cc^?-GGk-b-4*Nox4~xrW)5P4+V_T!%2K?EL(E@JOim{G4Y&Jodhs+6 zi>KoBB8Cp!4D9aih4%hgb<1~k?N^y0tr`B^?6a!NX#+2KVzz}nF&7%)|9pOaVe{M5 z>W}~Zy4Ef}{n`_n%Wng#9!^`>Q;*sTANcsCg`bc8P~BeqzSa!?^v*%eTHQQrl+=sm}7csYa5^cWlD2>n_;&GzEkaDo`cJ8h25FBHSl~|VC$?M zPD@NRTknrkPg|I0?($nBd6OCcBENq)zPu*$6*1Yy z8@%iCgJOQ>#PY{v-+FCUJT_JR{5r?l=H9O0xHT}temGumOlPmk+`4a_PrX>Pb9?gg zxexNu{2bSA=U;xm_^$c+%=6ztwsB57Z*V7>Q>NDi$*Go%_ zs?C3we-Fw3-P)S%M=9Uz#f0Y99RJ%Nby@jb4eZpGmWHhSoQM7Vn)5N=)s(ZAkNr7+ z@s^_=4fWnXzR0y%dM(A}`?YC0#9HO`)caR;aGqh(GgL3{bG^LgIq|-$xo$gtT~lm& zhBZ46&#_9eL$$SQXU%c`_WY1FmkS>4+Asg+ty*2o7e`MwKux2yw7%y``j~Xpys-GKS*;w{(FDQ`3|t&gBV7z zhyK2fjo3s#C>!bTD87j6ks+DEKI}ywc97hG-H1TNV + + + + 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); + } + } + ); +} +