Exemplo n.º 1
0
 public ChunkProvider(uint seed)
 {
     Console.Write ("Building Perlin noise maps... ");
     this._temperature = new Perlin2D (seed);
     this._humidity = new Perlin2D (seed + 1);
     this._p3d = new Perlin3D (seed + 2);
     this._p2d = new Perlin2D (seed + 3);
     Console.WriteLine ("Done");
 }
Exemplo n.º 2
0
    public void GenerateNoise(Vector3i offset)
    {
        this.offset = offset;

        for (int x = 0; x < Chunk.Size; x += step)
        {
            for (int y = 0; y < Map.Height; y += step)
            {
                for (int z = 0; z < Chunk.Size; z += step)
                {
                    Vector3i a = new Vector3i(x, y, z) + offset;
                    Vector3i b = a + new Vector3i(step, step, step);

                    float a1 = Perlin3D.Noise(a.x, a.y, a.z, scale);
                    float a2 = Perlin3D.Noise(b.x, a.y, a.z, scale);
                    float a3 = Perlin3D.Noise(a.x, b.y, a.z, scale);
                    float a4 = Perlin3D.Noise(b.x, b.y, a.z, scale);

                    float b1 = Perlin3D.Noise(a.x, a.y, b.z, scale);
                    float b2 = Perlin3D.Noise(b.x, a.y, b.z, scale);
                    float b3 = Perlin3D.Noise(a.x, b.y, b.z, scale);
                    float b4 = Perlin3D.Noise(b.x, b.y, b.z, scale);

                    for (int tx = 0; tx < step && x + tx < Chunk.Size; tx++)
                    {
                        for (int ty = 0; ty < step && y + ty < Map.Height; ty++)
                        {
                            for (int tz = 0; tz < step && z + tz < Chunk.Size; tz++)
                            {
                                float fx = (float)tx / step;
                                float fy = (float)ty / step;
                                float fz = (float)tz / step;

                                float ta1 = Mathf.Lerp(a1, a2, fx);
                                float ta2 = Mathf.Lerp(a3, a4, fx);
                                float ta3 = Mathf.Lerp(ta1, ta2, fy);

                                float tb1 = Mathf.Lerp(b1, b2, fx);
                                float tb2 = Mathf.Lerp(b3, b4, fx);
                                float tb3 = Mathf.Lerp(tb1, tb2, fy);

                                float val = Mathf.Lerp(ta3, tb3, fz);
                                map[x + tx, y + ty, z + tz] = val;
                            }
                        }
                    }
                }
            }
        }
    }
Exemplo n.º 3
0
    //Spline stuff
    public static void AddSplineSegment(Vector3 pos, float holeOffsetRadius)
    {
        SplineLine.Add(new Spline {
            pos = pos, radius = 10
        });
        //Hole!
        float   x   = (Perlin3D.PerlinNoise3D(pos + Vector3.up) - 0.5f) * 2 * holeOffsetRadius;
        float   y   = (Perlin3D.PerlinNoise3D(pos + Vector3.right) - 0.5f) * 2 * holeOffsetRadius;
        float   z   = (Perlin3D.PerlinNoise3D(pos + Vector3.forward) - 0.5f) * 2 * holeOffsetRadius;
        Vector3 off = new Vector3(x, y, z);

        SplineHole.Add(new Spline {
            pos = pos + off, radius = 5f
        });
    }
Exemplo n.º 4
0
    public void makeSpline(int segmentCount, float sporadicFactor, float noiseScale)
    {
        Perlin3D.scale = noiseScale;
        Vector3 direction  = Vector3.right;
        Vector3 currentPos = Vector3.one * Random.Range(40, 9999);

        for (int i = 0; i < segmentCount; i++)
        {
            float x = 0.1f;
            float y = Perlin3D.PerlinNoise3D(currentPos + Vector3.up) - 0.5f;
            float z = Perlin3D.PerlinNoise3D(currentPos + Vector3.forward) - 0.5f;
            direction   = Vector3.Slerp(direction, new Vector3(x, y, z).normalized, sporadicFactor);
            currentPos += direction.normalized * 20f;
            SplineNoise3D.AddSplineSegment(currentPos, 10f);
        }
    }
Exemplo n.º 5
0
    public static void GenerateAllTerrain()
    {
        numCompleted = 0;

        Perlin2D.Initialize();
        Perlin3D.Initialize();
        Voronoi.Initialize();

        for (int x = 0; x < WidthChunks; x++)
        {
            for (int z = 0; z < WidthChunks; z++)
            {
                ThreadManager.QueueWork(GenerateTerrainSection, new Vector2i(x, z), false);
            }
        }
    }
Exemplo n.º 6
0
    public float SuperNoise(Vector3 point)
    {
        //distance along spline X
        float dist = SplineNoise3D.HoleNoise(point) / _HoleSize;

        if (dist > 1f)
        {
            dist = 1f;
        }
        Perlin3D.scale = _InternalCaveNoise;
        float caveWalls = SplineNoise3D.SplineNoise(point) + Perlin3D.PerlinNoise3D(point) * _CaveWallAmount;

        if (caveWalls < 6f)
        {
            caveWalls = 0f;
        }
        return((caveWalls + Perlin3D.PerlinNoise3D(point) * _InternalCaveAmount) * dist);
    }
Exemplo n.º 7
0
        public CustomHexSphere(int size) : base(size)
        {
            foreach (CustomTile t in Tiles)
            {
                t.ParentSphere = this;
            }

            _perlin = Perlin3D.Instance;

            foreach (var t in Tiles)
            {
                var val = _perlin.GetMultioctave3DNoiseValue(t.X * PerlinCoefficient, t.Y * PerlinCoefficient, t.Z * PerlinCoefficient, 1, 5, 1.5);

                _minNoise = Math.Min(_minNoise, val);
                _maxNoise = Math.Max(_maxNoise, val);
            }

            foreach (var t in Tiles)
            {
                var val = _perlin.GetMultioctave3DNoiseValue(t.X * PerlinCoefficient, t.Y * PerlinCoefficient, t.Z * PerlinCoefficient, 1, 5, 1.5);
                val = (val - _minNoise) / (_maxNoise - _minNoise);
                float fVal = (float)val;

                t.Height = val;
            }

            WaterHeight = GetHeightFromCoveragePercent(desiredWaterCoveragePercent);

            foreach (var t in Tiles)//separated water detection from height calculation for water level calculation
            {
                t.IsWater = t.Height < WaterHeight;
            }

            NorthPole.Color = Color.Red;
            SouthPole.Color = Color.Red;
        }