mirror of
https://github.com/PolyhedralDev/Terra.git
synced 2026-05-20 16:50:28 +00:00
Compare commits
207 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| db930739d7 | |||
| 9686372238 | |||
| 2120dde0db | |||
| f780450a7c | |||
| e870a9eb8d | |||
| c6eb2f49f3 | |||
| 6929de7b61 | |||
| a159debe3e | |||
| 99e2907b2d | |||
| ac71b3ec0c | |||
| e184937743 | |||
| 8c155c78eb | |||
| fc779e1120 | |||
| be964da4fa | |||
| 6ca401413b | |||
| e556e2bca1 | |||
| 1fc97a480a | |||
| bba55f2669 | |||
| e99ae48f1a | |||
| 97b4ea6d94 | |||
| cf4f7822e2 | |||
| d6285a5901 | |||
| 2e2b315ab7 | |||
| 04554b886a | |||
| d3429626b5 | |||
| 8b933b0d5c | |||
| f9a5dfbfce | |||
| 24bca3ed98 | |||
| f8f6b0b4bc | |||
| dd2f0365b0 | |||
| ae2d801be0 | |||
| 8578bba7b9 | |||
| d262831107 | |||
| ddc8cc7db5 | |||
| 12f1b3f8fc | |||
| dc7c57d1a3 | |||
| 349ce6654c | |||
| b04156bb45 | |||
| 309fb5af96 | |||
| 9d747aed71 | |||
| 3cf11a9ad4 | |||
| 9f766b0647 | |||
| 8fa3978dc8 | |||
| c282e55f90 | |||
| 8b62badbdb | |||
| 8bceb255c0 | |||
| ad80769d67 | |||
| 9d0fa0a7c4 | |||
| 8c532ede8e | |||
| c3d26527a7 | |||
| 1fe56335c8 | |||
| 3b377d91ee | |||
| 0144200ec9 | |||
| d1ad3d04e1 | |||
| d640b49ded | |||
| ecbfd1740c | |||
| dc5952add7 | |||
| 1b6ebeb05f | |||
| 234ff3e49c | |||
| 243c523b57 | |||
| 1700650753 | |||
| 12d2221d49 | |||
| 42e1adfc3a | |||
| 4ff91c9fea | |||
| 81bc51f5a1 | |||
| ac98726f81 | |||
| 1d2c6d4294 | |||
| 9ca7014344 | |||
| 8d153998fa | |||
| 2b09ed8fd9 | |||
| 96493ede15 | |||
| 48586eb523 | |||
| a80b94ad45 | |||
| 089850d633 | |||
| 42f3c56b71 | |||
| 874ef56025 | |||
| 06f04005ea | |||
| 774d076f77 | |||
| e4561bd48f | |||
| 550a037661 | |||
| 3b25e82a73 | |||
| 9b3a105672 | |||
| 10558b5446 | |||
| 326300bcce | |||
| a7826dec49 | |||
| fd3d1ce830 | |||
| 84a6cd0c26 | |||
| d1faac8b96 | |||
| de4656d01f | |||
| 6dba2e9394 | |||
| 8a8db4a9b8 | |||
| c1a00ca5c7 | |||
| 2b5d613aef | |||
| 8bea1d23e0 | |||
| fb5e597a11 | |||
| 0990df0620 | |||
| 451683aff5 | |||
| 41e9c2f55f | |||
| 4873b321cb | |||
| 64546bb154 | |||
| d97478d2c4 | |||
| 359b4826bc | |||
| 4b218a65f6 | |||
| b88712e569 | |||
| af509ebc3b | |||
| a5c3733568 | |||
| 3ef60f4b33 | |||
| b7864bb6fb | |||
| 757ed6ad4d | |||
| 1ef12fdec0 | |||
| 4e890f96e4 | |||
| 4e70ee99c9 | |||
| b149497c60 | |||
| d9f591bdb4 | |||
| a4b74e2e7f | |||
| b53d475f42 | |||
| 4ddb741d0d | |||
| 852f5aa610 | |||
| 953895a8d4 | |||
| 8788eab839 | |||
| 2b62473372 | |||
| b9187248c3 | |||
| 2d42810ba3 | |||
| 9f546370cd | |||
| 428bf341ef | |||
| 8a61571ceb | |||
| b669f87b79 | |||
| e507675ef6 | |||
| 0fc2105ee6 | |||
| 77b077dd47 | |||
| f38fcd03b0 | |||
| af1e9de474 | |||
| 3322a16f09 | |||
| 78707468c5 | |||
| c658d1a81b | |||
| 56a7234494 | |||
| 217b708177 | |||
| 7d86a41f65 | |||
| 753574fc9b | |||
| 95f89ed2b6 | |||
| cb8aefe8d2 | |||
| cd8d6f0da3 | |||
| d33b75b77b | |||
| 79f9488380 | |||
| 4c2ce65cdc | |||
| 70c448dd0d | |||
| 3ad0ef8501 | |||
| 060bda2ec1 | |||
| 6b60246694 | |||
| 1a1f461550 | |||
| da20e282ce | |||
| 9b14b0ee96 | |||
| 89cbab071f | |||
| 71953c90a2 | |||
| 923cb08b37 | |||
| 21ef8c0dc4 | |||
| 77b1960757 | |||
| a06c6fd980 | |||
| 46f533ca9d | |||
| 9a61334f5a | |||
| 118aeb872f | |||
| 5446b729f9 | |||
| d71c6bb25f | |||
| d8524603c6 | |||
| 85234ddc39 | |||
| 78162eaafe | |||
| 7a041d8a63 | |||
| 8cfa2e1467 | |||
| 5f367c0f2c | |||
| f4db7fc507 | |||
| ad9d16f48c | |||
| 85b6dcc891 | |||
| 29691dfb4d | |||
| 81eab13ce1 | |||
| a79a347765 | |||
| 46e603d681 | |||
| 3f77b4a975 | |||
| 16755fa049 | |||
| 68d5b22ca4 | |||
| 40b8c85c75 | |||
| 63367e5f03 | |||
| 1d95e7a87d | |||
| a25e3cd5a5 | |||
| b2e21d8b70 | |||
| 4041239b03 | |||
| 280699bbce | |||
| c4dfdafce8 | |||
| 3fe79338db | |||
| 6984dc29d0 | |||
| bd253ea5d2 | |||
| d743d7d1df | |||
| 238a7954a7 | |||
| c2319ca4ab | |||
| 95172bfa7e | |||
| 124dbc8836 | |||
| 8706340584 | |||
| 9a9f90aa0d | |||
| 20a5bfdd0f | |||
| 4fee8cdb24 | |||
| 70de38ffcb | |||
| 6722d22f72 | |||
| c5526c86a2 | |||
| 84fa72f96c | |||
| cc5258ce73 | |||
| 7f324bd72b | |||
| 748e027282 | |||
| bf6612edd0 |
@@ -21,7 +21,7 @@ jobs:
|
||||
- name: Set up JDK 21
|
||||
uses: actions/setup-java@v4.7.1
|
||||
with:
|
||||
java-version: '21'
|
||||
java-version: '25'
|
||||
distribution: 'temurin'
|
||||
server-id: github # Value of the distributionManagement/repository/id field of the pom.xml
|
||||
settings-path: ${{ github.workspace }} # location for the settings.xml file
|
||||
|
||||
Vendored
+149
@@ -0,0 +1,149 @@
|
||||
pipeline {
|
||||
agent any
|
||||
|
||||
tools {
|
||||
jdk "Temurin Java 21"
|
||||
}
|
||||
|
||||
triggers {
|
||||
githubPush()
|
||||
}
|
||||
|
||||
environment {
|
||||
DISCORD_WEBHOOK_URL = credentials('polydev-discord-webhook-url')
|
||||
}
|
||||
|
||||
stages {
|
||||
stage('Checkout') {
|
||||
steps {
|
||||
scmSkip(deleteBuild: true)
|
||||
}
|
||||
}
|
||||
|
||||
stage('Setup Gradle') {
|
||||
steps {
|
||||
sh 'chmod +x gradlew'
|
||||
}
|
||||
}
|
||||
|
||||
stage('Build') {
|
||||
steps {
|
||||
withGradle {
|
||||
sh './gradlew build --rerun-tasks -x check'
|
||||
sh './gradlew javadoc'
|
||||
}
|
||||
}
|
||||
|
||||
post {
|
||||
success {
|
||||
archiveArtifacts artifacts: 'platforms/fabric/build/libs/Terra-fabric*.jar,platforms/bukkit/build/libs/Terra-bukkit*-shaded.jar,platforms/allay/build/libs/Terra-allay*.jar,platforms/minestom/build/libs/Terra-minestom*.jar', fingerprint: true, onlyIfSuccessful: true
|
||||
|
||||
javadoc javadocDir: 'common/api/build/docs/javadoc', keepAll: true
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
stage('Tests') {
|
||||
steps {
|
||||
withGradle {
|
||||
sh './gradlew test --rerun-tasks'
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// stage('Deploy to snapshots repositories') {
|
||||
// when {
|
||||
// allOf {
|
||||
// not { buildingTag() }
|
||||
// not { expression { env.TAG_NAME != null && env.TAG_NAME.matches('v\\d+\\.\\d+\\.\\d+') } }
|
||||
// }
|
||||
// }
|
||||
//
|
||||
// steps {
|
||||
// withCredentials([
|
||||
// string(credentialsId: 'maven-signing-key', variable: 'ORG_GRADLE_PROJECT_signingKey'),
|
||||
// string(credentialsId: 'maven-signing-key-password', variable: 'ORG_GRADLE_PROJECT_signingPassword'),
|
||||
// usernamePassword(
|
||||
// credentialsId: 'solo-studios-maven',
|
||||
// passwordVariable: 'ORG_GRADLE_PROJECT_SoloStudiosSnapshotsPassword',
|
||||
// usernameVariable: 'ORG_GRADLE_PROJECT_SoloStudiosSnapshotsUsername'
|
||||
// )
|
||||
// ]) {
|
||||
// withGradle {
|
||||
// sh './gradlew publishAllPublicationsToSoloStudiosSnapshotsRepository'
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
|
||||
stage('Deploy to releases repositories') {
|
||||
// when {
|
||||
// allOf {
|
||||
// buildingTag()
|
||||
// expression { env.TAG_NAME != null && env.TAG_NAME.matches('v\\d+\\.\\d+\\.\\d+') }
|
||||
// }
|
||||
// }
|
||||
|
||||
steps {
|
||||
withCredentials([
|
||||
string(credentialsId: 'maven-signing-key', variable: 'ORG_GRADLE_PROJECT_signingKey'),
|
||||
string(credentialsId: 'maven-signing-key-password', variable: 'ORG_GRADLE_PROJECT_signingPassword'),
|
||||
usernamePassword(
|
||||
credentialsId: 'solo-studios-maven',
|
||||
passwordVariable: 'ORG_GRADLE_PROJECT_SoloStudiosReleasesPassword',
|
||||
usernameVariable: 'ORG_GRADLE_PROJECT_SoloStudiosReleasesUsername'
|
||||
),
|
||||
// TODO: does not yet exist (uncomment once added)
|
||||
// usernamePassword(
|
||||
// credentialsId: 'sonatype-maven-credentials',
|
||||
// passwordVariable: 'ORG_GRADLE_PROJECT_SonatypePassword',
|
||||
// usernameVariable: 'ORG_GRADLE_PROJECT_SonatypeUsername'
|
||||
// ),
|
||||
// usernamePassword(
|
||||
// credentialsId: 'codemc-maven-credentials',
|
||||
// passwordVariable: 'ORG_GRADLE_PROJECT_CodeMCPassword',
|
||||
// usernameVariable: 'ORG_GRADLE_PROJECT_CodeMCUsername'
|
||||
// )
|
||||
]) {
|
||||
withGradle {
|
||||
sh './gradlew publish'
|
||||
//sh './gradlew publishAllPublicationsToSoloStudiosReleasesRepository'
|
||||
// sh './gradlew publishAllPublicationsToSonatypeRepository'
|
||||
// sh './gradlew publishAllPublicationsToCodeMCRepository'
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
post {
|
||||
always {
|
||||
discoverReferenceBuild()
|
||||
|
||||
// junit testResults: '**/build/test-results/*/TEST-*.xml'
|
||||
|
||||
recordIssues(
|
||||
aggregatingResults: true,
|
||||
enabledForFailure: true,
|
||||
minimumSeverity: 'ERROR',
|
||||
sourceCodeEncoding: 'UTF-8',
|
||||
checksAnnotationScope: 'ALL',
|
||||
sourceCodeRetention: 'LAST_BUILD',
|
||||
tools: [java(), javaDoc()]
|
||||
)
|
||||
|
||||
discordSend(
|
||||
title: env.JOB_NAME + ' ' + env.BUILD_DISPLAY_NAME,
|
||||
showChangeset: true,
|
||||
enableArtifactsList: true,
|
||||
link: env.BUILD_URL,
|
||||
result: currentBuild.currentResult,
|
||||
customAvatarUrl: 'https://github.com/PolyhedralDev.png',
|
||||
customUsername: 'Solo Studios Jenkins',
|
||||
webhookURL: env.DISCORD_WEBHOOK_URL,
|
||||
)
|
||||
|
||||
cleanWs()
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -6,6 +6,12 @@ plugins {
|
||||
repositories {
|
||||
mavenCentral()
|
||||
gradlePluginPortal()
|
||||
maven("https://maven.solo-studios.ca/releases") {
|
||||
name = "Solo Studios"
|
||||
}
|
||||
maven("https://maven.solo-studios.ca/snapshots") {
|
||||
name = "Solo Studios"
|
||||
}
|
||||
maven("https://repo.codemc.org/repository/maven-public") {
|
||||
name = "CodeMC"
|
||||
}
|
||||
@@ -16,11 +22,11 @@ repositories {
|
||||
|
||||
dependencies {
|
||||
//TODO Allow pulling from Versions.kt
|
||||
implementation("com.gradleup.shadow", "shadow-gradle-plugin", "8.3.6")
|
||||
implementation("com.gradleup.shadow", "shadow-gradle-plugin", "8.3.9")
|
||||
|
||||
implementation("io.papermc.paperweight.userdev", "io.papermc.paperweight.userdev.gradle.plugin", "2.0.0-beta.17")
|
||||
implementation("org.ow2.asm", "asm", "9.8")
|
||||
implementation("org.ow2.asm", "asm-tree", "9.8")
|
||||
implementation("com.dfsek.tectonic", "common", "4.2.1")
|
||||
implementation("org.yaml", "snakeyaml", "2.4")
|
||||
implementation("io.papermc.paperweight.userdev", "io.papermc.paperweight.userdev.gradle.plugin", "2.0.0-beta.18")
|
||||
implementation("org.ow2.asm", "asm", "9.9")
|
||||
implementation("org.ow2.asm", "asm-tree", "9.9")
|
||||
implementation("com.dfsek.tectonic", "common", "4.3.1")
|
||||
implementation("org.yaml", "snakeyaml", "2.5")
|
||||
}
|
||||
@@ -13,6 +13,7 @@ import org.gradle.kotlin.dsl.getByName
|
||||
import org.gradle.kotlin.dsl.register
|
||||
import org.gradle.kotlin.dsl.withType
|
||||
import org.gradle.language.jvm.tasks.ProcessResources
|
||||
import org.gradle.plugins.ide.idea.model.IdeaModel
|
||||
|
||||
fun Project.configureCompilation() {
|
||||
apply(plugin = "maven-publish")
|
||||
@@ -21,6 +22,13 @@ fun Project.configureCompilation() {
|
||||
apply(plugin = "idea")
|
||||
apply<TectonicDocPlugin>()
|
||||
|
||||
configure<IdeaModel> {
|
||||
module {
|
||||
isDownloadJavadoc = true
|
||||
isDownloadSources = true
|
||||
}
|
||||
}
|
||||
|
||||
configure<JavaPluginExtension> {
|
||||
sourceCompatibility = JavaVersion.VERSION_21
|
||||
targetCompatibility = JavaVersion.VERSION_21
|
||||
|
||||
@@ -30,6 +30,12 @@ fun Project.configureDependencies() {
|
||||
repositories {
|
||||
mavenCentral()
|
||||
gradlePluginPortal()
|
||||
maven("https://maven.solo-studios.ca/releases") {
|
||||
name = "Solo Studios"
|
||||
}
|
||||
maven("https://maven.solo-studios.ca/snapshots") {
|
||||
name = "Solo Studios"
|
||||
}
|
||||
maven("https://maven.fabricmc.net/") {
|
||||
name = "FabricMC"
|
||||
}
|
||||
@@ -51,20 +57,8 @@ fun Project.configureDependencies() {
|
||||
maven("https://s01.oss.sonatype.org/content/repositories/snapshots/") {
|
||||
name = "Sonatype Snapshots"
|
||||
}
|
||||
maven("https://repo.opencollab.dev/maven-releases/") {
|
||||
name = "OpenCollab Releases"
|
||||
}
|
||||
maven("https://repo.opencollab.dev/maven-snapshots/") {
|
||||
name = "OpenCollab Snapshots"
|
||||
}
|
||||
maven("https://storehouse.okaeri.eu/repository/maven-public/") {
|
||||
name = "Okaeri"
|
||||
}
|
||||
maven("https://maven.solo-studios.ca/releases") {
|
||||
name = "Solo Studios"
|
||||
}
|
||||
maven("https://maven.solo-studios.ca/snapshots") {
|
||||
name = "Solo Studios"
|
||||
maven("https://repo.onarandombox.com/multiverse-releases") {
|
||||
name = "onarandombox"
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -49,10 +49,21 @@ fun Project.configureDistribution() {
|
||||
doFirst {
|
||||
try {
|
||||
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 =
|
||||
URL("https://github.com/PolyhedralDev/TerraOverworldConfig/releases/download/" + Versions.Terra.overworldConfig + "/default.zip")
|
||||
downloadPack(defaultPackUrl, project)
|
||||
} catch (_:Exception) {}
|
||||
URL("https://github.com/PolyhedralDev/DefaultMetapack/releases/download/" + Versions.Terra.defaultConfig + "/default.zip")
|
||||
downloadPack(overworldPackUrl, project)
|
||||
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)
|
||||
}
|
||||
|
||||
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/")
|
||||
|
||||
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 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.outputStream().write(packUrl.readBytes())
|
||||
}
|
||||
|
||||
@@ -16,16 +16,17 @@ fun Project.configurePublishing() {
|
||||
}
|
||||
|
||||
repositories {
|
||||
val mavenUrl = "https://repo.codemc.io/repository/maven-releases/"
|
||||
val mavenUrl = "https://maven.solo-studios.ca/releases/"
|
||||
//val mavenSnapshotUrl = "https://repo.codemc.io/repository/maven-snapshots/"
|
||||
|
||||
maven(mavenUrl) {
|
||||
val mavenUsername: String? by project
|
||||
val mavenPassword: String? by project
|
||||
if (mavenUsername != null && mavenPassword != null) {
|
||||
val SoloStudiosReleasesUsername: String? by project
|
||||
val SoloStudiosReleasesPassword: String? by project
|
||||
|
||||
if (SoloStudiosReleasesUsername != null && SoloStudiosReleasesPassword != null) {
|
||||
credentials {
|
||||
username = mavenUsername
|
||||
password = mavenPassword
|
||||
username = SoloStudiosReleasesUsername
|
||||
password = SoloStudiosReleasesPassword
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,25 +1,21 @@
|
||||
import java.io.ByteArrayOutputStream
|
||||
import org.gradle.api.Action
|
||||
import org.gradle.api.Project
|
||||
import org.gradle.kotlin.dsl.support.serviceOf
|
||||
|
||||
|
||||
var isPrerelease = false
|
||||
|
||||
|
||||
fun Project.getGitHash(): String {
|
||||
val stdout = ByteArrayOutputStream()
|
||||
exec {
|
||||
return providers.exec {
|
||||
commandLine = mutableListOf("git", "rev-parse", "--short", "HEAD")
|
||||
standardOutput = stdout
|
||||
}
|
||||
return stdout.toString().trim()
|
||||
}.standardOutput.asText.get().trim()
|
||||
}
|
||||
|
||||
fun Project.gitClone(name: String) {
|
||||
val stdout = ByteArrayOutputStream()
|
||||
exec {
|
||||
providers.exec {
|
||||
commandLine = mutableListOf("git", "clone", name)
|
||||
standardOutput = stdout
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -1,36 +1,39 @@
|
||||
object Versions {
|
||||
object Terra {
|
||||
const val overworldConfig = "v1.5.1"
|
||||
const val overworldConfig = "latest"
|
||||
const val reimagENDConfig = "latest"
|
||||
const val tartarusConfig = "latest"
|
||||
const val defaultConfig = "latest"
|
||||
}
|
||||
|
||||
object Libraries {
|
||||
const val tectonic = "4.2.1"
|
||||
const val paralithic = "1.0.3"
|
||||
const val tectonic = "4.3.1"
|
||||
const val paralithic = "2.0.1"
|
||||
const val strata = "1.3.2"
|
||||
const val seismic = "0.3.4"
|
||||
const val seismic = "2.5.7"
|
||||
|
||||
const val cloud = "2.0.0"
|
||||
|
||||
const val caffeine = "3.2.0"
|
||||
const val caffeine = "3.2.2"
|
||||
|
||||
const val slf4j = "2.0.17"
|
||||
|
||||
object Internal {
|
||||
const val shadow = "8.3.6"
|
||||
const val apacheText = "1.13.1"
|
||||
const val apacheIO = "2.19.0"
|
||||
const val guava = "33.4.8-jre"
|
||||
const val asm = "9.8"
|
||||
const val snakeYml = "2.4"
|
||||
const val jetBrainsAnnotations = "26.0.2"
|
||||
const val junit = "5.13.0"
|
||||
const val shadow = "8.3.9"
|
||||
const val apacheText = "1.14.0"
|
||||
const val apacheIO = "2.20.0"
|
||||
const val guava = "33.5.0-jre"
|
||||
const val asm = "9.9"
|
||||
const val snakeYml = "2.5"
|
||||
const val jetBrainsAnnotations = "26.0.2-1"
|
||||
const val junit = "6.0.0"
|
||||
const val nbt = "6.1"
|
||||
}
|
||||
}
|
||||
|
||||
object Fabric {
|
||||
const val fabricAPI = "0.125.3+${Mod.minecraft}"
|
||||
const val cloud = "2.0.0-beta.10"
|
||||
const val fabricAPI = "0.140.0+${Mod.minecraft}"
|
||||
const val cloud = "2.0.0-beta.13"
|
||||
}
|
||||
//
|
||||
// object Quilt {
|
||||
@@ -39,14 +42,15 @@ object Versions {
|
||||
// }
|
||||
|
||||
object Mod {
|
||||
const val mixin = "0.15.5+mixin.0.8.7"
|
||||
const val mixin = "0.16.5+mixin.0.8.7"
|
||||
const val mixinExtras = "0.5.0"
|
||||
|
||||
const val minecraft = "1.21.5"
|
||||
const val yarn = "$minecraft+build.1"
|
||||
const val fabricLoader = "0.16.14"
|
||||
const val minecraft = "1.21.11"
|
||||
const val yarn = "$minecraft+build.3"
|
||||
const val fabricLoader = "0.18.3"
|
||||
|
||||
const val architecuryLoom = "1.10.431"
|
||||
const val architecturyPlugin = "3.4.161"
|
||||
const val architecturyLoom = "1.13.463"
|
||||
const val architecturyPlugin = "3.4.162"
|
||||
|
||||
}
|
||||
//
|
||||
@@ -56,18 +60,20 @@ object Versions {
|
||||
// }
|
||||
|
||||
object Bukkit {
|
||||
const val minecraft = "1.21.5-R0.1"
|
||||
const val paperBuild = "$minecraft-20250529.121722-14"
|
||||
const val minecraft = "1.21.11-rc3"
|
||||
const val nms = "$minecraft-R0.1"
|
||||
const val paperBuild = "$nms-20251208.200020-2"
|
||||
const val paper = paperBuild
|
||||
const val paperLib = "1.0.8"
|
||||
const val reflectionRemapper = "0.1.2"
|
||||
const val paperDevBundle = "$minecraft-20250529.121722-99"
|
||||
const val reflectionRemapper = "0.1.3"
|
||||
const val paperDevBundle = paperBuild
|
||||
const val runPaper = "2.3.1"
|
||||
const val paperWeight = "2.0.0-beta.17"
|
||||
const val cloud = "2.0.0-beta.10"
|
||||
const val paperWeight = "2.0.0-beta.19"
|
||||
const val cloud = "2.0.0-beta.12"
|
||||
const val multiverse = "5.3.0"
|
||||
}
|
||||
|
||||
//
|
||||
//
|
||||
// object Sponge {
|
||||
// const val sponge = "9.0.0-SNAPSHOT"
|
||||
// const val mixin = "0.8.2"
|
||||
@@ -75,18 +81,21 @@ object Versions {
|
||||
// }
|
||||
//
|
||||
object CLI {
|
||||
const val logback = "1.5.18"
|
||||
const val logback = "1.5.19"
|
||||
const val picocli = "4.7.7"
|
||||
}
|
||||
|
||||
object Allay {
|
||||
const val api = "0.4.1"
|
||||
const val gson = "2.13.1"
|
||||
const val mappings = "3626653"
|
||||
const val mappingsGenerator = "366618e"
|
||||
const val api = "0.13.0"
|
||||
const val gson = "2.13.2"
|
||||
|
||||
const val mappings = "15398c1"
|
||||
const val mappingsGenerator = "8fa6058"
|
||||
|
||||
const val mcmeta = "e85a17c"
|
||||
}
|
||||
|
||||
object Minestom {
|
||||
const val minestom = "1_21_5-4d91778331"
|
||||
const val minestom = "2025.12.20c-1.21.11"
|
||||
}
|
||||
}
|
||||
|
||||
+1
-1
@@ -46,6 +46,6 @@ class BaseBiomeColumn implements Column<Biome> {
|
||||
|
||||
@Override
|
||||
public Biome get(int y) {
|
||||
return biomeProvider.extrude(base, x, y, z, seed);
|
||||
return biomeProvider.pipeline.extrude(base, x, y, z, seed);
|
||||
}
|
||||
}
|
||||
|
||||
+8
-12
@@ -6,37 +6,33 @@ import java.util.Set;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
import com.dfsek.terra.addons.biome.extrusion.api.Extrusion;
|
||||
import com.dfsek.terra.addons.biome.extrusion.utils.ExtrusionPipeline;
|
||||
import com.dfsek.terra.addons.biome.extrusion.utils.ExtrusionPipelineFactory;
|
||||
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 BiomeExtrusionProvider implements BiomeProvider {
|
||||
public final ExtrusionPipeline pipeline;
|
||||
private final BiomeProvider delegate;
|
||||
private final Set<Biome> biomes;
|
||||
private final List<Extrusion> extrusions;
|
||||
private final int resolution;
|
||||
|
||||
public BiomeExtrusionProvider(BiomeProvider delegate, List<Extrusion> extrusions, int resolution) {
|
||||
this.delegate = delegate;
|
||||
this.biomes = delegate.stream().collect(Collectors.toSet());
|
||||
extrusions.forEach(e -> biomes.addAll(e.getBiomes()));
|
||||
this.extrusions = extrusions;
|
||||
|
||||
this.pipeline = ExtrusionPipelineFactory.create(extrusions);
|
||||
|
||||
this.resolution = resolution;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Biome getBiome(int x, int y, int z, long seed) {
|
||||
Biome delegated = delegate.getBiome(x, y, z, seed);
|
||||
|
||||
return extrude(delegated, x, y, z, seed);
|
||||
}
|
||||
|
||||
public Biome extrude(Biome original, int x, int y, int z, long seed) {
|
||||
for(Extrusion extrusion : extrusions) {
|
||||
original = extrusion.extrude(original, x, y, z, seed);
|
||||
}
|
||||
return original;
|
||||
return pipeline.extrude(delegated, x, y, z, seed);
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -64,4 +60,4 @@ public class BiomeExtrusionProvider implements BiomeProvider {
|
||||
public BiomeProvider getDelegate() {
|
||||
return delegate;
|
||||
}
|
||||
}
|
||||
}
|
||||
+1
-1
@@ -1,11 +1,11 @@
|
||||
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.object.ObjectTemplate;
|
||||
|
||||
import com.dfsek.terra.addons.biome.extrusion.api.Extrusion;
|
||||
import com.dfsek.terra.api.config.meta.Meta;
|
||||
import com.dfsek.seismic.type.sampler.Sampler;
|
||||
import com.dfsek.terra.api.util.range.Range;
|
||||
|
||||
|
||||
|
||||
+25
-7
@@ -1,5 +1,7 @@
|
||||
package com.dfsek.terra.addons.biome.extrusion.extrusions;
|
||||
|
||||
import com.dfsek.seismic.type.sampler.Sampler;
|
||||
|
||||
import java.util.Collection;
|
||||
import java.util.function.Predicate;
|
||||
import java.util.stream.Collectors;
|
||||
@@ -7,9 +9,9 @@ import java.util.stream.Collectors;
|
||||
import com.dfsek.terra.addons.biome.extrusion.api.Extrusion;
|
||||
import com.dfsek.terra.addons.biome.extrusion.api.ReplaceableBiome;
|
||||
import com.dfsek.terra.addons.biome.query.api.BiomeQueries;
|
||||
import com.dfsek.seismic.type.sampler.Sampler;
|
||||
import com.dfsek.terra.api.util.range.Range;
|
||||
import com.dfsek.terra.api.util.collection.ProbabilityCollection;
|
||||
import com.dfsek.terra.api.util.collection.TriStateIntCache;
|
||||
import com.dfsek.terra.api.util.range.Range;
|
||||
import com.dfsek.terra.api.world.biome.Biome;
|
||||
|
||||
|
||||
@@ -18,25 +20,41 @@ import com.dfsek.terra.api.world.biome.Biome;
|
||||
*/
|
||||
public class ReplaceExtrusion implements Extrusion {
|
||||
private final Sampler sampler;
|
||||
|
||||
private final Range range;
|
||||
|
||||
private final ProbabilityCollection<ReplaceableBiome> biomes;
|
||||
|
||||
private final Predicate<Biome> hasTag;
|
||||
private final TriStateIntCache cache;
|
||||
|
||||
public ReplaceExtrusion(Sampler sampler, Range range, ProbabilityCollection<ReplaceableBiome> biomes, String tag) {
|
||||
this.sampler = sampler;
|
||||
this.range = range;
|
||||
this.biomes = biomes;
|
||||
this.hasTag = BiomeQueries.has(tag);
|
||||
this.cache = new TriStateIntCache(Biome.INT_ID_COUNTER.get());
|
||||
}
|
||||
|
||||
@Override
|
||||
public Biome extrude(Biome original, int x, int y, int z, long seed) {
|
||||
if(hasTag.test(original)) {
|
||||
return range.ifInRange(y, () -> biomes.get(sampler, x, y, z, seed).get(original), original);
|
||||
int id = original.getIntID();
|
||||
|
||||
long state = cache.get(id);
|
||||
boolean passes;
|
||||
|
||||
if(state == TriStateIntCache.STATE_UNSET) {
|
||||
// Only run the test if unset in cache
|
||||
passes = hasTag.test(original);
|
||||
cache.set(id, passes);
|
||||
} else {
|
||||
// Read the primitive long directly
|
||||
passes = (state == TriStateIntCache.STATE_TRUE);
|
||||
}
|
||||
|
||||
if(passes) {
|
||||
if(range.isInRange(y)) {
|
||||
return biomes.get(sampler, x, y, z, seed).get(original);
|
||||
}
|
||||
}
|
||||
|
||||
return original;
|
||||
}
|
||||
|
||||
|
||||
+3
-2
@@ -1,14 +1,15 @@
|
||||
package com.dfsek.terra.addons.biome.extrusion.extrusions;
|
||||
|
||||
import com.dfsek.seismic.type.sampler.Sampler;
|
||||
|
||||
import java.util.Collection;
|
||||
import java.util.function.Predicate;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
import com.dfsek.terra.addons.biome.extrusion.api.Extrusion;
|
||||
import com.dfsek.terra.addons.biome.extrusion.api.ReplaceableBiome;
|
||||
import com.dfsek.seismic.type.sampler.Sampler;
|
||||
import com.dfsek.terra.api.util.range.Range;
|
||||
import com.dfsek.terra.api.util.collection.ProbabilityCollection;
|
||||
import com.dfsek.terra.api.util.range.Range;
|
||||
import com.dfsek.terra.api.world.biome.Biome;
|
||||
|
||||
|
||||
|
||||
+8
@@ -0,0 +1,8 @@
|
||||
package com.dfsek.terra.addons.biome.extrusion.utils;
|
||||
|
||||
import com.dfsek.terra.api.world.biome.Biome;
|
||||
|
||||
|
||||
public interface ExtrusionPipeline {
|
||||
Biome extrude(Biome original, int x, int y, int z, long seed);
|
||||
}
|
||||
+158
@@ -0,0 +1,158 @@
|
||||
package com.dfsek.terra.addons.biome.extrusion.utils;
|
||||
|
||||
import org.objectweb.asm.ClassWriter;
|
||||
import org.objectweb.asm.FieldVisitor;
|
||||
import org.objectweb.asm.MethodVisitor;
|
||||
import org.objectweb.asm.Type;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.concurrent.atomic.AtomicInteger;
|
||||
|
||||
import com.dfsek.terra.addons.biome.extrusion.api.Extrusion;
|
||||
import com.dfsek.terra.api.world.biome.Biome;
|
||||
|
||||
import static org.objectweb.asm.Opcodes.AALOAD;
|
||||
import static org.objectweb.asm.Opcodes.ACC_FINAL;
|
||||
import static org.objectweb.asm.Opcodes.ACC_PRIVATE;
|
||||
import static org.objectweb.asm.Opcodes.ACC_PUBLIC;
|
||||
import static org.objectweb.asm.Opcodes.ALOAD;
|
||||
import static org.objectweb.asm.Opcodes.ARETURN;
|
||||
import static org.objectweb.asm.Opcodes.GETFIELD;
|
||||
import static org.objectweb.asm.Opcodes.ILOAD;
|
||||
import static org.objectweb.asm.Opcodes.INVOKEINTERFACE;
|
||||
import static org.objectweb.asm.Opcodes.INVOKESPECIAL;
|
||||
import static org.objectweb.asm.Opcodes.LLOAD;
|
||||
import static org.objectweb.asm.Opcodes.PUTFIELD;
|
||||
import static org.objectweb.asm.Opcodes.RETURN;
|
||||
import static org.objectweb.asm.Opcodes.SIPUSH;
|
||||
import static org.objectweb.asm.Opcodes.SWAP;
|
||||
import static org.objectweb.asm.Opcodes.V1_8;
|
||||
|
||||
|
||||
public class ExtrusionPipelineFactory {
|
||||
private static final AtomicInteger ID_COUNTER = new AtomicInteger(0);
|
||||
|
||||
// Type Descriptors
|
||||
private static final String EXTRUSION_TYPE = Type.getInternalName(Extrusion.class);
|
||||
private static final String EXTRUSION_DESC = Type.getDescriptor(Extrusion.class);
|
||||
private static final String BIOME_DESC = Type.getDescriptor(Biome.class);
|
||||
private static final String PIPELINE_INTERFACE = Type.getInternalName(ExtrusionPipeline.class);
|
||||
|
||||
// Method Signature: (Biome, int, int, int, long) -> Biome
|
||||
private static final String EXTRUDE_SIG = "(" + BIOME_DESC + "IIIJ)" + BIOME_DESC;
|
||||
|
||||
public static ExtrusionPipeline create(List<Extrusion> extrusions) {
|
||||
// Optimization: If empty, return identity
|
||||
if(extrusions.isEmpty()) {
|
||||
return (original, x, y, z, seed) -> original;
|
||||
}
|
||||
|
||||
String className = "com/dfsek/terra/addons/biome/extrusion/GeneratedExtrusionPipeline_" + ID_COUNTER.getAndIncrement();
|
||||
|
||||
ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_FRAMES | ClassWriter.COMPUTE_MAXS);
|
||||
|
||||
// 1. Define Class
|
||||
cw.visit(V1_8, ACC_PUBLIC | ACC_FINAL, className, null, "java/lang/Object", new String[]{ PIPELINE_INTERFACE });
|
||||
|
||||
// 2. Define Fields (e0, e1, e2...)
|
||||
for(int i = 0; i < extrusions.size(); i++) {
|
||||
FieldVisitor fv = cw.visitField(ACC_PRIVATE | ACC_FINAL, "e" + i, EXTRUSION_DESC, null, null);
|
||||
fv.visitEnd();
|
||||
}
|
||||
|
||||
// 3. Generate Constructor(Extrusion[])
|
||||
generateConstructor(cw, className, extrusions.size());
|
||||
|
||||
// 4. Generate extrude() method
|
||||
generateExtrudeMethod(cw, className, extrusions.size());
|
||||
|
||||
cw.visitEnd();
|
||||
|
||||
// 5. Load and Instantiate
|
||||
byte[] bytecode = cw.toByteArray();
|
||||
try {
|
||||
Class<?> generatedClass = new PipelineClassLoader(ExtrusionPipelineFactory.class.getClassLoader())
|
||||
.defineClass(className.replace('/', '.'), bytecode);
|
||||
|
||||
return (ExtrusionPipeline) generatedClass.getConstructor(Extrusion[].class)
|
||||
.newInstance((Object) extrusions.toArray(new Extrusion[0]));
|
||||
} catch(Exception e) {
|
||||
throw new RuntimeException("Failed to generate ExtrusionPipeline", e);
|
||||
}
|
||||
}
|
||||
|
||||
private static void generateConstructor(ClassWriter cw, String className, int count) {
|
||||
MethodVisitor mv = cw.visitMethod(ACC_PUBLIC, "<init>", "([L" + EXTRUSION_TYPE + ";)V", null, null);
|
||||
mv.visitCode();
|
||||
|
||||
// super()
|
||||
mv.visitVarInsn(ALOAD, 0);
|
||||
mv.visitMethodInsn(INVOKESPECIAL, "java/lang/Object", "<init>", "()V", false);
|
||||
|
||||
// Assign array elements to fields
|
||||
for(int i = 0; i < count; i++) {
|
||||
mv.visitVarInsn(ALOAD, 0); // Load this
|
||||
mv.visitVarInsn(ALOAD, 1); // Load array argument
|
||||
mv.visitIntInsn(SIPUSH, i); // Load index
|
||||
mv.visitInsn(AALOAD); // Load array[i]
|
||||
mv.visitFieldInsn(PUTFIELD, className, "e" + i, EXTRUSION_DESC);
|
||||
}
|
||||
|
||||
mv.visitInsn(RETURN);
|
||||
mv.visitMaxs(0, 0); // Computed automatically
|
||||
mv.visitEnd();
|
||||
}
|
||||
|
||||
private static void generateExtrudeMethod(ClassWriter cw, String className, int count) {
|
||||
MethodVisitor mv = cw.visitMethod(ACC_PUBLIC, "extrude", EXTRUDE_SIG, null, null);
|
||||
mv.visitCode();
|
||||
|
||||
// Helper var indices:
|
||||
// 0: this
|
||||
// 1: Biome original (We will update this or chain it on stack)
|
||||
// 2: int x
|
||||
// 3: int y
|
||||
// 4: int z
|
||||
// 5: long seed
|
||||
|
||||
mv.visitVarInsn(ALOAD, 1); // Load 'original' Biome onto stack initially
|
||||
|
||||
for(int i = 0; i < count; i++) {
|
||||
// Stack contains: [CurrentBiome]
|
||||
|
||||
mv.visitVarInsn(ALOAD, 0); // Load 'this'
|
||||
mv.visitFieldInsn(GETFIELD, className, "e" + i, EXTRUSION_DESC); // Load Extrusion field
|
||||
|
||||
// Stack: [CurrentBiome, Extrusion]
|
||||
// We need: [Extrusion, CurrentBiome, x, y, z, seed]
|
||||
|
||||
mv.visitInsn(SWAP); // Swap to get [Extrusion, CurrentBiome]
|
||||
|
||||
mv.visitVarInsn(ILOAD, 2); // x
|
||||
mv.visitVarInsn(ILOAD, 3); // y
|
||||
mv.visitVarInsn(ILOAD, 4); // z
|
||||
mv.visitVarInsn(LLOAD, 5); // seed
|
||||
|
||||
// Invoke Extrusion.extrude(Biome, x, y, z, seed)
|
||||
mv.visitMethodInsn(INVOKEINTERFACE, EXTRUSION_TYPE, "extrude", EXTRUDE_SIG, true);
|
||||
|
||||
// Stack now contains: [NewBiome]
|
||||
// Loop continues using this result as input for the next one
|
||||
}
|
||||
|
||||
mv.visitInsn(ARETURN); // Return the final Biome
|
||||
mv.visitMaxs(0, 0);
|
||||
mv.visitEnd();
|
||||
}
|
||||
|
||||
// Custom ClassLoader to inject the bytes
|
||||
private static class PipelineClassLoader extends ClassLoader {
|
||||
public PipelineClassLoader(ClassLoader parent) {
|
||||
super(parent);
|
||||
}
|
||||
|
||||
public Class<?> defineClass(String name, byte[] b) {
|
||||
return defineClass(name, b, 0, b.length);
|
||||
}
|
||||
}
|
||||
}
|
||||
+2
-2
@@ -9,6 +9,8 @@ package com.dfsek.terra.addons.biome.image;
|
||||
|
||||
import com.dfsek.tectonic.api.config.template.object.ObjectTemplate;
|
||||
|
||||
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;
|
||||
@@ -27,8 +29,6 @@ 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;
|
||||
|
||||
import java.util.function.Supplier;
|
||||
|
||||
|
||||
public class ImageBiomeProviderAddon implements AddonInitializer {
|
||||
public static final TypeKey<Supplier<ObjectTemplate<BiomeProvider>>> PROVIDER_REGISTRY_KEY = new TypeKey<>() {
|
||||
|
||||
+2
-3
@@ -7,8 +7,7 @@
|
||||
|
||||
package com.dfsek.terra.addons.biome.pipeline;
|
||||
|
||||
import com.dfsek.terra.api.util.cache.SeededVector2Key;
|
||||
|
||||
import com.dfsek.seismic.type.sampler.Sampler;
|
||||
import com.github.benmanes.caffeine.cache.Caffeine;
|
||||
import com.github.benmanes.caffeine.cache.LoadingCache;
|
||||
|
||||
@@ -22,9 +21,9 @@ import com.dfsek.terra.addons.biome.pipeline.api.BiomeChunk;
|
||||
import com.dfsek.terra.addons.biome.pipeline.api.Pipeline;
|
||||
import com.dfsek.terra.addons.biome.pipeline.api.Stage;
|
||||
import com.dfsek.terra.addons.biome.pipeline.api.biome.PipelineBiome;
|
||||
import com.dfsek.seismic.type.sampler.Sampler;
|
||||
import com.dfsek.terra.api.registry.key.StringIdentifiable;
|
||||
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.generation.BiomeProvider;
|
||||
|
||||
|
||||
+2
-2
@@ -1,9 +1,9 @@
|
||||
package com.dfsek.terra.addons.biome.pipeline.api;
|
||||
|
||||
import com.dfsek.terra.api.util.cache.SeededVector2Key;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import com.dfsek.terra.api.util.cache.SeededVector2Key;
|
||||
|
||||
|
||||
public interface Pipeline {
|
||||
BiomeChunk generateChunk(SeededVector2Key worldCoordinates);
|
||||
|
||||
+1
-1
@@ -7,6 +7,7 @@
|
||||
|
||||
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.Description;
|
||||
import com.dfsek.tectonic.api.config.template.annotations.Value;
|
||||
@@ -19,7 +20,6 @@ import com.dfsek.terra.addons.biome.pipeline.api.Source;
|
||||
import com.dfsek.terra.addons.biome.pipeline.api.Stage;
|
||||
import com.dfsek.terra.addons.biome.pipeline.pipeline.PipelineImpl;
|
||||
import com.dfsek.terra.api.config.meta.Meta;
|
||||
import com.dfsek.seismic.type.sampler.Sampler;
|
||||
import com.dfsek.terra.api.world.biome.generation.BiomeProvider;
|
||||
|
||||
|
||||
|
||||
+1
-1
@@ -7,6 +7,7 @@
|
||||
|
||||
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.Value;
|
||||
|
||||
@@ -14,7 +15,6 @@ import com.dfsek.terra.addons.biome.pipeline.api.Source;
|
||||
import com.dfsek.terra.addons.biome.pipeline.api.biome.PipelineBiome;
|
||||
import com.dfsek.terra.addons.biome.pipeline.source.SamplerSource;
|
||||
import com.dfsek.terra.api.config.meta.Meta;
|
||||
import com.dfsek.seismic.type.sampler.Sampler;
|
||||
import com.dfsek.terra.api.util.collection.ProbabilityCollection;
|
||||
|
||||
|
||||
|
||||
+1
-1
@@ -7,13 +7,13 @@
|
||||
|
||||
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.Value;
|
||||
import com.dfsek.tectonic.api.config.template.object.ObjectTemplate;
|
||||
|
||||
import com.dfsek.terra.addons.biome.pipeline.api.Stage;
|
||||
import com.dfsek.terra.api.config.meta.Meta;
|
||||
import com.dfsek.seismic.type.sampler.Sampler;
|
||||
|
||||
|
||||
public abstract class StageTemplate implements ObjectTemplate<Stage> {
|
||||
|
||||
+20
-12
@@ -1,9 +1,9 @@
|
||||
package com.dfsek.terra.addons.biome.pipeline.pipeline;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import com.dfsek.seismic.math.floatingpoint.FloatingPointFunctions;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import com.dfsek.terra.addons.biome.pipeline.api.BiomeChunk;
|
||||
import com.dfsek.terra.addons.biome.pipeline.api.Expander;
|
||||
import com.dfsek.terra.addons.biome.pipeline.api.Stage;
|
||||
@@ -73,12 +73,13 @@ public class BiomeChunkImpl implements BiomeChunk {
|
||||
lookupArray = tempArray;
|
||||
|
||||
// Apply stage to working grid
|
||||
ViewPoint viewPoint = new ViewPoint(this, gridInterval, lookupArray, size);
|
||||
for(int gridZ = 0; gridZ < gridSize; gridZ = gridZ + 1) {
|
||||
for(int gridX = 0; gridX < gridSize; gridX = gridX + 1) {
|
||||
int xIndex = gridOrigin + gridX * gridInterval;
|
||||
int zIndex = gridOrigin + gridZ * gridInterval;
|
||||
biomes[(xIndex * size) + zIndex] = stage.apply(
|
||||
new ViewPoint(this, gridInterval, gridX, gridZ, xIndex, zIndex, lookupArray, size));
|
||||
viewPoint.set(gridX, gridZ, xIndex, zIndex);
|
||||
biomes[(xIndex * size) + zIndex] = stage.apply(viewPoint);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -157,25 +158,32 @@ public class BiomeChunkImpl implements BiomeChunk {
|
||||
*/
|
||||
public static class ViewPoint {
|
||||
private final BiomeChunkImpl chunk;
|
||||
private final PipelineBiome biome;
|
||||
private PipelineBiome biome;
|
||||
private final int gridInterval;
|
||||
private final int gridX;
|
||||
private final int gridZ;
|
||||
private final int xIndex;
|
||||
private final int zIndex;
|
||||
private int gridX;
|
||||
private int gridZ;
|
||||
private int xIndex;
|
||||
private int zIndex;
|
||||
private final PipelineBiome[] lookupArray;
|
||||
private final int size;
|
||||
|
||||
private ViewPoint(BiomeChunkImpl chunk, int gridInterval, int gridX, int gridZ, int xIndex, int zIndex,
|
||||
private ViewPoint(BiomeChunkImpl chunk, int gridInterval,
|
||||
PipelineBiome[] lookupArray, int size) {
|
||||
this.chunk = chunk;
|
||||
this.gridInterval = gridInterval;
|
||||
this.gridX = 0;
|
||||
this.gridZ = 0;
|
||||
this.xIndex = 0;
|
||||
this.zIndex = 0;
|
||||
this.lookupArray = lookupArray;
|
||||
this.size = size;
|
||||
}
|
||||
|
||||
public void set(int gridX, int gridZ, int xIndex, int zIndex) {
|
||||
this.gridX = gridX;
|
||||
this.gridZ = gridZ;
|
||||
this.xIndex = xIndex;
|
||||
this.zIndex = zIndex;
|
||||
this.lookupArray = lookupArray;
|
||||
this.size = size;
|
||||
this.biome = lookupArray[(this.xIndex * this.size) + this.zIndex];
|
||||
}
|
||||
|
||||
|
||||
+1
-2
@@ -1,7 +1,5 @@
|
||||
package com.dfsek.terra.addons.biome.pipeline.pipeline;
|
||||
|
||||
import com.dfsek.terra.api.util.cache.SeededVector2Key;
|
||||
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
@@ -12,6 +10,7 @@ import com.dfsek.terra.addons.biome.pipeline.api.Expander;
|
||||
import com.dfsek.terra.addons.biome.pipeline.api.Pipeline;
|
||||
import com.dfsek.terra.addons.biome.pipeline.api.Source;
|
||||
import com.dfsek.terra.addons.biome.pipeline.api.Stage;
|
||||
import com.dfsek.terra.api.util.cache.SeededVector2Key;
|
||||
|
||||
|
||||
public class PipelineImpl implements Pipeline {
|
||||
|
||||
+2
-1
@@ -7,9 +7,10 @@
|
||||
|
||||
package com.dfsek.terra.addons.biome.pipeline.source;
|
||||
|
||||
import com.dfsek.seismic.type.sampler.Sampler;
|
||||
|
||||
import com.dfsek.terra.addons.biome.pipeline.api.Source;
|
||||
import com.dfsek.terra.addons.biome.pipeline.api.biome.PipelineBiome;
|
||||
import com.dfsek.seismic.type.sampler.Sampler;
|
||||
import com.dfsek.terra.api.util.collection.ProbabilityCollection;
|
||||
|
||||
|
||||
|
||||
+2
-1
@@ -1,9 +1,10 @@
|
||||
package com.dfsek.terra.addons.biome.pipeline.stage.expander;
|
||||
|
||||
import com.dfsek.seismic.type.sampler.Sampler;
|
||||
|
||||
import com.dfsek.terra.addons.biome.pipeline.api.Expander;
|
||||
import com.dfsek.terra.addons.biome.pipeline.api.biome.PipelineBiome;
|
||||
import com.dfsek.terra.addons.biome.pipeline.pipeline.BiomeChunkImpl;
|
||||
import com.dfsek.seismic.type.sampler.Sampler;
|
||||
|
||||
|
||||
public class FractalExpander implements Expander {
|
||||
|
||||
+3
-3
@@ -7,6 +7,9 @@
|
||||
|
||||
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.HashSet;
|
||||
import java.util.List;
|
||||
@@ -14,12 +17,9 @@ import java.util.Map;
|
||||
import java.util.Set;
|
||||
import java.util.function.Predicate;
|
||||
|
||||
import com.dfsek.seismic.type.vector.Vector2Int;
|
||||
|
||||
import com.dfsek.terra.addons.biome.pipeline.api.Stage;
|
||||
import com.dfsek.terra.addons.biome.pipeline.api.biome.PipelineBiome;
|
||||
import com.dfsek.terra.addons.biome.pipeline.pipeline.BiomeChunkImpl;
|
||||
import com.dfsek.seismic.type.sampler.Sampler;
|
||||
import com.dfsek.terra.api.util.collection.ProbabilityCollection;
|
||||
|
||||
|
||||
|
||||
+3
-2
@@ -7,6 +7,9 @@
|
||||
|
||||
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.HashSet;
|
||||
import java.util.List;
|
||||
@@ -16,9 +19,7 @@ import java.util.function.Predicate;
|
||||
import com.dfsek.terra.addons.biome.pipeline.api.Stage;
|
||||
import com.dfsek.terra.addons.biome.pipeline.api.biome.PipelineBiome;
|
||||
import com.dfsek.terra.addons.biome.pipeline.pipeline.BiomeChunkImpl;
|
||||
import com.dfsek.seismic.type.sampler.Sampler;
|
||||
import com.dfsek.terra.api.util.collection.ProbabilityCollection;
|
||||
import com.dfsek.seismic.type.vector.Vector2Int;
|
||||
|
||||
|
||||
public class BorderStage implements Stage {
|
||||
|
||||
+2
-1
@@ -7,6 +7,8 @@
|
||||
|
||||
package com.dfsek.terra.addons.biome.pipeline.stage.mutators;
|
||||
|
||||
import com.dfsek.seismic.type.sampler.Sampler;
|
||||
|
||||
import java.util.HashSet;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
@@ -15,7 +17,6 @@ import java.util.stream.Stream;
|
||||
import com.dfsek.terra.addons.biome.pipeline.api.Stage;
|
||||
import com.dfsek.terra.addons.biome.pipeline.api.biome.PipelineBiome;
|
||||
import com.dfsek.terra.addons.biome.pipeline.pipeline.BiomeChunkImpl;
|
||||
import com.dfsek.seismic.type.sampler.Sampler;
|
||||
import com.dfsek.terra.api.util.collection.ProbabilityCollection;
|
||||
|
||||
|
||||
|
||||
+2
-1
@@ -7,6 +7,8 @@
|
||||
|
||||
package com.dfsek.terra.addons.biome.pipeline.stage.mutators;
|
||||
|
||||
import com.dfsek.seismic.type.sampler.Sampler;
|
||||
|
||||
import java.util.HashSet;
|
||||
import java.util.Set;
|
||||
import java.util.stream.Stream;
|
||||
@@ -14,7 +16,6 @@ import java.util.stream.Stream;
|
||||
import com.dfsek.terra.addons.biome.pipeline.api.Stage;
|
||||
import com.dfsek.terra.addons.biome.pipeline.api.biome.PipelineBiome;
|
||||
import com.dfsek.terra.addons.biome.pipeline.pipeline.BiomeChunkImpl;
|
||||
import com.dfsek.seismic.type.sampler.Sampler;
|
||||
import com.dfsek.terra.api.util.collection.ProbabilityCollection;
|
||||
|
||||
|
||||
|
||||
+2
-1
@@ -7,12 +7,13 @@
|
||||
|
||||
package com.dfsek.terra.addons.biome.pipeline.stage.mutators;
|
||||
|
||||
import com.dfsek.seismic.type.sampler.Sampler;
|
||||
|
||||
import java.util.Objects;
|
||||
|
||||
import com.dfsek.terra.addons.biome.pipeline.api.Stage;
|
||||
import com.dfsek.terra.addons.biome.pipeline.api.biome.PipelineBiome;
|
||||
import com.dfsek.terra.addons.biome.pipeline.pipeline.BiomeChunkImpl;
|
||||
import com.dfsek.seismic.type.sampler.Sampler;
|
||||
|
||||
|
||||
public class SmoothStage implements Stage {
|
||||
|
||||
@@ -1,11 +0,0 @@
|
||||
version = version("0.1.0")
|
||||
|
||||
dependencies {
|
||||
compileOnlyApi(project(":common:addons:manifest-addon-loader"))
|
||||
api("com.dfsek", "paralithic", Versions.Libraries.paralithic)
|
||||
}
|
||||
|
||||
tasks.named<com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar>("shadowJar") {
|
||||
relocate("net.jafama", "com.dfsek.terra.addons.chunkgenerator.lib.jafama")
|
||||
relocate("com.dfsek.paralithic", "com.dfsek.terra.addons.chunkgenerator.lib.paralithic")
|
||||
}
|
||||
-177
@@ -1,177 +0,0 @@
|
||||
package com.dfsek.terra.addons.chunkgenerator;
|
||||
|
||||
import com.dfsek.tectonic.api.config.template.object.ObjectTemplate;
|
||||
|
||||
import com.dfsek.terra.addons.chunkgenerator.config.sampler.ElevationLayerSamplerTemplate;
|
||||
import com.dfsek.terra.addons.chunkgenerator.layer.sampler.ElevationLayerSampler;
|
||||
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
import java.util.function.Supplier;
|
||||
|
||||
import com.dfsek.terra.addons.chunkgenerator.api.LayerPalette;
|
||||
import com.dfsek.terra.addons.chunkgenerator.api.LayerPredicate;
|
||||
import com.dfsek.terra.addons.chunkgenerator.api.LayerResolver;
|
||||
import com.dfsek.terra.addons.chunkgenerator.api.LayerSampler;
|
||||
import com.dfsek.terra.addons.chunkgenerator.config.pack.LayerPalettePackConfigTemplate;
|
||||
import com.dfsek.terra.addons.chunkgenerator.config.pack.LayerPredicatePackConfigTemplate;
|
||||
import com.dfsek.terra.addons.chunkgenerator.config.pack.LayerResolverPackConfigTemplate;
|
||||
import com.dfsek.terra.addons.chunkgenerator.config.pack.LayerSamplerPackConfigTemplate;
|
||||
import com.dfsek.terra.addons.chunkgenerator.config.palette.BiomeDefinedLayerPaletteTemplate;
|
||||
import com.dfsek.terra.addons.chunkgenerator.config.palette.DotProductLayerPaletteTemplate;
|
||||
import com.dfsek.terra.addons.chunkgenerator.config.palette.PlatformAirLayerPaletteTemplate;
|
||||
import com.dfsek.terra.addons.chunkgenerator.config.palette.SimpleLayerPaletteTemplate;
|
||||
import com.dfsek.terra.addons.chunkgenerator.config.pointset.generative.AdjacentPointSetTemplate;
|
||||
import com.dfsek.terra.addons.chunkgenerator.config.pointset.generative.SimplePointSetTemplate;
|
||||
import com.dfsek.terra.addons.chunkgenerator.config.pointset.generative.geometric.CubePointSetTemplate;
|
||||
import com.dfsek.terra.addons.chunkgenerator.config.pointset.generative.geometric.CuboidPointSetTemplate;
|
||||
import com.dfsek.terra.addons.chunkgenerator.config.pointset.generative.geometric.SphericalPointSetTemplate;
|
||||
import com.dfsek.terra.addons.chunkgenerator.config.pointset.operative.DifferencePointSetTemplate;
|
||||
import com.dfsek.terra.addons.chunkgenerator.config.pointset.operative.ExpressionFilterPointSetTemplate;
|
||||
import com.dfsek.terra.addons.chunkgenerator.config.pointset.operative.IntersectionPointSetTemplate;
|
||||
import com.dfsek.terra.addons.chunkgenerator.config.pointset.operative.UnionPointSetTemplate;
|
||||
import com.dfsek.terra.addons.chunkgenerator.config.predicate.BelowLayerPredicateTemplate;
|
||||
import com.dfsek.terra.addons.chunkgenerator.config.predicate.RangeLayerPredicateTemplate;
|
||||
import com.dfsek.terra.addons.chunkgenerator.config.predicate.SamplerLayerPredicateTemplate;
|
||||
import com.dfsek.terra.addons.chunkgenerator.config.predicate.SamplerListLayerPredicateTemplate;
|
||||
import com.dfsek.terra.addons.chunkgenerator.config.resolve.PaletteLayerResolverTemplate;
|
||||
import com.dfsek.terra.addons.chunkgenerator.config.resolve.PredicateLayerResolverTemplate;
|
||||
import com.dfsek.terra.addons.chunkgenerator.config.sampler.BiomeDefinedLayerSamplerTemplate;
|
||||
import com.dfsek.terra.addons.chunkgenerator.config.sampler.DensityLayerSamplerTemplate;
|
||||
import com.dfsek.terra.addons.chunkgenerator.generation.LayeredChunkGenerator;
|
||||
import com.dfsek.terra.addons.chunkgenerator.layer.palette.BiomeDefinedLayerPalette;
|
||||
import com.dfsek.terra.addons.chunkgenerator.layer.sampler.BiomeDefinedLayerSampler;
|
||||
import com.dfsek.terra.addons.chunkgenerator.math.RelationalOperator;
|
||||
import com.dfsek.terra.addons.chunkgenerator.math.pointset.PointSet;
|
||||
import com.dfsek.terra.addons.chunkgenerator.util.InstanceWrapper;
|
||||
import com.dfsek.terra.addons.manifest.api.AddonInitializer;
|
||||
import com.dfsek.terra.api.Platform;
|
||||
import com.dfsek.terra.api.addon.BaseAddon;
|
||||
import com.dfsek.terra.api.event.events.config.ConfigurationLoadEvent;
|
||||
import com.dfsek.terra.api.event.events.config.pack.ConfigPackPreLoadEvent;
|
||||
import com.dfsek.terra.api.event.functional.FunctionalEventHandler;
|
||||
import com.dfsek.terra.api.inject.annotations.Inject;
|
||||
import com.dfsek.terra.api.registry.CheckedRegistry;
|
||||
import com.dfsek.terra.api.util.reflection.TypeKey;
|
||||
import com.dfsek.terra.api.world.chunk.generation.util.provider.ChunkGeneratorProvider;
|
||||
|
||||
|
||||
public class LayeredChunkGeneratorAddon implements AddonInitializer {
|
||||
|
||||
private static final Logger logger = LoggerFactory.getLogger( LayeredChunkGeneratorAddon.class);
|
||||
|
||||
public static final TypeKey<Supplier<ObjectTemplate<PointSet>>> POINT_SET_TYPE_TOKEN = new TypeKey<>() {
|
||||
};
|
||||
|
||||
public static final TypeKey<Supplier<ObjectTemplate<LayerSampler>>> LAYER_SAMPLER_TYPE_TOKEN = new TypeKey<>() {
|
||||
};
|
||||
|
||||
public static final TypeKey<InstanceWrapper<LayerSampler>> LAYER_SAMPLER_TOKEN = new TypeKey<>() {
|
||||
};
|
||||
|
||||
public static final TypeKey<Supplier<ObjectTemplate<LayerPalette>>> LAYER_PALETTE_TYPE_TOKEN = new TypeKey<>() {
|
||||
};
|
||||
|
||||
public static final TypeKey<InstanceWrapper<LayerPalette>> LAYER_PALETTE_TOKEN = new TypeKey<>() {
|
||||
};
|
||||
|
||||
public static final TypeKey<Supplier<ObjectTemplate<LayerPredicate>>> LAYER_PREDICATE_TYPE_TOKEN = new TypeKey<>() {
|
||||
};
|
||||
|
||||
public static final TypeKey<InstanceWrapper<LayerPredicate>> LAYER_PREDICATE_TOKEN = new TypeKey<>() {
|
||||
};
|
||||
|
||||
public static final TypeKey<Supplier<ObjectTemplate<LayerResolver>>> LAYER_RESOLVER_TYPE_TOKEN = new TypeKey<>() {
|
||||
};
|
||||
|
||||
@Inject
|
||||
private Platform platform;
|
||||
|
||||
@Inject
|
||||
private BaseAddon addon;
|
||||
|
||||
@Override
|
||||
public void initialize() {
|
||||
|
||||
platform.getEventManager()
|
||||
.getHandler(FunctionalEventHandler.class)
|
||||
.register(addon, ConfigPackPreLoadEvent.class)
|
||||
.priority(1000)
|
||||
.then(event -> {
|
||||
event.getPack().applyLoader(RelationalOperator.class,
|
||||
(type, o, loader, depthTracker) -> RelationalOperator.valueOf((String) o));
|
||||
|
||||
CheckedRegistry<Supplier<ObjectTemplate<PointSet>>> pointSetTypeRegistry = event.getPack().getOrCreateRegistry(
|
||||
POINT_SET_TYPE_TOKEN);
|
||||
pointSetTypeRegistry.register(addon.key("LIST"), SimplePointSetTemplate::new);
|
||||
pointSetTypeRegistry.register(addon.key("ADJACENT"), AdjacentPointSetTemplate::new);
|
||||
|
||||
pointSetTypeRegistry.register(addon.key("SPHERE"), SphericalPointSetTemplate::new);
|
||||
pointSetTypeRegistry.register(addon.key("CUBOID"), CuboidPointSetTemplate::new);
|
||||
pointSetTypeRegistry.register(addon.key("CUBE"), CubePointSetTemplate::new);
|
||||
|
||||
pointSetTypeRegistry.register(addon.key("UNION"), UnionPointSetTemplate::new);
|
||||
pointSetTypeRegistry.register(addon.key("INTERSECTION"), IntersectionPointSetTemplate::new);
|
||||
pointSetTypeRegistry.register(addon.key("DIFFERENCE"), DifferencePointSetTemplate::new);
|
||||
|
||||
pointSetTypeRegistry.register(addon.key("EXPRESSION"), ExpressionFilterPointSetTemplate::new);
|
||||
})
|
||||
.then(event -> {
|
||||
CheckedRegistry<Supplier<ObjectTemplate<LayerSampler>>> samplerTypeRegistry = event.getPack().getOrCreateRegistry(LAYER_SAMPLER_TYPE_TOKEN);
|
||||
CheckedRegistry<InstanceWrapper<LayerSampler>> samplerRegistry = event.getPack().getOrCreateRegistry(LAYER_SAMPLER_TOKEN);
|
||||
samplerTypeRegistry.register(addon.key("DENSITY"), DensityLayerSamplerTemplate::new);
|
||||
samplerTypeRegistry.register(addon.key("ELEVATION"), ElevationLayerSamplerTemplate::new);
|
||||
samplerTypeRegistry.register(addon.key("BIOME_DEFINED"), BiomeDefinedLayerSamplerTemplate::new);
|
||||
|
||||
event.loadTemplate(new LayerSamplerPackConfigTemplate()).getSamplers().forEach((key, sampler) -> {
|
||||
samplerRegistry.register(addon.key(key), new InstanceWrapper<>(sampler));
|
||||
});
|
||||
})
|
||||
.then(event -> {
|
||||
CheckedRegistry<Supplier<ObjectTemplate<LayerPredicate>>> predicateTypeRegistry = event.getPack().getOrCreateRegistry(LAYER_PREDICATE_TYPE_TOKEN);
|
||||
predicateTypeRegistry.register(addon.key("BELOW"), BelowLayerPredicateTemplate::new);
|
||||
predicateTypeRegistry.register(addon.key("RANGE"), RangeLayerPredicateTemplate::new);
|
||||
predicateTypeRegistry.register(addon.key("SAMPLER"), SamplerLayerPredicateTemplate::new);
|
||||
predicateTypeRegistry.register(addon.key("SAMPLER_POINTS"), SamplerListLayerPredicateTemplate::new);
|
||||
|
||||
CheckedRegistry<InstanceWrapper<LayerPredicate>> predicateRegistry = event.getPack().getOrCreateRegistry(LAYER_PREDICATE_TOKEN);
|
||||
event.loadTemplate(new LayerPredicatePackConfigTemplate()).getPredicates().forEach((key, predicate) -> {
|
||||
predicateRegistry.register(addon.key(key), new InstanceWrapper<>(predicate));
|
||||
});
|
||||
})
|
||||
.then(event -> {
|
||||
CheckedRegistry<Supplier<ObjectTemplate<LayerPalette>>> paletteTypeRegistry = event.getPack().getOrCreateRegistry(LAYER_PALETTE_TYPE_TOKEN);
|
||||
paletteTypeRegistry.register(addon.key("PALETTE"), SimpleLayerPaletteTemplate::new);
|
||||
paletteTypeRegistry.register(addon.key("BIOME_DEFINED"), BiomeDefinedLayerPaletteTemplate::new);
|
||||
paletteTypeRegistry.register(addon.key("AIR"), () -> new PlatformAirLayerPaletteTemplate(platform));
|
||||
paletteTypeRegistry.register(addon.key("SURFACE_NORMAL"), DotProductLayerPaletteTemplate::new);
|
||||
|
||||
event.getPack().applyLoader(LayerPalette.Group.class, new LayerPalette.Group.Loader(event.getPack()));
|
||||
|
||||
CheckedRegistry<InstanceWrapper<LayerPalette>> paletteRegistry = event.getPack().getOrCreateRegistry(LAYER_PALETTE_TOKEN);
|
||||
event.loadTemplate(new LayerPalettePackConfigTemplate()).getPalettes().forEach((key, palette) -> {
|
||||
paletteRegistry.register(addon.key(key), new InstanceWrapper<>(palette));
|
||||
});
|
||||
})
|
||||
.then(event -> {
|
||||
CheckedRegistry<Supplier<ObjectTemplate<LayerResolver>>> resolverTypeRegistry = event.getPack().getOrCreateRegistry(LAYER_RESOLVER_TYPE_TOKEN);
|
||||
resolverTypeRegistry.register(addon.key("TEST"), PredicateLayerResolverTemplate::new);
|
||||
resolverTypeRegistry.register(addon.key("LAYER"), PaletteLayerResolverTemplate::new);
|
||||
LayerResolver resolver = event.loadTemplate(new LayerResolverPackConfigTemplate()).getResolver();
|
||||
|
||||
event.getPack()
|
||||
.getOrCreateRegistry(ChunkGeneratorProvider.class)
|
||||
.register(addon.key("LAYERED"),
|
||||
pack -> new LayeredChunkGenerator(platform, resolver));
|
||||
})
|
||||
.failThrough();
|
||||
|
||||
platform.getEventManager()
|
||||
.getHandler(FunctionalEventHandler.class)
|
||||
.register(addon, ConfigurationLoadEvent.class)
|
||||
.priority(1000)
|
||||
.then(BiomeDefinedLayerPalette.injectLayerPalettes)
|
||||
.then(BiomeDefinedLayerSampler.injectLayerSamplers);
|
||||
}
|
||||
}
|
||||
-72
@@ -1,72 +0,0 @@
|
||||
package com.dfsek.terra.addons.chunkgenerator.api;
|
||||
|
||||
import com.dfsek.tectonic.api.depth.DepthTracker;
|
||||
import com.dfsek.tectonic.api.exception.LoadException;
|
||||
import com.dfsek.tectonic.api.loader.ConfigLoader;
|
||||
import com.dfsek.tectonic.api.loader.type.TypeLoader;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
import java.lang.reflect.AnnotatedType;
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
||||
import com.dfsek.terra.api.config.ConfigPack;
|
||||
import com.dfsek.terra.api.properties.Properties;
|
||||
import com.dfsek.terra.api.world.biome.generation.BiomeProvider;
|
||||
import com.dfsek.terra.api.world.chunk.generation.util.Palette;
|
||||
import com.dfsek.terra.api.world.info.WorldProperties;
|
||||
|
||||
|
||||
public abstract class LayerPalette {
|
||||
|
||||
private final Group group;
|
||||
|
||||
private final boolean resetsGroup;
|
||||
|
||||
protected LayerPalette(Group group, boolean resetsGroup) {
|
||||
this.group = group;
|
||||
this.resetsGroup = resetsGroup;
|
||||
}
|
||||
|
||||
public abstract Palette get(int x, int y, int z, WorldProperties world, BiomeProvider biomeProvider);
|
||||
|
||||
public final Group getGroup() {
|
||||
return group;
|
||||
}
|
||||
|
||||
public final boolean resetsGroup() {
|
||||
return resetsGroup;
|
||||
}
|
||||
|
||||
public static class Group {
|
||||
|
||||
public static Group NO_GROUP = new Group();
|
||||
|
||||
private Group() {}
|
||||
|
||||
public static Group get(String string, ConfigPack pack) {
|
||||
if (!pack.getContext().has(Holder.class)) {
|
||||
pack.getContext().put(new Holder(new HashMap<>()));
|
||||
}
|
||||
return pack.getContext().get(Holder.class).groups.computeIfAbsent(string, s -> new Group());
|
||||
}
|
||||
|
||||
private record Holder(Map<String, Group> groups) implements Properties {}
|
||||
|
||||
public static class Loader implements TypeLoader<Group> {
|
||||
|
||||
private final ConfigPack pack;
|
||||
|
||||
public Loader(ConfigPack pack) {
|
||||
this.pack = pack;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Group load(@NotNull AnnotatedType annotatedType, @NotNull Object o, @NotNull ConfigLoader configLoader,
|
||||
DepthTracker depthTracker) throws LoadException {
|
||||
String groupName = (String) o;
|
||||
return Group.get(groupName, pack);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
-9
@@ -1,9 +0,0 @@
|
||||
package com.dfsek.terra.addons.chunkgenerator.api;
|
||||
|
||||
import com.dfsek.terra.api.world.biome.generation.BiomeProvider;
|
||||
import com.dfsek.terra.api.world.info.WorldProperties;
|
||||
|
||||
|
||||
public interface LayerPredicate {
|
||||
boolean test(int x, int y, int z, WorldProperties worldProperties, BiomeProvider biomeProvider);
|
||||
}
|
||||
-9
@@ -1,9 +0,0 @@
|
||||
package com.dfsek.terra.addons.chunkgenerator.api;
|
||||
|
||||
import com.dfsek.terra.api.world.biome.generation.BiomeProvider;
|
||||
import com.dfsek.terra.api.world.info.WorldProperties;
|
||||
|
||||
|
||||
public interface LayerResolver {
|
||||
LayerPalette resolve(int x, int y, int z, WorldProperties world, BiomeProvider biomeProvider);
|
||||
}
|
||||
-12
@@ -1,12 +0,0 @@
|
||||
package com.dfsek.terra.addons.chunkgenerator.api;
|
||||
|
||||
import com.dfsek.terra.addons.chunkgenerator.api.chunk.ChunkLayerSampler;
|
||||
import com.dfsek.terra.api.world.biome.generation.BiomeProvider;
|
||||
import com.dfsek.terra.api.world.info.WorldProperties;
|
||||
|
||||
|
||||
public interface LayerSampler {
|
||||
double sample(int x, int y, int z, WorldProperties world, BiomeProvider biomeProvider);
|
||||
ChunkLayerSampler getChunk(int chunkX, int chunkZ, WorldProperties world, BiomeProvider biomeProvider);
|
||||
double getBlendWeight();
|
||||
}
|
||||
-9
@@ -1,9 +0,0 @@
|
||||
package com.dfsek.terra.addons.chunkgenerator.api.chunk;
|
||||
|
||||
import com.dfsek.terra.api.world.biome.generation.BiomeProvider;
|
||||
import com.dfsek.terra.api.world.info.WorldProperties;
|
||||
|
||||
|
||||
public interface ChunkLayerSampler {
|
||||
double sample(int fmX, int y, int fmZ);
|
||||
}
|
||||
-21
@@ -1,21 +0,0 @@
|
||||
package com.dfsek.terra.addons.chunkgenerator.config.pack;
|
||||
|
||||
import com.dfsek.tectonic.api.config.template.ConfigTemplate;
|
||||
import com.dfsek.tectonic.api.config.template.annotations.Value;
|
||||
|
||||
import java.util.Map;
|
||||
|
||||
import com.dfsek.terra.addons.chunkgenerator.api.LayerPalette;
|
||||
import com.dfsek.terra.api.config.meta.Meta;
|
||||
|
||||
|
||||
public class LayerPalettePackConfigTemplate implements ConfigTemplate {
|
||||
|
||||
@Value("generation.layers")
|
||||
private @Meta Map<String, LayerPalette> palettes;
|
||||
|
||||
public Map<String, LayerPalette> getPalettes() {
|
||||
return palettes;
|
||||
}
|
||||
|
||||
}
|
||||
-24
@@ -1,24 +0,0 @@
|
||||
package com.dfsek.terra.addons.chunkgenerator.config.pack;
|
||||
|
||||
import com.dfsek.tectonic.api.config.template.ConfigTemplate;
|
||||
import com.dfsek.tectonic.api.config.template.annotations.Default;
|
||||
import com.dfsek.tectonic.api.config.template.annotations.Value;
|
||||
|
||||
import java.util.LinkedHashMap;
|
||||
import java.util.Map;
|
||||
|
||||
import com.dfsek.terra.addons.chunkgenerator.api.LayerPredicate;
|
||||
import com.dfsek.terra.api.config.meta.Meta;
|
||||
|
||||
|
||||
public class LayerPredicatePackConfigTemplate implements ConfigTemplate {
|
||||
|
||||
@Value("generation.tests")
|
||||
@Default
|
||||
private @Meta Map<String, LayerPredicate> predicates = new LinkedHashMap<>();
|
||||
|
||||
public Map<String, LayerPredicate> getPredicates() {
|
||||
return predicates;
|
||||
}
|
||||
|
||||
}
|
||||
-18
@@ -1,18 +0,0 @@
|
||||
package com.dfsek.terra.addons.chunkgenerator.config.pack;
|
||||
|
||||
import com.dfsek.tectonic.api.config.template.ConfigTemplate;
|
||||
import com.dfsek.tectonic.api.config.template.annotations.Value;
|
||||
|
||||
import com.dfsek.terra.addons.chunkgenerator.api.LayerResolver;
|
||||
import com.dfsek.terra.api.config.meta.Meta;
|
||||
|
||||
|
||||
public class LayerResolverPackConfigTemplate implements ConfigTemplate {
|
||||
|
||||
@Value("generation.resolver")
|
||||
private @Meta LayerResolver resolver;
|
||||
|
||||
public LayerResolver getResolver() {
|
||||
return resolver;
|
||||
}
|
||||
}
|
||||
-21
@@ -1,21 +0,0 @@
|
||||
package com.dfsek.terra.addons.chunkgenerator.config.pack;
|
||||
|
||||
import com.dfsek.tectonic.api.config.template.ConfigTemplate;
|
||||
import com.dfsek.tectonic.api.config.template.annotations.Value;
|
||||
|
||||
import java.util.Map;
|
||||
|
||||
import com.dfsek.terra.addons.chunkgenerator.api.LayerSampler;
|
||||
import com.dfsek.terra.api.config.meta.Meta;
|
||||
|
||||
|
||||
public class LayerSamplerPackConfigTemplate implements ConfigTemplate {
|
||||
|
||||
@Value("generation.samplers")
|
||||
private @Meta Map<String, LayerSampler> samplers;
|
||||
|
||||
public Map<String, LayerSampler> getSamplers() {
|
||||
return samplers;
|
||||
}
|
||||
|
||||
}
|
||||
-21
@@ -1,21 +0,0 @@
|
||||
package com.dfsek.terra.addons.chunkgenerator.config.palette;
|
||||
|
||||
import com.dfsek.tectonic.api.config.template.annotations.Default;
|
||||
import com.dfsek.tectonic.api.config.template.annotations.Value;
|
||||
|
||||
import com.dfsek.terra.addons.chunkgenerator.api.LayerPalette;
|
||||
import com.dfsek.terra.addons.chunkgenerator.layer.palette.BiomeDefinedLayerPalette;
|
||||
import com.dfsek.terra.api.world.chunk.generation.util.Palette;
|
||||
|
||||
|
||||
public class BiomeDefinedLayerPaletteTemplate extends LayerPaletteTemplate {
|
||||
|
||||
@Value("default")
|
||||
@Default
|
||||
private Palette defaultPalette = null;
|
||||
|
||||
@Override
|
||||
public LayerPalette get() {
|
||||
return new BiomeDefinedLayerPalette(group, resetsGroup, defaultPalette);
|
||||
}
|
||||
}
|
||||
-44
@@ -1,44 +0,0 @@
|
||||
package com.dfsek.terra.addons.chunkgenerator.config.palette;
|
||||
|
||||
import com.dfsek.tectonic.api.config.template.annotations.Default;
|
||||
import com.dfsek.tectonic.api.config.template.annotations.Value;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
||||
import com.dfsek.terra.addons.chunkgenerator.api.LayerPalette;
|
||||
import com.dfsek.terra.addons.chunkgenerator.api.LayerSampler;
|
||||
import com.dfsek.terra.addons.chunkgenerator.layer.palette.DotProductLayerPalette;
|
||||
import com.dfsek.terra.addons.chunkgenerator.math.pointset.generative.AdjacentPointSet;
|
||||
import com.dfsek.terra.addons.chunkgenerator.palette.DoubleNavigableHolder;
|
||||
import com.dfsek.terra.addons.chunkgenerator.util.InstanceWrapper;
|
||||
import com.dfsek.terra.addons.chunkgenerator.math.pointset.PointSet;
|
||||
import com.dfsek.seismic.type.vector.Vector3;
|
||||
import com.dfsek.terra.api.world.chunk.generation.util.Palette;
|
||||
|
||||
|
||||
public class DotProductLayerPaletteTemplate extends LayerPaletteTemplate {
|
||||
|
||||
@Value("normal.approximation-points")
|
||||
@Default
|
||||
private PointSet normalApproximationPoints = new AdjacentPointSet();
|
||||
|
||||
@Value("normal.direction")
|
||||
@Default
|
||||
private Vector3 direction = Vector3.of(0, 1, 0);
|
||||
|
||||
@Value("normal.sampler")
|
||||
private InstanceWrapper<LayerSampler> sampler;
|
||||
|
||||
@Value("palettes")
|
||||
private Map<String, Palette> palettes;
|
||||
|
||||
@Override
|
||||
public LayerPalette get() {
|
||||
Map<Double, Palette> paletteMap = new HashMap<>();
|
||||
palettes.forEach((s, p) -> {
|
||||
paletteMap.put(Double.parseDouble(s), p);
|
||||
});
|
||||
return new DotProductLayerPalette(group, resetsGroup, normalApproximationPoints, new DoubleNavigableHolder<>(paletteMap), sampler.get(), direction);
|
||||
}
|
||||
}
|
||||
-21
@@ -1,21 +0,0 @@
|
||||
package com.dfsek.terra.addons.chunkgenerator.config.palette;
|
||||
|
||||
import com.dfsek.tectonic.api.config.template.annotations.Default;
|
||||
import com.dfsek.tectonic.api.config.template.annotations.Value;
|
||||
|
||||
import com.dfsek.tectonic.api.config.template.object.ObjectTemplate;
|
||||
|
||||
import com.dfsek.terra.addons.chunkgenerator.api.LayerPalette;
|
||||
|
||||
|
||||
public abstract class LayerPaletteTemplate implements ObjectTemplate<LayerPalette> {
|
||||
|
||||
@Value("group")
|
||||
@Default
|
||||
protected LayerPalette.Group group = LayerPalette.Group.NO_GROUP;
|
||||
|
||||
@Value("resets-group")
|
||||
@Default
|
||||
protected boolean resetsGroup = false;
|
||||
|
||||
}
|
||||
-22
@@ -1,22 +0,0 @@
|
||||
package com.dfsek.terra.addons.chunkgenerator.config.palette;
|
||||
|
||||
import com.dfsek.terra.addons.chunkgenerator.api.LayerPalette;
|
||||
import com.dfsek.terra.addons.chunkgenerator.layer.palette.SimpleLayerPalette;
|
||||
import com.dfsek.terra.addons.chunkgenerator.palette.SingletonPalette;
|
||||
import com.dfsek.terra.api.Platform;
|
||||
import com.dfsek.terra.api.block.state.BlockState;
|
||||
|
||||
|
||||
public class PlatformAirLayerPaletteTemplate extends LayerPaletteTemplate {
|
||||
|
||||
private BlockState air;
|
||||
|
||||
public PlatformAirLayerPaletteTemplate(Platform platform) {
|
||||
this.air = platform.getWorldHandle().air();
|
||||
}
|
||||
|
||||
@Override
|
||||
public LayerPalette get() {
|
||||
return new SimpleLayerPalette(group, resetsGroup, new SingletonPalette(air));
|
||||
}
|
||||
}
|
||||
-19
@@ -1,19 +0,0 @@
|
||||
package com.dfsek.terra.addons.chunkgenerator.config.palette;
|
||||
|
||||
import com.dfsek.tectonic.api.config.template.annotations.Value;
|
||||
|
||||
import com.dfsek.terra.addons.chunkgenerator.api.LayerPalette;
|
||||
import com.dfsek.terra.addons.chunkgenerator.layer.palette.SimpleLayerPalette;
|
||||
import com.dfsek.terra.api.world.chunk.generation.util.Palette;
|
||||
|
||||
|
||||
public class SimpleLayerPaletteTemplate extends LayerPaletteTemplate {
|
||||
|
||||
@Value("palette")
|
||||
private Palette palette;
|
||||
|
||||
@Override
|
||||
public LayerPalette get() {
|
||||
return new SimpleLayerPalette(group, resetsGroup, palette);
|
||||
}
|
||||
}
|
||||
-15
@@ -1,15 +0,0 @@
|
||||
package com.dfsek.terra.addons.chunkgenerator.config.pointset.generative;
|
||||
|
||||
import com.dfsek.tectonic.api.config.template.object.ObjectTemplate;
|
||||
|
||||
import com.dfsek.terra.addons.chunkgenerator.math.pointset.PointSet;
|
||||
import com.dfsek.terra.addons.chunkgenerator.math.pointset.generative.AdjacentPointSet;
|
||||
|
||||
|
||||
public class AdjacentPointSetTemplate implements ObjectTemplate<PointSet> {
|
||||
|
||||
@Override
|
||||
public PointSet get() {
|
||||
return new AdjacentPointSet();
|
||||
}
|
||||
}
|
||||
-22
@@ -1,22 +0,0 @@
|
||||
package com.dfsek.terra.addons.chunkgenerator.config.pointset.generative;
|
||||
|
||||
import com.dfsek.tectonic.api.config.template.annotations.Value;
|
||||
import com.dfsek.tectonic.api.config.template.object.ObjectTemplate;
|
||||
|
||||
import java.util.Set;
|
||||
|
||||
import com.dfsek.terra.addons.chunkgenerator.math.pointset.PointSet;
|
||||
import com.dfsek.terra.addons.chunkgenerator.math.pointset.generative.SimplePointSet;
|
||||
import com.dfsek.seismic.type.vector.Vector3Int;
|
||||
|
||||
|
||||
public class SimplePointSetTemplate implements ObjectTemplate<PointSet> {
|
||||
|
||||
@Value("points")
|
||||
private Set<Vector3Int> list;
|
||||
|
||||
@Override
|
||||
public PointSet get() {
|
||||
return new SimplePointSet(list);
|
||||
}
|
||||
}
|
||||
-19
@@ -1,19 +0,0 @@
|
||||
package com.dfsek.terra.addons.chunkgenerator.config.pointset.generative.geometric;
|
||||
|
||||
import com.dfsek.tectonic.api.config.template.annotations.Value;
|
||||
import com.dfsek.tectonic.api.config.template.object.ObjectTemplate;
|
||||
|
||||
import com.dfsek.terra.addons.chunkgenerator.math.pointset.PointSet;
|
||||
import com.dfsek.terra.addons.chunkgenerator.math.pointset.generative.geometric.CuboidPointSet;
|
||||
|
||||
|
||||
public class CubePointSetTemplate implements ObjectTemplate<PointSet> {
|
||||
|
||||
@Value("size")
|
||||
private int size;
|
||||
|
||||
@Override
|
||||
public PointSet get() {
|
||||
return new CuboidPointSet(-size, -size, -size, size, size, size);
|
||||
}
|
||||
}
|
||||
-25
@@ -1,25 +0,0 @@
|
||||
package com.dfsek.terra.addons.chunkgenerator.config.pointset.generative.geometric;
|
||||
|
||||
import com.dfsek.tectonic.api.config.template.annotations.Value;
|
||||
import com.dfsek.tectonic.api.config.template.object.ObjectTemplate;
|
||||
|
||||
import com.dfsek.terra.addons.chunkgenerator.math.pointset.PointSet;
|
||||
import com.dfsek.terra.addons.chunkgenerator.math.pointset.generative.geometric.CuboidPointSet;
|
||||
|
||||
|
||||
public class CuboidPointSetTemplate implements ObjectTemplate<PointSet> {
|
||||
|
||||
@Value("size.x")
|
||||
private int xSize;
|
||||
|
||||
@Value("size.y")
|
||||
private int ySize;
|
||||
|
||||
@Value("size.z")
|
||||
private int zSize;
|
||||
|
||||
@Override
|
||||
public PointSet get() {
|
||||
return new CuboidPointSet(-xSize, -ySize, -zSize, xSize, ySize, zSize);
|
||||
}
|
||||
}
|
||||
-19
@@ -1,19 +0,0 @@
|
||||
package com.dfsek.terra.addons.chunkgenerator.config.pointset.generative.geometric;
|
||||
|
||||
import com.dfsek.tectonic.api.config.template.annotations.Value;
|
||||
import com.dfsek.tectonic.api.config.template.object.ObjectTemplate;
|
||||
|
||||
import com.dfsek.terra.addons.chunkgenerator.math.pointset.PointSet;
|
||||
import com.dfsek.terra.addons.chunkgenerator.math.pointset.generative.geometric.SphericalPointSet;
|
||||
|
||||
|
||||
public class SphericalPointSetTemplate implements ObjectTemplate<PointSet> {
|
||||
|
||||
@Value("radius")
|
||||
private double radius;
|
||||
|
||||
@Override
|
||||
public PointSet get() {
|
||||
return new SphericalPointSet(radius);
|
||||
}
|
||||
}
|
||||
-21
@@ -1,21 +0,0 @@
|
||||
package com.dfsek.terra.addons.chunkgenerator.config.pointset.operative;
|
||||
|
||||
import com.dfsek.tectonic.api.config.template.annotations.Value;
|
||||
import com.dfsek.tectonic.api.config.template.object.ObjectTemplate;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import com.dfsek.terra.addons.chunkgenerator.math.pointset.PointSet;
|
||||
import com.dfsek.terra.addons.chunkgenerator.math.pointset.operative.DifferencePointSet;
|
||||
|
||||
|
||||
public class DifferencePointSetTemplate implements ObjectTemplate<PointSet> {
|
||||
|
||||
@Value("point-sets")
|
||||
private List<PointSet> set;
|
||||
|
||||
@Override
|
||||
public PointSet get() {
|
||||
return new DifferencePointSet(set);
|
||||
}
|
||||
}
|
||||
-27
@@ -1,27 +0,0 @@
|
||||
package com.dfsek.terra.addons.chunkgenerator.config.pointset.operative;
|
||||
|
||||
import com.dfsek.paralithic.eval.tokenizer.ParseException;
|
||||
import com.dfsek.tectonic.api.config.template.annotations.Value;
|
||||
import com.dfsek.tectonic.api.config.template.object.ObjectTemplate;
|
||||
|
||||
import com.dfsek.terra.addons.chunkgenerator.math.pointset.PointSet;
|
||||
import com.dfsek.terra.addons.chunkgenerator.math.pointset.operative.ExpressionFilterPointSet;
|
||||
|
||||
|
||||
public class ExpressionFilterPointSetTemplate implements ObjectTemplate<PointSet> {
|
||||
|
||||
@Value("point-set")
|
||||
private PointSet set;
|
||||
|
||||
@Value("expression")
|
||||
private String expression;
|
||||
|
||||
@Override
|
||||
public PointSet get() {
|
||||
try {
|
||||
return new ExpressionFilterPointSet(set, expression);
|
||||
} catch(ParseException e) {
|
||||
throw new RuntimeException("Failed to parse expression.", e);
|
||||
}
|
||||
}
|
||||
}
|
||||
-21
@@ -1,21 +0,0 @@
|
||||
package com.dfsek.terra.addons.chunkgenerator.config.pointset.operative;
|
||||
|
||||
import com.dfsek.tectonic.api.config.template.annotations.Value;
|
||||
import com.dfsek.tectonic.api.config.template.object.ObjectTemplate;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import com.dfsek.terra.addons.chunkgenerator.math.pointset.PointSet;
|
||||
import com.dfsek.terra.addons.chunkgenerator.math.pointset.operative.IntersectionPointSet;
|
||||
|
||||
|
||||
public class IntersectionPointSetTemplate implements ObjectTemplate<PointSet> {
|
||||
|
||||
@Value("point-sets")
|
||||
private List<PointSet> sets;
|
||||
|
||||
@Override
|
||||
public PointSet get() {
|
||||
return new IntersectionPointSet(sets);
|
||||
}
|
||||
}
|
||||
-21
@@ -1,21 +0,0 @@
|
||||
package com.dfsek.terra.addons.chunkgenerator.config.pointset.operative;
|
||||
|
||||
import com.dfsek.tectonic.api.config.template.annotations.Value;
|
||||
import com.dfsek.tectonic.api.config.template.object.ObjectTemplate;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import com.dfsek.terra.addons.chunkgenerator.math.pointset.PointSet;
|
||||
import com.dfsek.terra.addons.chunkgenerator.math.pointset.operative.UnionPointSet;
|
||||
|
||||
|
||||
public class UnionPointSetTemplate implements ObjectTemplate<PointSet> {
|
||||
|
||||
@Value("point-sets")
|
||||
private List<PointSet> sets;
|
||||
|
||||
@Override
|
||||
public PointSet get() {
|
||||
return new UnionPointSet(sets);
|
||||
}
|
||||
}
|
||||
-20
@@ -1,20 +0,0 @@
|
||||
package com.dfsek.terra.addons.chunkgenerator.config.predicate;
|
||||
|
||||
import com.dfsek.tectonic.api.config.template.annotations.Value;
|
||||
import com.dfsek.tectonic.api.config.template.object.ObjectTemplate;
|
||||
|
||||
import com.dfsek.terra.addons.chunkgenerator.layer.predicate.BelowLayerPredicate;
|
||||
import com.dfsek.terra.addons.chunkgenerator.api.LayerPredicate;
|
||||
import com.dfsek.terra.api.config.meta.Meta;
|
||||
|
||||
|
||||
public class BelowLayerPredicateTemplate implements ObjectTemplate<LayerPredicate> {
|
||||
|
||||
@Value("y")
|
||||
private @Meta int y;
|
||||
|
||||
@Override
|
||||
public LayerPredicate get() {
|
||||
return new BelowLayerPredicate(y);
|
||||
}
|
||||
}
|
||||
-20
@@ -1,20 +0,0 @@
|
||||
package com.dfsek.terra.addons.chunkgenerator.config.predicate;
|
||||
|
||||
import com.dfsek.tectonic.api.config.template.annotations.Value;
|
||||
import com.dfsek.tectonic.api.config.template.object.ObjectTemplate;
|
||||
|
||||
import com.dfsek.terra.addons.chunkgenerator.api.LayerPredicate;
|
||||
import com.dfsek.terra.addons.chunkgenerator.layer.predicate.RangeLayerPredicate;
|
||||
import com.dfsek.terra.api.util.range.Range;
|
||||
|
||||
|
||||
public class RangeLayerPredicateTemplate implements ObjectTemplate<LayerPredicate> {
|
||||
|
||||
@Value("range")
|
||||
private Range range;
|
||||
|
||||
@Override
|
||||
public LayerPredicate get() {
|
||||
return new RangeLayerPredicate(range);
|
||||
}
|
||||
}
|
||||
-32
@@ -1,32 +0,0 @@
|
||||
package com.dfsek.terra.addons.chunkgenerator.config.predicate;
|
||||
|
||||
import com.dfsek.tectonic.api.config.template.annotations.Default;
|
||||
import com.dfsek.tectonic.api.config.template.annotations.Value;
|
||||
import com.dfsek.tectonic.api.config.template.object.ObjectTemplate;
|
||||
|
||||
import com.dfsek.terra.addons.chunkgenerator.api.LayerPredicate;
|
||||
import com.dfsek.terra.addons.chunkgenerator.api.LayerSampler;
|
||||
import com.dfsek.terra.addons.chunkgenerator.layer.predicate.SamplerLayerPredicate;
|
||||
import com.dfsek.terra.addons.chunkgenerator.math.RelationalOperator;
|
||||
import com.dfsek.terra.addons.chunkgenerator.util.InstanceWrapper;
|
||||
import com.dfsek.terra.api.config.meta.Meta;
|
||||
|
||||
|
||||
public class SamplerLayerPredicateTemplate implements ObjectTemplate<LayerPredicate> {
|
||||
|
||||
@Value("sampler")
|
||||
private @Meta InstanceWrapper<LayerSampler> sampler;
|
||||
|
||||
@Value("threshold")
|
||||
@Default
|
||||
private double threshold = 0;
|
||||
|
||||
@Value("operator")
|
||||
@Default
|
||||
private RelationalOperator operator = RelationalOperator.GreaterThan;
|
||||
|
||||
@Override
|
||||
public LayerPredicate get() {
|
||||
return new SamplerLayerPredicate(sampler.get(), operator, threshold);
|
||||
}
|
||||
}
|
||||
-36
@@ -1,36 +0,0 @@
|
||||
package com.dfsek.terra.addons.chunkgenerator.config.predicate;
|
||||
|
||||
import com.dfsek.tectonic.api.config.template.annotations.Default;
|
||||
import com.dfsek.tectonic.api.config.template.annotations.Value;
|
||||
import com.dfsek.tectonic.api.config.template.object.ObjectTemplate;
|
||||
|
||||
import com.dfsek.terra.addons.chunkgenerator.api.LayerPredicate;
|
||||
import com.dfsek.terra.addons.chunkgenerator.api.LayerSampler;
|
||||
import com.dfsek.terra.addons.chunkgenerator.math.RelationalOperator;
|
||||
import com.dfsek.terra.addons.chunkgenerator.layer.predicate.SamplerListLayerPredicate;
|
||||
import com.dfsek.terra.addons.chunkgenerator.util.InstanceWrapper;
|
||||
import com.dfsek.terra.addons.chunkgenerator.math.pointset.PointSet;
|
||||
import com.dfsek.terra.api.config.meta.Meta;
|
||||
|
||||
|
||||
public class SamplerListLayerPredicateTemplate implements ObjectTemplate<LayerPredicate> {
|
||||
|
||||
@Value("sampler")
|
||||
private @Meta InstanceWrapper<LayerSampler> sampler;
|
||||
|
||||
@Value("point-set")
|
||||
private PointSet points;
|
||||
|
||||
@Value("threshold")
|
||||
@Default
|
||||
private double defaultThreshold = 0;
|
||||
|
||||
@Value("operator")
|
||||
@Default
|
||||
private RelationalOperator defaultOperator = RelationalOperator.GreaterThan;
|
||||
|
||||
@Override
|
||||
public LayerPredicate get() {
|
||||
return new SamplerListLayerPredicate(sampler.get(), defaultThreshold, defaultOperator, points);
|
||||
}
|
||||
}
|
||||
-21
@@ -1,21 +0,0 @@
|
||||
package com.dfsek.terra.addons.chunkgenerator.config.resolve;
|
||||
|
||||
import com.dfsek.tectonic.api.config.template.annotations.Value;
|
||||
import com.dfsek.tectonic.api.config.template.object.ObjectTemplate;
|
||||
|
||||
import com.dfsek.terra.addons.chunkgenerator.api.LayerPalette;
|
||||
import com.dfsek.terra.addons.chunkgenerator.api.LayerResolver;
|
||||
import com.dfsek.terra.addons.chunkgenerator.layer.resolve.PaletteLayerResolver;
|
||||
import com.dfsek.terra.addons.chunkgenerator.util.InstanceWrapper;
|
||||
|
||||
|
||||
public class PaletteLayerResolverTemplate implements ObjectTemplate<LayerResolver> {
|
||||
|
||||
@Value("layer")
|
||||
private InstanceWrapper<LayerPalette> palette;
|
||||
|
||||
@Override
|
||||
public LayerResolver get() {
|
||||
return new PaletteLayerResolver(palette.get());
|
||||
}
|
||||
}
|
||||
-28
@@ -1,28 +0,0 @@
|
||||
package com.dfsek.terra.addons.chunkgenerator.config.resolve;
|
||||
|
||||
import com.dfsek.tectonic.api.config.template.annotations.Value;
|
||||
import com.dfsek.tectonic.api.config.template.object.ObjectTemplate;
|
||||
|
||||
import com.dfsek.terra.addons.chunkgenerator.api.LayerPredicate;
|
||||
import com.dfsek.terra.addons.chunkgenerator.api.LayerResolver;
|
||||
import com.dfsek.terra.addons.chunkgenerator.layer.resolve.PredicateLayerResolver;
|
||||
import com.dfsek.terra.addons.chunkgenerator.util.InstanceWrapper;
|
||||
import com.dfsek.terra.api.config.meta.Meta;
|
||||
|
||||
|
||||
public class PredicateLayerResolverTemplate implements ObjectTemplate<LayerResolver> {
|
||||
|
||||
@Value("if")
|
||||
private @Meta InstanceWrapper<LayerPredicate> predicate;
|
||||
|
||||
@Value("then")
|
||||
private @Meta LayerResolver trueResolver;
|
||||
|
||||
@Value("else")
|
||||
private @Meta LayerResolver falseResolver;
|
||||
|
||||
@Override
|
||||
public PredicateLayerResolver get() {
|
||||
return new PredicateLayerResolver(predicate.get(), trueResolver, falseResolver);
|
||||
}
|
||||
}
|
||||
-23
@@ -1,23 +0,0 @@
|
||||
package com.dfsek.terra.addons.chunkgenerator.config.sampler;
|
||||
|
||||
import com.dfsek.tectonic.api.config.template.annotations.Default;
|
||||
import com.dfsek.tectonic.api.config.template.annotations.Value;
|
||||
import com.dfsek.tectonic.api.config.template.object.ObjectTemplate;
|
||||
|
||||
import com.dfsek.terra.addons.chunkgenerator.api.LayerSampler;
|
||||
import com.dfsek.terra.addons.chunkgenerator.layer.sampler.BiomeDefinedLayerSampler;
|
||||
import com.dfsek.terra.api.config.meta.Meta;
|
||||
import com.dfsek.seismic.type.sampler.Sampler;
|
||||
|
||||
|
||||
public class BiomeDefinedLayerSamplerTemplate extends LayerSamplerTemplate {
|
||||
|
||||
@Value("default")
|
||||
@Default
|
||||
private @Meta Sampler defaultSampler = null;
|
||||
|
||||
@Override
|
||||
public LayerSampler get() {
|
||||
return new BiomeDefinedLayerSampler(defaultSampler, blend);
|
||||
}
|
||||
}
|
||||
-20
@@ -1,20 +0,0 @@
|
||||
package com.dfsek.terra.addons.chunkgenerator.config.sampler;
|
||||
|
||||
import com.dfsek.tectonic.api.config.template.annotations.Value;
|
||||
|
||||
import com.dfsek.terra.addons.chunkgenerator.api.LayerSampler;
|
||||
import com.dfsek.terra.addons.chunkgenerator.layer.sampler.DensityLayerSampler;
|
||||
import com.dfsek.terra.api.config.meta.Meta;
|
||||
import com.dfsek.seismic.type.sampler.Sampler;
|
||||
|
||||
|
||||
public class DensityLayerSamplerTemplate extends LayerSamplerTemplate {
|
||||
|
||||
@Value("sampler")
|
||||
private @Meta Sampler sampler;
|
||||
|
||||
@Override
|
||||
public LayerSampler get() {
|
||||
return new DensityLayerSampler(sampler, blend);
|
||||
}
|
||||
}
|
||||
-21
@@ -1,21 +0,0 @@
|
||||
package com.dfsek.terra.addons.chunkgenerator.config.sampler;
|
||||
|
||||
import com.dfsek.seismic.type.sampler.Sampler;
|
||||
import com.dfsek.tectonic.api.config.template.annotations.Value;
|
||||
|
||||
import com.dfsek.terra.addons.chunkgenerator.api.LayerSampler;
|
||||
import com.dfsek.terra.addons.chunkgenerator.layer.sampler.DensityLayerSampler;
|
||||
import com.dfsek.terra.addons.chunkgenerator.layer.sampler.ElevationLayerSampler;
|
||||
import com.dfsek.terra.api.config.meta.Meta;
|
||||
|
||||
|
||||
public class ElevationLayerSamplerTemplate extends LayerSamplerTemplate {
|
||||
|
||||
@Value("sampler")
|
||||
private @Meta Sampler sampler;
|
||||
|
||||
@Override
|
||||
public LayerSampler get() {
|
||||
return new ElevationLayerSampler(sampler, blend);
|
||||
}
|
||||
}
|
||||
-15
@@ -1,15 +0,0 @@
|
||||
package com.dfsek.terra.addons.chunkgenerator.config.sampler;
|
||||
|
||||
import com.dfsek.tectonic.api.config.template.annotations.Default;
|
||||
import com.dfsek.tectonic.api.config.template.annotations.Value;
|
||||
import com.dfsek.tectonic.api.config.template.object.ObjectTemplate;
|
||||
|
||||
import com.dfsek.terra.addons.chunkgenerator.api.LayerSampler;
|
||||
import com.dfsek.terra.addons.chunkgenerator.layer.sampler.blend.BlendProperties;
|
||||
import com.dfsek.terra.api.config.meta.Meta;
|
||||
|
||||
|
||||
public abstract class LayerSamplerTemplate implements ObjectTemplate<LayerSampler> {
|
||||
@Value("blend")
|
||||
protected @Meta BlendProperties blend;
|
||||
}
|
||||
-33
@@ -1,33 +0,0 @@
|
||||
package com.dfsek.terra.addons.chunkgenerator.config.sampler.blend;
|
||||
|
||||
import com.dfsek.seismic.type.sampler.DerivativeSampler;
|
||||
import com.dfsek.tectonic.api.config.template.ValidatedConfigTemplate;
|
||||
import com.dfsek.tectonic.api.config.template.annotations.Default;
|
||||
import com.dfsek.tectonic.api.config.template.annotations.Value;
|
||||
import com.dfsek.tectonic.api.config.template.object.ObjectTemplate;
|
||||
|
||||
import com.dfsek.tectonic.api.exception.ValidationException;
|
||||
|
||||
import com.dfsek.terra.addons.chunkgenerator.layer.sampler.blend.BlendProperties;
|
||||
import com.dfsek.terra.api.config.meta.Meta;
|
||||
|
||||
|
||||
public class BlendPropertiesConfig implements ValidatedConfigTemplate, ObjectTemplate<BlendProperties> {
|
||||
@Value("density")
|
||||
@Default
|
||||
private @Meta int density = 3;
|
||||
|
||||
@Value("weight")
|
||||
@Default
|
||||
private @Meta double weight = 1;
|
||||
|
||||
@Override
|
||||
public boolean validate() throws ValidationException {
|
||||
return density > 1 && weight > 1 && density % 18 == 0;
|
||||
}
|
||||
|
||||
@Override
|
||||
public BlendProperties get() {
|
||||
return BlendProperties.of(density, weight);
|
||||
}
|
||||
}
|
||||
-90
@@ -1,90 +0,0 @@
|
||||
package com.dfsek.terra.addons.chunkgenerator.generation;
|
||||
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
import com.dfsek.terra.addons.chunkgenerator.api.LayerPalette;
|
||||
import com.dfsek.terra.addons.chunkgenerator.api.LayerResolver;
|
||||
import com.dfsek.terra.api.Platform;
|
||||
import com.dfsek.terra.api.block.state.BlockState;
|
||||
import com.dfsek.terra.api.util.Column;
|
||||
import com.dfsek.terra.api.world.biome.Biome;
|
||||
import com.dfsek.terra.api.world.biome.generation.BiomeProvider;
|
||||
import com.dfsek.terra.api.world.chunk.generation.ChunkGenerator;
|
||||
import com.dfsek.terra.api.world.chunk.generation.ProtoChunk;
|
||||
import com.dfsek.terra.api.world.chunk.generation.util.Palette;
|
||||
import com.dfsek.terra.api.world.info.WorldProperties;
|
||||
|
||||
|
||||
public class LayeredChunkGenerator implements ChunkGenerator {
|
||||
|
||||
private final Platform platform;
|
||||
private final LayerResolver resolver;
|
||||
|
||||
public LayeredChunkGenerator(Platform platform, LayerResolver resolver) {
|
||||
this.platform = platform;
|
||||
this.resolver = resolver;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void generateChunkData(@NotNull ProtoChunk chunk, @NotNull WorldProperties world, @NotNull BiomeProvider biomeProvider,
|
||||
int chunkX, int chunkZ) {
|
||||
|
||||
platform.getProfiler().push("chunk_base_layered");
|
||||
|
||||
int xOrig = (chunkX << 4);
|
||||
int zOrig = (chunkZ << 4);
|
||||
long seed = world.getSeed();
|
||||
|
||||
for(int x = 0; x < 16; x++) {
|
||||
for(int z = 0; z < 16; z++) {
|
||||
|
||||
int cx = xOrig + x;
|
||||
int cz = zOrig + z;
|
||||
int paletteLevel = 0;
|
||||
LayerPalette previousLayerPalette = null;
|
||||
Column<Biome> biomeColumn = biomeProvider.getColumn(cx, cz, world);
|
||||
|
||||
for(int y = world.getMaxHeight() - 1; y >= world.getMinHeight(); y--) {
|
||||
|
||||
Biome biome = biomeColumn.get(y);
|
||||
|
||||
LayerPalette layerPalette = resolver.resolve(cx, y, cz, world, biomeProvider);
|
||||
|
||||
if (previousLayerPalette == layerPalette) {
|
||||
paletteLevel++;
|
||||
} else if (layerPalette.resetsGroup()) {
|
||||
paletteLevel = 0;
|
||||
} else if (previousLayerPalette != null && layerPalette.getGroup() == previousLayerPalette.getGroup()) {
|
||||
paletteLevel++;
|
||||
} else {
|
||||
paletteLevel = 0;
|
||||
}
|
||||
previousLayerPalette = layerPalette;
|
||||
|
||||
chunk.setBlock(cx, y, cz, layerPalette.get(cx, y, cz, world, biomeProvider)
|
||||
.get(paletteLevel, cx, y, cz, seed));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
platform.getProfiler().pop("chunk_base_layered");
|
||||
}
|
||||
|
||||
@Override
|
||||
public BlockState getBlock(WorldProperties world, int x, int y, int z, BiomeProvider biomeProvider) {
|
||||
long seed = world.getSeed();
|
||||
Biome biome = biomeProvider.getBiome(x, y, z, seed);
|
||||
int layer = 0; // Default to layer 0 for now
|
||||
return resolver.resolve(x, y, z, world, biomeProvider)
|
||||
.get(x, y, z, world, biomeProvider)
|
||||
.get(layer, x, y, z, seed);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Palette getPalette(int x, int y, int z, WorldProperties world, BiomeProvider biomeProvider) {
|
||||
long seed = world.getSeed();
|
||||
Biome biome = biomeProvider.getBiome(x, y, z, seed);
|
||||
return resolver.resolve(x, y, z, world, biomeProvider)
|
||||
.get(x, y, z, world, biomeProvider);
|
||||
}
|
||||
}
|
||||
-70
@@ -1,70 +0,0 @@
|
||||
package com.dfsek.terra.addons.chunkgenerator.layer.palette;
|
||||
|
||||
import com.dfsek.tectonic.api.config.template.dynamic.DynamicTemplate;
|
||||
import com.dfsek.tectonic.api.config.template.dynamic.DynamicValue;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
import java.util.Map.Entry;
|
||||
import java.util.Optional;
|
||||
import java.util.function.Consumer;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
import com.dfsek.terra.addons.chunkgenerator.LayeredChunkGeneratorAddon;
|
||||
import com.dfsek.terra.addons.chunkgenerator.api.LayerPalette;
|
||||
import com.dfsek.terra.api.event.events.config.ConfigurationLoadEvent;
|
||||
import com.dfsek.terra.api.properties.Properties;
|
||||
import com.dfsek.terra.api.world.biome.Biome;
|
||||
import com.dfsek.terra.api.world.biome.generation.BiomeProvider;
|
||||
import com.dfsek.terra.api.world.chunk.generation.util.Palette;
|
||||
import com.dfsek.terra.api.world.info.WorldProperties;
|
||||
|
||||
|
||||
public class BiomeDefinedLayerPalette extends LayerPalette {
|
||||
|
||||
private final Palette defaultPalette;
|
||||
|
||||
public BiomeDefinedLayerPalette(Group group, boolean resetsGroup, Palette defaultPalette) {
|
||||
super(group, resetsGroup);
|
||||
this.defaultPalette = defaultPalette;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Palette get(int x, int y, int z, WorldProperties worldProperties, BiomeProvider biomeProvider) {
|
||||
return biomeProvider.getBiome(x, y, z, worldProperties.getSeed()).getContext().get(BiomeLayerPalettes.class).palettes().get(this);
|
||||
}
|
||||
|
||||
public Optional<Palette> getDefaultPalette() {
|
||||
return Optional.ofNullable(defaultPalette);
|
||||
}
|
||||
|
||||
public static Consumer<ConfigurationLoadEvent> injectLayerPalettes = event -> {
|
||||
if(event.is(Biome.class)) {
|
||||
|
||||
Map<BiomeDefinedLayerPalette, String> paletteFields = new HashMap<>();
|
||||
DynamicTemplate.Builder templateBuilder = DynamicTemplate.builder();
|
||||
|
||||
event.getPack().getRegistry(LayeredChunkGeneratorAddon.LAYER_PALETTE_TOKEN).forEach((registryKey, registryEntry) -> {
|
||||
LayerPalette layerPalette = registryEntry.get();
|
||||
// Add template value for each BiomeDefinedLayerPalette
|
||||
if (layerPalette instanceof BiomeDefinedLayerPalette biomeLayerPalette) {
|
||||
String id = registryKey.getID();
|
||||
String fieldName = id + "LayerPalette";
|
||||
paletteFields.put(biomeLayerPalette, fieldName);
|
||||
DynamicValue.Builder<Palette> value = DynamicValue.builder("generation.layers." + id, Palette.class);
|
||||
biomeLayerPalette.getDefaultPalette().ifPresent(value::setDefault);
|
||||
templateBuilder.value(fieldName, value.build());
|
||||
}
|
||||
});
|
||||
|
||||
DynamicTemplate layerPaletteBiomeTemplate = event.load(templateBuilder.build());
|
||||
|
||||
Map<BiomeDefinedLayerPalette, Palette> paletteMap = paletteFields.entrySet().stream().collect(
|
||||
Collectors.toMap(Entry::getKey, entry -> layerPaletteBiomeTemplate.get(entry.getValue(), Palette.class)));
|
||||
event.getLoadedObject(Biome.class).getContext().put(new BiomeLayerPalettes(paletteMap));
|
||||
}
|
||||
};
|
||||
|
||||
public record BiomeLayerPalettes(Map<BiomeDefinedLayerPalette, Palette> palettes) implements Properties {
|
||||
}
|
||||
}
|
||||
-43
@@ -1,43 +0,0 @@
|
||||
package com.dfsek.terra.addons.chunkgenerator.layer.palette;
|
||||
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
import com.dfsek.terra.addons.chunkgenerator.api.LayerPalette;
|
||||
import com.dfsek.terra.addons.chunkgenerator.api.LayerSampler;
|
||||
import com.dfsek.terra.addons.chunkgenerator.math.pointset.PointSet;
|
||||
import com.dfsek.terra.addons.chunkgenerator.palette.DoubleNavigableHolder;
|
||||
import com.dfsek.seismic.type.vector.Vector3;
|
||||
import com.dfsek.seismic.type.vector.Vector3Int;
|
||||
import com.dfsek.terra.api.world.biome.generation.BiomeProvider;
|
||||
import com.dfsek.terra.api.world.chunk.generation.util.Palette;
|
||||
import com.dfsek.terra.api.world.info.WorldProperties;
|
||||
|
||||
|
||||
public class DotProductLayerPalette extends LayerPalette {
|
||||
|
||||
private static final Logger logger = LoggerFactory.getLogger(DotProductLayerPalette.class);
|
||||
private final DoubleNavigableHolder<Palette> palettes;
|
||||
private final Vector3Int[] samplePoints;
|
||||
private final LayerSampler sampler;
|
||||
private final Vector3 direction;
|
||||
|
||||
public DotProductLayerPalette(Group group, boolean resetsGroup,
|
||||
PointSet points, DoubleNavigableHolder<Palette> palettes, LayerSampler sampler, Vector3 direction) {
|
||||
super(group, resetsGroup);
|
||||
this.palettes = palettes;
|
||||
this.sampler = sampler;
|
||||
this.direction = direction;
|
||||
this.samplePoints = points.toArray();
|
||||
}
|
||||
|
||||
@Override
|
||||
public Palette get(int x, int y, int z, WorldProperties world, BiomeProvider biomeProvider) {
|
||||
Vector3.Mutable surfaceNormalApproximation = Vector3.Mutable.of(0, 0, 0);
|
||||
for(Vector3Int point : samplePoints) {
|
||||
double scalar = -sampler.sample(x+point.getX(), y+point.getY(), z+point.getZ(), world, biomeProvider);
|
||||
surfaceNormalApproximation.add(point.toFloat().mutable().mulScalar(scalar));
|
||||
}
|
||||
return palettes.get(direction.dot(surfaceNormalApproximation.normalize()));
|
||||
}
|
||||
}
|
||||
-22
@@ -1,22 +0,0 @@
|
||||
package com.dfsek.terra.addons.chunkgenerator.layer.palette;
|
||||
|
||||
import com.dfsek.terra.addons.chunkgenerator.api.LayerPalette;
|
||||
import com.dfsek.terra.api.world.biome.generation.BiomeProvider;
|
||||
import com.dfsek.terra.api.world.chunk.generation.util.Palette;
|
||||
import com.dfsek.terra.api.world.info.WorldProperties;
|
||||
|
||||
|
||||
public class SimpleLayerPalette extends LayerPalette {
|
||||
|
||||
private final Palette palette;
|
||||
|
||||
public SimpleLayerPalette(Group group, boolean resetsGroup, Palette palette) {
|
||||
super(group, resetsGroup);
|
||||
this.palette = palette;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Palette get(int x, int y, int z, WorldProperties world, BiomeProvider biomeProvider) {
|
||||
return palette;
|
||||
}
|
||||
}
|
||||
-20
@@ -1,20 +0,0 @@
|
||||
package com.dfsek.terra.addons.chunkgenerator.layer.predicate;
|
||||
|
||||
import com.dfsek.terra.addons.chunkgenerator.api.LayerPredicate;
|
||||
import com.dfsek.terra.api.world.biome.generation.BiomeProvider;
|
||||
import com.dfsek.terra.api.world.info.WorldProperties;
|
||||
|
||||
|
||||
public class BelowLayerPredicate implements LayerPredicate {
|
||||
|
||||
private final int y;
|
||||
|
||||
public BelowLayerPredicate(int y) {
|
||||
this.y = y;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean test(int x, int y, int z, WorldProperties worldProperties, BiomeProvider biomeProvider) {
|
||||
return y < this.y;
|
||||
}
|
||||
}
|
||||
-20
@@ -1,20 +0,0 @@
|
||||
package com.dfsek.terra.addons.chunkgenerator.layer.predicate;
|
||||
|
||||
import com.dfsek.terra.addons.chunkgenerator.api.LayerPredicate;
|
||||
import com.dfsek.terra.api.util.range.Range;
|
||||
import com.dfsek.terra.api.world.biome.generation.BiomeProvider;
|
||||
import com.dfsek.terra.api.world.info.WorldProperties;
|
||||
|
||||
|
||||
public class RangeLayerPredicate implements LayerPredicate {
|
||||
|
||||
private final Range range;
|
||||
|
||||
public RangeLayerPredicate(Range range) {
|
||||
this.range = range;
|
||||
}
|
||||
@Override
|
||||
public boolean test(int x, int y, int z, WorldProperties worldProperties, BiomeProvider biomeProvider) {
|
||||
return range.isInRange(y);
|
||||
}
|
||||
}
|
||||
-29
@@ -1,29 +0,0 @@
|
||||
package com.dfsek.terra.addons.chunkgenerator.layer.predicate;
|
||||
|
||||
import com.dfsek.terra.addons.chunkgenerator.api.LayerPredicate;
|
||||
import com.dfsek.terra.addons.chunkgenerator.api.LayerSampler;
|
||||
import com.dfsek.terra.addons.chunkgenerator.math.RelationalOperator;
|
||||
import com.dfsek.terra.api.world.biome.generation.BiomeProvider;
|
||||
import com.dfsek.terra.api.world.info.WorldProperties;
|
||||
|
||||
|
||||
public class SamplerLayerPredicate implements LayerPredicate {
|
||||
|
||||
private final LayerSampler sampler;
|
||||
|
||||
private final double threshold;
|
||||
|
||||
private final RelationalOperator operator;
|
||||
|
||||
public SamplerLayerPredicate(LayerSampler sampler, RelationalOperator operator, double threshold) {
|
||||
this.sampler = sampler;
|
||||
this.operator = operator;
|
||||
this.threshold = threshold;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean test(int x, int y, int z, WorldProperties worldProperties, BiomeProvider biomeProvider) {
|
||||
return operator.test(sampler.sample(x, y, z, worldProperties, biomeProvider), threshold);
|
||||
}
|
||||
|
||||
}
|
||||
-33
@@ -1,33 +0,0 @@
|
||||
package com.dfsek.terra.addons.chunkgenerator.layer.predicate;
|
||||
|
||||
import com.dfsek.terra.addons.chunkgenerator.api.LayerPredicate;
|
||||
import com.dfsek.terra.addons.chunkgenerator.api.LayerSampler;
|
||||
import com.dfsek.terra.addons.chunkgenerator.math.RelationalOperator;
|
||||
import com.dfsek.terra.addons.chunkgenerator.math.pointset.PointSet;
|
||||
import com.dfsek.seismic.type.vector.Vector3Int;
|
||||
import com.dfsek.terra.api.world.biome.generation.BiomeProvider;
|
||||
import com.dfsek.terra.api.world.info.WorldProperties;
|
||||
|
||||
|
||||
public class SamplerListLayerPredicate implements LayerPredicate {
|
||||
|
||||
private final Vector3Int[] points;
|
||||
private final RelationalOperator operator;
|
||||
private final LayerSampler sampler;
|
||||
private final double threshold;
|
||||
|
||||
public SamplerListLayerPredicate(LayerSampler sampler, double threshold, RelationalOperator operator, PointSet points) {
|
||||
this.sampler = sampler;
|
||||
this.threshold = threshold;
|
||||
this.operator = operator;
|
||||
this.points = points.toArray();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean test(int x, int y, int z, WorldProperties worldProperties, BiomeProvider biomeProvider) {
|
||||
for (Vector3Int point : points) {
|
||||
if (operator.test(sampler.sample(x + point.getX(), y + point.getY(), z + point.getZ(), worldProperties, biomeProvider), threshold)) return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
}
|
||||
-21
@@ -1,21 +0,0 @@
|
||||
package com.dfsek.terra.addons.chunkgenerator.layer.resolve;
|
||||
|
||||
import com.dfsek.terra.addons.chunkgenerator.api.LayerPalette;
|
||||
import com.dfsek.terra.addons.chunkgenerator.api.LayerResolver;
|
||||
import com.dfsek.terra.api.world.biome.generation.BiomeProvider;
|
||||
import com.dfsek.terra.api.world.info.WorldProperties;
|
||||
|
||||
|
||||
public class PaletteLayerResolver implements LayerResolver {
|
||||
|
||||
private final LayerPalette palette;
|
||||
|
||||
public PaletteLayerResolver(LayerPalette palette) {
|
||||
this.palette = palette;
|
||||
}
|
||||
|
||||
@Override
|
||||
public LayerPalette resolve(int x, int y, int z, WorldProperties world, BiomeProvider biomeProvider) {
|
||||
return palette;
|
||||
}
|
||||
}
|
||||
-28
@@ -1,28 +0,0 @@
|
||||
package com.dfsek.terra.addons.chunkgenerator.layer.resolve;
|
||||
|
||||
import com.dfsek.terra.addons.chunkgenerator.api.LayerPalette;
|
||||
import com.dfsek.terra.addons.chunkgenerator.api.LayerPredicate;
|
||||
import com.dfsek.terra.addons.chunkgenerator.api.LayerResolver;
|
||||
import com.dfsek.terra.api.world.biome.generation.BiomeProvider;
|
||||
import com.dfsek.terra.api.world.info.WorldProperties;
|
||||
|
||||
|
||||
public class PredicateLayerResolver implements LayerResolver {
|
||||
|
||||
private final LayerPredicate predicate;
|
||||
|
||||
private final LayerResolver trueResolver;
|
||||
|
||||
private final LayerResolver falseResolver;
|
||||
|
||||
public PredicateLayerResolver(LayerPredicate predicate, LayerResolver trueResolver, LayerResolver falseResolver) {
|
||||
this.predicate = predicate;
|
||||
this.trueResolver = trueResolver;
|
||||
this.falseResolver = falseResolver;
|
||||
}
|
||||
|
||||
@Override
|
||||
public LayerPalette resolve(int x, int y, int z, WorldProperties world, BiomeProvider biomeProvider) {
|
||||
return predicate.test(x, y, z, world, biomeProvider) ? trueResolver.resolve(x, y, z, world, biomeProvider) : falseResolver.resolve(x, y, z, world, biomeProvider);
|
||||
}
|
||||
}
|
||||
-90
@@ -1,90 +0,0 @@
|
||||
package com.dfsek.terra.addons.chunkgenerator.layer.sampler;
|
||||
|
||||
import com.dfsek.tectonic.api.config.template.dynamic.DynamicTemplate;
|
||||
import com.dfsek.tectonic.api.config.template.dynamic.DynamicValue;
|
||||
|
||||
import com.dfsek.terra.addons.chunkgenerator.api.chunk.ChunkLayerSampler;
|
||||
import com.dfsek.terra.addons.chunkgenerator.layer.sampler.blend.BlendProperties;
|
||||
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
import java.util.Map.Entry;
|
||||
import java.util.Optional;
|
||||
import java.util.function.Consumer;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
import com.dfsek.terra.addons.chunkgenerator.LayeredChunkGeneratorAddon;
|
||||
import com.dfsek.terra.addons.chunkgenerator.api.LayerSampler;
|
||||
import com.dfsek.terra.api.event.events.config.ConfigurationLoadEvent;
|
||||
import com.dfsek.seismic.type.sampler.Sampler;
|
||||
import com.dfsek.terra.api.properties.Properties;
|
||||
import com.dfsek.terra.api.world.biome.Biome;
|
||||
import com.dfsek.terra.api.world.biome.generation.BiomeProvider;
|
||||
import com.dfsek.terra.api.world.info.WorldProperties;
|
||||
|
||||
|
||||
public class BiomeDefinedLayerSampler implements LayerSampler {
|
||||
|
||||
private final Sampler defaultSampler;
|
||||
private final BlendProperties blendProperties;
|
||||
|
||||
public BiomeDefinedLayerSampler(@Nullable Sampler defaultSampler, BlendProperties blendProperties) {
|
||||
this.defaultSampler = defaultSampler;
|
||||
this.blendProperties = blendProperties;
|
||||
}
|
||||
|
||||
@Override
|
||||
public double sample(int x, int y, int z, WorldProperties world, BiomeProvider biomeProvider) {
|
||||
return biomeProvider.getBiome(x, y, z, world.getSeed())
|
||||
.getContext()
|
||||
.get(BiomeLayerSamplers.class)
|
||||
.samplers()
|
||||
.get(this)
|
||||
.getSample(world.getSeed(), x, y, z);
|
||||
}
|
||||
|
||||
@Override
|
||||
public ChunkLayerSampler getChunk(int chunkX, int chunkZ, WorldProperties world, BiomeProvider biomeProvider) {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public double getBlendWeight() {
|
||||
return blendProperties.weight();
|
||||
}
|
||||
|
||||
private Optional<Sampler> getDefaultSampler() {
|
||||
return Optional.ofNullable(defaultSampler);
|
||||
}
|
||||
|
||||
public static Consumer<ConfigurationLoadEvent> injectLayerSamplers = event -> {
|
||||
if(event.is(Biome.class)) {
|
||||
|
||||
Map<BiomeDefinedLayerSampler, String> samplerFields = new HashMap<>();
|
||||
DynamicTemplate.Builder templateBuilder = DynamicTemplate.builder();
|
||||
|
||||
event.getPack().getRegistry(LayeredChunkGeneratorAddon.LAYER_SAMPLER_TOKEN).forEach((registryKey, registryEntry) -> {
|
||||
LayerSampler layerSampler = registryEntry.get();
|
||||
|
||||
if (layerSampler instanceof BiomeDefinedLayerSampler biomeLayerSampler) {
|
||||
String id = registryKey.getID();
|
||||
String fieldName = id + "LayerSampler";
|
||||
samplerFields.put(biomeLayerSampler, fieldName);
|
||||
DynamicValue.Builder<Sampler> value = DynamicValue.builder("generation.samplers." + id, Sampler.class);
|
||||
biomeLayerSampler.getDefaultSampler().ifPresent(value::setDefault);
|
||||
templateBuilder.value(fieldName, value.build());
|
||||
}
|
||||
});
|
||||
|
||||
DynamicTemplate layerSamplerBiomeTemplate = event.load(templateBuilder.build());
|
||||
|
||||
Map<BiomeDefinedLayerSampler, Sampler> samplerMap = samplerFields.entrySet().stream().collect(
|
||||
Collectors.toMap(Entry::getKey, entry -> layerSamplerBiomeTemplate.get(entry.getValue(), Sampler.class)));
|
||||
event.getLoadedObject(Biome.class).getContext().put(new BiomeLayerSamplers(samplerMap));
|
||||
}
|
||||
};
|
||||
|
||||
public record BiomeLayerSamplers(Map<BiomeDefinedLayerSampler, Sampler> samplers) implements Properties {
|
||||
}
|
||||
}
|
||||
-41
@@ -1,41 +0,0 @@
|
||||
package com.dfsek.terra.addons.chunkgenerator.layer.sampler;
|
||||
|
||||
import com.dfsek.seismic.math.floatingpoint.FloatingPointFunctions;
|
||||
import com.dfsek.seismic.math.numericanalysis.interpolation.InterpolationFunctions;
|
||||
|
||||
import com.dfsek.terra.addons.chunkgenerator.api.LayerSampler;
|
||||
import com.dfsek.seismic.type.sampler.Sampler;
|
||||
|
||||
import com.dfsek.terra.addons.chunkgenerator.api.chunk.ChunkLayerSampler;
|
||||
import com.dfsek.terra.addons.chunkgenerator.layer.sampler.blend.BlendProperties;
|
||||
import com.dfsek.terra.addons.chunkgenerator.layer.sampler.chunk.DensityChunkLayerSampler;
|
||||
import com.dfsek.terra.api.world.biome.generation.BiomeProvider;
|
||||
import com.dfsek.terra.api.world.info.WorldProperties;
|
||||
|
||||
|
||||
public class DensityLayerSampler implements LayerSampler {
|
||||
|
||||
private final Sampler sampler;
|
||||
private final BlendProperties blendProperties;
|
||||
|
||||
public DensityLayerSampler(Sampler sampler, BlendProperties blendProperties) {
|
||||
this.sampler = sampler;
|
||||
this.blendProperties = blendProperties;
|
||||
}
|
||||
|
||||
@Override
|
||||
public double sample(int x, int y, int z, WorldProperties world, BiomeProvider biomeProvider) {
|
||||
//TODO if needed make this match chunk impl
|
||||
return sampler.getSample(world.getSeed(), x, y, z);
|
||||
}
|
||||
|
||||
@Override
|
||||
public ChunkLayerSampler getChunk(int chunkX, int chunkZ, WorldProperties world, BiomeProvider biomeProvider) {
|
||||
return new DensityChunkLayerSampler(chunkX, chunkZ, world, biomeProvider, this, blendProperties);
|
||||
}
|
||||
|
||||
@Override
|
||||
public double getBlendWeight() {
|
||||
return blendProperties.weight();
|
||||
}
|
||||
}
|
||||
-39
@@ -1,39 +0,0 @@
|
||||
package com.dfsek.terra.addons.chunkgenerator.layer.sampler;
|
||||
|
||||
import com.dfsek.seismic.type.sampler.Sampler;
|
||||
|
||||
import com.dfsek.terra.addons.chunkgenerator.api.LayerSampler;
|
||||
import com.dfsek.terra.addons.chunkgenerator.api.chunk.ChunkLayerSampler;
|
||||
import com.dfsek.terra.addons.chunkgenerator.layer.sampler.blend.BlendProperties;
|
||||
import com.dfsek.terra.addons.chunkgenerator.layer.sampler.chunk.DensityChunkLayerSampler;
|
||||
import com.dfsek.terra.addons.chunkgenerator.layer.sampler.chunk.ElevationChunkLayerSampler;
|
||||
import com.dfsek.terra.api.world.biome.generation.BiomeProvider;
|
||||
import com.dfsek.terra.api.world.info.WorldProperties;
|
||||
|
||||
|
||||
public class ElevationLayerSampler implements LayerSampler {
|
||||
|
||||
private final Sampler sampler;
|
||||
private final BlendProperties blendProperties;
|
||||
|
||||
public ElevationLayerSampler(Sampler sampler, BlendProperties blendProperties) {
|
||||
this.sampler = sampler;
|
||||
this.blendProperties = blendProperties;
|
||||
}
|
||||
|
||||
@Override
|
||||
public double sample(int x, int y, int z, WorldProperties world, BiomeProvider biomeProvider) {
|
||||
//TODO if needed make this match chunk impl
|
||||
return sampler.getSample(world.getSeed(), x, z);
|
||||
}
|
||||
|
||||
@Override
|
||||
public ChunkLayerSampler getChunk(int chunkX, int chunkZ, WorldProperties world, BiomeProvider biomeProvider) {
|
||||
return new ElevationChunkLayerSampler(chunkX, chunkZ, world, biomeProvider, this, blendProperties);
|
||||
}
|
||||
|
||||
@Override
|
||||
public double getBlendWeight() {
|
||||
return blendProperties.weight();
|
||||
}
|
||||
}
|
||||
-7
@@ -1,7 +0,0 @@
|
||||
package com.dfsek.terra.addons.chunkgenerator.layer.sampler.blend;
|
||||
|
||||
public record BlendProperties(int density, double weight, int extent) {
|
||||
public static BlendProperties of(int density, double weight) {
|
||||
return new BlendProperties(density, weight, Math.max((18 / density) + 1, 1));
|
||||
}
|
||||
}
|
||||
-100
@@ -1,100 +0,0 @@
|
||||
package com.dfsek.terra.addons.chunkgenerator.layer.sampler.chunk;
|
||||
|
||||
import com.dfsek.seismic.math.floatingpoint.FloatingPointFunctions;
|
||||
import com.dfsek.seismic.math.numericanalysis.interpolation.InterpolationFunctions;
|
||||
import com.dfsek.terra.addons.chunkgenerator.api.LayerSampler;
|
||||
import com.dfsek.terra.addons.chunkgenerator.api.chunk.ChunkLayerSampler;
|
||||
import com.dfsek.terra.addons.chunkgenerator.layer.sampler.DensityLayerSampler;
|
||||
import com.dfsek.terra.addons.chunkgenerator.layer.sampler.blend.BlendProperties;
|
||||
import com.dfsek.terra.api.world.biome.generation.BiomeProvider;
|
||||
import com.dfsek.terra.api.world.info.WorldProperties;
|
||||
|
||||
public class DensityChunkLayerSampler implements ChunkLayerSampler {
|
||||
double[] samples;
|
||||
|
||||
private final int blendExtent;
|
||||
|
||||
private final int min;
|
||||
private final int blendExtentYExtent;
|
||||
|
||||
private final int blendExtentMinus2;
|
||||
private final int blendYExtendMinus2;
|
||||
private final int blendDensity;
|
||||
|
||||
public DensityChunkLayerSampler(int chunkX, int chunkZ, WorldProperties world, BiomeProvider biomeProvider, DensityLayerSampler layerSampler, BlendProperties blendProperties) {
|
||||
this.min = world.getMinHeight() - 1;
|
||||
int worldMax = world.getMaxHeight() + 1;
|
||||
|
||||
blendDensity = blendProperties.density();
|
||||
|
||||
int blendYRange = worldMax - min + 1;
|
||||
|
||||
int max;
|
||||
int blendYExtend;
|
||||
if (blendYRange % blendDensity == 0) {
|
||||
blendYExtend = blendYRange / blendDensity;
|
||||
max = worldMax;
|
||||
} else {
|
||||
blendYExtend = (blendYRange / blendDensity) + 1;
|
||||
max = worldMax + 1;
|
||||
}
|
||||
|
||||
blendExtent = blendProperties.extent();
|
||||
blendExtentYExtent = blendYExtend * blendExtent;
|
||||
blendExtentMinus2 = blendExtent - 2;
|
||||
blendYExtendMinus2 = blendYExtend - 2;
|
||||
|
||||
samples = new double[blendExtentYExtent * blendExtent];
|
||||
|
||||
int xOrigin = (chunkX << 4) - 1;
|
||||
int zOrigin = (chunkZ << 4) - 1;
|
||||
|
||||
for (int x = 0; x < 18; x += blendDensity) {
|
||||
for (int z = 0; z < 18; z += blendDensity) {
|
||||
int cx = xOrigin + x;
|
||||
int cz = zOrigin + z;
|
||||
for (int y = this.min; y <= max; y++) {
|
||||
int yi = y - this.min;
|
||||
int index = x * blendExtentYExtent + yi * blendExtent + z;
|
||||
samples[index] = layerSampler.sample(cx, y, cz, world, biomeProvider);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private double getSample(int x, int y, int z) {
|
||||
int index = x * blendExtentYExtent + y * blendExtent + z;
|
||||
return samples[index];
|
||||
}
|
||||
|
||||
@Override
|
||||
public double sample(int fmX, int y, int fmZ) {
|
||||
double gx = (double)(fmX + 1) / blendDensity;
|
||||
double gz = (double)(fmZ + 1) / blendDensity;
|
||||
double gy = (double)(y - min) / blendDensity;
|
||||
|
||||
int x0 = Math.max(0, Math.min(blendExtentMinus2, FloatingPointFunctions.floor(gx)));
|
||||
int z0 = Math.max(0, Math.min(blendExtentMinus2, FloatingPointFunctions.floor(gz)));
|
||||
int y0 = Math.max(0, Math.min(blendYExtendMinus2, FloatingPointFunctions.floor(gy)));
|
||||
|
||||
int x1 = x0 + 1;
|
||||
int z1 = z0 + 1;
|
||||
int y1 = y0 + 1;
|
||||
|
||||
double tx = gx - x0;
|
||||
double tz = gz - z0;
|
||||
double ty = gy - y0;
|
||||
|
||||
// Fetch 8 corners
|
||||
double c000 = getSample(x0, y0, z0);
|
||||
double c100 = getSample(x1, y0, z0);
|
||||
double c010 = getSample(x0, y1, z0);
|
||||
double c110 = getSample(x1, y1, z0);
|
||||
double c001 = getSample(x0, y0, z1);
|
||||
double c101 = getSample(x1, y0, z1);
|
||||
double c011 = getSample(x0, y1, z1);
|
||||
double c111 = getSample(x1, y1, z1);
|
||||
|
||||
return InterpolationFunctions.triLerp(c000, c100, c010, c110, c001, c101, c011, c111, tx, ty, tz);
|
||||
}
|
||||
}
|
||||
-37
@@ -1,37 +0,0 @@
|
||||
package com.dfsek.terra.addons.chunkgenerator.layer.sampler.chunk;
|
||||
|
||||
import com.dfsek.terra.addons.chunkgenerator.api.LayerSampler;
|
||||
import com.dfsek.terra.addons.chunkgenerator.api.chunk.ChunkLayerSampler;
|
||||
import com.dfsek.terra.addons.chunkgenerator.layer.sampler.ElevationLayerSampler;
|
||||
import com.dfsek.terra.addons.chunkgenerator.layer.sampler.blend.BlendProperties;
|
||||
import com.dfsek.terra.api.world.biome.generation.BiomeProvider;
|
||||
import com.dfsek.terra.api.world.info.WorldProperties;
|
||||
|
||||
|
||||
public class ElevationChunkLayerSampler implements ChunkLayerSampler {
|
||||
double[] samples;
|
||||
|
||||
public ElevationChunkLayerSampler(int chunkX, int chunkZ, WorldProperties world, BiomeProvider biomeProvider, ElevationLayerSampler layerSampler,
|
||||
BlendProperties blendProperties) {
|
||||
//I see no reason to implement sparse blending here, elevation is inexpensive. If that changes, it can be easily implemented here.
|
||||
samples = new double[16 * 16];
|
||||
|
||||
int xOrigin = chunkX << 4;
|
||||
int zOrigin = chunkZ << 4;
|
||||
|
||||
for (int x = 0; x < 16; x++) {
|
||||
for (int z = 0; z < 16; z++) {
|
||||
int cx = xOrigin + x;
|
||||
int cz = zOrigin + z;
|
||||
int index = x * 16 + z;
|
||||
samples[index] = layerSampler.sample(cx, 0, cz, world, biomeProvider);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public double sample(int fmX, int y, int fmZ) {
|
||||
int index = fmX * 16 + fmZ;
|
||||
return samples[index];
|
||||
}
|
||||
}
|
||||
-45
@@ -1,45 +0,0 @@
|
||||
package com.dfsek.terra.addons.chunkgenerator.math;
|
||||
|
||||
import com.dfsek.terra.addons.chunkgenerator.util.DoubleBiPredicate;
|
||||
|
||||
|
||||
public enum RelationalOperator implements DoubleBiPredicate {
|
||||
GreaterThan {
|
||||
@Override
|
||||
public boolean test(double a, double b) {
|
||||
return a > b;
|
||||
}
|
||||
},
|
||||
GreaterThanOrEqual {
|
||||
@Override
|
||||
public boolean test(double a, double b) {
|
||||
return a >= b;
|
||||
}
|
||||
},
|
||||
LessThan {
|
||||
@Override
|
||||
public boolean test(double a, double b) {
|
||||
return a < b;
|
||||
}
|
||||
},
|
||||
LessThanOrEqual {
|
||||
@Override
|
||||
public boolean test(double a, double b) {
|
||||
return a <= b;
|
||||
}
|
||||
},
|
||||
Equals {
|
||||
@Override
|
||||
public boolean test(double a, double b) {
|
||||
return a == b;
|
||||
}
|
||||
},
|
||||
NotEquals {
|
||||
@Override
|
||||
public boolean test(double a, double b) {
|
||||
return a != b;
|
||||
}
|
||||
};
|
||||
|
||||
public abstract boolean test(double a, double b);
|
||||
}
|
||||
-14
@@ -1,14 +0,0 @@
|
||||
package com.dfsek.terra.addons.chunkgenerator.math.pointset;
|
||||
|
||||
import java.util.function.Supplier;
|
||||
import java.util.stream.Stream;
|
||||
|
||||
import com.dfsek.seismic.type.vector.Vector3Int;
|
||||
|
||||
|
||||
public interface PointSet extends Supplier<Stream<Vector3Int>> {
|
||||
|
||||
default Vector3Int[] toArray() {
|
||||
return this.get().distinct().toArray(Vector3Int[]::new);
|
||||
}
|
||||
}
|
||||
-20
@@ -1,20 +0,0 @@
|
||||
package com.dfsek.terra.addons.chunkgenerator.math.pointset.generative;
|
||||
|
||||
import java.util.stream.Stream;
|
||||
|
||||
import com.dfsek.terra.addons.chunkgenerator.math.pointset.PointSet;
|
||||
import com.dfsek.seismic.type.vector.Vector3Int;
|
||||
|
||||
public class AdjacentPointSet implements PointSet {
|
||||
@Override
|
||||
public Stream<Vector3Int> get() {
|
||||
return Stream.of(
|
||||
Vector3Int.of(0, 0, -1),
|
||||
Vector3Int.of(0, 0, 1),
|
||||
Vector3Int.of(0, -1, 0),
|
||||
Vector3Int.of(0, 1, 0),
|
||||
Vector3Int.of(-1, 0, 0),
|
||||
Vector3Int.of(1, 0, 0)
|
||||
);
|
||||
}
|
||||
}
|
||||
-22
@@ -1,22 +0,0 @@
|
||||
package com.dfsek.terra.addons.chunkgenerator.math.pointset.generative;
|
||||
|
||||
import java.util.Set;
|
||||
import java.util.stream.Stream;
|
||||
|
||||
import com.dfsek.terra.addons.chunkgenerator.math.pointset.PointSet;
|
||||
import com.dfsek.seismic.type.vector.Vector3Int;
|
||||
|
||||
|
||||
public class SimplePointSet implements PointSet {
|
||||
|
||||
private final Stream<Vector3Int> points;
|
||||
|
||||
public SimplePointSet(Set<Vector3Int> points) {
|
||||
this.points = points.stream();
|
||||
}
|
||||
|
||||
@Override
|
||||
public Stream<Vector3Int> get() {
|
||||
return points;
|
||||
}
|
||||
}
|
||||
-31
@@ -1,31 +0,0 @@
|
||||
package com.dfsek.terra.addons.chunkgenerator.math.pointset.generative.geometric;
|
||||
|
||||
import java.util.HashSet;
|
||||
import java.util.Set;
|
||||
import java.util.stream.Stream;
|
||||
|
||||
import com.dfsek.terra.addons.chunkgenerator.math.pointset.PointSet;
|
||||
import com.dfsek.seismic.type.vector.Vector3Int;
|
||||
|
||||
|
||||
public class CuboidPointSet implements PointSet {
|
||||
|
||||
private final Stream<Vector3Int> points;
|
||||
|
||||
public CuboidPointSet(int x1, int y1, int z1, int x2, int y2, int z2) {
|
||||
Set<Vector3Int> points = new HashSet<>();
|
||||
for (int x = x1; x <= x2; x = x + 1) {
|
||||
for (int y = y1; y <= y2; y = y + 1) {
|
||||
for (int z = z1; z <= z2; z = z + 1) {
|
||||
points.add(Vector3Int.of(x, y, z));
|
||||
}
|
||||
}
|
||||
}
|
||||
this.points = points.stream();
|
||||
}
|
||||
|
||||
@Override
|
||||
public Stream<Vector3Int> get() {
|
||||
return points;
|
||||
}
|
||||
}
|
||||
-36
@@ -1,36 +0,0 @@
|
||||
package com.dfsek.terra.addons.chunkgenerator.math.pointset.generative.geometric;
|
||||
|
||||
import java.util.stream.Stream;
|
||||
|
||||
import com.dfsek.terra.addons.chunkgenerator.math.pointset.PointSet;
|
||||
import com.dfsek.seismic.type.vector.Vector3Int;
|
||||
import com.dfsek.seismic.math.floatingpoint.FloatingPointFunctions;
|
||||
import com.dfsek.seismic.type.DistanceFunction;
|
||||
|
||||
|
||||
public class SphericalPointSet implements PointSet {
|
||||
|
||||
private final Stream<Vector3Int> points;
|
||||
|
||||
public SphericalPointSet(double radius) {
|
||||
Stream.Builder<Vector3Int> streamBuilder = Stream.builder();
|
||||
int roundedRadius = FloatingPointFunctions.ceil(radius);
|
||||
for(int x = -roundedRadius; x <= roundedRadius; x++) {
|
||||
for(int y = -roundedRadius; y <= roundedRadius; y++) {
|
||||
for(int z = -roundedRadius; z <= roundedRadius; z++) {
|
||||
Vector3Int pos = Vector3Int.of(x, y, z);
|
||||
double length = pos.toFloat().length(DistanceFunction.Euclidean);
|
||||
if (length == 0) continue;
|
||||
if (length > radius) continue;
|
||||
streamBuilder.add(pos);
|
||||
}
|
||||
}
|
||||
}
|
||||
this.points = streamBuilder.build();
|
||||
}
|
||||
|
||||
@Override
|
||||
public Stream<Vector3Int> get() {
|
||||
return points;
|
||||
}
|
||||
}
|
||||
-29
@@ -1,29 +0,0 @@
|
||||
package com.dfsek.terra.addons.chunkgenerator.math.pointset.operative;
|
||||
|
||||
import com.google.common.collect.Sets;
|
||||
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
import java.util.stream.Collectors;
|
||||
import java.util.stream.Stream;
|
||||
|
||||
import com.dfsek.terra.addons.chunkgenerator.math.pointset.PointSet;
|
||||
import com.dfsek.seismic.type.vector.Vector3Int;
|
||||
|
||||
public class DifferencePointSet implements PointSet {
|
||||
|
||||
private final Stream<Vector3Int> points;
|
||||
|
||||
public DifferencePointSet(List<PointSet> sets) {
|
||||
points = sets.stream()
|
||||
.map(PointSet::get)
|
||||
.map(s -> s.collect(Collectors.toSet()))
|
||||
.reduce(Sets::difference).orElse(Collections.emptySet())
|
||||
.stream();
|
||||
}
|
||||
|
||||
@Override
|
||||
public Stream<Vector3Int> get() {
|
||||
return points;
|
||||
}
|
||||
}
|
||||
-32
@@ -1,32 +0,0 @@
|
||||
package com.dfsek.terra.addons.chunkgenerator.math.pointset.operative;
|
||||
|
||||
import com.dfsek.paralithic.Expression;
|
||||
import com.dfsek.paralithic.eval.parser.Parser;
|
||||
import com.dfsek.paralithic.eval.parser.Scope;
|
||||
import com.dfsek.paralithic.eval.tokenizer.ParseException;
|
||||
|
||||
import java.util.stream.Stream;
|
||||
|
||||
import com.dfsek.terra.addons.chunkgenerator.math.pointset.PointSet;
|
||||
import com.dfsek.seismic.type.vector.Vector3Int;
|
||||
|
||||
|
||||
public class ExpressionFilterPointSet implements PointSet {
|
||||
|
||||
private final Stream<Vector3Int> points;
|
||||
|
||||
public ExpressionFilterPointSet(PointSet set, String eq) throws ParseException {
|
||||
Parser parser = new Parser();
|
||||
Scope scope = new Scope();
|
||||
scope.addInvocationVariable("x");
|
||||
scope.addInvocationVariable("y");
|
||||
scope.addInvocationVariable("z");
|
||||
Expression expression = parser.parse(eq, scope);
|
||||
this.points = set.get().filter(v -> expression.evaluate(v.getX(), v.getY(), v.getZ()) == 1);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Stream<Vector3Int> get() {
|
||||
return points;
|
||||
}
|
||||
}
|
||||
-29
@@ -1,29 +0,0 @@
|
||||
package com.dfsek.terra.addons.chunkgenerator.math.pointset.operative;
|
||||
|
||||
import com.google.common.collect.Sets;
|
||||
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
import java.util.stream.Collectors;
|
||||
import java.util.stream.Stream;
|
||||
|
||||
import com.dfsek.terra.addons.chunkgenerator.math.pointset.PointSet;
|
||||
import com.dfsek.seismic.type.vector.Vector3Int;
|
||||
|
||||
public class IntersectionPointSet implements PointSet {
|
||||
|
||||
private final Stream<Vector3Int> points;
|
||||
|
||||
public IntersectionPointSet(List<PointSet> sets) {
|
||||
points = sets.stream()
|
||||
.map(PointSet::get)
|
||||
.map(s -> s.collect(Collectors.toSet()))
|
||||
.reduce(Sets::intersection).orElse(Collections.emptySet())
|
||||
.stream();
|
||||
}
|
||||
|
||||
@Override
|
||||
public Stream<Vector3Int> get() {
|
||||
return points;
|
||||
}
|
||||
}
|
||||
-29
@@ -1,29 +0,0 @@
|
||||
package com.dfsek.terra.addons.chunkgenerator.math.pointset.operative;
|
||||
|
||||
import com.google.common.collect.Sets;
|
||||
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
import java.util.stream.Collectors;
|
||||
import java.util.stream.Stream;
|
||||
|
||||
import com.dfsek.terra.addons.chunkgenerator.math.pointset.PointSet;
|
||||
import com.dfsek.seismic.type.vector.Vector3Int;
|
||||
|
||||
public class UnionPointSet implements PointSet {
|
||||
|
||||
private final Stream<Vector3Int> points;
|
||||
|
||||
public UnionPointSet(List<PointSet> sets) {
|
||||
points = sets.stream()
|
||||
.map(PointSet::get)
|
||||
.map(s -> s.collect(Collectors.toSet()))
|
||||
.reduce(Sets::union).orElse(Collections.emptySet())
|
||||
.stream();
|
||||
}
|
||||
|
||||
@Override
|
||||
public Stream<Vector3Int> get() {
|
||||
return points;
|
||||
}
|
||||
}
|
||||
-34
@@ -1,34 +0,0 @@
|
||||
package com.dfsek.terra.addons.chunkgenerator.palette;
|
||||
|
||||
import java.util.Map;
|
||||
import java.util.NavigableMap;
|
||||
import java.util.TreeMap;
|
||||
|
||||
|
||||
public class DoubleNavigableHolder<T> {
|
||||
|
||||
private final NavigableMap<Double, T> map;
|
||||
|
||||
public DoubleNavigableHolder(Map<Double, T> inputMap) {
|
||||
NavigableMap<Double, T> map = new TreeMap<>(inputMap);
|
||||
map.put(Double.MAX_VALUE, map.lastEntry().getValue());
|
||||
this.map = map;
|
||||
}
|
||||
|
||||
public T get(double threshold) {
|
||||
return map.ceilingEntry(threshold).getValue();
|
||||
}
|
||||
|
||||
enum Method {
|
||||
CEILING,
|
||||
FLOOR,
|
||||
CLOSEST
|
||||
}
|
||||
|
||||
public class Single extends DoubleNavigableHolder<T> {
|
||||
|
||||
public Single(Map<Double, T> inputMap) {
|
||||
super(inputMap);
|
||||
}
|
||||
}
|
||||
}
|
||||
-18
@@ -1,18 +0,0 @@
|
||||
package com.dfsek.terra.addons.chunkgenerator.palette;
|
||||
|
||||
import com.dfsek.terra.api.block.state.BlockState;
|
||||
import com.dfsek.terra.api.world.chunk.generation.util.Palette;
|
||||
|
||||
|
||||
public class SingletonPalette implements Palette {
|
||||
private final BlockState blockState;
|
||||
|
||||
public SingletonPalette(BlockState blockState) {
|
||||
this.blockState = blockState;
|
||||
}
|
||||
|
||||
@Override
|
||||
public BlockState get(int layer, double x, double y, double z, long seed) {
|
||||
return blockState;
|
||||
}
|
||||
}
|
||||
-6
@@ -1,6 +0,0 @@
|
||||
package com.dfsek.terra.addons.chunkgenerator.util;
|
||||
|
||||
@FunctionalInterface
|
||||
public interface DoubleBiPredicate {
|
||||
boolean test(double a, double b);
|
||||
}
|
||||
-12
@@ -1,12 +0,0 @@
|
||||
package com.dfsek.terra.addons.chunkgenerator.util;
|
||||
|
||||
import java.util.function.Supplier;
|
||||
|
||||
|
||||
public record InstanceWrapper<T>(T instance) implements Supplier<T> {
|
||||
|
||||
@Override
|
||||
public T get() {
|
||||
return instance;
|
||||
}
|
||||
}
|
||||
+1
-1
@@ -1,11 +1,11 @@
|
||||
package com.dfsek.terra.addons.chunkgenerator.config.noise;
|
||||
|
||||
import com.dfsek.seismic.type.sampler.Sampler;
|
||||
import com.dfsek.tectonic.api.config.template.annotations.Default;
|
||||
import com.dfsek.tectonic.api.config.template.annotations.Value;
|
||||
import com.dfsek.tectonic.api.config.template.object.ObjectTemplate;
|
||||
|
||||
import com.dfsek.terra.api.config.meta.Meta;
|
||||
import com.dfsek.seismic.type.sampler.Sampler;
|
||||
|
||||
|
||||
public class BiomeNoiseConfigTemplate implements ObjectTemplate<BiomeNoiseProperties> {
|
||||
|
||||
+1
@@ -1,6 +1,7 @@
|
||||
package com.dfsek.terra.addons.chunkgenerator.config.noise;
|
||||
|
||||
import com.dfsek.seismic.type.sampler.Sampler;
|
||||
|
||||
import com.dfsek.terra.api.properties.Properties;
|
||||
|
||||
|
||||
|
||||
+2
-1
@@ -1,8 +1,9 @@
|
||||
package com.dfsek.terra.addons.chunkgenerator.generation.math;
|
||||
|
||||
import com.dfsek.terra.addons.chunkgenerator.generation.math.samplers.Sampler3D;
|
||||
import com.dfsek.seismic.type.vector.Vector3;
|
||||
|
||||
import com.dfsek.terra.addons.chunkgenerator.generation.math.samplers.Sampler3D;
|
||||
|
||||
|
||||
public enum SlantCalculationMethod {
|
||||
DotProduct {
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user