From b59523c13b28c59f6b3ff5df314dcd073d9a4586 Mon Sep 17 00:00:00 2001 From: Piotrek Date: Fri, 23 Apr 2021 16:06:54 +0200 Subject: [PATCH] continue traversing nodes if brick not hit --- src/app/camera_controller.rs | 1 + src/main.rs | 2 +- src/renderer/buffers/brick_buffer.rs | 4 ++-- src/renderer/buffers/node_buffer.rs | 4 +++- src/renderer/camera.rs | 6 +++--- src/shaders/bin/shader.frag.spv | Bin 9608 -> 10076 bytes src/shaders/raycasting.cginc | 18 ++++++++++-------- 7 files changed, 20 insertions(+), 15 deletions(-) diff --git a/src/app/camera_controller.rs b/src/app/camera_controller.rs index 7e6effc..7685f65 100644 --- a/src/app/camera_controller.rs +++ b/src/app/camera_controller.rs @@ -41,6 +41,7 @@ impl CameraController { let mut movement = CameraMovement::default(); movement.speed = 2.0; let mut rotation = CameraRotation::default(); + rotation.yaw = 45.0; rotation.sensitivity = 0.2; Self { enabled: false, movement, rotation } } diff --git a/src/main.rs b/src/main.rs index 8e46219..2ace7f5 100644 --- a/src/main.rs +++ b/src/main.rs @@ -58,7 +58,7 @@ fn main() { // Display FPS let elapsed = fps_timer.elapsed().as_secs_f64(); - if elapsed >= 0.5 { + if elapsed >= 1.5 { let fps = (fps_counter as f64) / elapsed; println!("FPS: {}", (fps*100.0_f64).floor()/100.0); fps_timer = std::time::Instant::now(); diff --git a/src/renderer/buffers/brick_buffer.rs b/src/renderer/buffers/brick_buffer.rs index 6c97c81..eec43b3 100644 --- a/src/renderer/buffers/brick_buffer.rs +++ b/src/renderer/buffers/brick_buffer.rs @@ -2,7 +2,7 @@ use wgpu::util::DeviceExt; use std::convert::TryInto; const BRICK_SIZE : usize = 32; // 32x32x32 brick size -const BRICK_NUM : usize = 2; // x bricks in texture +const BRICK_NUM : usize = 10000; // x bricks in texture const BRICK_LEN : usize = BRICK_SIZE*BRICK_SIZE*BRICK_SIZE; const DATA_LEN : usize = BRICK_LEN * BRICK_NUM; @@ -102,7 +102,7 @@ impl BrickBuffer { } } } - bricks.set(0, 0, 0, 0, 0); + bricks.set(1, 20, 5, 16, 1); // Done Self { bricks, texture, size, bind_layout, bind_group } diff --git a/src/renderer/buffers/node_buffer.rs b/src/renderer/buffers/node_buffer.rs index bf24347..7154530 100644 --- a/src/renderer/buffers/node_buffer.rs +++ b/src/renderer/buffers/node_buffer.rs @@ -70,7 +70,9 @@ impl NodeBuffer { // Data let mut nodes : [u32; NUM_NODES] = [Default::default(); NUM_NODES]; - nodes[0] = 2; + nodes[0] = 1; + nodes[1] = 2; + nodes[2] = 2; // Done Self { nodes, texture, size, bind_layout, bind_group } diff --git a/src/renderer/camera.rs b/src/renderer/camera.rs index e00f72c..5650760 100644 --- a/src/renderer/camera.rs +++ b/src/renderer/camera.rs @@ -1,4 +1,4 @@ -use cgmath::{Point3, Vector3, Matrix4, Deg}; +use cgmath::{Point3, Vector3, Matrix4, Deg, InnerSpace}; pub struct Camera { pub position: Point3, @@ -14,8 +14,8 @@ impl Camera { pub fn new(aspect: f32, fov: f32) -> Self { Self { - position: (0.0, 1.0, 0.0).into(), - forward: (0.0, 0.0, 1.0).into(), + position: (2.0, 1.0, -1.0).into(), + forward: (-0.66, -0.33, 0.66).into(), up: Vector3::unit_y(), aspect, fovy: fov, diff --git a/src/shaders/bin/shader.frag.spv b/src/shaders/bin/shader.frag.spv index e828880e448914d7ead4573568031bce12b20612..3e1ad77a868bb3fc910258241e3bda8f5c870a34 100644 GIT binary patch literal 10076 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 SKDqRBXE$um%mlRWRsRD+9Jy!! literal 9608 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 diff --git a/src/shaders/raycasting.cginc b/src/shaders/raycasting.cginc index b0ce775..0bbbbfb 100644 --- a/src/shaders/raycasting.cginc +++ b/src/shaders/raycasting.cginc @@ -24,7 +24,7 @@ vec3 solve(vec3 hitPoint, vec3 view, vec3 normal) * dir: Camera view direction (ray direction) * addr: Number given by node, afaik brick offset in brick array */ -vec3 castBricks(vec3 origin, vec3 start, vec3 dir, uint addr) +vec4 castBricks(vec3 origin, vec3 start, vec3 dir, vec3 incAxis, uint addr) { // Change scale origin = start - origin; @@ -38,7 +38,8 @@ vec3 castBricks(vec3 origin, vec3 start, vec3 dir, uint addr) vec3 dist = (pos-origin+0.5 + raySign*0.5) * rayInv; ivec3 offset = ivec3(0, 0, (addr-1)*32); - vec3 incAxis = vec3(0,0,0); + + vec3 tmp = abs(raySign); for(int i=0;i<110;i++) { // Get brick @@ -48,11 +49,11 @@ vec3 castBricks(vec3 origin, vec3 start, vec3 dir, uint addr) // Hit point vec3 mini = (pos-origin+0.5 - raySign*0.5) * rayInv; float len = max(mini.x, max(mini.y, mini.z)); - vec3 hitPoint = (origin + dir * len) + start; + vec3 hitPoint = (origin + dir * len) / 32.0; // Normal vector (negate previous increment axis and mult by sign) vec3 normal = -incAxis * raySign; - return solve(hitPoint, dir, normal); + return vec4(solve(hitPoint, dir, normal), 1.0); } // Get new closest axis to increment @@ -60,12 +61,12 @@ vec3 castBricks(vec3 origin, vec3 start, vec3 dir, uint addr) dist += incAxis * raySign * rayInv; pos += incAxis * raySign; - // Outside bounds + // Check for bounds if(pos.x < 0 || pos.y < 0 || pos.z < 0) { break; } if(pos.x > 32 || pos.y > 32 || pos.z > 32) { break; } } - return vec3(0.5,0.5,0.5); + return vec4(0.5,0.5,0.5, 0.0); } /* @@ -102,7 +103,8 @@ vec3 castNodes(vec3 origin, vec3 dir) //return solve(hitPoint, dir, normal); // Cast brick - return castBricks(pos, hitPoint, dir, node); //todo: continue if not hit + vec4 result = castBricks(pos, hitPoint, dir, incAxis, node); + if(result.a > 0.0) return result.rgb; //todo: continue if not hit } // Get new closest axis to increment @@ -111,7 +113,7 @@ vec3 castNodes(vec3 origin, vec3 dir) pos += incAxis * raySign; // Outside bounds - // if(pos.x < 0 || pos.y < 0 || pos.z < 0) { break; } + //if(pos.x < 0 || pos.y < 0 || pos.z < 0) { break; } // if(pos.x > 1 || pos.y > 1 || pos.z > 1) { break; } }