per matrix buttons

This commit is contained in:
Synthasmagoria 2026-08-22 20:18:43 +02:00
commit d3057e99d2
3 changed files with 60 additions and 11 deletions

BIN
default

Binary file not shown.

View file

@ -273,12 +273,12 @@ _resolve_element_outer_size_axis :: proc(size: Size, axis: Axis) -> f32 {
if element := _element_container_previous(); element != nil { if element := _element_container_previous(); element != nil {
container_inner := get_element_inner_area(_container_current()^) container_inner := get_element_inner_area(_container_current()^)
last_element_outer := get_element_outer_area(element^) last_element_outer := get_element_outer_area(element^)
remaining_container_size: f32 element_br := rect_get_br(last_element_outer)
container_tl := rect_get_tl(container_inner)
switch axis { switch axis {
case .X: remaining_container_size = container_inner.width - rect_get_tr(last_element_outer).x case .X: return (container_inner.width - (element_br.x - container_tl.x)) * f32(value)
case .Y: remaining_container_size = container_inner.height - rect_get_bl(last_element_outer).y case .Y: return (container_inner.height - (element_br.y - container_tl.y)) * f32(value)
} }
return remaining_container_size * f32(value)
} else { } else {
inner := get_element_inner_area(_container_current()^) inner := get_element_inner_area(_container_current()^)
container_size := inner.width if axis == .X else inner.height container_size := inner.width if axis == .X else inner.height

View file

@ -13,6 +13,9 @@ import "core:os"
RAYGUI_ICON_PLAY :: "#131#" RAYGUI_ICON_PLAY :: "#131#"
RAYGUI_ICON_PAUSE :: "#132#" RAYGUI_ICON_PAUSE :: "#132#"
RAYGUI_ICON_RESET :: "#211#" RAYGUI_ICON_RESET :: "#211#"
RAYGUI_ICON_TRASH :: "#143#"
RAYGUI_ICON_DOWN :: "#120#"
RAYGUI_ICON_UP :: "#121#"
TRANSFORMATION_RECTANGLE_COLOR_ORIGIN :: rl.RED TRANSFORMATION_RECTANGLE_COLOR_ORIGIN :: rl.RED
TRANSFORMATION_RECTANGLE_COLOR_MIDDLE :: rl.MAGENTA TRANSFORMATION_RECTANGLE_COLOR_MIDDLE :: rl.MAGENTA
@ -53,6 +56,7 @@ UiElementData_Dropdown :: struct {
} }
UiButtonType :: enum { UiButtonType :: enum {
Nothing,
AddIdentity, AddIdentity,
AddTranslation, AddTranslation,
AddScale, AddScale,
@ -66,6 +70,9 @@ UiButtonType :: enum {
ResumeTransformation, ResumeTransformation,
ResetTransformation, ResetTransformation,
SaveProjectConfirm, SaveProjectConfirm,
MatrixDelete,
MatrixMoveUp,
MatrixMoveDown,
} }
UiButtonRecalculateFinishGroup :: bit_set[UiButtonType]{ UiButtonRecalculateFinishGroup :: bit_set[UiButtonType]{
@ -77,6 +84,7 @@ UiButtonRecalculateFinishGroup :: bit_set[UiButtonType]{
UiElementData_Button :: struct { UiElementData_Button :: struct {
type: UiButtonType, type: UiButtonType,
target_matrix: int,
options: cstring, options: cstring,
} }
@ -243,6 +251,7 @@ program_load_project :: proc(program: ^Program, path: string) -> ProjectReadErro
for val, i in program.matrix_float_pool[:program.matrix_count * 9] { for val, i in program.matrix_float_pool[:program.matrix_count * 9] {
fmt.bprint(program.matrix_value_string_pool[i][:], val) fmt.bprint(program.matrix_value_string_pool[i][:], val)
} }
animation_update_last(&program.animation, program_get_master_matrix())
return nil return nil
} }
@ -575,10 +584,10 @@ program_build_workspace_ui :: proc(ctx: ^ui.Context) -> (elements: []ui.Element,
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 = 8.0, label = fmt.ctprintf("Matrix %d", i)} container_config := ui.ElementConfiguration{margin = 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(140.0)}
mat := program.matrix_float_pool[i * 9 : i * 9 + 9] mat := program.matrix_float_pool[i * 9 : i * 9 + 9]
value_strings := program.matrix_value_string_pool[i * 9 : i * 9 + 9] value_strings := program.matrix_value_string_pool[i * 9 : i * 9 + 9]
ui_mat3(mat, value_strings, container_dimensions, container_config) ui_mat3(i, mat, value_strings, container_dimensions, container_config)
} }
ui.container_end() ui.container_end()
elements = ui.end() elements = ui.end()
@ -664,6 +673,7 @@ program_render_ui_and_handle_focus :: proc(ctx: ^ui.Context, focus_element_id: u
} }
data := cast(^UiElementData_Button)element.data data := cast(^UiElementData_Button)element.data
switch data.type { switch data.type {
case .Nothing:
case .AddIdentity: program_add_identity_matrix() case .AddIdentity: program_add_identity_matrix()
case .AddTranslation: program_show_dialog(&program, .CreateTranslationMatrix) case .AddTranslation: program_show_dialog(&program, .CreateTranslationMatrix)
case .AddScale: program_show_dialog(&program, .CreateScaleMatrix) case .AddScale: program_show_dialog(&program, .CreateScaleMatrix)
@ -701,6 +711,20 @@ program_render_ui_and_handle_focus :: proc(ctx: ^ui.Context, focus_element_id: u
} else { } else {
program.state = .Normal program.state = .Normal
} }
case .MatrixDelete:
if data.target_matrix + 1 < program.matrix_count {
floats := program.matrix_float_pool
inputs := program.matrix_value_string_pool
amount := program.matrix_count - data.target_matrix
matrix_values_size := size_of(f32) * 9
matrix_inputs_size := size_of(InputFloatField) * 9
mem.copy(&floats[data.target_matrix * 9], &floats[data.target_matrix * 9 + 9], matrix_values_size * amount)
mem.copy(&inputs[data.target_matrix * 9][0], &inputs[data.target_matrix * 9 + 9][0], matrix_inputs_size * amount)
}
program.matrix_count = max(program.matrix_count - 1, 0)
animation_update_last(&program.animation, program_get_master_matrix())
case .MatrixMoveUp:
case .MatrixMoveDown:
} }
if data.type in UiButtonRecalculateFinishGroup { if data.type in UiButtonRecalculateFinishGroup {
animation_update_last(&program.animation, program_get_master_matrix()) animation_update_last(&program.animation, program_get_master_matrix())
@ -783,12 +807,37 @@ ui_measure_text :: proc(str: cstring, font_data: rawptr) -> ui.v2 {
return rl.MeasureTextEx(style.font, str, style.size, style.spacing) return rl.MeasureTextEx(style.font, str, style.size, style.spacing)
} }
ui_mat3 :: proc(mat: []f32, value_strings: []InputFloatField, dimensions: ui.Dimensions, config: ui.ElementConfiguration, allocator := context.temp_allocator) { ui_mat3 :: proc(idx: int, mat: []f32, value_strings: []InputFloatField, dimensions: ui.Dimensions, config: ui.ElementConfiguration, allocator := context.temp_allocator) {
container_data := new(UiElementData_Container, allocator) ui.container_begin(dimensions, config)
container_data^ = {type = .Matrix, thickness = 2.0} defer ui.container_end()
ui.container_begin(dimensions, config, container_data)
matrix_input_config := ui.ElementConfiguration {margin = 4.0} button_config := ui.ElementConfiguration {margin = 4.0}
button_data: ^UiElementData_Button
button_config.label = RAYGUI_ICON_TRASH
button_data = new(UiElementData_Button, allocator)
button_data^ = {target_matrix = idx, type = .MatrixDelete}
ui.element(.Button, ui.dimensions_pixels(32.0), button_config, button_data)
button_config.label = RAYGUI_ICON_UP
button_data = new(UiElementData_Button, allocator)
button_data^ = {target_matrix = idx}
ui.same_line()
ui.element(.Button, ui.dimensions_pixels(32.0), button_config, button_data)
button_config.label = RAYGUI_ICON_DOWN
button_data = new(UiElementData_Button, allocator)
button_data^ = {target_matrix = idx}
ui.same_line()
ui.element(.Button, ui.dimensions_pixels(32.0), button_config, button_data)
matrix_container_dimensions := ui.Dimensions {ui.Size_Percentage(1.0), ui.Size_PercentageRemainder(1.0)}
matrix_container_config := ui.ElementConfiguration {margin = 4.0}
matrix_container_data := new(UiElementData_Container, allocator)
matrix_container_data^ = {type = .Matrix, thickness = 2.0}
ui.container_begin(matrix_container_dimensions, matrix_container_config, matrix_container_data)
matrix_input_dimensions := ui.Dimensions {ui.Size_Percentage(1.0 / 3.0), ui.Size_Percentage(1.0 / 3.0)} matrix_input_dimensions := ui.Dimensions {ui.Size_Percentage(1.0 / 3.0), ui.Size_Percentage(1.0 / 3.0)}
matrix_input_config := ui.ElementConfiguration {margin = 4.0}
// column first matrices // column first matrices
#unroll for j in 0..<3 { #unroll for j in 0..<3 {
#unroll for i in 0..<3 { #unroll for i in 0..<3 {