refactor, involve perlin noise