Grid part 1

This commit is contained in:
Synthasmagoria 2026-07-31 16:51:48 +02:00
commit 099fdf1b4b

View file

@ -36,6 +36,12 @@ ProgramState :: enum {
Message, Message,
} }
MouseState :: enum {
Hover,
DraggingGrid,
HoverMatrices,
}
ProgramMessageType :: enum { ProgramMessageType :: enum {
ChangeMatrixTypeClearData, ChangeMatrixTypeClearData,
} }
@ -65,6 +71,7 @@ Program :: struct {
matrix_count: int, matrix_count: int,
matrix_scroll: f32, matrix_scroll: f32,
matrix_scroll_speed: f32, matrix_scroll_speed: f32,
mouse_state: MouseState,
grid: Grid, grid: Grid,
font_style: FontStyle, font_style: FontStyle,
state: ProgramState, state: ProgramState,
@ -99,24 +106,69 @@ program_init :: proc(allocator := context.allocator) {
} }
program.grid = { program.grid = {
area = {0, 0, WINDOW_WIDTH, WINDOW_HEIGHT}, area = {0, 0, WINDOW_WIDTH, WINDOW_HEIGHT},
inner_area = {-1, -1, 2, 2}, inner_area = {0, 0, WINDOW_WIDTH, WINDOW_HEIGHT},
zoom = 1.0, zoom = 1.0,
} }
ui.init(&program.ui_context, 4000, allocator) ui.init(&program.ui_context, 4000, allocator)
} }
world_to_grid_matrix :: proc(grid: Grid) -> mat3 {
return matrix3_translate2(-rect_get_tl(grid.inner_area))
}
grid_to_world_matrix :: proc(grid: Grid) -> mat3 {
return {}
}
program_update :: proc() { program_update :: proc() {
if rl.IsKeyPressed(.ENTER) { if rl.IsKeyPressed(.ENTER) {
matrix_pool_get_mat3() matrix_pool_get_mat3()
} }
ui_elements := program_build_ui()
ui_elements, matrix_container := program_build_ui()
mouse := rl.GetMousePosition()
switch program.mouse_state {
case .Hover:
if rl.IsMouseButtonPressed(.LEFT) {
program.mouse_state = .DraggingGrid
} else if rect_has_point(rect2(matrix_container.area), mouse) {
program.mouse_state = .HoverMatrices
}
case .DraggingGrid:
program.grid.inner_area = rect_translate(program.grid.inner_area, rl.GetMouseDelta())
if !rl.IsMouseButtonDown(.LEFT) {
program.mouse_state = .Hover
}
case .HoverMatrices:
program.matrix_scroll = max(0, program.matrix_scroll - rl.GetMouseWheelMove() * program.matrix_scroll_speed)
if !rect_has_point(rect2(matrix_container.area), mouse) {
program.mouse_state = .Hover
}
}
if rl.IsKeyPressed(.TAB) { if rl.IsKeyPressed(.TAB) {
ui.focus_next_element(&program.ui_context) ui.focus_next_element(&program.ui_context)
} }
grid := program.grid
grid_inner_position := rect_get_tl(grid.inner_area)
draw_grid(grid.area, {50.0, 50.0}, rl.GRAY)
program_render_ui(&program.ui_context, ui_elements) program_render_ui(&program.ui_context, ui_elements)
} }
program_build_ui :: proc() -> []ui.Element { draw_grid :: proc(area: rect2, line_interval: v2, color: rl.Color) {
br := rect_get_br(area)
for x := area.x; x < br.x; x += line_interval.x {
rl.DrawLineV({x, area.y}, {x, br.y}, color)
}
for y := area.y; y < br.y; y += line_interval.y {
rl.DrawLineV({area.x, y}, {br.x, y}, color)
}
}
program_build_ui :: proc() -> (elements: []ui.Element, matrix_container: ^ui.Element) {
ui.start(&program.ui_context, {0, 0}, {WINDOW_WIDTH, WINDOW_HEIGHT}) ui.start(&program.ui_context, {0, 0}, {WINDOW_WIDTH, WINDOW_HEIGHT})
top_bar_container_config := ui.ElementConfiguration {margin = V2_ONE * 4.0} top_bar_container_config := ui.ElementConfiguration {margin = V2_ONE * 4.0}
top_bar_container := ui.container_begin({ui.Size_Percentage(1.0), ui.Size_Pixels(48.0)}, top_bar_container_config) top_bar_container := ui.container_begin({ui.Size_Percentage(1.0), ui.Size_Pixels(48.0)}, top_bar_container_config)
@ -136,7 +188,7 @@ program_build_ui :: proc() -> []ui.Element {
side_bar_container_config := ui.ElementConfiguration {margin = V2_ONE * 4.0} side_bar_container_config := ui.ElementConfiguration {margin = V2_ONE * 4.0}
side_bar_container_data := new(UiElementData_Container, context.temp_allocator) side_bar_container_data := new(UiElementData_Container, context.temp_allocator)
side_bar_container_data^ = {type = .Scroll, scroll = program.matrix_scroll} side_bar_container_data^ = {type = .Scroll, scroll = program.matrix_scroll}
matrix_container := ui.container_begin({ui.Size_Percentage(0.2), ui.Size_PercentageRemainder(1.0)}, side_bar_container_config, side_bar_container_data) matrix_container = ui.container_begin({ui.Size_Percentage(0.2), ui.Size_PercentageRemainder(1.0)}, side_bar_container_config, side_bar_container_data)
for i in 0..<program.matrix_count { for i in 0..<program.matrix_count {
container_config := ui.ElementConfiguration{margin = V2_ONE * 8.0, label = fmt.ctprintf("Matrix %d", i)} container_config := ui.ElementConfiguration{margin = V2_ONE * 8.0, label = fmt.ctprintf("Matrix %d", i)}
container_dimensions := ui.Dimensions {ui.Size_Percentage(1.0), ui.Size_Pixels(112.0)} container_dimensions := ui.Dimensions {ui.Size_Percentage(1.0), ui.Size_Pixels(112.0)}
@ -145,14 +197,8 @@ program_build_ui :: proc() -> []ui.Element {
ui_mat3(mat, value_strings, container_dimensions, container_config) ui_mat3(mat, value_strings, container_dimensions, container_config)
} }
ui.container_end() ui.container_end()
elements := ui.end() elements = ui.end()
return
mouse := rl.GetMousePosition()
if rect_has_point(rect2(matrix_container.area), mouse) {
program.matrix_scroll = max(0, program.matrix_scroll - rl.GetMouseWheelMove() * program.matrix_scroll_speed)
}
return elements
} }
ui_mat3 :: proc(mat: []f32, value_strings: []InputFloatField, dimensions: ui.Dimensions, config: ui.ElementConfiguration, allocator := context.temp_allocator) { ui_mat3 :: proc(mat: []f32, value_strings: []InputFloatField, dimensions: ui.Dimensions, config: ui.ElementConfiguration, allocator := context.temp_allocator) {