aboutsummaryrefslogtreecommitdiff
path: root/src/draw.odin
diff options
context:
space:
mode:
authoriamcheeseman <[hidden email]>2026-01-14 19:21:33 -0500
committeriamcheeseman <[hidden email]>2026-01-14 19:21:33 -0500
commitd6f276be6bc1214c88cfc5346ceb7a5bea610638 (patch)
tree9b1f4d1aa4a02f2855c14dea2bf440f58343cc0e /src/draw.odin
parent1b8553bf96017795dcf081b78371c3b2a8d5ecc5 (diff)
i HATE physics bugs (i haven't fixed them yet)
Diffstat (limited to 'src/draw.odin')
-rw-r--r--src/draw.odin125
1 files changed, 125 insertions, 0 deletions
diff --git a/src/draw.odin b/src/draw.odin
new file mode 100644
index 0000000..2aa1257
--- /dev/null
+++ b/src/draw.odin
@@ -0,0 +1,125 @@
+package demonchime
+
+import "core:c"
+import "core:math"
+
+import rl "vendor:raylib"
+
+Color :: [4]f32
+
+SCREEN_WIDTH :: 480
+SCREEN_HEIGHT :: 320
+SCREEN_SIZE :: Vec2{SCREEN_WIDTH, SCREEN_HEIGHT}
+
+renderer: struct {
+ screen: rl.RenderTexture2D,
+ tint: Color,
+}
+
+@(private = "file")
+_color_to_rl :: proc(col: Color) -> rl.Color {
+ return rl.Color {
+ u8(col.r * 255),
+ u8(col.g * 255),
+ u8(col.b * 255),
+ u8(col.a * 255),
+ }
+}
+
+init_draw :: proc() {
+ renderer.screen = rl.LoadRenderTexture(SCREEN_WIDTH, SCREEN_HEIGHT)
+ renderer.tint = Color{1, 1, 1, 1}
+}
+
+deinit_draw :: proc() {
+ rl.UnloadRenderTexture(renderer.screen)
+}
+
+draw_new_frame :: proc() {
+ rl.BeginTextureMode(renderer.screen)
+ rl.ClearBackground(_color_to_rl(Color{0.2, 0.2, 0.2, 1}))
+}
+
+draw_end_frame :: proc() {
+ rl.EndTextureMode()
+
+ rl.BeginDrawing()
+ {
+ rl.ClearBackground(_color_to_rl(Color{0, 0, 0, 1}))
+ scale := math.min(
+ f32(rl.GetScreenWidth()) / f32(SCREEN_WIDTH),
+ f32(rl.GetScreenHeight()) / f32(SCREEN_HEIGHT),
+ )
+ screen_start := Vec2 {
+ (f32(rl.GetScreenWidth()) - (SCREEN_WIDTH * scale)) / 2,
+ (f32(rl.GetScreenHeight()) - (SCREEN_HEIGHT * scale)) / 2,
+ }
+
+ draw_texture_full(
+ renderer.screen.texture,
+ screen_start,
+ scale = Vec2{scale, scale},
+ )
+ }
+ rl.EndDrawing()
+}
+
+draw_rect :: proc(rect: Rect) {
+ assert(rect.size.x > 0 && rect.size.y > 0)
+
+ rl.DrawRectangle(
+ c.int(rect.start.x),
+ c.int(rect.start.y),
+ c.int(rect.size.x),
+ c.int(rect.size.y),
+ _color_to_rl(renderer.tint),
+ )
+}
+
+draw_texture :: proc {
+ draw_texture_full,
+ draw_texture_quad,
+}
+
+draw_texture_quad :: proc(
+ img: rl.Texture2D,
+ quad: Rect,
+ position: Vec2,
+ offset := Vec2{0, 0},
+ rotation: f32 = 0,
+ scale := Vec2{1, 1},
+) {
+ quad := quad
+ if scale.x < 0 {
+ quad.size.x *= -1
+ }
+ if scale.y < 0 {
+ quad.size.y *= -1
+ }
+
+ rl.DrawTexturePro(
+ img,
+ transmute(rl.Rectangle)quad,
+ rl.Rectangle {
+ position.x,
+ position.y,
+ quad.size.x * scale.x,
+ quad.size.y * scale.y,
+ },
+ offset,
+ rotation,
+ _color_to_rl(renderer.tint),
+ )
+}
+
+draw_texture_full :: proc(
+ img: rl.Texture2D,
+ position: Vec2,
+ offset := Vec2{0, 0},
+ rotation: f32 = 0,
+ scale := Vec2{1, 1},
+) {
+ size := Vec2{f32(img.width), -f32(img.height)}
+
+ draw_texture_quad(img, Rect{Vec2{0, 0}, size}, position, offset, rotation, scale)
+}