diff --git a/odin/Makefile b/odin/Makefile new file mode 100644 index 0000000..ad56f61 --- /dev/null +++ b/odin/Makefile @@ -0,0 +1,2 @@ +raylib_odin: main.odin + odin build main.odin -file -out:raylib_odin diff --git a/odin/README.md b/odin/README.md new file mode 100644 index 0000000..d659b8c --- /dev/null +++ b/odin/README.md @@ -0,0 +1,8 @@ +# Raylib in Odin + +## Quick start + +```sh +$ make +$ ./raylib_odin +``` diff --git a/odin/main.odin b/odin/main.odin new file mode 100644 index 0000000..e697300 --- /dev/null +++ b/odin/main.odin @@ -0,0 +1,107 @@ +package main + +import "core:time" + +foreign import raylib { + "../_raylib-5.5_linux_amd64/lib/libraylib.a", + "system:m", +} + +Image :: struct { + data: rawptr, + width: i32, + height: i32, + mipmaps: i32, + format: i32, +} + +Texture2D :: struct { + id: u32, + width: i32, + height: i32, + mipmaps: i32, + format: i32, +} + +Vector2 :: struct { + x: f32, + y: f32, +} + +Color :: struct { + r: u8, + g: u8, + b: u8, + a: u8, +} + +@(default_calling_convention = "c") +foreign raylib { + InitWindow :: proc(width: i32, height: i32, title: cstring) --- + CloseWindow :: proc() --- + SetTargetFPS :: proc(fps: i32) --- + SetRandomSeed :: proc(seed: u32) --- + GetRandomValue :: proc(min: i32, max: i32) -> i32 --- + LoadImage :: proc(file_name: cstring) -> Image --- + ImageResize :: proc(image: ^Image, new_width: i32, new_height: i32) --- + LoadTextureFromImage :: proc(image: Image) -> Texture2D --- + UnloadImage :: proc(image: Image) --- + UnloadTexture :: proc(texture: Texture2D) --- + WindowShouldClose :: proc() -> bool --- + GetFrameTime :: proc() -> f32 --- + BeginDrawing :: proc() --- + ClearBackground :: proc(color: Color) --- + DrawTextureV :: proc(texture: Texture2D, position: Vector2, tint: Color) --- + EndDrawing :: proc() --- +} + +WINDOW_WIDTH :: 800 +WINDOW_HEIGHT :: 600 +LOGO_HEIGHT :: 64 +LOGO_SPEED :: 300 + +BLACK :: Color{0, 0, 0, 255} +WHITE :: Color{255, 255, 255, 255} + +main :: proc() { + InitWindow(WINDOW_WIDTH, WINDOW_HEIGHT, "Raylib in Odin") + SetTargetFPS(60) + SetRandomSeed(cast(u32)time.now()._nsec) + + logo_image := LoadImage("./odin_logo.png") + ImageResize(&logo_image, logo_image.width * LOGO_HEIGHT / logo_image.height, LOGO_HEIGHT) + logo_texture := LoadTextureFromImage(logo_image) + UnloadImage(logo_image) + + x := f32(GetRandomValue(0, WINDOW_WIDTH - logo_texture.width)) + y := f32(GetRandomValue(0, WINDOW_HEIGHT - logo_texture.height)) + + dx: f32 = LOGO_SPEED + if GetRandomValue(0, 1) == 1 do dx = -dx + dy: f32 = LOGO_SPEED + if GetRandomValue(0, 1) == 1 do dy = -dy + + for !WindowShouldClose() { + delta_time := GetFrameTime() + + x += dx * delta_time + y += dy * delta_time + + if x < 0 || x + f32(logo_texture.width) >= WINDOW_WIDTH - 1 { + dx *= -1 + x += dx * delta_time + } + if y < 0 || y + f32(logo_texture.height) >= WINDOW_HEIGHT - 1 { + dy *= -1 + y += dy * delta_time + } + + BeginDrawing() + ClearBackground(BLACK) + DrawTextureV(logo_texture, Vector2{x, y}, WHITE) + EndDrawing() + } + + UnloadTexture(logo_texture) + CloseWindow() +} diff --git a/odin/odin_logo.png b/odin/odin_logo.png new file mode 100644 index 0000000..ed9b606 Binary files /dev/null and b/odin/odin_logo.png differ