mirror of
https://github.com/griffi-gh/kubi.git
synced 2024-12-26 05:38:20 -06:00
migrate loading screen to guiv2, fix bugs
This commit is contained in:
parent
a8d5b4a752
commit
c849c0bfd6
|
@ -9,5 +9,6 @@ out vec4 vtx_color;
|
||||||
|
|
||||||
void main() {
|
void main() {
|
||||||
vtx_color = color;
|
vtx_color = color;
|
||||||
gl_Position = vec4(vec2(1., -1.) * (position / resolution), 0., 1.);
|
vec2 pos2d = (vec2(2., -2.) * (position / resolution)) + vec2(-1, 1);
|
||||||
|
gl_Position = vec4(pos2d, 0., 1.);
|
||||||
}
|
}
|
||||||
|
|
|
@ -33,6 +33,8 @@ pub struct GliumUiRenderer {
|
||||||
pub program: glium::Program,
|
pub program: glium::Program,
|
||||||
pub vertex_buffer: glium::VertexBuffer<Vertex>,
|
pub vertex_buffer: glium::VertexBuffer<Vertex>,
|
||||||
pub index_buffer: glium::IndexBuffer<u32>,
|
pub index_buffer: glium::IndexBuffer<u32>,
|
||||||
|
pub vertex_count: usize,
|
||||||
|
pub index_count: usize,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl GliumUiRenderer {
|
impl GliumUiRenderer {
|
||||||
|
@ -47,6 +49,8 @@ impl GliumUiRenderer {
|
||||||
program,
|
program,
|
||||||
vertex_buffer,
|
vertex_buffer,
|
||||||
index_buffer,
|
index_buffer,
|
||||||
|
vertex_count: 0,
|
||||||
|
index_count: 0,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -68,12 +72,14 @@ impl GliumUiRenderer {
|
||||||
}
|
}
|
||||||
|
|
||||||
fn write_buffer_data(&mut self, vtx: &[Vertex], idx: &[u32]) {
|
fn write_buffer_data(&mut self, vtx: &[Vertex], idx: &[u32]) {
|
||||||
log::info!("uploading {} vertices and {} indices", vtx.len(), idx.len());
|
log::debug!("uploading {} vertices and {} indices", vtx.len(), idx.len());
|
||||||
self.ensure_buffer_size(vtx.len(), idx.len());
|
self.ensure_buffer_size(vtx.len(), idx.len());
|
||||||
self.vertex_buffer.invalidate();
|
self.vertex_buffer.invalidate();
|
||||||
self.vertex_buffer.slice_mut(0..vtx.len()).unwrap().write(vtx);
|
self.vertex_buffer.slice_mut(0..vtx.len()).unwrap().write(vtx);
|
||||||
|
self.vertex_count = vtx.len();
|
||||||
self.index_buffer.invalidate();
|
self.index_buffer.invalidate();
|
||||||
self.index_buffer.slice_mut(0..idx.len()).unwrap().write(idx);
|
self.index_buffer.slice_mut(0..idx.len()).unwrap().write(idx);
|
||||||
|
self.index_count = idx.len();
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn update(&mut self, plan: &UiDrawPlan) {
|
pub fn update(&mut self, plan: &UiDrawPlan) {
|
||||||
|
@ -83,14 +89,18 @@ impl GliumUiRenderer {
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn draw(&self, frame: &mut glium::Frame, resolution: Vec2) {
|
pub fn draw(&self, frame: &mut glium::Frame, resolution: Vec2) {
|
||||||
|
if self.index_count == 0 || self.vertex_count == 0 {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
let params = DrawParameters {
|
let params = DrawParameters {
|
||||||
blend: Blend::alpha_blending(),
|
blend: Blend::alpha_blending(),
|
||||||
..Default::default()
|
..Default::default()
|
||||||
};
|
};
|
||||||
|
|
||||||
frame.draw(
|
frame.draw(
|
||||||
&self.vertex_buffer,
|
self.vertex_buffer.slice(0..self.vertex_count).unwrap(),
|
||||||
&self.index_buffer,
|
self.index_buffer.slice(0..self.index_count).unwrap(),
|
||||||
&self.program,
|
&self.program,
|
||||||
&uniform! {
|
&uniform! {
|
||||||
resolution: resolution.to_array(),
|
resolution: resolution.to_array(),
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
use glam::{Vec2, Vec4};
|
use glam::{Vec2, Vec4};
|
||||||
use crate::{UiDirection, LayoutInfo, draw::UiDrawCommand, measure::{IsMeasurable, Response}, state::StateRepo, UiSize};
|
use crate::{UiDirection, LayoutInfo, draw::UiDrawCommand, measure::Response, state::StateRepo, UiSize};
|
||||||
use super::UiElement;
|
use super::UiElement;
|
||||||
|
|
||||||
#[derive(Default, Clone, Copy, Debug)]
|
#[derive(Default, Clone, Copy, Debug)]
|
||||||
|
|
|
@ -48,16 +48,20 @@ impl UiElement for ProgressBar {
|
||||||
}
|
}
|
||||||
|
|
||||||
fn process(&self, measure: &Response, state: &mut StateRepo, layout: &LayoutInfo, draw: &mut Vec<UiDrawCommand>) {
|
fn process(&self, measure: &Response, state: &mut StateRepo, layout: &LayoutInfo, draw: &mut Vec<UiDrawCommand>) {
|
||||||
draw.push(UiDrawCommand::Rectangle {
|
let value = self.value.clamp(0., 1.);
|
||||||
position: layout.position,
|
if value < 1. {
|
||||||
size: measure.desired_size,
|
draw.push(UiDrawCommand::Rectangle {
|
||||||
color: self.color_background
|
position: layout.position,
|
||||||
});
|
size: measure.desired_size,
|
||||||
|
color: self.color_background
|
||||||
draw.push(UiDrawCommand::Rectangle {
|
});
|
||||||
position: layout.position,
|
}
|
||||||
size: measure.desired_size * vec2(self.value, 1.0),
|
if value > 0. {
|
||||||
color: self.color_foreground
|
draw.push(UiDrawCommand::Rectangle {
|
||||||
});
|
position: layout.position,
|
||||||
|
size: measure.desired_size * vec2(value, 1.0),
|
||||||
|
color: self.color_foreground
|
||||||
|
});
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -87,9 +87,9 @@ pub enum UiDirection {
|
||||||
Horizontal,
|
Horizontal,
|
||||||
}
|
}
|
||||||
|
|
||||||
struct LayoutInfo {
|
pub struct LayoutInfo {
|
||||||
///Not availabe during measuring step
|
///Not availabe during measuring step
|
||||||
position: Vec2,
|
pub position: Vec2,
|
||||||
max_size: Vec2,
|
pub max_size: Vec2,
|
||||||
direction: UiDirection,
|
pub direction: UiDirection,
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,13 +1,5 @@
|
||||||
use glam::Vec2;
|
use glam::Vec2;
|
||||||
|
|
||||||
#[derive(Clone, Copy, Default, PartialEq, Eq, PartialOrd, Ord)]
|
|
||||||
pub enum IsMeasurable {
|
|
||||||
#[default]
|
|
||||||
No,
|
|
||||||
Maybe,
|
|
||||||
Yes
|
|
||||||
}
|
|
||||||
|
|
||||||
pub struct Response {
|
pub struct Response {
|
||||||
pub desired_size: Vec2
|
pub desired_size: Vec2
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,60 +1,30 @@
|
||||||
use shipyard::{UniqueView, UniqueViewMut, Workload, IntoWorkload, EntityId, Unique, AllStoragesViewMut, ViewMut, Get, SystemModificator, track};
|
use kubi_ui::element::progress_bar::ProgressBar;
|
||||||
|
use shipyard::{UniqueView, UniqueViewMut, Workload, NonSendSync, IntoWorkload};
|
||||||
use winit::keyboard::KeyCode;
|
use winit::keyboard::KeyCode;
|
||||||
use glam::{Mat3, vec2};
|
|
||||||
use crate::{
|
use crate::{
|
||||||
world::ChunkStorage,
|
world::ChunkStorage,
|
||||||
state::{GameState, NextState, is_changing_state},
|
state::{GameState, NextState},
|
||||||
transform::Transform2d,
|
rendering::WindowSize,
|
||||||
legacy_gui::{
|
input::RawKbmInputState,
|
||||||
LegacyGuiComponent,
|
guiv2_integration::UiState,
|
||||||
progressbar::ProgressbarComponent
|
|
||||||
},
|
|
||||||
rendering::{WindowSize, if_resized},
|
|
||||||
input::RawKbmInputState,
|
|
||||||
};
|
};
|
||||||
|
|
||||||
#[derive(Unique, Clone, Copy)]
|
fn render_progressbar(
|
||||||
struct ProgressbarId(EntityId);
|
mut ui: NonSendSync<UniqueViewMut<UiState>>,
|
||||||
|
|
||||||
fn spawn_loading_screen(
|
|
||||||
mut storages: AllStoragesViewMut,
|
|
||||||
) {
|
|
||||||
let size = *storages.borrow::<UniqueView<WindowSize>>().unwrap();
|
|
||||||
let entity = storages.add_entity((
|
|
||||||
LegacyGuiComponent,
|
|
||||||
Transform2d(Mat3::from_scale_angle_translation(
|
|
||||||
vec2(size.0.x as f32, 16.),
|
|
||||||
0.,
|
|
||||||
vec2(0., 0.)
|
|
||||||
)),
|
|
||||||
ProgressbarComponent {
|
|
||||||
progress: 0.33
|
|
||||||
},
|
|
||||||
));
|
|
||||||
storages.add_unique(ProgressbarId(entity));
|
|
||||||
}
|
|
||||||
|
|
||||||
fn resize_progress_bar(
|
|
||||||
size: UniqueView<WindowSize>,
|
|
||||||
bar: UniqueView<ProgressbarId>,
|
|
||||||
mut transforms: ViewMut<Transform2d, track::All>
|
|
||||||
) {
|
|
||||||
let mut trans = (&mut transforms).get(bar.0).unwrap();
|
|
||||||
trans.0.x_axis.x = size.0.x as f32;
|
|
||||||
}
|
|
||||||
|
|
||||||
fn update_progress_bar_progress (
|
|
||||||
world: UniqueView<ChunkStorage>,
|
world: UniqueView<ChunkStorage>,
|
||||||
mut bar: ViewMut<ProgressbarComponent>,
|
size: UniqueView<WindowSize>
|
||||||
eid: UniqueView<ProgressbarId>,
|
|
||||||
) {
|
) {
|
||||||
let mut bar = (&mut bar).get(eid.0).unwrap();
|
let value = {
|
||||||
let loaded = world.chunks.iter().fold(0, |acc, (&_, chunk)| {
|
let loaded = world.chunks.iter().fold(0, |acc, (&_, chunk)| {
|
||||||
acc + chunk.desired_state.matches_current(chunk.current_state) as usize
|
acc + chunk.desired_state.matches_current(chunk.current_state) as usize
|
||||||
});
|
});
|
||||||
let total = world.chunks.len();
|
let total = world.chunks.len();
|
||||||
let progress = loaded as f32 / total as f32;
|
loaded as f32 / total as f32
|
||||||
bar.progress = progress;
|
};
|
||||||
|
ui.ui.add(
|
||||||
|
ProgressBar { value, ..Default::default() },
|
||||||
|
size.0.as_vec2()
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
fn switch_to_ingame_if_loaded(
|
fn switch_to_ingame_if_loaded(
|
||||||
|
@ -81,24 +51,10 @@ fn override_loading(
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn despawn_loading_screen_if_switching_state(
|
|
||||||
mut storages: AllStoragesViewMut,
|
|
||||||
) {
|
|
||||||
let state = storages.borrow::<UniqueView<NextState>>().unwrap().0.unwrap();
|
|
||||||
if state != GameState::LoadingWorld {
|
|
||||||
let progress_bar = storages.borrow::<UniqueView<ProgressbarId>>().unwrap().0;
|
|
||||||
storages.delete_entity(progress_bar);
|
|
||||||
storages.remove_unique::<ProgressbarId>().unwrap();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn update_loading_screen() -> Workload {
|
pub fn update_loading_screen() -> Workload {
|
||||||
(
|
(
|
||||||
spawn_loading_screen.run_if_missing_unique::<ProgressbarId>(),
|
render_progressbar,
|
||||||
resize_progress_bar.run_if(if_resized),
|
|
||||||
update_progress_bar_progress,
|
|
||||||
override_loading,
|
override_loading,
|
||||||
switch_to_ingame_if_loaded,
|
switch_to_ingame_if_loaded,
|
||||||
despawn_loading_screen_if_switching_state.run_if(is_changing_state),
|
|
||||||
).into_sequential_workload()
|
).into_sequential_workload()
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue