mirror of
https://github.com/griffi-gh/kubi.git
synced 2024-12-22 11:58:21 -06:00
restructure stuff
This commit is contained in:
parent
a63cc4bd17
commit
00edf0d272
|
@ -1,15 +1,12 @@
|
|||
use std::{io::{BufReader, prelude::*}, path::Path};
|
||||
use hui::{text::FontHandle, UiInstance};
|
||||
use hui::UiInstance;
|
||||
use hui_glium::GliumUiRenderer;
|
||||
use shipyard::{AllStoragesView, Unique, UniqueView, NonSendSync, UniqueViewMut};
|
||||
use crate::{filesystem::AssetManager, rendering::{RenderTarget, Renderer, WindowSize}};
|
||||
use crate::rendering::{RenderTarget, Renderer, WindowSize};
|
||||
|
||||
#[derive(Unique)]
|
||||
pub struct UiState {
|
||||
pub hui: UiInstance,
|
||||
pub renderer: GliumUiRenderer,
|
||||
//HACK: This is a temporary solution, i don't think fonts should be stored here
|
||||
pub fonts: Vec<FontHandle>,
|
||||
pub renderer: GliumUiRenderer
|
||||
}
|
||||
|
||||
pub fn kubi_ui_init(
|
||||
|
@ -19,22 +16,9 @@ pub fn kubi_ui_init(
|
|||
storages.add_unique_non_send_sync(UiState {
|
||||
hui: UiInstance::new(),
|
||||
renderer: GliumUiRenderer::new(&renderer.display),
|
||||
fonts: vec![],
|
||||
});
|
||||
}
|
||||
|
||||
//TODO: Use prefab system for this
|
||||
pub fn kubi_ui_load_assets(
|
||||
asset_manager: UniqueView<AssetManager>,
|
||||
mut ui: NonSendSync<UniqueViewMut<UiState>>
|
||||
) {
|
||||
let asset_handle = asset_manager.open_asset(Path::new("fonts/Crisp.ttf")).unwrap();
|
||||
let mut font_data = vec![];
|
||||
BufReader::new(asset_handle).read_to_end(&mut font_data).unwrap();
|
||||
let font_handle = ui.hui.add_font_from_bytes(&font_data);
|
||||
ui.fonts.push(font_handle);
|
||||
}
|
||||
|
||||
pub fn kubi_ui_begin(
|
||||
mut ui: NonSendSync<UniqueViewMut<UiState>>
|
||||
) {
|
||||
|
|
|
@ -13,7 +13,13 @@ use winit::{
|
|||
use glam::vec3;
|
||||
use std::time::Instant;
|
||||
|
||||
pub use kubi_shared::transform;
|
||||
pub(crate) use kubi_shared::transform;
|
||||
|
||||
mod ui {
|
||||
pub(crate) mod loading_screen;
|
||||
pub(crate) mod connecting_screen;
|
||||
}
|
||||
pub(crate) use ui::{loading_screen, connecting_screen};
|
||||
|
||||
pub(crate) mod rendering;
|
||||
pub(crate) mod world;
|
||||
|
@ -33,8 +39,6 @@ pub(crate) mod hui_integration;
|
|||
pub(crate) mod networking;
|
||||
pub(crate) mod init;
|
||||
pub(crate) mod color;
|
||||
pub(crate) mod loading_screen;
|
||||
pub(crate) mod connecting_screen;
|
||||
pub(crate) mod fixed_timestamp;
|
||||
pub(crate) mod filesystem;
|
||||
pub(crate) mod client_physics;
|
||||
|
@ -77,7 +81,7 @@ use control_flow::{exit_on_esc, insert_control_flow_unique, RequestExit};
|
|||
use state::{is_ingame, is_ingame_or_loading, is_loading, init_state, update_state, is_connecting};
|
||||
use networking::{update_networking, update_networking_late, is_multiplayer, disconnect_on_exit, is_singleplayer};
|
||||
use init::initialize_from_args;
|
||||
use hui_integration::{kubi_ui_begin, kubi_ui_draw, kubi_ui_end, kubi_ui_init, kubi_ui_load_assets};
|
||||
use hui_integration::{kubi_ui_begin, kubi_ui_draw, kubi_ui_end, kubi_ui_init};
|
||||
use loading_screen::update_loading_screen;
|
||||
use connecting_screen::update_connecting_screen;
|
||||
use fixed_timestamp::init_fixed_timestamp_storage;
|
||||
|
@ -97,7 +101,6 @@ fn startup() -> Workload {
|
|||
initial_resize_event,
|
||||
init_window_size,
|
||||
kubi_ui_init,
|
||||
kubi_ui_load_assets,
|
||||
load_prefabs,
|
||||
init_primitives,
|
||||
insert_lock_state,
|
||||
|
|
|
@ -1,87 +1,103 @@
|
|||
use shipyard::{NonSendSync, UniqueView, Unique, AllStoragesView};
|
||||
use glium::{texture::{SrgbTexture2dArray, MipmapsOption}, Program};
|
||||
use kubi_shared::block::BlockTexture;
|
||||
use crate::{rendering::Renderer, filesystem::AssetManager};
|
||||
|
||||
mod texture;
|
||||
mod shaders;
|
||||
|
||||
use texture::load_texture2darray_prefab;
|
||||
use shaders::include_shader_prefab;
|
||||
|
||||
pub trait AssetPaths {
|
||||
fn file_name(self) -> &'static str;
|
||||
}
|
||||
|
||||
impl AssetPaths for BlockTexture {
|
||||
fn file_name(self) -> &'static str {
|
||||
match self {
|
||||
Self::Stone => "stone.png",
|
||||
Self::Dirt => "dirt.png",
|
||||
Self::GrassTop => "grass_top.png",
|
||||
Self::GrassSide => "grass_side.png",
|
||||
Self::Sand => "sand.png",
|
||||
Self::Bedrock => "bedrock.png",
|
||||
Self::Wood => "wood.png",
|
||||
Self::WoodTop => "wood_top.png",
|
||||
Self::Leaf => "leaf.png",
|
||||
Self::Torch => "torch.png",
|
||||
Self::TallGrass => "tall_grass.png",
|
||||
Self::Snow => "snow.png",
|
||||
Self::GrassSideSnow => "grass_side_snow.png",
|
||||
Self::Cobblestone => "cobblestone.png",
|
||||
Self::Planks => "planks.png",
|
||||
Self::WaterSolid => "solid_water.png",
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#[derive(Unique)]
|
||||
#[repr(transparent)]
|
||||
pub struct BlockTexturesPrefab(pub SrgbTexture2dArray);
|
||||
|
||||
#[derive(Unique)]
|
||||
#[repr(transparent)]
|
||||
pub struct ChunkShaderPrefab(pub Program);
|
||||
|
||||
#[derive(Unique)]
|
||||
#[repr(transparent)]
|
||||
pub struct ColoredShaderPrefab(pub Program);
|
||||
|
||||
pub fn load_prefabs(
|
||||
storages: AllStoragesView,
|
||||
renderer: NonSendSync<UniqueView<Renderer>>,
|
||||
assman: UniqueView<AssetManager>
|
||||
) {
|
||||
log::info!("Loading textures...");
|
||||
storages.add_unique_non_send_sync(BlockTexturesPrefab(
|
||||
load_texture2darray_prefab::<BlockTexture, _>(
|
||||
&assman,
|
||||
"blocks".into(),
|
||||
&renderer.display,
|
||||
MipmapsOption::AutoGeneratedMipmaps
|
||||
)
|
||||
));
|
||||
|
||||
log::info!("Compiling shaders...");
|
||||
storages.add_unique_non_send_sync(ChunkShaderPrefab(
|
||||
include_shader_prefab!(
|
||||
"world",
|
||||
"../shaders/world.vert",
|
||||
"../shaders/world.frag",
|
||||
&renderer.display
|
||||
)
|
||||
));
|
||||
storages.add_unique_non_send_sync(ColoredShaderPrefab(
|
||||
include_shader_prefab!(
|
||||
"colored",
|
||||
"../shaders/colored.vert",
|
||||
"../shaders/colored.frag",
|
||||
&renderer.display
|
||||
)
|
||||
));
|
||||
|
||||
log::info!("releasing shader compiler");
|
||||
|
||||
renderer.display.release_shader_compiler();
|
||||
}
|
||||
use std::{io::{BufReader, Read}, path::Path};
|
||||
use hui::text::FontHandle;
|
||||
use shipyard::{AllStoragesView, NonSendSync, Unique, UniqueView, UniqueViewMut};
|
||||
use glium::{texture::{SrgbTexture2dArray, MipmapsOption}, Program};
|
||||
use kubi_shared::block::BlockTexture;
|
||||
use crate::{filesystem::AssetManager, hui_integration::UiState, rendering::Renderer};
|
||||
|
||||
mod texture;
|
||||
mod shaders;
|
||||
|
||||
use texture::load_texture2darray_prefab;
|
||||
use shaders::include_shader_prefab;
|
||||
|
||||
pub trait AssetPaths {
|
||||
fn file_name(self) -> &'static str;
|
||||
}
|
||||
|
||||
impl AssetPaths for BlockTexture {
|
||||
fn file_name(self) -> &'static str {
|
||||
match self {
|
||||
Self::Stone => "stone.png",
|
||||
Self::Dirt => "dirt.png",
|
||||
Self::GrassTop => "grass_top.png",
|
||||
Self::GrassSide => "grass_side.png",
|
||||
Self::Sand => "sand.png",
|
||||
Self::Bedrock => "bedrock.png",
|
||||
Self::Wood => "wood.png",
|
||||
Self::WoodTop => "wood_top.png",
|
||||
Self::Leaf => "leaf.png",
|
||||
Self::Torch => "torch.png",
|
||||
Self::TallGrass => "tall_grass.png",
|
||||
Self::Snow => "snow.png",
|
||||
Self::GrassSideSnow => "grass_side_snow.png",
|
||||
Self::Cobblestone => "cobblestone.png",
|
||||
Self::Planks => "planks.png",
|
||||
Self::WaterSolid => "solid_water.png",
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#[derive(Unique)]
|
||||
#[repr(transparent)]
|
||||
pub struct BlockTexturesPrefab(pub SrgbTexture2dArray);
|
||||
|
||||
#[derive(Unique)]
|
||||
#[repr(transparent)]
|
||||
pub struct ChunkShaderPrefab(pub Program);
|
||||
|
||||
#[derive(Unique)]
|
||||
#[repr(transparent)]
|
||||
pub struct ColoredShaderPrefab(pub Program);
|
||||
|
||||
#[derive(Unique)]
|
||||
#[repr(transparent)]
|
||||
pub struct UiFontPrefab(pub FontHandle);
|
||||
|
||||
pub fn load_prefabs(
|
||||
storages: AllStoragesView,
|
||||
renderer: NonSendSync<UniqueView<Renderer>>,
|
||||
mut ui: NonSendSync<UniqueViewMut<UiState>>,
|
||||
assman: UniqueView<AssetManager>
|
||||
) {
|
||||
log::info!("Loading textures...");
|
||||
storages.add_unique_non_send_sync(BlockTexturesPrefab(
|
||||
load_texture2darray_prefab::<BlockTexture, _>(
|
||||
&assman,
|
||||
"blocks".into(),
|
||||
&renderer.display,
|
||||
MipmapsOption::AutoGeneratedMipmaps
|
||||
)
|
||||
));
|
||||
|
||||
log::info!("Loading the UI stuff...");
|
||||
{
|
||||
let asset_handle = assman.open_asset(Path::new("fonts/Crisp.ttf")).unwrap();
|
||||
let mut font_data = vec![];
|
||||
BufReader::new(asset_handle).read_to_end(&mut font_data).unwrap();
|
||||
let font_handle = ui.hui.add_font_from_bytes(&font_data);
|
||||
storages.add_unique(UiFontPrefab(font_handle));
|
||||
}
|
||||
|
||||
log::info!("Compiling shaders...");
|
||||
storages.add_unique_non_send_sync(ChunkShaderPrefab(
|
||||
include_shader_prefab!(
|
||||
"world",
|
||||
"../shaders/world.vert",
|
||||
"../shaders/world.frag",
|
||||
&renderer.display
|
||||
)
|
||||
));
|
||||
storages.add_unique_non_send_sync(ColoredShaderPrefab(
|
||||
include_shader_prefab!(
|
||||
"colored",
|
||||
"../shaders/colored.vert",
|
||||
"../shaders/colored.frag",
|
||||
&renderer.display
|
||||
)
|
||||
));
|
||||
|
||||
log::info!("releasing shader compiler");
|
||||
|
||||
renderer.display.release_shader_compiler();
|
||||
}
|
||||
|
|
|
@ -5,6 +5,7 @@ use crate::{
|
|||
hui_integration::UiState,
|
||||
loading_screen::loading_screen_base,
|
||||
networking::ServerAddress,
|
||||
prefabs::UiFontPrefab,
|
||||
rendering::WindowSize,
|
||||
state::{GameState, NextState}
|
||||
};
|
||||
|
@ -12,9 +13,9 @@ use crate::{
|
|||
fn render_connecting_ui(
|
||||
addr: UniqueView<ServerAddress>,
|
||||
mut ui: NonSendSync<UniqueViewMut<UiState>>,
|
||||
font: UniqueView<UiFontPrefab>,
|
||||
size: UniqueView<WindowSize>,
|
||||
) {
|
||||
let font_handle = ui.fonts[0];
|
||||
ui.hui.add(
|
||||
loading_screen_base(vec![
|
||||
Box::new(Text {
|
||||
|
@ -22,7 +23,7 @@ fn render_connecting_ui(
|
|||
"Connecting to {}...",
|
||||
addr.0,
|
||||
).into(),
|
||||
font: font_handle,
|
||||
font: font.0,
|
||||
text_size: 16,
|
||||
..Default::default()
|
||||
}),
|
|
@ -6,12 +6,7 @@ use hui::{
|
|||
use shipyard::{UniqueView, UniqueViewMut, Workload, NonSendSync, IntoWorkload};
|
||||
use winit::keyboard::KeyCode;
|
||||
use crate::{
|
||||
hui_integration::UiState,
|
||||
input::RawKbmInputState,
|
||||
networking::ServerAddress,
|
||||
rendering::WindowSize,
|
||||
state::{GameState, NextState},
|
||||
world::ChunkStorage
|
||||
hui_integration::UiState, input::RawKbmInputState, networking::ServerAddress, prefabs::UiFontPrefab, rendering::WindowSize, state::{GameState, NextState}, world::ChunkStorage
|
||||
};
|
||||
|
||||
pub fn loading_screen_base(elements: Vec<Box<dyn UiElement>>, bg_alpha: f32) -> Container {
|
||||
|
@ -37,6 +32,7 @@ fn render_loading_ui(
|
|||
addr: Option<UniqueView<ServerAddress>>,
|
||||
world: UniqueView<ChunkStorage>,
|
||||
mut ui: NonSendSync<UniqueViewMut<UiState>>,
|
||||
font: UniqueView<UiFontPrefab>,
|
||||
size: UniqueView<WindowSize>
|
||||
) {
|
||||
let loaded = world.chunks.iter().fold(0, |acc, (&_, chunk)| {
|
||||
|
@ -46,14 +42,13 @@ fn render_loading_ui(
|
|||
let value = loaded as f32 / total as f32;
|
||||
let percentage = value * 100.;
|
||||
|
||||
let font_handle = ui.fonts[0];
|
||||
ui.hui.add(loading_screen_base(vec![
|
||||
Box::new(Text {
|
||||
text: match addr {
|
||||
Some(addr) => format!("Connected to {}\nDownloading world data...", addr.0).into(),
|
||||
_ => "Loading...".into(),
|
||||
},
|
||||
font: font_handle,
|
||||
font: font.0,
|
||||
text_size: 16,
|
||||
..Default::default()
|
||||
}),
|
||||
|
@ -70,7 +65,7 @@ fn render_loading_ui(
|
|||
elements: vec![
|
||||
Box::new(Text {
|
||||
text: format!("{loaded}/{total} ({percentage:.1}%)").into(),
|
||||
font: font_handle,
|
||||
font: font.0,
|
||||
text_size: 16,
|
||||
..Default::default()
|
||||
})
|
Loading…
Reference in a new issue