- per-terrain base, height, width sliders

This commit is contained in:
dags- 2020-02-14 20:14:52 +00:00
parent 0e6c00b1e4
commit 2142c07522
37 changed files with 195 additions and 163 deletions

View File

@ -64,7 +64,7 @@ public abstract class Renderer {
float sat = 70;
float bri = 70;
applet.fill(hue, 65, 70);
return cell.regionEdge * el;
return height * el;
} else if(applet.controller.getColorMode() == Applet.EROSION) {
float change = cell.sediment + cell.erosion;
float value = Math.abs(cell.sediment * 250);

View File

@ -1,9 +1,9 @@
package com.terraforged.core.cell;
import me.dags.noise.util.NoiseUtil;
import com.terraforged.core.util.concurrent.ObjectPool;
import com.terraforged.core.world.biome.BiomeType;
import com.terraforged.core.world.terrain.Terrain;
import me.dags.noise.util.NoiseUtil;
public class Cell<T extends Tag> {

View File

@ -1,12 +1,12 @@
package com.terraforged.core.decorator;
import me.dags.noise.Module;
import me.dags.noise.Source;
import com.terraforged.core.cell.Cell;
import com.terraforged.core.util.Seed;
import com.terraforged.core.world.biome.BiomeType;
import com.terraforged.core.world.heightmap.Levels;
import com.terraforged.core.world.terrain.Terrain;
import me.dags.noise.Module;
import me.dags.noise.Source;
public class DesertStacks implements Decorator {
@ -24,7 +24,7 @@ public class DesertStacks implements Decorator {
Module top = Source.perlin(seed.next(), 4, 1).alpha(0.25);
Module scale = Source.perlin(seed.next(), 400, 1)
.clamp(20F / 255F, 25F / 255F);
.clamp(levels.scale(20), levels.scale(35));
Module stack = (x, y) -> {
float value = shape.getValue(x, y);

View File

@ -1,13 +1,13 @@
package com.terraforged.core.decorator;
import me.dags.noise.Module;
import me.dags.noise.Source;
import me.dags.noise.util.NoiseUtil;
import com.terraforged.core.cell.Cell;
import com.terraforged.core.util.Seed;
import com.terraforged.core.world.heightmap.Levels;
import com.terraforged.core.world.terrain.Terrain;
import com.terraforged.core.world.terrain.Terrains;
import me.dags.noise.Module;
import me.dags.noise.Source;
import me.dags.noise.util.NoiseUtil;
public class SwampPools implements Decorator {

View File

@ -3,7 +3,6 @@ package com.terraforged.core.filter;
import com.terraforged.core.cell.Cell;
import com.terraforged.core.region.Size;
import com.terraforged.core.settings.Settings;
import com.terraforged.core.util.PosIterator;
import com.terraforged.core.world.heightmap.Levels;
import me.dags.noise.util.NoiseUtil;

View File

@ -1,9 +1,9 @@
package com.terraforged.core.filter;
import me.dags.noise.util.NoiseUtil;
import com.terraforged.core.cell.Cell;
import com.terraforged.core.settings.Settings;
import com.terraforged.core.world.heightmap.Levels;
import me.dags.noise.util.NoiseUtil;
public class Smoothing implements Filter {

View File

@ -1,11 +1,11 @@
package com.terraforged.core.module;
import me.dags.noise.Module;
import me.dags.noise.func.Interpolation;
import me.dags.noise.util.NoiseUtil;
import com.terraforged.core.cell.Cell;
import com.terraforged.core.cell.Populator;
import com.terraforged.core.world.terrain.Terrain;
import me.dags.noise.Module;
import me.dags.noise.func.Interpolation;
import me.dags.noise.util.NoiseUtil;
public class Blender extends Select implements Populator {

View File

@ -1,11 +1,11 @@
package com.terraforged.core.module;
import me.dags.noise.func.Interpolation;
import me.dags.noise.util.NoiseUtil;
import com.terraforged.core.cell.Cell;
import com.terraforged.core.cell.Populator;
import com.terraforged.core.world.climate.Climate;
import com.terraforged.core.world.terrain.Terrain;
import me.dags.noise.func.Interpolation;
import me.dags.noise.util.NoiseUtil;
public class MultiBlender extends Select implements Populator {

View File

@ -1,8 +1,8 @@
package com.terraforged.core.module;
import me.dags.noise.Module;
import com.terraforged.core.cell.Cell;
import com.terraforged.core.world.terrain.Terrain;
import me.dags.noise.Module;
public class Select {

View File

@ -167,15 +167,30 @@ public class Region implements Extent {
public void decorateZoom(Collection<Decorator> decorators, float offsetX, float offsetZ, float zoom) {
float translateX = offsetX - ((blockSize.total * zoom) / 2F);
float translateZ = offsetZ - ((blockSize.total * zoom) / 2F);
for (int dz = 0; dz < blockSize.total; dz++) {
for (int dx = 0; dx < blockSize.total; dx++) {
int index = blockSize.indexOf(dx, dz);
GenCell cell = blocks[index];
for (Decorator decorator : decorators) {
decorator.apply(cell, getBlockX() + translateX + dx, getBlockZ() + translateZ + dz);
}
for (int cz = 0; cz < chunkSize.total; cz++) {
for (int cx = 0; cx < chunkSize.total; cx++) {
int index = chunkSize.indexOf(cx, cz);
GenChunk chunk = computeChunk(index, cx, cz);
chunk.iterate((cell, dx, dz) -> {
float x = ((chunk.getBlockX() + dx) * zoom) + translateX;
float z = ((chunk.getBlockZ() + dz) * zoom) + translateZ;
for (Decorator decorator : decorators) {
decorator.apply(cell, x, z);
}
});
}
}
// for (int dz = 0; dz < blockSize.total; dz++) {
// for (int dx = 0; dx < blockSize.total; dx++) {
// int index = blockSize.indexOf(dx, dz);
// GenCell cell = blocks[index];
// for (Decorator decorator : decorators) {
// decorator.apply(cell, getBlockX() + translateX + dx, getBlockZ() + translateZ + dz);
// }
// }
// }
}
public void iterate(Consumer<ChunkReader> consumer) {

View File

@ -1,10 +1,10 @@
package com.terraforged.core.region;
import me.dags.noise.util.NoiseUtil;
import com.terraforged.core.region.chunk.ChunkReader;
import com.terraforged.core.util.Cache;
import com.terraforged.core.util.FutureValue;
import com.terraforged.core.world.heightmap.RegionExtent;
import me.dags.noise.util.NoiseUtil;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.Future;

View File

@ -1,10 +1,10 @@
package com.terraforged.core.settings;
import me.dags.noise.Module;
import me.dags.noise.Source;
import com.terraforged.core.util.serialization.annotation.Comment;
import com.terraforged.core.util.serialization.annotation.Range;
import com.terraforged.core.util.serialization.annotation.Serializable;
import me.dags.noise.Module;
import me.dags.noise.Source;
@Serializable
public class GeneratorSettings {

View File

@ -3,48 +3,57 @@ package com.terraforged.core.settings;
import com.terraforged.core.util.serialization.annotation.Comment;
import com.terraforged.core.util.serialization.annotation.Range;
import com.terraforged.core.util.serialization.annotation.Serializable;
import me.dags.noise.Module;
@Serializable
public class TerrainSettings {
public transient float deepOcean = 1F;
public transient float ocean = 1F;
public transient float coast = 1F;
public transient float river = 1F;
public Terrain steppe = new Terrain(5F, 1F, 1F);
public Terrain plains = new Terrain(5F, 1F, 1F);
public Terrain hills = new Terrain(2F, 1F, 1F);
public Terrain dales = new Terrain(2F, 1F, 1F);
public Terrain plateau = new Terrain(1.5F, 1F, 1F);
public Terrain badlands = new Terrain(1.5F, 1F, 1F);
public Terrain torridonian = new Terrain(0.5F, 1F, 1F);
public Terrain mountains = new Terrain(0.5F, 1F, 1F);
public Terrain volcano = new Terrain(1F, 1F, 1F);
@Range(min = 0, max = 10)
@Comment("Controls how common this terrain type is")
public float steppe = 5F;
@Serializable
public static class Terrain {
@Range(min = 0, max = 10)
@Comment("Controls how common this terrain type is")
public float plains = 5F;
@Range(min = 0, max = 10)
@Comment("Controls how common this terrain type is")
public float weight = 1F;
@Range(min = 0, max = 10)
@Comment("Controls how common this terrain type is")
public float hills = 2F;
@Range(min = 0, max = 2)
@Comment("Controls the base height of this terrain")
public float baseScale = 1F;
@Range(min = 0, max = 10)
@Comment("Controls how common this terrain type is")
public float dales = 2F;
@Range(min = 0F, max = 10F)
@Comment("Stretches or compresses the terrain vertically")
public float verticalScale = 1F;
@Range(min = 0, max = 10)
@Comment("Controls how common this terrain type is")
public float plateau = 2F;
@Range(min = 0F, max = 10F)
@Comment("Stretches or compresses the terrain horizontally")
public float horizontalScale = 1F;
@Range(min = 0, max = 10)
@Comment("Controls how common this terrain type is")
public float badlands = 2F;
public Terrain() {
@Range(min = 0, max = 10)
@Comment("Controls how common this terrain type is")
public float torridonian = 0.5F;
}
@Range(min = 0, max = 10)
@Comment("Controls how common this terrain type is")
public float mountains = 0.5F;
public Terrain(float weight, float vertical, float horizontal) {
this.weight = weight;
this.verticalScale = vertical;
this.horizontalScale = horizontal;
}
@Range(min = 0, max = 10)
@Comment("Controls how common this terrain type is")
public float volcano = 1F;
public Module apply(double bias, double scale, Module module) {
double moduleBias = bias * baseScale;
double moduleScale = scale * verticalScale;
if (moduleBias + moduleScale > 1) {
return module.scale(moduleScale).bias(moduleBias).clamp(0, 1);
}
return module.scale(moduleScale).bias(moduleBias);
}
}
}

View File

@ -1,10 +1,10 @@
package com.terraforged.core.util;
import me.dags.noise.Module;
import me.dags.noise.Source;
import com.terraforged.core.cell.Cell;
import com.terraforged.core.world.heightmap.Levels;
import com.terraforged.core.world.terrain.Terrain;
import me.dags.noise.Module;
import me.dags.noise.Source;
import java.util.function.BiPredicate;

View File

@ -2,7 +2,11 @@ package com.terraforged.core.util.concurrent;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.*;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.ForkJoinPool;
import java.util.concurrent.Future;
public class ThreadPool {

View File

@ -2,7 +2,11 @@ package com.terraforged.core.util.grid;
import me.dags.noise.util.NoiseUtil;
import java.util.*;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.function.Function;
import java.util.function.Supplier;

View File

@ -2,7 +2,11 @@ package com.terraforged.core.util.grid;
import me.dags.noise.util.NoiseUtil;
import java.util.*;
import java.util.Collections;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Set;
public class FixedList<T> implements Iterable<T> {

View File

@ -1,7 +1,6 @@
package com.terraforged.core.world;
import com.terraforged.core.decorator.Decorator;
import com.terraforged.core.decorator.DesertDunes;
import com.terraforged.core.decorator.DesertStacks;
import com.terraforged.core.decorator.SwampPools;

View File

@ -1,16 +1,16 @@
package com.terraforged.core.world.climate;
import com.terraforged.core.cell.Cell;
import com.terraforged.core.settings.GeneratorSettings;
import com.terraforged.core.util.Seed;
import com.terraforged.core.world.biome.BiomeType;
import com.terraforged.core.world.terrain.Terrain;
import me.dags.noise.Module;
import me.dags.noise.Source;
import me.dags.noise.func.DistanceFunc;
import me.dags.noise.func.EdgeFunc;
import me.dags.noise.util.NoiseUtil;
import me.dags.noise.util.Vec2f;
import com.terraforged.core.cell.Cell;
import com.terraforged.core.settings.GeneratorSettings;
import com.terraforged.core.util.Seed;
import com.terraforged.core.world.biome.BiomeType;
import com.terraforged.core.world.terrain.Terrain;
public class ClimateModule {

View File

@ -2,7 +2,6 @@ package com.terraforged.core.world.continent;
import com.terraforged.core.cell.Cell;
import com.terraforged.core.cell.Populator;
import com.terraforged.core.module.MultiBlender;
import com.terraforged.core.world.climate.Climate;
import com.terraforged.core.world.terrain.Terrain;
import me.dags.noise.func.Interpolation;

View File

@ -1,5 +1,10 @@
package com.terraforged.core.world.continent;
import com.terraforged.core.cell.Cell;
import com.terraforged.core.cell.Populator;
import com.terraforged.core.settings.GeneratorSettings;
import com.terraforged.core.util.Seed;
import com.terraforged.core.world.terrain.Terrain;
import me.dags.noise.Module;
import me.dags.noise.Source;
import me.dags.noise.domain.Domain;
@ -7,11 +12,6 @@ import me.dags.noise.func.DistanceFunc;
import me.dags.noise.func.EdgeFunc;
import me.dags.noise.util.NoiseUtil;
import me.dags.noise.util.Vec2f;
import com.terraforged.core.cell.Cell;
import com.terraforged.core.cell.Populator;
import com.terraforged.core.settings.GeneratorSettings;
import com.terraforged.core.util.Seed;
import com.terraforged.core.world.terrain.Terrain;
public class ContinentModule implements Populator {

View File

@ -1,9 +1,9 @@
package com.terraforged.core.world.geology;
import com.terraforged.core.util.Seed;
import me.dags.noise.Module;
import me.dags.noise.Source;
import me.dags.noise.util.NoiseUtil;
import com.terraforged.core.util.Seed;
import java.util.ArrayList;
import java.util.LinkedList;

View File

@ -1,7 +1,7 @@
package com.terraforged.core.world.heightmap;
import me.dags.noise.util.NoiseUtil;
import com.terraforged.core.settings.GeneratorSettings;
import me.dags.noise.util.NoiseUtil;
public class Levels {

View File

@ -11,14 +11,14 @@ import com.terraforged.core.world.climate.Climate;
import com.terraforged.core.world.continent.ContinentLerper2;
import com.terraforged.core.world.continent.ContinentLerper3;
import com.terraforged.core.world.continent.ContinentModule;
import com.terraforged.core.world.terrain.region.RegionLerper;
import com.terraforged.core.world.terrain.region.RegionModule;
import com.terraforged.core.world.terrain.region.RegionSelector;
import com.terraforged.core.world.river.RiverManager;
import com.terraforged.core.world.terrain.Terrain;
import com.terraforged.core.world.terrain.TerrainPopulator;
import com.terraforged.core.world.terrain.Terrains;
import com.terraforged.core.world.terrain.provider.TerrainProvider;
import com.terraforged.core.world.terrain.region.RegionLerper;
import com.terraforged.core.world.terrain.region.RegionModule;
import com.terraforged.core.world.terrain.region.RegionSelector;
import me.dags.noise.Module;
import me.dags.noise.Source;
import me.dags.noise.func.EdgeFunc;

View File

@ -1,12 +1,12 @@
package com.terraforged.core.world.river;
import me.dags.noise.Source;
import me.dags.noise.util.NoiseUtil;
import me.dags.noise.util.Vec2f;
import com.terraforged.core.cell.Cell;
import com.terraforged.core.world.terrain.Terrain;
import com.terraforged.core.world.terrain.TerrainPopulator;
import com.terraforged.core.world.terrain.Terrains;
import me.dags.noise.Source;
import me.dags.noise.util.NoiseUtil;
import me.dags.noise.util.Vec2f;
public class Lake extends TerrainPopulator {

View File

@ -1,10 +1,10 @@
package com.terraforged.core.world.river;
import com.terraforged.core.cell.Cell;
import com.terraforged.core.world.heightmap.Heightmap;
import com.terraforged.core.world.terrain.Terrain;
import me.dags.noise.domain.Domain;
import me.dags.noise.util.Vec2i;
import com.terraforged.core.cell.Cell;
import com.terraforged.core.world.terrain.Terrain;
import java.util.Random;

View File

@ -1,13 +1,13 @@
package com.terraforged.core.world.river;
import me.dags.noise.Module;
import me.dags.noise.Source;
import me.dags.noise.source.Line;
import me.dags.noise.util.NoiseUtil;
import com.terraforged.core.cell.Cell;
import com.terraforged.core.world.terrain.Terrain;
import com.terraforged.core.world.terrain.TerrainPopulator;
import com.terraforged.core.world.terrain.Terrains;
import me.dags.noise.Module;
import me.dags.noise.Source;
import me.dags.noise.source.Line;
import me.dags.noise.util.NoiseUtil;
public class River extends TerrainPopulator {

View File

@ -1,11 +1,11 @@
package com.terraforged.core.world.river;
import com.terraforged.core.world.heightmap.Heightmap;
import me.dags.noise.util.NoiseUtil;
import com.terraforged.core.cell.Cell;
import com.terraforged.core.util.Cache;
import com.terraforged.core.world.GeneratorContext;
import com.terraforged.core.world.heightmap.Heightmap;
import com.terraforged.core.world.terrain.Terrain;
import me.dags.noise.util.NoiseUtil;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.TimeUnit;

View File

@ -1,15 +1,15 @@
package com.terraforged.core.world.river;
import com.terraforged.core.cell.Cell;
import com.terraforged.core.util.concurrent.ObjectPool;
import com.terraforged.core.world.GeneratorContext;
import com.terraforged.core.world.heightmap.Heightmap;
import com.terraforged.core.world.terrain.Terrain;
import com.terraforged.core.world.terrain.Terrains;
import me.dags.noise.domain.Domain;
import me.dags.noise.util.NoiseUtil;
import me.dags.noise.util.Vec2f;
import me.dags.noise.util.Vec2i;
import com.terraforged.core.cell.Cell;
import com.terraforged.core.util.concurrent.ObjectPool;
import com.terraforged.core.world.GeneratorContext;
import com.terraforged.core.world.terrain.Terrain;
import com.terraforged.core.world.terrain.Terrains;
import java.util.Collections;
import java.util.LinkedList;

View File

@ -1,10 +1,11 @@
package com.terraforged.core.world.terrain;
import com.terraforged.core.settings.TerrainSettings;
import com.terraforged.core.util.Seed;
import com.terraforged.core.world.heightmap.Levels;
import me.dags.noise.Module;
import me.dags.noise.Source;
import me.dags.noise.func.EdgeFunc;
import com.terraforged.core.util.Seed;
import com.terraforged.core.world.heightmap.Levels;
public class LandForms {
@ -14,10 +15,6 @@ public class LandForms {
public static final int PLATEAU_H = 500;
public static final double PLATEAU_V = 0.475;
public static final int LOESS_H0 = 100;
public static final int LOESS_H1 = 200;
public static final double LOESS_V = 0.5;
private static final int HILLS_H = 500;
private static final double HILLS1_V = 0.6;
private static final double HILLS2_V = 0.55;
@ -28,12 +25,14 @@ public class LandForms {
private static final int MOUNTAINS2_H = 400;
private static final double MOUNTAINS2_V = 0.645;
private final TerrainSettings settings;
private final float terrainHorizontalScale;
private final float terrainVerticalScale;
private final float groundLevel;
private final float seaLevel;
public LandForms(Levels levels) {
public LandForms(TerrainSettings settings, Levels levels) {
this.settings = settings;
terrainHorizontalScale = 1.025F;
terrainVerticalScale = 1F;
groundLevel = levels.ground;
@ -57,24 +56,23 @@ public class LandForms {
}
public Module steppe(Seed seed) {
int scaleH = Math.round(PLAINS_H * terrainHorizontalScale);
int scaleH = Math.round(PLAINS_H * terrainHorizontalScale * settings.steppe.horizontalScale);
double erosionAmount = 0.45;
Module erosion = Source.build(seed.next(), scaleH * 2, 3).lacunarity(3.75).perlin().alpha(erosionAmount);
Module warpX = Source.build(seed.next(), scaleH / 4, 3).lacunarity(3).perlin();
Module warpY = Source.build(seed.next(), scaleH / 4, 3).lacunarity(3).perlin();
return Source.perlin(seed.next(), scaleH, 1)
Module module = Source.perlin(seed.next(), scaleH, 1)
.mult(erosion)
.warp(warpX, warpY, Source.constant(scaleH / 4F))
.warp(seed.next(), 256, 1, 200)
.scale(0.125 * terrainVerticalScale)
.bias(groundLevel);
.warp(seed.next(), 256, 1, 200);
return settings.steppe.apply(groundLevel, 0.125 * terrainVerticalScale, module);
}
public Module plains(Seed seed) {
int scaleH = Math.round(PLAINS_H * terrainHorizontalScale);
int scaleH = Math.round(PLAINS_H * terrainHorizontalScale * settings.plains.horizontalScale);
double erosionAmount = 0.45;
@ -82,12 +80,12 @@ public class LandForms {
Module warpX = Source.build(seed.next(), scaleH / 4, 3).lacunarity(3.5).perlin();
Module warpY = Source.build(seed.next(), scaleH / 4, 3).lacunarity(3.5).perlin();
return Source.perlin(seed.next(), scaleH, 1)
Module module = Source.perlin(seed.next(), scaleH, 1)
.mult(erosion)
.warp(warpX, warpY, Source.constant(scaleH / 4F))
.warp(seed.next(), 256, 1, 256)
.scale(PLAINS_V * terrainVerticalScale)
.bias(groundLevel);
.warp(seed.next(), 256, 1, 256);
return settings.plains.apply(groundLevel, PLAINS_V * terrainVerticalScale, module);
}
public Module plateau(Seed seed) {
@ -104,37 +102,32 @@ public class LandForms {
Module surface = Source.perlin(seed.next(), 20, 3).scale(0.05)
.warp(seed.next(), 40, 2, 20);
return valley
.mult(Source.cubic(seed.next(), 500, 1).scale(0.6).bias(0.3))
.add(top)
.terrace(
Source.perlin(seed.next(), 20, 1).scale(0.3).bias(0.2),
Source.perlin(seed.next(), 20, 2).scale(0.1).bias(0.2),
4,
0.4
)
.add(surface)
.scale(PLATEAU_V * terrainVerticalScale)
.bias(groundLevel);
return settings.plateau.apply(groundLevel, PLATEAU_V * terrainVerticalScale,
valley
.mult(Source.cubic(seed.next(), 500, 1).scale(0.6).bias(0.3))
.add(top)
.terrace(
Source.perlin(seed.next(), 20, 1).scale(0.3).bias(0.2),
Source.perlin(seed.next(), 20, 2).scale(0.1).bias(0.2),
4,
0.4
)
.add(surface));
}
public Module hills1(Seed seed) {
return Source.perlin(seed.next(), 200, 3)
return settings.hills.apply(groundLevel, HILLS1_V * terrainVerticalScale, Source.perlin(seed.next(), 200, 3)
.mult(Source.billow(seed.next(), 400, 3).alpha(0.5))
.warp(seed.next(), 30, 3, 20)
.warp(seed.next(), 400, 3, 200)
.scale(HILLS1_V * terrainVerticalScale)
.bias(groundLevel);
.warp(seed.next(), 400, 3, 200));
}
public Module hills2(Seed seed) {
return Source.cubic(seed.next(), 128, 2)
return settings.hills.apply(groundLevel, HILLS2_V * terrainVerticalScale, Source.cubic(seed.next(), 128, 2)
.mult(Source.perlin(seed.next(), 32, 4).alpha(0.075))
.warp(seed.next(), 30, 3, 20)
.warp(seed.next(), 400, 3, 200)
.mult(Source.ridge(seed.next(), 512, 2).alpha(0.8))
.scale(HILLS2_V * terrainVerticalScale)
.bias(groundLevel);
.mult(Source.ridge(seed.next(), 512, 2).alpha(0.8)));
}
public Module dales(Seed seed) {
@ -149,16 +142,18 @@ public class LandForms {
Module hills = combined
.pow(1.125)
.warp(seed.next(), 300, 1, 100);
return hills.scale(0.24).bias(groundLevel);
return settings.dales.apply(groundLevel, 0.4, hills);
}
public Module mountains(Seed seed) {
int scaleH = Math.round(MOUNTAINS_H * terrainHorizontalScale);
return Source.build(seed.next(), scaleH, 4).gain(1.15).lacunarity(2.35).ridge()
int scaleH = Math.round(MOUNTAINS_H * terrainHorizontalScale * settings.mountains.horizontalScale);
Module module = Source.build(seed.next(), scaleH, 4).gain(1.15).lacunarity(2.35).ridge()
.mult(Source.perlin(seed.next(), 24, 4).alpha(0.075))
.warp(seed.next(), 350, 1, 150)
.scale(MOUNTAINS_V * terrainVerticalScale)
.bias(groundLevel);
.warp(seed.next(), 350, 1, 150);
return settings.mountains.apply(groundLevel, MOUNTAINS_V * terrainVerticalScale, module);
}
public Module mountains2(Seed seed) {
@ -168,7 +163,7 @@ public class LandForms {
Module blur = Source.perlin(seed.next(), 10, 1).alpha(0.025);
Module surface = Source.ridge(seed.next(), 125, 4).alpha(0.37);
Module mountains = cell.clamp(0, 1).mult(blur).mult(surface).pow(1.1);
return mountains.scale(scale).bias(groundLevel);
return settings.mountains.apply(groundLevel, scale, mountains);
}
public Module mountains3(Seed seed) {
@ -190,7 +185,7 @@ public class LandForms {
1
);
return terraced.scale(scale).bias(groundLevel);
return settings.mountains.apply(groundLevel, scale, terraced);
}
public Module badlands(Seed seed) {
@ -213,7 +208,7 @@ public class LandForms {
.add(mod2)
.scale(alpha);
return shape.mult(detail.alpha(0.5)).scale(0.7).bias(groundLevel);
return settings.badlands.apply(groundLevel, 0.7, shape.mult(detail.alpha(0.5)));
}
public Module torridonian(Seed seed) {
@ -239,6 +234,6 @@ public class LandForms {
1
).boost();
return test.scale(0.5).bias(groundLevel);
return settings.torridonian.apply(groundLevel, 0.5, test);
}
}

View File

@ -110,42 +110,42 @@ public class Terrain implements Tag {
}
public static Terrain steppe(Settings settings) {
return new Terrain("steppe", 5, settings.terrain.steppe);
return new Terrain("steppe", 5, settings.terrain.steppe.weight);
}
public static Terrain plains(Settings settings) {
return new Terrain("plains", 5, settings.terrain.plains);
return new Terrain("plains", 5, settings.terrain.plains.weight);
}
public static Terrain plateau(Settings settings) {
return new Terrain("plateau", 6, settings.terrain.plateau);
return new Terrain("plateau", 6, settings.terrain.plateau.weight);
}
public static Terrain badlands(Settings settings) {
return new Terrain("badlands", 7, settings.terrain.badlands);
return new Terrain("badlands", 7, settings.terrain.badlands.weight);
}
public static Terrain hills(Settings settings) {
return new Terrain("hills", 8, settings.terrain.hills);
return new Terrain("hills", 8, settings.terrain.hills.weight);
}
public static Terrain dales(Settings settings) {
return new Terrain("dales", 9, settings.terrain.hills);
return new Terrain("dales", 9, settings.terrain.dales.weight);
}
public static Terrain torridonian(Settings settings) {
return new Terrain("torridonian_fells", 10, settings.terrain.torridonian);
return new Terrain("torridonian_fells", 10, settings.terrain.torridonian.weight);
}
public static Terrain mountains(Settings settings) {
return new Terrain("mountains", 11, settings.terrain.mountains);
return new Terrain("mountains", 11, settings.terrain.mountains.weight);
}
public static Terrain volcano(Settings settings) {
return new Terrain("volcano", 12, settings.terrain.volcano);
return new Terrain("volcano", 12, settings.terrain.volcano.weight);
}
public static Terrain volcanoPipe(Settings settings) {
return new Terrain("volcano_pipe", 13, settings.terrain.volcano);
return new Terrain("volcano_pipe", 13, settings.terrain.volcano.weight);
}
}

View File

@ -1,10 +1,10 @@
package com.terraforged.core.world.terrain;
import me.dags.noise.Module;
import me.dags.noise.Source;
import com.terraforged.core.cell.Cell;
import com.terraforged.core.cell.Populator;
import com.terraforged.core.util.Seed;
import me.dags.noise.Module;
import me.dags.noise.Source;
import java.util.Arrays;
import java.util.function.BiFunction;

View File

@ -1,12 +1,12 @@
package com.terraforged.core.world.terrain;
import me.dags.noise.Module;
import me.dags.noise.Source;
import me.dags.noise.func.EdgeFunc;
import com.terraforged.core.cell.Cell;
import com.terraforged.core.util.Seed;
import com.terraforged.core.world.heightmap.Levels;
import com.terraforged.core.world.heightmap.RegionConfig;
import me.dags.noise.Module;
import me.dags.noise.Source;
import me.dags.noise.func.EdgeFunc;
public class VolcanoPopulator extends TerrainPopulator {

View File

@ -1,7 +1,5 @@
package com.terraforged.core.world.terrain.provider;
import me.dags.noise.Module;
import me.dags.noise.Source;
import com.terraforged.core.cell.Populator;
import com.terraforged.core.util.Seed;
import com.terraforged.core.world.GeneratorContext;
@ -10,6 +8,8 @@ import com.terraforged.core.world.terrain.LandForms;
import com.terraforged.core.world.terrain.Terrain;
import com.terraforged.core.world.terrain.TerrainPopulator;
import com.terraforged.core.world.terrain.VolcanoPopulator;
import me.dags.noise.Module;
import me.dags.noise.Source;
import java.util.ArrayList;
import java.util.HashMap;
@ -31,7 +31,7 @@ public class StandardTerrainProvider implements TerrainProvider {
public StandardTerrainProvider(GeneratorContext context, RegionConfig config, Populator defaultPopulator) {
this.config = config;
this.context = context;
this.landForms = new LandForms(context.levels);
this.landForms = new LandForms(context.settings.terrain, context.levels);
this.defaultPopulator = defaultPopulator;
init();
}

View File

@ -1,10 +1,10 @@
package com.terraforged.core.world.terrain.provider;
import me.dags.noise.Module;
import com.terraforged.core.cell.Populator;
import com.terraforged.core.world.terrain.LandForms;
import com.terraforged.core.world.terrain.Terrain;
import com.terraforged.core.world.terrain.TerrainPopulator;
import me.dags.noise.Module;
import java.util.List;

View File

@ -57,6 +57,10 @@ public class RegionSelector implements Populator {
}
}
if (result.isEmpty()) {
return modules.toArray(new Populator[0]);
}
return result.toArray(new Populator[0]);
}
}

@ -1 +1 @@
Subproject commit fbfbdfec2824f1640c6ec4df9682b07ce97e1982
Subproject commit 39012b51fb49d214c85332f00cf353c1f6e727c7