fixed negative distance in voxel traversing
This commit is contained in:
@@ -102,6 +102,7 @@ impl BrickBuffer {
|
|||||||
for z in 0..32 {
|
for z in 0..32 {
|
||||||
let value = if rng.gen::<f32>()> 0.99 { 1 } else { 0 };
|
let value = if rng.gen::<f32>()> 0.99 { 1 } else { 0 };
|
||||||
bricks.set(0, x, y, z, value);
|
bricks.set(0, x, y, z, value);
|
||||||
|
bricks.set(1, x, 0, z, 1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -92,20 +92,21 @@ impl NodeBuffer {
|
|||||||
// Data
|
// Data
|
||||||
let mut nodes = NodeData::new();
|
let mut nodes = NodeData::new();
|
||||||
|
|
||||||
let mut rng = rand::thread_rng();
|
// let mut rng = rand::thread_rng();
|
||||||
for x in 0..WORLD_SIZE {
|
// for x in 0..WORLD_SIZE {
|
||||||
for y in 0..WORLD_SIZE {
|
// for y in 0..WORLD_SIZE {
|
||||||
for z in 0..WORLD_SIZE {
|
// for z in 0..WORLD_SIZE {
|
||||||
let value = if rng.gen::<f32>()> 0.5 { 1 } else { 0 };
|
// let value = if rng.gen::<f32>()> 0.5 { 1 } else { 0 };
|
||||||
nodes.set(x, y, z, value);
|
// 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);
|
|
||||||
// }
|
// }
|
||||||
|
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
|
// Done
|
||||||
Self { nodes, texture, size, bind_layout, bind_group }
|
Self { nodes, texture, size, bind_layout, bind_group }
|
||||||
|
|||||||
@@ -7,7 +7,8 @@ use wgpu::util::DeviceExt;
|
|||||||
pub struct UniformValues {
|
pub struct UniformValues {
|
||||||
view_inv: [[f32; 4]; 4],
|
view_inv: [[f32; 4]; 4],
|
||||||
proj_inv: [[f32; 4]; 4],
|
proj_inv: [[f32; 4]; 4],
|
||||||
cam_pos: [f32; 3]
|
cam_pos: [f32; 3],
|
||||||
|
time: f32
|
||||||
}
|
}
|
||||||
|
|
||||||
impl UniformValues {
|
impl UniformValues {
|
||||||
@@ -16,10 +17,11 @@ impl UniformValues {
|
|||||||
Self::default()
|
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.view_inv = camera.view_matrix().invert().unwrap().into();
|
||||||
self.proj_inv = camera.proj_matrix().invert().unwrap().into();
|
self.proj_inv = camera.proj_matrix().invert().unwrap().into();
|
||||||
self.cam_pos = camera.position.into();
|
self.cam_pos = camera.position.into();
|
||||||
|
self.time = time;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+6
-3
@@ -16,8 +16,9 @@ pub struct Renderer {
|
|||||||
uniform_buffer: UniformBuffer,
|
uniform_buffer: UniformBuffer,
|
||||||
node_buffer: NodeBuffer,
|
node_buffer: NodeBuffer,
|
||||||
brick_buffer: BrickBuffer,
|
brick_buffer: BrickBuffer,
|
||||||
// Camera
|
// Other
|
||||||
pub camera: Camera,
|
pub camera: Camera,
|
||||||
|
start: std::time::Instant
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Renderer {
|
impl Renderer {
|
||||||
@@ -117,9 +118,11 @@ impl Renderer {
|
|||||||
// Pipeline
|
// Pipeline
|
||||||
let pipeline = Self::create_pipeline(&device, &swapchain_desc, &[&uniform_buffer.bind_layout, &node_buffer.bind_layout, &brick_buffer.bind_layout]);
|
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
|
// Save values in app
|
||||||
println!("Initialized");
|
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<PhysicalSize<u32>>) {
|
pub fn resize(&mut self, new_size: Option<PhysicalSize<u32>>) {
|
||||||
@@ -139,7 +142,7 @@ 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.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]));
|
self.queue.write_buffer(&self.uniform_buffer.buffer, 0, bytemuck::cast_slice(&[self.uniform_buffer.values]));
|
||||||
|
|
||||||
// Get next frame to render to
|
// Get next frame to render to
|
||||||
|
|||||||
Binary file not shown.
@@ -26,6 +26,8 @@ vec3 solve(vec3 hitPoint, vec3 view, vec3 normal)
|
|||||||
*/
|
*/
|
||||||
vec4 castBricks(vec3 origin, vec3 start, vec3 dir, vec3 incAxis, uint addr)
|
vec4 castBricks(vec3 origin, vec3 start, vec3 dir, vec3 incAxis, uint addr)
|
||||||
{
|
{
|
||||||
|
vec3 o = origin;
|
||||||
|
|
||||||
// Change scale
|
// Change scale
|
||||||
origin = start - origin;
|
origin = start - origin;
|
||||||
origin += dir*0.00001;
|
origin += dir*0.00001;
|
||||||
@@ -49,7 +51,7 @@ vec4 castBricks(vec3 origin, vec3 start, vec3 dir, vec3 incAxis, uint addr)
|
|||||||
// Hit point
|
// Hit point
|
||||||
vec3 mini = (pos-origin+0.5 - raySign*0.5) * rayInv;
|
vec3 mini = (pos-origin+0.5 - raySign*0.5) * rayInv;
|
||||||
float len = max(mini.x, max(mini.y, mini.z));
|
float len = max(mini.x, max(mini.y, mini.z));
|
||||||
vec3 hitPoint = (origin + dir * len) / 32.0;
|
vec3 hitPoint = (origin + dir * len) / 32.0 + o;
|
||||||
|
|
||||||
// Normal vector (negate previous increment axis and mult by sign)
|
// Normal vector (negate previous increment axis and mult by sign)
|
||||||
vec3 normal = -incAxis * raySign;
|
vec3 normal = -incAxis * raySign;
|
||||||
@@ -96,7 +98,7 @@ vec3 castNodes(vec3 origin, vec3 dir)
|
|||||||
{
|
{
|
||||||
// Hit point
|
// Hit point
|
||||||
vec3 mini = (pos-origin+0.5 - raySign*0.5) * rayInv;
|
vec3 mini = (pos-origin+0.5 - raySign*0.5) * rayInv;
|
||||||
float len = max(mini.x, max(mini.y, mini.z));
|
float len = max(0.0, max(mini.x, max(mini.y, mini.z)));
|
||||||
vec3 hitPoint = origin + dir * len;
|
vec3 hitPoint = origin + dir * len;
|
||||||
// Normal vector (negate previous increment axis and mult by sign)
|
// Normal vector (negate previous increment axis and mult by sign)
|
||||||
//vec3 normal = -incAxis * raySign;
|
//vec3 normal = -incAxis * raySign;
|
||||||
@@ -104,7 +106,7 @@ vec3 castNodes(vec3 origin, vec3 dir)
|
|||||||
|
|
||||||
// Cast brick
|
// Cast brick
|
||||||
vec4 result = castBricks(pos, hitPoint, dir, incAxis, node);
|
vec4 result = castBricks(pos, hitPoint, dir, incAxis, node);
|
||||||
if(result.a > 0.0) return result.rgb; //todo: continue if not hit
|
if(result.a > 0.0) return result.rgb;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Get new closest axis to increment
|
// Get new closest axis to increment
|
||||||
|
|||||||
@@ -7,9 +7,10 @@ layout(location=0) out vec4 out_color;
|
|||||||
|
|
||||||
layout(set=0, binding=0) uniform Uniforms
|
layout(set=0, binding=0) uniform Uniforms
|
||||||
{
|
{
|
||||||
mat4 view_matrix;
|
mat4 _viewMatrix;
|
||||||
mat4 proj_matrix_inv;
|
mat4 _projMatrixInv;
|
||||||
vec3 cam_pos;
|
vec3 _CamPos;
|
||||||
|
float _Time;
|
||||||
};
|
};
|
||||||
|
|
||||||
//layout(set = 1, binding = 0) uniform texture3D node_tex;
|
//layout(set = 1, binding = 0) uniform texture3D node_tex;
|
||||||
@@ -30,9 +31,9 @@ layout(set=2,binding=0) uniform usampler3D bricksTexture;
|
|||||||
void main()
|
void main()
|
||||||
{
|
{
|
||||||
// Calculate ray direction
|
// Calculate ray direction
|
||||||
vec3 view_dir = (proj_matrix_inv * vec4(vert_uv, 0, 1)).xyz;
|
vec3 view_dir = (_projMatrixInv * vec4(vert_uv, 0, 1)).xyz;
|
||||||
vec3 ray_dir = normalize(view_matrix * vec4(view_dir,0)).xyz;
|
vec3 ray_dir = normalize(_viewMatrix * vec4(view_dir,0)).xyz;
|
||||||
|
|
||||||
// Raycast
|
// Raycast
|
||||||
out_color = vec4(castNodes(cam_pos, ray_dir), 1.0);
|
out_color = vec4(castNodes(_CamPos, ray_dir), 1.0);
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user