From 00be1d2e23c4e46d88e969c527560a07df86f8f4 Mon Sep 17 00:00:00 2001 From: Joseph Ferano Date: Sat, 7 Sep 2024 10:55:49 +0700 Subject: [PATCH] Odin version --- odin-version/tide.odin | 177 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 177 insertions(+) create mode 100644 odin-version/tide.odin diff --git a/odin-version/tide.odin b/odin-version/tide.odin new file mode 100644 index 0000000..cf62c31 --- /dev/null +++ b/odin-version/tide.odin @@ -0,0 +1,177 @@ +package tide + +import "core:os" +import "core:log" +import "core:math" +import "core:strings" +import fmt "core:fmt" +import sdl "vendor:sdl2" +import ttf "vendor:sdl2/ttf" +import txtedit "core:text/edit" + +AppState :: struct { + buffer_dirty: bool, +} + +SdlCtx :: struct { + window: ^sdl.Window, + surface: ^sdl.Surface, + renderer: ^sdl.Renderer, + font: ^ttf.Font, + ftex: ^sdl.Texture, + text_surface: ^sdl.Surface, + buffer_text: ^BufferText, + // font_data: ^FontData, + + should_close: bool, + app_start: f64, + + frame_start: f64, + frame_end: f64, + frame_elapsed: f64, +} + +BufferText :: struct { + builder: strings.Builder, +} + +FontData :: struct { + font: ^ttf.Font, + texture: ^sdl.Texture, + rect: sdl.Rect, + font_w: int, + font_h: int, +} + +WIN_TITLE :: "FIDE" +WIN_X := i32(0) +WIN_Y := i32(100) +WIN_W := i32(950) +WIN_H := i32(1000) +WIN_FLAGS :: sdl.WindowFlags{.SHOWN} + +state := AppState{} +ctx := SdlCtx{} + +sdl_init :: proc() -> (ok: bool) { + ctx.app_start = f64(sdl.GetPerformanceCounter()) / f64(sdl.GetPerformanceFrequency()) + + if sdl.Init(sdl.INIT_VIDEO) != 0 { + return false + } + + ctx.window = sdl.CreateWindow(WIN_TITLE, WIN_X, WIN_Y, WIN_W, WIN_H, WIN_FLAGS) + + ctx.renderer = sdl.CreateRenderer(ctx.window, -1, {.ACCELERATED, .PRESENTVSYNC}) + if ctx.renderer == nil { + log.errorf("sdl2.CreateRenderer failed.") + return false + } + + if ttf.Init() != 0 { + log.errorf("sdl.TTF_Init failed.") + return false + } + + font_path := cstring("../JetBrainsMono-Regular.otf") + ctx.font = ttf.OpenFont(font_path, 32) + if ctx.font == nil { + log.errorf("sdl.TTF_OpenFont failed.") + return false + } + + + bt := new(BufferText) + bt.builder = strings.builder_make(0, 512) + ctx.buffer_text = bt + append(&bt.builder.buf, "// Code goes here...\ntest more stuff ok") + str := strings.to_cstring(&ctx.buffer_text.builder) + color := sdl.Color{ 0, 0, 0, 255} + ctx.text_surface = ttf.RenderUTF8_Blended_Wrapped(ctx.font, str, color, 900); + ctx.ftex = sdl.CreateTextureFromSurface(ctx.renderer, ctx.text_surface); + state.buffer_dirty = true + return true +} + +process_input :: proc() { + e: sdl.Event + + for sdl.PollEvent(&e) { + #partial switch(e.type) { + case .QUIT: + ctx.should_close = true + case .KEYDOWN: + #partial switch(e.key.keysym.sym) { + case .ESCAPE: + ctx.should_close = true + case .BACKSPACE: + strings.pop_rune(&ctx.buffer_text.builder) + state.buffer_dirty = true + case .RETURN: + strings.write_rune(&ctx.buffer_text.builder, '\n') + state.buffer_dirty = true + } + case .TEXTINPUT: + key := string(cstring(raw_data(e.text.text[:]))) + strings.write_string(&ctx.buffer_text.builder, key) + state.buffer_dirty = true + } + } +} + +update :: proc() { + if state.buffer_dirty { + + color := sdl.Color{ 0, 0, 0, 255} + + str := strings.to_cstring(&ctx.buffer_text.builder) + ctx.text_surface = ttf.RenderUTF8_Blended_Wrapped(ctx.font, str, color, 900); + if (ctx.text_surface == nil) { + log.errorf(sdl.GetErrorString()) + os.exit(1) + } + ctx.ftex = sdl.CreateTextureFromSurface(ctx.renderer, ctx.text_surface); + } +} + +draw :: proc() { + sdl.SetRenderDrawColor(ctx.renderer, 250, 250, 250, 0xff) + sdl.RenderClear(ctx.renderer) + + + + if ctx.ftex != nil { + src := sdl.Rect { 0, 0, ctx.text_surface.w, ctx.text_surface.h } + dest := sdl.Rect { 0, 0, ctx.text_surface.w, ctx.text_surface.h } + sdl.RenderCopy(ctx.renderer, ctx.ftex, &src, &dest) + } + + sdl.RenderPresent(ctx.renderer) +} + +main :: proc() { + context.logger = log.create_console_logger() + + if ok := sdl_init(); !ok { + log.errorf(sdl.GetErrorString()) + os.exit(1) + } + + ctx.frame_start = ctx.app_start + ctx.frame_elapsed = 0.001 + + for !ctx.should_close { + process_input() + update() + draw() + + ctx.frame_end = f64(sdl.GetPerformanceCounter()) / f64(sdl.GetPerformanceFrequency()) + ctx.frame_elapsed = ctx.frame_end - ctx.frame_start + ctx.frame_start = ctx.frame_end + state.buffer_dirty = false + } + + ttf.CloseFont(ctx.font) + sdl.DestroyWindow(ctx.window) + sdl.Quit() +}