docs: def noise3(self, x, y, z, repeat, base=0.0):
  		"""Tileable 3D noise.
  		
  		repeat specifies the integer interval in each dimension 
  		when the noise pattern repeats.
  		
  		base allows a different texture to be generated for
  		the same repeat interval.
  		"""
  		i = int(fmod(floor(x), repeat))
  		j = int(fmod(floor(y), repeat))
  		k = int(fmod(floor(z), repeat))
  		ii = (i + 1) % repeat
  		jj = (j + 1) % repeat
  		kk = (k + 1) % repeat
  		if base:
  			i += base; j += base; k += base
  			ii += base; jj += base; kk += base
  
  		x -= floor(x); y -= floor(y); z -= floor(z)
  		fx = x**3 * (x * (x * 6 - 15) + 10)
  		fy = y**3 * (y * (y * 6 - 15) + 10)
  		fz = z**3 * (z * (z * 6 - 15) + 10)
  
  		perm = self.permutation
  		A = perm[i]
  		AA = perm[A + j]
  		AB = perm[A + jj]
  		B = perm[ii]
  		BA = perm[B + j]
  		BB = perm[B + jj]
  		
  		return lerp(fz, lerp(fy, lerp(fx, grad3(perm[AA + k], x, y, z),
  										  grad3(perm[BA + k], x - 1, y, z)),
  								 lerp(fx, grad3(perm[AB + k], x, y - 1, z),
  										  grad3(perm[BB + k], x - 1, y - 1, z))),
  						lerp(fy, lerp(fx, grad3(perm[AA + kk], x, y, z - 1),
  										  grad3(perm[BA + kk], x - 1, y, z - 1)),
  								 lerp(fx, grad3(perm[AB + kk], x, y - 1, z - 1),
  										  grad3(perm[BB + kk], x - 1, y - 1, z - 1))))