From 829ae1ddb645e2e49e81a2aa49da47ac42e446ba Mon Sep 17 00:00:00 2001 From: Piotrek Date: Fri, 23 Apr 2021 22:44:03 +0200 Subject: [PATCH] fixed negative distance in voxel traversing --- src/renderer/buffers/brick_buffer.rs | 1 + src/renderer/buffers/node_buffer.rs | 27 +++++++++++++------------ src/renderer/buffers/uniform_buffer.rs | 6 ++++-- src/renderer/mod.rs | 9 ++++++--- src/shaders/bin/shader.frag.spv | Bin 10076 -> 10240 bytes src/shaders/raycasting.cginc | 8 +++++--- src/shaders/shader.frag | 13 ++++++------ 7 files changed, 37 insertions(+), 27 deletions(-) diff --git a/src/renderer/buffers/brick_buffer.rs b/src/renderer/buffers/brick_buffer.rs index 6241769..202fe6a 100644 --- a/src/renderer/buffers/brick_buffer.rs +++ b/src/renderer/buffers/brick_buffer.rs @@ -102,6 +102,7 @@ impl BrickBuffer { for z in 0..32 { let value = if rng.gen::()> 0.99 { 1 } else { 0 }; bricks.set(0, x, y, z, value); + bricks.set(1, x, 0, z, 1); } } } diff --git a/src/renderer/buffers/node_buffer.rs b/src/renderer/buffers/node_buffer.rs index 97ce4e3..e4249d2 100644 --- a/src/renderer/buffers/node_buffer.rs +++ b/src/renderer/buffers/node_buffer.rs @@ -92,20 +92,21 @@ impl NodeBuffer { // Data let mut nodes = NodeData::new(); - let mut rng = rand::thread_rng(); - for x in 0..WORLD_SIZE { - for y in 0..WORLD_SIZE { - for z in 0..WORLD_SIZE { - let value = if rng.gen::()> 0.5 { 1 } else { 0 }; - nodes.set(x, y, z, value); - } - } - } - // for i in 0..WORLD_SIZE { - // nodes.set(i, 0, 0, 1); - // nodes.set(0, i, 0, 1); - // nodes.set(0, 0, i, 1); + // let mut rng = rand::thread_rng(); + // for x in 0..WORLD_SIZE { + // for y in 0..WORLD_SIZE { + // for z in 0..WORLD_SIZE { + // let value = if rng.gen::()> 0.5 { 1 } else { 0 }; + // nodes.set(x, y, z, value); + // } + // } // } + for i in 0..WORLD_SIZE { + nodes.set(i, 0, 0, 1); + nodes.set(0, i, 0, 1); + nodes.set(0, 0, i, 1); + } + nodes.set(0, 0, 0, 2); // Done Self { nodes, texture, size, bind_layout, bind_group } diff --git a/src/renderer/buffers/uniform_buffer.rs b/src/renderer/buffers/uniform_buffer.rs index ed11593..b64f7f5 100644 --- a/src/renderer/buffers/uniform_buffer.rs +++ b/src/renderer/buffers/uniform_buffer.rs @@ -7,7 +7,8 @@ use wgpu::util::DeviceExt; pub struct UniformValues { view_inv: [[f32; 4]; 4], proj_inv: [[f32; 4]; 4], - cam_pos: [f32; 3] + cam_pos: [f32; 3], + time: f32 } impl UniformValues { @@ -16,10 +17,11 @@ impl UniformValues { Self::default() } - pub fn update(&mut self, camera: &Camera) { + pub fn update(&mut self, camera: &Camera, time: f32) { self.view_inv = camera.view_matrix().invert().unwrap().into(); self.proj_inv = camera.proj_matrix().invert().unwrap().into(); self.cam_pos = camera.position.into(); + self.time = time; } } diff --git a/src/renderer/mod.rs b/src/renderer/mod.rs index 0371774..6710d35 100644 --- a/src/renderer/mod.rs +++ b/src/renderer/mod.rs @@ -16,8 +16,9 @@ pub struct Renderer { uniform_buffer: UniformBuffer, node_buffer: NodeBuffer, brick_buffer: BrickBuffer, - // Camera + // Other pub camera: Camera, + start: std::time::Instant } impl Renderer { @@ -117,9 +118,11 @@ impl Renderer { // Pipeline let pipeline = Self::create_pipeline(&device, &swapchain_desc, &[&uniform_buffer.bind_layout, &node_buffer.bind_layout, &brick_buffer.bind_layout]); + let start = std::time::Instant::now(); + // Save values in app println!("Initialized"); - Self { surface, device, queue, swapchain_desc, swapchain, pipeline, raster_buffer, uniform_buffer, node_buffer, brick_buffer, camera } + Self { surface, device, queue, swapchain_desc, swapchain, pipeline, raster_buffer, uniform_buffer, node_buffer, brick_buffer, camera, start } } pub fn resize(&mut self, new_size: Option>) { @@ -139,7 +142,7 @@ impl Renderer { pub fn render(&mut self) -> Result<(), wgpu::SwapChainError> { // Update uniform buffer - self.uniform_buffer.values.update(&self.camera); + self.uniform_buffer.values.update(&self.camera, self.start.elapsed().as_secs_f32()); self.queue.write_buffer(&self.uniform_buffer.buffer, 0, bytemuck::cast_slice(&[self.uniform_buffer.values])); // Get next frame to render to diff --git a/src/shaders/bin/shader.frag.spv b/src/shaders/bin/shader.frag.spv index 7245206a96bb1bdb092ee4d366cd21683b77ab3e..1889b6392e1e05d46c2ad90db28bd4e2d2449b15 100644 GIT binary patch literal 10240 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 0.0) return result.rgb; //todo: continue if not hit + if(result.a > 0.0) return result.rgb; } // Get new closest axis to increment diff --git a/src/shaders/shader.frag b/src/shaders/shader.frag index df84b62..553360b 100644 --- a/src/shaders/shader.frag +++ b/src/shaders/shader.frag @@ -7,9 +7,10 @@ layout(location=0) out vec4 out_color; layout(set=0, binding=0) uniform Uniforms { - mat4 view_matrix; - mat4 proj_matrix_inv; - vec3 cam_pos; + mat4 _viewMatrix; + mat4 _projMatrixInv; + vec3 _CamPos; + float _Time; }; //layout(set = 1, binding = 0) uniform texture3D node_tex; @@ -30,9 +31,9 @@ layout(set=2,binding=0) uniform usampler3D bricksTexture; void main() { // Calculate ray direction - vec3 view_dir = (proj_matrix_inv * vec4(vert_uv, 0, 1)).xyz; - vec3 ray_dir = normalize(view_matrix * vec4(view_dir,0)).xyz; + vec3 view_dir = (_projMatrixInv * vec4(vert_uv, 0, 1)).xyz; + vec3 ray_dir = normalize(_viewMatrix * vec4(view_dir,0)).xyz; // Raycast - out_color = vec4(castNodes(cam_pos, ray_dir), 1.0); + out_color = vec4(castNodes(_CamPos, ray_dir), 1.0); } \ No newline at end of file