Frustum :: struct { near_top_left: Vector3; near_bottom_left: Vector3; near_top_right: Vector3; near_bottom_right: Vector3; far_top_left: Vector3; far_bottom_left: Vector3; far_top_right: Vector3; far_bottom_right: Vector3; } get_frustum :: (fov: float, aspect_ratio: float, z_near: float, z_far: float) -> Frustum { frustum: Frustum = ---; tan_half_fov := tan(DEGREES_TO_RADIANS * fov * 0.5); near_z := z_near; near_x := near_z * tan_half_fov; near_y := near_z * tan_half_fov * aspect_ratio; frustum.near_top_left = .{-near_x, near_y, near_z}; frustum.near_bottom_left = .{-near_x, -near_y, near_z}; frustum.near_top_right = .{near_x, near_y, near_z}; frustum.near_bottom_right = .{near_x, -near_y, near_z}; far_z := z_far; far_x := far_z * tan_half_fov; far_y := far_z * tan_half_fov * aspect_ratio; frustum.far_top_left = .{-far_x, far_y, far_z}; frustum.far_bottom_left = .{-far_x, -far_y, far_z}; frustum.far_top_right = .{far_x, far_y, far_z}; frustum.far_bottom_right = .{far_x, -far_y, far_z}; return frustum; } get_frustum_aabb :: (frustum: Frustum) -> AABB { aabb: AABB; aabb_add(*aabb, frustum.near_top_left); aabb_add(*aabb, frustum.near_bottom_left); aabb_add(*aabb, frustum.near_top_right); aabb_add(*aabb, frustum.near_bottom_right); aabb_add(*aabb, frustum.far_top_left); aabb_add(*aabb, frustum.far_bottom_left); aabb_add(*aabb, frustum.far_top_right); aabb_add(*aabb, frustum.far_bottom_right); return aabb; } transform :: (frustum: Frustum, matrix: Matrix4) -> Frustum { transformed_frustum: Frustum = ---; transformed_frustum.near_top_left = transform_position(frustum.near_top_left, matrix); transformed_frustum.near_bottom_left = transform_position(frustum.near_bottom_left, matrix); transformed_frustum.near_top_right = transform_position(frustum.near_top_right, matrix); transformed_frustum.near_bottom_right = transform_position(frustum.near_bottom_right, matrix); transformed_frustum.far_top_left = transform_position(frustum.far_top_left, matrix); transformed_frustum.far_bottom_left = transform_position(frustum.far_bottom_left, matrix); transformed_frustum.far_top_right = transform_position(frustum.far_top_right, matrix); transformed_frustum.far_bottom_right = transform_position(frustum.far_bottom_right, matrix); return transformed_frustum; }