noise addon + pack.yml noise functions

This commit is contained in:
dfsek 2021-07-05 20:35:39 -07:00
parent b8e1e99b84
commit 39f5aef0c5
6 changed files with 54 additions and 28 deletions

View File

@ -1,5 +1,6 @@
package com.dfsek.terra.addons.noise; package com.dfsek.terra.addons.noise;
import com.dfsek.tectonic.exception.ConfigException;
import com.dfsek.terra.addons.noise.config.NoiseSamplerBuilderLoader; import com.dfsek.terra.addons.noise.config.NoiseSamplerBuilderLoader;
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.ImageSamplerTemplate; import com.dfsek.terra.addons.noise.config.templates.ImageSamplerTemplate;
@ -31,13 +32,15 @@ import com.dfsek.terra.api.addon.annotations.Addon;
import com.dfsek.terra.api.addon.annotations.Author; import com.dfsek.terra.api.addon.annotations.Author;
import com.dfsek.terra.api.addon.annotations.Version; import com.dfsek.terra.api.addon.annotations.Version;
import com.dfsek.terra.api.event.EventListener; import com.dfsek.terra.api.event.EventListener;
import com.dfsek.terra.api.event.annotations.Global;
import com.dfsek.terra.api.event.events.config.ConfigPackPreLoadEvent; import com.dfsek.terra.api.event.events.config.ConfigPackPreLoadEvent;
import com.dfsek.terra.api.injection.annotations.Inject; import com.dfsek.terra.api.injection.annotations.Inject;
import com.dfsek.terra.api.registry.CheckedRegistry; import com.dfsek.terra.api.registry.CheckedRegistry;
import com.dfsek.terra.api.util.seeded.NoiseProvider; import com.dfsek.terra.api.util.seeded.NoiseProvider;
import com.dfsek.terra.api.util.seeded.NoiseSeeded; import com.dfsek.terra.api.util.seeded.NoiseSeeded;
import java.util.HashMap;
import java.util.Map;
@Addon("noise") @Addon("noise")
@Author("Terra") @Author("Terra")
@Version("1.0.0") @Version("1.0.0")
@ -54,23 +57,19 @@ public class NoiseAddon extends TerraAddon implements EventListener {
.applyLoader(NormalNormalizerTemplate.class, NormalNormalizerTemplate::new) .applyLoader(NormalNormalizerTemplate.class, NormalNormalizerTemplate::new)
.applyLoader(ImageSampler.Channel.class, (t, object, cf) -> ImageSampler.Channel.valueOf((String) object)) .applyLoader(ImageSampler.Channel.class, (t, object, cf) -> ImageSampler.Channel.valueOf((String) object))
.applyLoader(ClampNormalizerTemplate.class, ClampNormalizerTemplate::new) .applyLoader(ClampNormalizerTemplate.class, ClampNormalizerTemplate::new)
.applyLoader(ImageSamplerTemplate.class, ImageSamplerTemplate::new)
.applyLoader(CellularSampler.ReturnType.class, (t, object, cf) -> CellularSampler.ReturnType.valueOf((String) object)) .applyLoader(CellularSampler.ReturnType.class, (t, object, cf) -> CellularSampler.ReturnType.valueOf((String) object))
.applyLoader(CellularSampler.DistanceFunction.class, (t, object, cf) -> CellularSampler.DistanceFunction.valueOf((String) object)); .applyLoader(CellularSampler.DistanceFunction.class, (t, object, cf) -> CellularSampler.DistanceFunction.valueOf((String) object));
} }
@SuppressWarnings("deprecation") @SuppressWarnings("deprecation")
public void packPreLoad(ConfigPackPreLoadEvent event) { public void packPreLoad(ConfigPackPreLoadEvent event) {
event.getPack()
.applyLoader(NoiseSeeded.class, new NoiseSamplerBuilderLoader(event.getPack().getRegistry(NoiseProvider.class)));
CheckedRegistry<NoiseProvider> noiseRegistry = event.getPack().getRegistry(NoiseProvider.class); CheckedRegistry<NoiseProvider> noiseRegistry = event.getPack().getRegistry(NoiseProvider.class);
event.getPack()
.applyLoader(NoiseSeeded.class, new NoiseSamplerBuilderLoader(noiseRegistry));
noiseRegistry.registerUnchecked("LINEAR", LinearNormalizerTemplate::new); noiseRegistry.registerUnchecked("LINEAR", LinearNormalizerTemplate::new);
noiseRegistry.registerUnchecked("NORMAL", NormalNormalizerTemplate::new); noiseRegistry.registerUnchecked("NORMAL", NormalNormalizerTemplate::new);
noiseRegistry.registerUnchecked("CLAMP", ClampNormalizerTemplate::new); noiseRegistry.registerUnchecked("CLAMP", ClampNormalizerTemplate::new);
noiseRegistry.registerUnchecked("EXPRESSION", ExpressionFunctionTemplate::new);
noiseRegistry.registerUnchecked("IMAGE", ImageSamplerTemplate::new); noiseRegistry.registerUnchecked("IMAGE", ImageSamplerTemplate::new);
@ -98,5 +97,17 @@ public class NoiseAddon extends TerraAddon implements EventListener {
noiseRegistry.registerUnchecked("CONSTANT", ConstantNoiseTemplate::new); noiseRegistry.registerUnchecked("CONSTANT", ConstantNoiseTemplate::new);
noiseRegistry.registerUnchecked("KERNEL", KernelTemplate::new); noiseRegistry.registerUnchecked("KERNEL", KernelTemplate::new);
Map<String, NoiseSeeded> packFunctions = new HashMap<>();
noiseRegistry.registerUnchecked("EXPRESSION", () -> new ExpressionFunctionTemplate(packFunctions));
try {
NoiseConfigPackTemplate template = new NoiseConfigPackTemplate();
event.loadTemplate(template);
packFunctions.putAll(template.getNoiseBuilderMap());
} catch(ConfigException e) {
throw new RuntimeException(e);
}
} }
} }

