コード例 #1
0
        /// <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);
        }
コード例 #2
0
        /// <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);
        }