mirror of
https://github.com/griffi-gh/kubi.git
synced 2024-11-26 00:38:44 -06:00
ї
This commit is contained in:
parent
5b0817b318
commit
dc0c314bf5
|
@ -17,3 +17,5 @@ hashbrown = "0.13"
|
||||||
noise = "0.8"
|
noise = "0.8"
|
||||||
rayon = "1.6"
|
rayon = "1.6"
|
||||||
shipyard = { version = "0.6", features = ["thread_local"] }
|
shipyard = { version = "0.6", features = ["thread_local"] }
|
||||||
|
nohash-hasher = "0.2.0"
|
||||||
|
anyhow = "1.0"
|
||||||
|
|
|
@ -23,7 +23,7 @@ pub(crate) mod settings;
|
||||||
|
|
||||||
use rendering::{Rederer, RenderTarget, BackgroundColor, clear_background};
|
use rendering::{Rederer, RenderTarget, BackgroundColor, clear_background};
|
||||||
use player::spawn_player;
|
use player::spawn_player;
|
||||||
use world::{GameWorld, loading::load_world_around_player};
|
use world::{ChunkStorage, loading::load_world_around_player};
|
||||||
use prefabs::load_prefabs;
|
use prefabs::load_prefabs;
|
||||||
use settings::GameSettings;
|
use settings::GameSettings;
|
||||||
|
|
||||||
|
@ -60,9 +60,7 @@ fn main() {
|
||||||
Rederer::init(&event_loop)
|
Rederer::init(&event_loop)
|
||||||
);
|
);
|
||||||
load_prefabs(&world);
|
load_prefabs(&world);
|
||||||
world.add_unique_non_send_sync(
|
world.add_unique(ChunkStorage::new());
|
||||||
GameWorld::new()
|
|
||||||
);
|
|
||||||
world.add_unique(BackgroundColor(vec3(0.5, 0.5, 1.)));
|
world.add_unique(BackgroundColor(vec3(0.5, 0.5, 1.)));
|
||||||
world.add_unique(DeltaTime(Duration::default()));
|
world.add_unique(DeltaTime(Duration::default()));
|
||||||
world.add_unique(GameSettings::default());
|
world.add_unique(GameSettings::default());
|
||||||
|
|
36
src/world.rs
36
src/world.rs
|
@ -1,14 +1,17 @@
|
||||||
|
use nohash_hasher::BuildNoHashHasher;
|
||||||
use shipyard::Unique;
|
use shipyard::Unique;
|
||||||
use glam::{IVec3, ivec3};
|
use glam::{IVec3, ivec3};
|
||||||
use hashbrown::HashMap;
|
use hashbrown::HashMap;
|
||||||
|
use anyhow::{Result, Context};
|
||||||
|
|
||||||
pub mod chunk;
|
pub mod chunk;
|
||||||
pub mod block;
|
pub mod block;
|
||||||
pub mod render;
|
pub mod render;
|
||||||
pub mod tasks;
|
pub mod tasks;
|
||||||
pub mod loading;
|
pub mod loading;
|
||||||
|
pub mod mesh;
|
||||||
|
|
||||||
use chunk::Chunk;
|
use chunk::{Chunk, ChunkMesh};
|
||||||
|
|
||||||
//TODO separate world struct for render data
|
//TODO separate world struct for render data
|
||||||
// because this is not send-sync
|
// because this is not send-sync
|
||||||
|
@ -55,10 +58,10 @@ impl<'a> ChunksNeighbors<'a> {
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Default, Unique)]
|
#[derive(Default, Unique)]
|
||||||
pub struct GameWorld {
|
pub struct ChunkStorage {
|
||||||
pub chunks: HashMap<IVec3, Chunk>
|
pub chunks: HashMap<IVec3, Chunk>
|
||||||
}
|
}
|
||||||
impl GameWorld {
|
impl ChunkStorage {
|
||||||
pub fn new() -> Self {
|
pub fn new() -> Self {
|
||||||
Self::default()
|
Self::default()
|
||||||
}
|
}
|
||||||
|
@ -97,3 +100,30 @@ impl GameWorld {
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub struct ChunkMeshStorage {
|
||||||
|
meshes: HashMap<u64, ChunkMesh, BuildNoHashHasher<u64>>,
|
||||||
|
index: u64,
|
||||||
|
}
|
||||||
|
impl ChunkMeshStorage {
|
||||||
|
pub fn new() -> Self {
|
||||||
|
Self {
|
||||||
|
meshes: HashMap::with_capacity_and_hasher(250, BuildNoHashHasher::default()),
|
||||||
|
index: 0,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
pub fn insert(&mut self, mesh: ChunkMesh) -> u64 {
|
||||||
|
let index = self.index;
|
||||||
|
self.meshes.insert_unique_unchecked(index, mesh);
|
||||||
|
self.index += 1;
|
||||||
|
index
|
||||||
|
}
|
||||||
|
pub fn update(&mut self, key: u64, mesh: ChunkMesh) -> Result<()> {
|
||||||
|
*self.meshes.get_mut(&key).context("Chunk doesn't exist")? = mesh;
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
pub fn remove(&mut self, key: u64) -> Result<()> {
|
||||||
|
self.meshes.remove(&key).context("Chunk doesn't exist")?;
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -28,13 +28,14 @@ pub enum ChunkState {
|
||||||
Loading, //current only
|
Loading, //current only
|
||||||
Loaded,
|
Loaded,
|
||||||
Meshing, //current only
|
Meshing, //current only
|
||||||
Rendered
|
Rendered,
|
||||||
|
RecalculatingMesh //current only
|
||||||
}
|
}
|
||||||
|
|
||||||
pub struct Chunk {
|
pub struct Chunk {
|
||||||
pub position: IVec3,
|
pub position: IVec3,
|
||||||
pub block_data: Option<ChunkData>,
|
pub block_data: Option<ChunkData>,
|
||||||
pub mesh: Option<ChunkMesh>,
|
pub mesh_index: Option<usize>,
|
||||||
pub current_state: ChunkState,
|
pub current_state: ChunkState,
|
||||||
pub desired_state: ChunkState,
|
pub desired_state: ChunkState,
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
use glam::ivec3;
|
use glam::ivec3;
|
||||||
use shipyard::{View, UniqueView, UniqueViewMut, NonSendSync, IntoIter, Workload, IntoWorkload};
|
use shipyard::{View, UniqueView, UniqueViewMut, IntoIter, Workload, IntoWorkload};
|
||||||
use crate::{player::LocalPlayer, transform::Transform, settings::GameSettings};
|
use crate::{player::LocalPlayer, transform::Transform, settings::GameSettings};
|
||||||
use super::{GameWorld, chunk::{ChunkState, CHUNK_SIZE}};
|
use super::{ChunkStorage, chunk::{ChunkState, CHUNK_SIZE}};
|
||||||
|
|
||||||
pub fn load_world_around_player() -> Workload {
|
pub fn load_world_around_player() -> Workload {
|
||||||
(
|
(
|
||||||
|
@ -13,7 +13,7 @@ pub fn mark_chunks(
|
||||||
v_settings: UniqueView<GameSettings>,
|
v_settings: UniqueView<GameSettings>,
|
||||||
v_local_player: View<LocalPlayer>,
|
v_local_player: View<LocalPlayer>,
|
||||||
v_transform: View<Transform>,
|
v_transform: View<Transform>,
|
||||||
mut vm_world: NonSendSync<UniqueViewMut<GameWorld>>,
|
mut vm_world: UniqueViewMut<ChunkStorage>,
|
||||||
) {
|
) {
|
||||||
//Read game settings
|
//Read game settings
|
||||||
let load_distance = (v_settings.render_distance + 1) as i32;
|
let load_distance = (v_settings.render_distance + 1) as i32;
|
||||||
|
|
Loading…
Reference in a new issue