From 32dba52411a573745ce0e0829bdefb4b6a64577b Mon Sep 17 00:00:00 2001 From: Brendan Hansen Date: Thu, 29 Apr 2021 11:08:41 -0500 Subject: [PATCH] better mouse controlling --- site/sand_toy.wasm | Bin 37934 -> 37887 bytes src/sand_toy.onyx | 34 +++++++++++++++++++++++++++++----- src/simulation.onyx | 31 ++++++++++++++++--------------- 3 files changed, 45 insertions(+), 20 deletions(-) diff --git a/site/sand_toy.wasm b/site/sand_toy.wasm index 49bc6f47d2957d2ef9e05b45fad247eaa12d20a2..1081a108e6c200ab3ed6264b047f9230a8a39a7a 100644 GIT binary patch delta 11316 zcma)i3w%}8mG|EJocqd2a(5u_kmTH(5CQ^*M*<`u+2N&v;A^mIB?P!Y9weBAhgG-% zDWD(%3oTfxd__O8K5E6Uqph{HV`rFZJI>fv?4ZEV`Pxo>VEwh@w4(E0=iHkIKigje z_nf`fUVE>-*IsMwwb$9t98;e?t|~-J&l)L&knhN{r7|g&29w^OSgMjqnOtfmllv;h zF0nV^Pb?K;X&_Z?^BV*{jDp-GHv#eqRdTaH+s$}}8N+`-+?50ewTUTZ(tm6Q*}fl_ zU$!*Ur}Cem+PqnAUK-fE8Ek|)7#w4-?&|5a6B}E5_kA+FsXaI9XV9m#mV4 zj!JWr#eJ?wbfCMzO@^;Z^rql`ZeHI`M{8&M5K51C3UgKG%B}@ntAwBi6_bi?Qw3!_ zqJl(c%d(Ed;zT!wZ+bC|Wv08k2&TJ)Y(kVIXES2wGxqpMqF*sCDC zjGo?>?%w8(uCBGhVTxs~ohwpIxHpI48xtFQ*L5en?xT#jba3JIt%(h5ySjTt1Z`47 zyfx?>yY%9yo!mt$xb1(o) zNN^JoJEA}v5h@E+ps)a2+`#`svDD_)wk_8t#fX3{MPE1=g8G{ic}{4A69{LWu84+gpnt%g87xjBrNmlZ$&7-m-GV@@r-+-Jc z@`{Y_+^as3<wv3Z9z!bLGspG+FC0snhdb}%) z+h#7oUQRpK&vA~bV#f`-k+xWnPB{5?wul-k-Ov~uTc?C$$lWlJ-n}bhF!*XshJ{*s zeO*;(Cb|}Wxj0o8&izt`c^CrBjcn7C=;A#;mEWPVU=jUGU^e~f@(dr+^->NdJWtWh zU37fMY+-(DW zZ{uflvTrs$ywm9)$HG+Uhg*k5q$@gDq%OIoxzxAaxuyE@Jksn&u%nt z2xEJoYvJXXy~=Pk9>U4>M=K4);wo3>WD8JuQtY@rV}d8tJ1`6Vs>B+_Bo?#Sh?o_# zV+!QptV&9OY%(^4Kl>7+&}pYF?yWB@9uQ#JYlNeglxq9x9%;aB@ybsLMk zkVSr;K5(XHWqEiO(kG6fBbkrL1Js!Hu6jVxxa_6sh$1(qoSwrYv^nqAu{(9Os>zAK$hS)w@d@2QdZHU$%ha@+*I+7i)3z$gENi6F zqL@5SGmC2VAE5)D_#iH;O}|guin{ZDC1GT!fFkn)0=D%Z$tj*2d>2a$OS!9fIo(vU z2~POuB~vu4PO;VD0eU@?MvVA2s@@oJ9R7Jn=|mb`JwN-roC77YqmBcHHf6bSN|YT= z5lk+xu@!gxt;(ih;2vNlO0f=r_3I-qqt{}EavA++>;`!wO^e6mV{~SIdG=u5x{
    nPRjLX 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 diff --git a/src/sand_toy.onyx b/src/sand_toy.onyx index 7d717de..ee56ab4 100644 --- a/src/sand_toy.onyx +++ b/src/sand_toy.onyx @@ -9,13 +9,16 @@ particle_board: ParticleBoard; world_texture : gl.GLTexture world_texture_data : [] u8 -world_width := 256 +world_width := 512 world_height := 256 window_width := 0 window_height := 0 selected_particle := Particle.Type.Empty +mouse_down := false +mouse_x := 0.0f +mouse_y := 0.0f init :: () { events.init(); @@ -57,10 +60,10 @@ poll_events :: () { } if event.mouse.button == .Left { - mx := (cast(f32) event.mouse.pos_x / cast(f32) window_width) * ~~world_width; - my := ((~~event.mouse.pos_y - BAR_HEIGHT) / cast(f32) window_height) * ~~world_height; + mouse_x = (cast(f32) event.mouse.pos_x / cast(f32) window_width) * ~~world_width; + mouse_y = ((~~event.mouse.pos_y - BAR_HEIGHT) / cast(f32) window_height) * ~~world_height; - spawn_particles(~~mx, ~~my, 20, selected_particle); + mouse_down = true; } if event.mouse.button == .Right { @@ -70,10 +73,25 @@ poll_events :: () { remove_particles(~~mx, ~~my, 10); } } + + case .MouseUp { + mouse_down = false; + } + + case .MouseMove { + if event.mouse.pos_y < ~~BAR_HEIGHT do return; + + if mouse_down { + mouse_x = (cast(f32) event.mouse.pos_x / cast(f32) window_width) * ~~world_width; + mouse_y = ((~~event.mouse.pos_y - BAR_HEIGHT) / cast(f32) window_height) * ~~world_height; + } + } } } handle_ui_mouse :: (event: ^events.MouseEvent) { + if event.kind != .MouseDown do return; + if event.button == .Left { selected_particle = Particle.types[cast(u32) math.floor(~~event.pos_x / BAR_HEIGHT)]; } @@ -104,6 +122,10 @@ remove_particles :: (x: i32, y: i32, radius: i32) { } update :: () { + if mouse_down { + spawn_particles(~~mouse_x, ~~mouse_y, 20, selected_particle); + } + update_particles(^particle_board); } @@ -111,7 +133,9 @@ prepare_world_texture :: () { for y: particle_board.height { for x: particle_board.width { index := get_index(^particle_board, x, y); - color := particle_type_to_color(particle_board.particles[index].type); + type := particle_board.particles[index].type; + color := particle_type_to_color(type); + world_texture_data[index * 3 + 0] = color.r; world_texture_data[index * 3 + 1] = color.g; world_texture_data[index * 3 + 2] = color.b; diff --git a/src/simulation.onyx b/src/simulation.onyx index 93a12fa..6057b1f 100644 --- a/src/simulation.onyx +++ b/src/simulation.onyx @@ -29,7 +29,7 @@ ParticleBoard :: struct { } Particle :: struct { - Type :: enum { + Type :: enum (u8) { Empty; Sand; Water; @@ -147,6 +147,17 @@ first_empty :: (use board: ^ParticleBoard, indicies: ..i32) -> i32 { return -1; } +#private_file +all_are :: (use board: ^ParticleBoard, type: Particle.Type, indicies: ..i32) -> bool { + for index: indicies { + if index < 0 do continue; + + if particles[index].type != type do return false; + } + + return true; +} + #private_file can_sink :: (use board: ^ParticleBoard, below_index: i32) -> bool { return particle_is_liquid(particles[below_index].type); @@ -160,12 +171,7 @@ update_sand :: (use board: ^ParticleBoard, x: i32, y: i32) { bl_index := get_index(board, x - 1, y + 1); br_index := get_index(board, x + 1, y + 1); - move_to_index := -1; - if time % 2 == 0 { - move_to_index = first_empty(board, b_index, bl_index, br_index); - } else { - move_to_index = first_empty(board, b_index, br_index, bl_index); - } + 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]); @@ -183,17 +189,12 @@ update_water :: (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); 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); - move_to_index := -1; - if time % 2 == 1 { - move_to_index = first_empty(board, b_index, bl_index, br_index, l_index, r_index); - } else { - 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, r_index, l_index); if move_to_index != -1 { particle_set(board, move_to_index, particles[index]); -- 2.25.1