From c5416f54fa5877a60cc80d85d8d9665b105f9621 Mon Sep 17 00:00:00 2001 From: Julian Krings Date: Wed, 9 Jul 2025 23:40:04 +0200 Subject: [PATCH] add script hook for custom noise --- .../core/scripting/ExecutionEnvironment.java | 4 ++ .../engine/object/IrisGeneratorStyle.java | 44 ++++++++----------- .../core/scripting/kotlin/base/NoiseScript.kt | 16 +++++++ .../IrisPackExecutionEnvironment.kt | 5 +++ ...ris.core.scripting.kotlin.base.NoiseScript | 0 5 files changed, 43 insertions(+), 26 deletions(-) create mode 100644 core/src/main/kotlin/com/volmit/iris/core/scripting/kotlin/base/NoiseScript.kt create mode 100644 core/src/main/resources/META-INF/kotlin/script/templates/com.volmit.iris.core.scripting.kotlin.base.NoiseScript diff --git a/core/src/main/java/com/volmit/iris/core/scripting/ExecutionEnvironment.java b/core/src/main/java/com/volmit/iris/core/scripting/ExecutionEnvironment.java index 7e903a218..67939a2e6 100644 --- a/core/src/main/java/com/volmit/iris/core/scripting/ExecutionEnvironment.java +++ b/core/src/main/java/com/volmit/iris/core/scripting/ExecutionEnvironment.java @@ -5,6 +5,7 @@ import com.volmit.iris.core.loader.IrisRegistrant; import com.volmit.iris.core.scripting.kotlin.environment.IrisExecutionEnvironment; import com.volmit.iris.core.scripting.kotlin.environment.IrisPackExecutionEnvironment; import com.volmit.iris.core.scripting.kotlin.environment.IrisSimpleExecutionEnvironment; +import com.volmit.iris.util.math.RNG; import lombok.NonNull; import lombok.experimental.UtilityClass; import org.bukkit.Location; @@ -53,6 +54,9 @@ public class ExecutionEnvironment { public interface Pack extends Simple { @NonNull IrisData getData(); + + @Nullable + Object createNoise(@NonNull String script, @NonNull RNG rng); } public interface Engine extends Pack { diff --git a/core/src/main/java/com/volmit/iris/engine/object/IrisGeneratorStyle.java b/core/src/main/java/com/volmit/iris/engine/object/IrisGeneratorStyle.java index 1c1da694b..7f7ae9f47 100644 --- a/core/src/main/java/com/volmit/iris/engine/object/IrisGeneratorStyle.java +++ b/core/src/main/java/com/volmit/iris/engine/object/IrisGeneratorStyle.java @@ -18,6 +18,7 @@ package com.volmit.iris.engine.object; +import com.volmit.iris.Iris; import com.volmit.iris.core.loader.IrisData; import com.volmit.iris.engine.data.cache.AtomicCache; import com.volmit.iris.engine.object.annotations.*; @@ -25,6 +26,7 @@ import com.volmit.iris.util.math.RNG; import com.volmit.iris.util.noise.CNG; import com.volmit.iris.util.noise.ExpressionNoise; import com.volmit.iris.util.noise.ImageNoise; +import com.volmit.iris.util.noise.NoiseGenerator; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; @@ -56,6 +58,9 @@ public class IrisGeneratorStyle { private String expression = null; @Desc("Use an Image map instead of a generated value") private IrisImageMap imageMap = null; + @Desc("Instead of using the style property, use a custom noise generator to represent this style.") + @RegistryListResource(IrisScript.class) + private String script = null; @MinNumber(0.00001) @Desc("The Output multiplier. Only used if parent is fracture.") private double multiplier = 1; @@ -93,40 +98,27 @@ public class IrisGeneratorStyle { public CNG createNoCache(RNG rng, IrisData data, boolean actuallyCached) { String cacheKey = hash() + ""; + CNG cng = null; if (getExpression() != null) { IrisExpression e = data.getExpressionLoader().load(getExpression()); - if (e != null) { - CNG cng = new CNG(rng, new ExpressionNoise(rng, e), 1D, 1) - .bake().scale(1D / zoom).pow(exponent).bake(); - cng.setTrueFracturing(axialFracturing); - - if (fracture != null) { - cng.fractureWith(fracture.create(rng.nextParallelRNG(2934), data), fracture.getMultiplier()); - } - - if (cellularFrequency > 0) { - return cng.cellularize(rng.nextParallelRNG(884466), cellularFrequency).scale(1D / cellularZoom).bake(); - } - - return cng; + cng = new CNG(rng, new ExpressionNoise(rng, e), 1D, 1).bake(); } } else if (getImageMap() != null) { - CNG cng = new CNG(rng, new ImageNoise(data, getImageMap()), 1D, 1).bake().scale(1D / zoom).pow(exponent).bake(); - cng.setTrueFracturing(axialFracturing); - - if (fracture != null) { - cng.fractureWith(fracture.create(rng.nextParallelRNG(2934), data), fracture.getMultiplier()); + cng = new CNG(rng, new ImageNoise(data, getImageMap()), 1D, 1).bake(); + } else if (getScript() != null) { + Object result = data.getEnvironment().createNoise(getScript(), rng); + if (result == null) Iris.warn("Failed to create noise from script: " + getScript()); + if (result instanceof NoiseGenerator generator) { + cng = new CNG(rng, generator, 1D, 1).bake(); } - - if (cellularFrequency > 0) { - return cng.cellularize(rng.nextParallelRNG(884466), cellularFrequency).scale(1D / cellularZoom).bake(); - } - - return cng; } - CNG cng = style.create(rng).bake().scale(1D / zoom).pow(exponent).bake(); + if (cng == null) { + cng = style.create(rng).bake(); + } + + cng = cng.scale(1D / zoom).pow(exponent).bake(); cng.setTrueFracturing(axialFracturing); if (fracture != null) { diff --git a/core/src/main/kotlin/com/volmit/iris/core/scripting/kotlin/base/NoiseScript.kt b/core/src/main/kotlin/com/volmit/iris/core/scripting/kotlin/base/NoiseScript.kt new file mode 100644 index 000000000..c8a7056fa --- /dev/null +++ b/core/src/main/kotlin/com/volmit/iris/core/scripting/kotlin/base/NoiseScript.kt @@ -0,0 +1,16 @@ +package com.volmit.iris.core.scripting.kotlin.base + +import com.volmit.iris.util.math.RNG +import kotlin.script.experimental.annotations.KotlinScript +import kotlin.script.experimental.api.ScriptCompilationConfiguration +import kotlin.script.experimental.api.providedProperties + +@KotlinScript(fileExtension = "noise.kts", compilationConfiguration = NoiseScriptDefinition::class) +abstract class NoiseScript + +object NoiseScriptDefinition : ScriptCompilationConfiguration(listOf(DataScriptDefinition), { + providedProperties("rng" to RNG::class) +}) { + + private fun readResolve(): Any = NoiseScriptDefinition +} \ No newline at end of file diff --git a/core/src/main/kotlin/com/volmit/iris/core/scripting/kotlin/environment/IrisPackExecutionEnvironment.kt b/core/src/main/kotlin/com/volmit/iris/core/scripting/kotlin/environment/IrisPackExecutionEnvironment.kt index a69b9ea6a..c901ffc97 100644 --- a/core/src/main/kotlin/com/volmit/iris/core/scripting/kotlin/environment/IrisPackExecutionEnvironment.kt +++ b/core/src/main/kotlin/com/volmit/iris/core/scripting/kotlin/environment/IrisPackExecutionEnvironment.kt @@ -3,7 +3,9 @@ package com.volmit.iris.core.scripting.kotlin.environment import com.volmit.iris.core.loader.IrisData import com.volmit.iris.core.scripting.ExecutionEnvironment import com.volmit.iris.core.scripting.kotlin.base.DataScript +import com.volmit.iris.core.scripting.kotlin.base.NoiseScript import com.volmit.iris.core.scripting.kotlin.runner.Script +import com.volmit.iris.util.math.RNG import kotlin.reflect.KClass import kotlin.script.experimental.api.valueOrThrow @@ -26,6 +28,9 @@ open class IrisPackExecutionEnvironment( override fun evaluate(script: String) = evaluate(script, DataScript::class.java, data.parameters()) + override fun createNoise(script: String, rng: RNG) = + evaluate(script, NoiseScript::class.java, data.parameters("rng" to rng)) + private fun IrisData.parameters(vararg values: Pair): Map { return mapOf( "data" to this, diff --git a/core/src/main/resources/META-INF/kotlin/script/templates/com.volmit.iris.core.scripting.kotlin.base.NoiseScript b/core/src/main/resources/META-INF/kotlin/script/templates/com.volmit.iris.core.scripting.kotlin.base.NoiseScript new file mode 100644 index 000000000..e69de29bb