void FloodFill( int x, int y, int z, Block newBlock ) {
if( blocks[Index( x, y, z )] != (byte)Block.Air ) return;
Vector3I coord = new Vector3I( x, y, z );
Stack<Vector3I> stack = new Stack<Vector3I>();
stack.Push( coord );
while( stack.Count > 0 ) {
coord = stack.Pop();
blocks[Index( coord.X, coord.Y, coord.Z )] = (byte)newBlock;
if( coord.X + 1 < genParams.MapWidth && blocks[Index( coord.X + 1, coord.Y, coord.Z )] == (byte)Block.Air ) {
stack.Push( new Vector3I( coord.X + 1, coord.Y, coord.Z ) );
}
if( coord.X - 1 >= 0 && blocks[Index( coord.X - 1, coord.Y, coord.Z )] == (byte)Block.Air ) {
stack.Push( new Vector3I( coord.X - 1, coord.Y, coord.Z ) );
}
if( coord.Y + 1 < genParams.MapLength && blocks[Index( coord.X, coord.Y + 1, coord.Z )] == (byte)Block.Air ) {
stack.Push( new Vector3I( coord.X, coord.Y + 1, coord.Z ) );
}
if( coord.Y - 1 >= 0 && blocks[Index( coord.X, coord.Y - 1, coord.Z )] == (byte)Block.Air ) {
stack.Push( new Vector3I( coord.X, coord.Y - 1, coord.Z ) );
}
if( coord.Z - 1 >= 0 && blocks[Index( coord.X, coord.Y, coord.Z - 1 )] == (byte)Block.Air ) {
stack.Push( new Vector3I( coord.X, coord.Y, coord.Z - 1 ) );
}
}
}