diff options
| author | iamcheeseman <[hidden email]> | 2026-01-14 19:21:33 -0500 |
|---|---|---|
| committer | iamcheeseman <[hidden email]> | 2026-01-14 19:21:33 -0500 |
| commit | d6f276be6bc1214c88cfc5346ceb7a5bea610638 (patch) | |
| tree | 9b1f4d1aa4a02f2855c14dea2bf440f58343cc0e /src/draw.odin | |
| parent | 1b8553bf96017795dcf081b78371c3b2a8d5ecc5 (diff) | |
i HATE physics bugs (i haven't fixed them yet)
Diffstat (limited to 'src/draw.odin')
| -rw-r--r-- | src/draw.odin | 125 |
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) +} |
