parent
3dc9a3a3da
commit
ad76ef1703
6 changed files with 108 additions and 69 deletions
@ -0,0 +1,45 @@ |
|||||||
|
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 |
@ -0,0 +1 @@ |
|||||||
|
uid://w5fuyrkwf40c |
Loading…
Reference in new issue