feat: initial porting to egui

Former-commit-id: 9d3753be324466c78bf14fcc14e89fc414812f4a
This commit is contained in:
Muhammad Nauman Raza 2023-12-02 14:22:05 +00:00
parent 8f2fa51b8b
commit 905524512d
3 changed files with 189 additions and 115 deletions

117
\ Normal file
View file

@ -0,0 +1,117 @@
use bevy::{
core_pipeline::{
tonemapping::Tonemapping,
},
window::*,
prelude::*,
};
use bevy_egui::{egui, EguiContexts, EguiPlugin};
use std::collections::HashMap;
use lazy_static::lazy_static;
mod helpers;
use crate::helpers::*;
const VERSION: &str = env!("CARGO_PKG_VERSION");
const PKGNAME: &str = env!("CARGO_PKG_NAME");
// Create a map of the Hypernova colorscheme
lazy_static!{
static ref HYPERNOVA: HashMap<&'static str, (u8, u8, u8)> = vec![
("BLACK", (13, 13, 15)),
("DARK_GRAY", (21, 21, 23)),
("GRAY", (39, 39, 43)),
("LIGHT_GRAY", (69, 68, 73)),
("SUBTEXT", (217, 208, 215)),
("WHITE", (236, 229, 234)),
("RED", (240, 105, 105)),
("MAGENTA", (232, 135, 187)),
("PURPLE", (162, 146, 232)),
("BLUE", (120, 175, 196)),
("CYAN", (126, 230, 174)),
("GREEN", (145, 214, 92)),
("YELLOW", (217, 213, 100)),
].iter().copied().collect();
}
fn main() {
App::new()
.add_plugins(
(
DefaultPlugins.set(WindowPlugin {
primary_window: Some(Window {
title: format!("{} {}", titlecase(PKGNAME), VERSION).into(),
mode: WindowMode::Fullscreen,
..default()
}),
..default()
}),
EguiPlugin
)
)
.add_systems(Startup,
(setup, setup_ui))
.add_systems(Update, render_ui)
.run();
}
// Bevy engine setup
fn setup(mut commands: Commands) {
commands.spawn(
Camera2dBundle {
camera: Camera {
hdr: true,
..default()
},
tonemapping: Tonemapping::TonyMcMapface,
..default()
}
);
}
// On startup: setup some UI components
fn setup_ui(
mut contexts: EguiContexts,
) {
// Set Victor Mono as the default custom font
let mut fonts = egui::FontDefinitions::default();
fonts.font_data.insert("victor_mono".to_owned(),
egui::FontData::from_static(include_bytes!("../assets/fonts/VictorMono-Regular.otf")));
fonts.families.get_mut(&egui::FontFamily::Proportional).unwrap()
.insert(0, "victor_mono".to_owned());
contexts.ctx_mut().set_fonts(fonts);
let mut username_text: String = "Username".to_string();
}
// On update: render the UI
fn render_ui(
mut contexts: EguiContexts,
mut windows: Query<&mut Window>,
) {
let window = windows.single_mut();
let window_width = window.resolution.width();
let window_height = window.resolution.height();
egui::Window::new("Login")
.anchor(egui::Align2::CENTER_CENTER, egui::Vec2::new(0., 0.))
.resizable(false)
.title_bar(false)
.show(contexts.ctx_mut(), |ui| {
ui.set_width(window_width / 2.5);
ui.set_height(window_height / 3.);
ui.with_layout(egui::Layout::top_down(egui::Align::Center), |ui| {
let purple = HYPERNOVA.get("PURPLE").unwrap();
let purple = egui::Color32::from_rgb(purple.0, purple.1, purple.2);
ui.heading(egui::RichText::new("Login").size(30.).color(purple));
let username = egui::TextEdit::singleline(&mut username_text);
let output = username.show(ui);
});
});
}

View file

