world shifting almost working
This commit is contained in:
+25
-9
@@ -19,7 +19,8 @@ pub struct Game {
|
|||||||
#[allow(unused)]
|
#[allow(unused)]
|
||||||
world: World,
|
world: World,
|
||||||
|
|
||||||
prev_pos: Option<Vector3<i32>>
|
prev_pos: Option<Vector3<i32>>,
|
||||||
|
prev_chunk_pos: Option<Vector3<i32>>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Game {
|
impl Game {
|
||||||
@@ -28,7 +29,8 @@ impl Game {
|
|||||||
state: GameState::Paused,
|
state: GameState::Paused,
|
||||||
player: Player::new(),
|
player: Player::new(),
|
||||||
world: World::init("hello".to_string()),
|
world: World::init("hello".to_string()),
|
||||||
prev_pos: None
|
prev_pos: None,
|
||||||
|
prev_chunk_pos: None,
|
||||||
}
|
}
|
||||||
|
|
||||||
// // Try to load world from file
|
// // Try to load world from file
|
||||||
@@ -62,19 +64,33 @@ impl Game {
|
|||||||
let camera = renderer.get_camera_transform();
|
let camera = renderer.get_camera_transform();
|
||||||
self.player.camera_controller.update(delta, camera);
|
self.player.camera_controller.update(delta, camera);
|
||||||
|
|
||||||
// Update chunks
|
// Get positions
|
||||||
let pos = camera.get_position();
|
let pos = camera.get_position();
|
||||||
let pos = Vector3{x: pos.x as i32, y: pos.y as i32, z: pos.z as i32};
|
let pos = Vector3{x: pos.x as i32, y: pos.y as i32, z: pos.z as i32};
|
||||||
if self.prev_pos == None || self.prev_pos != Some(pos) {
|
let chunk_pos = pos / world::chunk::SIZE as i32;
|
||||||
self.prev_pos = Some(pos);
|
|
||||||
renderer.get_ui().set_text("World", 0, format!("Position: {}, {}, {}", pos.x, pos.y, pos.z));
|
|
||||||
|
|
||||||
// Load sphere of chunks around player
|
// Block position
|
||||||
let chunk_pos = pos / 32;//Vector3{x: pos.x / 32, y: pos.y / 32, z: pos.z / 32};
|
if self.prev_pos == None || self.prev_pos != Some(pos) {
|
||||||
|
renderer.get_ui().set_text("World", 0, format!("Position: {}, {}, {}", pos.x, pos.y, pos.z));
|
||||||
|
self.prev_pos = Some(pos);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Chunk position
|
||||||
|
if self.prev_chunk_pos == None || self.prev_chunk_pos != Some(chunk_pos) {
|
||||||
|
renderer.get_ui().set_text("World", 1, format!("Chunk: {}, {}, {}", chunk_pos.x, chunk_pos.y, chunk_pos.z));
|
||||||
|
|
||||||
|
// Shift world
|
||||||
|
let dir = chunk_pos - self.prev_chunk_pos.unwrap_or(chunk_pos);
|
||||||
|
renderer.shift(&(dir * world::chunk::SIZE as i32));
|
||||||
|
|
||||||
|
// Load chunk
|
||||||
if self.world.load_chunk(chunk_pos) {
|
if self.world.load_chunk(chunk_pos) {
|
||||||
let chunk = self.world.get_chunk(&chunk_pos).unwrap();
|
let chunk = self.world.get_chunk(&chunk_pos).unwrap();
|
||||||
chunk.write_to(renderer, chunk_pos * 32);
|
chunk.write_to(renderer, chunk_pos * world::chunk::SIZE as i32);
|
||||||
|
println!("Writing chunk to {:?}", chunk_pos * world::chunk::SIZE as i32);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
self.prev_chunk_pos = Some(chunk_pos);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -141,25 +141,26 @@ impl Content {
|
|||||||
pub fn shift(&mut self, offset: &Vector3<i32>) {
|
pub fn shift(&mut self, offset: &Vector3<i32>) {
|
||||||
let timer = Instant::now();
|
let timer = Instant::now();
|
||||||
let mut result = vec![0_u32; self.node_buffer.len()].into_boxed_slice();
|
let mut result = vec![0_u32; self.node_buffer.len()].into_boxed_slice();
|
||||||
let ox = offset.x as usize;
|
let ox = offset.x;
|
||||||
let oy = offset.y as usize;
|
let oy = offset.y;
|
||||||
let oz = offset.z as usize;
|
let oz = offset.z;
|
||||||
|
let size = NODE_TEX_SIZE as i32;
|
||||||
|
|
||||||
for x0 in 0..NODE_TEX_SIZE {
|
for x0 in 0..size {
|
||||||
let x1 = x0+ox;
|
let x1 = x0+ox;
|
||||||
if x1 >= NODE_TEX_SIZE { continue; }
|
if x1 < 0 || x1 >= size { continue; }
|
||||||
|
|
||||||
for y0 in 0..NODE_TEX_SIZE {
|
for y0 in 0..size {
|
||||||
let y1 = y0+oy;
|
let y1 = y0+oy;
|
||||||
if y1 >= NODE_TEX_SIZE { continue; }
|
if y1 < 0 || y1 >= size { continue; }
|
||||||
|
|
||||||
for z0 in 0..NODE_TEX_SIZE {
|
for z0 in 0..size {
|
||||||
let z1 = z0+oz;
|
let z1 = z0+oz;
|
||||||
if z1 >= NODE_TEX_SIZE { continue; }
|
if z1 < 0 || z1 >= size { continue; }
|
||||||
|
|
||||||
let idx0 = x0 + NODE_TEX_SIZE * (y0 + NODE_TEX_SIZE * z0);
|
let idx0 = x0 + size * (y0 + size * z0);
|
||||||
let idx1 = x1 + NODE_TEX_SIZE * (y1 + NODE_TEX_SIZE * z1);
|
let idx1 = x1 + size * (y1 + size * z1);
|
||||||
result[idx1] = self.node_buffer[idx0];
|
result[idx1 as usize] = self.node_buffer[idx0 as usize];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -23,10 +23,10 @@ impl UniformValues {
|
|||||||
Self { sun_dir, .. Default::default() }
|
Self { sun_dir, .. Default::default() }
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn update(&mut self, camera: &Camera, time: f32) {
|
pub fn update(&mut self, camera: &Camera, offset: Vector3<f32>, time: f32) {
|
||||||
self.view_inv = camera.get_view().invert().unwrap().into();
|
self.view_inv = camera.get_view().invert().unwrap().into();
|
||||||
self.proj_inv = camera.get_projection().invert().unwrap().into();
|
self.proj_inv = camera.get_projection().invert().unwrap().into();
|
||||||
self.cam_pos = camera.get_position().into();
|
self.cam_pos = (camera.get_position() + offset).into();
|
||||||
self.time = time;
|
self.time = time;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+6
-2
@@ -1,3 +1,4 @@
|
|||||||
|
use cgmath::Vector3;
|
||||||
use std::time::Instant;
|
use std::time::Instant;
|
||||||
use winit::{window::Window, dpi::PhysicalSize};
|
use winit::{window::Window, dpi::PhysicalSize};
|
||||||
pub mod buffers;
|
pub mod buffers;
|
||||||
@@ -26,6 +27,7 @@ pub struct Renderer {
|
|||||||
// Other
|
// Other
|
||||||
pub camera: Camera,
|
pub camera: Camera,
|
||||||
start: std::time::Instant,
|
start: std::time::Instant,
|
||||||
|
world_offset: Vector3<i32>
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Renderer {
|
impl Renderer {
|
||||||
@@ -86,9 +88,10 @@ impl Renderer {
|
|||||||
|
|
||||||
// Other
|
// Other
|
||||||
let start = std::time::Instant::now();
|
let start = std::time::Instant::now();
|
||||||
|
let world_offset = Vector3{x:0, y:0, z:0};
|
||||||
|
|
||||||
println!("Renderer initialized");
|
println!("Renderer initialized");
|
||||||
Self { surface, device, queue, swapchain_desc, swapchain, texture, raytrace_pass, postprocess_pass, ui, buffers, camera, start }
|
Self { surface, device, queue, swapchain_desc, swapchain, texture, raytrace_pass, postprocess_pass, ui, buffers, camera, start, world_offset }
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -114,7 +117,8 @@ impl Renderer {
|
|||||||
pub fn render(&mut self) -> Result<(), wgpu::SwapChainError> {
|
pub fn render(&mut self) -> Result<(), wgpu::SwapChainError> {
|
||||||
|
|
||||||
// Update uniform buffer
|
// Update uniform buffer
|
||||||
self.buffers.uniforms.values.update(&self.camera, self.start.elapsed().as_secs_f32());
|
let offset = Vector3{x: self.world_offset.x as f32, y: self.world_offset.y as f32, z: self.world_offset.z as f32 };
|
||||||
|
self.buffers.uniforms.values.update(&self.camera, offset, self.start.elapsed().as_secs_f32());
|
||||||
self.queue.write_buffer(&self.buffers.uniforms.buffer, 0, bytemuck::cast_slice(&[self.buffers.uniforms.values]));
|
self.queue.write_buffer(&self.buffers.uniforms.buffer, 0, bytemuck::cast_slice(&[self.buffers.uniforms.values]));
|
||||||
|
|
||||||
// Update content
|
// Update content
|
||||||
|
|||||||
@@ -9,16 +9,19 @@ pub trait RendererView {
|
|||||||
fn shift(&mut self, offset: &Vector3<i32>);
|
fn shift(&mut self, offset: &Vector3<i32>);
|
||||||
fn get_camera_transform(&mut self) -> &mut dyn CameraTransform;
|
fn get_camera_transform(&mut self) -> &mut dyn CameraTransform;
|
||||||
fn get_ui(&mut self) -> &mut UserInterface;
|
fn get_ui(&mut self) -> &mut UserInterface;
|
||||||
|
fn get_world_offset(&self) -> Vector3<i32>;
|
||||||
}
|
}
|
||||||
|
|
||||||
impl RendererView for Renderer {
|
impl RendererView for Renderer {
|
||||||
|
|
||||||
fn write(&mut self, block_pos: &Vector3<i32>, block: &WorldBlock) {
|
fn write(&mut self, block_pos: &Vector3<i32>, block: &WorldBlock) {
|
||||||
self.buffers.content.write(&self.queue, block_pos, block)
|
self.buffers.content.write(&self.queue, &block_pos, block)
|
||||||
}
|
}
|
||||||
|
|
||||||
fn shift(&mut self, offset: &Vector3<i32>) {
|
fn shift(&mut self, offset: &Vector3<i32>) {
|
||||||
self.buffers.content.shift(offset);
|
self.buffers.content.shift(offset);
|
||||||
|
self.world_offset += *offset;
|
||||||
|
println!("World shifted by {:?}. World offset is now {:?}", offset, self.world_offset);
|
||||||
}
|
}
|
||||||
|
|
||||||
fn get_camera_transform(&mut self) -> &mut dyn CameraTransform {
|
fn get_camera_transform(&mut self) -> &mut dyn CameraTransform {
|
||||||
@@ -28,4 +31,8 @@ impl RendererView for Renderer {
|
|||||||
fn get_ui(&mut self) -> &mut UserInterface {
|
fn get_ui(&mut self) -> &mut UserInterface {
|
||||||
&mut self.ui
|
&mut self.ui
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn get_world_offset(&self) -> Vector3<i32> {
|
||||||
|
self.world_offset
|
||||||
|
}
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user