From 2ad50f7ac8926869cf7789c9e26b882b2ade4a0b Mon Sep 17 00:00:00 2001 From: Amatsugu Date: Sun, 1 Dec 2024 17:36:39 -0500 Subject: [PATCH] correctly setup bevy_lunex 2d/3d composite --- game/main/src/camera_system/camera_plugin.rs | 1 - game/main/src/phos.rs | 4 +- game/main/src/ui/game/build_ui.rs | 26 +----- game/main/src/ui/lunex_setup_plugin.rs | 84 ++++++++++++++++++++ game/main/src/ui/mod.rs | 1 + game/shared/src/animation_plugin.rs | 2 +- 6 files changed, 92 insertions(+), 26 deletions(-) create mode 100644 game/main/src/ui/lunex_setup_plugin.rs diff --git a/game/main/src/camera_system/camera_plugin.rs b/game/main/src/camera_system/camera_plugin.rs index 158acbf..5f23920 100644 --- a/game/main/src/camera_system/camera_plugin.rs +++ b/game/main/src/camera_system/camera_plugin.rs @@ -61,7 +61,6 @@ fn setup(mut commands: Commands, mut msaa: ResMut) { MainCamera, DepthPrepass, PhosOrbitCamera::default(), - MainUi, )) // .insert(RenderLayers::layer(0)) .insert(TemporalAntiAliasBundle::default()); diff --git a/game/main/src/phos.rs b/game/main/src/phos.rs index 0e43288..1b1db98 100644 --- a/game/main/src/phos.rs +++ b/game/main/src/phos.rs @@ -2,6 +2,7 @@ use crate::camera_system::components::PhosCamera; use crate::map_rendering::map_init::MapInitPlugin; use crate::map_rendering::render_distance_system::RenderDistancePlugin; use crate::ui::game::build_ui::BuildUiPlugin; +use crate::ui::lunex_setup_plugin::LunexSetupPlugin; use crate::utlis::editor_plugin::EditorPlugin; use crate::utlis::tile_selection_plugin::TileSelectionPlugin; use crate::{camera_system::camera_plugin::PhosCameraPlugin, utlis::debug_plugin::DebugPlugin}; @@ -40,7 +41,8 @@ impl Plugin for PhosGamePlugin { RenderDistancePlugin, BuildingPugin, SimpleAnimationPlugin, - // BuildUiPlugin, + LunexSetupPlugin, + BuildUiPlugin, UnitsPlugin, DespawnPuglin, TileSelectionPlugin, diff --git a/game/main/src/ui/game/build_ui.rs b/game/main/src/ui/game/build_ui.rs index 78ec27f..2adede1 100644 --- a/game/main/src/ui/game/build_ui.rs +++ b/game/main/src/ui/game/build_ui.rs @@ -1,29 +1,15 @@ -use bevy::{prelude::*, render::view::RenderLayers}; +use bevy::prelude::*; use bevy_lunex::prelude::*; -use shared::tags::MainCamera; pub struct BuildUiPlugin; impl Plugin for BuildUiPlugin { fn build(&self, app: &mut App) { - // app.add_plugins(UiDefaultPlugins) - // .add_plugins(UiDebugPlugin::::new()); - app.add_systems(PostStartup, setup_ui); } } -fn setup_ui(mut commands: Commands, assets: Res) { - commands - .spawn(( - Camera2dBundle { - transform: Transform::from_xyz(0.0, 0.0, 1000.0), - ..default() - }, - MainUi, - )) - .insert(RenderLayers::layer(1)); - +fn setup_ui(mut commands: Commands, assets: Res, mut material: ResMut>) { commands .spawn(( UiTreeBundle:: { @@ -32,23 +18,17 @@ fn setup_ui(mut commands: Commands, assets: Res) { }, Name::new("Build UI"), SourceFromCamera, - RenderLayers::layer(1), )) .with_children(|ui| { ui.spawn(( UiLink::::path("Root"), - UiLayout::boundary() - .pos1(Ab(20.0)) - .pos2(Rl(100.0) - Ab(20.0)) - .pack::(), - RenderLayers::layer(1), + UiLayout::boundary().pos1(Rl(20.0)).pos2(Rl(80.0)).pack::(), )); ui.spawn(( UiLink::::path("Root/Rect"), UiLayout::solid().size((Ab(1920.0), Ab(1080.0))).pack::(), UiImage2dBundle::from(assets.load("textures/world/test2.png")), - RenderLayers::layer(1), )); }); } diff --git a/game/main/src/ui/lunex_setup_plugin.rs b/game/main/src/ui/lunex_setup_plugin.rs new file mode 100644 index 0000000..741f88f --- /dev/null +++ b/game/main/src/ui/lunex_setup_plugin.rs @@ -0,0 +1,84 @@ +use bevy::{ + prelude::*, + render::render_resource::{Extent3d, TextureDescriptor, TextureDimension, TextureFormat, TextureUsages}, + window::PrimaryWindow, +}; +use bevy_lunex::prelude::*; +use shared::tags::MainCamera; + +pub struct LunexSetupPlugin; + +impl Plugin for LunexSetupPlugin { + fn build(&self, app: &mut App) { + app.add_plugins(UiDefaultPlugins); + + #[cfg(debug_assertions)] + app.add_plugins(UiDebugPlugin::::new()); + app.add_systems(PostStartup, setup_cameras); + } +} + +fn setup_cameras( + mut commands: Commands, + assets: Res, + mut camera_query: Query<&mut Camera, With>, + window_query: Query<&Window, With>, +) { + //Prepare Render Texture + let win = window_query.single(); + let size = Extent3d { + width: win.physical_width(), + height: win.physical_height(), + ..default() + }; + + let mut image = Image { + texture_descriptor: TextureDescriptor { + label: None, + size, + dimension: TextureDimension::D2, + format: TextureFormat::Bgra8UnormSrgb, + mip_level_count: 1, + sample_count: 1, + usage: TextureUsages::TEXTURE_BINDING | TextureUsages::COPY_DST | TextureUsages::RENDER_ATTACHMENT, + view_formats: &[], + }, + ..default() + }; + image.resize(size); + + //Configure 3D Camera + let mut cam = camera_query.single_mut(); + let render_image = assets.add(image); + cam.target = render_image.clone().into(); + cam.order = -1; + cam.clear_color = ClearColorConfig::Custom(LinearRgba::NONE.into()); + + //Add Render Texture image + commands + .spawn((UiTreeBundle::::from(UiTree::new2d("Main UI")), SourceFromCamera)) + .with_children(|ui| { + ui.spawn(( + UiLink::::path("Root"), + UiLayout::window_full().size((win.width(), win.height())).pack::(), + )); + ui.spawn(( + UiLink::::path("Root/Camera3D"), + UiLayout::solid() + .size((win.width(), win.height())) + .scaling(Scaling::Fill) + .pack::(), + UiImage2dBundle::from(render_image), + PickingPortal, + )); + }); + + //Spawn 2d UI Camera + commands.spawn(( + MainUi, + Camera2dBundle { + transform: Transform::from_xyz(0.0, 0.0, 1000.0), + ..default() + }, + )); +} diff --git a/game/main/src/ui/mod.rs b/game/main/src/ui/mod.rs index f7ee1cd..63a39c6 100644 --- a/game/main/src/ui/mod.rs +++ b/game/main/src/ui/mod.rs @@ -1 +1,2 @@ pub mod game; +pub mod lunex_setup_plugin; diff --git a/game/shared/src/animation_plugin.rs b/game/shared/src/animation_plugin.rs index 44cdd50..b0b2f6a 100644 --- a/game/shared/src/animation_plugin.rs +++ b/game/shared/src/animation_plugin.rs @@ -13,6 +13,6 @@ impl Plugin for SimpleAnimationPlugin { fn rotate(mut query: Query<(&mut Transform, &RotationAnimation)>, time: Res