implement global and local functions in expression samplers

This commit is contained in:
dfsek 2021-09-26 23:35:19 -07:00
parent 98d147a304
commit 9bcdc40eb5
4 changed files with 35 additions and 12 deletions

View File

@ -3,11 +3,13 @@ package com.dfsek.terra.addons.noise;
import com.dfsek.tectonic.loading.object.ObjectTemplate; import com.dfsek.tectonic.loading.object.ObjectTemplate;
import java.util.HashMap; import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.Map; import java.util.Map;
import java.util.function.Supplier; import java.util.function.Supplier;
import com.dfsek.terra.addons.noise.config.DimensionApplicableNoiseSampler; import com.dfsek.terra.addons.noise.config.DimensionApplicableNoiseSampler;
import com.dfsek.terra.addons.noise.config.templates.DomainWarpTemplate; import com.dfsek.terra.addons.noise.config.templates.DomainWarpTemplate;
import com.dfsek.terra.addons.noise.config.templates.FunctionTemplate;
import com.dfsek.terra.addons.noise.config.templates.ImageSamplerTemplate; import com.dfsek.terra.addons.noise.config.templates.ImageSamplerTemplate;
import com.dfsek.terra.addons.noise.config.templates.KernelTemplate; import com.dfsek.terra.addons.noise.config.templates.KernelTemplate;
import com.dfsek.terra.addons.noise.config.templates.noise.CellularNoiseTemplate; import com.dfsek.terra.addons.noise.config.templates.noise.CellularNoiseTemplate;
@ -64,7 +66,8 @@ public class NoiseAddon extends TerraAddon {
.applyLoader(CellularSampler.DistanceFunction.class, .applyLoader(CellularSampler.DistanceFunction.class,
(t, o, l) -> CellularSampler.DistanceFunction.valueOf((String) o)) (t, o, l) -> CellularSampler.DistanceFunction.valueOf((String) o))
.applyLoader(CellularSampler.ReturnType.class, (t, o, l) -> CellularSampler.ReturnType.valueOf((String) o)) .applyLoader(CellularSampler.ReturnType.class, (t, o, l) -> CellularSampler.ReturnType.valueOf((String) o))
.applyLoader(DimensionApplicableNoiseSampler.class, DimensionApplicableNoiseSampler::new); .applyLoader(DimensionApplicableNoiseSampler.class, DimensionApplicableNoiseSampler::new)
.applyLoader(FunctionTemplate.class, FunctionTemplate::new);
noiseRegistry.register("LINEAR", LinearNormalizerTemplate::new); noiseRegistry.register("LINEAR", LinearNormalizerTemplate::new);
noiseRegistry.register("NORMAL", NormalNormalizerTemplate::new); noiseRegistry.register("NORMAL", NormalNormalizerTemplate::new);
@ -97,13 +100,15 @@ public class NoiseAddon extends TerraAddon {
noiseRegistry.register("KERNEL", KernelTemplate::new); noiseRegistry.register("KERNEL", KernelTemplate::new);
Map<String, DimensionApplicableNoiseSampler> packFunctions = new HashMap<>(); Map<String, DimensionApplicableNoiseSampler> packSamplers = new LinkedHashMap<>();
noiseRegistry.register("EXPRESSION", () -> new ExpressionFunctionTemplate(packFunctions)); Map<String, FunctionTemplate> packFunctions = new LinkedHashMap<>();
noiseRegistry.register("EXPRESSION", () -> new ExpressionFunctionTemplate(packSamplers, packFunctions));
NoiseConfigPackTemplate template = new NoiseConfigPackTemplate(); NoiseConfigPackTemplate template = new NoiseConfigPackTemplate();
event.loadTemplate(template); event.loadTemplate(template);
packFunctions.putAll(template.getNoiseBuilderMap()); packSamplers.putAll(template.getSamplers());
packFunctions.putAll(template.getFunctions());
}) })
.failThrough(); .failThrough();
} }

View File

@ -1,11 +1,14 @@
package com.dfsek.terra.addons.noise; package com.dfsek.terra.addons.noise;
import com.dfsek.tectonic.annotations.Default;
import com.dfsek.tectonic.annotations.Value; import com.dfsek.tectonic.annotations.Value;
import com.dfsek.tectonic.config.ConfigTemplate; import com.dfsek.tectonic.config.ConfigTemplate;
import java.util.LinkedHashMap;
import java.util.Map; import java.util.Map;
import com.dfsek.terra.addons.noise.config.DimensionApplicableNoiseSampler; import com.dfsek.terra.addons.noise.config.DimensionApplicableNoiseSampler;
import com.dfsek.terra.addons.noise.config.templates.FunctionTemplate;
import com.dfsek.terra.api.config.meta.Meta; import com.dfsek.terra.api.config.meta.Meta;
@ -13,7 +16,15 @@ public class NoiseConfigPackTemplate implements ConfigTemplate {
@Value("noise") @Value("noise")
private @Meta Map<String, @Meta DimensionApplicableNoiseSampler> noiseBuilderMap; private @Meta Map<String, @Meta DimensionApplicableNoiseSampler> noiseBuilderMap;
public Map<String, DimensionApplicableNoiseSampler> getNoiseBuilderMap() { @Value("functions")
@Default
private @Meta LinkedHashMap<String, @Meta FunctionTemplate> expressions = new LinkedHashMap<>();
public Map<String, DimensionApplicableNoiseSampler> getSamplers() {
return noiseBuilderMap; return noiseBuilderMap;
} }
public LinkedHashMap<String, FunctionTemplate> getFunctions() {
return expressions;
}
} }

View File

@ -13,7 +13,7 @@ public class FunctionTemplate implements ObjectTemplate<FunctionTemplate> {
@Value("arguments") @Value("arguments")
private List<String> args; private List<String> args;
@Value("function") @Value("expression")
private @Meta String function; private @Meta String function;
@Override @Override

View File

@ -33,16 +33,19 @@ public class ExpressionFunctionTemplate extends SamplerTemplate<ExpressionFuncti
@Value("expression") @Value("expression")
private @Meta String equation; private @Meta String equation;
@Value("functions") @Value("samplers")
@Default @Default
private @Meta LinkedHashMap<String, @Meta DimensionApplicableNoiseSampler> functions = new LinkedHashMap<>(); private @Meta LinkedHashMap<String, @Meta DimensionApplicableNoiseSampler> samplers = new LinkedHashMap<>();
@Value("functions") @Value("functions")
@Default @Default
private @Meta LinkedHashMap<String, @Meta FunctionTemplate> expressions = new LinkedHashMap<>(); private @Meta LinkedHashMap<String, @Meta FunctionTemplate> functions = new LinkedHashMap<>();
public ExpressionFunctionTemplate(Map<String, DimensionApplicableNoiseSampler> otherFunctions) { private final Map<String, FunctionTemplate> globalFunctions;
public ExpressionFunctionTemplate(Map<String, DimensionApplicableNoiseSampler> otherFunctions, Map<String, FunctionTemplate> samplers) {
this.otherFunctions = otherFunctions; this.otherFunctions = otherFunctions;
this.globalFunctions = samplers;
} }
@Override @Override
@ -69,7 +72,11 @@ public class ExpressionFunctionTemplate extends SamplerTemplate<ExpressionFuncti
private Map<String, Function> generateFunctions() throws ParseException { private Map<String, Function> generateFunctions() throws ParseException {
Map<String, Function> noiseFunctionMap = new HashMap<>(); Map<String, Function> noiseFunctionMap = new HashMap<>();
for(Map.Entry<String, FunctionTemplate> entry : expressions.entrySet()) { for(Map.Entry<String, FunctionTemplate> entry : globalFunctions.entrySet()) {
noiseFunctionMap.put(entry.getKey(), UserDefinedFunction.newInstance(entry.getValue(), new Parser(), new Scope()));
}
for(Map.Entry<String, FunctionTemplate> entry : functions.entrySet()) {
noiseFunctionMap.put(entry.getKey(), UserDefinedFunction.newInstance(entry.getValue(), new Parser(), new Scope())); noiseFunctionMap.put(entry.getKey(), UserDefinedFunction.newInstance(entry.getValue(), new Parser(), new Scope()));
} }
@ -79,7 +86,7 @@ public class ExpressionFunctionTemplate extends SamplerTemplate<ExpressionFuncti
} else noiseFunctionMap.put(id, new NoiseFunction3(function.getSampler())); } else noiseFunctionMap.put(id, new NoiseFunction3(function.getSampler()));
}); });
functions.forEach((id, function) -> { samplers.forEach((id, function) -> {
if(function.getDimensions() == 2) { if(function.getDimensions() == 2) {
noiseFunctionMap.put(id, new NoiseFunction2(function.getSampler())); noiseFunctionMap.put(id, new NoiseFunction2(function.getSampler()));
} else noiseFunctionMap.put(id, new NoiseFunction3(function.getSampler())); } else noiseFunctionMap.put(id, new NoiseFunction3(function.getSampler()));