Shadows
This commit is contained in:
68
core/frustum.jai
Normal file
68
core/frustum.jai
Normal file
@@ -0,0 +1,68 @@
|
||||
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;
|
||||
}
|
||||
Reference in New Issue
Block a user