Files
2026-03-22 08:34:27 +05:45

91 lines
1.7 KiB
Odin

package edit2d
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}
}
}
}