Compare commits

..

1 Commits

Author SHA1 Message Date
Mikal 968746f988 Merge fb0dbda296 into 8366a5288b 2025-03-20 11:02:05 -04:00
399 changed files with 7724 additions and 4961 deletions
+4 -4
View File
@@ -17,16 +17,16 @@ jobs:
contents: read
steps:
- uses: actions/checkout@v4.2.2
- uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11
- name: Set up JDK 21
uses: actions/setup-java@v4.7.1
uses: actions/setup-java@387ac29b308b003ca37ba93a6cab5eb57c8f5f93
with:
java-version: '21'
distribution: 'temurin'
server-id: github # Value of the distributionManagement/repository/id field of the pom.xml
settings-path: ${{ github.workspace }} # location for the settings.xml file
- uses: burrunan/gradle-cache-action@v3.0.1
- uses: burrunan/gradle-cache-action@03c71a8ba93d670980695505f48f49daf43704a6
name: Build Terra
with:
# Specifies arguments for Gradle execution
@@ -44,4 +44,4 @@ jobs:
# Properties are passed as -Pname=value
properties: |
kotlin.js.compiler=ir
kotlin.parallel.tasks.in.project=true
kotlin.parallel.tasks.in.project=true
+5 -6
View File
@@ -16,11 +16,10 @@ repositories {
dependencies {
//TODO Allow pulling from Versions.kt
implementation("com.gradleup.shadow", "shadow-gradle-plugin", "8.3.6")
implementation("io.papermc.paperweight.userdev", "io.papermc.paperweight.userdev.gradle.plugin", "2.0.0-beta.17")
implementation("org.ow2.asm", "asm", "9.8")
implementation("org.ow2.asm", "asm-tree", "9.8")
implementation("com.gradleup.shadow", "shadow-gradle-plugin", "8.3.1")
implementation("io.papermc.paperweight.userdev:io.papermc.paperweight.userdev.gradle.plugin:2.0.0-beta.16")
implementation("org.ow2.asm", "asm", "9.7")
implementation("org.ow2.asm", "asm-tree", "9.7")
implementation("com.dfsek.tectonic", "common", "4.2.1")
implementation("org.yaml", "snakeyaml", "2.4")
implementation("org.yaml", "snakeyaml", "2.3")
}
+2 -8
View File
@@ -60,17 +60,11 @@ fun Project.configureDependencies() {
maven("https://storehouse.okaeri.eu/repository/maven-public/") {
name = "Okaeri"
}
maven("https://maven.solo-studios.ca/releases") {
name = "Solo Studios"
}
maven("https://maven.solo-studios.ca/snapshots") {
name = "Solo Studios"
}
}
dependencies {
testImplementation("org.junit.jupiter", "junit-jupiter", Versions.Libraries.Internal.junit)
"testRuntimeOnly"("org.junit.platform", "junit-platform-launcher")
testImplementation("org.junit.jupiter", "junit-jupiter-api", Versions.Libraries.Internal.junit)
testImplementation("org.junit.jupiter", "junit-jupiter-engine", Versions.Libraries.Internal.junit)
compileOnly("org.jetbrains", "annotations", Versions.Libraries.Internal.jetBrainsAnnotations)
compileOnly("com.google.guava", "guava", Versions.Libraries.Internal.guava)
+29 -33
View File
@@ -1,36 +1,35 @@
object Versions {
object Terra {
const val overworldConfig = "v1.5.1"
const val overworldConfig = "v1.3.4"
}
object Libraries {
const val tectonic = "4.2.1"
const val paralithic = "1.0.3"
const val paralithic = "0.8.1"
const val strata = "1.3.2"
const val seismic = "0.3.4"
const val cloud = "2.0.0"
const val caffeine = "3.2.0"
const val caffeine = "3.1.8"
const val slf4j = "2.0.16"
const val slf4j = "2.0.17"
object Internal {
const val shadow = "8.3.6"
const val apacheText = "1.13.1"
const val apacheIO = "2.19.0"
const val guava = "33.4.8-jre"
const val asm = "9.8"
const val snakeYml = "2.4"
const val jetBrainsAnnotations = "26.0.2"
const val junit = "5.13.0"
const val shadow = "8.3.3"
const val apacheText = "1.12.0"
const val apacheIO = "2.17.0"
const val guava = "33.3.1-jre"
const val asm = "9.7.1"
const val snakeYml = "2.3"
const val jetBrainsAnnotations = "26.0.1"
const val junit = "5.11.3"
const val nbt = "6.1"
}
}
object Fabric {
const val fabricAPI = "0.125.3+${Mod.minecraft}"
const val cloud = "2.0.0-beta.10"
const val fabricAPI = "0.118.0+${Mod.minecraft}"
const val cloud = "2.0.0-beta.9"
}
//
// object Quilt {
@@ -39,13 +38,13 @@ object Versions {
// }
object Mod {
const val mixin = "0.15.5+mixin.0.8.7"
const val mixin = "0.15.3+mixin.0.8.7"
const val minecraft = "1.21.5"
const val yarn = "$minecraft+build.1"
const val fabricLoader = "0.16.14"
const val minecraft = "1.21.4"
const val yarn = "$minecraft+build.8"
const val fabricLoader = "0.16.10"
const val architecuryLoom = "1.10.431"
const val architecuryLoom = "1.9.428"
const val architecturyPlugin = "3.4.161"
}
@@ -56,14 +55,14 @@ object Versions {
// }
object Bukkit {
const val minecraft = "1.21.5-R0.1"
const val paperBuild = "$minecraft-20250529.121722-14"
const val minecraft = "1.21.4"
const val paperBuild = "$minecraft-R0.1-20250317.101324-208"
const val paper = paperBuild
const val paperLib = "1.0.8"
const val reflectionRemapper = "0.1.2"
const val paperDevBundle = "$minecraft-20250529.121722-99"
const val reflectionRemapper = "0.1.1"
const val paperDevBundle = paperBuild
const val runPaper = "2.3.1"
const val paperWeight = "2.0.0-beta.17"
const val paperWeight = "2.0.0-beta.16"
const val cloud = "2.0.0-beta.10"
}
@@ -75,18 +74,15 @@ object Versions {
// }
//
object CLI {
const val logback = "1.5.18"
const val picocli = "4.7.7"
const val logback = "1.5.8"
const val picocli = "4.7.6"
}
object Allay {
const val api = "0.4.1"
const val gson = "2.13.1"
const val mappings = "3626653"
const val mappingsGenerator = "366618e"
const val api = "0.1.3"
}
object Minestom {
const val minestom = "1_21_5-4d91778331"
const val minestom = "187931e50b"
}
}
@@ -5,13 +5,13 @@ import com.dfsek.tectonic.api.config.template.object.ObjectTemplate;
import com.dfsek.terra.addons.biome.extrusion.api.Extrusion;
import com.dfsek.terra.api.config.meta.Meta;
import com.dfsek.seismic.type.sampler.Sampler;
import com.dfsek.terra.api.util.range.Range;
import com.dfsek.terra.api.noise.NoiseSampler;
import com.dfsek.terra.api.util.Range;
public abstract class SamplerExtrusionTemplate implements ObjectTemplate<Extrusion> {
@Value("sampler")
protected @Meta Sampler sampler;
protected @Meta NoiseSampler sampler;
@Value("range")
protected @Meta Range range;
@@ -7,8 +7,8 @@ import java.util.stream.Collectors;
import com.dfsek.terra.addons.biome.extrusion.api.Extrusion;
import com.dfsek.terra.addons.biome.extrusion.api.ReplaceableBiome;
import com.dfsek.terra.addons.biome.query.api.BiomeQueries;
import com.dfsek.seismic.type.sampler.Sampler;
import com.dfsek.terra.api.util.range.Range;
import com.dfsek.terra.api.noise.NoiseSampler;
import com.dfsek.terra.api.util.Range;
import com.dfsek.terra.api.util.collection.ProbabilityCollection;
import com.dfsek.terra.api.world.biome.Biome;
@@ -17,7 +17,7 @@ import com.dfsek.terra.api.world.biome.Biome;
* Sets biomes at locations based on a sampler.
*/
public class ReplaceExtrusion implements Extrusion {
private final Sampler sampler;
private final NoiseSampler sampler;
private final Range range;
@@ -25,7 +25,7 @@ public class ReplaceExtrusion implements Extrusion {
private final Predicate<Biome> hasTag;
public ReplaceExtrusion(Sampler sampler, Range range, ProbabilityCollection<ReplaceableBiome> biomes, String tag) {
public ReplaceExtrusion(NoiseSampler sampler, Range range, ProbabilityCollection<ReplaceableBiome> biomes, String tag) {
this.sampler = sampler;
this.range = range;
this.biomes = biomes;
@@ -6,8 +6,8 @@ import java.util.stream.Collectors;
import com.dfsek.terra.addons.biome.extrusion.api.Extrusion;
import com.dfsek.terra.addons.biome.extrusion.api.ReplaceableBiome;
import com.dfsek.seismic.type.sampler.Sampler;
import com.dfsek.terra.api.util.range.Range;
import com.dfsek.terra.api.noise.NoiseSampler;
import com.dfsek.terra.api.util.Range;
import com.dfsek.terra.api.util.collection.ProbabilityCollection;
import com.dfsek.terra.api.world.biome.Biome;
@@ -16,13 +16,13 @@ import com.dfsek.terra.api.world.biome.Biome;
* Sets biomes at locations based on a sampler.
*/
public class SetExtrusion implements Extrusion {
private final Sampler sampler;
private final NoiseSampler sampler;
private final Range range;
private final ProbabilityCollection<ReplaceableBiome> biomes;
public SetExtrusion(Sampler sampler, Range range, ProbabilityCollection<ReplaceableBiome> biomes) {
public SetExtrusion(NoiseSampler sampler, Range range, ProbabilityCollection<ReplaceableBiome> biomes) {
this.sampler = sampler;
this.range = range;
this.biomes = biomes;
@@ -22,7 +22,7 @@ import com.dfsek.terra.addons.biome.pipeline.api.BiomeChunk;
import com.dfsek.terra.addons.biome.pipeline.api.Pipeline;
import com.dfsek.terra.addons.biome.pipeline.api.Stage;
import com.dfsek.terra.addons.biome.pipeline.api.biome.PipelineBiome;
import com.dfsek.seismic.type.sampler.Sampler;
import com.dfsek.terra.api.noise.NoiseSampler;
import com.dfsek.terra.api.registry.key.StringIdentifiable;
import com.dfsek.terra.api.util.Column;
import com.dfsek.terra.api.world.biome.Biome;
@@ -34,11 +34,11 @@ public class PipelineBiomeProvider implements BiomeProvider {
private final LoadingCache<SeededVector2Key, BiomeChunk> biomeChunkCache;
private final int chunkSize;
private final int resolution;
private final Sampler mutator;
private final NoiseSampler mutator;
private final double noiseAmp;
private final Set<Biome> biomes;
public PipelineBiomeProvider(Pipeline pipeline, int resolution, Sampler mutator, double noiseAmp) {
public PipelineBiomeProvider(Pipeline pipeline, int resolution, NoiseSampler mutator, double noiseAmp) {
this.resolution = resolution;
this.mutator = mutator;
this.noiseAmp = noiseAmp;
@@ -83,8 +83,8 @@ public class PipelineBiomeProvider implements BiomeProvider {
public Biome getBiome(int x, int z, long seed) {
x += (int) (mutator.getSample(seed + 1, x, z) * noiseAmp);
z += (int) (mutator.getSample(seed + 2, x, z) * noiseAmp);
x += mutator.noise(seed + 1, x, z) * noiseAmp;
z += mutator.noise(seed + 2, x, z) * noiseAmp;
x /= resolution;
z /= resolution;
@@ -19,7 +19,7 @@ import com.dfsek.terra.addons.biome.pipeline.api.Source;
import com.dfsek.terra.addons.biome.pipeline.api.Stage;
import com.dfsek.terra.addons.biome.pipeline.pipeline.PipelineImpl;
import com.dfsek.terra.api.config.meta.Meta;
import com.dfsek.seismic.type.sampler.Sampler;
import com.dfsek.terra.api.noise.NoiseSampler;
import com.dfsek.terra.api.world.biome.generation.BiomeProvider;
@@ -36,7 +36,7 @@ public class BiomePipelineTemplate implements ObjectTemplate<BiomeProvider> {
@Value("blend.sampler")
@Default
@Description("A sampler to use for blending the edges of biomes via domain warping.")
protected @Meta Sampler blendSampler = Sampler.zero();
protected @Meta NoiseSampler blendSampler = NoiseSampler.zero();
@Value("blend.amplitude")
@Default
@Description("The amplitude at which to perform blending.")
@@ -14,14 +14,14 @@ import com.dfsek.terra.addons.biome.pipeline.api.Source;
import com.dfsek.terra.addons.biome.pipeline.api.biome.PipelineBiome;
import com.dfsek.terra.addons.biome.pipeline.source.SamplerSource;
import com.dfsek.terra.api.config.meta.Meta;
import com.dfsek.seismic.type.sampler.Sampler;
import com.dfsek.terra.api.noise.NoiseSampler;
import com.dfsek.terra.api.util.collection.ProbabilityCollection;
public class SamplerSourceTemplate extends SourceTemplate {
@Value("sampler")
@Description("The sampler used to distribute biomes.")
private @Meta Sampler noise;
private @Meta NoiseSampler noise;
@Value("biomes")
@Description("The biomes to be distributed.")
@@ -13,11 +13,11 @@ import com.dfsek.tectonic.api.config.template.object.ObjectTemplate;
import com.dfsek.terra.addons.biome.pipeline.api.Stage;
import com.dfsek.terra.api.config.meta.Meta;
import com.dfsek.seismic.type.sampler.Sampler;
import com.dfsek.terra.api.noise.NoiseSampler;
public abstract class StageTemplate implements ObjectTemplate<Stage> {
@Value("sampler")
@Description("Sampler to use for stage distribution.")
protected @Meta Sampler noise;
protected @Meta NoiseSampler noise;
}
@@ -2,8 +2,6 @@ package com.dfsek.terra.addons.biome.pipeline.pipeline;
import java.util.List;
import com.dfsek.seismic.math.floatingpoint.FloatingPointFunctions;
import com.dfsek.terra.addons.biome.pipeline.api.BiomeChunk;
import com.dfsek.terra.addons.biome.pipeline.api.Expander;
import com.dfsek.terra.addons.biome.pipeline.api.Stage;
@@ -100,7 +98,7 @@ public class BiomeChunkImpl implements BiomeChunk {
// chunk samples points on the same overall grid.
// Without this, shared chunk borders (required because of adjacent cell reads) will not be identical
// because points would be sampled on grids at different offsets, resulting in artifacts at borders.
return FloatingPointFunctions.ceil((double) finalGridOrigin / initialGridInterval) * initialGridInterval;
return (int) Math.ceil((double) finalGridOrigin / initialGridInterval) * initialGridInterval;
}
private static int calculateFinalGridOrigin(int totalExpanderCount, List<Stage> stages) {
@@ -9,15 +9,15 @@ package com.dfsek.terra.addons.biome.pipeline.source;
import com.dfsek.terra.addons.biome.pipeline.api.Source;
import com.dfsek.terra.addons.biome.pipeline.api.biome.PipelineBiome;
import com.dfsek.seismic.type.sampler.Sampler;
import com.dfsek.terra.api.noise.NoiseSampler;
import com.dfsek.terra.api.util.collection.ProbabilityCollection;
public class SamplerSource implements Source {
private final ProbabilityCollection<PipelineBiome> biomes;
private final Sampler sampler;
private final NoiseSampler sampler;
public SamplerSource(ProbabilityCollection<PipelineBiome> biomes, Sampler sampler) {
public SamplerSource(ProbabilityCollection<PipelineBiome> biomes, NoiseSampler sampler) {
this.biomes = biomes;
this.sampler = sampler;
}
@@ -3,14 +3,14 @@ package com.dfsek.terra.addons.biome.pipeline.stage.expander;
import com.dfsek.terra.addons.biome.pipeline.api.Expander;
import com.dfsek.terra.addons.biome.pipeline.api.biome.PipelineBiome;
import com.dfsek.terra.addons.biome.pipeline.pipeline.BiomeChunkImpl;
import com.dfsek.seismic.type.sampler.Sampler;
import com.dfsek.terra.api.noise.NoiseSampler;
public class FractalExpander implements Expander {
private final Sampler sampler;
private final NoiseSampler sampler;
public FractalExpander(Sampler sampler) {
public FractalExpander(NoiseSampler sampler) {
this.sampler = sampler;
}
@@ -20,7 +20,7 @@ public class FractalExpander implements Expander {
int xMod2 = viewPoint.gridX() % 2;
int zMod2 = viewPoint.gridZ() % 2;
double roll = sampler.getSample(viewPoint.worldSeed(), viewPoint.worldX(), viewPoint.worldZ());
double roll = sampler.noise(viewPoint.worldSeed(), viewPoint.worldX(), viewPoint.worldZ());
if(xMod2 == 1 && zMod2 == 0) { // Pick one of 2 neighbors on X axis randomly
return roll > 0 ? viewPoint.getRelativeBiome(-1, 0) : viewPoint.getRelativeBiome(1, 0);
@@ -14,18 +14,17 @@ import java.util.Map;
import java.util.Set;
import java.util.function.Predicate;
import com.dfsek.seismic.type.vector.Vector2Int;
import com.dfsek.terra.addons.biome.pipeline.api.Stage;
import com.dfsek.terra.addons.biome.pipeline.api.biome.PipelineBiome;
import com.dfsek.terra.addons.biome.pipeline.pipeline.BiomeChunkImpl;
import com.dfsek.seismic.type.sampler.Sampler;
import com.dfsek.terra.api.noise.NoiseSampler;
import com.dfsek.terra.api.util.collection.ProbabilityCollection;
import com.dfsek.terra.api.util.vector.Vector2Int;
public class BorderListStage implements Stage {
private final String border;
private final Sampler Sampler;
private final NoiseSampler noiseSampler;
private final ProbabilityCollection<PipelineBiome> replaceDefault;
private final String defaultReplace;
private final Map<PipelineBiome, ProbabilityCollection<PipelineBiome>> replace;
@@ -33,9 +32,9 @@ public class BorderListStage implements Stage {
private final Vector2Int[] borderPoints;
public BorderListStage(Map<PipelineBiome, ProbabilityCollection<PipelineBiome>> replace, String border, String defaultReplace,
Sampler Sampler, ProbabilityCollection<PipelineBiome> replaceDefault) {
NoiseSampler noiseSampler, ProbabilityCollection<PipelineBiome> replaceDefault) {
this.border = border;
this.Sampler = Sampler;
this.noiseSampler = noiseSampler;
this.replaceDefault = replaceDefault;
this.defaultReplace = defaultReplace;
this.replace = replace;
@@ -68,11 +67,11 @@ public class BorderListStage implements Stage {
PipelineBiome current = viewPoint.getRelativeBiome(point.getX(), point.getZ());
if(current != null && current.getTags().contains(border)) {
if(replace.containsKey(center)) {
PipelineBiome replacement = replace.get(center).get(Sampler, viewPoint.worldX(), viewPoint.worldZ(),
PipelineBiome replacement = replace.get(center).get(noiseSampler, viewPoint.worldX(), viewPoint.worldZ(),
viewPoint.worldSeed());
return replacement.isSelf() ? center : replacement;
}
PipelineBiome replacement = replaceDefault.get(Sampler, viewPoint.worldX(), viewPoint.worldZ(),
PipelineBiome replacement = replaceDefault.get(noiseSampler, viewPoint.worldX(), viewPoint.worldZ(),
viewPoint.worldSeed());
return replacement.isSelf() ? center : replacement;
}
@@ -16,21 +16,21 @@ import java.util.function.Predicate;
import com.dfsek.terra.addons.biome.pipeline.api.Stage;
import com.dfsek.terra.addons.biome.pipeline.api.biome.PipelineBiome;
import com.dfsek.terra.addons.biome.pipeline.pipeline.BiomeChunkImpl;
import com.dfsek.seismic.type.sampler.Sampler;
import com.dfsek.terra.api.noise.NoiseSampler;
import com.dfsek.terra.api.util.collection.ProbabilityCollection;
import com.dfsek.seismic.type.vector.Vector2Int;
import com.dfsek.terra.api.util.vector.Vector2Int;
public class BorderStage implements Stage {
private final String border;
private final Sampler Sampler;
private final NoiseSampler noiseSampler;
private final ProbabilityCollection<PipelineBiome> replace;
private final String replaceTag;
private final Vector2Int[] borderPoints;
public BorderStage(String border, String replaceTag, Sampler Sampler, ProbabilityCollection<PipelineBiome> replace) {
public BorderStage(String border, String replaceTag, NoiseSampler noiseSampler, ProbabilityCollection<PipelineBiome> replace) {
this.border = border;
this.Sampler = Sampler;
this.noiseSampler = noiseSampler;
this.replace = replace;
this.replaceTag = replaceTag;
List<Vector2Int> points = new ArrayList<>();
@@ -50,7 +50,7 @@ public class BorderStage implements Stage {
for(Vector2Int point : borderPoints) {
PipelineBiome current = viewPoint.getRelativeBiome(point.getX(), point.getZ());
if(current != null && current.getTags().contains(border)) {
PipelineBiome replacement = replace.get(Sampler, viewPoint.worldX(), viewPoint.worldZ(), viewPoint.worldSeed());
PipelineBiome replacement = replace.get(noiseSampler, viewPoint.worldX(), viewPoint.worldZ(), viewPoint.worldSeed());
return replacement.isSelf() ? center : replacement;
}
}
@@ -15,18 +15,18 @@ import java.util.stream.Stream;
import com.dfsek.terra.addons.biome.pipeline.api.Stage;
import com.dfsek.terra.addons.biome.pipeline.api.biome.PipelineBiome;
import com.dfsek.terra.addons.biome.pipeline.pipeline.BiomeChunkImpl;
import com.dfsek.seismic.type.sampler.Sampler;
import com.dfsek.terra.api.noise.NoiseSampler;
import com.dfsek.terra.api.util.collection.ProbabilityCollection;
public class ReplaceListStage implements Stage {
private final Map<PipelineBiome, ProbabilityCollection<PipelineBiome>> replace;
private final Sampler sampler;
private final NoiseSampler sampler;
private final ProbabilityCollection<PipelineBiome> replaceDefault;
private final String defaultTag;
public ReplaceListStage(Map<PipelineBiome, ProbabilityCollection<PipelineBiome>> replace, String defaultTag,
ProbabilityCollection<PipelineBiome> replaceDefault, Sampler sampler) {
ProbabilityCollection<PipelineBiome> replaceDefault, NoiseSampler sampler) {
this.replace = replace;
this.sampler = sampler;
this.defaultTag = defaultTag;
@@ -14,16 +14,16 @@ import java.util.stream.Stream;
import com.dfsek.terra.addons.biome.pipeline.api.Stage;
import com.dfsek.terra.addons.biome.pipeline.api.biome.PipelineBiome;
import com.dfsek.terra.addons.biome.pipeline.pipeline.BiomeChunkImpl;
import com.dfsek.seismic.type.sampler.Sampler;
import com.dfsek.terra.api.noise.NoiseSampler;
import com.dfsek.terra.api.util.collection.ProbabilityCollection;
public class ReplaceStage implements Stage {
private final String replaceableTag;
private final ProbabilityCollection<PipelineBiome> replace;
private final Sampler sampler;
private final NoiseSampler sampler;
public ReplaceStage(String replaceable, ProbabilityCollection<PipelineBiome> replace, Sampler sampler) {
public ReplaceStage(String replaceable, ProbabilityCollection<PipelineBiome> replace, NoiseSampler sampler) {
this.replaceableTag = replaceable;
this.replace = replace;
this.sampler = sampler;
@@ -12,14 +12,14 @@ import java.util.Objects;
import com.dfsek.terra.addons.biome.pipeline.api.Stage;
import com.dfsek.terra.addons.biome.pipeline.api.biome.PipelineBiome;
import com.dfsek.terra.addons.biome.pipeline.pipeline.BiomeChunkImpl;
import com.dfsek.seismic.type.sampler.Sampler;
import com.dfsek.terra.api.noise.NoiseSampler;
public class SmoothStage implements Stage {
private final Sampler sampler;
private final NoiseSampler sampler;
public SmoothStage(Sampler sampler) {
public SmoothStage(NoiseSampler sampler) {
this.sampler = sampler;
}
@@ -30,7 +30,7 @@ public class SmoothStage implements Stage {
PipelineBiome left = viewPoint.getRelativeBiome(0, 1);
PipelineBiome right = viewPoint.getRelativeBiome(0, -1);
double roll = sampler.getSample(viewPoint.worldSeed(), viewPoint.worldX(), viewPoint.worldZ());
double roll = sampler.noise(viewPoint.worldSeed(), viewPoint.worldX(), viewPoint.worldZ());
boolean vert = Objects.equals(top, bottom);
boolean horiz = Objects.equals(left, right);
@@ -1,11 +0,0 @@
version = version("0.1.0")
dependencies {
compileOnlyApi(project(":common:addons:manifest-addon-loader"))
api("com.dfsek", "paralithic", Versions.Libraries.paralithic)
}
tasks.named<com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar>("shadowJar") {
relocate("net.jafama", "com.dfsek.terra.addons.chunkgenerator.lib.jafama")
relocate("com.dfsek.paralithic", "com.dfsek.terra.addons.chunkgenerator.lib.paralithic")
}
@@ -1,177 +0,0 @@
package com.dfsek.terra.addons.chunkgenerator;
import com.dfsek.tectonic.api.config.template.object.ObjectTemplate;
import com.dfsek.terra.addons.chunkgenerator.config.sampler.ElevationLayerSamplerTemplate;
import com.dfsek.terra.addons.chunkgenerator.layer.sampler.ElevationLayerSampler;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.function.Supplier;
import com.dfsek.terra.addons.chunkgenerator.api.LayerPalette;
import com.dfsek.terra.addons.chunkgenerator.api.LayerPredicate;
import com.dfsek.terra.addons.chunkgenerator.api.LayerResolver;
import com.dfsek.terra.addons.chunkgenerator.api.LayerSampler;
import com.dfsek.terra.addons.chunkgenerator.config.pack.LayerPalettePackConfigTemplate;
import com.dfsek.terra.addons.chunkgenerator.config.pack.LayerPredicatePackConfigTemplate;
import com.dfsek.terra.addons.chunkgenerator.config.pack.LayerResolverPackConfigTemplate;
import com.dfsek.terra.addons.chunkgenerator.config.pack.LayerSamplerPackConfigTemplate;
import com.dfsek.terra.addons.chunkgenerator.config.palette.BiomeDefinedLayerPaletteTemplate;
import com.dfsek.terra.addons.chunkgenerator.config.palette.DotProductLayerPaletteTemplate;
import com.dfsek.terra.addons.chunkgenerator.config.palette.PlatformAirLayerPaletteTemplate;
import com.dfsek.terra.addons.chunkgenerator.config.palette.SimpleLayerPaletteTemplate;
import com.dfsek.terra.addons.chunkgenerator.config.pointset.generative.AdjacentPointSetTemplate;
import com.dfsek.terra.addons.chunkgenerator.config.pointset.generative.SimplePointSetTemplate;
import com.dfsek.terra.addons.chunkgenerator.config.pointset.generative.geometric.CubePointSetTemplate;
import com.dfsek.terra.addons.chunkgenerator.config.pointset.generative.geometric.CuboidPointSetTemplate;
import com.dfsek.terra.addons.chunkgenerator.config.pointset.generative.geometric.SphericalPointSetTemplate;
import com.dfsek.terra.addons.chunkgenerator.config.pointset.operative.DifferencePointSetTemplate;
import com.dfsek.terra.addons.chunkgenerator.config.pointset.operative.ExpressionFilterPointSetTemplate;
import com.dfsek.terra.addons.chunkgenerator.config.pointset.operative.IntersectionPointSetTemplate;
import com.dfsek.terra.addons.chunkgenerator.config.pointset.operative.UnionPointSetTemplate;
import com.dfsek.terra.addons.chunkgenerator.config.predicate.BelowLayerPredicateTemplate;
import com.dfsek.terra.addons.chunkgenerator.config.predicate.RangeLayerPredicateTemplate;
import com.dfsek.terra.addons.chunkgenerator.config.predicate.SamplerLayerPredicateTemplate;
import com.dfsek.terra.addons.chunkgenerator.config.predicate.SamplerListLayerPredicateTemplate;
import com.dfsek.terra.addons.chunkgenerator.config.resolve.PaletteLayerResolverTemplate;
import com.dfsek.terra.addons.chunkgenerator.config.resolve.PredicateLayerResolverTemplate;
import com.dfsek.terra.addons.chunkgenerator.config.sampler.BiomeDefinedLayerSamplerTemplate;
import com.dfsek.terra.addons.chunkgenerator.config.sampler.DensityLayerSamplerTemplate;
import com.dfsek.terra.addons.chunkgenerator.generation.LayeredChunkGenerator;
import com.dfsek.terra.addons.chunkgenerator.layer.palette.BiomeDefinedLayerPalette;
import com.dfsek.terra.addons.chunkgenerator.layer.sampler.BiomeDefinedLayerSampler;
import com.dfsek.terra.addons.chunkgenerator.math.RelationalOperator;
import com.dfsek.terra.addons.chunkgenerator.math.pointset.PointSet;
import com.dfsek.terra.addons.chunkgenerator.util.InstanceWrapper;
import com.dfsek.terra.addons.manifest.api.AddonInitializer;
import com.dfsek.terra.api.Platform;
import com.dfsek.terra.api.addon.BaseAddon;
import com.dfsek.terra.api.event.events.config.ConfigurationLoadEvent;
import com.dfsek.terra.api.event.events.config.pack.ConfigPackPreLoadEvent;
import com.dfsek.terra.api.event.functional.FunctionalEventHandler;
import com.dfsek.terra.api.inject.annotations.Inject;
import com.dfsek.terra.api.registry.CheckedRegistry;
import com.dfsek.terra.api.util.reflection.TypeKey;
import com.dfsek.terra.api.world.chunk.generation.util.provider.ChunkGeneratorProvider;
public class LayeredChunkGeneratorAddon implements AddonInitializer {
private static final Logger logger = LoggerFactory.getLogger( LayeredChunkGeneratorAddon.class);
public static final TypeKey<Supplier<ObjectTemplate<PointSet>>> POINT_SET_TYPE_TOKEN = new TypeKey<>() {
};
public static final TypeKey<Supplier<ObjectTemplate<LayerSampler>>> LAYER_SAMPLER_TYPE_TOKEN = new TypeKey<>() {
};
public static final TypeKey<InstanceWrapper<LayerSampler>> LAYER_SAMPLER_TOKEN = new TypeKey<>() {
};
public static final TypeKey<Supplier<ObjectTemplate<LayerPalette>>> LAYER_PALETTE_TYPE_TOKEN = new TypeKey<>() {
};
public static final TypeKey<InstanceWrapper<LayerPalette>> LAYER_PALETTE_TOKEN = new TypeKey<>() {
};
public static final TypeKey<Supplier<ObjectTemplate<LayerPredicate>>> LAYER_PREDICATE_TYPE_TOKEN = new TypeKey<>() {
};
public static final TypeKey<InstanceWrapper<LayerPredicate>> LAYER_PREDICATE_TOKEN = new TypeKey<>() {
};
public static final TypeKey<Supplier<ObjectTemplate<LayerResolver>>> LAYER_RESOLVER_TYPE_TOKEN = new TypeKey<>() {
};
@Inject
private Platform platform;
@Inject
private BaseAddon addon;
@Override
public void initialize() {
platform.getEventManager()
.getHandler(FunctionalEventHandler.class)
.register(addon, ConfigPackPreLoadEvent.class)
.priority(1000)
.then(event -> {
event.getPack().applyLoader(RelationalOperator.class,
(type, o, loader, depthTracker) -> RelationalOperator.valueOf((String) o));
CheckedRegistry<Supplier<ObjectTemplate<PointSet>>> pointSetTypeRegistry = event.getPack().getOrCreateRegistry(
POINT_SET_TYPE_TOKEN);
pointSetTypeRegistry.register(addon.key("LIST"), SimplePointSetTemplate::new);
pointSetTypeRegistry.register(addon.key("ADJACENT"), AdjacentPointSetTemplate::new);
pointSetTypeRegistry.register(addon.key("SPHERE"), SphericalPointSetTemplate::new);
pointSetTypeRegistry.register(addon.key("CUBOID"), CuboidPointSetTemplate::new);
pointSetTypeRegistry.register(addon.key("CUBE"), CubePointSetTemplate::new);
pointSetTypeRegistry.register(addon.key("UNION"), UnionPointSetTemplate::new);
pointSetTypeRegistry.register(addon.key("INTERSECTION"), IntersectionPointSetTemplate::new);
pointSetTypeRegistry.register(addon.key("DIFFERENCE"), DifferencePointSetTemplate::new);
pointSetTypeRegistry.register(addon.key("EXPRESSION"), ExpressionFilterPointSetTemplate::new);
})
.then(event -> {
CheckedRegistry<Supplier<ObjectTemplate<LayerSampler>>> samplerTypeRegistry = event.getPack().getOrCreateRegistry(LAYER_SAMPLER_TYPE_TOKEN);
CheckedRegistry<InstanceWrapper<LayerSampler>> samplerRegistry = event.getPack().getOrCreateRegistry(LAYER_SAMPLER_TOKEN);
samplerTypeRegistry.register(addon.key("DENSITY"), DensityLayerSamplerTemplate::new);
samplerTypeRegistry.register(addon.key("ELEVATION"), ElevationLayerSamplerTemplate::new);
samplerTypeRegistry.register(addon.key("BIOME_DEFINED"), BiomeDefinedLayerSamplerTemplate::new);
event.loadTemplate(new LayerSamplerPackConfigTemplate()).getSamplers().forEach((key, sampler) -> {
samplerRegistry.register(addon.key(key), new InstanceWrapper<>(sampler));
});
})
.then(event -> {
CheckedRegistry<Supplier<ObjectTemplate<LayerPredicate>>> predicateTypeRegistry = event.getPack().getOrCreateRegistry(LAYER_PREDICATE_TYPE_TOKEN);
predicateTypeRegistry.register(addon.key("BELOW"), BelowLayerPredicateTemplate::new);
predicateTypeRegistry.register(addon.key("RANGE"), RangeLayerPredicateTemplate::new);
predicateTypeRegistry.register(addon.key("SAMPLER"), SamplerLayerPredicateTemplate::new);
predicateTypeRegistry.register(addon.key("SAMPLER_POINTS"), SamplerListLayerPredicateTemplate::new);
CheckedRegistry<InstanceWrapper<LayerPredicate>> predicateRegistry = event.getPack().getOrCreateRegistry(LAYER_PREDICATE_TOKEN);
event.loadTemplate(new LayerPredicatePackConfigTemplate()).getPredicates().forEach((key, predicate) -> {
predicateRegistry.register(addon.key(key), new InstanceWrapper<>(predicate));
});
})
.then(event -> {
CheckedRegistry<Supplier<ObjectTemplate<LayerPalette>>> paletteTypeRegistry = event.getPack().getOrCreateRegistry(LAYER_PALETTE_TYPE_TOKEN);
paletteTypeRegistry.register(addon.key("PALETTE"), SimpleLayerPaletteTemplate::new);
paletteTypeRegistry.register(addon.key("BIOME_DEFINED"), BiomeDefinedLayerPaletteTemplate::new);
paletteTypeRegistry.register(addon.key("AIR"), () -> new PlatformAirLayerPaletteTemplate(platform));
paletteTypeRegistry.register(addon.key("SURFACE_NORMAL"), DotProductLayerPaletteTemplate::new);
event.getPack().applyLoader(LayerPalette.Group.class, new LayerPalette.Group.Loader(event.getPack()));
CheckedRegistry<InstanceWrapper<LayerPalette>> paletteRegistry = event.getPack().getOrCreateRegistry(LAYER_PALETTE_TOKEN);
event.loadTemplate(new LayerPalettePackConfigTemplate()).getPalettes().forEach((key, palette) -> {
paletteRegistry.register(addon.key(key), new InstanceWrapper<>(palette));
});
})
.then(event -> {
CheckedRegistry<Supplier<ObjectTemplate<LayerResolver>>> resolverTypeRegistry = event.getPack().getOrCreateRegistry(LAYER_RESOLVER_TYPE_TOKEN);
resolverTypeRegistry.register(addon.key("TEST"), PredicateLayerResolverTemplate::new);
resolverTypeRegistry.register(addon.key("LAYER"), PaletteLayerResolverTemplate::new);
LayerResolver resolver = event.loadTemplate(new LayerResolverPackConfigTemplate()).getResolver();
event.getPack()
.getOrCreateRegistry(ChunkGeneratorProvider.class)
.register(addon.key("LAYERED"),
pack -> new LayeredChunkGenerator(platform, resolver));
})
.failThrough();
platform.getEventManager()
.getHandler(FunctionalEventHandler.class)
.register(addon, ConfigurationLoadEvent.class)
.priority(1000)
.then(BiomeDefinedLayerPalette.injectLayerPalettes)
.then(BiomeDefinedLayerSampler.injectLayerSamplers);
}
}
@@ -1,72 +0,0 @@
package com.dfsek.terra.addons.chunkgenerator.api;
import com.dfsek.tectonic.api.depth.DepthTracker;
import com.dfsek.tectonic.api.exception.LoadException;
import com.dfsek.tectonic.api.loader.ConfigLoader;
import com.dfsek.tectonic.api.loader.type.TypeLoader;
import org.jetbrains.annotations.NotNull;
import java.lang.reflect.AnnotatedType;
import java.util.HashMap;
import java.util.Map;
import com.dfsek.terra.api.config.ConfigPack;
import com.dfsek.terra.api.properties.Properties;
import com.dfsek.terra.api.world.biome.generation.BiomeProvider;
import com.dfsek.terra.api.world.chunk.generation.util.Palette;
import com.dfsek.terra.api.world.info.WorldProperties;
public abstract class LayerPalette {
private final Group group;
private final boolean resetsGroup;
protected LayerPalette(Group group, boolean resetsGroup) {
this.group = group;
this.resetsGroup = resetsGroup;
}
public abstract Palette get(int x, int y, int z, WorldProperties world, BiomeProvider biomeProvider);
public final Group getGroup() {
return group;
}
public final boolean resetsGroup() {
return resetsGroup;
}
public static class Group {
public static Group NO_GROUP = new Group();
private Group() {}
public static Group get(String string, ConfigPack pack) {
if (!pack.getContext().has(Holder.class)) {
pack.getContext().put(new Holder(new HashMap<>()));
}
return pack.getContext().get(Holder.class).groups.computeIfAbsent(string, s -> new Group());
}
private record Holder(Map<String, Group> groups) implements Properties {}
public static class Loader implements TypeLoader<Group> {
private final ConfigPack pack;
public Loader(ConfigPack pack) {
this.pack = pack;
}
@Override
public Group load(@NotNull AnnotatedType annotatedType, @NotNull Object o, @NotNull ConfigLoader configLoader,
DepthTracker depthTracker) throws LoadException {
String groupName = (String) o;
return Group.get(groupName, pack);
}
}
}
}
@@ -1,9 +0,0 @@
package com.dfsek.terra.addons.chunkgenerator.api;
import com.dfsek.terra.api.world.biome.generation.BiomeProvider;
import com.dfsek.terra.api.world.info.WorldProperties;
public interface LayerPredicate {
boolean test(int x, int y, int z, WorldProperties worldProperties, BiomeProvider biomeProvider);
}
@@ -1,9 +0,0 @@
package com.dfsek.terra.addons.chunkgenerator.api;
import com.dfsek.terra.api.world.biome.generation.BiomeProvider;
import com.dfsek.terra.api.world.info.WorldProperties;
public interface LayerResolver {
LayerPalette resolve(int x, int y, int z, WorldProperties world, BiomeProvider biomeProvider);
}
@@ -1,12 +0,0 @@
package com.dfsek.terra.addons.chunkgenerator.api;
import com.dfsek.terra.addons.chunkgenerator.api.chunk.ChunkLayerSampler;
import com.dfsek.terra.api.world.biome.generation.BiomeProvider;
import com.dfsek.terra.api.world.info.WorldProperties;
public interface LayerSampler {
double sample(int x, int y, int z, WorldProperties world, BiomeProvider biomeProvider);
ChunkLayerSampler getChunk(int chunkX, int chunkZ, WorldProperties world, BiomeProvider biomeProvider);
double getBlendWeight();
}
@@ -1,9 +0,0 @@
package com.dfsek.terra.addons.chunkgenerator.api.chunk;
import com.dfsek.terra.api.world.biome.generation.BiomeProvider;
import com.dfsek.terra.api.world.info.WorldProperties;
public interface ChunkLayerSampler {
double sample(int fmX, int y, int fmZ);
}
@@ -1,21 +0,0 @@
package com.dfsek.terra.addons.chunkgenerator.config.pack;
import com.dfsek.tectonic.api.config.template.ConfigTemplate;
import com.dfsek.tectonic.api.config.template.annotations.Value;
import java.util.Map;
import com.dfsek.terra.addons.chunkgenerator.api.LayerPalette;
import com.dfsek.terra.api.config.meta.Meta;
public class LayerPalettePackConfigTemplate implements ConfigTemplate {
@Value("generation.layers")
private @Meta Map<String, LayerPalette> palettes;
public Map<String, LayerPalette> getPalettes() {
return palettes;
}
}
@@ -1,24 +0,0 @@
package com.dfsek.terra.addons.chunkgenerator.config.pack;
import com.dfsek.tectonic.api.config.template.ConfigTemplate;
import com.dfsek.tectonic.api.config.template.annotations.Default;
import com.dfsek.tectonic.api.config.template.annotations.Value;
import java.util.LinkedHashMap;
import java.util.Map;
import com.dfsek.terra.addons.chunkgenerator.api.LayerPredicate;
import com.dfsek.terra.api.config.meta.Meta;
public class LayerPredicatePackConfigTemplate implements ConfigTemplate {
@Value("generation.tests")
@Default
private @Meta Map<String, LayerPredicate> predicates = new LinkedHashMap<>();
public Map<String, LayerPredicate> getPredicates() {
return predicates;
}
}
@@ -1,18 +0,0 @@
package com.dfsek.terra.addons.chunkgenerator.config.pack;
import com.dfsek.tectonic.api.config.template.ConfigTemplate;
import com.dfsek.tectonic.api.config.template.annotations.Value;
import com.dfsek.terra.addons.chunkgenerator.api.LayerResolver;
import com.dfsek.terra.api.config.meta.Meta;
public class LayerResolverPackConfigTemplate implements ConfigTemplate {
@Value("generation.resolver")
private @Meta LayerResolver resolver;
public LayerResolver getResolver() {
return resolver;
}
}
@@ -1,21 +0,0 @@
package com.dfsek.terra.addons.chunkgenerator.config.pack;
import com.dfsek.tectonic.api.config.template.ConfigTemplate;
import com.dfsek.tectonic.api.config.template.annotations.Value;
import java.util.Map;
import com.dfsek.terra.addons.chunkgenerator.api.LayerSampler;
import com.dfsek.terra.api.config.meta.Meta;
public class LayerSamplerPackConfigTemplate implements ConfigTemplate {
@Value("generation.samplers")
private @Meta Map<String, LayerSampler> samplers;
public Map<String, LayerSampler> getSamplers() {
return samplers;
}
}
@@ -1,21 +0,0 @@
package com.dfsek.terra.addons.chunkgenerator.config.palette;
import com.dfsek.tectonic.api.config.template.annotations.Default;
import com.dfsek.tectonic.api.config.template.annotations.Value;
import com.dfsek.terra.addons.chunkgenerator.api.LayerPalette;
import com.dfsek.terra.addons.chunkgenerator.layer.palette.BiomeDefinedLayerPalette;
import com.dfsek.terra.api.world.chunk.generation.util.Palette;
public class BiomeDefinedLayerPaletteTemplate extends LayerPaletteTemplate {
@Value("default")
@Default
private Palette defaultPalette = null;
@Override
public LayerPalette get() {
return new BiomeDefinedLayerPalette(group, resetsGroup, defaultPalette);
}
}
@@ -1,44 +0,0 @@
package com.dfsek.terra.addons.chunkgenerator.config.palette;
import com.dfsek.tectonic.api.config.template.annotations.Default;
import com.dfsek.tectonic.api.config.template.annotations.Value;
import java.util.HashMap;
import java.util.Map;
import com.dfsek.terra.addons.chunkgenerator.api.LayerPalette;
import com.dfsek.terra.addons.chunkgenerator.api.LayerSampler;
import com.dfsek.terra.addons.chunkgenerator.layer.palette.DotProductLayerPalette;
import com.dfsek.terra.addons.chunkgenerator.math.pointset.generative.AdjacentPointSet;
import com.dfsek.terra.addons.chunkgenerator.palette.DoubleNavigableHolder;
import com.dfsek.terra.addons.chunkgenerator.util.InstanceWrapper;
import com.dfsek.terra.addons.chunkgenerator.math.pointset.PointSet;
import com.dfsek.seismic.type.vector.Vector3;
import com.dfsek.terra.api.world.chunk.generation.util.Palette;
public class DotProductLayerPaletteTemplate extends LayerPaletteTemplate {
@Value("normal.approximation-points")
@Default
private PointSet normalApproximationPoints = new AdjacentPointSet();
@Value("normal.direction")
@Default
private Vector3 direction = Vector3.of(0, 1, 0);
@Value("normal.sampler")
private InstanceWrapper<LayerSampler> sampler;
@Value("palettes")
private Map<String, Palette> palettes;
@Override
public LayerPalette get() {
Map<Double, Palette> paletteMap = new HashMap<>();
palettes.forEach((s, p) -> {
paletteMap.put(Double.parseDouble(s), p);
});
return new DotProductLayerPalette(group, resetsGroup, normalApproximationPoints, new DoubleNavigableHolder<>(paletteMap), sampler.get(), direction);
}
}
@@ -1,21 +0,0 @@
package com.dfsek.terra.addons.chunkgenerator.config.palette;
import com.dfsek.tectonic.api.config.template.annotations.Default;
import com.dfsek.tectonic.api.config.template.annotations.Value;
import com.dfsek.tectonic.api.config.template.object.ObjectTemplate;
import com.dfsek.terra.addons.chunkgenerator.api.LayerPalette;
public abstract class LayerPaletteTemplate implements ObjectTemplate<LayerPalette> {
@Value("group")
@Default
protected LayerPalette.Group group = LayerPalette.Group.NO_GROUP;
@Value("resets-group")
@Default
protected boolean resetsGroup = false;
}
@@ -1,22 +0,0 @@
package com.dfsek.terra.addons.chunkgenerator.config.palette;
import com.dfsek.terra.addons.chunkgenerator.api.LayerPalette;
import com.dfsek.terra.addons.chunkgenerator.layer.palette.SimpleLayerPalette;
import com.dfsek.terra.addons.chunkgenerator.palette.SingletonPalette;
import com.dfsek.terra.api.Platform;
import com.dfsek.terra.api.block.state.BlockState;
public class PlatformAirLayerPaletteTemplate extends LayerPaletteTemplate {
private BlockState air;
public PlatformAirLayerPaletteTemplate(Platform platform) {
this.air = platform.getWorldHandle().air();
}
@Override
public LayerPalette get() {
return new SimpleLayerPalette(group, resetsGroup, new SingletonPalette(air));
}
}
@@ -1,19 +0,0 @@
package com.dfsek.terra.addons.chunkgenerator.config.palette;
import com.dfsek.tectonic.api.config.template.annotations.Value;
import com.dfsek.terra.addons.chunkgenerator.api.LayerPalette;
import com.dfsek.terra.addons.chunkgenerator.layer.palette.SimpleLayerPalette;
import com.dfsek.terra.api.world.chunk.generation.util.Palette;
public class SimpleLayerPaletteTemplate extends LayerPaletteTemplate {
@Value("palette")
private Palette palette;
@Override
public LayerPalette get() {
return new SimpleLayerPalette(group, resetsGroup, palette);
}
}
@@ -1,15 +0,0 @@
package com.dfsek.terra.addons.chunkgenerator.config.pointset.generative;
import com.dfsek.tectonic.api.config.template.object.ObjectTemplate;
import com.dfsek.terra.addons.chunkgenerator.math.pointset.PointSet;
import com.dfsek.terra.addons.chunkgenerator.math.pointset.generative.AdjacentPointSet;
public class AdjacentPointSetTemplate implements ObjectTemplate<PointSet> {
@Override
public PointSet get() {
return new AdjacentPointSet();
}
}
@@ -1,22 +0,0 @@
package com.dfsek.terra.addons.chunkgenerator.config.pointset.generative;
import com.dfsek.tectonic.api.config.template.annotations.Value;
import com.dfsek.tectonic.api.config.template.object.ObjectTemplate;
import java.util.Set;
import com.dfsek.terra.addons.chunkgenerator.math.pointset.PointSet;
import com.dfsek.terra.addons.chunkgenerator.math.pointset.generative.SimplePointSet;
import com.dfsek.seismic.type.vector.Vector3Int;
public class SimplePointSetTemplate implements ObjectTemplate<PointSet> {
@Value("points")
private Set<Vector3Int> list;
@Override
public PointSet get() {
return new SimplePointSet(list);
}
}
@@ -1,19 +0,0 @@
package com.dfsek.terra.addons.chunkgenerator.config.pointset.generative.geometric;
import com.dfsek.tectonic.api.config.template.annotations.Value;
import com.dfsek.tectonic.api.config.template.object.ObjectTemplate;
import com.dfsek.terra.addons.chunkgenerator.math.pointset.PointSet;
import com.dfsek.terra.addons.chunkgenerator.math.pointset.generative.geometric.CuboidPointSet;
public class CubePointSetTemplate implements ObjectTemplate<PointSet> {
@Value("size")
private int size;
@Override
public PointSet get() {
return new CuboidPointSet(-size, -size, -size, size, size, size);
}
}
@@ -1,25 +0,0 @@
package com.dfsek.terra.addons.chunkgenerator.config.pointset.generative.geometric;
import com.dfsek.tectonic.api.config.template.annotations.Value;
import com.dfsek.tectonic.api.config.template.object.ObjectTemplate;
import com.dfsek.terra.addons.chunkgenerator.math.pointset.PointSet;
import com.dfsek.terra.addons.chunkgenerator.math.pointset.generative.geometric.CuboidPointSet;
public class CuboidPointSetTemplate implements ObjectTemplate<PointSet> {
@Value("size.x")
private int xSize;
@Value("size.y")
private int ySize;
@Value("size.z")
private int zSize;
@Override
public PointSet get() {
return new CuboidPointSet(-xSize, -ySize, -zSize, xSize, ySize, zSize);
}
}
@@ -1,19 +0,0 @@
package com.dfsek.terra.addons.chunkgenerator.config.pointset.generative.geometric;
import com.dfsek.tectonic.api.config.template.annotations.Value;
import com.dfsek.tectonic.api.config.template.object.ObjectTemplate;
import com.dfsek.terra.addons.chunkgenerator.math.pointset.PointSet;
import com.dfsek.terra.addons.chunkgenerator.math.pointset.generative.geometric.SphericalPointSet;
public class SphericalPointSetTemplate implements ObjectTemplate<PointSet> {
@Value("radius")
private double radius;
@Override
public PointSet get() {
return new SphericalPointSet(radius);
}
}
@@ -1,21 +0,0 @@
package com.dfsek.terra.addons.chunkgenerator.config.pointset.operative;
import com.dfsek.tectonic.api.config.template.annotations.Value;
import com.dfsek.tectonic.api.config.template.object.ObjectTemplate;
import java.util.List;
import com.dfsek.terra.addons.chunkgenerator.math.pointset.PointSet;
import com.dfsek.terra.addons.chunkgenerator.math.pointset.operative.DifferencePointSet;
public class DifferencePointSetTemplate implements ObjectTemplate<PointSet> {
@Value("point-sets")
private List<PointSet> set;
@Override
public PointSet get() {
return new DifferencePointSet(set);
}
}
@@ -1,27 +0,0 @@
package com.dfsek.terra.addons.chunkgenerator.config.pointset.operative;
import com.dfsek.paralithic.eval.tokenizer.ParseException;
import com.dfsek.tectonic.api.config.template.annotations.Value;
import com.dfsek.tectonic.api.config.template.object.ObjectTemplate;
import com.dfsek.terra.addons.chunkgenerator.math.pointset.PointSet;
import com.dfsek.terra.addons.chunkgenerator.math.pointset.operative.ExpressionFilterPointSet;
public class ExpressionFilterPointSetTemplate implements ObjectTemplate<PointSet> {
@Value("point-set")
private PointSet set;
@Value("expression")
private String expression;
@Override
public PointSet get() {
try {
return new ExpressionFilterPointSet(set, expression);
} catch(ParseException e) {
throw new RuntimeException("Failed to parse expression.", e);
}
}
}
@@ -1,21 +0,0 @@
package com.dfsek.terra.addons.chunkgenerator.config.pointset.operative;
import com.dfsek.tectonic.api.config.template.annotations.Value;
import com.dfsek.tectonic.api.config.template.object.ObjectTemplate;
import java.util.List;
import com.dfsek.terra.addons.chunkgenerator.math.pointset.PointSet;
import com.dfsek.terra.addons.chunkgenerator.math.pointset.operative.IntersectionPointSet;
public class IntersectionPointSetTemplate implements ObjectTemplate<PointSet> {
@Value("point-sets")
private List<PointSet> sets;
@Override
public PointSet get() {
return new IntersectionPointSet(sets);
}
}
@@ -1,21 +0,0 @@
package com.dfsek.terra.addons.chunkgenerator.config.pointset.operative;
import com.dfsek.tectonic.api.config.template.annotations.Value;
import com.dfsek.tectonic.api.config.template.object.ObjectTemplate;
import java.util.List;
import com.dfsek.terra.addons.chunkgenerator.math.pointset.PointSet;
import com.dfsek.terra.addons.chunkgenerator.math.pointset.operative.UnionPointSet;
public class UnionPointSetTemplate implements ObjectTemplate<PointSet> {
@Value("point-sets")
private List<PointSet> sets;
@Override
public PointSet get() {
return new UnionPointSet(sets);
}
}
@@ -1,20 +0,0 @@
package com.dfsek.terra.addons.chunkgenerator.config.predicate;
import com.dfsek.tectonic.api.config.template.annotations.Value;
import com.dfsek.tectonic.api.config.template.object.ObjectTemplate;
import com.dfsek.terra.addons.chunkgenerator.layer.predicate.BelowLayerPredicate;
import com.dfsek.terra.addons.chunkgenerator.api.LayerPredicate;
import com.dfsek.terra.api.config.meta.Meta;
public class BelowLayerPredicateTemplate implements ObjectTemplate<LayerPredicate> {
@Value("y")
private @Meta int y;
@Override
public LayerPredicate get() {
return new BelowLayerPredicate(y);
}
}
@@ -1,20 +0,0 @@
package com.dfsek.terra.addons.chunkgenerator.config.predicate;
import com.dfsek.tectonic.api.config.template.annotations.Value;
import com.dfsek.tectonic.api.config.template.object.ObjectTemplate;
import com.dfsek.terra.addons.chunkgenerator.api.LayerPredicate;
import com.dfsek.terra.addons.chunkgenerator.layer.predicate.RangeLayerPredicate;
import com.dfsek.terra.api.util.range.Range;
public class RangeLayerPredicateTemplate implements ObjectTemplate<LayerPredicate> {
@Value("range")
private Range range;
@Override
public LayerPredicate get() {
return new RangeLayerPredicate(range);
}
}
@@ -1,32 +0,0 @@
package com.dfsek.terra.addons.chunkgenerator.config.predicate;
import com.dfsek.tectonic.api.config.template.annotations.Default;
import com.dfsek.tectonic.api.config.template.annotations.Value;
import com.dfsek.tectonic.api.config.template.object.ObjectTemplate;
import com.dfsek.terra.addons.chunkgenerator.api.LayerPredicate;
import com.dfsek.terra.addons.chunkgenerator.api.LayerSampler;
import com.dfsek.terra.addons.chunkgenerator.layer.predicate.SamplerLayerPredicate;
import com.dfsek.terra.addons.chunkgenerator.math.RelationalOperator;
import com.dfsek.terra.addons.chunkgenerator.util.InstanceWrapper;
import com.dfsek.terra.api.config.meta.Meta;
public class SamplerLayerPredicateTemplate implements ObjectTemplate<LayerPredicate> {
@Value("sampler")
private @Meta InstanceWrapper<LayerSampler> sampler;
@Value("threshold")
@Default
private double threshold = 0;
@Value("operator")
@Default
private RelationalOperator operator = RelationalOperator.GreaterThan;
@Override
public LayerPredicate get() {
return new SamplerLayerPredicate(sampler.get(), operator, threshold);
}
}
@@ -1,36 +0,0 @@
package com.dfsek.terra.addons.chunkgenerator.config.predicate;
import com.dfsek.tectonic.api.config.template.annotations.Default;
import com.dfsek.tectonic.api.config.template.annotations.Value;
import com.dfsek.tectonic.api.config.template.object.ObjectTemplate;
import com.dfsek.terra.addons.chunkgenerator.api.LayerPredicate;
import com.dfsek.terra.addons.chunkgenerator.api.LayerSampler;
import com.dfsek.terra.addons.chunkgenerator.math.RelationalOperator;
import com.dfsek.terra.addons.chunkgenerator.layer.predicate.SamplerListLayerPredicate;
import com.dfsek.terra.addons.chunkgenerator.util.InstanceWrapper;
import com.dfsek.terra.addons.chunkgenerator.math.pointset.PointSet;
import com.dfsek.terra.api.config.meta.Meta;
public class SamplerListLayerPredicateTemplate implements ObjectTemplate<LayerPredicate> {
@Value("sampler")
private @Meta InstanceWrapper<LayerSampler> sampler;
@Value("point-set")
private PointSet points;
@Value("threshold")
@Default
private double defaultThreshold = 0;
@Value("operator")
@Default
private RelationalOperator defaultOperator = RelationalOperator.GreaterThan;
@Override
public LayerPredicate get() {
return new SamplerListLayerPredicate(sampler.get(), defaultThreshold, defaultOperator, points);
}
}
@@ -1,21 +0,0 @@
package com.dfsek.terra.addons.chunkgenerator.config.resolve;
import com.dfsek.tectonic.api.config.template.annotations.Value;
import com.dfsek.tectonic.api.config.template.object.ObjectTemplate;
import com.dfsek.terra.addons.chunkgenerator.api.LayerPalette;
import com.dfsek.terra.addons.chunkgenerator.api.LayerResolver;
import com.dfsek.terra.addons.chunkgenerator.layer.resolve.PaletteLayerResolver;
import com.dfsek.terra.addons.chunkgenerator.util.InstanceWrapper;
public class PaletteLayerResolverTemplate implements ObjectTemplate<LayerResolver> {
@Value("layer")
private InstanceWrapper<LayerPalette> palette;
@Override
public LayerResolver get() {
return new PaletteLayerResolver(palette.get());
}
}
@@ -1,28 +0,0 @@
package com.dfsek.terra.addons.chunkgenerator.config.resolve;
import com.dfsek.tectonic.api.config.template.annotations.Value;
import com.dfsek.tectonic.api.config.template.object.ObjectTemplate;
import com.dfsek.terra.addons.chunkgenerator.api.LayerPredicate;
import com.dfsek.terra.addons.chunkgenerator.api.LayerResolver;
import com.dfsek.terra.addons.chunkgenerator.layer.resolve.PredicateLayerResolver;
import com.dfsek.terra.addons.chunkgenerator.util.InstanceWrapper;
import com.dfsek.terra.api.config.meta.Meta;
public class PredicateLayerResolverTemplate implements ObjectTemplate<LayerResolver> {
@Value("if")
private @Meta InstanceWrapper<LayerPredicate> predicate;
@Value("then")
private @Meta LayerResolver trueResolver;
@Value("else")
private @Meta LayerResolver falseResolver;
@Override
public PredicateLayerResolver get() {
return new PredicateLayerResolver(predicate.get(), trueResolver, falseResolver);
}
}
@@ -1,23 +0,0 @@
package com.dfsek.terra.addons.chunkgenerator.config.sampler;
import com.dfsek.tectonic.api.config.template.annotations.Default;
import com.dfsek.tectonic.api.config.template.annotations.Value;
import com.dfsek.tectonic.api.config.template.object.ObjectTemplate;
import com.dfsek.terra.addons.chunkgenerator.api.LayerSampler;
import com.dfsek.terra.addons.chunkgenerator.layer.sampler.BiomeDefinedLayerSampler;
import com.dfsek.terra.api.config.meta.Meta;
import com.dfsek.seismic.type.sampler.Sampler;
public class BiomeDefinedLayerSamplerTemplate extends LayerSamplerTemplate {
@Value("default")
@Default
private @Meta Sampler defaultSampler = null;
@Override
public LayerSampler get() {
return new BiomeDefinedLayerSampler(defaultSampler, blend);
}
}
@@ -1,20 +0,0 @@
package com.dfsek.terra.addons.chunkgenerator.config.sampler;
import com.dfsek.tectonic.api.config.template.annotations.Value;
import com.dfsek.terra.addons.chunkgenerator.api.LayerSampler;
import com.dfsek.terra.addons.chunkgenerator.layer.sampler.DensityLayerSampler;
import com.dfsek.terra.api.config.meta.Meta;
import com.dfsek.seismic.type.sampler.Sampler;
public class DensityLayerSamplerTemplate extends LayerSamplerTemplate {
@Value("sampler")
private @Meta Sampler sampler;
@Override
public LayerSampler get() {
return new DensityLayerSampler(sampler, blend);
}
}
@@ -1,21 +0,0 @@
package com.dfsek.terra.addons.chunkgenerator.config.sampler;
import com.dfsek.seismic.type.sampler.Sampler;
import com.dfsek.tectonic.api.config.template.annotations.Value;
import com.dfsek.terra.addons.chunkgenerator.api.LayerSampler;
import com.dfsek.terra.addons.chunkgenerator.layer.sampler.DensityLayerSampler;
import com.dfsek.terra.addons.chunkgenerator.layer.sampler.ElevationLayerSampler;
import com.dfsek.terra.api.config.meta.Meta;
public class ElevationLayerSamplerTemplate extends LayerSamplerTemplate {
@Value("sampler")
private @Meta Sampler sampler;
@Override
public LayerSampler get() {
return new ElevationLayerSampler(sampler, blend);
}
}
@@ -1,15 +0,0 @@
package com.dfsek.terra.addons.chunkgenerator.config.sampler;
import com.dfsek.tectonic.api.config.template.annotations.Default;
import com.dfsek.tectonic.api.config.template.annotations.Value;
import com.dfsek.tectonic.api.config.template.object.ObjectTemplate;
import com.dfsek.terra.addons.chunkgenerator.api.LayerSampler;
import com.dfsek.terra.addons.chunkgenerator.layer.sampler.blend.BlendProperties;
import com.dfsek.terra.api.config.meta.Meta;
public abstract class LayerSamplerTemplate implements ObjectTemplate<LayerSampler> {
@Value("blend")
protected @Meta BlendProperties blend;
}
@@ -1,33 +0,0 @@
package com.dfsek.terra.addons.chunkgenerator.config.sampler.blend;
import com.dfsek.seismic.type.sampler.DerivativeSampler;
import com.dfsek.tectonic.api.config.template.ValidatedConfigTemplate;
import com.dfsek.tectonic.api.config.template.annotations.Default;
import com.dfsek.tectonic.api.config.template.annotations.Value;
import com.dfsek.tectonic.api.config.template.object.ObjectTemplate;
import com.dfsek.tectonic.api.exception.ValidationException;
import com.dfsek.terra.addons.chunkgenerator.layer.sampler.blend.BlendProperties;
import com.dfsek.terra.api.config.meta.Meta;
public class BlendPropertiesConfig implements ValidatedConfigTemplate, ObjectTemplate<BlendProperties> {
@Value("density")
@Default
private @Meta int density = 3;
@Value("weight")
@Default
private @Meta double weight = 1;
@Override
public boolean validate() throws ValidationException {
return density > 1 && weight > 1 && density % 18 == 0;
}
@Override
public BlendProperties get() {
return BlendProperties.of(density, weight);
}
}
@@ -1,90 +0,0 @@
package com.dfsek.terra.addons.chunkgenerator.generation;
import org.jetbrains.annotations.NotNull;
import com.dfsek.terra.addons.chunkgenerator.api.LayerPalette;
import com.dfsek.terra.addons.chunkgenerator.api.LayerResolver;
import com.dfsek.terra.api.Platform;
import com.dfsek.terra.api.block.state.BlockState;
import com.dfsek.terra.api.util.Column;
import com.dfsek.terra.api.world.biome.Biome;
import com.dfsek.terra.api.world.biome.generation.BiomeProvider;
import com.dfsek.terra.api.world.chunk.generation.ChunkGenerator;
import com.dfsek.terra.api.world.chunk.generation.ProtoChunk;
import com.dfsek.terra.api.world.chunk.generation.util.Palette;
import com.dfsek.terra.api.world.info.WorldProperties;
public class LayeredChunkGenerator implements ChunkGenerator {
private final Platform platform;
private final LayerResolver resolver;
public LayeredChunkGenerator(Platform platform, LayerResolver resolver) {
this.platform = platform;
this.resolver = resolver;
}
@Override
public void generateChunkData(@NotNull ProtoChunk chunk, @NotNull WorldProperties world, @NotNull BiomeProvider biomeProvider,
int chunkX, int chunkZ) {
platform.getProfiler().push("chunk_base_layered");
int xOrig = (chunkX << 4);
int zOrig = (chunkZ << 4);
long seed = world.getSeed();
for(int x = 0; x < 16; x++) {
for(int z = 0; z < 16; z++) {
int cx = xOrig + x;
int cz = zOrig + z;
int paletteLevel = 0;
LayerPalette previousLayerPalette = null;
Column<Biome> biomeColumn = biomeProvider.getColumn(cx, cz, world);
for(int y = world.getMaxHeight() - 1; y >= world.getMinHeight(); y--) {
Biome biome = biomeColumn.get(y);
LayerPalette layerPalette = resolver.resolve(cx, y, cz, world, biomeProvider);
if (previousLayerPalette == layerPalette) {
paletteLevel++;
} else if (layerPalette.resetsGroup()) {
paletteLevel = 0;
} else if (previousLayerPalette != null && layerPalette.getGroup() == previousLayerPalette.getGroup()) {
paletteLevel++;
} else {
paletteLevel = 0;
}
previousLayerPalette = layerPalette;
chunk.setBlock(cx, y, cz, layerPalette.get(cx, y, cz, world, biomeProvider)
.get(paletteLevel, cx, y, cz, seed));
}
}
}
platform.getProfiler().pop("chunk_base_layered");
}
@Override
public BlockState getBlock(WorldProperties world, int x, int y, int z, BiomeProvider biomeProvider) {
long seed = world.getSeed();
Biome biome = biomeProvider.getBiome(x, y, z, seed);
int layer = 0; // Default to layer 0 for now
return resolver.resolve(x, y, z, world, biomeProvider)
.get(x, y, z, world, biomeProvider)
.get(layer, x, y, z, seed);
}
@Override
public Palette getPalette(int x, int y, int z, WorldProperties world, BiomeProvider biomeProvider) {
long seed = world.getSeed();
Biome biome = biomeProvider.getBiome(x, y, z, seed);
return resolver.resolve(x, y, z, world, biomeProvider)
.get(x, y, z, world, biomeProvider);
}
}
@@ -1,70 +0,0 @@
package com.dfsek.terra.addons.chunkgenerator.layer.palette;
import com.dfsek.tectonic.api.config.template.dynamic.DynamicTemplate;
import com.dfsek.tectonic.api.config.template.dynamic.DynamicValue;
import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Optional;
import java.util.function.Consumer;
import java.util.stream.Collectors;
import com.dfsek.terra.addons.chunkgenerator.LayeredChunkGeneratorAddon;
import com.dfsek.terra.addons.chunkgenerator.api.LayerPalette;
import com.dfsek.terra.api.event.events.config.ConfigurationLoadEvent;
import com.dfsek.terra.api.properties.Properties;
import com.dfsek.terra.api.world.biome.Biome;
import com.dfsek.terra.api.world.biome.generation.BiomeProvider;
import com.dfsek.terra.api.world.chunk.generation.util.Palette;
import com.dfsek.terra.api.world.info.WorldProperties;
public class BiomeDefinedLayerPalette extends LayerPalette {
private final Palette defaultPalette;
public BiomeDefinedLayerPalette(Group group, boolean resetsGroup, Palette defaultPalette) {
super(group, resetsGroup);
this.defaultPalette = defaultPalette;
}
@Override
public Palette get(int x, int y, int z, WorldProperties worldProperties, BiomeProvider biomeProvider) {
return biomeProvider.getBiome(x, y, z, worldProperties.getSeed()).getContext().get(BiomeLayerPalettes.class).palettes().get(this);
}
public Optional<Palette> getDefaultPalette() {
return Optional.ofNullable(defaultPalette);
}
public static Consumer<ConfigurationLoadEvent> injectLayerPalettes = event -> {
if(event.is(Biome.class)) {
Map<BiomeDefinedLayerPalette, String> paletteFields = new HashMap<>();
DynamicTemplate.Builder templateBuilder = DynamicTemplate.builder();
event.getPack().getRegistry(LayeredChunkGeneratorAddon.LAYER_PALETTE_TOKEN).forEach((registryKey, registryEntry) -> {
LayerPalette layerPalette = registryEntry.get();
// Add template value for each BiomeDefinedLayerPalette
if (layerPalette instanceof BiomeDefinedLayerPalette biomeLayerPalette) {
String id = registryKey.getID();
String fieldName = id + "LayerPalette";
paletteFields.put(biomeLayerPalette, fieldName);
DynamicValue.Builder<Palette> value = DynamicValue.builder("generation.layers." + id, Palette.class);
biomeLayerPalette.getDefaultPalette().ifPresent(value::setDefault);
templateBuilder.value(fieldName, value.build());
}
});
DynamicTemplate layerPaletteBiomeTemplate = event.load(templateBuilder.build());
Map<BiomeDefinedLayerPalette, Palette> paletteMap = paletteFields.entrySet().stream().collect(
Collectors.toMap(Entry::getKey, entry -> layerPaletteBiomeTemplate.get(entry.getValue(), Palette.class)));
event.getLoadedObject(Biome.class).getContext().put(new BiomeLayerPalettes(paletteMap));
}
};
public record BiomeLayerPalettes(Map<BiomeDefinedLayerPalette, Palette> palettes) implements Properties {
}
}
@@ -1,43 +0,0 @@
package com.dfsek.terra.addons.chunkgenerator.layer.palette;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.dfsek.terra.addons.chunkgenerator.api.LayerPalette;
import com.dfsek.terra.addons.chunkgenerator.api.LayerSampler;
import com.dfsek.terra.addons.chunkgenerator.math.pointset.PointSet;
import com.dfsek.terra.addons.chunkgenerator.palette.DoubleNavigableHolder;
import com.dfsek.seismic.type.vector.Vector3;
import com.dfsek.seismic.type.vector.Vector3Int;
import com.dfsek.terra.api.world.biome.generation.BiomeProvider;
import com.dfsek.terra.api.world.chunk.generation.util.Palette;
import com.dfsek.terra.api.world.info.WorldProperties;
public class DotProductLayerPalette extends LayerPalette {
private static final Logger logger = LoggerFactory.getLogger(DotProductLayerPalette.class);
private final DoubleNavigableHolder<Palette> palettes;
private final Vector3Int[] samplePoints;
private final LayerSampler sampler;
private final Vector3 direction;
public DotProductLayerPalette(Group group, boolean resetsGroup,
PointSet points, DoubleNavigableHolder<Palette> palettes, LayerSampler sampler, Vector3 direction) {
super(group, resetsGroup);
this.palettes = palettes;
this.sampler = sampler;
this.direction = direction;
this.samplePoints = points.toArray();
}
@Override
public Palette get(int x, int y, int z, WorldProperties world, BiomeProvider biomeProvider) {
Vector3.Mutable surfaceNormalApproximation = Vector3.Mutable.of(0, 0, 0);
for(Vector3Int point : samplePoints) {
double scalar = -sampler.sample(x+point.getX(), y+point.getY(), z+point.getZ(), world, biomeProvider);
surfaceNormalApproximation.add(point.toFloat().mutable().mulScalar(scalar));
}
return palettes.get(direction.dot(surfaceNormalApproximation.normalize()));
}
}
@@ -1,22 +0,0 @@
package com.dfsek.terra.addons.chunkgenerator.layer.palette;
import com.dfsek.terra.addons.chunkgenerator.api.LayerPalette;
import com.dfsek.terra.api.world.biome.generation.BiomeProvider;
import com.dfsek.terra.api.world.chunk.generation.util.Palette;
import com.dfsek.terra.api.world.info.WorldProperties;
public class SimpleLayerPalette extends LayerPalette {
private final Palette palette;
public SimpleLayerPalette(Group group, boolean resetsGroup, Palette palette) {
super(group, resetsGroup);
this.palette = palette;
}
@Override
public Palette get(int x, int y, int z, WorldProperties world, BiomeProvider biomeProvider) {
return palette;
}
}
@@ -1,20 +0,0 @@
package com.dfsek.terra.addons.chunkgenerator.layer.predicate;
import com.dfsek.terra.addons.chunkgenerator.api.LayerPredicate;
import com.dfsek.terra.api.world.biome.generation.BiomeProvider;
import com.dfsek.terra.api.world.info.WorldProperties;
public class BelowLayerPredicate implements LayerPredicate {
private final int y;
public BelowLayerPredicate(int y) {
this.y = y;
}
@Override
public boolean test(int x, int y, int z, WorldProperties worldProperties, BiomeProvider biomeProvider) {
return y < this.y;
}
}
@@ -1,20 +0,0 @@
package com.dfsek.terra.addons.chunkgenerator.layer.predicate;
import com.dfsek.terra.addons.chunkgenerator.api.LayerPredicate;
import com.dfsek.terra.api.util.range.Range;
import com.dfsek.terra.api.world.biome.generation.BiomeProvider;
import com.dfsek.terra.api.world.info.WorldProperties;
public class RangeLayerPredicate implements LayerPredicate {
private final Range range;
public RangeLayerPredicate(Range range) {
this.range = range;
}
@Override
public boolean test(int x, int y, int z, WorldProperties worldProperties, BiomeProvider biomeProvider) {
return range.isInRange(y);
}
}
@@ -1,29 +0,0 @@
package com.dfsek.terra.addons.chunkgenerator.layer.predicate;
import com.dfsek.terra.addons.chunkgenerator.api.LayerPredicate;
import com.dfsek.terra.addons.chunkgenerator.api.LayerSampler;
import com.dfsek.terra.addons.chunkgenerator.math.RelationalOperator;
import com.dfsek.terra.api.world.biome.generation.BiomeProvider;
import com.dfsek.terra.api.world.info.WorldProperties;
public class SamplerLayerPredicate implements LayerPredicate {
private final LayerSampler sampler;
private final double threshold;
private final RelationalOperator operator;
public SamplerLayerPredicate(LayerSampler sampler, RelationalOperator operator, double threshold) {
this.sampler = sampler;
this.operator = operator;
this.threshold = threshold;
}
@Override
public boolean test(int x, int y, int z, WorldProperties worldProperties, BiomeProvider biomeProvider) {
return operator.test(sampler.sample(x, y, z, worldProperties, biomeProvider), threshold);
}
}
@@ -1,33 +0,0 @@
package com.dfsek.terra.addons.chunkgenerator.layer.predicate;
import com.dfsek.terra.addons.chunkgenerator.api.LayerPredicate;
import com.dfsek.terra.addons.chunkgenerator.api.LayerSampler;
import com.dfsek.terra.addons.chunkgenerator.math.RelationalOperator;
import com.dfsek.terra.addons.chunkgenerator.math.pointset.PointSet;
import com.dfsek.seismic.type.vector.Vector3Int;
import com.dfsek.terra.api.world.biome.generation.BiomeProvider;
import com.dfsek.terra.api.world.info.WorldProperties;
public class SamplerListLayerPredicate implements LayerPredicate {
private final Vector3Int[] points;
private final RelationalOperator operator;
private final LayerSampler sampler;
private final double threshold;
public SamplerListLayerPredicate(LayerSampler sampler, double threshold, RelationalOperator operator, PointSet points) {
this.sampler = sampler;
this.threshold = threshold;
this.operator = operator;
this.points = points.toArray();
}
@Override
public boolean test(int x, int y, int z, WorldProperties worldProperties, BiomeProvider biomeProvider) {
for (Vector3Int point : points) {
if (operator.test(sampler.sample(x + point.getX(), y + point.getY(), z + point.getZ(), worldProperties, biomeProvider), threshold)) return true;
}
return false;
}
}
@@ -1,21 +0,0 @@
package com.dfsek.terra.addons.chunkgenerator.layer.resolve;
import com.dfsek.terra.addons.chunkgenerator.api.LayerPalette;
import com.dfsek.terra.addons.chunkgenerator.api.LayerResolver;
import com.dfsek.terra.api.world.biome.generation.BiomeProvider;
import com.dfsek.terra.api.world.info.WorldProperties;
public class PaletteLayerResolver implements LayerResolver {
private final LayerPalette palette;
public PaletteLayerResolver(LayerPalette palette) {
this.palette = palette;
}
@Override
public LayerPalette resolve(int x, int y, int z, WorldProperties world, BiomeProvider biomeProvider) {
return palette;
}
}
@@ -1,28 +0,0 @@
package com.dfsek.terra.addons.chunkgenerator.layer.resolve;
import com.dfsek.terra.addons.chunkgenerator.api.LayerPalette;
import com.dfsek.terra.addons.chunkgenerator.api.LayerPredicate;
import com.dfsek.terra.addons.chunkgenerator.api.LayerResolver;
import com.dfsek.terra.api.world.biome.generation.BiomeProvider;
import com.dfsek.terra.api.world.info.WorldProperties;
public class PredicateLayerResolver implements LayerResolver {
private final LayerPredicate predicate;
private final LayerResolver trueResolver;
private final LayerResolver falseResolver;
public PredicateLayerResolver(LayerPredicate predicate, LayerResolver trueResolver, LayerResolver falseResolver) {
this.predicate = predicate;
this.trueResolver = trueResolver;
this.falseResolver = falseResolver;
}
@Override
public LayerPalette resolve(int x, int y, int z, WorldProperties world, BiomeProvider biomeProvider) {
return predicate.test(x, y, z, world, biomeProvider) ? trueResolver.resolve(x, y, z, world, biomeProvider) : falseResolver.resolve(x, y, z, world, biomeProvider);
}
}
@@ -1,90 +0,0 @@
package com.dfsek.terra.addons.chunkgenerator.layer.sampler;
import com.dfsek.tectonic.api.config.template.dynamic.DynamicTemplate;
import com.dfsek.tectonic.api.config.template.dynamic.DynamicValue;
import com.dfsek.terra.addons.chunkgenerator.api.chunk.ChunkLayerSampler;
import com.dfsek.terra.addons.chunkgenerator.layer.sampler.blend.BlendProperties;
import org.jetbrains.annotations.Nullable;
import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Optional;
import java.util.function.Consumer;
import java.util.stream.Collectors;
import com.dfsek.terra.addons.chunkgenerator.LayeredChunkGeneratorAddon;
import com.dfsek.terra.addons.chunkgenerator.api.LayerSampler;
import com.dfsek.terra.api.event.events.config.ConfigurationLoadEvent;
import com.dfsek.seismic.type.sampler.Sampler;
import com.dfsek.terra.api.properties.Properties;
import com.dfsek.terra.api.world.biome.Biome;
import com.dfsek.terra.api.world.biome.generation.BiomeProvider;
import com.dfsek.terra.api.world.info.WorldProperties;
public class BiomeDefinedLayerSampler implements LayerSampler {
private final Sampler defaultSampler;
private final BlendProperties blendProperties;
public BiomeDefinedLayerSampler(@Nullable Sampler defaultSampler, BlendProperties blendProperties) {
this.defaultSampler = defaultSampler;
this.blendProperties = blendProperties;
}
@Override
public double sample(int x, int y, int z, WorldProperties world, BiomeProvider biomeProvider) {
return biomeProvider.getBiome(x, y, z, world.getSeed())
.getContext()
.get(BiomeLayerSamplers.class)
.samplers()
.get(this)
.getSample(world.getSeed(), x, y, z);
}
@Override
public ChunkLayerSampler getChunk(int chunkX, int chunkZ, WorldProperties world, BiomeProvider biomeProvider) {
return null;
}
@Override
public double getBlendWeight() {
return blendProperties.weight();
}
private Optional<Sampler> getDefaultSampler() {
return Optional.ofNullable(defaultSampler);
}
public static Consumer<ConfigurationLoadEvent> injectLayerSamplers = event -> {
if(event.is(Biome.class)) {
Map<BiomeDefinedLayerSampler, String> samplerFields = new HashMap<>();
DynamicTemplate.Builder templateBuilder = DynamicTemplate.builder();
event.getPack().getRegistry(LayeredChunkGeneratorAddon.LAYER_SAMPLER_TOKEN).forEach((registryKey, registryEntry) -> {
LayerSampler layerSampler = registryEntry.get();
if (layerSampler instanceof BiomeDefinedLayerSampler biomeLayerSampler) {
String id = registryKey.getID();
String fieldName = id + "LayerSampler";
samplerFields.put(biomeLayerSampler, fieldName);
DynamicValue.Builder<Sampler> value = DynamicValue.builder("generation.samplers." + id, Sampler.class);
biomeLayerSampler.getDefaultSampler().ifPresent(value::setDefault);
templateBuilder.value(fieldName, value.build());
}
});
DynamicTemplate layerSamplerBiomeTemplate = event.load(templateBuilder.build());
Map<BiomeDefinedLayerSampler, Sampler> samplerMap = samplerFields.entrySet().stream().collect(
Collectors.toMap(Entry::getKey, entry -> layerSamplerBiomeTemplate.get(entry.getValue(), Sampler.class)));
event.getLoadedObject(Biome.class).getContext().put(new BiomeLayerSamplers(samplerMap));
}
};
public record BiomeLayerSamplers(Map<BiomeDefinedLayerSampler, Sampler> samplers) implements Properties {
}
}
@@ -1,41 +0,0 @@
package com.dfsek.terra.addons.chunkgenerator.layer.sampler;
import com.dfsek.seismic.math.floatingpoint.FloatingPointFunctions;
import com.dfsek.seismic.math.numericanalysis.interpolation.InterpolationFunctions;
import com.dfsek.terra.addons.chunkgenerator.api.LayerSampler;
import com.dfsek.seismic.type.sampler.Sampler;
import com.dfsek.terra.addons.chunkgenerator.api.chunk.ChunkLayerSampler;
import com.dfsek.terra.addons.chunkgenerator.layer.sampler.blend.BlendProperties;
import com.dfsek.terra.addons.chunkgenerator.layer.sampler.chunk.DensityChunkLayerSampler;
import com.dfsek.terra.api.world.biome.generation.BiomeProvider;
import com.dfsek.terra.api.world.info.WorldProperties;
public class DensityLayerSampler implements LayerSampler {
private final Sampler sampler;
private final BlendProperties blendProperties;
public DensityLayerSampler(Sampler sampler, BlendProperties blendProperties) {
this.sampler = sampler;
this.blendProperties = blendProperties;
}
@Override
public double sample(int x, int y, int z, WorldProperties world, BiomeProvider biomeProvider) {
//TODO if needed make this match chunk impl
return sampler.getSample(world.getSeed(), x, y, z);
}
@Override
public ChunkLayerSampler getChunk(int chunkX, int chunkZ, WorldProperties world, BiomeProvider biomeProvider) {
return new DensityChunkLayerSampler(chunkX, chunkZ, world, biomeProvider, this, blendProperties);
}
@Override
public double getBlendWeight() {
return blendProperties.weight();
}
}
@@ -1,39 +0,0 @@
package com.dfsek.terra.addons.chunkgenerator.layer.sampler;
import com.dfsek.seismic.type.sampler.Sampler;
import com.dfsek.terra.addons.chunkgenerator.api.LayerSampler;
import com.dfsek.terra.addons.chunkgenerator.api.chunk.ChunkLayerSampler;
import com.dfsek.terra.addons.chunkgenerator.layer.sampler.blend.BlendProperties;
import com.dfsek.terra.addons.chunkgenerator.layer.sampler.chunk.DensityChunkLayerSampler;
import com.dfsek.terra.addons.chunkgenerator.layer.sampler.chunk.ElevationChunkLayerSampler;
import com.dfsek.terra.api.world.biome.generation.BiomeProvider;
import com.dfsek.terra.api.world.info.WorldProperties;
public class ElevationLayerSampler implements LayerSampler {
private final Sampler sampler;
private final BlendProperties blendProperties;
public ElevationLayerSampler(Sampler sampler, BlendProperties blendProperties) {
this.sampler = sampler;
this.blendProperties = blendProperties;
}
@Override
public double sample(int x, int y, int z, WorldProperties world, BiomeProvider biomeProvider) {
//TODO if needed make this match chunk impl
return sampler.getSample(world.getSeed(), x, z);
}
@Override
public ChunkLayerSampler getChunk(int chunkX, int chunkZ, WorldProperties world, BiomeProvider biomeProvider) {
return new ElevationChunkLayerSampler(chunkX, chunkZ, world, biomeProvider, this, blendProperties);
}
@Override
public double getBlendWeight() {
return blendProperties.weight();
}
}
@@ -1,7 +0,0 @@
package com.dfsek.terra.addons.chunkgenerator.layer.sampler.blend;
public record BlendProperties(int density, double weight, int extent) {
public static BlendProperties of(int density, double weight) {
return new BlendProperties(density, weight, Math.max((18 / density) + 1, 1));
}
}
@@ -1,100 +0,0 @@
package com.dfsek.terra.addons.chunkgenerator.layer.sampler.chunk;
import com.dfsek.seismic.math.floatingpoint.FloatingPointFunctions;
import com.dfsek.seismic.math.numericanalysis.interpolation.InterpolationFunctions;
import com.dfsek.terra.addons.chunkgenerator.api.LayerSampler;
import com.dfsek.terra.addons.chunkgenerator.api.chunk.ChunkLayerSampler;
import com.dfsek.terra.addons.chunkgenerator.layer.sampler.DensityLayerSampler;
import com.dfsek.terra.addons.chunkgenerator.layer.sampler.blend.BlendProperties;
import com.dfsek.terra.api.world.biome.generation.BiomeProvider;
import com.dfsek.terra.api.world.info.WorldProperties;
public class DensityChunkLayerSampler implements ChunkLayerSampler {
double[] samples;
private final int blendExtent;
private final int min;
private final int blendExtentYExtent;
private final int blendExtentMinus2;
private final int blendYExtendMinus2;
private final int blendDensity;
public DensityChunkLayerSampler(int chunkX, int chunkZ, WorldProperties world, BiomeProvider biomeProvider, DensityLayerSampler layerSampler, BlendProperties blendProperties) {
this.min = world.getMinHeight() - 1;
int worldMax = world.getMaxHeight() + 1;
blendDensity = blendProperties.density();
int blendYRange = worldMax - min + 1;
int max;
int blendYExtend;
if (blendYRange % blendDensity == 0) {
blendYExtend = blendYRange / blendDensity;
max = worldMax;
} else {
blendYExtend = (blendYRange / blendDensity) + 1;
max = worldMax + 1;
}
blendExtent = blendProperties.extent();
blendExtentYExtent = blendYExtend * blendExtent;
blendExtentMinus2 = blendExtent - 2;
blendYExtendMinus2 = blendYExtend - 2;
samples = new double[blendExtentYExtent * blendExtent];
int xOrigin = (chunkX << 4) - 1;
int zOrigin = (chunkZ << 4) - 1;
for (int x = 0; x < 18; x += blendDensity) {
for (int z = 0; z < 18; z += blendDensity) {
int cx = xOrigin + x;
int cz = zOrigin + z;
for (int y = this.min; y <= max; y++) {
int yi = y - this.min;
int index = x * blendExtentYExtent + yi * blendExtent + z;
samples[index] = layerSampler.sample(cx, y, cz, world, biomeProvider);
}
}
}
}
private double getSample(int x, int y, int z) {
int index = x * blendExtentYExtent + y * blendExtent + z;
return samples[index];
}
@Override
public double sample(int fmX, int y, int fmZ) {
double gx = (double)(fmX + 1) / blendDensity;
double gz = (double)(fmZ + 1) / blendDensity;
double gy = (double)(y - min) / blendDensity;
int x0 = Math.max(0, Math.min(blendExtentMinus2, FloatingPointFunctions.floor(gx)));
int z0 = Math.max(0, Math.min(blendExtentMinus2, FloatingPointFunctions.floor(gz)));
int y0 = Math.max(0, Math.min(blendYExtendMinus2, FloatingPointFunctions.floor(gy)));
int x1 = x0 + 1;
int z1 = z0 + 1;
int y1 = y0 + 1;
double tx = gx - x0;
double tz = gz - z0;
double ty = gy - y0;
// Fetch 8 corners
double c000 = getSample(x0, y0, z0);
double c100 = getSample(x1, y0, z0);
double c010 = getSample(x0, y1, z0);
double c110 = getSample(x1, y1, z0);
double c001 = getSample(x0, y0, z1);
double c101 = getSample(x1, y0, z1);
double c011 = getSample(x0, y1, z1);
double c111 = getSample(x1, y1, z1);
return InterpolationFunctions.triLerp(c000, c100, c010, c110, c001, c101, c011, c111, tx, ty, tz);
}
}
@@ -1,37 +0,0 @@
package com.dfsek.terra.addons.chunkgenerator.layer.sampler.chunk;
import com.dfsek.terra.addons.chunkgenerator.api.LayerSampler;
import com.dfsek.terra.addons.chunkgenerator.api.chunk.ChunkLayerSampler;
import com.dfsek.terra.addons.chunkgenerator.layer.sampler.ElevationLayerSampler;
import com.dfsek.terra.addons.chunkgenerator.layer.sampler.blend.BlendProperties;
import com.dfsek.terra.api.world.biome.generation.BiomeProvider;
import com.dfsek.terra.api.world.info.WorldProperties;
public class ElevationChunkLayerSampler implements ChunkLayerSampler {
double[] samples;
public ElevationChunkLayerSampler(int chunkX, int chunkZ, WorldProperties world, BiomeProvider biomeProvider, ElevationLayerSampler layerSampler,
BlendProperties blendProperties) {
//I see no reason to implement sparse blending here, elevation is inexpensive. If that changes, it can be easily implemented here.
samples = new double[16 * 16];
int xOrigin = chunkX << 4;
int zOrigin = chunkZ << 4;
for (int x = 0; x < 16; x++) {
for (int z = 0; z < 16; z++) {
int cx = xOrigin + x;
int cz = zOrigin + z;
int index = x * 16 + z;
samples[index] = layerSampler.sample(cx, 0, cz, world, biomeProvider);
}
}
}
@Override
public double sample(int fmX, int y, int fmZ) {
int index = fmX * 16 + fmZ;
return samples[index];
}
}
@@ -1,45 +0,0 @@
package com.dfsek.terra.addons.chunkgenerator.math;
import com.dfsek.terra.addons.chunkgenerator.util.DoubleBiPredicate;
public enum RelationalOperator implements DoubleBiPredicate {
GreaterThan {
@Override
public boolean test(double a, double b) {
return a > b;
}
},
GreaterThanOrEqual {
@Override
public boolean test(double a, double b) {
return a >= b;
}
},
LessThan {
@Override
public boolean test(double a, double b) {
return a < b;
}
},
LessThanOrEqual {
@Override
public boolean test(double a, double b) {
return a <= b;
}
},
Equals {
@Override
public boolean test(double a, double b) {
return a == b;
}
},
NotEquals {
@Override
public boolean test(double a, double b) {
return a != b;
}
};
public abstract boolean test(double a, double b);
}
@@ -1,14 +0,0 @@
package com.dfsek.terra.addons.chunkgenerator.math.pointset;
import java.util.function.Supplier;
import java.util.stream.Stream;
import com.dfsek.seismic.type.vector.Vector3Int;
public interface PointSet extends Supplier<Stream<Vector3Int>> {
default Vector3Int[] toArray() {
return this.get().distinct().toArray(Vector3Int[]::new);
}
}
@@ -1,20 +0,0 @@
package com.dfsek.terra.addons.chunkgenerator.math.pointset.generative;
import java.util.stream.Stream;
import com.dfsek.terra.addons.chunkgenerator.math.pointset.PointSet;
import com.dfsek.seismic.type.vector.Vector3Int;
public class AdjacentPointSet implements PointSet {
@Override
public Stream<Vector3Int> get() {
return Stream.of(
Vector3Int.of(0, 0, -1),
Vector3Int.of(0, 0, 1),
Vector3Int.of(0, -1, 0),
Vector3Int.of(0, 1, 0),
Vector3Int.of(-1, 0, 0),
Vector3Int.of(1, 0, 0)
);
}
}
@@ -1,22 +0,0 @@
package com.dfsek.terra.addons.chunkgenerator.math.pointset.generative;
import java.util.Set;
import java.util.stream.Stream;
import com.dfsek.terra.addons.chunkgenerator.math.pointset.PointSet;
import com.dfsek.seismic.type.vector.Vector3Int;
public class SimplePointSet implements PointSet {
private final Stream<Vector3Int> points;
public SimplePointSet(Set<Vector3Int> points) {
this.points = points.stream();
}
@Override
public Stream<Vector3Int> get() {
return points;
}
}
@@ -1,31 +0,0 @@
package com.dfsek.terra.addons.chunkgenerator.math.pointset.generative.geometric;
import java.util.HashSet;
import java.util.Set;
import java.util.stream.Stream;
import com.dfsek.terra.addons.chunkgenerator.math.pointset.PointSet;
import com.dfsek.seismic.type.vector.Vector3Int;
public class CuboidPointSet implements PointSet {
private final Stream<Vector3Int> points;
public CuboidPointSet(int x1, int y1, int z1, int x2, int y2, int z2) {
Set<Vector3Int> points = new HashSet<>();
for (int x = x1; x <= x2; x = x + 1) {
for (int y = y1; y <= y2; y = y + 1) {
for (int z = z1; z <= z2; z = z + 1) {
points.add(Vector3Int.of(x, y, z));
}
}
}
this.points = points.stream();
}
@Override
public Stream<Vector3Int> get() {
return points;
}
}
@@ -1,36 +0,0 @@
package com.dfsek.terra.addons.chunkgenerator.math.pointset.generative.geometric;
import java.util.stream.Stream;
import com.dfsek.terra.addons.chunkgenerator.math.pointset.PointSet;
import com.dfsek.seismic.type.vector.Vector3Int;
import com.dfsek.seismic.math.floatingpoint.FloatingPointFunctions;
import com.dfsek.seismic.type.DistanceFunction;
public class SphericalPointSet implements PointSet {
private final Stream<Vector3Int> points;
public SphericalPointSet(double radius) {
Stream.Builder<Vector3Int> streamBuilder = Stream.builder();
int roundedRadius = FloatingPointFunctions.ceil(radius);
for(int x = -roundedRadius; x <= roundedRadius; x++) {
for(int y = -roundedRadius; y <= roundedRadius; y++) {
for(int z = -roundedRadius; z <= roundedRadius; z++) {
Vector3Int pos = Vector3Int.of(x, y, z);
double length = pos.toFloat().length(DistanceFunction.Euclidean);
if (length == 0) continue;
if (length > radius) continue;
streamBuilder.add(pos);
}
}
}
this.points = streamBuilder.build();
}
@Override
public Stream<Vector3Int> get() {
return points;
}
}
@@ -1,29 +0,0 @@
package com.dfsek.terra.addons.chunkgenerator.math.pointset.operative;
import com.google.common.collect.Sets;
import java.util.Collections;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.Stream;
import com.dfsek.terra.addons.chunkgenerator.math.pointset.PointSet;
import com.dfsek.seismic.type.vector.Vector3Int;
public class DifferencePointSet implements PointSet {
private final Stream<Vector3Int> points;
public DifferencePointSet(List<PointSet> sets) {
points = sets.stream()
.map(PointSet::get)
.map(s -> s.collect(Collectors.toSet()))
.reduce(Sets::difference).orElse(Collections.emptySet())
.stream();
}
@Override
public Stream<Vector3Int> get() {
return points;
}
}
@@ -1,32 +0,0 @@
package com.dfsek.terra.addons.chunkgenerator.math.pointset.operative;
import com.dfsek.paralithic.Expression;
import com.dfsek.paralithic.eval.parser.Parser;
import com.dfsek.paralithic.eval.parser.Scope;
import com.dfsek.paralithic.eval.tokenizer.ParseException;
import java.util.stream.Stream;
import com.dfsek.terra.addons.chunkgenerator.math.pointset.PointSet;
import com.dfsek.seismic.type.vector.Vector3Int;
public class ExpressionFilterPointSet implements PointSet {
private final Stream<Vector3Int> points;
public ExpressionFilterPointSet(PointSet set, String eq) throws ParseException {
Parser parser = new Parser();
Scope scope = new Scope();
scope.addInvocationVariable("x");
scope.addInvocationVariable("y");
scope.addInvocationVariable("z");
Expression expression = parser.parse(eq, scope);
this.points = set.get().filter(v -> expression.evaluate(v.getX(), v.getY(), v.getZ()) == 1);
}
@Override
public Stream<Vector3Int> get() {
return points;
}
}
@@ -1,29 +0,0 @@
package com.dfsek.terra.addons.chunkgenerator.math.pointset.operative;
import com.google.common.collect.Sets;
import java.util.Collections;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.Stream;
import com.dfsek.terra.addons.chunkgenerator.math.pointset.PointSet;
import com.dfsek.seismic.type.vector.Vector3Int;
public class IntersectionPointSet implements PointSet {
private final Stream<Vector3Int> points;
public IntersectionPointSet(List<PointSet> sets) {
points = sets.stream()
.map(PointSet::get)
.map(s -> s.collect(Collectors.toSet()))
.reduce(Sets::intersection).orElse(Collections.emptySet())
.stream();
}
@Override
public Stream<Vector3Int> get() {
return points;
}
}
@@ -1,29 +0,0 @@
package com.dfsek.terra.addons.chunkgenerator.math.pointset.operative;
import com.google.common.collect.Sets;
import java.util.Collections;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.Stream;
import com.dfsek.terra.addons.chunkgenerator.math.pointset.PointSet;
import com.dfsek.seismic.type.vector.Vector3Int;
public class UnionPointSet implements PointSet {
private final Stream<Vector3Int> points;
public UnionPointSet(List<PointSet> sets) {
points = sets.stream()
.map(PointSet::get)
.map(s -> s.collect(Collectors.toSet()))
.reduce(Sets::union).orElse(Collections.emptySet())
.stream();
}
@Override
public Stream<Vector3Int> get() {
return points;
}
}
@@ -1,34 +0,0 @@
package com.dfsek.terra.addons.chunkgenerator.palette;
import java.util.Map;
import java.util.NavigableMap;
import java.util.TreeMap;
public class DoubleNavigableHolder<T> {
private final NavigableMap<Double, T> map;
public DoubleNavigableHolder(Map<Double, T> inputMap) {
NavigableMap<Double, T> map = new TreeMap<>(inputMap);
map.put(Double.MAX_VALUE, map.lastEntry().getValue());
this.map = map;
}
public T get(double threshold) {
return map.ceilingEntry(threshold).getValue();
}
enum Method {
CEILING,
FLOOR,
CLOSEST
}
public class Single extends DoubleNavigableHolder<T> {
public Single(Map<Double, T> inputMap) {
super(inputMap);
}
}
}
@@ -1,18 +0,0 @@
package com.dfsek.terra.addons.chunkgenerator.palette;
import com.dfsek.terra.api.block.state.BlockState;
import com.dfsek.terra.api.world.chunk.generation.util.Palette;
public class SingletonPalette implements Palette {
private final BlockState blockState;
public SingletonPalette(BlockState blockState) {
this.blockState = blockState;
}
@Override
public BlockState get(int layer, double x, double y, double z, long seed) {
return blockState;
}
}
@@ -1,6 +0,0 @@
package com.dfsek.terra.addons.chunkgenerator.util;
@FunctionalInterface
public interface DoubleBiPredicate {
boolean test(double a, double b);
}
@@ -1,12 +0,0 @@
package com.dfsek.terra.addons.chunkgenerator.util;
import java.util.function.Supplier;
public record InstanceWrapper<T>(T instance) implements Supplier<T> {
@Override
public T get() {
return instance;
}
}
@@ -1,12 +0,0 @@
schema-version: 1
contributors:
- Terra contributors
id: chunk-generator-layered
version: @VERSION@
entrypoints:
- "com.dfsek.terra.addons.chunkgenerator.LayeredChunkGeneratorAddon"
website:
issues: https://github.com/PolyhedralDev/Terra/issues
source: https://github.com/PolyhedralDev/Terra
docs: https://terra.polydev.org
license: MIT License
@@ -5,20 +5,20 @@ import com.dfsek.tectonic.api.config.template.annotations.Value;
import com.dfsek.tectonic.api.config.template.object.ObjectTemplate;
import com.dfsek.terra.api.config.meta.Meta;
import com.dfsek.seismic.type.sampler.Sampler;
import com.dfsek.terra.api.noise.NoiseSampler;
public class BiomeNoiseConfigTemplate implements ObjectTemplate<BiomeNoiseProperties> {
@Value("terrain.sampler")
private @Meta Sampler baseSampler;
private @Meta NoiseSampler baseSampler;
@Value("terrain.sampler-2d")
@Default
private @Meta Sampler elevationSampler = Sampler.zero();
private @Meta NoiseSampler elevationSampler = NoiseSampler.zero();
@Value("carving.sampler")
@Default
private @Meta Sampler carvingSampler = Sampler.zero();
private @Meta NoiseSampler carvingSampler = NoiseSampler.zero();
@Value("terrain.blend.distance")
@Default
@@ -1,12 +1,12 @@
package com.dfsek.terra.addons.chunkgenerator.config.noise;
import com.dfsek.seismic.type.sampler.Sampler;
import com.dfsek.terra.api.noise.NoiseSampler;
import com.dfsek.terra.api.properties.Properties;
public record BiomeNoiseProperties(Sampler base,
Sampler elevation,
Sampler carving,
public record BiomeNoiseProperties(NoiseSampler base,
NoiseSampler elevation,
NoiseSampler carving,
int blendDistance,
int blendStep,
double blendWeight,
@@ -1,19 +1,19 @@
package com.dfsek.terra.addons.chunkgenerator.config.noise;
import com.dfsek.seismic.type.sampler.Sampler;
import com.dfsek.terra.api.noise.NoiseSampler;
public class ThreadLocalNoiseHolder {
private final ThreadLocal<Holder> holder = ThreadLocal.withInitial(Holder::new);
public double getNoise(Sampler sampler, int x, int y, int z, long seed) {
public double getNoise(NoiseSampler sampler, int x, int y, int z, long seed) {
Holder holder = this.holder.get();
if(holder.init && holder.y == y && holder.z == z && holder.x == x && holder.seed == seed) {
return holder.noise;
}
double noise = sampler.getSample(seed, x, y, z);
double noise = sampler.noise(seed, x, y, z);
holder.noise = noise;
holder.x = x;
holder.y = y;
@@ -1,7 +1,7 @@
package com.dfsek.terra.addons.chunkgenerator.generation.math;
import com.dfsek.terra.addons.chunkgenerator.generation.math.samplers.Sampler3D;
import com.dfsek.seismic.type.vector.Vector3;
import com.dfsek.terra.api.util.vector.Vector3;
public enum SlantCalculationMethod {
@@ -22,7 +22,7 @@ public enum SlantCalculationMethod {
Vector3.Mutable normalApproximation = Vector3.Mutable.of(0, 0, 0);
for(Vector3 point : DOT_PRODUCT_SAMPLE_POINTS) {
var scalar = -sampler.sample(x + point.getX(), y + point.getY(), z + point.getZ());
normalApproximation.add(point.mutable().mulScalar(scalar));
normalApproximation.add(point.mutable().multiply(scalar));
}
return DOT_PRODUCT_DIRECTION.dot(normalApproximation.normalize());
}
@@ -55,12 +55,12 @@ public class ElevationInterpolator {
}
if(same) {
values[x + 1][z + 1] = center.elevation().getSample(seed, xOrigin + x, zOrigin + z); // no weighting needed!
values[x + 1][z + 1] = center.elevation().noise(seed, xOrigin + x, zOrigin + z); // no weighting needed!
} else {
for(int xi = -smooth; xi <= smooth; xi++) {
for(int zi = -smooth; zi <= smooth; zi++) {
BiomeNoiseProperties gen = gens[x + 1 + smooth + xi][z + 1 + smooth + zi];
noise += gen.elevation().getSample(seed, xOrigin + x, zOrigin + z) * gen.elevationWeight();
noise += gen.elevation().noise(seed, xOrigin + x, zOrigin + z) * gen.elevationWeight();
div += gen.elevationWeight();
}
}
@@ -7,8 +7,7 @@
package com.dfsek.terra.addons.chunkgenerator.generation.math.interpolation;
import com.dfsek.seismic.math.numericanalysis.interpolation.InterpolationFunctions;
import com.dfsek.terra.api.util.MathUtil;
/**
@@ -32,7 +31,6 @@ public class Interpolator {
this.v3 = v3;
}
//TODO this system is not very good, replace it wholesale
/**
* 2D Bilinear interpolation between 4 points on a unit square.
*
@@ -42,8 +40,8 @@ public class Interpolator {
* @return double - The interpolated value.
*/
public double bilerp(double s, double t) {
double v01 = InterpolationFunctions.lerp(v0, v1, s);
double v23 = InterpolationFunctions.lerp(v2, v3, s);
return InterpolationFunctions.lerp(v01, v23, t);
double v01 = MathUtil.lerp(s, v0, v1);
double v23 = MathUtil.lerp(s, v2, v3);
return MathUtil.lerp(t, v01, v23);
}
}
@@ -7,8 +7,7 @@
package com.dfsek.terra.addons.chunkgenerator.generation.math.interpolation;
import com.dfsek.seismic.math.numericanalysis.interpolation.InterpolationFunctions;
import com.dfsek.terra.api.util.MathUtil;
/**
@@ -37,8 +36,7 @@ public class Interpolator3 {
this.bottom = new Interpolator(_100, _110, _101, _111);
}
//TODO this system is not very good, replace it wholesale
public double trilerp(double x, double y, double z) {
return InterpolationFunctions.lerp(top.bilerp(y, z), bottom.bilerp(y, z), x);
return MathUtil.lerp(x, top.bilerp(y, z), bottom.bilerp(y, z));
}
}
@@ -1,10 +1,8 @@
package com.dfsek.terra.addons.chunkgenerator.generation.math.interpolation;
import com.dfsek.seismic.math.floatingpoint.FloatingPointFunctions;
import com.dfsek.seismic.math.numericanalysis.interpolation.InterpolationFunctions;
import com.dfsek.terra.addons.chunkgenerator.config.noise.BiomeNoiseProperties;
import com.dfsek.terra.api.properties.PropertyKey;
import com.dfsek.terra.api.util.MathUtil;
import com.dfsek.terra.api.world.biome.generation.BiomeProvider;
@@ -29,8 +27,8 @@ public class LazilyEvaluatedInterpolator {
PropertyKey<BiomeNoiseProperties> noisePropertiesKey, int min, int horizontalRes, int verticalRes,
long seed) {
this.noisePropertiesKey = noisePropertiesKey;
int hSamples = FloatingPointFunctions.ceil(16.0 / horizontalRes);
int vSamples = FloatingPointFunctions.ceil((double) (max - min) / verticalRes);
int hSamples = (int) Math.ceil(16.0 / horizontalRes);
int vSamples = (int) Math.ceil((double) (max - min) / verticalRes);
this.zMul = (hSamples + 1);
this.yMul = zMul * zMul;
samples = new Double[yMul * (vSamples + 1)];
@@ -58,7 +56,7 @@ public class LazilyEvaluatedInterpolator {
.getContext()
.get(noisePropertiesKey)
.carving()
.getSample(seed, xi, y, zi);
.noise(seed, xi, y, zi);
samples[index] = sample;
}
return sample;
@@ -83,10 +81,10 @@ public class LazilyEvaluatedInterpolator {
double xFrac = (double) (x % horizontalRes) / horizontalRes;
double zFrac = (double) (z % horizontalRes) / horizontalRes;
double lerp_bottom_0 = InterpolationFunctions.lerp(sample_0_0_0, sample_0_0_1, zFrac);
double lerp_bottom_1 = InterpolationFunctions.lerp(sample_1_0_0, sample_1_0_1, zFrac);
double lerp_bottom_0 = MathUtil.lerp(zFrac, sample_0_0_0, sample_0_0_1);
double lerp_bottom_1 = MathUtil.lerp(zFrac, sample_1_0_0, sample_1_0_1);
double lerp_bottom = InterpolationFunctions.lerp(lerp_bottom_0, lerp_bottom_1, xFrac);
double lerp_bottom = MathUtil.lerp(xFrac, lerp_bottom_0, lerp_bottom_1);
if(yRange) { // we can do bilerp
return lerp_bottom;
@@ -102,11 +100,11 @@ public class LazilyEvaluatedInterpolator {
double sample_1_1_0 = sample(xIndex + 1, yIndex + 1, zIndex, x + horizontalRes, y + verticalRes, z);
double sample_1_1_1 = sample(xIndex + 1, yIndex + 1, zIndex + 1, x + horizontalRes, y + verticalRes, z + horizontalRes);
double lerp_top_0 = InterpolationFunctions.lerp(sample_0_1_0, sample_0_1_1, zFrac);
double lerp_top_1 = InterpolationFunctions.lerp(sample_1_1_0, sample_1_1_1, zFrac);
double lerp_top_0 = MathUtil.lerp(zFrac, sample_0_1_0, sample_0_1_1);
double lerp_top_1 = MathUtil.lerp(zFrac, sample_1_1_0, sample_1_1_1);
double lerp_top = InterpolationFunctions.lerp(lerp_top_0, lerp_top_1, xFrac);
double lerp_top = MathUtil.lerp(xFrac, lerp_top_0, lerp_top_1);
return InterpolationFunctions.lerp(lerp_bottom, lerp_top, yFrac);
return MathUtil.lerp(yFrac, lerp_bottom, lerp_top);
}
}
@@ -7,8 +7,6 @@
package com.dfsek.terra.addons.chunkgenerator.generation.math.samplers;
import com.dfsek.seismic.math.floatingpoint.FloatingPointFunctions;
import com.dfsek.terra.addons.chunkgenerator.config.noise.BiomeNoiseProperties;
import com.dfsek.terra.addons.chunkgenerator.generation.math.interpolation.ChunkInterpolator;
import com.dfsek.terra.addons.chunkgenerator.generation.math.interpolation.ElevationInterpolator;
@@ -28,7 +26,7 @@ public class Sampler3D {
}
public double sample(double x, double y, double z) {
return interpolator.getNoise(x, y, z) + elevationInterpolator.getElevation(FloatingPointFunctions.round(x), FloatingPointFunctions.round(z));
return interpolator.getNoise(x, y, z) + elevationInterpolator.getElevation((int) Math.round(x), (int) Math.round(z));
}
public double sample(int x, int y, int z) {
@@ -1,7 +1,6 @@
package com.dfsek.terra.addons.commands.structure;
import com.dfsek.seismic.type.Rotation;
import org.incendo.cloud.CommandManager;
import org.incendo.cloud.component.DefaultValue;
import org.incendo.cloud.context.CommandContext;
@@ -23,6 +22,7 @@ import com.dfsek.terra.api.event.functional.FunctionalEventHandler;
import com.dfsek.terra.api.inject.annotations.Inject;
import com.dfsek.terra.api.registry.Registry;
import com.dfsek.terra.api.structure.Structure;
import com.dfsek.terra.api.util.Rotation;
import com.dfsek.terra.api.util.reflection.TypeKey;
@@ -13,7 +13,7 @@ import com.dfsek.tectonic.api.config.template.object.ObjectTemplate;
import com.dfsek.terra.addons.feature.distributor.distributors.SamplerDistributor;
import com.dfsek.terra.api.config.meta.Meta;
import com.dfsek.seismic.type.sampler.Sampler;
import com.dfsek.terra.api.noise.NoiseSampler;
import com.dfsek.terra.api.structure.feature.Distributor;
@@ -23,7 +23,7 @@ public class SamplerDistributorTemplate implements ObjectTemplate<Distributor> {
@Default
private @Meta double threshold = 0;
@Value("sampler")
private @Meta Sampler noise;
private @Meta NoiseSampler noise;
@Override
public Distributor get() {
@@ -3,11 +3,8 @@ package com.dfsek.terra.addons.feature.distributor.distributors;
import java.util.random.RandomGenerator;
import java.util.random.RandomGeneratorFactory;
import com.dfsek.seismic.algorithms.hashing.HashingFunctions;
import com.dfsek.seismic.math.integer.IntegerFunctions;
import com.dfsek.terra.api.structure.feature.Distributor;
import com.dfsek.terra.api.util.MathUtil;
public class PaddedGridDistributor implements Distributor {
@@ -29,7 +26,7 @@ public class PaddedGridDistributor implements Distributor {
int cellZ = Math.floorDiv(z, cellWidth);
RandomGenerator random = RandomGeneratorFactory.<RandomGenerator.SplittableGenerator>of("Xoroshiro128PlusPlus").create(
(HashingFunctions.murmur64(IntegerFunctions.squash(cellX, cellZ)) ^ seed) + salt);
(MathUtil.murmur64(MathUtil.squash(cellX, cellZ)) ^ seed) + salt);
int pointX = random.nextInt(width) + cellX * cellWidth;
int pointZ = random.nextInt(width) + cellZ * cellWidth;
@@ -7,22 +7,22 @@
package com.dfsek.terra.addons.feature.distributor.distributors;
import com.dfsek.seismic.type.sampler.Sampler;
import com.dfsek.terra.api.noise.NoiseSampler;
import com.dfsek.terra.api.structure.feature.Distributor;
public class SamplerDistributor implements Distributor {
private final Sampler sampler;
private final NoiseSampler sampler;
private final double threshold;
public SamplerDistributor(Sampler sampler, double threshold) {
public SamplerDistributor(NoiseSampler sampler, double threshold) {
this.sampler = sampler;
this.threshold = threshold;
}
@Override
public boolean matches(int x, int z, long seed) {
return sampler.getSample(seed, x, z) < threshold;
return sampler.noise(seed, x, z) < threshold;
}
}
@@ -7,7 +7,7 @@
package com.dfsek.terra.addons.feature;
import com.dfsek.seismic.type.sampler.Sampler;
import com.dfsek.terra.api.noise.NoiseSampler;
import com.dfsek.terra.api.structure.Structure;
import com.dfsek.terra.api.structure.feature.Distributor;
import com.dfsek.terra.api.structure.feature.Feature;
@@ -19,13 +19,13 @@ import com.dfsek.terra.api.world.WritableWorld;
public class ConfiguredFeature implements Feature {
private final ProbabilityCollection<Structure> structures;
private final Sampler structureSelector;
private final NoiseSampler structureSelector;
private final Distributor distributor;
private final Locator locator;
private final String id;
public ConfiguredFeature(ProbabilityCollection<Structure> structures, Sampler structureSelector, Distributor distributor,
public ConfiguredFeature(ProbabilityCollection<Structure> structures, NoiseSampler structureSelector, Distributor distributor,
Locator locator, String id) {
this.structures = structures;
this.structureSelector = structureSelector;

Some files were not shown because too many files have changed in this diff Show More