package main import "core:math" import "core:mem" color_u8_to_u32 :: #force_inline proc(r, g, b, a: u8) -> u32 { return (u32(a) << 24) + (u32(r) << 16) + (u32(g) << 8) + u32(b) } draw_xor :: proc(bitmap: ^Bitmap) { @(static) offset: u32 = 0 i: u32 for y: u32; y < bitmap.height; y += 1 { for x: u32; x < bitmap.width; x += 1 { c := u8(((x + offset) ~ (y + offset)) % 256) bitmap.buffer[i] = color_u8_to_u32(c, c, c, 0xFF) i += 1 } } offset += 2 } draw_line_tests :: proc(screen_buffer: ^Bitmap) { draw_line(screen_buffer, 220, 360, 420, 360, 0xFFFFFFFF) draw_line(screen_buffer, 320, 260, 320, 460, 0xFFFFFFFF) draw_line(screen_buffer, 220, 260, 420, 460, 0xFFFFFFFF) draw_line(screen_buffer, 220, 460, 420, 260, 0xFFFFFFFF) draw_line(screen_buffer, 220, 260, 420, 260, 0xFFFFFFFF) draw_line(screen_buffer, 220, 460, 420, 460, 0xFFFFFFFF) draw_line(screen_buffer, 220, 260, 220, 460, 0xFFFFFFFF) draw_line(screen_buffer, 420, 260, 420, 460, 0xFFFFFFFF) for α := 0; α < 180; α += 1 { θ := f32(α) / f32(math.DEG_PER_RAD) x := i32((math.cos(θ) * 100) + 0.5) y := -i32((math.sin(θ) * 100) + 0.5) draw_line(screen_buffer, 960 - x, 360 - y, 960 + x, 360 + y, 0xFFFFFFFF) } px: i32 = 50 py: i32 = 0 for α := 0; α <= 360; α += 45 { θ := f32(α) / f32(math.DEG_PER_RAD) x := i32((math.cos(θ) * 50) + 0.5) y := -i32((math.sin(θ) * 50) + 0.5) draw_line(screen_buffer, 640 + px, 360 + py, 640 + x, 360 + y, 0xFFFFFFFF) px = x py = y } } scene_funcs := []proc(_: ^Bitmap){draw_xor, draw_line_tests} // TODO: VirtualAlloc'ed/shm memory, hooked into Odin's context. app_update_and_render :: proc(screen_buffer: ^Bitmap, input: ^App_Input) { @(static) scene_num := 0 if input.keyboard[App_Input_Key.ArrowLeft].down && input.keyboard[App_Input_Key.ArrowLeft].transition { scene_num = (scene_num - 1 + len(scene_funcs)) % len(scene_funcs) mem.zero_slice(screen_buffer.buffer) } if input.keyboard[App_Input_Key.ArrowRight].down && input.keyboard[App_Input_Key.ArrowRight].transition { scene_num = (scene_num + 1) % len(scene_funcs) mem.zero_slice(screen_buffer.buffer) } scene_funcs[scene_num](screen_buffer) }