From 2abf809d0fbd15e4fa53d88bc139680d8b0f92fb Mon Sep 17 00:00:00 2001 From: dfsek Date: Sat, 14 May 2022 14:19:49 -0700 Subject: [PATCH] improve constant baking in SamplerFunction --- .../sampler/ConstantSamplerFunction.java | 58 +++++++++++++++++++ .../sampler/SamplerFunctionBuilder.java | 55 +++++++++--------- 2 files changed, 87 insertions(+), 26 deletions(-) create mode 100644 common/addons/terrascript-function-sampler/src/main/java/com/dfsek/terra/addons/terrascript/sampler/ConstantSamplerFunction.java diff --git a/common/addons/terrascript-function-sampler/src/main/java/com/dfsek/terra/addons/terrascript/sampler/ConstantSamplerFunction.java b/common/addons/terrascript-function-sampler/src/main/java/com/dfsek/terra/addons/terrascript/sampler/ConstantSamplerFunction.java new file mode 100644 index 000000000..83cf2563b --- /dev/null +++ b/common/addons/terrascript-function-sampler/src/main/java/com/dfsek/terra/addons/terrascript/sampler/ConstantSamplerFunction.java @@ -0,0 +1,58 @@ +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.Scope; +import com.dfsek.terra.addons.terrascript.parser.lang.functions.Function; +import com.dfsek.terra.addons.terrascript.script.TerraImplementationArguments; +import com.dfsek.terra.addons.terrascript.tokenizer.Position; +import com.dfsek.terra.api.noise.NoiseSampler; + + +public class ConstantSamplerFunction implements Function { + private final Returnable x, y, z; + private final NoiseSampler sampler; + + + private final boolean twoD; + private final Position position; + + public ConstantSamplerFunction(NoiseSampler sampler, + Returnable x, + Returnable y, + Returnable z, + boolean twoD, + Position position) { + this.x = x; + this.y = y; + this.z = z; + this.sampler = sampler; + this.twoD = twoD; + this.position = position; + } + + @Override + public Number apply(ImplementationArguments implementationArguments, Scope scope) { + TerraImplementationArguments arguments = (TerraImplementationArguments) implementationArguments; + double x = this.x.apply(implementationArguments, scope).doubleValue(); + + double z = this.z.apply(implementationArguments, scope).doubleValue(); + + if(twoD) { + return sampler.noise(arguments.getWorld().getSeed(), x, z); + } else { + double y = this.y.apply(implementationArguments, scope).doubleValue(); + return sampler.noise(arguments.getWorld().getSeed(), x, y, z); + } + } + + @Override + public Position getPosition() { + return position; + } + + @Override + public ReturnType returnType() { + 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 edd4e2327..db2ddada7 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 @@ -17,7 +17,7 @@ import com.dfsek.terra.addons.terrascript.tokenizer.Position; import com.dfsek.terra.api.noise.NoiseSampler; -public class SamplerFunctionBuilder implements FunctionBuilder { +public class SamplerFunctionBuilder implements FunctionBuilder> { private final Map samplers2d; private final Map samplers3d; @@ -36,41 +36,44 @@ public class SamplerFunctionBuilder implements FunctionBuilder @SuppressWarnings("unchecked") @Override - public SamplerFunction build(List> argumentList, Position position) { - Function, NoiseSampler> function; - + public com.dfsek.terra.addons.terrascript.parser.lang.functions.Function build(List> argumentList, Position position) { Returnable arg = (Returnable) argumentList.get(0); if(argumentList.size() == 3) { // 2D if(arg instanceof StringConstant constant) { - NoiseSampler sampler = Objects.requireNonNull(samplers2d.get(constant.getConstant()), - "No such 2D noise function " + constant.getConstant()).getSampler(); - function = s -> sampler; + return new ConstantSamplerFunction(Objects.requireNonNull(samplers2d.get(constant.getConstant()), "No such 2D noise function " + constant.getConstant()).getSampler(), + (Returnable) argumentList.get(1), + new NumericConstant(0, position), + (Returnable) argumentList.get(2), + true, + position); } else { - function = s -> Objects.requireNonNull(samplers2d.get(s.get()), "No such 2D noise function " + s.get()).getSampler(); + return new SamplerFunction((Returnable) argumentList.get(0), + (Returnable) argumentList.get(1), + new NumericConstant(0, position), + (Returnable) argumentList.get(2), + s -> Objects.requireNonNull(samplers2d.get(s.get()), "No such 2D noise function " + s.get()).getSampler(), + true, + position); } - return new SamplerFunction((Returnable) argumentList.get(0), - (Returnable) argumentList.get(1), - new NumericConstant(0, position), - (Returnable) argumentList.get(2), - function, - true, - position); + } else { // 3D if(arg instanceof StringConstant constant) { - NoiseSampler sampler = Objects.requireNonNull(samplers3d.get(constant.getConstant()), - "No such 3D noise function " + constant.getConstant()).getSampler(); - function = s -> sampler; + return new ConstantSamplerFunction(Objects.requireNonNull(samplers3d.get(constant.getConstant()), "No such 2D noise function " + constant.getConstant()).getSampler(), + (Returnable) argumentList.get(1), + (Returnable) argumentList.get(2), + (Returnable) argumentList.get(3), + true, + position); } else { - function = s -> Objects.requireNonNull(samplers3d.get(s.get()), "No such 3D noise function " + s.get()).getSampler(); + return new SamplerFunction((Returnable) argumentList.get(0), + (Returnable) argumentList.get(1), + (Returnable) argumentList.get(2), + (Returnable) argumentList.get(3), + s -> Objects.requireNonNull(samplers2d.get(s.get()), "No such 2D noise function " + s.get()).getSampler(), + true, + position); } - return new SamplerFunction((Returnable) argumentList.get(0), - (Returnable) argumentList.get(1), - (Returnable) argumentList.get(2), - (Returnable) argumentList.get(3), - function, - false, - position); } }