diff --git a/.gitignore b/.gitignore index d8b295f..e5d7845 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ /assetsviewer /topdown /top-down-shooter +/leveleditor diff --git a/leveleditor.odin b/leveleditor.odin new file mode 100644 index 0000000..986ec2d --- /dev/null +++ b/leveleditor.odin @@ -0,0 +1,117 @@ +package leveleditor + +import rl "vendor:raylib" +import "core:math" +import "core:math/rand" +import "core:fmt" +import ui "vendor:microui" +import "rlmui" + +Vec2 :: [2]f32 +Rect :: rl.Rectangle +Img :: rl.Image +Color :: rl.Color +Tex :: rl.Texture +Key :: rl.KeyboardKey + +SCREEN_WIDTH : i32 = 1400 +SCREEN_HEIGHT : i32 = 1000 + + +AppState :: struct { + dt: f32, + ctx: ^ui.Context, + keymap: map[string]Key, + mouse_drag_start: Maybe(Vec2), + tileset: Tex, +} + +init_state :: proc() -> ^AppState { + tileset := rl.LoadImage("./Assets/Tileset/tileset.png") + defer rl.UnloadImage(tileset) + + keymap := make(map[string]Key) + keymap["Left"] = .A + keymap["Right"] = .D + keymap["Up"] = .W + keymap["Down"] = .S + + ctx := rlmui.InitUIScope() + state := AppState { + keymap = keymap, + tileset = rl.LoadTextureFromImage(tileset), + } + + return new_clone(state) +} + +user_input :: proc(s: ^AppState) { + if rl.IsMouseButtonPressed(rl.MouseButton.LEFT) { + s.mouse_drag_start = rl.GetMousePosition() + } + if rl.IsMouseButtonReleased(rl.MouseButton.LEFT) { + s.mouse_drag_start = nil + } +} + +update :: proc(s: ^AppState) { +} + +draw :: proc(s: ^AppState) { + w, h := f32(s.tileset.width), f32(s.tileset.height) + src := Rect{0, 0, w, h} + ratio := h / w + scale :f32 = 2.6 + dst := Rect{5, 5, w * scale, h * scale} + rl.DrawTexturePro(s.tileset, src, dst, {0,0}, 0, rl.WHITE) + pixels :f32 = 8 + color_lines := Color{255, 255, 255, 127} + padding :f32 = 5 + for row in 0..=h / pixels { + start := Vec2{0, row * pixels * scale} + end := Vec2{w * scale, row * pixels * scale} + rl.DrawLineEx(start + padding, end + padding, 1, color_lines) + } + for col in 0..=w / pixels { + start := Vec2{col * pixels * scale, 0} + end := Vec2{col * pixels * scale, h * scale} + rl.DrawLineEx(start + padding, end + padding, 1, color_lines) + } + // Rectangular Mouse Selection + if mpos_start, ok := s.mouse_drag_start.(Vec2); ok { + mpos := rl.GetMousePosition() + start_x := min(mpos.x, mpos_start.x) + start_y := min(mpos.y, mpos_start.y) + w := abs(mpos.x - mpos_start.x) + h := abs(mpos.y - mpos_start.y) + rl.DrawRectangleLinesEx(Rect{start_x, start_y, w, h }, 4, rl.BLUE) + } +} + +main :: proc() { + rl.SetTraceLogLevel(.ERROR) + rl.InitWindow(SCREEN_WIDTH, SCREEN_HEIGHT, "Level Editor") + rl.SetTargetFPS(60) + + state := init_state() + defer free(state) + + for !rl.WindowShouldClose() { + state.dt = rl.GetFrameTime() + + user_input(state) + + update(state) + + rl.BeginDrawing() + rl.ClearBackground(rl.GRAY) + + draw(state) + + free_all(context.temp_allocator) + rl.EndDrawing() + } + + rl.UnloadTexture(state.tileset) + rl.CloseWindow() +}