From 589f2bd45c3cb8e518df28e986f9f8dcdca73ab6 Mon Sep 17 00:00:00 2001 From: codegirl-007 Date: Sat, 1 Aug 2026 23:49:37 -0700 Subject: [PATCH] camera --- engine/app.odin | 3 +++ engine/camera.odin | 17 +++++++++++++++++ engine/sprite.odin | 14 +++++++------- examples/toad/main.odin | 2 ++ 4 files changed, 29 insertions(+), 7 deletions(-) create mode 100644 engine/camera.odin diff --git a/engine/app.odin b/engine/app.odin index 424c83e..310b5bb 100644 --- a/engine/app.odin +++ b/engine/app.odin @@ -35,6 +35,7 @@ App :: struct { transfer_buffer: ^sdl.GPUTransferBuffer, draw_list: [dynamic]Queued_Sprite, clear_color: sdl.FColor, + camera: Camera, } Shader_Backend :: enum { @@ -124,6 +125,8 @@ init :: proc(app: ^App, title: cstring, width, height: i32) -> bool { app.draw_list = make([dynamic]Queued_Sprite) + app.camera = camera_default() + return true } diff --git a/engine/camera.odin b/engine/camera.odin new file mode 100644 index 0000000..649e0da --- /dev/null +++ b/engine/camera.odin @@ -0,0 +1,17 @@ +package engine + +Camera :: struct { + position: Vec2, + anchor: Vec2, +} + +camera_default :: proc() -> Camera { + return Camera{position = {0, 0}, anchor = {0.5, 0.5}} +} + +world_to_screen :: proc(cam: Camera, world: Vec2, viewport: Vec2) -> Vec2 { + return { + world.x - cam.position.x + viewport.x * cam.anchor[0], + world.y - cam.position.y + viewport.y * cam.anchor[1], + } +} diff --git a/engine/sprite.odin b/engine/sprite.odin index 1e83b34..afa4dfa 100644 --- a/engine/sprite.odin +++ b/engine/sprite.odin @@ -109,14 +109,17 @@ draw_sprite :: proc(app: ^App, sprite: ^Sprite) { trim_y := f32(frame.trim_offset[1]) pivot := sprite.data.def.pivot - canvas_top := sprite.position.y - src_h * pivot[1] + viewport := Vec2{f32(app.swapchain_w), f32(app.swapchain_h)} + feet := world_to_screen(app.camera, sprite.position, viewport) + + canvas_top := feet.y - src_h * pivot[1] x0_px, y0_px: f32 if sprite.flip_x { - canvas_left := sprite.position.x - (1.0 - pivot[0]) * src_w + canvas_left := feet.x - (1.0 - pivot[0]) * src_w x0_px = canvas_left + (src_w - trim_x - fw) y0_px = canvas_top + trim_y } else { - canvas_left := sprite.position.x - src_w * pivot[0] + canvas_left := feet.x - src_w * pivot[0] x0_px = canvas_left + trim_x y0_px = canvas_top + trim_y } @@ -147,10 +150,7 @@ draw_sprite :: proc(app: ^App, sprite: ^Sprite) { {pos = p3, uv = {u0, v1}}, } - append( - &app.draw_list, - Queued_Sprite{texture = sprite.data.texture, verts = verts}, - ) + append(&app.draw_list, Queued_Sprite{texture = sprite.data.texture, verts = verts}) } set_sprite_clip :: proc(sprite: ^Sprite, clip: string) { diff --git a/examples/toad/main.odin b/examples/toad/main.odin index ba68abe..e5fef95 100644 --- a/examples/toad/main.odin +++ b/examples/toad/main.odin @@ -39,6 +39,8 @@ main :: proc() { } else { eng.set_sprite_clip(&toad, "idle") } + + app.camera.position = toad.position - {0, 100} eng.update_sprite(&toad, dt) eng.begin_frame(&app)