mirror of
https://github.com/PolyhedralDev/Terra.git
synced 2026-02-16 02:20:57 +00:00
Merge branch 'master' into feat/allay-update
# Conflicts: # platforms/allay/src/main/java/com/dfsek/terra/allay/Mapping.java # platforms/allay/src/main/java/com/dfsek/terra/allay/handle/AllayItemHandle.java
This commit is contained in:
@@ -1,8 +1,8 @@
|
|||||||
preRelease(true)
|
preRelease(true)
|
||||||
|
|
||||||
versionProjects(":common:api", version("6.6.5"))
|
versionProjects(":common:api", version("7.0.0"))
|
||||||
versionProjects(":common:implementation", version("6.6.5"))
|
versionProjects(":common:implementation", version("7.0.0"))
|
||||||
versionProjects(":platforms", version("6.6.5"))
|
versionProjects(":platforms", version("7.0.0"))
|
||||||
|
|
||||||
|
|
||||||
allprojects {
|
allprojects {
|
||||||
|
|||||||
@@ -49,10 +49,21 @@ fun Project.configureDistribution() {
|
|||||||
doFirst {
|
doFirst {
|
||||||
try {
|
try {
|
||||||
file("${buildDir}/resources/main/packs/").deleteRecursively()
|
file("${buildDir}/resources/main/packs/").deleteRecursively()
|
||||||
|
file("${buildDir}/resources/main/metapacks/").deleteRecursively()
|
||||||
|
val overworldPackUrl =
|
||||||
|
URL("https://github.com/PolyhedralDev/TerraOverworldConfig/releases/download/" + Versions.Terra.overworldConfig + "/Overworld.zip")
|
||||||
|
val reimagENDPackUrl =
|
||||||
|
URL("https://github.com/PolyhedralDev/ReimagEND/releases/download/" + Versions.Terra.reimagENDConfig + "/ReimagEND.zip")
|
||||||
|
val tartarusPackUrl =
|
||||||
|
URL("https://github.com/PolyhedralDev/Tartarus/releases/download/" + Versions.Terra.tartarusConfig + "/Tartarus.zip")
|
||||||
val defaultPackUrl =
|
val defaultPackUrl =
|
||||||
URL("https://github.com/PolyhedralDev/TerraOverworldConfig/releases/download/" + Versions.Terra.overworldConfig + "/default.zip")
|
URL("https://github.com/PolyhedralDev/DefaultMetapack/releases/download/" + Versions.Terra.defaultConfig + "/default.zip")
|
||||||
downloadPack(defaultPackUrl, project)
|
downloadPack(overworldPackUrl, project)
|
||||||
} catch (_:Exception) {}
|
downloadPack(reimagENDPackUrl, project)
|
||||||
|
downloadPack(tartarusPackUrl, project)
|
||||||
|
downloadPack(defaultPackUrl, project, true)
|
||||||
|
} catch (_: Exception) {
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -96,6 +107,13 @@ fun Project.configureDistribution() {
|
|||||||
resources.computeIfAbsent("packs") { ArrayList() }.add(it.name)
|
resources.computeIfAbsent("packs") { ArrayList() }.add(it.name)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
val metaPacksDir = File("${project.buildDir}/resources/main/metapacks/")
|
||||||
|
|
||||||
|
metaPacksDir.walkTopDown().forEach {
|
||||||
|
if (it.isDirectory || !it.name.endsWith(".zip")) return@forEach
|
||||||
|
resources.computeIfAbsent("metapacks") { ArrayList() }.add(it.name)
|
||||||
|
}
|
||||||
|
|
||||||
val langDir = File("${project(":common:implementation").buildDir}/resources/main/lang/")
|
val langDir = File("${project(":common:implementation").buildDir}/resources/main/lang/")
|
||||||
|
|
||||||
langDir.walkTopDown().forEach {
|
langDir.walkTopDown().forEach {
|
||||||
@@ -163,9 +181,10 @@ fun Project.configureDistribution() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fun downloadPack(packUrl: URL, project: Project) {
|
fun downloadPack(packUrl: URL, project: Project, metapack: Boolean = false) {
|
||||||
val fileName = packUrl.file.substring(packUrl.file.lastIndexOf("/"))
|
val fileName = packUrl.file.substring(packUrl.file.lastIndexOf("/"))
|
||||||
val file = File("${project.buildDir}/resources/main/packs/${fileName}")
|
val resourceType = if (metapack) "metapacks" else "packs"
|
||||||
|
val file = File("${project.buildDir}/resources/main/${resourceType}/${fileName}")
|
||||||
file.parentFile.mkdirs()
|
file.parentFile.mkdirs()
|
||||||
file.outputStream().write(packUrl.readBytes())
|
file.outputStream().write(packUrl.readBytes())
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,12 +1,16 @@
|
|||||||
object Versions {
|
object Versions {
|
||||||
object Terra {
|
object Terra {
|
||||||
const val overworldConfig = "v1.5.2"
|
const val overworldConfig = "latest"
|
||||||
|
const val reimagENDConfig = "latest"
|
||||||
|
const val tartarusConfig = "latest"
|
||||||
|
const val defaultConfig = "latest"
|
||||||
}
|
}
|
||||||
|
|
||||||
object Libraries {
|
object Libraries {
|
||||||
const val tectonic = "4.2.1"
|
const val tectonic = "4.2.1"
|
||||||
const val paralithic = "0.8.1"
|
const val paralithic = "2.0.1"
|
||||||
const val strata = "1.3.2"
|
const val strata = "1.3.2"
|
||||||
|
const val seismic = "2.0.4"
|
||||||
|
|
||||||
const val cloud = "2.0.0"
|
const val cloud = "2.0.0"
|
||||||
|
|
||||||
@@ -28,7 +32,7 @@ object Versions {
|
|||||||
}
|
}
|
||||||
|
|
||||||
object Fabric {
|
object Fabric {
|
||||||
const val fabricAPI = "0.129.0+${Mod.minecraft}"
|
const val fabricAPI = "0.133.14+${Mod.minecraft}"
|
||||||
const val cloud = "2.0.0-beta.11"
|
const val cloud = "2.0.0-beta.11"
|
||||||
}
|
}
|
||||||
//
|
//
|
||||||
@@ -41,12 +45,12 @@ object Versions {
|
|||||||
const val mixin = "0.15.5+mixin.0.8.7"
|
const val mixin = "0.15.5+mixin.0.8.7"
|
||||||
const val mixinExtras = "0.4.1"
|
const val mixinExtras = "0.4.1"
|
||||||
|
|
||||||
const val minecraft = "1.21.8"
|
const val minecraft = "1.21.9"
|
||||||
const val yarn = "$minecraft+build.1"
|
const val yarn = "$minecraft+build.1"
|
||||||
const val fabricLoader = "0.16.14"
|
const val fabricLoader = "0.17.2"
|
||||||
|
|
||||||
const val architecuryLoom = "1.10.431"
|
const val architecuryLoom = "1.11.440"
|
||||||
const val architecturyPlugin = "3.4.161"
|
const val architecturyPlugin = "3.4.162"
|
||||||
|
|
||||||
}
|
}
|
||||||
//
|
//
|
||||||
@@ -56,13 +60,14 @@ object Versions {
|
|||||||
// }
|
// }
|
||||||
|
|
||||||
object Bukkit {
|
object Bukkit {
|
||||||
const val minecraft = "1.21.8-R0.1"
|
const val minecraft = "1.21.9-rc1-R0.1"
|
||||||
const val paperBuild = "$minecraft-20250717.233435-4"
|
const val paperBuild = "$minecraft-20250930.133904-13"
|
||||||
const val paper = paperBuild
|
const val paper = paperBuild
|
||||||
const val paperLib = "1.0.8"
|
const val paperLib = "1.0.8"
|
||||||
const val reflectionRemapper = "0.1.2"
|
const val reflectionRemapper = "0.1.2"
|
||||||
const val paperDevBundle = paperBuild
|
const val paperDevBundle = paperBuild
|
||||||
const val runPaper = "2.3.1"
|
const val runPaper = "2.3.1"
|
||||||
|
const val runPaperMinecraft = "1.21.9"
|
||||||
const val paperWeight = "2.0.0-beta.17"
|
const val paperWeight = "2.0.0-beta.17"
|
||||||
const val cloud = "2.0.0-beta.11"
|
const val cloud = "2.0.0-beta.11"
|
||||||
const val multiverse = "5.0.2"
|
const val multiverse = "5.0.2"
|
||||||
@@ -91,6 +96,6 @@ object Versions {
|
|||||||
}
|
}
|
||||||
|
|
||||||
object Minestom {
|
object Minestom {
|
||||||
const val minestom = "1_21_6-c3ccee696b"
|
const val minestom = "1_21_6-a40d7115d4"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -14,14 +14,14 @@ import com.dfsek.terra.api.world.biome.generation.BiomeProvider;
|
|||||||
public class BiomeExtrusionProvider implements BiomeProvider {
|
public class BiomeExtrusionProvider implements BiomeProvider {
|
||||||
private final BiomeProvider delegate;
|
private final BiomeProvider delegate;
|
||||||
private final Set<Biome> biomes;
|
private final Set<Biome> biomes;
|
||||||
private final List<Extrusion> extrusions;
|
private final Extrusion[] extrusions;
|
||||||
private final int resolution;
|
private final int resolution;
|
||||||
|
|
||||||
public BiomeExtrusionProvider(BiomeProvider delegate, List<Extrusion> extrusions, int resolution) {
|
public BiomeExtrusionProvider(BiomeProvider delegate, List<Extrusion> extrusions, int resolution) {
|
||||||
this.delegate = delegate;
|
this.delegate = delegate;
|
||||||
this.biomes = delegate.stream().collect(Collectors.toSet());
|
this.biomes = delegate.stream().collect(Collectors.toSet());
|
||||||
extrusions.forEach(e -> biomes.addAll(e.getBiomes()));
|
extrusions.forEach(e -> biomes.addAll(e.getBiomes()));
|
||||||
this.extrusions = extrusions;
|
this.extrusions = extrusions.toArray(new Extrusion[0]);
|
||||||
this.resolution = resolution;
|
this.resolution = resolution;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -33,8 +33,8 @@ public class BiomeExtrusionProvider implements BiomeProvider {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public Biome extrude(Biome original, int x, int y, int z, long seed) {
|
public Biome extrude(Biome original, int x, int y, int z, long seed) {
|
||||||
for(Extrusion extrusion : extrusions) {
|
for(int i = 0; i < extrusions.length; i++) {
|
||||||
original = extrusion.extrude(original, x, y, z, seed);
|
original = extrusions[i].extrude(original, x, y, z, seed);
|
||||||
}
|
}
|
||||||
return original;
|
return original;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,9 +1,9 @@
|
|||||||
package com.dfsek.terra.addons.biome.extrusion.api;
|
package com.dfsek.terra.addons.biome.extrusion.api;
|
||||||
|
|
||||||
import com.dfsek.terra.api.world.biome.Biome;
|
|
||||||
|
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
|
|
||||||
|
import com.dfsek.terra.api.world.biome.Biome;
|
||||||
|
|
||||||
|
|
||||||
public interface Extrusion {
|
public interface Extrusion {
|
||||||
Biome extrude(Biome original, int x, int y, int z, long seed);
|
Biome extrude(Biome original, int x, int y, int z, long seed);
|
||||||
|
|||||||
@@ -1,17 +1,17 @@
|
|||||||
package com.dfsek.terra.addons.biome.extrusion.config.extrusions;
|
package com.dfsek.terra.addons.biome.extrusion.config.extrusions;
|
||||||
|
|
||||||
|
import com.dfsek.seismic.type.sampler.Sampler;
|
||||||
import com.dfsek.tectonic.api.config.template.annotations.Value;
|
import com.dfsek.tectonic.api.config.template.annotations.Value;
|
||||||
import com.dfsek.tectonic.api.config.template.object.ObjectTemplate;
|
import com.dfsek.tectonic.api.config.template.object.ObjectTemplate;
|
||||||
|
|
||||||
import com.dfsek.terra.addons.biome.extrusion.api.Extrusion;
|
import com.dfsek.terra.addons.biome.extrusion.api.Extrusion;
|
||||||
import com.dfsek.terra.api.config.meta.Meta;
|
import com.dfsek.terra.api.config.meta.Meta;
|
||||||
import com.dfsek.terra.api.noise.NoiseSampler;
|
import com.dfsek.terra.api.util.range.Range;
|
||||||
import com.dfsek.terra.api.util.Range;
|
|
||||||
|
|
||||||
|
|
||||||
public abstract class SamplerExtrusionTemplate implements ObjectTemplate<Extrusion> {
|
public abstract class SamplerExtrusionTemplate implements ObjectTemplate<Extrusion> {
|
||||||
@Value("sampler")
|
@Value("sampler")
|
||||||
protected @Meta NoiseSampler sampler;
|
protected @Meta Sampler sampler;
|
||||||
|
|
||||||
@Value("range")
|
@Value("range")
|
||||||
protected @Meta Range range;
|
protected @Meta Range range;
|
||||||
|
|||||||
@@ -1,5 +1,7 @@
|
|||||||
package com.dfsek.terra.addons.biome.extrusion.extrusions;
|
package com.dfsek.terra.addons.biome.extrusion.extrusions;
|
||||||
|
|
||||||
|
import com.dfsek.seismic.type.sampler.Sampler;
|
||||||
|
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
import java.util.function.Predicate;
|
import java.util.function.Predicate;
|
||||||
import java.util.stream.Collectors;
|
import java.util.stream.Collectors;
|
||||||
@@ -7,9 +9,8 @@ import java.util.stream.Collectors;
|
|||||||
import com.dfsek.terra.addons.biome.extrusion.api.Extrusion;
|
import com.dfsek.terra.addons.biome.extrusion.api.Extrusion;
|
||||||
import com.dfsek.terra.addons.biome.extrusion.api.ReplaceableBiome;
|
import com.dfsek.terra.addons.biome.extrusion.api.ReplaceableBiome;
|
||||||
import com.dfsek.terra.addons.biome.query.api.BiomeQueries;
|
import com.dfsek.terra.addons.biome.query.api.BiomeQueries;
|
||||||
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.util.collection.ProbabilityCollection;
|
||||||
|
import com.dfsek.terra.api.util.range.Range;
|
||||||
import com.dfsek.terra.api.world.biome.Biome;
|
import com.dfsek.terra.api.world.biome.Biome;
|
||||||
|
|
||||||
|
|
||||||
@@ -17,7 +18,7 @@ import com.dfsek.terra.api.world.biome.Biome;
|
|||||||
* Sets biomes at locations based on a sampler.
|
* Sets biomes at locations based on a sampler.
|
||||||
*/
|
*/
|
||||||
public class ReplaceExtrusion implements Extrusion {
|
public class ReplaceExtrusion implements Extrusion {
|
||||||
private final NoiseSampler sampler;
|
private final Sampler sampler;
|
||||||
|
|
||||||
private final Range range;
|
private final Range range;
|
||||||
|
|
||||||
@@ -25,7 +26,7 @@ public class ReplaceExtrusion implements Extrusion {
|
|||||||
|
|
||||||
private final Predicate<Biome> hasTag;
|
private final Predicate<Biome> hasTag;
|
||||||
|
|
||||||
public ReplaceExtrusion(NoiseSampler sampler, Range range, ProbabilityCollection<ReplaceableBiome> biomes, String tag) {
|
public ReplaceExtrusion(Sampler sampler, Range range, ProbabilityCollection<ReplaceableBiome> biomes, String tag) {
|
||||||
this.sampler = sampler;
|
this.sampler = sampler;
|
||||||
this.range = range;
|
this.range = range;
|
||||||
this.biomes = biomes;
|
this.biomes = biomes;
|
||||||
|
|||||||
@@ -1,14 +1,15 @@
|
|||||||
package com.dfsek.terra.addons.biome.extrusion.extrusions;
|
package com.dfsek.terra.addons.biome.extrusion.extrusions;
|
||||||
|
|
||||||
|
import com.dfsek.seismic.type.sampler.Sampler;
|
||||||
|
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
import java.util.function.Predicate;
|
import java.util.function.Predicate;
|
||||||
import java.util.stream.Collectors;
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
import com.dfsek.terra.addons.biome.extrusion.api.Extrusion;
|
import com.dfsek.terra.addons.biome.extrusion.api.Extrusion;
|
||||||
import com.dfsek.terra.addons.biome.extrusion.api.ReplaceableBiome;
|
import com.dfsek.terra.addons.biome.extrusion.api.ReplaceableBiome;
|
||||||
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.util.collection.ProbabilityCollection;
|
||||||
|
import com.dfsek.terra.api.util.range.Range;
|
||||||
import com.dfsek.terra.api.world.biome.Biome;
|
import com.dfsek.terra.api.world.biome.Biome;
|
||||||
|
|
||||||
|
|
||||||
@@ -16,13 +17,13 @@ import com.dfsek.terra.api.world.biome.Biome;
|
|||||||
* Sets biomes at locations based on a sampler.
|
* Sets biomes at locations based on a sampler.
|
||||||
*/
|
*/
|
||||||
public class SetExtrusion implements Extrusion {
|
public class SetExtrusion implements Extrusion {
|
||||||
private final NoiseSampler sampler;
|
private final Sampler sampler;
|
||||||
|
|
||||||
private final Range range;
|
private final Range range;
|
||||||
|
|
||||||
private final ProbabilityCollection<ReplaceableBiome> biomes;
|
private final ProbabilityCollection<ReplaceableBiome> biomes;
|
||||||
|
|
||||||
public SetExtrusion(NoiseSampler sampler, Range range, ProbabilityCollection<ReplaceableBiome> biomes) {
|
public SetExtrusion(Sampler sampler, Range range, ProbabilityCollection<ReplaceableBiome> biomes) {
|
||||||
this.sampler = sampler;
|
this.sampler = sampler;
|
||||||
this.range = range;
|
this.range = range;
|
||||||
this.biomes = biomes;
|
this.biomes = biomes;
|
||||||
|
|||||||
@@ -1,21 +0,0 @@
|
|||||||
MIT License
|
|
||||||
|
|
||||||
Copyright (c) 2020-2025 Polyhedral Development
|
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
of this software and associated documentation files (the "Software"), to deal
|
|
||||||
in the Software without restriction, including without limitation the rights
|
|
||||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
||||||
copies of the Software, and to permit persons to whom the Software is
|
|
||||||
furnished to do so, subject to the following conditions:
|
|
||||||
|
|
||||||
The above copyright notice and this permission notice shall be included in all
|
|
||||||
copies or substantial portions of the Software.
|
|
||||||
|
|
||||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
||||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
||||||
SOFTWARE.
|
|
||||||
@@ -1,5 +0,0 @@
|
|||||||
# biome-provider-image-v2
|
|
||||||
|
|
||||||
Implements and registers the `IMAGE` biome provider, which
|
|
||||||
utilizes various config types provided by the `library-image` addon to
|
|
||||||
distribute biomes based on images.
|
|
||||||
@@ -1,8 +0,0 @@
|
|||||||
version = version("1.0.1")
|
|
||||||
|
|
||||||
dependencies {
|
|
||||||
compileOnlyApi(project(":common:addons:manifest-addon-loader"))
|
|
||||||
compileOnlyApi(project(":common:addons:library-image"))
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -1,51 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (c) 2020-2025 Polyhedral Development
|
|
||||||
*
|
|
||||||
* The Terra Core Addons are licensed under the terms of the MIT License. For more details,
|
|
||||||
* reference the LICENSE file in this module's root directory.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package com.dfsek.terra.addons.biome.image.v2;
|
|
||||||
|
|
||||||
import java.util.Optional;
|
|
||||||
|
|
||||||
import com.dfsek.terra.addons.image.colorsampler.ColorSampler;
|
|
||||||
import com.dfsek.terra.addons.image.converter.ColorConverter;
|
|
||||||
import com.dfsek.terra.api.world.biome.Biome;
|
|
||||||
import com.dfsek.terra.api.world.biome.generation.BiomeProvider;
|
|
||||||
|
|
||||||
|
|
||||||
public class ImageBiomeProvider implements BiomeProvider {
|
|
||||||
private final int resolution;
|
|
||||||
|
|
||||||
private final ColorConverter<Biome> colorConverter;
|
|
||||||
|
|
||||||
private final ColorSampler colorSampler;
|
|
||||||
|
|
||||||
public ImageBiomeProvider(ColorConverter<Biome> colorConverter, ColorSampler colorSampler, int resolution) {
|
|
||||||
this.resolution = resolution;
|
|
||||||
this.colorConverter = colorConverter;
|
|
||||||
this.colorSampler = colorSampler;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Biome getBiome(int x, int y, int z, long seed) {
|
|
||||||
return getBiome(x, z);
|
|
||||||
}
|
|
||||||
|
|
||||||
public Biome getBiome(int x, int z) {
|
|
||||||
x /= resolution;
|
|
||||||
z /= resolution;
|
|
||||||
return colorConverter.apply(colorSampler.apply(x, z));
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Optional<Biome> getBaseBiome(int x, int z, long seed) {
|
|
||||||
return Optional.of(getBiome(x, z));
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Iterable<Biome> getBiomes() {
|
|
||||||
return colorConverter.getEntries();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,78 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (c) 2020-2025 Polyhedral Development
|
|
||||||
*
|
|
||||||
* The Terra Core Addons are licensed under the terms of the MIT License. For more details,
|
|
||||||
* reference the LICENSE file in this module's root directory.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package com.dfsek.terra.addons.biome.image.v2;
|
|
||||||
|
|
||||||
import com.dfsek.tectonic.api.config.template.object.ObjectTemplate;
|
|
||||||
|
|
||||||
import java.util.function.Supplier;
|
|
||||||
|
|
||||||
import com.dfsek.terra.addons.biome.image.v2.config.ImageProviderTemplate;
|
|
||||||
import com.dfsek.terra.addons.biome.image.v2.config.converter.ClosestBiomeColorConverterTemplate;
|
|
||||||
import com.dfsek.terra.addons.biome.image.v2.config.converter.ExactBiomeColorConverterTemplate;
|
|
||||||
import com.dfsek.terra.addons.biome.image.v2.config.converter.mapping.DefinedBiomeColorMappingTemplate;
|
|
||||||
import com.dfsek.terra.addons.image.converter.ColorConverter;
|
|
||||||
import com.dfsek.terra.addons.image.converter.mapping.BiomeDefinedColorMapping;
|
|
||||||
import com.dfsek.terra.addons.image.converter.mapping.ColorMapping;
|
|
||||||
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.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.biome.Biome;
|
|
||||||
import com.dfsek.terra.api.world.biome.generation.BiomeProvider;
|
|
||||||
|
|
||||||
|
|
||||||
public class ImageBiomeProviderAddon implements AddonInitializer {
|
|
||||||
public static final TypeKey<Supplier<ObjectTemplate<BiomeProvider>>> PROVIDER_REGISTRY_KEY = new TypeKey<>() {
|
|
||||||
};
|
|
||||||
|
|
||||||
public static final TypeKey<Supplier<ObjectTemplate<ColorConverter<Biome>>>> BIOME_COLOR_CONVERTER_REGISTRY_KEY = new TypeKey<>() {
|
|
||||||
};
|
|
||||||
|
|
||||||
public static final TypeKey<Supplier<ObjectTemplate<ColorMapping<Biome>>>> BIOME_COLOR_MAPPING_REGISTRY_KEY = new TypeKey<>() {
|
|
||||||
};
|
|
||||||
|
|
||||||
@Inject
|
|
||||||
private Platform platform;
|
|
||||||
|
|
||||||
@Inject
|
|
||||||
private BaseAddon addon;
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void initialize() {
|
|
||||||
platform.getEventManager()
|
|
||||||
.getHandler(FunctionalEventHandler.class)
|
|
||||||
.register(addon, ConfigPackPreLoadEvent.class)
|
|
||||||
.priority(501)
|
|
||||||
.then(event -> {
|
|
||||||
CheckedRegistry<Supplier<ObjectTemplate<BiomeProvider>>> providerRegistry = event.getPack().getOrCreateRegistry(
|
|
||||||
PROVIDER_REGISTRY_KEY);
|
|
||||||
providerRegistry.register(addon.key("IMAGE"), ImageProviderTemplate::new);
|
|
||||||
})
|
|
||||||
.then(event -> {
|
|
||||||
CheckedRegistry<Supplier<ObjectTemplate<ColorConverter<Biome>>>> biomeColorConverterRegistry =
|
|
||||||
event.getPack().getOrCreateRegistry(
|
|
||||||
BIOME_COLOR_CONVERTER_REGISTRY_KEY);
|
|
||||||
biomeColorConverterRegistry.register(addon.key("EXACT"), ExactBiomeColorConverterTemplate::new);
|
|
||||||
biomeColorConverterRegistry.register(addon.key("CLOSEST"), ClosestBiomeColorConverterTemplate::new);
|
|
||||||
})
|
|
||||||
.then(event -> {
|
|
||||||
CheckedRegistry<Supplier<ObjectTemplate<ColorMapping<Biome>>>> biomeColorMappingRegistry =
|
|
||||||
event.getPack().getOrCreateRegistry(
|
|
||||||
BIOME_COLOR_MAPPING_REGISTRY_KEY);
|
|
||||||
biomeColorMappingRegistry.register(addon.key("USE_BIOME_COLORS"),
|
|
||||||
() -> () -> new BiomeDefinedColorMapping<>(event.getPack().getRegistry(Biome.class),
|
|
||||||
b -> b));
|
|
||||||
biomeColorMappingRegistry.register(addon.key("MAP"), DefinedBiomeColorMappingTemplate::new);
|
|
||||||
})
|
|
||||||
.failThrough();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,14 +0,0 @@
|
|||||||
schema-version: 1
|
|
||||||
contributors:
|
|
||||||
- Terra contributors
|
|
||||||
id: biome-provider-image-v2
|
|
||||||
version: @VERSION@
|
|
||||||
entrypoints:
|
|
||||||
- "com.dfsek.terra.addons.biome.image.v2.ImageBiomeProviderAddon"
|
|
||||||
website:
|
|
||||||
issues: https://github.com/PolyhedralDev/Terra/issues
|
|
||||||
source: https://github.com/PolyhedralDev/Terra
|
|
||||||
docs: https://terra.polydev.org
|
|
||||||
license: MIT License
|
|
||||||
depends:
|
|
||||||
library-image: "1.+"
|
|
||||||
@@ -1,6 +1,5 @@
|
|||||||
# biome-provider-image
|
# biome-provider-image-v2
|
||||||
|
|
||||||
Implements and registers the `IMAGE` biome provider, a biome provider which
|
Implements and registers the `IMAGE` biome provider, which
|
||||||
generates biomes from an image, using the `color` attribute of biomes.
|
utilizes various config types provided by the `library-image` addon to
|
||||||
|
distribute biomes based on images.
|
||||||
This addon registers the provider type, and all associated config options.
|
|
||||||
|
|||||||
@@ -1,7 +1,8 @@
|
|||||||
version = version("1.0.1")
|
version = version("2.0.0")
|
||||||
|
|
||||||
dependencies {
|
dependencies {
|
||||||
compileOnlyApi(project(":common:addons:manifest-addon-loader"))
|
compileOnlyApi(project(":common:addons:manifest-addon-loader"))
|
||||||
|
compileOnlyApi(project(":common:addons:library-image"))
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -7,32 +7,25 @@
|
|||||||
|
|
||||||
package com.dfsek.terra.addons.biome.image;
|
package com.dfsek.terra.addons.biome.image;
|
||||||
|
|
||||||
import java.awt.Color;
|
|
||||||
import java.awt.image.BufferedImage;
|
|
||||||
import java.util.HashMap;
|
|
||||||
import java.util.Map;
|
|
||||||
import java.util.Optional;
|
import java.util.Optional;
|
||||||
import java.util.Set;
|
|
||||||
|
|
||||||
|
import com.dfsek.terra.addons.image.colorsampler.ColorSampler;
|
||||||
|
import com.dfsek.terra.addons.image.converter.ColorConverter;
|
||||||
import com.dfsek.terra.api.world.biome.Biome;
|
import com.dfsek.terra.api.world.biome.Biome;
|
||||||
import com.dfsek.terra.api.world.biome.generation.BiomeProvider;
|
import com.dfsek.terra.api.world.biome.generation.BiomeProvider;
|
||||||
|
|
||||||
|
|
||||||
public class ImageBiomeProvider implements BiomeProvider {
|
public class ImageBiomeProvider implements BiomeProvider {
|
||||||
private final Map<Color, Biome> colorBiomeMap = new HashMap<>();
|
|
||||||
private final BufferedImage image;
|
|
||||||
private final int resolution;
|
private final int resolution;
|
||||||
private final Align align;
|
|
||||||
|
|
||||||
public ImageBiomeProvider(Set<Biome> registry, BufferedImage image, int resolution, Align align) {
|
private final ColorConverter<Biome> colorConverter;
|
||||||
this.image = image;
|
|
||||||
|
private final ColorSampler colorSampler;
|
||||||
|
|
||||||
|
public ImageBiomeProvider(ColorConverter<Biome> colorConverter, ColorSampler colorSampler, int resolution) {
|
||||||
this.resolution = resolution;
|
this.resolution = resolution;
|
||||||
this.align = align;
|
this.colorConverter = colorConverter;
|
||||||
registry.forEach(biome -> colorBiomeMap.put(new Color(biome.getColor()), biome));
|
this.colorSampler = colorSampler;
|
||||||
}
|
|
||||||
|
|
||||||
private static int distance(Color a, Color b) {
|
|
||||||
return Math.abs(a.getRed() - b.getRed()) + Math.abs(a.getGreen() - b.getGreen()) + Math.abs(a.getBlue() - b.getBlue());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -43,15 +36,7 @@ public class ImageBiomeProvider implements BiomeProvider {
|
|||||||
public Biome getBiome(int x, int z) {
|
public Biome getBiome(int x, int z) {
|
||||||
x /= resolution;
|
x /= resolution;
|
||||||
z /= resolution;
|
z /= resolution;
|
||||||
Color color = align.getColor(image, x, z);
|
return colorConverter.apply(colorSampler.apply(x, z));
|
||||||
return colorBiomeMap.get(colorBiomeMap.keySet()
|
|
||||||
.stream()
|
|
||||||
.reduce(colorBiomeMap.keySet().stream().findAny().orElseThrow(IllegalStateException::new),
|
|
||||||
(running, element) -> {
|
|
||||||
int d1 = distance(color, running);
|
|
||||||
int d2 = distance(color, element);
|
|
||||||
return d1 < d2 ? running : element;
|
|
||||||
}));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -61,24 +46,6 @@ public class ImageBiomeProvider implements BiomeProvider {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Iterable<Biome> getBiomes() {
|
public Iterable<Biome> getBiomes() {
|
||||||
return colorBiomeMap.values();
|
return colorConverter.getEntries();
|
||||||
}
|
|
||||||
|
|
||||||
public enum Align {
|
|
||||||
CENTER {
|
|
||||||
@Override
|
|
||||||
public Color getColor(BufferedImage image, int x, int z) {
|
|
||||||
return new Color(image.getRGB(Math.floorMod(x - image.getWidth() / 2, image.getWidth()),
|
|
||||||
Math.floorMod(z - image.getHeight() / 2, image.getHeight())));
|
|
||||||
}
|
|
||||||
},
|
|
||||||
NONE {
|
|
||||||
@Override
|
|
||||||
public Color getColor(BufferedImage image, int x, int z) {
|
|
||||||
return new Color(image.getRGB(Math.floorMod(x, image.getWidth()), Math.floorMod(z, image.getHeight())));
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
public abstract Color getColor(BufferedImage image, int x, int z);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -8,11 +8,16 @@
|
|||||||
package com.dfsek.terra.addons.biome.image;
|
package com.dfsek.terra.addons.biome.image;
|
||||||
|
|
||||||
import com.dfsek.tectonic.api.config.template.object.ObjectTemplate;
|
import com.dfsek.tectonic.api.config.template.object.ObjectTemplate;
|
||||||
import org.slf4j.Logger;
|
|
||||||
import org.slf4j.LoggerFactory;
|
|
||||||
|
|
||||||
import java.util.function.Supplier;
|
import java.util.function.Supplier;
|
||||||
|
|
||||||
|
import com.dfsek.terra.addons.biome.image.config.ImageProviderTemplate;
|
||||||
|
import com.dfsek.terra.addons.biome.image.config.converter.ClosestBiomeColorConverterTemplate;
|
||||||
|
import com.dfsek.terra.addons.biome.image.config.converter.ExactBiomeColorConverterTemplate;
|
||||||
|
import com.dfsek.terra.addons.biome.image.config.converter.mapping.DefinedBiomeColorMappingTemplate;
|
||||||
|
import com.dfsek.terra.addons.image.converter.ColorConverter;
|
||||||
|
import com.dfsek.terra.addons.image.converter.mapping.BiomeDefinedColorMapping;
|
||||||
|
import com.dfsek.terra.addons.image.converter.mapping.ColorMapping;
|
||||||
import com.dfsek.terra.addons.manifest.api.AddonInitializer;
|
import com.dfsek.terra.addons.manifest.api.AddonInitializer;
|
||||||
import com.dfsek.terra.api.Platform;
|
import com.dfsek.terra.api.Platform;
|
||||||
import com.dfsek.terra.api.addon.BaseAddon;
|
import com.dfsek.terra.api.addon.BaseAddon;
|
||||||
@@ -26,10 +31,15 @@ import com.dfsek.terra.api.world.biome.generation.BiomeProvider;
|
|||||||
|
|
||||||
|
|
||||||
public class ImageBiomeProviderAddon implements AddonInitializer {
|
public class ImageBiomeProviderAddon implements AddonInitializer {
|
||||||
|
|
||||||
public static final TypeKey<Supplier<ObjectTemplate<BiomeProvider>>> PROVIDER_REGISTRY_KEY = new TypeKey<>() {
|
public static final TypeKey<Supplier<ObjectTemplate<BiomeProvider>>> PROVIDER_REGISTRY_KEY = new TypeKey<>() {
|
||||||
};
|
};
|
||||||
private static final Logger logger = LoggerFactory.getLogger(ImageBiomeProviderAddon.class);
|
|
||||||
|
public static final TypeKey<Supplier<ObjectTemplate<ColorConverter<Biome>>>> BIOME_COLOR_CONVERTER_REGISTRY_KEY = new TypeKey<>() {
|
||||||
|
};
|
||||||
|
|
||||||
|
public static final TypeKey<Supplier<ObjectTemplate<ColorMapping<Biome>>>> BIOME_COLOR_MAPPING_REGISTRY_KEY = new TypeKey<>() {
|
||||||
|
};
|
||||||
|
|
||||||
@Inject
|
@Inject
|
||||||
private Platform platform;
|
private Platform platform;
|
||||||
|
|
||||||
@@ -41,16 +51,28 @@ public class ImageBiomeProviderAddon implements AddonInitializer {
|
|||||||
platform.getEventManager()
|
platform.getEventManager()
|
||||||
.getHandler(FunctionalEventHandler.class)
|
.getHandler(FunctionalEventHandler.class)
|
||||||
.register(addon, ConfigPackPreLoadEvent.class)
|
.register(addon, ConfigPackPreLoadEvent.class)
|
||||||
|
.priority(501)
|
||||||
.then(event -> {
|
.then(event -> {
|
||||||
CheckedRegistry<Supplier<ObjectTemplate<BiomeProvider>>> providerRegistry = event.getPack().getOrCreateRegistry(
|
CheckedRegistry<Supplier<ObjectTemplate<BiomeProvider>>> providerRegistry = event.getPack().getOrCreateRegistry(
|
||||||
PROVIDER_REGISTRY_KEY);
|
PROVIDER_REGISTRY_KEY);
|
||||||
providerRegistry.register(addon.key("IMAGE"),
|
providerRegistry.register(addon.key("IMAGE"), ImageProviderTemplate::new);
|
||||||
() -> new ImageProviderTemplate(event.getPack().getRegistry(Biome.class)));
|
})
|
||||||
|
.then(event -> {
|
||||||
|
CheckedRegistry<Supplier<ObjectTemplate<ColorConverter<Biome>>>> biomeColorConverterRegistry =
|
||||||
|
event.getPack().getOrCreateRegistry(
|
||||||
|
BIOME_COLOR_CONVERTER_REGISTRY_KEY);
|
||||||
|
biomeColorConverterRegistry.register(addon.key("EXACT"), ExactBiomeColorConverterTemplate::new);
|
||||||
|
biomeColorConverterRegistry.register(addon.key("CLOSEST"), ClosestBiomeColorConverterTemplate::new);
|
||||||
|
})
|
||||||
|
.then(event -> {
|
||||||
|
CheckedRegistry<Supplier<ObjectTemplate<ColorMapping<Biome>>>> biomeColorMappingRegistry =
|
||||||
|
event.getPack().getOrCreateRegistry(
|
||||||
|
BIOME_COLOR_MAPPING_REGISTRY_KEY);
|
||||||
|
biomeColorMappingRegistry.register(addon.key("USE_BIOME_COLORS"),
|
||||||
|
() -> () -> new BiomeDefinedColorMapping<>(event.getPack().getRegistry(Biome.class),
|
||||||
|
b -> b));
|
||||||
|
biomeColorMappingRegistry.register(addon.key("MAP"), DefinedBiomeColorMappingTemplate::new);
|
||||||
})
|
})
|
||||||
.failThrough();
|
.failThrough();
|
||||||
if(platform.getTerraConfig().isDebugLog())
|
|
||||||
logger.warn(
|
|
||||||
"The biome-provider-image addon is deprecated and scheduled for removal in Terra 7.0. It is recommended to use the " +
|
|
||||||
"biome-provider-image-v2 addon for future pack development instead.");
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,45 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (c) 2020-2025 Polyhedral Development
|
|
||||||
*
|
|
||||||
* The Terra Core Addons are licensed under the terms of the MIT License. For more details,
|
|
||||||
* reference the LICENSE file in this module's root directory.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package com.dfsek.terra.addons.biome.image;
|
|
||||||
|
|
||||||
import com.dfsek.tectonic.api.config.template.annotations.Default;
|
|
||||||
import com.dfsek.tectonic.api.config.template.annotations.Description;
|
|
||||||
import com.dfsek.tectonic.api.config.template.annotations.Value;
|
|
||||||
import com.dfsek.tectonic.api.config.template.object.ObjectTemplate;
|
|
||||||
|
|
||||||
import java.awt.image.BufferedImage;
|
|
||||||
import java.util.HashSet;
|
|
||||||
|
|
||||||
import com.dfsek.terra.api.registry.Registry;
|
|
||||||
import com.dfsek.terra.api.world.biome.Biome;
|
|
||||||
import com.dfsek.terra.api.world.biome.generation.BiomeProvider;
|
|
||||||
|
|
||||||
|
|
||||||
@SuppressWarnings("FieldMayBeFinal")
|
|
||||||
public class ImageProviderTemplate implements ObjectTemplate<BiomeProvider> {
|
|
||||||
private final Registry<Biome> biomes;
|
|
||||||
@Value("resolution")
|
|
||||||
@Default
|
|
||||||
@Description("Sets the resolution at which to sample the image.")
|
|
||||||
private int resolution = 1;
|
|
||||||
@Value("image.name")
|
|
||||||
@Description("Sets the location of the image on the filesystem, relative to the pack root.")
|
|
||||||
private BufferedImage image;
|
|
||||||
@Value("image.align")
|
|
||||||
@Description("Sets the alignment style to use for the image.")
|
|
||||||
private ImageBiomeProvider.Align align;
|
|
||||||
|
|
||||||
public ImageProviderTemplate(Registry<Biome> set) {
|
|
||||||
this.biomes = set;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public BiomeProvider get() {
|
|
||||||
return new ImageBiomeProvider(new HashSet<>(biomes.entries()), image, resolution, align);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -5,14 +5,14 @@
|
|||||||
* reference the LICENSE file in this module's root directory.
|
* reference the LICENSE file in this module's root directory.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
package com.dfsek.terra.addons.biome.image.v2.config;
|
package com.dfsek.terra.addons.biome.image.config;
|
||||||
|
|
||||||
import com.dfsek.tectonic.api.config.template.annotations.Default;
|
import com.dfsek.tectonic.api.config.template.annotations.Default;
|
||||||
import com.dfsek.tectonic.api.config.template.annotations.Description;
|
import com.dfsek.tectonic.api.config.template.annotations.Description;
|
||||||
import com.dfsek.tectonic.api.config.template.annotations.Value;
|
import com.dfsek.tectonic.api.config.template.annotations.Value;
|
||||||
import com.dfsek.tectonic.api.config.template.object.ObjectTemplate;
|
import com.dfsek.tectonic.api.config.template.object.ObjectTemplate;
|
||||||
|
|
||||||
import com.dfsek.terra.addons.biome.image.v2.ImageBiomeProvider;
|
import com.dfsek.terra.addons.biome.image.ImageBiomeProvider;
|
||||||
import com.dfsek.terra.addons.image.colorsampler.ColorSampler;
|
import com.dfsek.terra.addons.image.colorsampler.ColorSampler;
|
||||||
import com.dfsek.terra.addons.image.converter.ColorConverter;
|
import com.dfsek.terra.addons.image.converter.ColorConverter;
|
||||||
import com.dfsek.terra.api.world.biome.Biome;
|
import com.dfsek.terra.api.world.biome.Biome;
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
package com.dfsek.terra.addons.biome.image.v2.config.converter;
|
package com.dfsek.terra.addons.biome.image.config.converter;
|
||||||
|
|
||||||
import com.dfsek.tectonic.api.config.template.annotations.Value;
|
import com.dfsek.tectonic.api.config.template.annotations.Value;
|
||||||
|
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
package com.dfsek.terra.addons.biome.image.v2.config.converter;
|
package com.dfsek.terra.addons.biome.image.config.converter;
|
||||||
|
|
||||||
import com.dfsek.tectonic.api.config.template.annotations.Default;
|
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.annotations.Value;
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
package com.dfsek.terra.addons.biome.image.v2.config.converter.mapping;
|
package com.dfsek.terra.addons.biome.image.config.converter.mapping;
|
||||||
|
|
||||||
import com.dfsek.tectonic.api.config.template.annotations.Value;
|
import com.dfsek.tectonic.api.config.template.annotations.Value;
|
||||||
import com.dfsek.tectonic.api.config.template.object.ObjectTemplate;
|
import com.dfsek.tectonic.api.config.template.object.ObjectTemplate;
|
||||||
@@ -9,4 +9,6 @@ website:
|
|||||||
issues: https://github.com/PolyhedralDev/Terra/issues
|
issues: https://github.com/PolyhedralDev/Terra/issues
|
||||||
source: https://github.com/PolyhedralDev/Terra
|
source: https://github.com/PolyhedralDev/Terra
|
||||||
docs: https://terra.polydev.org
|
docs: https://terra.polydev.org
|
||||||
license: MIT License
|
license: MIT License
|
||||||
|
depends:
|
||||||
|
library-image: "1.+"
|
||||||
|
|||||||
@@ -1,21 +0,0 @@
|
|||||||
MIT License
|
|
||||||
|
|
||||||
Copyright (c) 2020-2025 Polyhedral Development
|
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
of this software and associated documentation files (the "Software"), to deal
|
|
||||||
in the Software without restriction, including without limitation the rights
|
|
||||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
||||||
copies of the Software, and to permit persons to whom the Software is
|
|
||||||
furnished to do so, subject to the following conditions:
|
|
||||||
|
|
||||||
The above copyright notice and this permission notice shall be included in all
|
|
||||||
copies or substantial portions of the Software.
|
|
||||||
|
|
||||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
||||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
||||||
SOFTWARE.
|
|
||||||
@@ -1,12 +0,0 @@
|
|||||||
# biome-provider-pipeline-2
|
|
||||||
|
|
||||||
The second version of the Biome Pipeline, a procedural biome provider that uses a series
|
|
||||||
of "stages" to apply "mutations" to a 2D grid of biomes.
|
|
||||||
|
|
||||||
Version 2 is a re-implementation of the original addon with the primary goal of providing
|
|
||||||
consistent scaling for noise relative to the world
|
|
||||||
(See https://github.com/PolyhedralDev/Terra/issues/264 for more details), and has been
|
|
||||||
included as a separate addon to maintain parity with packs utilizing the first version.
|
|
||||||
|
|
||||||
This addon registers the `PIPELINE` biome provider type, and all associated
|
|
||||||
configurations.
|
|
||||||
@@ -1,5 +0,0 @@
|
|||||||
version = version("1.0.1")
|
|
||||||
|
|
||||||
dependencies {
|
|
||||||
compileOnlyApi(project(":common:addons:manifest-addon-loader"))
|
|
||||||
}
|
|
||||||
@@ -1,89 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (c) 2020-2025 Polyhedral Development
|
|
||||||
*
|
|
||||||
* The Terra Core Addons are licensed under the terms of the MIT License. For more details,
|
|
||||||
* reference the LICENSE file in this module's root directory.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package com.dfsek.terra.addons.biome.pipeline.v2;
|
|
||||||
|
|
||||||
import com.dfsek.tectonic.api.config.template.object.ObjectTemplate;
|
|
||||||
|
|
||||||
import java.util.function.Supplier;
|
|
||||||
|
|
||||||
import com.dfsek.terra.addons.biome.pipeline.v2.api.Source;
|
|
||||||
import com.dfsek.terra.addons.biome.pipeline.v2.api.Stage;
|
|
||||||
import com.dfsek.terra.addons.biome.pipeline.v2.api.biome.PipelineBiome;
|
|
||||||
import com.dfsek.terra.addons.biome.pipeline.v2.config.BiomePipelineTemplate;
|
|
||||||
import com.dfsek.terra.addons.biome.pipeline.v2.config.PipelineBiomeLoader;
|
|
||||||
import com.dfsek.terra.addons.biome.pipeline.v2.config.source.SamplerSourceTemplate;
|
|
||||||
import com.dfsek.terra.addons.biome.pipeline.v2.config.stage.expander.ExpanderStageTemplate;
|
|
||||||
import com.dfsek.terra.addons.biome.pipeline.v2.config.stage.mutator.BorderListStageTemplate;
|
|
||||||
import com.dfsek.terra.addons.biome.pipeline.v2.config.stage.mutator.BorderStageTemplate;
|
|
||||||
import com.dfsek.terra.addons.biome.pipeline.v2.config.stage.mutator.ReplaceListStageTemplate;
|
|
||||||
import com.dfsek.terra.addons.biome.pipeline.v2.config.stage.mutator.ReplaceStageTemplate;
|
|
||||||
import com.dfsek.terra.addons.biome.pipeline.v2.config.stage.mutator.SmoothStageTemplate;
|
|
||||||
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.pack.ConfigPackPostLoadEvent;
|
|
||||||
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.registry.Registry;
|
|
||||||
import com.dfsek.terra.api.util.reflection.TypeKey;
|
|
||||||
import com.dfsek.terra.api.world.biome.Biome;
|
|
||||||
import com.dfsek.terra.api.world.biome.generation.BiomeProvider;
|
|
||||||
|
|
||||||
|
|
||||||
public class BiomePipelineAddon implements AddonInitializer {
|
|
||||||
|
|
||||||
public static final TypeKey<Supplier<ObjectTemplate<Source>>> SOURCE_REGISTRY_KEY = new TypeKey<>() {
|
|
||||||
};
|
|
||||||
|
|
||||||
public static final TypeKey<Supplier<ObjectTemplate<Stage>>> STAGE_REGISTRY_KEY = new TypeKey<>() {
|
|
||||||
};
|
|
||||||
public static final TypeKey<Supplier<ObjectTemplate<BiomeProvider>>> PROVIDER_REGISTRY_KEY = new TypeKey<>() {
|
|
||||||
};
|
|
||||||
@Inject
|
|
||||||
private Platform platform;
|
|
||||||
|
|
||||||
@Inject
|
|
||||||
private BaseAddon addon;
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void initialize() {
|
|
||||||
platform.getEventManager()
|
|
||||||
.getHandler(FunctionalEventHandler.class)
|
|
||||||
.register(addon, ConfigPackPreLoadEvent.class)
|
|
||||||
.then(event -> {
|
|
||||||
CheckedRegistry<Supplier<ObjectTemplate<BiomeProvider>>> providerRegistry = event.getPack().getOrCreateRegistry(
|
|
||||||
PROVIDER_REGISTRY_KEY);
|
|
||||||
providerRegistry.register(addon.key("PIPELINE"), BiomePipelineTemplate::new);
|
|
||||||
})
|
|
||||||
.then(event -> {
|
|
||||||
CheckedRegistry<Supplier<ObjectTemplate<Source>>> sourceRegistry = event.getPack().getOrCreateRegistry(
|
|
||||||
SOURCE_REGISTRY_KEY);
|
|
||||||
sourceRegistry.register(addon.key("SAMPLER"), SamplerSourceTemplate::new);
|
|
||||||
})
|
|
||||||
.then(event -> {
|
|
||||||
CheckedRegistry<Supplier<ObjectTemplate<Stage>>> stageRegistry = event.getPack().getOrCreateRegistry(
|
|
||||||
STAGE_REGISTRY_KEY);
|
|
||||||
stageRegistry.register(addon.key("FRACTAL_EXPAND"), ExpanderStageTemplate::new);
|
|
||||||
stageRegistry.register(addon.key("SMOOTH"), SmoothStageTemplate::new);
|
|
||||||
stageRegistry.register(addon.key("REPLACE"), ReplaceStageTemplate::new);
|
|
||||||
stageRegistry.register(addon.key("REPLACE_LIST"), ReplaceListStageTemplate::new);
|
|
||||||
stageRegistry.register(addon.key("BORDER"), BorderStageTemplate::new);
|
|
||||||
stageRegistry.register(addon.key("BORDER_LIST"), BorderListStageTemplate::new);
|
|
||||||
})
|
|
||||||
.failThrough();
|
|
||||||
platform.getEventManager()
|
|
||||||
.getHandler(FunctionalEventHandler.class)
|
|
||||||
.register(addon, ConfigPackPostLoadEvent.class)
|
|
||||||
.then(event -> {
|
|
||||||
Registry<Biome> biomeRegistry = event.getPack().getRegistry(Biome.class);
|
|
||||||
event.getPack().applyLoader(PipelineBiome.class, new PipelineBiomeLoader(biomeRegistry));
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,71 +0,0 @@
|
|||||||
package com.dfsek.terra.addons.biome.pipeline.v2;
|
|
||||||
|
|
||||||
import java.util.function.Consumer;
|
|
||||||
|
|
||||||
import com.dfsek.terra.api.util.Column;
|
|
||||||
import com.dfsek.terra.api.util.function.IntIntObjConsumer;
|
|
||||||
import com.dfsek.terra.api.util.function.IntObjConsumer;
|
|
||||||
import com.dfsek.terra.api.world.biome.Biome;
|
|
||||||
import com.dfsek.terra.api.world.biome.generation.BiomeProvider;
|
|
||||||
|
|
||||||
|
|
||||||
public class BiomePipelineColumn implements Column<Biome> {
|
|
||||||
private final int min;
|
|
||||||
private final int max;
|
|
||||||
|
|
||||||
private final int x;
|
|
||||||
private final int z;
|
|
||||||
private final Biome biome;
|
|
||||||
|
|
||||||
protected BiomePipelineColumn(BiomeProvider biomeProvider, int min, int max, int x, int z, long seed) {
|
|
||||||
this.min = min;
|
|
||||||
this.max = max;
|
|
||||||
this.x = x;
|
|
||||||
this.z = z;
|
|
||||||
this.biome = biomeProvider.getBiome(x, 0, z, seed);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public int getMinY() {
|
|
||||||
return min;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public int getMaxY() {
|
|
||||||
return max;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public int getX() {
|
|
||||||
return x;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public int getZ() {
|
|
||||||
return z;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Biome get(int y) {
|
|
||||||
return biome;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void forRanges(int resolution, IntIntObjConsumer<Biome> consumer) {
|
|
||||||
consumer.accept(min, max, biome);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void forEach(Consumer<Biome> consumer) {
|
|
||||||
for(int y = min; y < max; y++) {
|
|
||||||
consumer.accept(biome);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void forEach(IntObjConsumer<Biome> consumer) {
|
|
||||||
for(int y = min; y < max; y++) {
|
|
||||||
consumer.accept(y, biome);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,10 +0,0 @@
|
|||||||
package com.dfsek.terra.addons.biome.pipeline.v2.api;
|
|
||||||
|
|
||||||
|
|
||||||
import com.dfsek.terra.addons.biome.pipeline.v2.api.biome.PipelineBiome;
|
|
||||||
|
|
||||||
|
|
||||||
public interface BiomeChunk {
|
|
||||||
|
|
||||||
PipelineBiome get(int xInChunk, int zInChunk);
|
|
||||||
}
|
|
||||||
@@ -1,11 +0,0 @@
|
|||||||
package com.dfsek.terra.addons.biome.pipeline.v2.api;
|
|
||||||
|
|
||||||
|
|
||||||
import com.dfsek.terra.addons.biome.pipeline.v2.api.biome.PipelineBiome;
|
|
||||||
|
|
||||||
|
|
||||||
public interface Source {
|
|
||||||
PipelineBiome get(long seed, int x, int z);
|
|
||||||
|
|
||||||
Iterable<PipelineBiome> getBiomes();
|
|
||||||
}
|
|
||||||
@@ -1,15 +0,0 @@
|
|||||||
package com.dfsek.terra.addons.biome.pipeline.v2.api;
|
|
||||||
|
|
||||||
import com.dfsek.terra.addons.biome.pipeline.v2.api.biome.PipelineBiome;
|
|
||||||
import com.dfsek.terra.addons.biome.pipeline.v2.pipeline.BiomeChunkImpl.ViewPoint;
|
|
||||||
|
|
||||||
|
|
||||||
public interface Stage {
|
|
||||||
PipelineBiome apply(ViewPoint viewPoint);
|
|
||||||
|
|
||||||
int maxRelativeReadDistance();
|
|
||||||
|
|
||||||
default Iterable<PipelineBiome> getBiomes(Iterable<PipelineBiome> biomes) {
|
|
||||||
return biomes;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,55 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (c) 2020-2025 Polyhedral Development
|
|
||||||
*
|
|
||||||
* The Terra Core Addons are licensed under the terms of the MIT License. For more details,
|
|
||||||
* reference the LICENSE file in this module's root directory.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package com.dfsek.terra.addons.biome.pipeline.v2.config;
|
|
||||||
|
|
||||||
import com.dfsek.tectonic.api.config.template.annotations.Default;
|
|
||||||
import com.dfsek.tectonic.api.config.template.annotations.Description;
|
|
||||||
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.biome.pipeline.v2.PipelineBiomeProvider;
|
|
||||||
import com.dfsek.terra.addons.biome.pipeline.v2.api.Source;
|
|
||||||
import com.dfsek.terra.addons.biome.pipeline.v2.api.Stage;
|
|
||||||
import com.dfsek.terra.addons.biome.pipeline.v2.pipeline.PipelineImpl;
|
|
||||||
import com.dfsek.terra.api.config.meta.Meta;
|
|
||||||
import com.dfsek.terra.api.noise.NoiseSampler;
|
|
||||||
import com.dfsek.terra.api.world.biome.generation.BiomeProvider;
|
|
||||||
|
|
||||||
|
|
||||||
@SuppressWarnings({ "FieldMayBeFinal", "unused" })
|
|
||||||
public class BiomePipelineTemplate implements ObjectTemplate<BiomeProvider> {
|
|
||||||
@Value("resolution")
|
|
||||||
@Default
|
|
||||||
@Description("""
|
|
||||||
The resolution at which to sample biomes.
|
|
||||||
|
|
||||||
Larger values are quadratically faster, but produce lower quality results.
|
|
||||||
For example, a value of 3 would sample every 3 blocks.""")
|
|
||||||
protected @Meta int resolution = 1;
|
|
||||||
@Value("blend.sampler")
|
|
||||||
@Default
|
|
||||||
@Description("A sampler to use for blending the edges of biomes via domain warping.")
|
|
||||||
protected @Meta NoiseSampler blendSampler = NoiseSampler.zero();
|
|
||||||
@Value("blend.amplitude")
|
|
||||||
@Default
|
|
||||||
@Description("The amplitude at which to perform blending.")
|
|
||||||
protected @Meta double blendAmplitude = 0d;
|
|
||||||
@Value("pipeline.source")
|
|
||||||
@Description("The Biome Source to use for initial population of biomes.")
|
|
||||||
private @Meta Source source;
|
|
||||||
@Value("pipeline.stages")
|
|
||||||
@Description("A list of pipeline stages to apply to the result of #source")
|
|
||||||
private @Meta List<@Meta Stage> stages;
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public BiomeProvider get() {
|
|
||||||
return new PipelineBiomeProvider(new PipelineImpl(source, stages, resolution, 128), resolution, blendSampler, blendAmplitude);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,23 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (c) 2020-2025 Polyhedral Development
|
|
||||||
*
|
|
||||||
* The Terra Core Addons are licensed under the terms of the MIT License. For more details,
|
|
||||||
* reference the LICENSE file in this module's root directory.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package com.dfsek.terra.addons.biome.pipeline.v2.config.stage;
|
|
||||||
|
|
||||||
import com.dfsek.tectonic.api.config.template.annotations.Description;
|
|
||||||
import com.dfsek.tectonic.api.config.template.annotations.Value;
|
|
||||||
import com.dfsek.tectonic.api.config.template.object.ObjectTemplate;
|
|
||||||
|
|
||||||
import com.dfsek.terra.addons.biome.pipeline.v2.api.Stage;
|
|
||||||
import com.dfsek.terra.api.config.meta.Meta;
|
|
||||||
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 NoiseSampler noise;
|
|
||||||
}
|
|
||||||
@@ -1,20 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (c) 2020-2025 Polyhedral Development
|
|
||||||
*
|
|
||||||
* The Terra Core Addons are licensed under the terms of the MIT License. For more details,
|
|
||||||
* reference the LICENSE file in this module's root directory.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package com.dfsek.terra.addons.biome.pipeline.v2.config.stage.expander;
|
|
||||||
|
|
||||||
import com.dfsek.terra.addons.biome.pipeline.v2.api.Expander;
|
|
||||||
import com.dfsek.terra.addons.biome.pipeline.v2.config.stage.StageTemplate;
|
|
||||||
import com.dfsek.terra.addons.biome.pipeline.v2.stage.expander.FractalExpander;
|
|
||||||
|
|
||||||
|
|
||||||
public class ExpanderStageTemplate extends StageTemplate {
|
|
||||||
@Override
|
|
||||||
public Expander get() {
|
|
||||||
return new FractalExpander(noise);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,20 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (c) 2020-2025 Polyhedral Development
|
|
||||||
*
|
|
||||||
* The Terra Core Addons are licensed under the terms of the MIT License. For more details,
|
|
||||||
* reference the LICENSE file in this module's root directory.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package com.dfsek.terra.addons.biome.pipeline.v2.config.stage.mutator;
|
|
||||||
|
|
||||||
import com.dfsek.terra.addons.biome.pipeline.v2.api.Stage;
|
|
||||||
import com.dfsek.terra.addons.biome.pipeline.v2.config.stage.StageTemplate;
|
|
||||||
import com.dfsek.terra.addons.biome.pipeline.v2.stage.mutators.SmoothStage;
|
|
||||||
|
|
||||||
|
|
||||||
public class SmoothStageTemplate extends StageTemplate {
|
|
||||||
@Override
|
|
||||||
public Stage get() {
|
|
||||||
return new SmoothStage(noise);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,27 +0,0 @@
|
|||||||
package com.dfsek.terra.addons.biome.pipeline.v2.source;
|
|
||||||
|
|
||||||
import com.dfsek.terra.addons.biome.pipeline.v2.api.Source;
|
|
||||||
import com.dfsek.terra.addons.biome.pipeline.v2.api.biome.PipelineBiome;
|
|
||||||
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 NoiseSampler sampler;
|
|
||||||
|
|
||||||
public SamplerSource(ProbabilityCollection<PipelineBiome> biomes, NoiseSampler sampler) {
|
|
||||||
this.biomes = biomes;
|
|
||||||
this.sampler = sampler;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public PipelineBiome get(long seed, int x, int z) {
|
|
||||||
return biomes.get(sampler, x, z, seed);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Iterable<PipelineBiome> getBiomes() {
|
|
||||||
return biomes.getContents();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,12 +0,0 @@
|
|||||||
schema-version: 1
|
|
||||||
contributors:
|
|
||||||
- Terra contributors
|
|
||||||
id: biome-provider-pipeline-v2
|
|
||||||
version: @VERSION@
|
|
||||||
entrypoints:
|
|
||||||
- "com.dfsek.terra.addons.biome.pipeline.v2.BiomePipelineAddon"
|
|
||||||
website:
|
|
||||||
issues: https://github.com/PolyhedralDev/Terra/issues
|
|
||||||
source: https://github.com/PolyhedralDev/Terra
|
|
||||||
docs: https://terra.polydev.org
|
|
||||||
license: MIT License
|
|
||||||
@@ -1,7 +1,12 @@
|
|||||||
# biome-provider-pipeline
|
# biome-provider-pipeline-2
|
||||||
|
|
||||||
Implements the Biome Pipeline, a procedural biome provider that uses a series
|
The second version of the Biome Pipeline, a procedural biome provider that uses a series
|
||||||
of "stages" to apply "mutations" to a 2D grid of biomes.
|
of "stages" to apply "mutations" to a 2D grid of biomes.
|
||||||
|
|
||||||
|
Version 2 is a re-implementation of the original addon with the primary goal of providing
|
||||||
|
consistent scaling for noise relative to the world
|
||||||
|
(See https://github.com/PolyhedralDev/Terra/issues/264 for more details), and has been
|
||||||
|
included as a separate addon to maintain parity with packs utilizing the first version.
|
||||||
|
|
||||||
This addon registers the `PIPELINE` biome provider type, and all associated
|
This addon registers the `PIPELINE` biome provider type, and all associated
|
||||||
configurations.
|
configurations.
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
version = version("1.0.2")
|
version = version("2.0.0")
|
||||||
|
|
||||||
dependencies {
|
dependencies {
|
||||||
compileOnlyApi(project(":common:addons:manifest-addon-loader"))
|
compileOnlyApi(project(":common:addons:manifest-addon-loader"))
|
||||||
}
|
}
|
||||||
@@ -1,94 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (c) 2020-2025 Polyhedral Development
|
|
||||||
*
|
|
||||||
* The Terra Core Addons are licensed under the terms of the MIT License. For more details,
|
|
||||||
* reference the LICENSE file in this module's root directory.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package com.dfsek.terra.addons.biome.pipeline;
|
|
||||||
|
|
||||||
import com.dfsek.terra.addons.biome.pipeline.api.BiomeHolder;
|
|
||||||
import com.dfsek.terra.addons.biome.pipeline.api.delegate.BiomeDelegate;
|
|
||||||
import com.dfsek.terra.addons.biome.pipeline.api.stage.type.BiomeExpander;
|
|
||||||
import com.dfsek.terra.addons.biome.pipeline.api.stage.type.BiomeMutator;
|
|
||||||
import com.dfsek.terra.addons.biome.pipeline.source.BiomeSource;
|
|
||||||
import com.dfsek.terra.api.util.vector.Vector2;
|
|
||||||
|
|
||||||
|
|
||||||
public class BiomeHolderImpl implements BiomeHolder {
|
|
||||||
private final Vector2.Mutable origin;
|
|
||||||
private final int width;
|
|
||||||
private final int offset;
|
|
||||||
private BiomeDelegate[][] biomes;
|
|
||||||
|
|
||||||
public BiomeHolderImpl(int width, Vector2.Mutable origin) {
|
|
||||||
width += 4;
|
|
||||||
this.width = width;
|
|
||||||
biomes = new BiomeDelegate[width][width];
|
|
||||||
this.origin = origin;
|
|
||||||
this.offset = 2;
|
|
||||||
}
|
|
||||||
|
|
||||||
private BiomeHolderImpl(BiomeDelegate[][] biomes, Vector2.Mutable origin, int width, int offset) {
|
|
||||||
this.biomes = biomes;
|
|
||||||
this.origin = origin;
|
|
||||||
this.width = width;
|
|
||||||
this.offset = 2 * offset;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public BiomeHolder expand(BiomeExpander expander, long seed) {
|
|
||||||
BiomeDelegate[][] old = biomes;
|
|
||||||
int newWidth = width * 2 - 1;
|
|
||||||
|
|
||||||
biomes = new BiomeDelegate[newWidth][newWidth];
|
|
||||||
|
|
||||||
for(int x = 0; x < width; x++) {
|
|
||||||
for(int z = 0; z < width; z++) {
|
|
||||||
biomes[x * 2][z * 2] = old[x][z];
|
|
||||||
if(z != width - 1)
|
|
||||||
biomes[x * 2][z * 2 + 1] = expander.getBetween(x + origin.getX(), z + 1 + origin.getZ(), seed, old[x][z],
|
|
||||||
old[x][z + 1]);
|
|
||||||
if(x != width - 1)
|
|
||||||
biomes[x * 2 + 1][z * 2] = expander.getBetween(x + 1 + origin.getX(), z + origin.getZ(), seed, old[x][z],
|
|
||||||
old[x + 1][z]);
|
|
||||||
if(x != width - 1 && z != width - 1)
|
|
||||||
biomes[x * 2 + 1][z * 2 + 1] = expander.getBetween(x + 1 + origin.getX(), z + 1 + origin.getZ(), seed, old[x][z],
|
|
||||||
old[x + 1][z + 1], old[x][z + 1], old[x + 1][z]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return new BiomeHolderImpl(biomes, origin.setX(origin.getX() * 2 - 1).setZ(origin.getZ() * 2 - 1), newWidth, offset);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void mutate(BiomeMutator mutator, long seed) {
|
|
||||||
for(int x = 0; x < width; x++) {
|
|
||||||
for(int z = 0; z < width; z++) {
|
|
||||||
BiomeMutator.ViewPoint viewPoint = new BiomeMutator.ViewPoint(this, x, z);
|
|
||||||
biomes[x][z] = mutator.mutate(viewPoint, x + origin.getX(), z + origin.getZ(), seed);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void fill(BiomeSource source, long seed) {
|
|
||||||
for(int x = 0; x < width; x++) {
|
|
||||||
for(int z = 0; z < width; z++) {
|
|
||||||
biomes[x][z] = source.getBiome(origin.getX() + x, origin.getZ() + z, seed);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public BiomeDelegate getBiome(int x, int z) {
|
|
||||||
x += offset;
|
|
||||||
z += offset;
|
|
||||||
return getBiomeRaw(x, z);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public BiomeDelegate getBiomeRaw(int x, int z) {
|
|
||||||
if(x >= width || z >= width || x < 0 || z < 0) return null;
|
|
||||||
return biomes[x][z];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,83 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (c) 2020-2025 Polyhedral Development
|
|
||||||
*
|
|
||||||
* The Terra Core Addons are licensed under the terms of the MIT License. For more details,
|
|
||||||
* reference the LICENSE file in this module's root directory.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package com.dfsek.terra.addons.biome.pipeline;
|
|
||||||
|
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.Collections;
|
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
import com.dfsek.terra.addons.biome.pipeline.api.BiomeHolder;
|
|
||||||
import com.dfsek.terra.addons.biome.pipeline.api.stage.Stage;
|
|
||||||
import com.dfsek.terra.addons.biome.pipeline.source.BiomeSource;
|
|
||||||
import com.dfsek.terra.api.util.vector.Vector2;
|
|
||||||
|
|
||||||
|
|
||||||
public class BiomePipeline {
|
|
||||||
private final BiomeSource source;
|
|
||||||
private final List<Stage> stages;
|
|
||||||
private final int size;
|
|
||||||
private final int init;
|
|
||||||
|
|
||||||
private BiomePipeline(BiomeSource source, List<Stage> stages, int size, int init) {
|
|
||||||
this.source = source;
|
|
||||||
this.stages = stages;
|
|
||||||
this.size = size;
|
|
||||||
this.init = init;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Get biomes in a chunk
|
|
||||||
*
|
|
||||||
* @param x Chunk X coord
|
|
||||||
* @param z Chunk Z coord
|
|
||||||
*
|
|
||||||
* @return BiomeHolder containing biomes.
|
|
||||||
*/
|
|
||||||
public BiomeHolder getBiomes(int x, int z, long seed) {
|
|
||||||
BiomeHolder holder = new BiomeHolderImpl(init, Vector2.of(x * (init - 1), z * (init - 1)).mutable());
|
|
||||||
holder.fill(source, seed);
|
|
||||||
for(Stage stage : stages) holder = stage.apply(holder, seed);
|
|
||||||
return holder;
|
|
||||||
}
|
|
||||||
|
|
||||||
public BiomeSource getSource() {
|
|
||||||
return source;
|
|
||||||
}
|
|
||||||
|
|
||||||
public List<Stage> getStages() {
|
|
||||||
return Collections.unmodifiableList(stages);
|
|
||||||
}
|
|
||||||
|
|
||||||
public int getSize() {
|
|
||||||
return size;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static final class BiomePipelineBuilder {
|
|
||||||
private final int init;
|
|
||||||
private final List<Stage> stages = new ArrayList<>();
|
|
||||||
private int expand;
|
|
||||||
|
|
||||||
public BiomePipelineBuilder(int init) {
|
|
||||||
this.init = init;
|
|
||||||
expand = init;
|
|
||||||
}
|
|
||||||
|
|
||||||
public BiomePipeline build(BiomeSource source) {
|
|
||||||
for(Stage stage : stages) {
|
|
||||||
if(stage.isExpansion()) expand = expand * 2 - 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
return new BiomePipeline(source, stages, expand, init);
|
|
||||||
}
|
|
||||||
|
|
||||||
public BiomePipelineBuilder addStage(Stage stage) {
|
|
||||||
stages.add(stage);
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -8,23 +8,21 @@
|
|||||||
package com.dfsek.terra.addons.biome.pipeline;
|
package com.dfsek.terra.addons.biome.pipeline;
|
||||||
|
|
||||||
import com.dfsek.tectonic.api.config.template.object.ObjectTemplate;
|
import com.dfsek.tectonic.api.config.template.object.ObjectTemplate;
|
||||||
import org.slf4j.Logger;
|
|
||||||
import org.slf4j.LoggerFactory;
|
|
||||||
|
|
||||||
import java.util.function.Supplier;
|
import java.util.function.Supplier;
|
||||||
|
|
||||||
import com.dfsek.terra.addons.biome.pipeline.api.delegate.BiomeDelegate;
|
import com.dfsek.terra.addons.biome.pipeline.api.Source;
|
||||||
import com.dfsek.terra.addons.biome.pipeline.api.stage.Stage;
|
import com.dfsek.terra.addons.biome.pipeline.api.Stage;
|
||||||
import com.dfsek.terra.addons.biome.pipeline.config.BiomeDelegateLoader;
|
import com.dfsek.terra.addons.biome.pipeline.api.biome.PipelineBiome;
|
||||||
import com.dfsek.terra.addons.biome.pipeline.config.BiomePipelineTemplate;
|
import com.dfsek.terra.addons.biome.pipeline.config.BiomePipelineTemplate;
|
||||||
import com.dfsek.terra.addons.biome.pipeline.config.SamplerSourceTemplate;
|
import com.dfsek.terra.addons.biome.pipeline.config.PipelineBiomeLoader;
|
||||||
|
import com.dfsek.terra.addons.biome.pipeline.config.source.SamplerSourceTemplate;
|
||||||
import com.dfsek.terra.addons.biome.pipeline.config.stage.expander.ExpanderStageTemplate;
|
import com.dfsek.terra.addons.biome.pipeline.config.stage.expander.ExpanderStageTemplate;
|
||||||
import com.dfsek.terra.addons.biome.pipeline.config.stage.mutator.BorderListMutatorTemplate;
|
import com.dfsek.terra.addons.biome.pipeline.config.stage.mutator.BorderListStageTemplate;
|
||||||
import com.dfsek.terra.addons.biome.pipeline.config.stage.mutator.BorderMutatorTemplate;
|
import com.dfsek.terra.addons.biome.pipeline.config.stage.mutator.BorderStageTemplate;
|
||||||
import com.dfsek.terra.addons.biome.pipeline.config.stage.mutator.ReplaceListMutatorTemplate;
|
import com.dfsek.terra.addons.biome.pipeline.config.stage.mutator.ReplaceListStageTemplate;
|
||||||
import com.dfsek.terra.addons.biome.pipeline.config.stage.mutator.ReplaceMutatorTemplate;
|
import com.dfsek.terra.addons.biome.pipeline.config.stage.mutator.ReplaceStageTemplate;
|
||||||
import com.dfsek.terra.addons.biome.pipeline.config.stage.mutator.SmoothMutatorTemplate;
|
import com.dfsek.terra.addons.biome.pipeline.config.stage.mutator.SmoothStageTemplate;
|
||||||
import com.dfsek.terra.addons.biome.pipeline.source.BiomeSource;
|
|
||||||
import com.dfsek.terra.addons.manifest.api.AddonInitializer;
|
import com.dfsek.terra.addons.manifest.api.AddonInitializer;
|
||||||
import com.dfsek.terra.api.Platform;
|
import com.dfsek.terra.api.Platform;
|
||||||
import com.dfsek.terra.api.addon.BaseAddon;
|
import com.dfsek.terra.api.addon.BaseAddon;
|
||||||
@@ -41,13 +39,13 @@ import com.dfsek.terra.api.world.biome.generation.BiomeProvider;
|
|||||||
|
|
||||||
public class BiomePipelineAddon implements AddonInitializer {
|
public class BiomePipelineAddon implements AddonInitializer {
|
||||||
|
|
||||||
public static final TypeKey<Supplier<ObjectTemplate<BiomeSource>>> SOURCE_REGISTRY_KEY = new TypeKey<>() {
|
public static final TypeKey<Supplier<ObjectTemplate<Source>>> SOURCE_REGISTRY_KEY = new TypeKey<>() {
|
||||||
};
|
};
|
||||||
|
|
||||||
public static final TypeKey<Supplier<ObjectTemplate<Stage>>> STAGE_REGISTRY_KEY = new TypeKey<>() {
|
public static final TypeKey<Supplier<ObjectTemplate<Stage>>> STAGE_REGISTRY_KEY = new TypeKey<>() {
|
||||||
};
|
};
|
||||||
public static final TypeKey<Supplier<ObjectTemplate<BiomeProvider>>> PROVIDER_REGISTRY_KEY = new TypeKey<>() {
|
public static final TypeKey<Supplier<ObjectTemplate<BiomeProvider>>> PROVIDER_REGISTRY_KEY = new TypeKey<>() {
|
||||||
};
|
};
|
||||||
private static final Logger logger = LoggerFactory.getLogger(BiomePipelineAddon.class);
|
|
||||||
@Inject
|
@Inject
|
||||||
private Platform platform;
|
private Platform platform;
|
||||||
|
|
||||||
@@ -65,7 +63,7 @@ public class BiomePipelineAddon implements AddonInitializer {
|
|||||||
providerRegistry.register(addon.key("PIPELINE"), BiomePipelineTemplate::new);
|
providerRegistry.register(addon.key("PIPELINE"), BiomePipelineTemplate::new);
|
||||||
})
|
})
|
||||||
.then(event -> {
|
.then(event -> {
|
||||||
CheckedRegistry<Supplier<ObjectTemplate<BiomeSource>>> sourceRegistry = event.getPack().getOrCreateRegistry(
|
CheckedRegistry<Supplier<ObjectTemplate<Source>>> sourceRegistry = event.getPack().getOrCreateRegistry(
|
||||||
SOURCE_REGISTRY_KEY);
|
SOURCE_REGISTRY_KEY);
|
||||||
sourceRegistry.register(addon.key("SAMPLER"), SamplerSourceTemplate::new);
|
sourceRegistry.register(addon.key("SAMPLER"), SamplerSourceTemplate::new);
|
||||||
})
|
})
|
||||||
@@ -73,11 +71,11 @@ public class BiomePipelineAddon implements AddonInitializer {
|
|||||||
CheckedRegistry<Supplier<ObjectTemplate<Stage>>> stageRegistry = event.getPack().getOrCreateRegistry(
|
CheckedRegistry<Supplier<ObjectTemplate<Stage>>> stageRegistry = event.getPack().getOrCreateRegistry(
|
||||||
STAGE_REGISTRY_KEY);
|
STAGE_REGISTRY_KEY);
|
||||||
stageRegistry.register(addon.key("FRACTAL_EXPAND"), ExpanderStageTemplate::new);
|
stageRegistry.register(addon.key("FRACTAL_EXPAND"), ExpanderStageTemplate::new);
|
||||||
stageRegistry.register(addon.key("SMOOTH"), SmoothMutatorTemplate::new);
|
stageRegistry.register(addon.key("SMOOTH"), SmoothStageTemplate::new);
|
||||||
stageRegistry.register(addon.key("REPLACE"), ReplaceMutatorTemplate::new);
|
stageRegistry.register(addon.key("REPLACE"), ReplaceStageTemplate::new);
|
||||||
stageRegistry.register(addon.key("REPLACE_LIST"), ReplaceListMutatorTemplate::new);
|
stageRegistry.register(addon.key("REPLACE_LIST"), ReplaceListStageTemplate::new);
|
||||||
stageRegistry.register(addon.key("BORDER"), BorderMutatorTemplate::new);
|
stageRegistry.register(addon.key("BORDER"), BorderStageTemplate::new);
|
||||||
stageRegistry.register(addon.key("BORDER_LIST"), BorderListMutatorTemplate::new);
|
stageRegistry.register(addon.key("BORDER_LIST"), BorderListStageTemplate::new);
|
||||||
})
|
})
|
||||||
.failThrough();
|
.failThrough();
|
||||||
platform.getEventManager()
|
platform.getEventManager()
|
||||||
@@ -85,12 +83,7 @@ public class BiomePipelineAddon implements AddonInitializer {
|
|||||||
.register(addon, ConfigPackPostLoadEvent.class)
|
.register(addon, ConfigPackPostLoadEvent.class)
|
||||||
.then(event -> {
|
.then(event -> {
|
||||||
Registry<Biome> biomeRegistry = event.getPack().getRegistry(Biome.class);
|
Registry<Biome> biomeRegistry = event.getPack().getRegistry(Biome.class);
|
||||||
event.getPack().applyLoader(BiomeDelegate.class, new BiomeDelegateLoader(biomeRegistry));
|
event.getPack().applyLoader(PipelineBiome.class, new PipelineBiomeLoader(biomeRegistry));
|
||||||
});
|
});
|
||||||
|
|
||||||
if(platform.getTerraConfig().isDebugLog())
|
|
||||||
logger.warn(
|
|
||||||
"The biome-provider-pipeline addon is deprecated and scheduled for removal in Terra 7.0. It is recommended to use the" +
|
|
||||||
" biome-provider-pipeline-v2 addon for future pack development instead.");
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -9,7 +9,7 @@ import com.dfsek.terra.api.world.biome.Biome;
|
|||||||
import com.dfsek.terra.api.world.biome.generation.BiomeProvider;
|
import com.dfsek.terra.api.world.biome.generation.BiomeProvider;
|
||||||
|
|
||||||
|
|
||||||
class BiomePipelineColumn implements Column<Biome> {
|
public class BiomePipelineColumn implements Column<Biome> {
|
||||||
private final int min;
|
private final int min;
|
||||||
private final int max;
|
private final int max;
|
||||||
|
|
||||||
|
|||||||
@@ -1,130 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (c) 2020-2025 Polyhedral Development
|
|
||||||
*
|
|
||||||
* The Terra Core Addons are licensed under the terms of the MIT License. For more details,
|
|
||||||
* reference the LICENSE file in this module's root directory.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package com.dfsek.terra.addons.biome.pipeline;
|
|
||||||
|
|
||||||
import com.github.benmanes.caffeine.cache.Caffeine;
|
|
||||||
import com.github.benmanes.caffeine.cache.LoadingCache;
|
|
||||||
|
|
||||||
import java.util.Comparator;
|
|
||||||
import java.util.HashSet;
|
|
||||||
import java.util.Optional;
|
|
||||||
import java.util.Set;
|
|
||||||
import java.util.stream.StreamSupport;
|
|
||||||
|
|
||||||
import com.dfsek.terra.addons.biome.pipeline.api.BiomeHolder;
|
|
||||||
import com.dfsek.terra.addons.biome.pipeline.api.delegate.BiomeDelegate;
|
|
||||||
import com.dfsek.terra.addons.biome.pipeline.api.stage.Stage;
|
|
||||||
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;
|
|
||||||
import com.dfsek.terra.api.world.biome.generation.BiomeProvider;
|
|
||||||
|
|
||||||
|
|
||||||
public class BiomePipelineProvider implements BiomeProvider {
|
|
||||||
private final LoadingCache<SeededVector, BiomeHolder> holderCache;
|
|
||||||
private final BiomePipeline pipeline;
|
|
||||||
private final int resolution;
|
|
||||||
private final NoiseSampler mutator;
|
|
||||||
private final double noiseAmp;
|
|
||||||
|
|
||||||
private final Set<Biome> biomes;
|
|
||||||
|
|
||||||
public BiomePipelineProvider(BiomePipeline pipeline, int resolution, NoiseSampler mutator, double noiseAmp) {
|
|
||||||
this.resolution = resolution;
|
|
||||||
this.mutator = mutator;
|
|
||||||
this.noiseAmp = noiseAmp;
|
|
||||||
holderCache = Caffeine.newBuilder()
|
|
||||||
.maximumSize(1024)
|
|
||||||
.build(key -> pipeline.getBiomes(key.x, key.z, key.seed));
|
|
||||||
this.pipeline = pipeline;
|
|
||||||
|
|
||||||
Set<BiomeDelegate> biomeSet = new HashSet<>();
|
|
||||||
pipeline.getSource().getBiomes().forEach(biomeSet::add);
|
|
||||||
Iterable<BiomeDelegate> result = biomeSet;
|
|
||||||
for(Stage stage : pipeline.getStages()) {
|
|
||||||
result = stage.getBiomes(result); // pass through all stages
|
|
||||||
}
|
|
||||||
this.biomes = new HashSet<>();
|
|
||||||
Iterable<BiomeDelegate> finalResult = result;
|
|
||||||
result.forEach(biomeDelegate -> {
|
|
||||||
if(biomeDelegate.isEphemeral()) {
|
|
||||||
|
|
||||||
StringBuilder biomeList = new StringBuilder("\n");
|
|
||||||
StreamSupport.stream(finalResult.spliterator(), false)
|
|
||||||
.sorted(Comparator.comparing(StringIdentifiable::getID))
|
|
||||||
.forEach(delegate -> biomeList
|
|
||||||
.append(" - ")
|
|
||||||
.append(delegate.getID())
|
|
||||||
.append(':')
|
|
||||||
.append(delegate.getClass().getCanonicalName())
|
|
||||||
.append('\n'));
|
|
||||||
throw new IllegalArgumentException("Biome Pipeline leaks ephemeral biome \"" + biomeDelegate.getID() +
|
|
||||||
"\". Ensure there is a stage to guarantee replacement of the ephemeral biome. Biomes: " +
|
|
||||||
biomeList);
|
|
||||||
}
|
|
||||||
this.biomes.add(biomeDelegate.getBiome());
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Biome getBiome(int x, int y, int z, long seed) {
|
|
||||||
return getBiome(x, z, seed);
|
|
||||||
}
|
|
||||||
|
|
||||||
public Biome getBiome(int x, int z, long seed) {
|
|
||||||
x += mutator.noise(seed + 1, x, z) * noiseAmp;
|
|
||||||
z += mutator.noise(seed + 2, x, z) * noiseAmp;
|
|
||||||
|
|
||||||
|
|
||||||
x /= resolution;
|
|
||||||
z /= resolution;
|
|
||||||
|
|
||||||
int fdX = Math.floorDiv(x, pipeline.getSize());
|
|
||||||
int fdZ = Math.floorDiv(z, pipeline.getSize());
|
|
||||||
return holderCache.get(new SeededVector(fdX, fdZ, seed)).getBiome(x - fdX * pipeline.getSize(),
|
|
||||||
z - fdZ * pipeline.getSize()).getBiome();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Optional<Biome> getBaseBiome(int x, int z, long seed) {
|
|
||||||
return Optional.of(getBiome(x, z, seed));
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Iterable<Biome> getBiomes() {
|
|
||||||
return biomes;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Column<Biome> getColumn(int x, int z, long seed, int min, int max) {
|
|
||||||
return new BiomePipelineColumn(this, min, max, x, z, seed);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public int resolution() {
|
|
||||||
return resolution;
|
|
||||||
}
|
|
||||||
|
|
||||||
private record SeededVector(int x, int z, long seed) {
|
|
||||||
@Override
|
|
||||||
public boolean equals(Object obj) {
|
|
||||||
if(obj instanceof SeededVector that) {
|
|
||||||
return this.z == that.z && this.x == that.x && this.seed == that.seed;
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public int hashCode() {
|
|
||||||
int code = x;
|
|
||||||
code = 31 * code + z;
|
|
||||||
return 31 * code + ((int) (seed ^ (seed >>> 32)));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,7 +1,13 @@
|
|||||||
package com.dfsek.terra.addons.biome.pipeline.v2;
|
/*
|
||||||
|
* Copyright (c) 2020-2025 Polyhedral Development
|
||||||
|
*
|
||||||
|
* The Terra Core Addons are licensed under the terms of the MIT License. For more details,
|
||||||
|
* reference the LICENSE file in this module's root directory.
|
||||||
|
*/
|
||||||
|
|
||||||
import com.dfsek.terra.api.util.cache.SeededVector2Key;
|
package com.dfsek.terra.addons.biome.pipeline;
|
||||||
|
|
||||||
|
import com.dfsek.seismic.type.sampler.Sampler;
|
||||||
import com.github.benmanes.caffeine.cache.Caffeine;
|
import com.github.benmanes.caffeine.cache.Caffeine;
|
||||||
import com.github.benmanes.caffeine.cache.LoadingCache;
|
import com.github.benmanes.caffeine.cache.LoadingCache;
|
||||||
|
|
||||||
@@ -11,13 +17,13 @@ import java.util.Optional;
|
|||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
import java.util.stream.StreamSupport;
|
import java.util.stream.StreamSupport;
|
||||||
|
|
||||||
import com.dfsek.terra.addons.biome.pipeline.v2.api.BiomeChunk;
|
import com.dfsek.terra.addons.biome.pipeline.api.BiomeChunk;
|
||||||
import com.dfsek.terra.addons.biome.pipeline.v2.api.Pipeline;
|
import com.dfsek.terra.addons.biome.pipeline.api.Pipeline;
|
||||||
import com.dfsek.terra.addons.biome.pipeline.v2.api.Stage;
|
import com.dfsek.terra.addons.biome.pipeline.api.Stage;
|
||||||
import com.dfsek.terra.addons.biome.pipeline.v2.api.biome.PipelineBiome;
|
import com.dfsek.terra.addons.biome.pipeline.api.biome.PipelineBiome;
|
||||||
import com.dfsek.terra.api.noise.NoiseSampler;
|
|
||||||
import com.dfsek.terra.api.registry.key.StringIdentifiable;
|
import com.dfsek.terra.api.registry.key.StringIdentifiable;
|
||||||
import com.dfsek.terra.api.util.Column;
|
import com.dfsek.terra.api.util.Column;
|
||||||
|
import com.dfsek.terra.api.util.cache.SeededVector2Key;
|
||||||
import com.dfsek.terra.api.world.biome.Biome;
|
import com.dfsek.terra.api.world.biome.Biome;
|
||||||
import com.dfsek.terra.api.world.biome.generation.BiomeProvider;
|
import com.dfsek.terra.api.world.biome.generation.BiomeProvider;
|
||||||
|
|
||||||
@@ -27,11 +33,11 @@ public class PipelineBiomeProvider implements BiomeProvider {
|
|||||||
private final LoadingCache<SeededVector2Key, BiomeChunk> biomeChunkCache;
|
private final LoadingCache<SeededVector2Key, BiomeChunk> biomeChunkCache;
|
||||||
private final int chunkSize;
|
private final int chunkSize;
|
||||||
private final int resolution;
|
private final int resolution;
|
||||||
private final NoiseSampler mutator;
|
private final Sampler mutator;
|
||||||
private final double noiseAmp;
|
private final double noiseAmp;
|
||||||
private final Set<Biome> biomes;
|
private final Set<Biome> biomes;
|
||||||
|
|
||||||
public PipelineBiomeProvider(Pipeline pipeline, int resolution, NoiseSampler mutator, double noiseAmp) {
|
public PipelineBiomeProvider(Pipeline pipeline, int resolution, Sampler mutator, double noiseAmp) {
|
||||||
this.resolution = resolution;
|
this.resolution = resolution;
|
||||||
this.mutator = mutator;
|
this.mutator = mutator;
|
||||||
this.noiseAmp = noiseAmp;
|
this.noiseAmp = noiseAmp;
|
||||||
@@ -76,8 +82,8 @@ public class PipelineBiomeProvider implements BiomeProvider {
|
|||||||
|
|
||||||
public Biome getBiome(int x, int z, long seed) {
|
public Biome getBiome(int x, int z, long seed) {
|
||||||
|
|
||||||
x += mutator.noise(seed + 1, x, z) * noiseAmp;
|
x += (int) (mutator.getSample(seed + 1, x, z) * noiseAmp);
|
||||||
z += mutator.noise(seed + 2, x, z) * noiseAmp;
|
z += (int) (mutator.getSample(seed + 2, x, z) * noiseAmp);
|
||||||
|
|
||||||
x /= resolution;
|
x /= resolution;
|
||||||
z /= resolution;
|
z /= resolution;
|
||||||
@@ -0,0 +1,10 @@
|
|||||||
|
package com.dfsek.terra.addons.biome.pipeline.api;
|
||||||
|
|
||||||
|
|
||||||
|
import com.dfsek.terra.addons.biome.pipeline.api.biome.PipelineBiome;
|
||||||
|
|
||||||
|
|
||||||
|
public interface BiomeChunk {
|
||||||
|
|
||||||
|
PipelineBiome get(int xInChunk, int zInChunk);
|
||||||
|
}
|
||||||
@@ -1,26 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (c) 2020-2025 Polyhedral Development
|
|
||||||
*
|
|
||||||
* The Terra Core Addons are licensed under the terms of the MIT License. For more details,
|
|
||||||
* reference the LICENSE file in this module's root directory.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package com.dfsek.terra.addons.biome.pipeline.api;
|
|
||||||
|
|
||||||
import com.dfsek.terra.addons.biome.pipeline.api.delegate.BiomeDelegate;
|
|
||||||
import com.dfsek.terra.addons.biome.pipeline.api.stage.type.BiomeExpander;
|
|
||||||
import com.dfsek.terra.addons.biome.pipeline.api.stage.type.BiomeMutator;
|
|
||||||
import com.dfsek.terra.addons.biome.pipeline.source.BiomeSource;
|
|
||||||
|
|
||||||
|
|
||||||
public interface BiomeHolder {
|
|
||||||
BiomeHolder expand(BiomeExpander expander, long seed);
|
|
||||||
|
|
||||||
void mutate(BiomeMutator mutator, long seed);
|
|
||||||
|
|
||||||
void fill(BiomeSource source, long seed);
|
|
||||||
|
|
||||||
BiomeDelegate getBiome(int x, int z);
|
|
||||||
|
|
||||||
BiomeDelegate getBiomeRaw(int x, int z);
|
|
||||||
}
|
|
||||||
@@ -1,7 +1,7 @@
|
|||||||
package com.dfsek.terra.addons.biome.pipeline.v2.api;
|
package com.dfsek.terra.addons.biome.pipeline.api;
|
||||||
|
|
||||||
import com.dfsek.terra.addons.biome.pipeline.v2.api.biome.PipelineBiome;
|
import com.dfsek.terra.addons.biome.pipeline.api.biome.PipelineBiome;
|
||||||
import com.dfsek.terra.addons.biome.pipeline.v2.pipeline.BiomeChunkImpl.ViewPoint;
|
import com.dfsek.terra.addons.biome.pipeline.pipeline.BiomeChunkImpl;
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -10,7 +10,7 @@ import com.dfsek.terra.addons.biome.pipeline.v2.pipeline.BiomeChunkImpl.ViewPoin
|
|||||||
*/
|
*/
|
||||||
public interface Expander extends Stage {
|
public interface Expander extends Stage {
|
||||||
|
|
||||||
PipelineBiome fillBiome(ViewPoint viewPoint);
|
PipelineBiome fillBiome(BiomeChunkImpl.ViewPoint viewPoint);
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
default int maxRelativeReadDistance() {
|
default int maxRelativeReadDistance() {
|
||||||
@@ -18,7 +18,7 @@ public interface Expander extends Stage {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
default PipelineBiome apply(ViewPoint viewPoint) {
|
default PipelineBiome apply(BiomeChunkImpl.ViewPoint viewPoint) {
|
||||||
PipelineBiome currentBiome = viewPoint.getBiome();
|
PipelineBiome currentBiome = viewPoint.getBiome();
|
||||||
if(currentBiome == null) {
|
if(currentBiome == null) {
|
||||||
return fillBiome(viewPoint);
|
return fillBiome(viewPoint);
|
||||||
@@ -1,9 +1,9 @@
|
|||||||
package com.dfsek.terra.addons.biome.pipeline.v2.api;
|
package com.dfsek.terra.addons.biome.pipeline.api;
|
||||||
|
|
||||||
import com.dfsek.terra.api.util.cache.SeededVector2Key;
|
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
|
import com.dfsek.terra.api.util.cache.SeededVector2Key;
|
||||||
|
|
||||||
|
|
||||||
public interface Pipeline {
|
public interface Pipeline {
|
||||||
BiomeChunk generateChunk(SeededVector2Key worldCoordinates);
|
BiomeChunk generateChunk(SeededVector2Key worldCoordinates);
|
||||||
@@ -0,0 +1,11 @@
|
|||||||
|
package com.dfsek.terra.addons.biome.pipeline.api;
|
||||||
|
|
||||||
|
|
||||||
|
import com.dfsek.terra.addons.biome.pipeline.api.biome.PipelineBiome;
|
||||||
|
|
||||||
|
|
||||||
|
public interface Source {
|
||||||
|
PipelineBiome get(long seed, int x, int z);
|
||||||
|
|
||||||
|
Iterable<PipelineBiome> getBiomes();
|
||||||
|
}
|
||||||
@@ -0,0 +1,15 @@
|
|||||||
|
package com.dfsek.terra.addons.biome.pipeline.api;
|
||||||
|
|
||||||
|
import com.dfsek.terra.addons.biome.pipeline.api.biome.PipelineBiome;
|
||||||
|
import com.dfsek.terra.addons.biome.pipeline.pipeline.BiomeChunkImpl;
|
||||||
|
|
||||||
|
|
||||||
|
public interface Stage {
|
||||||
|
PipelineBiome apply(BiomeChunkImpl.ViewPoint viewPoint);
|
||||||
|
|
||||||
|
int maxRelativeReadDistance();
|
||||||
|
|
||||||
|
default Iterable<PipelineBiome> getBiomes(Iterable<PipelineBiome> biomes) {
|
||||||
|
return biomes;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
package com.dfsek.terra.addons.biome.pipeline.v2.api.biome;
|
package com.dfsek.terra.addons.biome.pipeline.api.biome;
|
||||||
|
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
|
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
package com.dfsek.terra.addons.biome.pipeline.v2.api.biome;
|
package com.dfsek.terra.addons.biome.pipeline.api.biome;
|
||||||
|
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
|
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
package com.dfsek.terra.addons.biome.pipeline.v2.api.biome;
|
package com.dfsek.terra.addons.biome.pipeline.api.biome;
|
||||||
|
|
||||||
import java.util.HashSet;
|
import java.util.HashSet;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
package com.dfsek.terra.addons.biome.pipeline.v2.api.biome;
|
package com.dfsek.terra.addons.biome.pipeline.api.biome;
|
||||||
|
|
||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
@@ -1,35 +0,0 @@
|
|||||||
package com.dfsek.terra.addons.biome.pipeline.api.delegate;
|
|
||||||
|
|
||||||
import java.util.Set;
|
|
||||||
|
|
||||||
import com.dfsek.terra.api.registry.key.StringIdentifiable;
|
|
||||||
import com.dfsek.terra.api.world.biome.Biome;
|
|
||||||
|
|
||||||
|
|
||||||
public interface BiomeDelegate extends StringIdentifiable {
|
|
||||||
static BiomeDelegate ephemeral(String id) {
|
|
||||||
return new EphemeralBiomeDelegate(id);
|
|
||||||
}
|
|
||||||
|
|
||||||
static BiomeDelegate from(Biome biome) {
|
|
||||||
return new DelegatedBiome(biome);
|
|
||||||
}
|
|
||||||
|
|
||||||
static BiomeDelegate self() {
|
|
||||||
return SelfDelegate.INSTANCE;
|
|
||||||
}
|
|
||||||
|
|
||||||
Biome getBiome();
|
|
||||||
|
|
||||||
Set<String> getTags();
|
|
||||||
|
|
||||||
default boolean isEphemeral() {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
default boolean isSelf() {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -1,40 +0,0 @@
|
|||||||
package com.dfsek.terra.addons.biome.pipeline.api.delegate;
|
|
||||||
|
|
||||||
import java.util.Set;
|
|
||||||
|
|
||||||
import com.dfsek.terra.api.world.biome.Biome;
|
|
||||||
|
|
||||||
|
|
||||||
final class DelegatedBiome implements BiomeDelegate {
|
|
||||||
private final Biome biome;
|
|
||||||
|
|
||||||
public DelegatedBiome(Biome biome) {
|
|
||||||
this.biome = biome;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Biome getBiome() {
|
|
||||||
return biome;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public int hashCode() {
|
|
||||||
return biome.hashCode();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean equals(Object obj) {
|
|
||||||
if(!(obj instanceof DelegatedBiome that)) return false;
|
|
||||||
return that.biome.equals(this.biome);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Set<String> getTags() {
|
|
||||||
return biome.getTags();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String getID() {
|
|
||||||
return biome.getID();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,51 +0,0 @@
|
|||||||
package com.dfsek.terra.addons.biome.pipeline.api.delegate;
|
|
||||||
|
|
||||||
import java.util.HashSet;
|
|
||||||
import java.util.Set;
|
|
||||||
|
|
||||||
import com.dfsek.terra.api.world.biome.Biome;
|
|
||||||
|
|
||||||
|
|
||||||
final class EphemeralBiomeDelegate implements BiomeDelegate {
|
|
||||||
private final Set<String> tags;
|
|
||||||
private final String id;
|
|
||||||
|
|
||||||
public EphemeralBiomeDelegate(String id) {
|
|
||||||
this.id = id;
|
|
||||||
tags = new HashSet<>();
|
|
||||||
tags.add(id);
|
|
||||||
tags.add("ALL");
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Biome getBiome() {
|
|
||||||
throw new UnsupportedOperationException("Cannot get biome from ephemeral delegate");
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Set<String> getTags() {
|
|
||||||
return tags;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String getID() {
|
|
||||||
return id;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean isEphemeral() {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public int hashCode() {
|
|
||||||
return id.hashCode();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean equals(Object obj) {
|
|
||||||
if(!(obj instanceof EphemeralBiomeDelegate that)) return false;
|
|
||||||
|
|
||||||
return this.id.equals(that.id);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,40 +0,0 @@
|
|||||||
package com.dfsek.terra.addons.biome.pipeline.api.delegate;
|
|
||||||
|
|
||||||
import java.util.Collections;
|
|
||||||
import java.util.Set;
|
|
||||||
|
|
||||||
import com.dfsek.terra.api.world.biome.Biome;
|
|
||||||
|
|
||||||
|
|
||||||
final class SelfDelegate implements BiomeDelegate {
|
|
||||||
public static final SelfDelegate INSTANCE = new SelfDelegate();
|
|
||||||
|
|
||||||
private SelfDelegate() {
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Biome getBiome() {
|
|
||||||
throw new UnsupportedOperationException("Cannot get biome from self delegate");
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean isSelf() {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean isEphemeral() {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Set<String> getTags() {
|
|
||||||
return Collections.emptySet();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String getID() {
|
|
||||||
return "SELF";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,20 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (c) 2020-2025 Polyhedral Development
|
|
||||||
*
|
|
||||||
* The Terra Core Addons are licensed under the terms of the MIT License. For more details,
|
|
||||||
* reference the LICENSE file in this module's root directory.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package com.dfsek.terra.addons.biome.pipeline.api.stage;
|
|
||||||
|
|
||||||
import com.dfsek.terra.addons.biome.pipeline.api.BiomeHolder;
|
|
||||||
import com.dfsek.terra.addons.biome.pipeline.api.delegate.BiomeDelegate;
|
|
||||||
|
|
||||||
|
|
||||||
public interface Stage {
|
|
||||||
BiomeHolder apply(BiomeHolder in, long seed);
|
|
||||||
|
|
||||||
boolean isExpansion();
|
|
||||||
|
|
||||||
Iterable<BiomeDelegate> getBiomes(Iterable<BiomeDelegate> biomes);
|
|
||||||
}
|
|
||||||
@@ -1,15 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (c) 2020-2025 Polyhedral Development
|
|
||||||
*
|
|
||||||
* The Terra Core Addons are licensed under the terms of the MIT License. For more details,
|
|
||||||
* reference the LICENSE file in this module's root directory.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package com.dfsek.terra.addons.biome.pipeline.api.stage.type;
|
|
||||||
|
|
||||||
import com.dfsek.terra.addons.biome.pipeline.api.delegate.BiomeDelegate;
|
|
||||||
|
|
||||||
|
|
||||||
public interface BiomeExpander {
|
|
||||||
BiomeDelegate getBetween(double x, double z, long seed, BiomeDelegate... others);
|
|
||||||
}
|
|
||||||
@@ -1,37 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (c) 2020-2025 Polyhedral Development
|
|
||||||
*
|
|
||||||
* The Terra Core Addons are licensed under the terms of the MIT License. For more details,
|
|
||||||
* reference the LICENSE file in this module's root directory.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package com.dfsek.terra.addons.biome.pipeline.api.stage.type;
|
|
||||||
|
|
||||||
import com.dfsek.terra.addons.biome.pipeline.api.BiomeHolder;
|
|
||||||
import com.dfsek.terra.addons.biome.pipeline.api.delegate.BiomeDelegate;
|
|
||||||
|
|
||||||
|
|
||||||
public interface BiomeMutator {
|
|
||||||
BiomeDelegate mutate(ViewPoint viewPoint, double x, double z, long seed);
|
|
||||||
|
|
||||||
default Iterable<BiomeDelegate> getBiomes(Iterable<BiomeDelegate> biomes) {
|
|
||||||
return biomes;
|
|
||||||
}
|
|
||||||
|
|
||||||
class ViewPoint {
|
|
||||||
private final BiomeHolder biomes;
|
|
||||||
private final int offX;
|
|
||||||
private final int offZ;
|
|
||||||
|
|
||||||
public ViewPoint(BiomeHolder biomes, int offX, int offZ) {
|
|
||||||
this.biomes = biomes;
|
|
||||||
this.offX = offX;
|
|
||||||
this.offZ = offZ;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
public BiomeDelegate getBiome(int x, int z) {
|
|
||||||
return biomes.getBiomeRaw(x + offX, z + offZ);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,32 +0,0 @@
|
|||||||
package com.dfsek.terra.addons.biome.pipeline.config;
|
|
||||||
|
|
||||||
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 com.dfsek.terra.addons.biome.pipeline.api.delegate.BiomeDelegate;
|
|
||||||
import com.dfsek.terra.api.registry.Registry;
|
|
||||||
import com.dfsek.terra.api.world.biome.Biome;
|
|
||||||
|
|
||||||
|
|
||||||
public class BiomeDelegateLoader implements TypeLoader<BiomeDelegate> {
|
|
||||||
private final Registry<Biome> biomeRegistry;
|
|
||||||
|
|
||||||
public BiomeDelegateLoader(Registry<Biome> biomeRegistry) {
|
|
||||||
this.biomeRegistry = biomeRegistry;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public BiomeDelegate load(@NotNull AnnotatedType t, @NotNull Object c, @NotNull ConfigLoader loader, DepthTracker depthTracker)
|
|
||||||
throws LoadException {
|
|
||||||
if(c.equals("SELF")) return BiomeDelegate.self();
|
|
||||||
return biomeRegistry
|
|
||||||
.getByID((String) c)
|
|
||||||
.map(BiomeDelegate::from)
|
|
||||||
.orElseGet(() -> BiomeDelegate.ephemeral((String) c));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -7,48 +7,49 @@
|
|||||||
|
|
||||||
package com.dfsek.terra.addons.biome.pipeline.config;
|
package com.dfsek.terra.addons.biome.pipeline.config;
|
||||||
|
|
||||||
|
import com.dfsek.seismic.type.sampler.Sampler;
|
||||||
import com.dfsek.tectonic.api.config.template.annotations.Default;
|
import com.dfsek.tectonic.api.config.template.annotations.Default;
|
||||||
import com.dfsek.tectonic.api.config.template.annotations.Description;
|
import com.dfsek.tectonic.api.config.template.annotations.Description;
|
||||||
import com.dfsek.tectonic.api.config.template.annotations.Value;
|
import com.dfsek.tectonic.api.config.template.annotations.Value;
|
||||||
|
import com.dfsek.tectonic.api.config.template.object.ObjectTemplate;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
import com.dfsek.terra.addons.biome.pipeline.BiomePipeline;
|
import com.dfsek.terra.addons.biome.pipeline.PipelineBiomeProvider;
|
||||||
import com.dfsek.terra.addons.biome.pipeline.BiomePipelineProvider;
|
import com.dfsek.terra.addons.biome.pipeline.api.Source;
|
||||||
import com.dfsek.terra.addons.biome.pipeline.api.stage.Stage;
|
import com.dfsek.terra.addons.biome.pipeline.api.Stage;
|
||||||
import com.dfsek.terra.addons.biome.pipeline.source.BiomeSource;
|
import com.dfsek.terra.addons.biome.pipeline.pipeline.PipelineImpl;
|
||||||
import com.dfsek.terra.api.config.meta.Meta;
|
import com.dfsek.terra.api.config.meta.Meta;
|
||||||
import com.dfsek.terra.api.world.biome.generation.BiomeProvider;
|
import com.dfsek.terra.api.world.biome.generation.BiomeProvider;
|
||||||
|
|
||||||
|
|
||||||
@SuppressWarnings({ "FieldMayBeFinal", "unused" })
|
@SuppressWarnings({ "FieldMayBeFinal", "unused" })
|
||||||
public class BiomePipelineTemplate extends BiomeProviderTemplate {
|
public class BiomePipelineTemplate implements ObjectTemplate<BiomeProvider> {
|
||||||
@Value("pipeline.initial-size")
|
@Value("resolution")
|
||||||
@Default
|
@Default
|
||||||
@Description("""
|
@Description("""
|
||||||
The initial size of biome chunks. This value must be at least 2.
|
The resolution at which to sample biomes.
|
||||||
<b>This is not the final size of biome chunks. Final chunks will be much larger</b>.
|
|
||||||
|
|
||||||
It is recommended to keep biome chunks' final size in the range of [50, 300]
|
Larger values are quadratically faster, but produce lower quality results.
|
||||||
to prevent performance issues. To calculate the size of biome chunks, simply
|
For example, a value of 3 would sample every 3 blocks.""")
|
||||||
take initial-size and for each expand stage, multiply the running value by 2
|
protected @Meta int resolution = 1;
|
||||||
and subtract 1. (The size is also printed to the server console if you
|
@Value("blend.sampler")
|
||||||
have debug mode enabled)""")
|
@Default
|
||||||
private @Meta int initialSize = 2;
|
@Description("A sampler to use for blending the edges of biomes via domain warping.")
|
||||||
|
protected @Meta Sampler blendSampler = Sampler.zero();
|
||||||
|
@Value("blend.amplitude")
|
||||||
|
@Default
|
||||||
|
@Description("The amplitude at which to perform blending.")
|
||||||
|
protected @Meta double blendAmplitude = 0d;
|
||||||
@Value("pipeline.source")
|
@Value("pipeline.source")
|
||||||
@Description("The Biome Source to use for initial population of biomes.")
|
@Description("The Biome Source to use for initial population of biomes.")
|
||||||
private @Meta BiomeSource source;
|
private @Meta Source source;
|
||||||
|
|
||||||
@Value("pipeline.stages")
|
@Value("pipeline.stages")
|
||||||
@Description("A list of pipeline stages to apply to the result of #source")
|
@Description("A list of pipeline stages to apply to the result of #source")
|
||||||
private @Meta List<@Meta Stage> stages;
|
private @Meta List<@Meta Stage> stages;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public BiomeProvider get() {
|
public BiomeProvider get() {
|
||||||
BiomePipeline.BiomePipelineBuilder biomePipelineBuilder = new BiomePipeline.BiomePipelineBuilder(initialSize);
|
return new PipelineBiomeProvider(new PipelineImpl(source, stages, resolution, 128), resolution, blendSampler, blendAmplitude);
|
||||||
stages.forEach(biomePipelineBuilder::addStage);
|
|
||||||
BiomePipeline pipeline = biomePipelineBuilder.build(source);
|
|
||||||
return new BiomePipelineProvider(pipeline, resolution, blend, blendAmp);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,37 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (c) 2020-2025 Polyhedral Development
|
|
||||||
*
|
|
||||||
* The Terra Core Addons are licensed under the terms of the MIT License. For more details,
|
|
||||||
* reference the LICENSE file in this module's root directory.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package com.dfsek.terra.addons.biome.pipeline.config;
|
|
||||||
|
|
||||||
import com.dfsek.tectonic.api.config.template.annotations.Default;
|
|
||||||
import com.dfsek.tectonic.api.config.template.annotations.Description;
|
|
||||||
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.terra.api.noise.NoiseSampler;
|
|
||||||
import com.dfsek.terra.api.world.biome.generation.BiomeProvider;
|
|
||||||
|
|
||||||
|
|
||||||
public abstract class BiomeProviderTemplate implements ObjectTemplate<BiomeProvider> {
|
|
||||||
@Value("resolution")
|
|
||||||
@Default
|
|
||||||
@Description("""
|
|
||||||
The resolution at which to sample biomes.
|
|
||||||
|
|
||||||
Larger values are quadratically faster, but produce lower quality results.
|
|
||||||
For example, a value of 3 would sample every 3 blocks.""")
|
|
||||||
protected @Meta int resolution = 1;
|
|
||||||
@Value("blend.sampler")
|
|
||||||
@Default
|
|
||||||
@Description("A sampler to use for blending the edges of biomes via domain warping.")
|
|
||||||
protected @Meta NoiseSampler blend = NoiseSampler.zero();
|
|
||||||
@Value("blend.amplitude")
|
|
||||||
@Default
|
|
||||||
@Description("The amplitude at which to perform blending.")
|
|
||||||
protected @Meta double blendAmp = 0d;
|
|
||||||
}
|
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
package com.dfsek.terra.addons.biome.pipeline.v2.config;
|
package com.dfsek.terra.addons.biome.pipeline.config;
|
||||||
|
|
||||||
import com.dfsek.tectonic.api.depth.DepthTracker;
|
import com.dfsek.tectonic.api.depth.DepthTracker;
|
||||||
import com.dfsek.tectonic.api.exception.LoadException;
|
import com.dfsek.tectonic.api.exception.LoadException;
|
||||||
@@ -8,7 +8,7 @@ import org.jetbrains.annotations.NotNull;
|
|||||||
|
|
||||||
import java.lang.reflect.AnnotatedType;
|
import java.lang.reflect.AnnotatedType;
|
||||||
|
|
||||||
import com.dfsek.terra.addons.biome.pipeline.v2.api.biome.PipelineBiome;
|
import com.dfsek.terra.addons.biome.pipeline.api.biome.PipelineBiome;
|
||||||
import com.dfsek.terra.api.registry.Registry;
|
import com.dfsek.terra.api.registry.Registry;
|
||||||
import com.dfsek.terra.api.world.biome.Biome;
|
import com.dfsek.terra.api.world.biome.Biome;
|
||||||
|
|
||||||
@@ -1,34 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (c) 2020-2025 Polyhedral Development
|
|
||||||
*
|
|
||||||
* The Terra Core Addons are licensed under the terms of the MIT License. For more details,
|
|
||||||
* reference the LICENSE file in this module's root directory.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package com.dfsek.terra.addons.biome.pipeline.config;
|
|
||||||
|
|
||||||
import com.dfsek.tectonic.api.config.template.annotations.Description;
|
|
||||||
import com.dfsek.tectonic.api.config.template.annotations.Value;
|
|
||||||
|
|
||||||
import com.dfsek.terra.addons.biome.pipeline.api.delegate.BiomeDelegate;
|
|
||||||
import com.dfsek.terra.addons.biome.pipeline.source.BiomeSource;
|
|
||||||
import com.dfsek.terra.addons.biome.pipeline.source.SamplerSource;
|
|
||||||
import com.dfsek.terra.api.config.meta.Meta;
|
|
||||||
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 NoiseSampler noise;
|
|
||||||
|
|
||||||
@Value("biomes")
|
|
||||||
@Description("The biomes to be distributed.")
|
|
||||||
private @Meta ProbabilityCollection<@Meta BiomeDelegate> biomes;
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public BiomeSource get() {
|
|
||||||
return new SamplerSource(biomes, noise);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,17 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (c) 2020-2025 Polyhedral Development
|
|
||||||
*
|
|
||||||
* The Terra Core Addons are licensed under the terms of the MIT License. For more details,
|
|
||||||
* reference the LICENSE file in this module's root directory.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package com.dfsek.terra.addons.biome.pipeline.config;
|
|
||||||
|
|
||||||
import com.dfsek.tectonic.api.config.template.object.ObjectTemplate;
|
|
||||||
|
|
||||||
import com.dfsek.terra.addons.biome.pipeline.source.BiomeSource;
|
|
||||||
|
|
||||||
|
|
||||||
public abstract class SourceTemplate implements ObjectTemplate<BiomeSource> {
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -5,23 +5,23 @@
|
|||||||
* reference the LICENSE file in this module's root directory.
|
* reference the LICENSE file in this module's root directory.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
package com.dfsek.terra.addons.biome.pipeline.v2.config.source;
|
package com.dfsek.terra.addons.biome.pipeline.config.source;
|
||||||
|
|
||||||
|
import com.dfsek.seismic.type.sampler.Sampler;
|
||||||
import com.dfsek.tectonic.api.config.template.annotations.Description;
|
import com.dfsek.tectonic.api.config.template.annotations.Description;
|
||||||
import com.dfsek.tectonic.api.config.template.annotations.Value;
|
import com.dfsek.tectonic.api.config.template.annotations.Value;
|
||||||
|
|
||||||
import com.dfsek.terra.addons.biome.pipeline.v2.api.Source;
|
import com.dfsek.terra.addons.biome.pipeline.api.Source;
|
||||||
import com.dfsek.terra.addons.biome.pipeline.v2.api.biome.PipelineBiome;
|
import com.dfsek.terra.addons.biome.pipeline.api.biome.PipelineBiome;
|
||||||
import com.dfsek.terra.addons.biome.pipeline.v2.source.SamplerSource;
|
import com.dfsek.terra.addons.biome.pipeline.source.SamplerSource;
|
||||||
import com.dfsek.terra.api.config.meta.Meta;
|
import com.dfsek.terra.api.config.meta.Meta;
|
||||||
import com.dfsek.terra.api.noise.NoiseSampler;
|
|
||||||
import com.dfsek.terra.api.util.collection.ProbabilityCollection;
|
import com.dfsek.terra.api.util.collection.ProbabilityCollection;
|
||||||
|
|
||||||
|
|
||||||
public class SamplerSourceTemplate extends SourceTemplate {
|
public class SamplerSourceTemplate extends SourceTemplate {
|
||||||
@Value("sampler")
|
@Value("sampler")
|
||||||
@Description("The sampler used to distribute biomes.")
|
@Description("The sampler used to distribute biomes.")
|
||||||
private @Meta NoiseSampler noise;
|
private @Meta Sampler noise;
|
||||||
|
|
||||||
@Value("biomes")
|
@Value("biomes")
|
||||||
@Description("The biomes to be distributed.")
|
@Description("The biomes to be distributed.")
|
||||||
@@ -5,11 +5,11 @@
|
|||||||
* reference the LICENSE file in this module's root directory.
|
* reference the LICENSE file in this module's root directory.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
package com.dfsek.terra.addons.biome.pipeline.v2.config.source;
|
package com.dfsek.terra.addons.biome.pipeline.config.source;
|
||||||
|
|
||||||
import com.dfsek.tectonic.api.config.template.object.ObjectTemplate;
|
import com.dfsek.tectonic.api.config.template.object.ObjectTemplate;
|
||||||
|
|
||||||
import com.dfsek.terra.addons.biome.pipeline.v2.api.Source;
|
import com.dfsek.terra.addons.biome.pipeline.api.Source;
|
||||||
|
|
||||||
|
|
||||||
public abstract class SourceTemplate implements ObjectTemplate<Source> {
|
public abstract class SourceTemplate implements ObjectTemplate<Source> {
|
||||||
@@ -7,17 +7,17 @@
|
|||||||
|
|
||||||
package com.dfsek.terra.addons.biome.pipeline.config.stage;
|
package com.dfsek.terra.addons.biome.pipeline.config.stage;
|
||||||
|
|
||||||
|
import com.dfsek.seismic.type.sampler.Sampler;
|
||||||
import com.dfsek.tectonic.api.config.template.annotations.Description;
|
import com.dfsek.tectonic.api.config.template.annotations.Description;
|
||||||
import com.dfsek.tectonic.api.config.template.annotations.Value;
|
import com.dfsek.tectonic.api.config.template.annotations.Value;
|
||||||
import com.dfsek.tectonic.api.config.template.object.ObjectTemplate;
|
import com.dfsek.tectonic.api.config.template.object.ObjectTemplate;
|
||||||
|
|
||||||
import com.dfsek.terra.addons.biome.pipeline.api.stage.Stage;
|
import com.dfsek.terra.addons.biome.pipeline.api.Stage;
|
||||||
import com.dfsek.terra.api.config.meta.Meta;
|
import com.dfsek.terra.api.config.meta.Meta;
|
||||||
import com.dfsek.terra.api.noise.NoiseSampler;
|
|
||||||
|
|
||||||
|
|
||||||
public abstract class StageTemplate implements ObjectTemplate<Stage> {
|
public abstract class StageTemplate implements ObjectTemplate<Stage> {
|
||||||
@Value("sampler")
|
@Value("sampler")
|
||||||
@Description("Sampler to use for stage distribution.")
|
@Description("Sampler to use for stage distribution.")
|
||||||
protected @Meta NoiseSampler noise;
|
protected @Meta Sampler noise;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -7,15 +7,14 @@
|
|||||||
|
|
||||||
package com.dfsek.terra.addons.biome.pipeline.config.stage.expander;
|
package com.dfsek.terra.addons.biome.pipeline.config.stage.expander;
|
||||||
|
|
||||||
import com.dfsek.terra.addons.biome.pipeline.api.stage.Stage;
|
import com.dfsek.terra.addons.biome.pipeline.api.Expander;
|
||||||
import com.dfsek.terra.addons.biome.pipeline.config.stage.StageTemplate;
|
import com.dfsek.terra.addons.biome.pipeline.config.stage.StageTemplate;
|
||||||
import com.dfsek.terra.addons.biome.pipeline.expand.FractalExpander;
|
import com.dfsek.terra.addons.biome.pipeline.stage.expander.FractalExpander;
|
||||||
import com.dfsek.terra.addons.biome.pipeline.stages.ExpanderStage;
|
|
||||||
|
|
||||||
|
|
||||||
public class ExpanderStageTemplate extends StageTemplate {
|
public class ExpanderStageTemplate extends StageTemplate {
|
||||||
@Override
|
@Override
|
||||||
public Stage get() {
|
public Expander get() {
|
||||||
return new ExpanderStage(new FractalExpander(noise));
|
return new FractalExpander(noise);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,42 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (c) 2020-2025 Polyhedral Development
|
|
||||||
*
|
|
||||||
* The Terra Core Addons are licensed under the terms of the MIT License. For more details,
|
|
||||||
* reference the LICENSE file in this module's root directory.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package com.dfsek.terra.addons.biome.pipeline.config.stage.mutator;
|
|
||||||
|
|
||||||
import com.dfsek.tectonic.api.config.template.annotations.Value;
|
|
||||||
|
|
||||||
import java.util.Map;
|
|
||||||
|
|
||||||
import com.dfsek.terra.addons.biome.pipeline.api.delegate.BiomeDelegate;
|
|
||||||
import com.dfsek.terra.addons.biome.pipeline.api.stage.Stage;
|
|
||||||
import com.dfsek.terra.addons.biome.pipeline.config.stage.StageTemplate;
|
|
||||||
import com.dfsek.terra.addons.biome.pipeline.mutator.BorderListMutator;
|
|
||||||
import com.dfsek.terra.addons.biome.pipeline.stages.MutatorStage;
|
|
||||||
import com.dfsek.terra.api.config.meta.Meta;
|
|
||||||
import com.dfsek.terra.api.util.collection.ProbabilityCollection;
|
|
||||||
|
|
||||||
|
|
||||||
@SuppressWarnings("unused")
|
|
||||||
public class BorderListMutatorTemplate extends StageTemplate {
|
|
||||||
@Value("from")
|
|
||||||
private @Meta String from;
|
|
||||||
|
|
||||||
@Value("default-replace")
|
|
||||||
private @Meta String defaultReplace;
|
|
||||||
|
|
||||||
@Value("default-to")
|
|
||||||
private @Meta ProbabilityCollection<@Meta BiomeDelegate> defaultTo;
|
|
||||||
|
|
||||||
@Value("replace")
|
|
||||||
private @Meta Map<@Meta BiomeDelegate, @Meta ProbabilityCollection<@Meta BiomeDelegate>> replace;
|
|
||||||
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Stage get() {
|
|
||||||
return new MutatorStage(new BorderListMutator(replace, from, defaultReplace, noise, defaultTo));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -5,16 +5,16 @@
|
|||||||
* reference the LICENSE file in this module's root directory.
|
* reference the LICENSE file in this module's root directory.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
package com.dfsek.terra.addons.biome.pipeline.v2.config.stage.mutator;
|
package com.dfsek.terra.addons.biome.pipeline.config.stage.mutator;
|
||||||
|
|
||||||
import com.dfsek.tectonic.api.config.template.annotations.Value;
|
import com.dfsek.tectonic.api.config.template.annotations.Value;
|
||||||
|
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
import com.dfsek.terra.addons.biome.pipeline.v2.api.Stage;
|
import com.dfsek.terra.addons.biome.pipeline.api.Stage;
|
||||||
import com.dfsek.terra.addons.biome.pipeline.v2.api.biome.PipelineBiome;
|
import com.dfsek.terra.addons.biome.pipeline.api.biome.PipelineBiome;
|
||||||
import com.dfsek.terra.addons.biome.pipeline.v2.config.stage.StageTemplate;
|
import com.dfsek.terra.addons.biome.pipeline.config.stage.StageTemplate;
|
||||||
import com.dfsek.terra.addons.biome.pipeline.v2.stage.mutators.BorderListStage;
|
import com.dfsek.terra.addons.biome.pipeline.stage.mutators.BorderListStage;
|
||||||
import com.dfsek.terra.api.config.meta.Meta;
|
import com.dfsek.terra.api.config.meta.Meta;
|
||||||
import com.dfsek.terra.api.util.collection.ProbabilityCollection;
|
import com.dfsek.terra.api.util.collection.ProbabilityCollection;
|
||||||
|
|
||||||
@@ -1,36 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (c) 2020-2025 Polyhedral Development
|
|
||||||
*
|
|
||||||
* The Terra Core Addons are licensed under the terms of the MIT License. For more details,
|
|
||||||
* reference the LICENSE file in this module's root directory.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package com.dfsek.terra.addons.biome.pipeline.config.stage.mutator;
|
|
||||||
|
|
||||||
import com.dfsek.tectonic.api.config.template.annotations.Value;
|
|
||||||
|
|
||||||
import com.dfsek.terra.addons.biome.pipeline.api.delegate.BiomeDelegate;
|
|
||||||
import com.dfsek.terra.addons.biome.pipeline.api.stage.Stage;
|
|
||||||
import com.dfsek.terra.addons.biome.pipeline.config.stage.StageTemplate;
|
|
||||||
import com.dfsek.terra.addons.biome.pipeline.mutator.BorderMutator;
|
|
||||||
import com.dfsek.terra.addons.biome.pipeline.stages.MutatorStage;
|
|
||||||
import com.dfsek.terra.api.config.meta.Meta;
|
|
||||||
import com.dfsek.terra.api.util.collection.ProbabilityCollection;
|
|
||||||
|
|
||||||
|
|
||||||
@SuppressWarnings("unused")
|
|
||||||
public class BorderMutatorTemplate extends StageTemplate {
|
|
||||||
@Value("from")
|
|
||||||
private @Meta String from;
|
|
||||||
|
|
||||||
@Value("replace")
|
|
||||||
private @Meta String replace;
|
|
||||||
|
|
||||||
@Value("to")
|
|
||||||
private @Meta ProbabilityCollection<@Meta BiomeDelegate> to;
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Stage get() {
|
|
||||||
return new MutatorStage(new BorderMutator(from, replace, noise, to));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -5,14 +5,14 @@
|
|||||||
* reference the LICENSE file in this module's root directory.
|
* reference the LICENSE file in this module's root directory.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
package com.dfsek.terra.addons.biome.pipeline.v2.config.stage.mutator;
|
package com.dfsek.terra.addons.biome.pipeline.config.stage.mutator;
|
||||||
|
|
||||||
import com.dfsek.tectonic.api.config.template.annotations.Value;
|
import com.dfsek.tectonic.api.config.template.annotations.Value;
|
||||||
|
|
||||||
import com.dfsek.terra.addons.biome.pipeline.v2.api.Stage;
|
import com.dfsek.terra.addons.biome.pipeline.api.Stage;
|
||||||
import com.dfsek.terra.addons.biome.pipeline.v2.api.biome.PipelineBiome;
|
import com.dfsek.terra.addons.biome.pipeline.api.biome.PipelineBiome;
|
||||||
import com.dfsek.terra.addons.biome.pipeline.v2.config.stage.StageTemplate;
|
import com.dfsek.terra.addons.biome.pipeline.config.stage.StageTemplate;
|
||||||
import com.dfsek.terra.addons.biome.pipeline.v2.stage.mutators.BorderStage;
|
import com.dfsek.terra.addons.biome.pipeline.stage.mutators.BorderStage;
|
||||||
import com.dfsek.terra.api.config.meta.Meta;
|
import com.dfsek.terra.api.config.meta.Meta;
|
||||||
import com.dfsek.terra.api.util.collection.ProbabilityCollection;
|
import com.dfsek.terra.api.util.collection.ProbabilityCollection;
|
||||||
|
|
||||||
@@ -1,38 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (c) 2020-2025 Polyhedral Development
|
|
||||||
*
|
|
||||||
* The Terra Core Addons are licensed under the terms of the MIT License. For more details,
|
|
||||||
* reference the LICENSE file in this module's root directory.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package com.dfsek.terra.addons.biome.pipeline.config.stage.mutator;
|
|
||||||
|
|
||||||
import com.dfsek.tectonic.api.config.template.annotations.Value;
|
|
||||||
|
|
||||||
import java.util.Map;
|
|
||||||
|
|
||||||
import com.dfsek.terra.addons.biome.pipeline.api.delegate.BiomeDelegate;
|
|
||||||
import com.dfsek.terra.addons.biome.pipeline.api.stage.Stage;
|
|
||||||
import com.dfsek.terra.addons.biome.pipeline.config.stage.StageTemplate;
|
|
||||||
import com.dfsek.terra.addons.biome.pipeline.mutator.ReplaceListMutator;
|
|
||||||
import com.dfsek.terra.addons.biome.pipeline.stages.MutatorStage;
|
|
||||||
import com.dfsek.terra.api.config.meta.Meta;
|
|
||||||
import com.dfsek.terra.api.util.collection.ProbabilityCollection;
|
|
||||||
|
|
||||||
|
|
||||||
@SuppressWarnings("unused")
|
|
||||||
public class ReplaceListMutatorTemplate extends StageTemplate {
|
|
||||||
@Value("default-from")
|
|
||||||
private @Meta String defaultFrom;
|
|
||||||
|
|
||||||
@Value("default-to")
|
|
||||||
private @Meta ProbabilityCollection<@Meta BiomeDelegate> defaultTo;
|
|
||||||
|
|
||||||
@Value("to")
|
|
||||||
private @Meta Map<@Meta BiomeDelegate, @Meta ProbabilityCollection<@Meta BiomeDelegate>> replace;
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Stage get() {
|
|
||||||
return new MutatorStage(new ReplaceListMutator(replace, defaultFrom, defaultTo, noise));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -5,16 +5,16 @@
|
|||||||
* reference the LICENSE file in this module's root directory.
|
* reference the LICENSE file in this module's root directory.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
package com.dfsek.terra.addons.biome.pipeline.v2.config.stage.mutator;
|
package com.dfsek.terra.addons.biome.pipeline.config.stage.mutator;
|
||||||
|
|
||||||
import com.dfsek.tectonic.api.config.template.annotations.Value;
|
import com.dfsek.tectonic.api.config.template.annotations.Value;
|
||||||
|
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
import com.dfsek.terra.addons.biome.pipeline.v2.api.Stage;
|
import com.dfsek.terra.addons.biome.pipeline.api.Stage;
|
||||||
import com.dfsek.terra.addons.biome.pipeline.v2.api.biome.PipelineBiome;
|
import com.dfsek.terra.addons.biome.pipeline.api.biome.PipelineBiome;
|
||||||
import com.dfsek.terra.addons.biome.pipeline.v2.config.stage.StageTemplate;
|
import com.dfsek.terra.addons.biome.pipeline.config.stage.StageTemplate;
|
||||||
import com.dfsek.terra.addons.biome.pipeline.v2.stage.mutators.ReplaceListStage;
|
import com.dfsek.terra.addons.biome.pipeline.stage.mutators.ReplaceListStage;
|
||||||
import com.dfsek.terra.api.config.meta.Meta;
|
import com.dfsek.terra.api.config.meta.Meta;
|
||||||
import com.dfsek.terra.api.util.collection.ProbabilityCollection;
|
import com.dfsek.terra.api.util.collection.ProbabilityCollection;
|
||||||
|
|
||||||
@@ -1,33 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (c) 2020-2025 Polyhedral Development
|
|
||||||
*
|
|
||||||
* The Terra Core Addons are licensed under the terms of the MIT License. For more details,
|
|
||||||
* reference the LICENSE file in this module's root directory.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package com.dfsek.terra.addons.biome.pipeline.config.stage.mutator;
|
|
||||||
|
|
||||||
import com.dfsek.tectonic.api.config.template.annotations.Value;
|
|
||||||
|
|
||||||
import com.dfsek.terra.addons.biome.pipeline.api.delegate.BiomeDelegate;
|
|
||||||
import com.dfsek.terra.addons.biome.pipeline.api.stage.Stage;
|
|
||||||
import com.dfsek.terra.addons.biome.pipeline.config.stage.StageTemplate;
|
|
||||||
import com.dfsek.terra.addons.biome.pipeline.mutator.ReplaceMutator;
|
|
||||||
import com.dfsek.terra.addons.biome.pipeline.stages.MutatorStage;
|
|
||||||
import com.dfsek.terra.api.config.meta.Meta;
|
|
||||||
import com.dfsek.terra.api.util.collection.ProbabilityCollection;
|
|
||||||
|
|
||||||
|
|
||||||
@SuppressWarnings("unused")
|
|
||||||
public class ReplaceMutatorTemplate extends StageTemplate {
|
|
||||||
@Value("from")
|
|
||||||
private @Meta String from;
|
|
||||||
|
|
||||||
@Value("to")
|
|
||||||
private @Meta ProbabilityCollection<@Meta BiomeDelegate> to;
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Stage get() {
|
|
||||||
return new MutatorStage(new ReplaceMutator(from, to, noise));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -5,14 +5,14 @@
|
|||||||
* reference the LICENSE file in this module's root directory.
|
* reference the LICENSE file in this module's root directory.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
package com.dfsek.terra.addons.biome.pipeline.v2.config.stage.mutator;
|
package com.dfsek.terra.addons.biome.pipeline.config.stage.mutator;
|
||||||
|
|
||||||
import com.dfsek.tectonic.api.config.template.annotations.Value;
|
import com.dfsek.tectonic.api.config.template.annotations.Value;
|
||||||
|
|
||||||
import com.dfsek.terra.addons.biome.pipeline.v2.api.Stage;
|
import com.dfsek.terra.addons.biome.pipeline.api.Stage;
|
||||||
import com.dfsek.terra.addons.biome.pipeline.v2.api.biome.PipelineBiome;
|
import com.dfsek.terra.addons.biome.pipeline.api.biome.PipelineBiome;
|
||||||
import com.dfsek.terra.addons.biome.pipeline.v2.config.stage.StageTemplate;
|
import com.dfsek.terra.addons.biome.pipeline.config.stage.StageTemplate;
|
||||||
import com.dfsek.terra.addons.biome.pipeline.v2.stage.mutators.ReplaceStage;
|
import com.dfsek.terra.addons.biome.pipeline.stage.mutators.ReplaceStage;
|
||||||
import com.dfsek.terra.api.config.meta.Meta;
|
import com.dfsek.terra.api.config.meta.Meta;
|
||||||
import com.dfsek.terra.api.util.collection.ProbabilityCollection;
|
import com.dfsek.terra.api.util.collection.ProbabilityCollection;
|
||||||
|
|
||||||
@@ -7,15 +7,14 @@
|
|||||||
|
|
||||||
package com.dfsek.terra.addons.biome.pipeline.config.stage.mutator;
|
package com.dfsek.terra.addons.biome.pipeline.config.stage.mutator;
|
||||||
|
|
||||||
import com.dfsek.terra.addons.biome.pipeline.api.stage.Stage;
|
import com.dfsek.terra.addons.biome.pipeline.api.Stage;
|
||||||
import com.dfsek.terra.addons.biome.pipeline.config.stage.StageTemplate;
|
import com.dfsek.terra.addons.biome.pipeline.config.stage.StageTemplate;
|
||||||
import com.dfsek.terra.addons.biome.pipeline.mutator.SmoothMutator;
|
import com.dfsek.terra.addons.biome.pipeline.stage.mutators.SmoothStage;
|
||||||
import com.dfsek.terra.addons.biome.pipeline.stages.MutatorStage;
|
|
||||||
|
|
||||||
|
|
||||||
public class SmoothMutatorTemplate extends StageTemplate {
|
public class SmoothStageTemplate extends StageTemplate {
|
||||||
@Override
|
@Override
|
||||||
public Stage get() {
|
public Stage get() {
|
||||||
return new MutatorStage(new SmoothMutator(noise));
|
return new SmoothStage(noise);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1,27 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (c) 2020-2025 Polyhedral Development
|
|
||||||
*
|
|
||||||
* The Terra Core Addons are licensed under the terms of the MIT License. For more details,
|
|
||||||
* reference the LICENSE file in this module's root directory.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package com.dfsek.terra.addons.biome.pipeline.expand;
|
|
||||||
|
|
||||||
import com.dfsek.terra.addons.biome.pipeline.api.delegate.BiomeDelegate;
|
|
||||||
import com.dfsek.terra.addons.biome.pipeline.api.stage.type.BiomeExpander;
|
|
||||||
import com.dfsek.terra.api.noise.NoiseSampler;
|
|
||||||
import com.dfsek.terra.api.util.MathUtil;
|
|
||||||
|
|
||||||
|
|
||||||
public class FractalExpander implements BiomeExpander {
|
|
||||||
private final NoiseSampler sampler;
|
|
||||||
|
|
||||||
public FractalExpander(NoiseSampler sampler) {
|
|
||||||
this.sampler = sampler;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public BiomeDelegate getBetween(double x, double z, long seed, BiomeDelegate... others) {
|
|
||||||
return others[MathUtil.normalizeIndex(sampler.noise(seed, x, z), others.length)];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,67 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (c) 2020-2025 Polyhedral Development
|
|
||||||
*
|
|
||||||
* The Terra Core Addons are licensed under the terms of the MIT License. For more details,
|
|
||||||
* reference the LICENSE file in this module's root directory.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package com.dfsek.terra.addons.biome.pipeline.mutator;
|
|
||||||
|
|
||||||
import java.util.HashSet;
|
|
||||||
import java.util.Map;
|
|
||||||
import java.util.Set;
|
|
||||||
import java.util.function.Predicate;
|
|
||||||
|
|
||||||
import com.dfsek.terra.addons.biome.pipeline.api.delegate.BiomeDelegate;
|
|
||||||
import com.dfsek.terra.addons.biome.pipeline.api.stage.type.BiomeMutator;
|
|
||||||
import com.dfsek.terra.api.noise.NoiseSampler;
|
|
||||||
import com.dfsek.terra.api.util.collection.ProbabilityCollection;
|
|
||||||
|
|
||||||
|
|
||||||
public class BorderListMutator implements BiomeMutator {
|
|
||||||
private final String border;
|
|
||||||
private final NoiseSampler noiseSampler;
|
|
||||||
private final ProbabilityCollection<BiomeDelegate> replaceDefault;
|
|
||||||
private final String defaultReplace;
|
|
||||||
private final Map<BiomeDelegate, ProbabilityCollection<BiomeDelegate>> replace;
|
|
||||||
|
|
||||||
public BorderListMutator(Map<BiomeDelegate, ProbabilityCollection<BiomeDelegate>> replace, String border, String defaultReplace,
|
|
||||||
NoiseSampler noiseSampler, ProbabilityCollection<BiomeDelegate> replaceDefault) {
|
|
||||||
this.border = border;
|
|
||||||
this.noiseSampler = noiseSampler;
|
|
||||||
this.replaceDefault = replaceDefault;
|
|
||||||
this.defaultReplace = defaultReplace;
|
|
||||||
this.replace = replace;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public BiomeDelegate mutate(ViewPoint viewPoint, double x, double z, long seed) {
|
|
||||||
BiomeDelegate origin = viewPoint.getBiome(0, 0);
|
|
||||||
if(origin.getTags().contains(defaultReplace)) {
|
|
||||||
for(int xi = -1; xi <= 1; xi++) {
|
|
||||||
for(int zi = -1; zi <= 1; zi++) {
|
|
||||||
if(xi == 0 && zi == 0) continue;
|
|
||||||
BiomeDelegate current = viewPoint.getBiome(xi, zi);
|
|
||||||
if(current != null && current.getTags().contains(border)) {
|
|
||||||
if(replace.containsKey(origin)) {
|
|
||||||
BiomeDelegate biome = replace.get(origin).get(noiseSampler, x, z, seed);
|
|
||||||
return biome.isSelf() ? origin : biome;
|
|
||||||
}
|
|
||||||
BiomeDelegate biome = replaceDefault.get(noiseSampler, x, z, seed);
|
|
||||||
return biome.isSelf() ? origin : biome;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return origin;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Iterable<BiomeDelegate> getBiomes(Iterable<BiomeDelegate> biomes) {
|
|
||||||
Set<BiomeDelegate> biomeSet = new HashSet<>();
|
|
||||||
biomes.forEach(biomeSet::add);
|
|
||||||
biomeSet.addAll(replaceDefault.getContents().stream().filter(Predicate.not(BiomeDelegate::isSelf)).toList());
|
|
||||||
replace.forEach((biome, collection) -> biomeSet.addAll(collection.getContents()));
|
|
||||||
return biomeSet;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,66 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (c) 2020-2025 Polyhedral Development
|
|
||||||
*
|
|
||||||
* The Terra Core Addons are licensed under the terms of the MIT License. For more details,
|
|
||||||
* reference the LICENSE file in this module's root directory.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package com.dfsek.terra.addons.biome.pipeline.mutator;
|
|
||||||
|
|
||||||
import java.util.HashSet;
|
|
||||||
import java.util.Set;
|
|
||||||
import java.util.function.Predicate;
|
|
||||||
|
|
||||||
import com.dfsek.terra.addons.biome.pipeline.api.delegate.BiomeDelegate;
|
|
||||||
import com.dfsek.terra.addons.biome.pipeline.api.stage.type.BiomeMutator;
|
|
||||||
import com.dfsek.terra.api.noise.NoiseSampler;
|
|
||||||
import com.dfsek.terra.api.util.collection.ProbabilityCollection;
|
|
||||||
|
|
||||||
|
|
||||||
public class BorderMutator implements BiomeMutator {
|
|
||||||
private final String border;
|
|
||||||
private final NoiseSampler noiseSampler;
|
|
||||||
private final ProbabilityCollection<BiomeDelegate> replace;
|
|
||||||
private final String replaceTag;
|
|
||||||
|
|
||||||
public BorderMutator(String border, String replaceTag, NoiseSampler noiseSampler, ProbabilityCollection<BiomeDelegate> replace) {
|
|
||||||
this.border = border;
|
|
||||||
this.noiseSampler = noiseSampler;
|
|
||||||
this.replace = replace;
|
|
||||||
this.replaceTag = replaceTag;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public BiomeDelegate mutate(ViewPoint viewPoint, double x, double z, long seed) {
|
|
||||||
BiomeDelegate origin = viewPoint.getBiome(0, 0);
|
|
||||||
if(origin.getTags().contains(replaceTag)) {
|
|
||||||
for(int xi = -1; xi <= 1; xi++) {
|
|
||||||
for(int zi = -1; zi <= 1; zi++) {
|
|
||||||
if(xi == 0 && zi == 0) continue;
|
|
||||||
BiomeDelegate current = viewPoint.getBiome(xi, zi);
|
|
||||||
if(current != null && current.getTags().contains(border)) {
|
|
||||||
BiomeDelegate biome = replace.get(noiseSampler, x, z, seed);
|
|
||||||
return biome.isSelf() ? origin : biome;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return origin;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Iterable<BiomeDelegate> getBiomes(Iterable<BiomeDelegate> biomes) {
|
|
||||||
Set<BiomeDelegate> biomeSet = new HashSet<>();
|
|
||||||
biomes.forEach(biomeSet::add);
|
|
||||||
biomeSet.addAll(
|
|
||||||
replace
|
|
||||||
.getContents()
|
|
||||||
.stream()
|
|
||||||
.filter(
|
|
||||||
Predicate.not(BiomeDelegate::isSelf)
|
|
||||||
)
|
|
||||||
.toList()
|
|
||||||
);
|
|
||||||
return biomeSet;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,72 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (c) 2020-2025 Polyhedral Development
|
|
||||||
*
|
|
||||||
* The Terra Core Addons are licensed under the terms of the MIT License. For more details,
|
|
||||||
* reference the LICENSE file in this module's root directory.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package com.dfsek.terra.addons.biome.pipeline.mutator;
|
|
||||||
|
|
||||||
import java.util.HashSet;
|
|
||||||
import java.util.Map;
|
|
||||||
import java.util.Set;
|
|
||||||
import java.util.stream.Stream;
|
|
||||||
|
|
||||||
import com.dfsek.terra.addons.biome.pipeline.api.delegate.BiomeDelegate;
|
|
||||||
import com.dfsek.terra.addons.biome.pipeline.api.stage.type.BiomeMutator;
|
|
||||||
import com.dfsek.terra.api.noise.NoiseSampler;
|
|
||||||
import com.dfsek.terra.api.util.collection.ProbabilityCollection;
|
|
||||||
|
|
||||||
|
|
||||||
public class ReplaceListMutator implements BiomeMutator {
|
|
||||||
private final Map<BiomeDelegate, ProbabilityCollection<BiomeDelegate>> replace;
|
|
||||||
private final NoiseSampler sampler;
|
|
||||||
private final ProbabilityCollection<BiomeDelegate> replaceDefault;
|
|
||||||
private final String defaultTag;
|
|
||||||
|
|
||||||
public ReplaceListMutator(Map<BiomeDelegate, ProbabilityCollection<BiomeDelegate>> replace, String defaultTag,
|
|
||||||
ProbabilityCollection<BiomeDelegate> replaceDefault, NoiseSampler sampler) {
|
|
||||||
this.replace = replace;
|
|
||||||
this.sampler = sampler;
|
|
||||||
this.defaultTag = defaultTag;
|
|
||||||
this.replaceDefault = replaceDefault;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public BiomeDelegate mutate(ViewPoint viewPoint, double x, double z, long seed) {
|
|
||||||
BiomeDelegate center = viewPoint.getBiome(0, 0);
|
|
||||||
if(replace.containsKey(center)) {
|
|
||||||
BiomeDelegate biome = replace.get(center).get(sampler, x, z, seed);
|
|
||||||
return biome.isSelf() ? viewPoint.getBiome(0, 0) : biome;
|
|
||||||
}
|
|
||||||
if(viewPoint.getBiome(0, 0).getTags().contains(defaultTag)) {
|
|
||||||
BiomeDelegate biome = replaceDefault.get(sampler, x, z, seed);
|
|
||||||
return biome.isSelf() ? viewPoint.getBiome(0, 0) : biome;
|
|
||||||
}
|
|
||||||
return center;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Iterable<BiomeDelegate> getBiomes(Iterable<BiomeDelegate> biomes) {
|
|
||||||
Set<BiomeDelegate> biomeSet = new HashSet<>();
|
|
||||||
|
|
||||||
Set<BiomeDelegate> reject = new HashSet<>();
|
|
||||||
|
|
||||||
biomes.forEach(biome -> {
|
|
||||||
if(!biome.getTags().contains(defaultTag) && !replace.containsKey(biome)) {
|
|
||||||
biomeSet.add(biome);
|
|
||||||
} else {
|
|
||||||
reject.add(biome);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
biomeSet.addAll(replaceDefault.getContents().stream().flatMap(terraBiome -> {
|
|
||||||
if(terraBiome.isSelf()) return reject.stream();
|
|
||||||
return Stream.of(terraBiome);
|
|
||||||
}).toList());
|
|
||||||
replace.forEach((biome, collection) -> biomeSet.addAll(collection.getContents().stream().map(terraBiome -> {
|
|
||||||
if(terraBiome.isSelf()) return biome;
|
|
||||||
return terraBiome;
|
|
||||||
}).toList()));
|
|
||||||
return biomeSet;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,57 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (c) 2020-2025 Polyhedral Development
|
|
||||||
*
|
|
||||||
* The Terra Core Addons are licensed under the terms of the MIT License. For more details,
|
|
||||||
* reference the LICENSE file in this module's root directory.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package com.dfsek.terra.addons.biome.pipeline.mutator;
|
|
||||||
|
|
||||||
import java.util.HashSet;
|
|
||||||
import java.util.Set;
|
|
||||||
import java.util.stream.Stream;
|
|
||||||
|
|
||||||
import com.dfsek.terra.addons.biome.pipeline.api.delegate.BiomeDelegate;
|
|
||||||
import com.dfsek.terra.addons.biome.pipeline.api.stage.type.BiomeMutator;
|
|
||||||
import com.dfsek.terra.api.noise.NoiseSampler;
|
|
||||||
import com.dfsek.terra.api.util.collection.ProbabilityCollection;
|
|
||||||
|
|
||||||
|
|
||||||
public class ReplaceMutator implements BiomeMutator {
|
|
||||||
private final String replaceableTag;
|
|
||||||
private final ProbabilityCollection<BiomeDelegate> replace;
|
|
||||||
private final NoiseSampler sampler;
|
|
||||||
|
|
||||||
public ReplaceMutator(String replaceable, ProbabilityCollection<BiomeDelegate> replace, NoiseSampler sampler) {
|
|
||||||
this.replaceableTag = replaceable;
|
|
||||||
this.replace = replace;
|
|
||||||
this.sampler = sampler;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public BiomeDelegate mutate(ViewPoint viewPoint, double x, double z, long seed) {
|
|
||||||
if(viewPoint.getBiome(0, 0).getTags().contains(replaceableTag)) {
|
|
||||||
BiomeDelegate biome = replace.get(sampler, x, z, seed);
|
|
||||||
return biome.isSelf() ? viewPoint.getBiome(0, 0) : biome;
|
|
||||||
}
|
|
||||||
return viewPoint.getBiome(0, 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Iterable<BiomeDelegate> getBiomes(Iterable<BiomeDelegate> biomes) {
|
|
||||||
Set<BiomeDelegate> biomeSet = new HashSet<>();
|
|
||||||
Set<BiomeDelegate> reject = new HashSet<>();
|
|
||||||
biomes.forEach(biome -> {
|
|
||||||
if(!biome.getTags().contains(replaceableTag)) {
|
|
||||||
biomeSet.add(biome);
|
|
||||||
} else {
|
|
||||||
reject.add(biome);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
biomeSet.addAll(replace.getContents().stream().flatMap(terraBiome -> {
|
|
||||||
if(terraBiome.isSelf()) return reject.stream();
|
|
||||||
return Stream.of(terraBiome);
|
|
||||||
}).toList());
|
|
||||||
return biomeSet;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,46 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (c) 2020-2025 Polyhedral Development
|
|
||||||
*
|
|
||||||
* The Terra Core Addons are licensed under the terms of the MIT License. For more details,
|
|
||||||
* reference the LICENSE file in this module's root directory.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package com.dfsek.terra.addons.biome.pipeline.mutator;
|
|
||||||
|
|
||||||
import java.util.Objects;
|
|
||||||
|
|
||||||
import com.dfsek.terra.addons.biome.pipeline.api.delegate.BiomeDelegate;
|
|
||||||
import com.dfsek.terra.addons.biome.pipeline.api.stage.type.BiomeMutator;
|
|
||||||
import com.dfsek.terra.api.noise.NoiseSampler;
|
|
||||||
import com.dfsek.terra.api.util.MathUtil;
|
|
||||||
|
|
||||||
|
|
||||||
public class SmoothMutator implements BiomeMutator {
|
|
||||||
|
|
||||||
private final NoiseSampler sampler;
|
|
||||||
|
|
||||||
public SmoothMutator(NoiseSampler sampler) {
|
|
||||||
this.sampler = sampler;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public BiomeDelegate mutate(ViewPoint viewPoint, double x, double z, long seed) {
|
|
||||||
BiomeDelegate top = viewPoint.getBiome(1, 0);
|
|
||||||
BiomeDelegate bottom = viewPoint.getBiome(-1, 0);
|
|
||||||
BiomeDelegate left = viewPoint.getBiome(0, 1);
|
|
||||||
BiomeDelegate right = viewPoint.getBiome(0, -1);
|
|
||||||
|
|
||||||
|
|
||||||
boolean vert = Objects.equals(top, bottom) && top != null;
|
|
||||||
boolean horiz = Objects.equals(left, right) && left != null;
|
|
||||||
|
|
||||||
if(vert && horiz) {
|
|
||||||
return MathUtil.normalizeIndex(sampler.noise(seed, x, z), 2) == 0 ? left : top;
|
|
||||||
}
|
|
||||||
|
|
||||||
if(vert) return top;
|
|
||||||
if(horiz) return left;
|
|
||||||
|
|
||||||
return viewPoint.getBiome(0, 0);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,11 +1,13 @@
|
|||||||
package com.dfsek.terra.addons.biome.pipeline.v2.pipeline;
|
package com.dfsek.terra.addons.biome.pipeline.pipeline;
|
||||||
|
|
||||||
|
import com.dfsek.seismic.math.floatingpoint.FloatingPointFunctions;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
import com.dfsek.terra.addons.biome.pipeline.v2.api.BiomeChunk;
|
import com.dfsek.terra.addons.biome.pipeline.api.BiomeChunk;
|
||||||
import com.dfsek.terra.addons.biome.pipeline.v2.api.Expander;
|
import com.dfsek.terra.addons.biome.pipeline.api.Expander;
|
||||||
import com.dfsek.terra.addons.biome.pipeline.v2.api.Stage;
|
import com.dfsek.terra.addons.biome.pipeline.api.Stage;
|
||||||
import com.dfsek.terra.addons.biome.pipeline.v2.api.biome.PipelineBiome;
|
import com.dfsek.terra.addons.biome.pipeline.api.biome.PipelineBiome;
|
||||||
import com.dfsek.terra.api.util.cache.SeededVector2Key;
|
import com.dfsek.terra.api.util.cache.SeededVector2Key;
|
||||||
|
|
||||||
|
|
||||||
@@ -98,7 +100,7 @@ public class BiomeChunkImpl implements BiomeChunk {
|
|||||||
// chunk samples points on the same overall grid.
|
// chunk samples points on the same overall grid.
|
||||||
// Without this, shared chunk borders (required because of adjacent cell reads) will not be identical
|
// 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.
|
// because points would be sampled on grids at different offsets, resulting in artifacts at borders.
|
||||||
return (int) Math.ceil((double) finalGridOrigin / initialGridInterval) * initialGridInterval;
|
return FloatingPointFunctions.ceil((double) finalGridOrigin / initialGridInterval) * initialGridInterval;
|
||||||
}
|
}
|
||||||
|
|
||||||
private static int calculateFinalGridOrigin(int totalExpanderCount, List<Stage> stages) {
|
private static int calculateFinalGridOrigin(int totalExpanderCount, List<Stage> stages) {
|
||||||
@@ -1,17 +1,16 @@
|
|||||||
package com.dfsek.terra.addons.biome.pipeline.v2.pipeline;
|
package com.dfsek.terra.addons.biome.pipeline.pipeline;
|
||||||
|
|
||||||
import com.dfsek.terra.api.util.cache.SeededVector2Key;
|
|
||||||
|
|
||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
import com.dfsek.terra.addons.biome.pipeline.v2.api.BiomeChunk;
|
import com.dfsek.terra.addons.biome.pipeline.api.BiomeChunk;
|
||||||
import com.dfsek.terra.addons.biome.pipeline.v2.api.Expander;
|
import com.dfsek.terra.addons.biome.pipeline.api.Expander;
|
||||||
import com.dfsek.terra.addons.biome.pipeline.v2.api.Pipeline;
|
import com.dfsek.terra.addons.biome.pipeline.api.Pipeline;
|
||||||
import com.dfsek.terra.addons.biome.pipeline.v2.api.Source;
|
import com.dfsek.terra.addons.biome.pipeline.api.Source;
|
||||||
import com.dfsek.terra.addons.biome.pipeline.v2.api.Stage;
|
import com.dfsek.terra.addons.biome.pipeline.api.Stage;
|
||||||
|
import com.dfsek.terra.api.util.cache.SeededVector2Key;
|
||||||
|
|
||||||
|
|
||||||
public class PipelineImpl implements Pipeline {
|
public class PipelineImpl implements Pipeline {
|
||||||
@@ -1,17 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (c) 2020-2025 Polyhedral Development
|
|
||||||
*
|
|
||||||
* The Terra Core Addons are licensed under the terms of the MIT License. For more details,
|
|
||||||
* reference the LICENSE file in this module's root directory.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package com.dfsek.terra.addons.biome.pipeline.source;
|
|
||||||
|
|
||||||
import com.dfsek.terra.addons.biome.pipeline.api.delegate.BiomeDelegate;
|
|
||||||
|
|
||||||
|
|
||||||
public interface BiomeSource {
|
|
||||||
BiomeDelegate getBiome(double x, double z, long seed);
|
|
||||||
|
|
||||||
Iterable<BiomeDelegate> getBiomes();
|
|
||||||
}
|
|
||||||
@@ -7,27 +7,29 @@
|
|||||||
|
|
||||||
package com.dfsek.terra.addons.biome.pipeline.source;
|
package com.dfsek.terra.addons.biome.pipeline.source;
|
||||||
|
|
||||||
import com.dfsek.terra.addons.biome.pipeline.api.delegate.BiomeDelegate;
|
import com.dfsek.seismic.type.sampler.Sampler;
|
||||||
import com.dfsek.terra.api.noise.NoiseSampler;
|
|
||||||
|
import com.dfsek.terra.addons.biome.pipeline.api.Source;
|
||||||
|
import com.dfsek.terra.addons.biome.pipeline.api.biome.PipelineBiome;
|
||||||
import com.dfsek.terra.api.util.collection.ProbabilityCollection;
|
import com.dfsek.terra.api.util.collection.ProbabilityCollection;
|
||||||
|
|
||||||
|
|
||||||
public class SamplerSource implements BiomeSource {
|
public class SamplerSource implements Source {
|
||||||
private final ProbabilityCollection<BiomeDelegate> biomes;
|
private final ProbabilityCollection<PipelineBiome> biomes;
|
||||||
private final NoiseSampler sampler;
|
private final Sampler sampler;
|
||||||
|
|
||||||
public SamplerSource(ProbabilityCollection<BiomeDelegate> biomes, NoiseSampler sampler) {
|
public SamplerSource(ProbabilityCollection<PipelineBiome> biomes, Sampler sampler) {
|
||||||
this.biomes = biomes;
|
this.biomes = biomes;
|
||||||
this.sampler = sampler;
|
this.sampler = sampler;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public BiomeDelegate getBiome(double x, double z, long seed) {
|
public PipelineBiome get(long seed, int x, int z) {
|
||||||
return biomes.get(sampler, x, z, seed);
|
return biomes.get(sampler, x, z, seed);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Iterable<BiomeDelegate> getBiomes() {
|
public Iterable<PipelineBiome> getBiomes() {
|
||||||
return biomes.getContents();
|
return biomes.getContents();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,10 +1,10 @@
|
|||||||
package com.dfsek.terra.addons.biome.pipeline.v2.source;
|
package com.dfsek.terra.addons.biome.pipeline.source;
|
||||||
|
|
||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
|
|
||||||
import com.dfsek.terra.addons.biome.pipeline.v2.api.Source;
|
import com.dfsek.terra.addons.biome.pipeline.api.Source;
|
||||||
import com.dfsek.terra.addons.biome.pipeline.v2.api.biome.PipelineBiome;
|
import com.dfsek.terra.addons.biome.pipeline.api.biome.PipelineBiome;
|
||||||
|
|
||||||
|
|
||||||
public class SingleSource implements Source {
|
public class SingleSource implements Source {
|
||||||
@@ -1,16 +1,17 @@
|
|||||||
package com.dfsek.terra.addons.biome.pipeline.v2.stage.expander;
|
package com.dfsek.terra.addons.biome.pipeline.stage.expander;
|
||||||
|
|
||||||
import com.dfsek.terra.addons.biome.pipeline.v2.api.Expander;
|
import com.dfsek.seismic.type.sampler.Sampler;
|
||||||
import com.dfsek.terra.addons.biome.pipeline.v2.api.biome.PipelineBiome;
|
|
||||||
import com.dfsek.terra.addons.biome.pipeline.v2.pipeline.BiomeChunkImpl;
|
import com.dfsek.terra.addons.biome.pipeline.api.Expander;
|
||||||
import com.dfsek.terra.api.noise.NoiseSampler;
|
import com.dfsek.terra.addons.biome.pipeline.api.biome.PipelineBiome;
|
||||||
|
import com.dfsek.terra.addons.biome.pipeline.pipeline.BiomeChunkImpl;
|
||||||
|
|
||||||
|
|
||||||
public class FractalExpander implements Expander {
|
public class FractalExpander implements Expander {
|
||||||
|
|
||||||
private final NoiseSampler sampler;
|
private final Sampler sampler;
|
||||||
|
|
||||||
public FractalExpander(NoiseSampler sampler) {
|
public FractalExpander(Sampler sampler) {
|
||||||
this.sampler = sampler;
|
this.sampler = sampler;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -20,7 +21,7 @@ public class FractalExpander implements Expander {
|
|||||||
int xMod2 = viewPoint.gridX() % 2;
|
int xMod2 = viewPoint.gridX() % 2;
|
||||||
int zMod2 = viewPoint.gridZ() % 2;
|
int zMod2 = viewPoint.gridZ() % 2;
|
||||||
|
|
||||||
double roll = sampler.noise(viewPoint.worldSeed(), viewPoint.worldX(), viewPoint.worldZ());
|
double roll = sampler.getSample(viewPoint.worldSeed(), viewPoint.worldX(), viewPoint.worldZ());
|
||||||
|
|
||||||
if(xMod2 == 1 && zMod2 == 0) { // Pick one of 2 neighbors on X axis randomly
|
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);
|
return roll > 0 ? viewPoint.getRelativeBiome(-1, 0) : viewPoint.getRelativeBiome(1, 0);
|
||||||
@@ -5,7 +5,10 @@
|
|||||||
* reference the LICENSE file in this module's root directory.
|
* reference the LICENSE file in this module's root directory.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
package com.dfsek.terra.addons.biome.pipeline.v2.stage.mutators;
|
package com.dfsek.terra.addons.biome.pipeline.stage.mutators;
|
||||||
|
|
||||||
|
import com.dfsek.seismic.type.sampler.Sampler;
|
||||||
|
import com.dfsek.seismic.type.vector.Vector2Int;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.HashSet;
|
import java.util.HashSet;
|
||||||
@@ -14,17 +17,15 @@ import java.util.Map;
|
|||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
import java.util.function.Predicate;
|
import java.util.function.Predicate;
|
||||||
|
|
||||||
import com.dfsek.terra.addons.biome.pipeline.v2.api.Stage;
|
import com.dfsek.terra.addons.biome.pipeline.api.Stage;
|
||||||
import com.dfsek.terra.addons.biome.pipeline.v2.api.biome.PipelineBiome;
|
import com.dfsek.terra.addons.biome.pipeline.api.biome.PipelineBiome;
|
||||||
import com.dfsek.terra.addons.biome.pipeline.v2.pipeline.BiomeChunkImpl;
|
import com.dfsek.terra.addons.biome.pipeline.pipeline.BiomeChunkImpl;
|
||||||
import com.dfsek.terra.api.noise.NoiseSampler;
|
|
||||||
import com.dfsek.terra.api.util.collection.ProbabilityCollection;
|
import com.dfsek.terra.api.util.collection.ProbabilityCollection;
|
||||||
import com.dfsek.terra.api.util.vector.Vector2Int;
|
|
||||||
|
|
||||||
|
|
||||||
public class BorderListStage implements Stage {
|
public class BorderListStage implements Stage {
|
||||||
private final String border;
|
private final String border;
|
||||||
private final NoiseSampler noiseSampler;
|
private final Sampler Sampler;
|
||||||
private final ProbabilityCollection<PipelineBiome> replaceDefault;
|
private final ProbabilityCollection<PipelineBiome> replaceDefault;
|
||||||
private final String defaultReplace;
|
private final String defaultReplace;
|
||||||
private final Map<PipelineBiome, ProbabilityCollection<PipelineBiome>> replace;
|
private final Map<PipelineBiome, ProbabilityCollection<PipelineBiome>> replace;
|
||||||
@@ -32,9 +33,9 @@ public class BorderListStage implements Stage {
|
|||||||
private final Vector2Int[] borderPoints;
|
private final Vector2Int[] borderPoints;
|
||||||
|
|
||||||
public BorderListStage(Map<PipelineBiome, ProbabilityCollection<PipelineBiome>> replace, String border, String defaultReplace,
|
public BorderListStage(Map<PipelineBiome, ProbabilityCollection<PipelineBiome>> replace, String border, String defaultReplace,
|
||||||
NoiseSampler noiseSampler, ProbabilityCollection<PipelineBiome> replaceDefault) {
|
Sampler Sampler, ProbabilityCollection<PipelineBiome> replaceDefault) {
|
||||||
this.border = border;
|
this.border = border;
|
||||||
this.noiseSampler = noiseSampler;
|
this.Sampler = Sampler;
|
||||||
this.replaceDefault = replaceDefault;
|
this.replaceDefault = replaceDefault;
|
||||||
this.defaultReplace = defaultReplace;
|
this.defaultReplace = defaultReplace;
|
||||||
this.replace = replace;
|
this.replace = replace;
|
||||||
@@ -67,11 +68,11 @@ public class BorderListStage implements Stage {
|
|||||||
PipelineBiome current = viewPoint.getRelativeBiome(point.getX(), point.getZ());
|
PipelineBiome current = viewPoint.getRelativeBiome(point.getX(), point.getZ());
|
||||||
if(current != null && current.getTags().contains(border)) {
|
if(current != null && current.getTags().contains(border)) {
|
||||||
if(replace.containsKey(center)) {
|
if(replace.containsKey(center)) {
|
||||||
PipelineBiome replacement = replace.get(center).get(noiseSampler, viewPoint.worldX(), viewPoint.worldZ(),
|
PipelineBiome replacement = replace.get(center).get(Sampler, viewPoint.worldX(), viewPoint.worldZ(),
|
||||||
viewPoint.worldSeed());
|
viewPoint.worldSeed());
|
||||||
return replacement.isSelf() ? center : replacement;
|
return replacement.isSelf() ? center : replacement;
|
||||||
}
|
}
|
||||||
PipelineBiome replacement = replaceDefault.get(noiseSampler, viewPoint.worldX(), viewPoint.worldZ(),
|
PipelineBiome replacement = replaceDefault.get(Sampler, viewPoint.worldX(), viewPoint.worldZ(),
|
||||||
viewPoint.worldSeed());
|
viewPoint.worldSeed());
|
||||||
return replacement.isSelf() ? center : replacement;
|
return replacement.isSelf() ? center : replacement;
|
||||||
}
|
}
|
||||||
@@ -5,7 +5,10 @@
|
|||||||
* reference the LICENSE file in this module's root directory.
|
* reference the LICENSE file in this module's root directory.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
package com.dfsek.terra.addons.biome.pipeline.v2.stage.mutators;
|
package com.dfsek.terra.addons.biome.pipeline.stage.mutators;
|
||||||
|
|
||||||
|
import com.dfsek.seismic.type.sampler.Sampler;
|
||||||
|
import com.dfsek.seismic.type.vector.Vector2Int;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.HashSet;
|
import java.util.HashSet;
|
||||||
@@ -13,24 +16,22 @@ import java.util.List;
|
|||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
import java.util.function.Predicate;
|
import java.util.function.Predicate;
|
||||||
|
|
||||||
import com.dfsek.terra.addons.biome.pipeline.v2.api.Stage;
|
import com.dfsek.terra.addons.biome.pipeline.api.Stage;
|
||||||
import com.dfsek.terra.addons.biome.pipeline.v2.api.biome.PipelineBiome;
|
import com.dfsek.terra.addons.biome.pipeline.api.biome.PipelineBiome;
|
||||||
import com.dfsek.terra.addons.biome.pipeline.v2.pipeline.BiomeChunkImpl;
|
import com.dfsek.terra.addons.biome.pipeline.pipeline.BiomeChunkImpl;
|
||||||
import com.dfsek.terra.api.noise.NoiseSampler;
|
|
||||||
import com.dfsek.terra.api.util.collection.ProbabilityCollection;
|
import com.dfsek.terra.api.util.collection.ProbabilityCollection;
|
||||||
import com.dfsek.terra.api.util.vector.Vector2Int;
|
|
||||||
|
|
||||||
|
|
||||||
public class BorderStage implements Stage {
|
public class BorderStage implements Stage {
|
||||||
private final String border;
|
private final String border;
|
||||||
private final NoiseSampler noiseSampler;
|
private final Sampler Sampler;
|
||||||
private final ProbabilityCollection<PipelineBiome> replace;
|
private final ProbabilityCollection<PipelineBiome> replace;
|
||||||
private final String replaceTag;
|
private final String replaceTag;
|
||||||
private final Vector2Int[] borderPoints;
|
private final Vector2Int[] borderPoints;
|
||||||
|
|
||||||
public BorderStage(String border, String replaceTag, NoiseSampler noiseSampler, ProbabilityCollection<PipelineBiome> replace) {
|
public BorderStage(String border, String replaceTag, Sampler Sampler, ProbabilityCollection<PipelineBiome> replace) {
|
||||||
this.border = border;
|
this.border = border;
|
||||||
this.noiseSampler = noiseSampler;
|
this.Sampler = Sampler;
|
||||||
this.replace = replace;
|
this.replace = replace;
|
||||||
this.replaceTag = replaceTag;
|
this.replaceTag = replaceTag;
|
||||||
List<Vector2Int> points = new ArrayList<>();
|
List<Vector2Int> points = new ArrayList<>();
|
||||||
@@ -50,7 +51,7 @@ public class BorderStage implements Stage {
|
|||||||
for(Vector2Int point : borderPoints) {
|
for(Vector2Int point : borderPoints) {
|
||||||
PipelineBiome current = viewPoint.getRelativeBiome(point.getX(), point.getZ());
|
PipelineBiome current = viewPoint.getRelativeBiome(point.getX(), point.getZ());
|
||||||
if(current != null && current.getTags().contains(border)) {
|
if(current != null && current.getTags().contains(border)) {
|
||||||
PipelineBiome replacement = replace.get(noiseSampler, viewPoint.worldX(), viewPoint.worldZ(), viewPoint.worldSeed());
|
PipelineBiome replacement = replace.get(Sampler, viewPoint.worldX(), viewPoint.worldZ(), viewPoint.worldSeed());
|
||||||
return replacement.isSelf() ? center : replacement;
|
return replacement.isSelf() ? center : replacement;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -5,28 +5,29 @@
|
|||||||
* reference the LICENSE file in this module's root directory.
|
* reference the LICENSE file in this module's root directory.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
package com.dfsek.terra.addons.biome.pipeline.v2.stage.mutators;
|
package com.dfsek.terra.addons.biome.pipeline.stage.mutators;
|
||||||
|
|
||||||
|
import com.dfsek.seismic.type.sampler.Sampler;
|
||||||
|
|
||||||
import java.util.HashSet;
|
import java.util.HashSet;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
import java.util.stream.Stream;
|
import java.util.stream.Stream;
|
||||||
|
|
||||||
import com.dfsek.terra.addons.biome.pipeline.v2.api.Stage;
|
import com.dfsek.terra.addons.biome.pipeline.api.Stage;
|
||||||
import com.dfsek.terra.addons.biome.pipeline.v2.api.biome.PipelineBiome;
|
import com.dfsek.terra.addons.biome.pipeline.api.biome.PipelineBiome;
|
||||||
import com.dfsek.terra.addons.biome.pipeline.v2.pipeline.BiomeChunkImpl;
|
import com.dfsek.terra.addons.biome.pipeline.pipeline.BiomeChunkImpl;
|
||||||
import com.dfsek.terra.api.noise.NoiseSampler;
|
|
||||||
import com.dfsek.terra.api.util.collection.ProbabilityCollection;
|
import com.dfsek.terra.api.util.collection.ProbabilityCollection;
|
||||||
|
|
||||||
|
|
||||||
public class ReplaceListStage implements Stage {
|
public class ReplaceListStage implements Stage {
|
||||||
private final Map<PipelineBiome, ProbabilityCollection<PipelineBiome>> replace;
|
private final Map<PipelineBiome, ProbabilityCollection<PipelineBiome>> replace;
|
||||||
private final NoiseSampler sampler;
|
private final Sampler sampler;
|
||||||
private final ProbabilityCollection<PipelineBiome> replaceDefault;
|
private final ProbabilityCollection<PipelineBiome> replaceDefault;
|
||||||
private final String defaultTag;
|
private final String defaultTag;
|
||||||
|
|
||||||
public ReplaceListStage(Map<PipelineBiome, ProbabilityCollection<PipelineBiome>> replace, String defaultTag,
|
public ReplaceListStage(Map<PipelineBiome, ProbabilityCollection<PipelineBiome>> replace, String defaultTag,
|
||||||
ProbabilityCollection<PipelineBiome> replaceDefault, NoiseSampler sampler) {
|
ProbabilityCollection<PipelineBiome> replaceDefault, Sampler sampler) {
|
||||||
this.replace = replace;
|
this.replace = replace;
|
||||||
this.sampler = sampler;
|
this.sampler = sampler;
|
||||||
this.defaultTag = defaultTag;
|
this.defaultTag = defaultTag;
|
||||||
@@ -5,25 +5,26 @@
|
|||||||
* reference the LICENSE file in this module's root directory.
|
* reference the LICENSE file in this module's root directory.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
package com.dfsek.terra.addons.biome.pipeline.v2.stage.mutators;
|
package com.dfsek.terra.addons.biome.pipeline.stage.mutators;
|
||||||
|
|
||||||
|
import com.dfsek.seismic.type.sampler.Sampler;
|
||||||
|
|
||||||
import java.util.HashSet;
|
import java.util.HashSet;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
import java.util.stream.Stream;
|
import java.util.stream.Stream;
|
||||||
|
|
||||||
import com.dfsek.terra.addons.biome.pipeline.v2.api.Stage;
|
import com.dfsek.terra.addons.biome.pipeline.api.Stage;
|
||||||
import com.dfsek.terra.addons.biome.pipeline.v2.api.biome.PipelineBiome;
|
import com.dfsek.terra.addons.biome.pipeline.api.biome.PipelineBiome;
|
||||||
import com.dfsek.terra.addons.biome.pipeline.v2.pipeline.BiomeChunkImpl;
|
import com.dfsek.terra.addons.biome.pipeline.pipeline.BiomeChunkImpl;
|
||||||
import com.dfsek.terra.api.noise.NoiseSampler;
|
|
||||||
import com.dfsek.terra.api.util.collection.ProbabilityCollection;
|
import com.dfsek.terra.api.util.collection.ProbabilityCollection;
|
||||||
|
|
||||||
|
|
||||||
public class ReplaceStage implements Stage {
|
public class ReplaceStage implements Stage {
|
||||||
private final String replaceableTag;
|
private final String replaceableTag;
|
||||||
private final ProbabilityCollection<PipelineBiome> replace;
|
private final ProbabilityCollection<PipelineBiome> replace;
|
||||||
private final NoiseSampler sampler;
|
private final Sampler sampler;
|
||||||
|
|
||||||
public ReplaceStage(String replaceable, ProbabilityCollection<PipelineBiome> replace, NoiseSampler sampler) {
|
public ReplaceStage(String replaceable, ProbabilityCollection<PipelineBiome> replace, Sampler sampler) {
|
||||||
this.replaceableTag = replaceable;
|
this.replaceableTag = replaceable;
|
||||||
this.replace = replace;
|
this.replace = replace;
|
||||||
this.sampler = sampler;
|
this.sampler = sampler;
|
||||||
@@ -5,21 +5,22 @@
|
|||||||
* reference the LICENSE file in this module's root directory.
|
* reference the LICENSE file in this module's root directory.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
package com.dfsek.terra.addons.biome.pipeline.v2.stage.mutators;
|
package com.dfsek.terra.addons.biome.pipeline.stage.mutators;
|
||||||
|
|
||||||
|
import com.dfsek.seismic.type.sampler.Sampler;
|
||||||
|
|
||||||
import java.util.Objects;
|
import java.util.Objects;
|
||||||
|
|
||||||
import com.dfsek.terra.addons.biome.pipeline.v2.api.Stage;
|
import com.dfsek.terra.addons.biome.pipeline.api.Stage;
|
||||||
import com.dfsek.terra.addons.biome.pipeline.v2.api.biome.PipelineBiome;
|
import com.dfsek.terra.addons.biome.pipeline.api.biome.PipelineBiome;
|
||||||
import com.dfsek.terra.addons.biome.pipeline.v2.pipeline.BiomeChunkImpl;
|
import com.dfsek.terra.addons.biome.pipeline.pipeline.BiomeChunkImpl;
|
||||||
import com.dfsek.terra.api.noise.NoiseSampler;
|
|
||||||
|
|
||||||
|
|
||||||
public class SmoothStage implements Stage {
|
public class SmoothStage implements Stage {
|
||||||
|
|
||||||
private final NoiseSampler sampler;
|
private final Sampler sampler;
|
||||||
|
|
||||||
public SmoothStage(NoiseSampler sampler) {
|
public SmoothStage(Sampler sampler) {
|
||||||
this.sampler = sampler;
|
this.sampler = sampler;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -30,7 +31,7 @@ public class SmoothStage implements Stage {
|
|||||||
PipelineBiome left = viewPoint.getRelativeBiome(0, 1);
|
PipelineBiome left = viewPoint.getRelativeBiome(0, 1);
|
||||||
PipelineBiome right = viewPoint.getRelativeBiome(0, -1);
|
PipelineBiome right = viewPoint.getRelativeBiome(0, -1);
|
||||||
|
|
||||||
double roll = sampler.noise(viewPoint.worldSeed(), viewPoint.worldX(), viewPoint.worldZ());
|
double roll = sampler.getSample(viewPoint.worldSeed(), viewPoint.worldX(), viewPoint.worldZ());
|
||||||
|
|
||||||
boolean vert = Objects.equals(top, bottom);
|
boolean vert = Objects.equals(top, bottom);
|
||||||
boolean horiz = Objects.equals(left, right);
|
boolean horiz = Objects.equals(left, right);
|
||||||
@@ -1,37 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (c) 2020-2025 Polyhedral Development
|
|
||||||
*
|
|
||||||
* The Terra Core Addons are licensed under the terms of the MIT License. For more details,
|
|
||||||
* reference the LICENSE file in this module's root directory.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package com.dfsek.terra.addons.biome.pipeline.stages;
|
|
||||||
|
|
||||||
import com.dfsek.terra.addons.biome.pipeline.api.BiomeHolder;
|
|
||||||
import com.dfsek.terra.addons.biome.pipeline.api.delegate.BiomeDelegate;
|
|
||||||
import com.dfsek.terra.addons.biome.pipeline.api.stage.Stage;
|
|
||||||
import com.dfsek.terra.addons.biome.pipeline.api.stage.type.BiomeExpander;
|
|
||||||
|
|
||||||
|
|
||||||
public class ExpanderStage implements Stage {
|
|
||||||
private final BiomeExpander expander;
|
|
||||||
|
|
||||||
public ExpanderStage(BiomeExpander expander) {
|
|
||||||
this.expander = expander;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public BiomeHolder apply(BiomeHolder in, long seed) {
|
|
||||||
return in.expand(expander, seed);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean isExpansion() {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Iterable<BiomeDelegate> getBiomes(Iterable<BiomeDelegate> biomes) {
|
|
||||||
return biomes;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user