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)
}