Rect2P :: struct { min: Vector2; max: Vector2; } F32_Max :: proc(a: f32, b: f32): f32 { if a > b return a; return b; } F32_Min :: proc(a: f32, b: f32): f32 { if a > b return b; return a; } F32_Clamp :: proc(val: f32, min: f32, max: f32): f32 { if (val > max) return max; if (val < min) return min; return val; } GetRectSize :: proc(rect: Rect2P): Vector2 { result: Vector2 = {rect.max.x - rect.min.x, rect.max.y - rect.min.y}; return result; } GetRectY :: proc(rect: Rect2P): f32 { result := GetRectSize(rect); return result.y; } GetRectX :: proc(rect: Rect2P): f32 { result := GetRectSize(rect); return result.x; } CutLeft :: proc(r: *Rect2P, value: f32): Rect2P { minx := r.min.x; r.min.x = F32_Min(r.max.x, r.min.x + value); return :Rect2P{ { minx, r.min.y}, {r.min.x, r.max.y}, }; } CutRight :: proc(r: *Rect2P, value: f32): Rect2P { maxx := r.max.x; r.max.x = F32_Max(r.max.x - value, r.min.x); return :Rect2P{ {r.max.x, r.min.y}, { maxx, r.max.y}, }; } CutBottom :: proc(r: *Rect2P, value: f32): Rect2P { // Y is down maxy := r.max.y; r.max.y = F32_Max(r.min.y, r.max.y - value); return :Rect2P{ {r.min.x, r.max.y}, {r.max.x, maxy}, }; } CutTop :: proc(r: *Rect2P, value: f32): Rect2P { // Y is down miny := r.min.y; r.min.y = F32_Min(r.min.y + value, r.max.y); return :Rect2P{ {r.min.x, miny}, {r.max.x, r.min.y}, }; } Rect2PToRectangle :: proc(r: Rect2P): Rectangle { result: Rectangle = {r.min.x, r.min.y, r.max.x - r.min.x, r.max.y - r.min.y}; return result; } Rect2PSize :: proc(x: f32, y: f32, w: f32, h: f32): Rect2P { result: Rect2P = {{x, y}, {x+w, y+h}}; return result; } Shrink :: proc(r: Rect2P, v: f32): Rect2P { r.min.x += v; r.min.y += v; r.max.x -= v; r.max.y -= v; return r; }