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"); }
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; } } } } } } }
//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 }); }
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); } }
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); } } }
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); }
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; }