Odin version
This commit is contained in:
parent
56f3048d2d
commit
00be1d2e23
177
odin-version/tide.odin
Normal file
177
odin-version/tide.odin
Normal file
@ -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()
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user