IEnumerable<Vector3I> BlockEnumerator() {
Stack<Vector3I> stack = new Stack<Vector3I>();
stack.Push( Origin );
while( stack.Count > 0 ) {
Vector3I coords = stack.Pop();
blocksProcessed++;
if(CanPlace( coords )){
yield return coords;
if( coords.X - 1 >= Bounds.XMin ) {
stack.Push( new Vector3I( coords.X - 1, coords.Y, coords.Z ) );
}
if( coords.X + 1 <= Bounds.XMax ) {
stack.Push( new Vector3I( coords.X + 1, coords.Y, coords.Z ) );
}
if( coords.Y - 1 >= Bounds.YMin ) {
stack.Push( new Vector3I( coords.X, coords.Y - 1, coords.Z ) );
}
if( coords.Y + 1 <= Bounds.YMax ) {
stack.Push( new Vector3I( coords.X, coords.Y + 1, coords.Z ) );
}
if( coords.Z - 1 >= Bounds.ZMin ) {
stack.Push( new Vector3I( coords.X, coords.Y, coords.Z - 1 ) );
}
if( coords.Z + 1 <= Bounds.ZMax ) {
stack.Push( new Vector3I( coords.X, coords.Y, coords.Z + 1 ) );
}
}
}
}
}