From 5da20bb33fbcfaca425e01fd9a26c8525d6b0aba Mon Sep 17 00:00:00 2001 From: Brendan Hansen Date: Mon, 5 Oct 2020 21:12:40 -0500 Subject: [PATCH] added mouse control to ui --- res/tilemap.data | Bin 196608 -> 196608 bytes res/tilemap.png | Bin 1238 -> 3649 bytes src/gfx/texture.onyx | 2 ++ src/input.onyx | 12 +++++++ src/main.onyx | 75 ++++++++++++++++++++++++++++--------------- tags | 3 +- 6 files changed, 65 insertions(+), 27 deletions(-) diff --git a/res/tilemap.data b/res/tilemap.data index dc86ab1b3d4e1319e8922bcbf327c565a76039ae..e53b2339e3396ee16a9e244915a4d6c1d1e7caca 100644 GIT binary patch delta 1213 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 BfJy)W delta 767 zcmX>obB%L?ay?^9rn7T^r?ay{K~a8MW=<*tgT}<#iMAex9b}HiM=#a-%KS#*lA?3z zCIziWD?&A#S_8DVyhF(Ei@t>N|Ux|9mwHKHFF5a8*ZnY6thsH>(6{T+Njv9O~s42^oL24D>lvTyyvE z@$0)K&VRD|{`^H~ks5Oi(?^}lyxkSe6;+onS-ux;j|>dzINy1kXP3f9+^CT=bl)MN>`RpNy9{m8pF?X1Syz zQ+GrY2cyv{jfFhihEb;VK|V_|?B6|vbO!L&AHtxtnh&+CR4Y5Dc_lzNpabk7nK*(OYhi`m-$JqU?($= z?aN7umO%~6?B}!JJO5(#rUMUjFKmAH?b@B=FPSGSTQ|x4z(GZWs0D9I`^yE(w|@Wj zer8&|efGAZB|%Qsag$v++S8cSx$xm4Hr9q z+&fwOX@>yI(_fQ&4Q3X=%`pGJ{b%=n#t=0ImJe%Ot!sJW7#$cC7;YFhNPhleSi#!h%lzX{qks1^VMVig z){5^s`~P3Kt@zETxVCcl|BMG8*B)k2WwJPXAb5ThW5p%q2K{&CHi^u+rSc5hE-gMk zV}Jcj^Zl3i)VBoAnq1E-!Sdw|bHL;SJo2m#e%}~ZOxEL-XH`)D&2VM%93X4LIZz$0N`3Bt^bq@&R52mZDAk4wE^749lDB3nrHX8FR=rOT1_oqjZDS US9MKUeFh-#boFyt=akR{0A5Z~i2wiq diff --git a/src/gfx/texture.onyx b/src/gfx/texture.onyx index 2928c3e..6536f63 100644 --- a/src/gfx/texture.onyx +++ b/src/gfx/texture.onyx @@ -60,6 +60,8 @@ texture_prepare :: proc (use tex: ^Texture) { gl.texImage2D(gl.TEXTURE_2D, 0, format, width, height, 0, format, gl.UNSIGNED_BYTE, data); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); gl.bindTexture(gl.TEXTURE_2D, -1); } diff --git a/src/input.onyx b/src/input.onyx index 5b26b4e..ba86a0f 100644 --- a/src/input.onyx +++ b/src/input.onyx @@ -25,6 +25,9 @@ InputState :: struct { x : i32; y : i32; + dx : i32; + dy : i32; + buttons_down : [BUTTON_COUNT] bool; buttons_just_down : [BUTTON_COUNT] bool; @@ -61,6 +64,8 @@ process_event :: proc (use state: ^InputState, ev: ^event.Event) { } case MouseDown { + mouse.dx += (ev.mouse.pos_x - half_window_width) - mouse.x; + mouse.dy += (ev.mouse.pos_y - half_window_height) - mouse.y; mouse.x = ev.mouse.pos_x - half_window_width; mouse.y = ev.mouse.pos_y - half_window_height; @@ -69,6 +74,8 @@ process_event :: proc (use state: ^InputState, ev: ^event.Event) { } case MouseUp { + mouse.dx += (ev.mouse.pos_x - half_window_width) - mouse.x; + mouse.dy += (ev.mouse.pos_y - half_window_height) - mouse.y; mouse.x = ev.mouse.pos_x - half_window_width; mouse.y = ev.mouse.pos_y - half_window_height; mouse.buttons_down[cast(u32) ev.mouse.button] = false; @@ -76,6 +83,8 @@ process_event :: proc (use state: ^InputState, ev: ^event.Event) { } case MouseMove { + mouse.dx += (ev.mouse.pos_x - half_window_width) - mouse.x; + mouse.dy += (ev.mouse.pos_y - half_window_height) - mouse.y; mouse.x = ev.mouse.pos_x - half_window_width; mouse.y = ev.mouse.pos_y - half_window_height; } @@ -100,6 +109,9 @@ postupdate :: proc (use state: ^InputState) { if mouse.wheel_ups > ~~0 do mouse.wheel_ups -= ~~1; if mouse.wheel_downs > ~~0 do mouse.wheel_downs -= ~~1; + + mouse.dx = 0; + mouse.dy = 0; } diff --git a/src/main.onyx b/src/main.onyx index a62cbb4..5016653 100644 --- a/src/main.onyx +++ b/src/main.onyx @@ -91,7 +91,15 @@ draw_quad :: proc (use rc: ^RenderContext, quad: ^Quad) { curr_quad_idx += 1; } -render_context_flush :: proc (use rc: ^RenderContext) { +render_context_ui :: proc (use rc: ^RenderContext) { + quad_renderer_update_world(quad_renderer, 1.0f, 1.0f, 0.0f, 0.0f); + quad_rebuffer_data(quad_renderer); + quad_renderer_draw(quad_renderer, curr_quad_idx); + + curr_quad_idx = 0; +} + +render_context_transformation :: proc (use rc: ^RenderContext) { quad_renderer_update_world(quad_renderer, scale, scale, trans_x, trans_y); quad_rebuffer_data(quad_renderer); quad_renderer_draw(quad_renderer, curr_quad_idx); @@ -143,14 +151,9 @@ update :: proc () { if input_state.mouse.wheel_ups > ~~0 do renderer.scale *= 1.125f; if input_state.mouse.wheel_downs > ~~0 do renderer.scale /= 1.125f; - curr_tile := tilemap_screen_coord_to_tile(^tilemap, V2f.{ ~~input_state.mouse.x, ~~input_state.mouse.y }); - if curr_tile != null { - v := cast(i32) curr_tile.r; - if v < 200 do v += 20; - - curr_tile.r = ~~v; - curr_tile.g = ~~v; - curr_tile.b = ~~v; + if input_state.mouse.buttons_down[0] { + renderer.trans_x += ~~input_state.mouse.dx / renderer.scale; + renderer.trans_y += ~~input_state.mouse.dy / renderer.scale; } if simulating { @@ -172,16 +175,18 @@ update :: proc () { } for ^tile: tilemap.tiles { - if tile.r >= ~~1 do tile.r -= ~~1; else do tile.r = ~~0; - if tile.g >= ~~1 do tile.g -= ~~1; else do tile.g = ~~0; - if tile.b >= ~~1 do tile.b -= ~~1; else do tile.b = ~~0; + if tile.r < ~~255 do tile.r += ~~1; else do tile.r = ~~255; + if tile.g < ~~255 do tile.g += ~~1; else do tile.g = ~~255; + if tile.b < ~~255 do tile.b += ~~1; else do tile.b = ~~255; } } + draw :: proc () { gl.clearColor(0.1f, 0.1f, 0.1f, 1.0f); gl.clear(gl.COLOR_BUFFER_BIT); + // World Rendering texture_use(^textures.tilemap); tilemap_draw(^tilemap, ^renderer); @@ -194,10 +199,12 @@ draw :: proc () { dude_sprite.x, dude_sprite.y, dude_sprite.w, dude_sprite.h); } + render_context_transformation(^renderer); + // UI Rendering renderer.color = Color4f32.{ 0.0f, 0.0f, 0.0f, 1.0f }; draw_rect(^renderer, ~~input_state.mouse.x, ~~input_state.mouse.y, 10f, 10f); - render_context_flush(^renderer); + render_context_ui(^renderer); } @@ -228,6 +235,7 @@ main :: proc (args: [] cstring) { atlas = atlas_create(^textures.tilemap); atlas_map(^atlas, 0, AtlasSprite.{ x = 16.0f, y = 0.0f, w = 16.0f, h = 16.0f }); + atlas_map(^atlas, 1, AtlasSprite.{ x = 32.0f, y = 0.0f, w = 16.0f, h = 16.0f }); event.init(); input.init(^input_state); @@ -237,11 +245,11 @@ main :: proc (args: [] cstring) { Dude_Color_Table[2] = Color4f32.{ 0.2f, 0.2f, 1.0f, 1.0f }; array_init(^dudes); - for i: 0 .. 2000 { + for i: 0 .. 500 { array_push(^dudes, dude_create_random()); } - tilemap_init(^tilemap, 202, 140); + tilemap_init(^tilemap, 250, 140); game_launch :: proc () #foreign "game" "launch" ---; game_launch(); @@ -282,9 +290,9 @@ dude_update :: proc (use dude: ^Dude, other_dudes: ^QuadTree(Dude)) { target_g := cast(u8) cast(u32) (color.g * 255.0f); target_b := cast(u8) cast(u32) (color.b * 255.0f); - diff_r := cast(i32) (target_r - tile.r) >>> ~~2; - diff_g := cast(i32) (target_g - tile.g) >>> ~~2; - diff_b := cast(i32) (target_b - tile.b) >>> ~~2; + diff_r := cast(i32) (target_r - tile.r) >>> 2; + diff_g := cast(i32) (target_g - tile.g) >>> 2; + diff_b := cast(i32) (target_b - tile.b) >>> 2; tile.r += ~~diff_r; tile.g += ~~diff_g; @@ -356,9 +364,9 @@ Tilemap :: struct { } Tile :: struct { - r : u8 = ~~0; - g : u8 = ~~0; - b : u8 = ~~0; + r : u8 = ~~255; + g : u8 = ~~255; + b : u8 = ~~255; } tilemap_init :: proc (use tm: ^Tilemap, w := 10, h := 10) { @@ -366,6 +374,8 @@ tilemap_init :: proc (use tm: ^Tilemap, w := 10, h := 10) { height = h; alloc_slice(^tiles, width * height); + printf("The tilemap takes up %i kibibytes.\n", (width * height * sizeof Tile) >> 10); + for ^t: tiles do *t = Tile.{}; } @@ -376,9 +386,22 @@ tilemap_free :: proc (use tm: ^Tilemap) { } tilemap_draw :: proc (use tm: ^Tilemap, renderer: ^RenderContext) { - for y: 0 .. height do for x: 0 .. width { - renderer.color = tile_to_color4f32(tiles[y * width + x]); - draw_rect(renderer, ~~x * TILE_SIZE + origin.x, ~~y * TILE_SIZE + origin.y, TILE_SIZE, TILE_SIZE); + x_pos := origin.x; + y_pos := origin.y; + + for y: 0 .. height { + for x: 0 .. width { + renderer.color = tile_to_color4f32(tiles[y * width + x]); + + // SPEEDUP: Write an optimized version of draw_rect that can take a batch of changes all at once. + // This requires a lot of copying overhead. + draw_rect(renderer, x_pos, y_pos, TILE_SIZE, TILE_SIZE); + + x_pos += ~~TILE_SIZE; + } + + x_pos = origin.x; + y_pos += TILE_SIZE; } } @@ -389,8 +412,8 @@ tilemap_get_tile :: proc (use tm: ^Tilemap, x: u32, y: u32) -> Tile { tilemap_screen_coord_to_tile :: proc (use tm: ^Tilemap, pos: V2f) -> ^Tile { n := v2_sub(pos, origin); - tx := cast(i32) (n.x / TILE_SIZE); - ty := cast(i32) (n.y / TILE_SIZE); + tx := cast(i32) (n.x / ~~TILE_SIZE); + ty := cast(i32) (n.y / ~~TILE_SIZE); if tx < 0 || ty < 0 || tx >= width || ty >= height do return null; return ^tiles[tx + ty * width]; diff --git a/tags b/tags index ce1d00b..4dd576e 100644 --- a/tags +++ b/tags @@ -890,8 +890,9 @@ random_seed /usr/share/onyx/core/random.onyx /^random_seed :: proc (s: u32) do s range /usr/share/onyx/core/builtin.onyx /^range :: struct {$/ readBuffer /usr/share/onyx/core/js/webgl.onyx /^readBuffer :: proc (src: GLenum) #foreign "gl" "readBuffer" ---$/ readPixels /usr/share/onyx/core/js/webgl.onyx /^readPixels :: proc (x: GLint, y: GLint, width: GLsizei, height: GLsizei, format: GLenum, type: GLenum, pixels: string) #foreign "gl" "readPixels" ---$/ -render_context_flush src/main.onyx /^render_context_flush :: proc (use rc: ^RenderContext) {$/ render_context_init src/main.onyx /^render_context_init :: proc (use rc: ^RenderContext, qr: ^QuadRenderer = null) {$/ +render_context_transformation src/main.onyx /^render_context_transformation :: proc (use rc: ^RenderContext) {$/ +render_context_ui src/main.onyx /^render_context_ui :: proc (use rc: ^RenderContext) {$/ renderbufferStorageMultisample /usr/share/onyx/core/js/webgl.onyx /^renderbufferStorageMultisample :: proc (target: GLenum, samples: GLsizei, internalforamt: GLenum, width: GLsizei, height: GLsizei) #foreign "gl" "renderbufferStorageMultisample" ---$/ renderer src/globals.onyx /^renderer : RenderContext$/ resize /usr/share/onyx/core/builtin.onyx /^resize :: proc (use a: Allocator, ptr: rawptr, size: u32) -> rawptr {$/ -- 2.25.1