add script hook for custom noise

This commit is contained in:
Julian Krings 2025-07-09 23:40:04 +02:00
parent 1bc6192c8b
commit c5416f54fa
No known key found for this signature in database
GPG Key ID: 208C6E08C3B718D2
5 changed files with 43 additions and 26 deletions

View File

@ -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.IrisExecutionEnvironment;
import com.volmit.iris.core.scripting.kotlin.environment.IrisPackExecutionEnvironment; import com.volmit.iris.core.scripting.kotlin.environment.IrisPackExecutionEnvironment;
import com.volmit.iris.core.scripting.kotlin.environment.IrisSimpleExecutionEnvironment; import com.volmit.iris.core.scripting.kotlin.environment.IrisSimpleExecutionEnvironment;
import com.volmit.iris.util.math.RNG;
import lombok.NonNull; import lombok.NonNull;
import lombok.experimental.UtilityClass; import lombok.experimental.UtilityClass;
import org.bukkit.Location; import org.bukkit.Location;
@ -53,6 +54,9 @@ public class ExecutionEnvironment {
public interface Pack extends Simple { public interface Pack extends Simple {
@NonNull @NonNull
IrisData getData(); IrisData getData();
@Nullable
Object createNoise(@NonNull String script, @NonNull RNG rng);
} }
public interface Engine extends Pack { public interface Engine extends Pack {

View File

@ -18,6 +18,7 @@
package com.volmit.iris.engine.object; package com.volmit.iris.engine.object;
import com.volmit.iris.Iris;
import com.volmit.iris.core.loader.IrisData; import com.volmit.iris.core.loader.IrisData;
import com.volmit.iris.engine.data.cache.AtomicCache; import com.volmit.iris.engine.data.cache.AtomicCache;
import com.volmit.iris.engine.object.annotations.*; 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.CNG;
import com.volmit.iris.util.noise.ExpressionNoise; import com.volmit.iris.util.noise.ExpressionNoise;
import com.volmit.iris.util.noise.ImageNoise; import com.volmit.iris.util.noise.ImageNoise;
import com.volmit.iris.util.noise.NoiseGenerator;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import lombok.Data; import lombok.Data;
import lombok.NoArgsConstructor; import lombok.NoArgsConstructor;
@ -56,6 +58,9 @@ public class IrisGeneratorStyle {
private String expression = null; private String expression = null;
@Desc("Use an Image map instead of a generated value") @Desc("Use an Image map instead of a generated value")
private IrisImageMap imageMap = null; 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) @MinNumber(0.00001)
@Desc("The Output multiplier. Only used if parent is fracture.") @Desc("The Output multiplier. Only used if parent is fracture.")
private double multiplier = 1; private double multiplier = 1;
@ -93,40 +98,27 @@ public class IrisGeneratorStyle {
public CNG createNoCache(RNG rng, IrisData data, boolean actuallyCached) { public CNG createNoCache(RNG rng, IrisData data, boolean actuallyCached) {
String cacheKey = hash() + ""; String cacheKey = hash() + "";
CNG cng = null;
if (getExpression() != null) { if (getExpression() != null) {
IrisExpression e = data.getExpressionLoader().load(getExpression()); IrisExpression e = data.getExpressionLoader().load(getExpression());
if (e != null) { if (e != null) {
CNG cng = new CNG(rng, new ExpressionNoise(rng, e), 1D, 1) cng = new CNG(rng, new ExpressionNoise(rng, e), 1D, 1).bake();
.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;
} }
} else if (getImageMap() != null) { } else if (getImageMap() != null) {
CNG cng = new CNG(rng, new ImageNoise(data, getImageMap()), 1D, 1).bake().scale(1D / zoom).pow(exponent).bake(); cng = new CNG(rng, new ImageNoise(data, getImageMap()), 1D, 1).bake();
cng.setTrueFracturing(axialFracturing); } else if (getScript() != null) {
Object result = data.getEnvironment().createNoise(getScript(), rng);
if (fracture != null) { if (result == null) Iris.warn("Failed to create noise from script: " + getScript());
cng.fractureWith(fracture.create(rng.nextParallelRNG(2934), data), fracture.getMultiplier()); if (result instanceof NoiseGenerator generator) {
cng = new CNG(rng, generator, 1D, 1).bake();
}
} }
if (cellularFrequency > 0) { if (cng == null) {
return cng.cellularize(rng.nextParallelRNG(884466), cellularFrequency).scale(1D / cellularZoom).bake(); cng = style.create(rng).bake();
} }
return cng; cng = cng.scale(1D / zoom).pow(exponent).bake();
}
CNG cng = style.create(rng).bake().scale(1D / zoom).pow(exponent).bake();
cng.setTrueFracturing(axialFracturing); cng.setTrueFracturing(axialFracturing);
if (fracture != null) { if (fracture != null) {

View File

@ -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
}

View File

@ -3,7 +3,9 @@ package com.volmit.iris.core.scripting.kotlin.environment
import com.volmit.iris.core.loader.IrisData import com.volmit.iris.core.loader.IrisData
import com.volmit.iris.core.scripting.ExecutionEnvironment import com.volmit.iris.core.scripting.ExecutionEnvironment
import com.volmit.iris.core.scripting.kotlin.base.DataScript 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.core.scripting.kotlin.runner.Script
import com.volmit.iris.util.math.RNG
import kotlin.reflect.KClass import kotlin.reflect.KClass
import kotlin.script.experimental.api.valueOrThrow import kotlin.script.experimental.api.valueOrThrow
@ -26,6 +28,9 @@ open class IrisPackExecutionEnvironment(
override fun evaluate(script: String) = override fun evaluate(script: String) =
evaluate(script, DataScript::class.java, data.parameters()) 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<String, Any?>): Map<String, Any?> { private fun IrisData.parameters(vararg values: Pair<String, Any?>): Map<String, Any?> {
return mapOf( return mapOf(
"data" to this, "data" to this,