/// <summary> /// Returns the passed BlockType array with the passed PlanetStratum layered onto it. /// </summary> /// <param name="noise">Noise used to calculate stratum blocks</param> /// <param name="stratum">PlanetStratum to generate blocks from</param> /// <param name="planet">BlockType array to layer onto</param> /// <param name="padding">How much padding on outsides to leave</param> /// <returns>BlockType Array with PlanetStratum layer added</returns> static BlockData[,,] LayerStratumOnPlanet(FastNoise noise, PlanetStratum stratum, BlockData[,,] planet, int padding) { BlockData[,,] layeredPlanet = planet; int planetSize = planet.GetLength(0); int innerBound = padding + stratum.size; int outerBound = planetSize - innerBound; for (int x = padding; x < planetSize - padding; x++) { for (int y = padding; y < planetSize - padding; y++) { for (int z = padding; z < planetSize - padding; z++) { if (planet[x, y, z] == null) { BlockData data = CalculateBlockFromPlanetStratum(noise, stratum, x, y, z); layeredPlanet[x, y, z] = data; } } } } return(layeredPlanet); }
/// <summary> /// Calculates what BlockType should exist at given coordinate in planet, based on the passed Plenet Stratum /// </summary> /// <param name="noise">Noise generator to use for calculation</param> /// <param name="s">PlanetStratum to use for calculation</param> /// <param name="x">Planet coordinate X</param> /// <param name="y">Planet coordinate Y</param> /// <param name="z">Planet coordinate Z</param> /// <returns>BlockType given the planetstratum at the given coordinate</returns> private static BlockData CalculateBlockFromPlanetStratum(FastNoise noise, PlanetStratum s, int x, int y, int z) { BlockData data = null; noise.SetFrequency(1 / s.scale); // Get noise in Range(-1f, 1f) float noiseVal = noise.GetSimplexFractal(x, y, z); // Convert to Range(0f, 1f) float e = (noiseVal + 1) / 2; // Raise to strata power level e = Mathf.Pow(e, s.power); // Scale from e Range(0,1) to size of blockTypes array int index = Mathf.FloorToInt(e * s.blockDistribution.Length); // Set to type at that index in array data = s.blockDistribution[index]; return(data); }