class_name BlockRegion extends RefCounted static var LOCAL_CHUNK := BlockRegion.new(Vector2i.ZERO, Vector2i.ONE * (Chunk.SIZE - 1)) var min: Vector2i var max: Vector2i func _init(a: Vector2i, b: Vector2i) -> void: min = a.min(b) max = a.max(b) func size() -> Vector2i: return max - min + Vector2i.ONE func contains(pos: Vector2i) -> bool: return (pos.x >= min.x) && (pos.x <= max.x) and (pos.y >= min.y) && (pos.y <= max.y) func offset(value: Vector2i) -> BlockRegion: return BlockRegion.new(min + value, max + value) func extend(amount: int) -> BlockRegion: var v := Vector2i.ONE * amount return BlockRegion.new(min - v, max + v) func array_index(pos: Vector2i) -> int: assert(contains(pos)) var size := size() var index := (pos.x - min.x) + (pos.y - min.y) * size.x return clampi(index, 0, size.x * size.y) # Custom iterators in GDScript are WEIRD. func _iter_init(state: Array) -> bool: state[0] = min return true func _iter_next(state: Array) -> bool: var cur: Vector2i = state[0] if cur.x < max.x: state[0].x += 1; return true elif cur.y < max.y: state[0] = Vector2i(min.x, cur.y + 1); return true else: return false func _iter_get(state: Variant) -> Vector2i: return state