This commit is contained in:
2024-10-16 23:18:47 +02:00
parent a60fe82272
commit 221be140bf
6 changed files with 174 additions and 72 deletions

View File

@@ -35,7 +35,7 @@ Camera :: struct {
dirty : bool;
}
create_perspective_camera :: (position: Vector3 = .{}, fov: float, aspect: float, yaw: float = 0.0, pitch: float = 0.0, roll: float = 0.0, z_near: float = 0.1, z_far: float = 1000.0) -> Camera {
create_perspective_camera :: (position: Vector3 = .{}, fov: float, aspect: float, yaw: float = 0.0, pitch: float = 0.0, roll: float = 0.0, z_near: float = 0.1, z_far: float = 200.0) -> Camera {
camera : Camera;
camera.type = .PERSPECTIVE;
camera.world_up = .{0,1,0};
@@ -89,7 +89,6 @@ orthographic_lh_projection_matrix :: (left: float, right: float, bottom: float,
return m;
}
make_lh_projection_matrix :: (fov_vertical: float, aspect_ratio_horizontal_over_vertical: float, z_near: float, z_far: float, x_offset:=0.0, y_offset:=0.0, depth_range_01:=false) -> Matrix4 {
result := Matrix4_Identity;

68
core/frustum.jai Normal file
View 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;
}

View File

@@ -69,6 +69,16 @@ point_inside_aabb :: (aabb: AABB, point: Vector3) -> bool {
&& point.z >= aabb.min.z && point.z <= aabb.max.z;
}
aabb_add :: (aabb: *AABB, point: Vector3) {
aabb.min.x = min(point.x, aabb.min.x);
aabb.min.y = min(point.y, aabb.min.y);
aabb.min.z = min(point.z, aabb.min.z);
aabb.max.x = max(point.x, aabb.max.x);
aabb.max.y = max(point.y, aabb.max.y);
aabb.max.z = max(point.z, aabb.max.z);
}
operator == :: inline (a: Vector3i, b: Vector3i) -> bool {
return a.x == b.x && a.y == b.y && a.z == b.z;
}
@@ -366,4 +376,5 @@ ease_in_out_sine :: (x: float) -> float {
}
#import "PCG";
#import "Math";
#import "Math";
#load "frustum.jai";

View File

@@ -102,7 +102,7 @@ create_scene :: (name: string, max_entities: s64 = 256) -> *Scene {
array_reserve(*scene.entities, max_entities);
scene.directional_light.color_and_intensity = .{1,1,1,1};
scene.directional_light.direction = to_v4(normalize(Vector3.{0.3, -0.3, 0.5}));
scene.directional_light.direction = to_v4(normalize(Vector3.{0.2, -0.7, 0.4}));
dir_light_data : Directional_Light_Buffer_Data;
dir_light_data.color_and_intensity = scene.directional_light.color_and_intensity;