From 56ae534f37b5de06ae2aa127a1eddde21f290ed9 Mon Sep 17 00:00:00 2001 From: San Jacobs Date: Wed, 3 Sep 2025 03:28:53 +0200 Subject: Work --- src/tafl.odin | 219 ++++++++++++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 206 insertions(+), 13 deletions(-) diff --git a/src/tafl.odin b/src/tafl.odin index 6ffc2e8..a582858 100644 --- a/src/tafl.odin +++ b/src/tafl.odin @@ -1,43 +1,197 @@ package tafl import "core:fmt" +//import "core:math" import rl "vendor:raylib" -tafl_elements : [1024]Tafl_Element -tafl_stack : [1024]int +tafl_elements : [4096]Tafl +tafl_elements_count : int + +tafl_stack : [4096]int tafl_stack_depth : int +child_buffer : [4096]int +child_buffer_len : int + +temp_child_buffer : [4096]int +temp_child_buffer_len : int // May be inferred by child count, and not be needed + main :: proc() { - tafl() - + { + tafl(color={.1,.1,.1,1}) + + { + tafl(color={.1,.1,.1,1}) + + { + tafl(color={.1,.1,.1,1}) + + { + tafl(color={.1,.1,.1,1}) + } + { + tafl(color={.1,.1,.1,1}) + } + { + tafl(color={.1,.1,.1,1}) + } + } + + { + tafl(color={.1,.1,.1,1}) + } + } + + { + tafl(color={.1,.1,.1,1}) + } + { + tafl(color={.1,.1,.1,1}) + { + tafl(color={.1,.1,.1,1}) + } + { + tafl(color={.1,.1,.1,1}) + } + } + { + tafl(color={.1,.1,.1,1}) + } + } } -@(deferred_none=__tafl_close) + +@(deferred_out=__tafl_close) tafl :: proc( - width : int = 0, + /*width : int = 0, height : int = 0, x : int = 0, - y : int = 0, + y : int = 0,*/ sizing_width : Sizing_Dimension = {.FIT, 0, 0}, sizing_height : Sizing_Dimension = {.FIT, 0, 0}, layout : Layout = .LEFT_TO_RIGHT, padding : Sides = {0,0,0,0}, child_gap : int = 0, - ) { + color : Color = {1,1,0,1}, + ) -> ^Tafl{ + + parent_ptr : ^Tafl = nil + if tafl_stack_depth > 0 { + parent_ptr = &tafl_elements[tafl_stack[tafl_stack_depth-1]] + } - fmt.println("Opened tafl") + tafl_elements[tafl_elements_count] = { + /*width = width, + height = height, + x = x, + y = y,*/ + sizing = {sizing_width, sizing_height}, + layout = layout, + padding = padding, + child_gap = child_gap, + + parent = parent_ptr, + } + this_tafl : ^Tafl = &tafl_elements[tafl_elements_count] + tafl_stack[tafl_stack_depth] = tafl_elements_count + this_tafl.own_index = tafl_elements_count + this_tafl.own_depth = tafl_stack_depth + this_tafl.children.index = temp_child_buffer_len + + indent(this_tafl.own_depth) + fmt.printfln("+ Opened tafl {}", this_tafl.own_index) + + tafl_elements_count += 1 + tafl_stack_depth += 1 + + return this_tafl } -__tafl_close :: proc() { + +__tafl_close :: proc(tafl : ^Tafl) { + + parent := tafl.parent + if parent != nil { + + tafl.width += tafl.padding.left + tafl.padding.right + tafl.height += tafl.padding.top + tafl.padding.bottom + + // Not entirely sure yet, because Nic's video doesn't say you need this + // max(), but I have a feeling that childless tafls will cause negative + // total_child_gaps, which would be bad. + // + // ALSO: Wtf? Why are we basing this off of the tafls number of siblings? + // I do not understand this. + total_child_gap := max(parent.children.len - 1, 0) * parent.child_gap + + switch parent.layout { + case .LEFT_TO_RIGHT: + tafl.width += total_child_gap + parent.width += tafl.width + parent.height = max(tafl.height, parent.height) + case .TOP_TO_BOTTOM: + tafl.height += total_child_gap + parent.height += tafl.height + parent.width = max(tafl.width, parent.width) + } + + } + + for i in 0..