59 lines
2.1 KiB
Odin
59 lines
2.1 KiB
Odin
// Goal is for any Position or 'Shape' intersections used by the prototype to be defined here for centeralization
|
|
|
|
package sectr
|
|
|
|
import "core:math/linalg"
|
|
|
|
// AABB: Separating Axis Theorem
|
|
intersects_range2 :: #force_inline proc "contextless" ( a, b: Range2 ) -> bool
|
|
{
|
|
// Check if there's no overlap on the x-axis
|
|
if a.max.x < b.min.x || b.max.x < a.min.x {
|
|
return false; // No overlap on x-axis means no intersection
|
|
}
|
|
// Check if there's no overlap on the y-axis
|
|
if a.max.y < b.min.y || b.max.y < a.min.y {
|
|
return false; // No overlap on y-axis means no intersection
|
|
}
|
|
// If neither of the above conditions are true, there's at least a partial overlap
|
|
return true;
|
|
}
|
|
|
|
// AABB: Separating Axis Theorem
|
|
overlap_range2 :: #force_inline proc "contextless" ( a, b: Range2 ) -> bool
|
|
{
|
|
// Check if there's no overlap on the x-axis
|
|
if a.max.x <= b.min.x || b.max.x <= a.min.x {
|
|
return false; // No overlap on x-axis means no intersection
|
|
}
|
|
// Check if there's no overlap on the y-axis
|
|
if a.max.y <= b.min.y || b.max.y <= a.min.y {
|
|
return false; // No overlap on y-axis means no intersection
|
|
}
|
|
// If neither of the above conditions are true, there's at least a partial overlap
|
|
return true;
|
|
}
|
|
|
|
|
|
// TODO(Ed): Do we need this? Also does it even work (looks unfinished)?
|
|
is_within_screenspace :: #force_inline proc "contextless" ( pos : Vec2 ) -> b32 {
|
|
state := get_state(); using state
|
|
screen_extent := state.app_window.extent
|
|
cam := & project.workspace.cam
|
|
within_x_bounds : b32 = pos.x >= -screen_extent.x && pos.x <= screen_extent.x
|
|
within_y_bounds : b32 = pos.y >= -screen_extent.y && pos.y <= screen_extent.y
|
|
return within_x_bounds && within_y_bounds
|
|
}
|
|
|
|
within_range2 :: #force_inline proc "contextless" ( a, b : Range2 ) -> bool {
|
|
within_x := b.min.x >= a.min.x && b.max.x <= a.max.x
|
|
within_y := b.min.y >= a.min.y && b.max.y <= a.max.y
|
|
return within_x && within_y
|
|
}
|
|
|
|
pos_within_range2 :: #force_inline proc "contextless" ( pos : Vec2, range : Range2 ) -> b32 {
|
|
within_x := pos.x > range.min.x && pos.x < range.max.x
|
|
within_y := pos.y > range.min.y && pos.y < range.max.y
|
|
return b32(within_x && within_y)
|
|
}
|