91 lines
1.7 KiB
Odin
91 lines
1.7 KiB
Odin
package ion
|
|
|
|
import "core:slice"
|
|
import b2 "vendor:box2d"
|
|
|
|
|
|
saturate :: proc(f : f32) -> f32 {
|
|
return (f < 0.0) ? 0.0 : (f > 1.0) ? 1.0 : f
|
|
}
|
|
|
|
f32_to_u8_sat :: proc(val : f32) -> u8 {
|
|
|
|
sat := saturate(val)
|
|
sat *= 255
|
|
sat += 0.5
|
|
|
|
ret := cast(u8)sat
|
|
return ret
|
|
}
|
|
|
|
|
|
float4_to_u32 :: proc(color : [4]f32) -> u32 {
|
|
out : u32
|
|
out = u32(f32_to_u8_sat(color.a)) << 24
|
|
out |= u32(f32_to_u8_sat(color.r)) << 16
|
|
out |= u32(f32_to_u8_sat(color.g)) << 8
|
|
out |= u32(f32_to_u8_sat(color.b))
|
|
return out
|
|
}
|
|
|
|
|
|
u32_to_float4 :: proc(color : u32) -> [4]f32 {
|
|
ret : [4]f32
|
|
ret.a = f32((color >> 24) & 0xFF) / 255.0
|
|
ret.r = f32((color >> 16) & 0xFF) / 255.0
|
|
ret.g = f32((color >> 8) & 0xFF) / 255.0
|
|
ret.b = f32((color) & 0xFF) / 255.0
|
|
return ret
|
|
}
|
|
|
|
|
|
|
|
centroid :: proc(points: []b2.Vec2) -> b2.Vec2{
|
|
center := b2.Vec2{0,0}
|
|
for p in points do center += p
|
|
center /= f32(len(points))
|
|
return center
|
|
}
|
|
|
|
|
|
cross :: proc(o, a, b : b2.Vec2) -> f32{
|
|
return (a.x - o.x) * (b.y - o.y) - (a.y - o.y) * (b.x - o.x)
|
|
}
|
|
|
|
//For sorting
|
|
curr_center : b2.Vec2
|
|
|
|
sort_points_ccw :: proc(points : []b2.Vec2){
|
|
if len(points) == 0 do return
|
|
|
|
curr_center = centroid(points)
|
|
slice.sort_by(points , proc(a, b: b2.Vec2) -> bool{
|
|
c := cross(curr_center, a, b)
|
|
|
|
if abs(c) < 1e-7{
|
|
return b2.Distance(curr_center, a) < b2.Distance(curr_center, b)
|
|
}
|
|
return c > 0
|
|
})
|
|
}
|
|
|
|
FlipDirection :: enum {
|
|
Horizontal,
|
|
Vertical,
|
|
Both, // Flip both horizontally and vertically
|
|
}
|
|
|
|
|
|
flip_points :: proc(points: []b2.Vec2, direction : FlipDirection){
|
|
for &vertex, i in points{
|
|
switch direction {
|
|
case .Horizontal:
|
|
points[i] = b2.Vec2{-vertex.x, vertex.y}
|
|
case .Vertical:
|
|
points[i] = b2.Vec2{vertex.x, -vertex.y}
|
|
case .Both:
|
|
points[i] = b2.Vec2{-vertex.x, -vertex.y}
|
|
}
|
|
}
|
|
}
|