View File

@ -0,0 +1,17 @@
package com.dfsek.terra.addons.noise;
import com.dfsek.tectonic.annotations.Value;
import com.dfsek.tectonic.config.ConfigTemplate;
import com.dfsek.terra.api.config.ConfigType;
import com.dfsek.terra.api.util.seeded.NoiseSeeded;
import java.util.Map;
public class NoiseConfigPackTemplate implements ConfigTemplate {
@Value("noise")
private Map<String, NoiseSeeded> noiseBuilderMap;
public Map<String, NoiseSeeded> getNoiseBuilderMap() {
return noiseBuilderMap;
}
}

View File

@ -26,6 +26,9 @@ public class NoiseSamplerBuilderLoader implements TypeLoader<NoiseSeeded> {
public NoiseSeeded load(Type t, Object c, ConfigLoader loader) throws LoadException { public NoiseSeeded load(Type t, Object c, ConfigLoader loader) throws LoadException {
Map<String, Object> map = (Map<String, Object>) c; Map<String, Object> map = (Map<String, Object>) c;
try { try {
if(!noiseRegistry.contains((String) map.get("type"))) {
throw new LoadException("No such noise function: " + map.get("type"));
}
ObjectTemplate<NoiseSeeded> normalizerTemplate = noiseRegistry.get(((String) map.get("type")).toUpperCase(Locale.ROOT)).get(); ObjectTemplate<NoiseSeeded> normalizerTemplate = noiseRegistry.get(((String) map.get("type")).toUpperCase(Locale.ROOT)).get();
loader.load(normalizerTemplate, new Configuration(map)); loader.load(normalizerTemplate, new Configuration(map));
return normalizerTemplate.get(); return normalizerTemplate.get();

View File

@ -39,6 +39,12 @@ public class ExpressionFunctionTemplate extends SamplerTemplate<ExpressionFuncti
@Default @Default
private LinkedHashMap<String, FunctionTemplate> expressions = new LinkedHashMap<>(); private LinkedHashMap<String, FunctionTemplate> expressions = new LinkedHashMap<>();
private final Map<String, NoiseSeeded> otherFunctions;
public ExpressionFunctionTemplate(Map<String, NoiseSeeded> otherFunctions) {
this.otherFunctions = otherFunctions;
}
@Override @Override
public NoiseSampler apply(Long seed) { public NoiseSampler apply(Long seed) {
try { try {
@ -67,6 +73,12 @@ public class ExpressionFunctionTemplate extends SamplerTemplate<ExpressionFuncti
noiseFunctionMap.put(entry.getKey(), UserDefinedFunction.newInstance(entry.getValue(), new Parser(), new Scope())); noiseFunctionMap.put(entry.getKey(), UserDefinedFunction.newInstance(entry.getValue(), new Parser(), new Scope()));
} }
otherFunctions.forEach((id, function) -> {
if(function.getDimensions() == 2) {
noiseFunctionMap.put(id, new NoiseFunction2(function.apply(seed)));
} else noiseFunctionMap.put(id, new NoiseFunction3(function.apply(seed)));
});
functions.forEach((id, function) -> { functions.forEach((id, function) -> {
if(function.getDimensions() == 2) { if(function.getDimensions() == 2) {
noiseFunctionMap.put(id, new NoiseFunction2(function.apply(seed))); noiseFunctionMap.put(id, new NoiseFunction2(function.apply(seed)));

View File

@ -70,9 +70,6 @@ public class ConfigPackImpl implements ConfigPack {
private final RegistryFactory registryFactory = new RegistryFactoryImpl(); private final RegistryFactory registryFactory = new RegistryFactoryImpl();
private final Map<Type, TypeLoader<?>> loaders = new HashMap<>();
private final Map<Type, TemplateProvider<ObjectTemplate<?>>> objectLoaders = new HashMap<>();
private final AbstractConfigLoader abstractConfigLoader = new AbstractConfigLoader(); private final AbstractConfigLoader abstractConfigLoader = new AbstractConfigLoader();
private final ConfigLoader selfLoader = new ConfigLoader(); private final ConfigLoader selfLoader = new ConfigLoader();
private final Scope varScope = new Scope(); private final Scope varScope = new Scope();
@ -184,12 +181,6 @@ public class ConfigPackImpl implements ConfigPack {
toWorldConfig(new TerraWorldImpl(new DummyWorld(), this, main)); // Build now to catch any errors immediately. toWorldConfig(new TerraWorldImpl(new DummyWorld(), this, main)); // Build now to catch any errors immediately.
} }
@SuppressWarnings("unchecked")
private void applyLoaders(TypeRegistry registry) {
loaders.forEach(registry::registerLoader);
objectLoaders.forEach((t, l) -> registry.registerLoader(t, (TemplateProvider<ObjectTemplate<Object>>) ((Object) l)));
}
private Map<Class<?>, ImmutablePair<OpenRegistry<?>, CheckedRegistry<?>>> newRegistryMap() { private Map<Class<?>, ImmutablePair<OpenRegistry<?>, CheckedRegistry<?>>> newRegistryMap() {
Map<Class<?>, ImmutablePair<OpenRegistry<?>, CheckedRegistry<?>>> map = new HashMap<Class<?>, ImmutablePair<OpenRegistry<?>, CheckedRegistry<?>>>() { Map<Class<?>, ImmutablePair<OpenRegistry<?>, CheckedRegistry<?>>> map = new HashMap<Class<?>, ImmutablePair<OpenRegistry<?>, CheckedRegistry<?>>>() {
@Serial @Serial
@ -219,14 +210,15 @@ public class ConfigPackImpl implements ConfigPack {
} }
@Override @Override
public <T> ConfigPackImpl applyLoader(Type type, TypeLoader<T> loader) { public <T> ConfigPackImpl applyLoader(Type type, TypeLoader<T> loader) {
loaders.put(type, loader); abstractConfigLoader.registerLoader(type, loader);
selfLoader.registerLoader(type, loader);
return this; return this;
} }
@SuppressWarnings("unchecked")
@Override @Override
public <T> ConfigPackImpl applyLoader(Type type, TemplateProvider<ObjectTemplate<T>> loader) { public <T> ConfigPackImpl applyLoader(Type type, TemplateProvider<ObjectTemplate<T>> loader) {
objectLoaders.put(type, (TemplateProvider<ObjectTemplate<?>>) ((Object) loader)); abstractConfigLoader.registerLoader(type, loader);
selfLoader.registerLoader(type, loader);
return this; return this;
} }
@ -236,8 +228,6 @@ public class ConfigPackImpl implements ConfigPack {
@SuppressWarnings({"unchecked", "rawtypes"}) @SuppressWarnings({"unchecked", "rawtypes"})
private void load(long start, TerraPlugin main) throws ConfigException { private void load(long start, TerraPlugin main) throws ConfigException {
applyLoaders(abstractConfigLoader);
applyLoaders(selfLoader);
configTypes.values().forEach(list -> list.forEach(pair -> configTypeRegistry.register(pair.getLeft(), pair.getRight()))); configTypes.values().forEach(list -> list.forEach(pair -> configTypeRegistry.register(pair.getLeft(), pair.getRight())));
for(Map.Entry<String, Double> var : template.getVariables().entrySet()) { for(Map.Entry<String, Double> var : template.getVariables().entrySet()) {

View File

@ -16,9 +16,6 @@ public class ConfigPackTemplate implements ConfigTemplate {
@Value("id") @Value("id")
private String id; private String id;
@Value("noise")
private Map<String, NoiseSeeded> noiseBuilderMap;
@Value("addons") @Value("addons")
@Default @Default
private Set<TerraAddon> addons = new HashSet<>(); private Set<TerraAddon> addons = new HashSet<>();
@ -139,10 +136,6 @@ public class ConfigPackTemplate implements ConfigTemplate {
return vanillaStructures; return vanillaStructures;
} }
public Map<String, NoiseSeeded> getNoiseBuilderMap() {
return noiseBuilderMap;
}
public Map<String, Double> getVariables() { public Map<String, Double> getVariables() {
return variables; return variables;
} }