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