Zooming and rect/line drawing
commit
8d54015a5d
@ -0,0 +1,3 @@
|
|||||||
|
physics.exe
|
||||||
|
*.pdb
|
||||||
|
.build/
|
@ -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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue