diff --git a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/config/templates/FunctionTemplate.java b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/config/templates/FunctionTemplate.java index 6c52ac37d..c717cc569 100644 --- a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/config/templates/FunctionTemplate.java +++ b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/config/templates/FunctionTemplate.java @@ -7,9 +7,11 @@ package com.dfsek.terra.addons.noise.config.templates; +import com.dfsek.tectonic.annotations.Default; import com.dfsek.tectonic.annotations.Value; import com.dfsek.tectonic.loading.object.ObjectTemplate; +import java.util.LinkedHashMap; import java.util.List; import com.dfsek.terra.api.config.meta.Meta; @@ -23,6 +25,10 @@ public class FunctionTemplate implements ObjectTemplate { @Value("expression") private @Meta String function; + @Value("functions") + @Default + private @Meta LinkedHashMap functions = new LinkedHashMap<>(); + @Override public FunctionTemplate get() { return this; @@ -35,4 +41,8 @@ public class FunctionTemplate implements ObjectTemplate { public String getFunction() { return function; } + + public LinkedHashMap getFunctions() { + return functions; + } } diff --git a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/config/templates/noise/ExpressionFunctionTemplate.java b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/config/templates/noise/ExpressionFunctionTemplate.java index a5cb5fd75..b95d656a0 100644 --- a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/config/templates/noise/ExpressionFunctionTemplate.java +++ b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/config/templates/noise/ExpressionFunctionTemplate.java @@ -76,11 +76,11 @@ public class ExpressionFunctionTemplate extends SamplerTemplate noiseFunctionMap = new HashMap<>(); for(Map.Entry entry : globalFunctions.entrySet()) { - noiseFunctionMap.put(entry.getKey(), UserDefinedFunction.newInstance(entry.getValue(), new Parser(), new Scope())); + noiseFunctionMap.put(entry.getKey(), UserDefinedFunction.newInstance(entry.getValue())); } for(Map.Entry entry : functions.entrySet()) { - noiseFunctionMap.put(entry.getKey(), UserDefinedFunction.newInstance(entry.getValue(), new Parser(), new Scope())); + noiseFunctionMap.put(entry.getKey(), UserDefinedFunction.newInstance(entry.getValue())); } otherFunctions.forEach((id, function) -> { diff --git a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/paralithic/defined/UserDefinedFunction.java b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/paralithic/defined/UserDefinedFunction.java index d9e55630c..83ee8e7cf 100644 --- a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/paralithic/defined/UserDefinedFunction.java +++ b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/paralithic/defined/UserDefinedFunction.java @@ -17,6 +17,8 @@ import com.dfsek.paralithic.node.Statefulness; import com.dfsek.terra.addons.noise.config.templates.FunctionTemplate; +import java.util.Map.Entry; + public class UserDefinedFunction implements DynamicFunction { private final Expression expression; @@ -27,12 +29,20 @@ public class UserDefinedFunction implements DynamicFunction { this.args = args; } - public static UserDefinedFunction newInstance(FunctionTemplate template, Parser parser, Scope parent) throws ParseException { + public static UserDefinedFunction newInstance(FunctionTemplate template) throws ParseException { + Parser parser = new Parser(); + Scope parent = new Scope(); Scope functionScope = new Scope().withParent(parent); template.getArgs().forEach(functionScope::addInvocationVariable); + for(Entry entry : template.getFunctions().entrySet()) { + String id = entry.getKey(); + FunctionTemplate nest = entry.getValue(); + parser.registerFunction(id, newInstance(nest)); + } + return new UserDefinedFunction(parser.parse(template.getFunction(), functionScope), template.getArgs().size()); }