private float sample( Vector3 pos, PlanetNoise noiseParams, PlanetNoisePerlin perlinNoise )
		{
			float result	= 0f;
			float offset	= 0f;

			if( noiseParams.smearOctaves > 0 )
			{
				offset = perlinNoise.getOctave( pos / noiseParams.smearScale, noiseParams.smearOctaves );
				offset = Mathf.Pow( offset, noiseParams.smearFalloff );
				offset *= noiseParams.smearIntensity;
			}

			result = perlinNoise.getNormalisedOctave( ( pos / noiseParams.scale ) + ( Vector3.one * offset ), noiseParams.octaves );

			if( noiseParams.ridginess > 0f )
			{
				float ridge	= perlinNoise.getNormalisedOctave( ( pos / noiseParams.scale ) + new Vector3( offset, offset, offset + 11f ), noiseParams.octaves );
				result		= ( noiseParams.ridginess * ( 1f - ( Mathf.Abs( ridge - 0.5f ) * 2f ) ) ) + ( ( 1f - noiseParams.ridginess ) * result );
			}

			result = Mathf.Pow( result, noiseParams.falloff );
			result = Mathf.Clamp01( result * noiseParams.intensity );

			return result;
		}
		public void createNoise( int seedSurface, int seedLand, int seedLandColour01, int seedLandColour23, int seedCity, int seedCloud )
		{
			perlinNoiseSurface		= new PlanetNoisePerlin( seedSurface );
			perlinNoiseLand			= new PlanetNoisePerlin( seedLand );
			perlinNoiseLandColour01	= new PlanetNoisePerlin( seedLandColour01 );
			perlinNoiseLandColour23	= new PlanetNoisePerlin( seedLandColour23 );

			_cityRnd				= new System.Random( seedCity );

			perlinNoiseCloud		= new PlanetNoisePerlin( seedCloud );
			
			worleyNoiseCloud		= new PlanetNoiseWorley( seedCloud );

			isDoingCityWork			= false;

#if USE_GPU
			if( noiseComputeShader == null )
			{
				useComputerShader = false;

				if( SystemInfo.supportsComputeShaders )
				{
					useComputerShader	= true;

					noiseComputeShader	= ( ComputeShader ) AssetDatabase.LoadAssetAtPath( computeShaderPath, typeof( ComputeShader ) );

					if( noiseComputeShader )
					{
						_diffuseKernel	= noiseComputeShader.FindKernel( "diffuseNoiseKernel" );
						_cloudKernel	= noiseComputeShader.FindKernel( "cloudNoiseKernel" );
					}
					else
					{
						Debug.LogError( "couldn't load " + computeShaderPath );
						useComputerShader = false;
					}
				}
			}
#endif
		}
		public void createNoise( int seedSurface, int seedLand, int seedLandColour01, int seedLandColour23, int seedCity, int seedCloud )
		{
			perlinNoiseSurface		= new PlanetNoisePerlin( seedSurface );
			perlinNoiseLand			= new PlanetNoisePerlin( seedLand );
			perlinNoiseLandColour01	= new PlanetNoisePerlin( seedLandColour01 );
			perlinNoiseLandColour23	= new PlanetNoisePerlin( seedLandColour23 );

			_cityRnd				= new System.Random( seedCity );

			perlinNoiseCloud		= new PlanetNoisePerlin( seedCloud );
			
			worleyNoiseCloud		= new PlanetNoiseWorley( seedCloud );

			isDoingCityWork			= false;

#if USE_GPU
			if( noiseComputeShader == null )
			{
				useComputerShader = false;

				if( SystemInfo.supportsComputeShaders )
				{
					useComputerShader	= true;

					noiseComputeShader	= ( ComputeShader ) AssetDatabase.LoadAssetAtPath( computeShaderPath, typeof( ComputeShader ) );

					if( noiseComputeShader )
					{
						_diffuseKernel	= noiseComputeShader.FindKernel( "diffuseNoiseKernel" );
						_cloudKernel	= noiseComputeShader.FindKernel( "cloudNoiseKernel" );
					}
					else
					{
						//Debug.LogError( "couldn't load " + computeShaderPath );
						useComputerShader = false;
					}
				}
			}
#endif
		}
		private float sample( Vector3 pos, PlanetNoise noiseParams, PlanetNoisePerlin perlinNoise )
		{
			float result	= 0f;
			float offset	= 0f;

			if( noiseParams.smearOctaves > 0 )
			{
				offset = perlinNoise.getOctave( pos / noiseParams.smearScale, noiseParams.smearOctaves );
				offset = Mathf.Pow( offset, noiseParams.smearFalloff );
				offset *= noiseParams.smearIntensity;
			}

			result = perlinNoise.getNormalisedOctave( ( pos / noiseParams.scale ) + ( Vector3.one * offset ), noiseParams.octaves );

			if( noiseParams.ridginess > 0f )
			{
				float ridge	= perlinNoise.getNormalisedOctave( ( pos / noiseParams.scale ) + new Vector3( offset, offset, offset + 11f ), noiseParams.octaves );
				result		= ( noiseParams.ridginess * ( 1f - ( Mathf.Abs( ridge - 0.5f ) * 2f ) ) ) + ( ( 1f - noiseParams.ridginess ) * result );
			}

			result = Mathf.Pow( result, noiseParams.falloff );
			result = Mathf.Clamp01( result * noiseParams.intensity );

			return result;
		}
		private Color getSurfaceColour( Vector3 pos, PlanetNoise noiseParams, Color colour0, Color colour1, PlanetNoisePerlin perlinNoise )
		{
			float c			= sample( pos, noiseParams, perlinNoise );
			Color result	= Color.Lerp( colour0, colour1, 1f - c );
			return result;
		}
		private float getSurfaceHeight( Vector3 pos, PlanetNoise noiseParams, PlanetNoisePerlin perlinNoise )
		{
			float result = sample( pos, noiseParams, perlinNoise );
			return result;
		}
		private Color getSurfaceColour( Vector3 pos, PlanetNoise noiseParams, Color colour0, Color colour1, PlanetNoisePerlin perlinNoise )
		{
			float c			= sample( pos, noiseParams, perlinNoise );
			Color result	= Color.Lerp( colour0, colour1, 1f - c );
			return result;
		}
		private float getSurfaceHeight( Vector3 pos, PlanetNoise noiseParams, PlanetNoisePerlin perlinNoise )
		{
			float result = sample( pos, noiseParams, perlinNoise );
			return result;
		}