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 java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.function.Supplier;
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.FunctionTemplate;
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.noise.CellularNoiseTemplate;
@ -64,7 +66,8 @@ public class NoiseAddon extends TerraAddon {
.applyLoader(CellularSampler.DistanceFunction.class,
(t, o, l) -> CellularSampler.DistanceFunction.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("NORMAL", NormalNormalizerTemplate::new);
@ -97,13 +100,15 @@ public class NoiseAddon extends TerraAddon {
noiseRegistry.register("KERNEL", KernelTemplate::new);
Map<String, DimensionApplicableNoiseSampler> packFunctions = new HashMap<>();
noiseRegistry.register("EXPRESSION", () -> new ExpressionFunctionTemplate(packFunctions));
Map<String, DimensionApplicableNoiseSampler> packSamplers = new LinkedHashMap<>();
Map<String, FunctionTemplate> packFunctions = new LinkedHashMap<>();
noiseRegistry.register("EXPRESSION", () -> new ExpressionFunctionTemplate(packSamplers, packFunctions));
NoiseConfigPackTemplate template = new NoiseConfigPackTemplate();
event.loadTemplate(template);
packFunctions.putAll(template.getNoiseBuilderMap());
packSamplers.putAll(template.getSamplers());
packFunctions.putAll(template.getFunctions());
})
.failThrough();
}

View File

@ -1,11 +1,14 @@
package com.dfsek.terra.addons.noise;
import com.dfsek.tectonic.annotations.Default;
import com.dfsek.tectonic.annotations.Value;
import com.dfsek.tectonic.config.ConfigTemplate;
import java.util.LinkedHashMap;
import java.util.Map;
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;
@ -13,7 +16,15 @@ public class NoiseConfigPackTemplate implements ConfigTemplate {
@Value("noise")
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;
}
public LinkedHashMap<String, FunctionTemplate> getFunctions() {
return expressions;
}
}

View File

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

View File

@ -33,16 +33,19 @@ public class ExpressionFunctionTemplate extends SamplerTemplate<ExpressionFuncti
@Value("expression")
private @Meta String equation;
@Value("functions")
@Value("samplers")
@Default
private @Meta LinkedHashMap<String, @Meta DimensionApplicableNoiseSampler> functions = new LinkedHashMap<>();
private @Meta LinkedHashMap<String, @Meta DimensionApplicableNoiseSampler> samplers = new LinkedHashMap<>();
@Value("functions")
@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.globalFunctions = samplers;
}
@Override
@ -69,7 +72,11 @@ public class ExpressionFunctionTemplate extends SamplerTemplate<ExpressionFuncti
private Map<String, Function> generateFunctions() throws ParseException {
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()));
}
@ -79,7 +86,7 @@ public class ExpressionFunctionTemplate extends SamplerTemplate<ExpressionFuncti
} else noiseFunctionMap.put(id, new NoiseFunction3(function.getSampler()));
});
functions.forEach((id, function) -> {
samplers.forEach((id, function) -> {
if(function.getDimensions() == 2) {
noiseFunctionMap.put(id, new NoiseFunction2(function.getSampler()));
} else noiseFunctionMap.put(id, new NoiseFunction3(function.getSampler()));