From c04a1aea11f8e186d9d194bafebe69008e1eaff9 Mon Sep 17 00:00:00 2001 From: Piotrek Date: Wed, 5 May 2021 14:38:12 +0200 Subject: [PATCH] World structs --- src/app/mod.rs | 22 ++++++++--------- src/app/world.rs | 12 --------- src/app/world/block.rs | 12 +++++++++ src/app/world/chunk.rs | 14 +++++++++++ src/app/{world_gen.rs => world/generator.rs} | 8 +++--- src/app/world/mod.rs | 26 ++++++++++++++++++++ src/renderer/buffers/blocks.rs | 12 ++++----- src/renderer/buffers/mod.rs | 2 +- src/renderer/mod.rs | 4 +-- src/renderer/{level.rs => renderspace.rs} | 8 +++--- 10 files changed, 79 insertions(+), 41 deletions(-) delete mode 100644 src/app/world.rs create mode 100644 src/app/world/block.rs create mode 100644 src/app/world/chunk.rs rename src/app/{world_gen.rs => world/generator.rs} (90%) create mode 100644 src/app/world/mod.rs rename src/renderer/{level.rs => renderspace.rs} (93%) diff --git a/src/app/mod.rs b/src/app/mod.rs index f73af17..ec55d5d 100644 --- a/src/app/mod.rs +++ b/src/app/mod.rs @@ -1,13 +1,13 @@ use winit::event::Event; use noise::Perlin; -use crate::renderer::{camera::CameraTransform, Level}; +use crate::renderer::{camera::CameraTransform, RenderSpace}; mod camera_controller; use camera_controller::CameraController; -mod world_gen; -use world_gen::WorldGen; +mod world; +use world::World; pub enum GameState { Paused, @@ -15,19 +15,17 @@ pub enum GameState { } pub struct App { - world_gen: WorldGen, - camera_controller: CameraController + camera_controller: CameraController, + world: World } impl App { - pub fn new(level: &mut dyn Level) -> Self { - let mut instance = Self { + pub fn new(renderer: &mut dyn RenderSpace) -> Self { + Self { camera_controller: CameraController::new(), - world_gen: WorldGen::new() - }; - - instance.world_gen.generate(level, &Perlin::new()); - instance + world: World::new("default".to_string()) + } + //instance.world_gen.generate(renderer, &Perlin::new()); } pub fn input(&mut self, event: &Event<()>) { diff --git a/src/app/world.rs b/src/app/world.rs deleted file mode 100644 index 23926ff..0000000 --- a/src/app/world.rs +++ /dev/null @@ -1,12 +0,0 @@ - - -struct World { - -} - -impl World { - - pub fn new() -> Self { - Self {} - } -} \ No newline at end of file diff --git a/src/app/world/block.rs b/src/app/world/block.rs new file mode 100644 index 0000000..066f711 --- /dev/null +++ b/src/app/world/block.rs @@ -0,0 +1,12 @@ + +#[derive(Clone)] +pub struct WorldBlock { + pub data: [u8;32*32*32] +} + +impl WorldBlock { + pub fn new() -> Self { + let data = [0_u8; 32*32*32]; + Self { data } + } +} \ No newline at end of file diff --git a/src/app/world/chunk.rs b/src/app/world/chunk.rs new file mode 100644 index 0000000..9384944 --- /dev/null +++ b/src/app/world/chunk.rs @@ -0,0 +1,14 @@ +use cgmath::Point3; +use crate::app::world::WorldBlock; + +pub struct WorldChunk { + pos: Point3, + blocks: Box<[WorldBlock]> +} + +impl WorldChunk { + pub fn new(pos: Point3) -> Self { + let blocks = vec![WorldBlock::new(); 16*16*16].into_boxed_slice(); + Self { pos, blocks } + } +} \ No newline at end of file diff --git a/src/app/world_gen.rs b/src/app/world/generator.rs similarity index 90% rename from src/app/world_gen.rs rename to src/app/world/generator.rs index b58f979..969b239 100644 --- a/src/app/world_gen.rs +++ b/src/app/world/generator.rs @@ -2,7 +2,7 @@ use cgmath::Point3; use noise::{Perlin, NoiseFn}; use rand::{Rng, prelude::ThreadRng}; -use crate::renderer::Level; +use crate::renderer::RenderSpace; use crate::renderer::buffers::BLOCK_SIZE; const SCALE: f64 = 150.0; @@ -44,7 +44,7 @@ impl WorldGen { /* * Generate world */ - pub fn generate(&mut self, level: &mut dyn Level, noise: &Perlin) { + pub fn generate(&mut self, renderer: &mut dyn RenderSpace, noise: &Perlin) { let mut rng = rand::thread_rng(); let mut dirty: Vec = Vec::new(); @@ -57,7 +57,7 @@ impl WorldGen { // Generate blocks for by in 0..bh { // Get - let b = level.block_get(Point3{x:bx, y:by, z:bz}); + let b = renderer.block_get(Point3{x:bx, y:by, z:bz}); dirty.push(b.id); // Fill for x in 0..BLOCK_SIZE { @@ -75,7 +75,7 @@ impl WorldGen { } for id in dirty { - level.block_dirty(id); + renderer.block_dirty(id); } } } \ No newline at end of file diff --git a/src/app/world/mod.rs b/src/app/world/mod.rs new file mode 100644 index 0000000..8d3d83a --- /dev/null +++ b/src/app/world/mod.rs @@ -0,0 +1,26 @@ +mod generator; +use generator::WorldGen; +mod chunk; +use chunk::WorldChunk; +mod block; +use block::WorldBlock; + +pub struct World { + name: String, + chunks: Vec // Loaded chunks +} + +impl World { + + pub fn new(name: String) -> Self { + Self { name, chunks: Vec::new() } + } + + fn load(&mut self) { + + } + + fn save(&mut self) { + + } +} \ No newline at end of file diff --git a/src/renderer/buffers/blocks.rs b/src/renderer/buffers/blocks.rs index 4c6027b..c3a3959 100644 --- a/src/renderer/buffers/blocks.rs +++ b/src/renderer/buffers/blocks.rs @@ -4,12 +4,12 @@ use crate::renderer::{buffers, buffers::{BLOCK_SIZE, BLOCK_TEX_SIZE, BLOCK_TEX_L #[derive(Clone)] -pub struct Block { +pub struct RenderBlock { pub id: usize, pub data: [u8;BLOCK_LEN] } -impl Block { +impl RenderBlock { pub fn new() -> Self { Self { id: 0, data: [0_u8;BLOCK_LEN] } } @@ -21,7 +21,7 @@ impl Block { pub struct Blocks { - blocks: Box<[Block]>, + blocks: Box<[RenderBlock]>, free_block: usize, texture: wgpu::Texture, pub bind_layout: wgpu::BindGroupLayout, @@ -90,7 +90,7 @@ impl Blocks { ); // Data - let mut blocks = vec![Block::new(); BLOCK_ARR_LEN].into_boxed_slice(); + let mut blocks = vec![RenderBlock::new(); BLOCK_ARR_LEN].into_boxed_slice(); for (i, b) in blocks.iter_mut().enumerate() { b.id = i; } println!("Blocks size: {} MB, max: {}", BLOCK_TEX_LEN as f32 / 1024.0 / 1024.0, BLOCK_ARR_LEN); @@ -122,14 +122,14 @@ impl Blocks { ); } - pub fn get(&mut self, block_id: usize) -> &mut Block { + pub fn get(&mut self, block_id: usize) -> &mut RenderBlock { &mut self.blocks[block_id] } /* * Allocates new block */ - pub fn alloc(&mut self) -> &mut Block { + pub fn alloc(&mut self) -> &mut RenderBlock { // Make sure we still have some free blocks if self.free_block >= BLOCK_ARR_LEN { panic!("No more free blocks! we should consider reusing blocks..."); } diff --git a/src/renderer/buffers/mod.rs b/src/renderer/buffers/mod.rs index 67716a9..12a579d 100644 --- a/src/renderer/buffers/mod.rs +++ b/src/renderer/buffers/mod.rs @@ -20,7 +20,7 @@ pub use nodes::Nodes; mod blocks; pub use blocks::Blocks; -pub use blocks::Block; +pub use blocks::RenderBlock; mod uniform; pub use uniform::Uniform; diff --git a/src/renderer/mod.rs b/src/renderer/mod.rs index 6f5e514..f2cb845 100644 --- a/src/renderer/mod.rs +++ b/src/renderer/mod.rs @@ -9,8 +9,8 @@ use passes::{RaytracePass, PostprocessPass}; pub mod camera; use camera::Camera; -pub mod level; -pub use level::Level; +pub mod renderspace; +pub use renderspace::RenderSpace; pub struct Renderer { surface: wgpu::Surface, diff --git a/src/renderer/level.rs b/src/renderer/renderspace.rs similarity index 93% rename from src/renderer/level.rs rename to src/renderer/renderspace.rs index c5ccc0d..be5b455 100644 --- a/src/renderer/level.rs +++ b/src/renderer/renderspace.rs @@ -2,12 +2,12 @@ use cgmath::Point3; use crate::renderer::{Renderer, buffers}; -pub trait Level { - fn block_get(&mut self, block_pos: Point3) -> &mut buffers::Block; +pub trait RenderSpace { + fn block_get(&mut self, block_pos: Point3) -> &mut buffers::RenderBlock; fn block_dirty(&mut self, id: usize); } -impl Level for Renderer { +impl RenderSpace for Renderer { /* * Grabs existing or allocates new block for given position @@ -15,7 +15,7 @@ impl Level for Renderer { * block_pos: Position of the block in world, in block space * block_id: Block identifier, equal to Block.id */ - fn block_get(&mut self, block_pos: Point3) -> &mut buffers::Block { + fn block_get(&mut self, block_pos: Point3) -> &mut buffers::RenderBlock { // Get node let node_idx = block_pos.x + buffers::NODE_TEX_SIZE * (block_pos.y + buffers::NODE_TEX_SIZE * block_pos.z); let node_value = self.buffers.node_buffer.nodes[node_idx];