transformation_visualizer/program.odin
2026-07-21 17:35:02 +02:00

134 lines
2.7 KiB
Odin

package main
import rl "libraries/raylib"
import "core:fmt"
import "core:strings"
import "core:mem"
import "base:runtime"
WINDOW_WIDTH :: 1280
WINDOW_HEIGHT :: 720
WINDOW_FRAMERATE :: 30
WINDOW_CAPTION :: "Transformation Visualizer"
v2 :: [2]f32
rect2 :: rl.Rectangle
UiElementType :: enum {
Input,
Button,
}
UiElementData :: union {
UiButtonData,
}
UiButtonData :: struct {
label: cstring,
}
UiElement :: struct {
area: rect2,
type: UiElementType,
data: UiElementData,
}
UiState :: struct {
origin, position: v2,
same_line: bool,
style: UiStyle,
elements: [dynamic]UiElement,
}
UiStyle :: struct {
margin, padding: f32,
}
ui_button :: proc(state: ^UiState, size: v2, data: UiButtonData) {
element := UiElement{area = {**state.position, **size}, type = .Button, data = data}
if state.same_line {
state.position.x += size.x + state.style.padding
state.same_line = false
} else {
state.position.y += size.y + state.style.padding
}
append(&state.elements, element)
}
ui_same_line :: proc(state: ^UiState) {
state.same_line = true
}
ui_start :: proc(state: ^UiState) {
clear(&state.elements)
state.position = state.origin + state.style.margin
}
ui_end :: proc(state: UiState) -> []UiElement {
return state.elements[:]
}
ui_init :: proc(state: ^UiState, style: UiStyle, origin: v2, allocator: mem.Allocator) {
state^ = {
origin = origin,
position = origin,
style = style,
elements = make(type_of(state.elements), 0, 512, allocator)
}
}
init :: proc() {
rl.SetTraceLogLevel(.WARNING)
rl.SetConfigFlags({.WINDOW_RESIZABLE, .VSYNC_HINT})
rl.InitWindow(WINDOW_WIDTH, WINDOW_HEIGHT, WINDOW_CAPTION)
rl.SetTargetFPS(WINDOW_FRAMERATE)
}
update :: proc() {
ui_style := UiStyle{margin = 4.0, padding = 4.0}
ui_state: UiState
ui_init(&ui_state, ui_style, {0, 0}, context.temp_allocator)
ui_start(&ui_state)
ui_button_size := v2{192.0, 32.0}
ui_same_line(&ui_state)
ui_button(&ui_state, ui_button_size, {label = "Hi"})
ui_same_line(&ui_state)
ui_button(&ui_state, ui_button_size, {label = "Hi"})
ui_same_line(&ui_state)
ui_button(&ui_state, ui_button_size, {label = "Hi"})
ui_elements := ui_end(ui_state)
rl.BeginDrawing()
defer rl.EndDrawing()
rl.ClearBackground(rl.BLACK)
for element in ui_elements {
fmt.println(element)
switch element.type {
case .Button:
data := element.data.(UiButtonData)
rl.GuiButton(element.area, data.label)
case .Input:
}
}
fmt.println()
free_all(context.temp_allocator)
}
parent_window_size_changed :: proc(w, h: int) {
rl.SetWindowSize(i32(w), i32(h))
}
shutdown :: proc() {
rl.CloseWindow()
}
should_run :: proc() -> bool {
when ODIN_OS != .JS {
if rl.WindowShouldClose() {
return false
}
}
return true
}