feat(world-gen): rescale biome relief and snow line for 512-tall world
This commit is contained in:
@@ -20,8 +20,8 @@ public class BiomeTests
|
|||||||
{
|
{
|
||||||
var blocks = new BlockRegistry();
|
var blocks = new BlockRegistry();
|
||||||
var biomes = new BiomeRegistry(42, blocks);
|
var biomes = new BiomeRegistry(42, blocks);
|
||||||
Assert.Equal("Stone", biomes.Mountains.TopBlock(70).Name);
|
Assert.Equal("Stone", biomes.Mountains.TopBlock(200).Name); // below snow line
|
||||||
Assert.Equal("Snow Block", biomes.Mountains.TopBlock(120).Name);
|
Assert.Equal("Snow Block", biomes.Mountains.TopBlock(420).Name); // above snow line (384)
|
||||||
}
|
}
|
||||||
|
|
||||||
[Fact]
|
[Fact]
|
||||||
|
|||||||
@@ -43,11 +43,11 @@ public class TerrainSamplerTests
|
|||||||
for (int x = -200; x < 200; x += 3)
|
for (int x = -200; x < 200; x += 3)
|
||||||
for (int z = -200; z < 200; z += 3)
|
for (int z = -200; z < 200; z += 3)
|
||||||
{
|
{
|
||||||
// The dense blur removes inter-biome cliffs (those would be 25+ blocks).
|
// The dense blur removes inter-biome cliffs. Remaining deltas are
|
||||||
// Remaining deltas are rugged intra-Mountains ridged slopes (~9), which
|
// rugged intra-Mountains ridged slopes, now ~4x larger after the
|
||||||
// are intended terrain, not cliffs; 16 separates the two.
|
// 128->512 rescale; 64 separates intended slopes from true cliffs.
|
||||||
int dx = System.Math.Abs(sampler.HeightAt(x, z) - sampler.HeightAt(x + 1, z));
|
int dx = System.Math.Abs(sampler.HeightAt(x, z) - sampler.HeightAt(x + 1, z));
|
||||||
Assert.True(dx <= 16, $"height jump {dx} at ({x},{z})");
|
Assert.True(dx <= 64, $"height jump {dx} at ({x},{z})");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -18,8 +18,8 @@ public sealed class DesertBiome : IBiome
|
|||||||
}
|
}
|
||||||
|
|
||||||
public float SampleHeight(NoiseSource noise, float worldX, float worldZ)
|
public float SampleHeight(NoiseSource noise, float worldX, float worldZ)
|
||||||
=> WorldConstants.SeaLevel + 4f * noise.Continent(worldX, worldZ)
|
=> WorldConstants.SeaLevel + 16f * noise.Continent(worldX, worldZ)
|
||||||
+ 1.5f * this._detail.GetNoise(worldX, worldZ);
|
+ 6f * this._detail.GetNoise(worldX, worldZ);
|
||||||
|
|
||||||
public IBlock TopBlock(int worldY) => this.Surface.Top;
|
public IBlock TopBlock(int worldY) => this.Surface.Top;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -18,8 +18,8 @@ public sealed class ForestBiome : IBiome
|
|||||||
}
|
}
|
||||||
|
|
||||||
public float SampleHeight(NoiseSource noise, float worldX, float worldZ)
|
public float SampleHeight(NoiseSource noise, float worldX, float worldZ)
|
||||||
=> WorldConstants.SeaLevel + 6f * noise.Continent(worldX, worldZ)
|
=> WorldConstants.SeaLevel + 24f * noise.Continent(worldX, worldZ)
|
||||||
+ 4f * this._detail.GetNoise(worldX, worldZ);
|
+ 16f * this._detail.GetNoise(worldX, worldZ);
|
||||||
|
|
||||||
public IBlock TopBlock(int worldY) => this.Surface.Top;
|
public IBlock TopBlock(int worldY) => this.Surface.Top;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -4,7 +4,7 @@ namespace VoxelEngine.World.WorldGen.Biomes;
|
|||||||
|
|
||||||
public sealed class MountainsBiome : IBiome
|
public sealed class MountainsBiome : IBiome
|
||||||
{
|
{
|
||||||
private const int SnowLine = 96;
|
private const int SnowLine = 384;
|
||||||
private readonly FastNoiseLite _ridged;
|
private readonly FastNoiseLite _ridged;
|
||||||
private readonly IBlock _stone;
|
private readonly IBlock _stone;
|
||||||
private readonly IBlock _snow;
|
private readonly IBlock _snow;
|
||||||
@@ -25,8 +25,8 @@ public sealed class MountainsBiome : IBiome
|
|||||||
}
|
}
|
||||||
|
|
||||||
public float SampleHeight(NoiseSource noise, float worldX, float worldZ)
|
public float SampleHeight(NoiseSource noise, float worldX, float worldZ)
|
||||||
=> WorldConstants.SeaLevel + 10f * noise.Continent(worldX, worldZ)
|
=> WorldConstants.SeaLevel + 40f * noise.Continent(worldX, worldZ)
|
||||||
+ 45f * this._ridged.GetNoise(worldX, worldZ);
|
+ 200f * this._ridged.GetNoise(worldX, worldZ);
|
||||||
|
|
||||||
public IBlock TopBlock(int worldY) => worldY >= MountainsBiome.SnowLine ? this._snow : this._stone;
|
public IBlock TopBlock(int worldY) => worldY >= MountainsBiome.SnowLine ? this._snow : this._stone;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -18,8 +18,8 @@ public sealed class PlainsBiome : IBiome
|
|||||||
}
|
}
|
||||||
|
|
||||||
public float SampleHeight(NoiseSource noise, float worldX, float worldZ)
|
public float SampleHeight(NoiseSource noise, float worldX, float worldZ)
|
||||||
=> WorldConstants.SeaLevel + 6f * noise.Continent(worldX, worldZ)
|
=> WorldConstants.SeaLevel + 24f * noise.Continent(worldX, worldZ)
|
||||||
+ 2f * this._detail.GetNoise(worldX, worldZ);
|
+ 8f * this._detail.GetNoise(worldX, worldZ);
|
||||||
|
|
||||||
public IBlock TopBlock(int worldY) => this.Surface.Top;
|
public IBlock TopBlock(int worldY) => this.Surface.Top;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user