Exemplo n.º 1
0
    /// <summary>
    /// Samples all points in a chunk column using perlin noise
    /// </summary>
    /// <param name="colCoord">The coordinate of the chunk</param>
    /// <returns>The filled noisemap</returns>
    private float[,,] SamplePoints(ColumnCoord colCoord)
    {
        int   size = ChunkColumn.chunkSize;
        int   amountOfVerticalChunks = ChunkColumn.worldHeight;
        float halfSize = size * 0.5f;

        float[,,] sampleNoiseMap = new float[size / horizontalNoiseScale + 1, size *amountOfVerticalChunks / verticalNoiseScale + 1, size / horizontalNoiseScale + 1];

        float sampleX, sampleY, sampleZ, adjustmentVal;

        // Sampling points
        for (int x = 0; x < sampleNoiseMap.GetLength(0); x++)
        {
            for (int y = 0; y < sampleNoiseMap.GetLength(1); y++)
            {
                for (int z = 0; z < sampleNoiseMap.GetLength(2); z++)
                {
                    Vector3 chunkOffset = new Vector3(colCoord.x, 0, colCoord.z) * size;

                    sampleX = ((float)x * horizontalNoiseScale - halfSize + chunkOffset.x) * ChunkColumn.blockSize / zoomScale;
                    sampleY = ((float)y * verticalNoiseScale + chunkOffset.y) * ChunkColumn.blockSize / zoomScale;
                    sampleZ = ((float)z * horizontalNoiseScale - halfSize + chunkOffset.z) * ChunkColumn.blockSize / zoomScale;

                    sampleNoiseMap[x, y, z] = CustomPerlinNoise.PerlinNoise(sampleX, sampleY, sampleZ);

                    adjustmentVal = (1 - Mathf.InverseLerp(solidHeight, airHeight, y * verticalNoiseScale) * (1 - Mathf.PerlinNoise(sampleX, sampleZ) * 0.2f)) * 2 - 1;

                    adjustmentVal *= adjustScalar;

                    sampleNoiseMap[x, y, z] += adjustmentVal;
                }
            }
        }

        return(sampleNoiseMap);
    }
Exemplo n.º 2
0
    public void CreateData()
    {
        float scale = NoiseParameters.Scale;
        float smoothingCoeficient = NoiseParameters.Smooth;
        int   multiplyer          = NoiseParameters.Mult;

        float minWeight = float.MaxValue;
        float maxWeight = float.MinValue;

        PerlinNoise       perlin       = new PerlinNoise(1);
        CustomPerlinNoise customPerlin = new CustomPerlinNoise();

        for (int x = 0; x < sizeX; x++)
        {
            for (int y = 0; y < sizeY; y++)
            {
                for (int z = 0; z < sizeZ; z++)
                {
                    float weight = 0f;

                    double sampleX = (x + Position.x) * scale;
                    double sampleZ = (z + Position.z) * scale;
                    double sampleY;

                    if (NoiseParameters.Use3DNoise)
                    {
                        sampleY = (y + Position.y) * scale;
                    }
                    else
                    {
                        sampleY = 0;
                    }

                    if (NoiseParameters.ClassicNoise)
                    {
                        weight += (float)(y * smoothingCoeficient + ClassicNoise.Noise(sampleX * smoothingCoeficient, sampleY * smoothingCoeficient, sampleZ * smoothingCoeficient) * multiplyer);
                    }

                    if (NoiseParameters.PerlinNoise)
                    {
                        weight += (float)(y * smoothingCoeficient + perlin.Noise(sampleX * smoothingCoeficient, sampleY * smoothingCoeficient, sampleZ * smoothingCoeficient) * multiplyer);
                    }

                    if (NoiseParameters.SimplexNoise)
                    {
                        weight += (float)(y * smoothingCoeficient + SimplexNoise.Noise(sampleX * smoothingCoeficient, sampleY * smoothingCoeficient, sampleZ * smoothingCoeficient) * multiplyer);
                    }

                    if (NoiseParameters.DefaultPerlinNoise)
                    {
                        weight += (y + customPerlin.Noise((float)sampleX, (float)sampleZ, NoiseParameters.Octaves) * multiplyer);
                    }

                    if (weight < minWeight)
                    {
                        minWeight = weight;
                    }

                    if (weight > maxWeight)
                    {
                        maxWeight = weight;
                    }

                    data[x, y, z] = weight;

                    if (y == 0)
                    {
                        data[x, y, z] = -1f;
                    }
                }
            }
        }
    }