From 8d54015a5d5149e9178aede386d9caca5c7f25cf Mon Sep 17 00:00:00 2001 From: Cameron Reikes Date: Mon, 23 Jan 2023 15:17:22 -0800 Subject: [PATCH] Zooming and rect/line drawing --- .gitignore | 3 ++ physics.jai | 146 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 149 insertions(+) create mode 100644 .gitignore create mode 100644 physics.jai diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..701ae90 --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +physics.exe +*.pdb +.build/ diff --git a/physics.jai b/physics.jai new file mode 100644 index 0000000..b60c5d5 --- /dev/null +++ b/physics.jai @@ -0,0 +1,146 @@ +#import "Basic"; +#import "Math"; +#import "Window_Creation"; +Input :: #import "Input"; +Simp :: #import "Simp"; + +window_width : s32 = 1280; +window_height : s32 = 720; + +xy :: (x: int, y: int) -> Vector2 { + return xy(cast(float)x, cast(float)y); +} +drawing_in_world_space: bool = false; +line :: (_from: Vector2, _to: Vector2, width: float = 1.0) { + from := _from; + to := _to; + if drawing_in_world_space { + from = world_to_screen(from); + to = world_to_screen(to); + } + Simp.set_shader_for_color(); + normal := rotate(unit_vector(to - from), PI/2.0); + Simp.immediate_quad(from + normal*width, from - normal*width, to + normal*width, to - normal*width); +} + +Rect :: struct { + pos, halfsize: Vector2; // pos is in world space + rotation: float; +}; +draw_rect :: (using r: Rect) { + facing_to_right := rotate(xy(halfsize.x,0.0), rotation); + facing_to_up := rotate(xy(0.0,halfsize.y), rotation); + + upper_right := pos + facing_to_right + facing_to_up; + upper_left := pos - facing_to_right + facing_to_up; + lower_left := pos - facing_to_right - facing_to_up; + lower_right := pos + facing_to_right - facing_to_up; + + line(upper_left, upper_right); + line(upper_right, lower_right); + line(lower_right, lower_left); + line(lower_left, upper_left); +} + +mouse :: () -> Vector2 { + x, y := get_mouse_pointer_position(); + pos: Vector2 = xy(cast(float)x, cast(float)y); + + // simp is lower left is (0, 0) and y+ is up + pos.y = window_height - pos.y; + + return pos; +} + +Camera :: struct { + pos: Vector2; + zoom: float = 1.0; +}; + +camera : Camera; +screen_to_world :: (screen: Vector2) -> Vector2 { + using camera; + return (screen + pos)*zoom; +} +world_to_screen :: (world: Vector2) -> Vector2 { + using camera; + // world = (screen + pos)*zoom; + // world/zoom = screen + pos; + // world/zoom - pos = screen; + return (world/zoom) - pos; +} + +main :: () { + window := create_window(window_width, window_height, "A Window"); + // Actual render size in pixels can be different from the window dimensions we specified above (for example on high-resolution displays on macOS/iOS). + window_width, window_height = Simp.get_render_dimensions(window); + + Simp.set_render_target(window); + + rects: [..]Rect; + array_add(*rects, .{pos = #run xy(0.0, 0.0), halfsize = #run xy(30.0)}); + array_add(*rects, .{pos = #run xy(40.0, 0.0), halfsize = #run xy(30.0)}); + + quit := false; + last_time := get_time(); + panning: bool = false; + last_mouse_pos := mouse(); + while !quit { + dt := cast(float)(get_time() - last_time); + last_time = get_time(); + Input.update_window_events(); + mouse_delta := mouse() - last_mouse_pos; // using Input.mouse_delta_x seems to incorrectly accumulate + last_mouse_pos = mouse(); + + for Input.get_window_resizes() { + Simp.update_window(it.window); // Simp will do nothing if it doesn't care about this window. + + if it.window == window { + should_reinit := (it.width != window_width) || (it.height != window_height); + + window_width = it.width; + window_height = it.height; + + //if should_reinit my_init_fonts(); // Resize the font for the new window size. + } + } + + print("%\n", Input.mouse_delta_z); + camera.zoom *= 1.0 - 0.1*Input.mouse_delta_z/120.0; + if panning { + camera.pos -= mouse_delta; + + //camera.pos -= xy(Input.mouse_delta_x, -Input.mouse_delta_y); + + // this doesn't fix it + //Input.mouse_delta_x = 0; + //Input.mouse_delta_y = 0; + } + + rects[0].rotation += dt * 1.0; + + Simp.clear_render_target(0.0, 0.0, 0.0, 1.0); + + drawing_in_world_space = true; + for rects draw_rect(it); + line(xy(0.0, 0.0), screen_to_world(mouse())); + drawing_in_world_space = false; + + Simp.swap_buffers(window); + + for Input.events_this_frame { + if it.type == .QUIT then quit = true; + + if it.type == { + case .KEYBOARD; + if it.key_pressed && it.key_code == .ESCAPE { + quit = true; + } + if it.key_code == .MOUSE_BUTTON_LEFT { + panning = cast(bool)it.key_pressed; + } + } + } + + } +}