@ -1,5 +1,3 @@
use crate::helpers;
pub fn titlecase(s: &str) -> String { pub fn titlecase(s: &str) -> String {
let mut c = s.chars(); let mut c = s.chars();
match c.next() { match c.next() {

View file

@ -1,13 +1,9 @@
use bevy::{ use bevy::{core_pipeline::tonemapping::Tonemapping, prelude::*, window::*};
core_pipeline::{
tonemapping::Tonemapping, use bevy_egui::{egui, EguiContexts, EguiPlugin};
},
window::*,
prelude::*,
winit::WinitSettings,
};
use std::collections::HashMap;
use lazy_static::lazy_static; use lazy_static::lazy_static;
use std::collections::HashMap;
mod helpers; mod helpers;
use crate::helpers::*; use crate::helpers::*;
@ -16,29 +12,30 @@ const VERSION: &str = env!("CARGO_PKG_VERSION");
const PKGNAME: &str = env!("CARGO_PKG_NAME"); const PKGNAME: &str = env!("CARGO_PKG_NAME");
// Create a map of the Hypernova colorscheme // Create a map of the Hypernova colorscheme
lazy_static!{ lazy_static! {
static ref HYPERNOVA: HashMap<&'static str, Color> = vec![ static ref HYPERNOVA: HashMap<&'static str, (u8, u8, u8)> = vec![
("BLACK", Color::hex("0d0d0f").unwrap()), ("BLACK", (13, 13, 15)),
("DARK_GRAY", Color::hex("151517").unwrap()), ("DARK_GRAY", (21, 21, 23)),
("GRAY", Color::hex("27272b").unwrap()), ("GRAY", (39, 39, 43)),
("LIGHT_GRAY", Color::hex("454449").unwrap()), ("LIGHT_GRAY", (69, 68, 73)),
("SUBTEXT", Color::hex("d9d0d7").unwrap()), ("SUBTEXT", (217, 208, 215)),
("WHITE", Color::hex("ece5ea").unwrap()), ("WHITE", (236, 229, 234)),
("RED", Color::hex("f06969").unwrap()), ("RED", (240, 105, 105)),
("MAGENTA", Color::hex("e887bb").unwrap()), ("MAGENTA", (232, 135, 187)),
("PURPLE", Color::hex("a292e8").unwrap()), ("PURPLE", (162, 146, 232)),
("BLUE", Color::hex("78b9c4").unwrap()), ("BLUE", (120, 175, 196)),
("CYAN", Color::hex("7ee6ae").unwrap()), ("CYAN", (126, 230, 174)),
("GREEN", Color::hex("91d65c").unwrap()), ("GREEN", (145, 214, 92)),
("YELLOW", Color::hex("d9d564").unwrap()), ("YELLOW", (217, 213, 100)),
].iter().copied().collect(); ]
.iter()
.copied()
.collect();
} }
fn main() { fn main() {
App::new() App::new()
// Only run the app when there is user input, significantly reducing CPU/GPU usage .add_plugins((
.insert_resource(WinitSettings::desktop_app())
.add_plugins(
DefaultPlugins.set(WindowPlugin { DefaultPlugins.set(WindowPlugin {
primary_window: Some(Window { primary_window: Some(Window {
title: format!("{} {}", titlecase(PKGNAME), VERSION).into(), title: format!("{} {}", titlecase(PKGNAME), VERSION).into(),
@ -46,99 +43,61 @@ fn main() {
..default() ..default()
}), }),
..default() ..default()
}) }),
) EguiPlugin,
.add_systems( ))
Startup, .add_systems(Startup, (setup, setup_ui))
(setup, setup_ui) .add_systems(Update, render_ui)
)
.run(); .run();
} }
// Bevy engine setup
fn setup(mut commands: Commands) { fn setup(mut commands: Commands) {
commands.spawn( commands.spawn(Camera2dBundle {
Camera2dBundle { camera: Camera {
camera: Camera { hdr: true,
hdr: true,
..default()
},
tonemapping: Tonemapping::TonyMcMapface,
..default() ..default()
} },
); tonemapping: Tonemapping::TonyMcMapface,
..default()
});
} }
fn setup_ui( // On startup: setup some UI components
server: Res<AssetServer>, fn setup_ui(mut contexts: EguiContexts) {
mut commands: Commands // Set Victor Mono as the default custom font
) { let mut fonts = egui::FontDefinitions::default();
let bold_font: Handle<Font> = server.load("fonts/VictorMono-Bold.otf"); fonts.font_data.insert(
let regular_font: Handle<Font> = server.load("fonts/VictorMono-Regular.otf"); "victor_mono".to_owned(),
egui::FontData::from_static(include_bytes!("../assets/fonts/VictorMono-Regular.otf")),
);
fonts
.families
.get_mut(&egui::FontFamily::Proportional)
.unwrap()
.insert(0, "victor_mono".to_owned());
contexts.ctx_mut().set_fonts(fonts);
}
let title_style = TextStyle { // On update: render the UI
font: bold_font.clone(), fn render_ui(mut contexts: EguiContexts, mut windows: Query<&mut Window>) {
font_size: 70., let window = windows.single_mut();
color: HYPERNOVA.get("WHITE").copied().unwrap(), let window_width = window.resolution.width();
}; let window_height = window.resolution.height();
let login_style = TextStyle {
font: bold_font.clone(),
font_size: 30.,
color: HYPERNOVA.get("PURPLE").copied().unwrap(),
};
commands egui::Window::new("Login")
.spawn(NodeBundle { .anchor(egui::Align2::CENTER_CENTER, egui::Vec2::new(0., 0.))
style: Style { .resizable(false)
width: Val::Percent(100.), .title_bar(false)
height: Val::Percent(100.0), .show(contexts.ctx_mut(), |ui| {
flex_direction: FlexDirection::Column, ui.set_width(window_width / 2.5);
align_items: AlignItems::Center, ui.set_height(window_height / 3.);
..default()
}, ui.with_layout(egui::Layout::top_down(egui::Align::Center), |ui| {
background_color: BackgroundColor(HYPERNOVA.get("DARK_GRAY").copied().unwrap()), let purple = HYPERNOVA.get("PURPLE").unwrap();
..default() let purple = egui::Color32::from_rgb(purple.0, purple.1, purple.2);
})
.with_children(|parent| { ui.heading(egui::RichText::new("Login").size(30.).color(purple));
parent });
.spawn(TextBundle::from_section("Ambition", title_style.clone())
.with_text_alignment(TextAlignment::Center)
.with_style(Style {
position_type: PositionType::Absolute,
margin: UiRect {
top: Val::Vh(10.),
..default()
},
..default()
})
);
parent
.spawn(NodeBundle {
style: Style {
flex_direction: FlexDirection::Column,
align_items: AlignItems::Center,
width: Val::Percent(50.),
height: Val::Percent(40.),
margin: UiRect {
top: Val::Vh(30.),
..default()
},
padding: UiRect {
top: Val::Percent(2.),
..default()
},
..default()
},
background_color: BackgroundColor(HYPERNOVA.get("GRAY").copied().unwrap()),
..default()
})
.with_children(|parent| {
parent
.spawn(TextBundle::from_section("Login", login_style.clone())
.with_text_alignment(TextAlignment::Center)
.with_style(Style {
position_type: PositionType::Absolute,
..default()
}));
});
}); });
} }