From f0cf47e1e6407fa9f01976f50e1e1cae9512ae71 Mon Sep 17 00:00:00 2001 From: Brendan Hansen Date: Thu, 29 Apr 2021 22:59:10 -0500 Subject: [PATCH] adding gravity NOT DONE --- site/sand_toy.wasm | Bin 37887 -> 38520 bytes src/simulation.onyx | 78 +++++++++++++++++++++++++++++++------------- 2 files changed, 55 insertions(+), 23 deletions(-) diff --git a/site/sand_toy.wasm b/site/sand_toy.wasm index 1081a108e6c200ab3ed6264b047f9230a8a39a7a..9b792b797343a297d9874c67729f83303862f131 100644 GIT binary patch delta 11636 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 delta 10919 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 R&pfZMH_uz*NS?pM{{U_dRD=Kk diff --git a/src/simulation.onyx b/src/simulation.onyx index 6057b1f..21f7d3f 100644 --- a/src/simulation.onyx +++ b/src/simulation.onyx @@ -1,10 +1,14 @@ use package core +Gravity :: 0.3f + + + Color :: struct { Empty :: Color.{ 22, 22, 22 }; Sand :: Color.{ 226, 214, 173 }; Water :: Color.{ 100, 100, 255 }; - Wall :: Color.{ 60, 60, 30 }; + Wood :: Color.{ 60, 60, 30 }; r, g, b: u8; } @@ -33,10 +37,10 @@ Particle :: struct { Empty; Sand; Water; - Wall; + Wood; } - types :: Type.[ .Sand, .Water, .Wall ]; + types :: Type.[ .Sand, .Water, .Wood ]; type: Type = .Empty; life: f32 = 0; @@ -47,7 +51,7 @@ particle_type_to_color :: (t: Particle.Type) -> Color { switch t { case .Sand do return .Sand; case .Water do return .Water; - case .Wall do return .Wall; + case .Wood do return .Wood; case #default do return .Empty; } } @@ -101,7 +105,7 @@ update_particles :: (use board: ^ParticleBoard) { switch particle_type { case .Sand do update_sand(board, x, y); case .Water do update_water(board, x, y); - case .Wall --- // Walls do not need updating + case .Wood --- // Woods do not need updating case .Empty --- } } @@ -122,7 +126,7 @@ particle_switch :: (use board: ^ParticleBoard, a_index: i32, b_index: i32) { // This should get inlined by Onyx, when inlining is a thing. get_index :: (use board: ^ParticleBoard, x: i32, y: i32) -> i32 { - if x < 0 || y < 0 || x >= width || y >= height do return -1; + if x < 0 || y < 0 || x >= ~~width || y >= ~~height do return -1; return y * width + x; } @@ -139,9 +143,7 @@ first_empty :: (use board: ^ParticleBoard, indicies: ..i32) -> i32 { for index: indicies { if index < 0 do continue; - if particles[index].type == .Empty { - return index; - } + if particles[index].type == .Empty do return index; } return -1; @@ -167,18 +169,28 @@ can_sink :: (use board: ^ParticleBoard, below_index: i32) -> bool { update_sand :: (use board: ^ParticleBoard, x: i32, y: i32) { index := get_index(board, x, y); - b_index := get_index(board, x, y + 1); - bl_index := get_index(board, x - 1, y + 1); - br_index := get_index(board, x + 1, y + 1); + particles[index].velocity.y += Gravity; - move_to_index := first_empty(board, b_index, bl_index, br_index); + if particles[get_index(board, x, y + 1)].type != .Empty { + particles[index].velocity.y = 0; + } - if move_to_index != -1 { - particle_set(board, move_to_index, particles[index]); - particle_set(board, index, .{ .Empty }); - return; + vy := cast(i32) particles[index].velocity.y; + for yy: y + 1 .. y + vy + 2 { + b_index := get_index(board, x, yy); + bl_index := get_index(board, x - 1, yy); + br_index := get_index(board, x + 1, yy); + + move_to_index := first_empty(board, b_index, bl_index, br_index); + + if move_to_index != -1 { + particle_set(board, move_to_index, particles[index]); + particle_set(board, index, .{ .Empty }); + return; + } } + b_index := get_index(board, x, y + 1); if can_sink(board, b_index) { particle_switch(board, index, b_index); } @@ -188,16 +200,36 @@ update_sand :: (use board: ^ParticleBoard, x: i32, y: i32) { update_water :: (use board: ^ParticleBoard, x: i32, y: i32) { index := get_index(board, x, y); - b_index := get_index(board, x, y + 1); - l_index := get_index(board, x - 1, y); - r_index := get_index(board, x + 1, y); - bl_index := get_index(board, x - 1, y + 1); - br_index := get_index(board, x + 1, y + 1); + particles[index].velocity.y += Gravity; + + if particles[get_index(board, x, y + 1)].type != .Empty { + particles[index].velocity.y = 0; + } + + vy := cast(i32) particles[index].velocity.y; + b_index := get_index(board, x, y + vy + 1); + bl_index := get_index(board, x - 1, y + vy + 1); + br_index := get_index(board, x + 1, y + vy + 1); - move_to_index := first_empty(board, b_index, br_index, bl_index, r_index, l_index); + move_to_index := first_empty(board, b_index, br_index, bl_index); if move_to_index != -1 { particle_set(board, move_to_index, particles[index]); particle_set(board, index, .{ .Empty }); + return; + } + + l_index := get_index(board, x - 1, y); + r_index := get_index(board, x + 1, y); + if random.int() % 4 >= 2 { + if l_index >= 0 && particles[l_index].type == .Empty { + particle_set(board, l_index, particles[index]); + particle_set(board, index, .{ .Empty }); + } + } else { + if r_index >= 0 && particles[r_index].type == .Empty { + particle_set(board, r_index, particles[index]); + particle_set(board, index, .{ .Empty }); + } } } -- 2.25.1