From aa605b740274e26ccfd2ae6da26db1128f0d3f8f Mon Sep 17 00:00:00 2001 From: dfsek Date: Tue, 18 Jan 2022 21:22:34 -0700 Subject: [PATCH] add SamplerFunction --- .../terrascript/sampler/SamplerFunction.java | 49 +++++++++++++-- .../sampler/SamplerFunctionBuilder.java | 59 ++++++++++++++++++- .../TerraScriptSamplerFunctionAddon.java | 4 +- 3 files changed, 105 insertions(+), 7 deletions(-) diff --git a/common/addons/terrascript-function-sampler/src/main/java/com/dfsek/terra/addons/terrascript/sampler/SamplerFunction.java b/common/addons/terrascript-function-sampler/src/main/java/com/dfsek/terra/addons/terrascript/sampler/SamplerFunction.java index a317ac2df..122ddd41a 100644 --- a/common/addons/terrascript-function-sampler/src/main/java/com/dfsek/terra/addons/terrascript/sampler/SamplerFunction.java +++ b/common/addons/terrascript-function-sampler/src/main/java/com/dfsek/terra/addons/terrascript/sampler/SamplerFunction.java @@ -1,26 +1,65 @@ package com.dfsek.terra.addons.terrascript.sampler; import com.dfsek.terra.addons.terrascript.parser.lang.ImplementationArguments; +import com.dfsek.terra.addons.terrascript.parser.lang.Returnable; import com.dfsek.terra.addons.terrascript.parser.lang.functions.Function; import com.dfsek.terra.addons.terrascript.parser.lang.variables.Variable; +import com.dfsek.terra.addons.terrascript.script.TerraImplementationArguments; import com.dfsek.terra.addons.terrascript.tokenizer.Position; +import com.dfsek.terra.api.noise.NoiseSampler; import java.util.Map; +import java.util.function.Supplier; -public class SamplerFunction implements Function { +public class SamplerFunction implements Function { + private final Returnable x, y, z; + private final Returnable function; + + private final java.util.function.Function, NoiseSampler> samplerFunction; + + private final boolean twoD; + private final Position position; + + public SamplerFunction(Returnable function, + Returnable x, + Returnable y, + Returnable z, + java.util.function.Function, NoiseSampler> samplerFunction, + boolean twoD, + Position position) { + this.x = x; + this.y = y; + this.z = z; + this.function = function; + this.samplerFunction = samplerFunction; + this.twoD = twoD; + this.position = position; + } + @Override - public Void apply(ImplementationArguments implementationArguments, Map> variableMap) { - return null; + public Number apply(ImplementationArguments implementationArguments, Map> variableMap) { + TerraImplementationArguments arguments = (TerraImplementationArguments) implementationArguments; + double x = this.x.apply(implementationArguments, variableMap).doubleValue(); + + double z = this.z.apply(implementationArguments, variableMap).doubleValue(); + + NoiseSampler sampler = samplerFunction.apply(() -> function.apply(implementationArguments, variableMap)); + if(twoD) { + return sampler.noise(arguments.getWorld().getSeed(), x, z); + } else { + double y = this.y.apply(implementationArguments, variableMap).doubleValue(); + return sampler.noise(arguments.getWorld().getSeed(), x, y, z); + } } @Override public Position getPosition() { - return null; + return position; } @Override public ReturnType returnType() { - return null; + return ReturnType.NUMBER; } } diff --git a/common/addons/terrascript-function-sampler/src/main/java/com/dfsek/terra/addons/terrascript/sampler/SamplerFunctionBuilder.java b/common/addons/terrascript-function-sampler/src/main/java/com/dfsek/terra/addons/terrascript/sampler/SamplerFunctionBuilder.java index cb09b9838..1e7f6a271 100644 --- a/common/addons/terrascript-function-sampler/src/main/java/com/dfsek/terra/addons/terrascript/sampler/SamplerFunctionBuilder.java +++ b/common/addons/terrascript-function-sampler/src/main/java/com/dfsek/terra/addons/terrascript/sampler/SamplerFunctionBuilder.java @@ -1,17 +1,74 @@ package com.dfsek.terra.addons.terrascript.sampler; +import com.dfsek.terra.addons.noise.config.DimensionApplicableNoiseSampler; import com.dfsek.terra.addons.terrascript.parser.lang.Returnable; import com.dfsek.terra.addons.terrascript.parser.lang.Returnable.ReturnType; +import com.dfsek.terra.addons.terrascript.parser.lang.constants.NumericConstant; +import com.dfsek.terra.addons.terrascript.parser.lang.constants.StringConstant; import com.dfsek.terra.addons.terrascript.parser.lang.functions.FunctionBuilder; import com.dfsek.terra.addons.terrascript.tokenizer.Position; +import com.dfsek.terra.api.noise.NoiseSampler; +import java.util.HashMap; import java.util.List; +import java.util.Map; +import java.util.function.Function; +import java.util.function.Supplier; public class SamplerFunctionBuilder implements FunctionBuilder { + private final Map samplers2d; + private final Map samplers3d; + + public SamplerFunctionBuilder(Map samplers) { + this.samplers2d = new HashMap<>(); + this.samplers3d = new HashMap<>(); + + samplers.forEach((id, sampler) -> { + if(sampler.getDimensions() == 2) { + samplers2d.put(id, sampler); + } else if(sampler.getDimensions() == 3) { + samplers3d.put(id, sampler); + } + }); + } + + @SuppressWarnings("unchecked") @Override public SamplerFunction build(List> argumentList, Position position) { - return null; + Function, NoiseSampler> function; + + Returnable arg = (Returnable) argumentList.get(0); + + if(argumentList.size() == 3) { // 2D + if(arg instanceof StringConstant constant) { + NoiseSampler sampler = samplers2d.get(constant.getConstant()).getSampler(); + function = s -> sampler; + } else { + function = s -> samplers2d.get(s.get()).getSampler(); + } + return new SamplerFunction((Returnable) argumentList.get(0), + (Returnable) argumentList.get(1), + new NumericConstant(0, position), + (Returnable) argumentList.get(3), + function, + true, + position); + } else { // 3D + if(arg instanceof StringConstant constant) { + NoiseSampler sampler = samplers3d.get(constant.getConstant()).getSampler(); + function = s -> sampler; + } else { + function = s -> samplers3d.get(s.get()).getSampler(); + } + return new SamplerFunction((Returnable) argumentList.get(0), + (Returnable) argumentList.get(1), + (Returnable) argumentList.get(2), + (Returnable) argumentList.get(3), + function, + false, + position); + } } @Override diff --git a/common/addons/terrascript-function-sampler/src/main/java/com/dfsek/terra/addons/terrascript/sampler/TerraScriptSamplerFunctionAddon.java b/common/addons/terrascript-function-sampler/src/main/java/com/dfsek/terra/addons/terrascript/sampler/TerraScriptSamplerFunctionAddon.java index bcdbe603d..cdb4b92bd 100644 --- a/common/addons/terrascript-function-sampler/src/main/java/com/dfsek/terra/addons/terrascript/sampler/TerraScriptSamplerFunctionAddon.java +++ b/common/addons/terrascript-function-sampler/src/main/java/com/dfsek/terra/addons/terrascript/sampler/TerraScriptSamplerFunctionAddon.java @@ -1,6 +1,7 @@ package com.dfsek.terra.addons.terrascript.sampler; import com.dfsek.terra.addons.manifest.api.AddonInitializer; +import com.dfsek.terra.addons.noise.NoiseConfigPackTemplate; import com.dfsek.terra.addons.terrascript.parser.lang.functions.FunctionBuilder; import com.dfsek.terra.api.Platform; import com.dfsek.terra.api.addon.BaseAddon; @@ -26,7 +27,8 @@ public class TerraScriptSamplerFunctionAddon implements AddonInitializer { .then(event -> event .getPack() .getOrCreateRegistry(FunctionBuilder.class) - .register(addon.key("sampler"), new SamplerFunctionBuilder(event.getPack().getContext().get()))) + .register(addon.key("sampler"), new SamplerFunctionBuilder(event.getPack().getContext().get( + NoiseConfigPackTemplate.class).getSamplers()))) .failThrough(); } }