diff options
Diffstat (limited to 'src/main.odin')
-rw-r--r-- | src/main.odin | 181 |
1 files changed, 173 insertions, 8 deletions
diff --git a/src/main.odin b/src/main.odin index f4d2238..dacbc87 100644 --- a/src/main.odin +++ b/src/main.odin @@ -2,51 +2,216 @@ package main import rl "vendor:raylib" import "core:fmt" +import "core:math" +import "core:os" +import "core:strconv" +import "core:reflect" +waveform_a : []f32 : {0.0, 0.1, 0.5, 0.3, 0.1, -0.1, 0.0, 0.0, 0.0, 0.0, 0.1, 0.3, 0.0} +waveform_b : []f32 : {0.0, 0.0, 0.0, 0.2, 0.4, 0.2, -0.1, 0.0, 0.0, 0.1, 0.3, 0.1, 0.0} + +YELLOW : rl.Color = {254, 175, 1, 255} +ORANGE : rl.Color = {238, 123, 26, 255} +RED : rl.Color = {222, 73, 50, 255} + +LERP_SPEED :: 0.20 + +layout :: struct { + wave_a_start : rl.Vector2, + wave_a_end : rl.Vector2, + wave_a_amp : f32, + + wave_b_start : rl.Vector2, + wave_b_end : rl.Vector2, + wave_b_amp : f32, + + grid_opacity : f32, + grid_highlight_opacity : f32, + grid_highlight_position : rl.Vector2, +} + +slides : [dynamic]layout +state : layout +target : layout +delta : f32 + +init_slides :: proc() { + // 0 + current_slide : layout = { + wave_a_start = {-600, -250}, + wave_a_end = {600, -250}, + wave_a_amp = 250, + + wave_b_start = {-600, 250}, + wave_b_end = {600, 250}, + wave_b_amp = 250, + + grid_opacity = 0, + grid_highlight_opacity = 0, + grid_highlight_position = 0, + } + append(&slides, current_slide) +} + +lerp :: proc() { + layout_info := type_info_of(layout) + + // Handle the named type wrapper + actual_info := layout_info + if named_info, ok := layout_info.variant.(reflect.Type_Info_Named); ok { + actual_info = named_info.base + } + + // Now cast to struct + struct_info := actual_info.variant.(reflect.Type_Info_Struct) + + for i in 0..<struct_info.field_count { + field_type := struct_info.types[i] + field_offset := struct_info.offsets[i] + + // Get pointers to the field in both global structs + state_ptr := rawptr(uintptr(&state) + field_offset) + target_ptr := rawptr(uintptr(&target) + field_offset) + + // Type switch to lerp and write directly back to state + switch field_type.id { + case typeid_of(f32): + from_val := (cast(^f32)state_ptr)^ + to_val := (cast(^f32)target_ptr)^ + (cast(^f32)state_ptr)^ = from_val + (to_val - from_val) * (1.0 - math.pow(LERP_SPEED, delta)) + + case typeid_of(rl.Vector2): + from_val := (cast(^rl.Vector2)state_ptr)^ + to_val := (cast(^rl.Vector2)target_ptr)^ + (cast(^rl.Vector2)state_ptr)^ = from_val + (to_val - from_val) * (1.0 - math.pow(LERP_SPEED, delta)) + } + } +} + +normalize :: proc(v : rl.Vector2) -> rl.Vector2 { + return v / math.sqrt((v.x*v.x) + (v.y*v.y)) +} + +draw_waveform :: proc(wave : []f32, start : rl.Vector2, end : rl.Vector2, amp : f32) { + samples := len(wave) + + lines := samples-1 + rl.DrawLineEx(start, end, 2, rl.DARKGRAY) + total_direction := end - start + step := total_direction / f32(lines) + perpendicular : rl.Vector2 = normalize({total_direction.y, -total_direction.x}) + + end_pos : rl.Vector2 + for value, i in wave[:lines] { + start_base := start + (step*f32(i)) + end_base := start + (step*f32(i+1)) + start_pos : rl.Vector2 = start_base + (perpendicular*wave[i]*amp) + end_pos = end_base + (perpendicular*wave[i+1]*amp) + rl.DrawLineEx(start_pos, end_pos, 4, rl.PURPLE) + rl.DrawCircleV(start_pos, 5, rl.RED) + } + rl.DrawCircleV(end_pos, 5, rl.RED) +} + +draw_grid :: proc(first : rl.Vector2, last : rl.Vector2) { + +} main :: proc() { + fast_forward := -1 + if len(os.args) > 1 { + fast_forward, _ = strconv.parse_int(os.args[1]) + } fmt.println("Hello") // Initialization //-------------------------------------------------------------------------------------- - origin : rl.Vector2 = { 0.0, 0.0 } + slide : int = 0 rotation : f32 = 0.0 cameraX : f32 = 0.0 cameraY : f32 = 0.0 - camera : rl.Camera2D + camera : rl.Camera2D = { + zoom=1 + } + init_slides() + + rl.SetConfigFlags({.WINDOW_RESIZABLE}) rl.InitWindow(1920, 1080, "BSC 2025 Presentation") rl.SetTargetFPS(60) - // Main game loop // Detect window close button or ESC key + rl.SetExitKey(nil) + + camera.offset = {f32(rl.GetScreenWidth()) / 2, f32(rl.GetScreenHeight()) / 2} + camera.zoom = f32(rl.GetScreenHeight())/1080 + for !rl.WindowShouldClose() { + delta = rl.GetFrameTime() + if rl.IsWindowResized() { + height := f32(rl.GetScreenHeight()) + width := f32(rl.GetScreenWidth()) + camera.offset = {width / 2, height / 2} + camera.zoom = height/1080 + } // Input //---------------------------------------------------------------------------------- + go_forward := false + go_back := false mousePosition := rl.GetMousePosition() - left_clicked := rl.IsMouseButtonDown(rl.MouseButton(0)) - right_clicked := rl.IsMouseButtonDown(rl.MouseButton(1)) + left_clicked := rl.IsMouseButtonReleased(rl.MouseButton(0)) + right_clicked := rl.IsMouseButtonReleased(rl.MouseButton(1)) + right_arrow := rl.IsKeyReleased(.RIGHT) + left_arrow := rl.IsKeyReleased(.LEFT) + + go_forward = left_clicked || right_arrow + go_back = right_clicked || left_arrow + if slide < fast_forward { + go_forward = true + } else { + fast_forward = -1 + } // Process //---------------------------------------------------------------------------------- + if go_forward { + slide += 1 + fmt.printfln("Forward! To slide #{}", slide) + } else if go_back { + slide -= 1 + fmt.printfln("Back up! To slide #{}", slide) + } + target = slides[slide] + lerp() // Draw //---------------------------------------------------------------------------------- rl.BeginDrawing() - rl.ClearBackground(rl.RED) + rl.ClearBackground(rl.Color{16, 16, 16, 255}) + rl.BeginMode2D(camera) - + // World-space drawing + + + draw_waveform(waveform_a, state.wave_a_start, state.wave_a_end, state.wave_a_amp) + draw_waveform(waveform_b, state.wave_b_start, state.wave_b_end, state.wave_b_amp) + + + rl.EndMode2D() + // Screen-space drawing rl.DrawFPS(rl.GetScreenWidth() - 95, 10) + rl.EndDrawing() //---------------------------------------------------------------------------------- + free_all(context.temp_allocator) } rl.CloseWindow() -}
\ No newline at end of file +} |