noise function flora and tree dist

This commit is contained in:
dfsek 2021-01-11 17:07:25 -07:00
parent c59ab5d917
commit 5c469ed378
7 changed files with 38 additions and 28 deletions

View File

@ -1,5 +1,6 @@
package com.dfsek.terra.config.loaders.config; package com.dfsek.terra.config.loaders.config;
import com.dfsek.tectonic.exception.ConfigException;
import com.dfsek.tectonic.exception.LoadException; import com.dfsek.tectonic.exception.LoadException;
import com.dfsek.tectonic.loading.ConfigLoader; import com.dfsek.tectonic.loading.ConfigLoader;
import com.dfsek.tectonic.loading.TypeLoader; import com.dfsek.tectonic.loading.TypeLoader;
@ -8,6 +9,7 @@ import com.dfsek.terra.api.math.Range;
import com.dfsek.terra.api.math.noise.samplers.FastNoiseLite; import com.dfsek.terra.api.math.noise.samplers.FastNoiseLite;
import com.dfsek.terra.api.world.flora.Flora; import com.dfsek.terra.api.world.flora.Flora;
import com.dfsek.terra.config.loaders.Types; import com.dfsek.terra.config.loaders.Types;
import com.dfsek.terra.generation.config.NoiseBuilder;
import com.dfsek.terra.population.items.flora.FloraLayer; import com.dfsek.terra.population.items.flora.FloraLayer;
import java.lang.reflect.Type; import java.lang.reflect.Type;
@ -23,12 +25,19 @@ public class FloraLayerLoader implements TypeLoader<FloraLayer> {
if(range == null) throw new LoadException("Flora range unspecified"); if(range == null) throw new LoadException("Flora range unspecified");
ProbabilityCollection<Flora> items = (ProbabilityCollection<Flora>) configLoader.loadType(Types.FLORA_PROBABILITY_COLLECTION_TYPE, map.get("items")); ProbabilityCollection<Flora> items = (ProbabilityCollection<Flora>) configLoader.loadType(Types.FLORA_PROBABILITY_COLLECTION_TYPE, map.get("items"));
if(map.containsKey("simplex-frequency")) { NoiseBuilder sampler;
FastNoiseLite noiseLite = new FastNoiseLite(); if(map.containsKey("distribution")) {
noiseLite.setFrequency((Double) map.get("simplex-frequency")); try {
return new FloraLayer(density, range, items, noiseLite); sampler = new NoiseBuilderLoader().load(NoiseBuilder.class, map.get("distribution"), configLoader);
} catch(ConfigException e) {
throw new LoadException("Unable to load noise", e);
} }
return new FloraLayer(density, range, items, sampler.build(2403));
}
sampler = new NoiseBuilder();
sampler.setType(FastNoiseLite.NoiseType.WhiteNoise);
sampler.setDimensions(3);
return new FloraLayer(density, range, items, null); return new FloraLayer(density, range, items, sampler.build(2403));
} }
} }

View File

@ -1,5 +1,7 @@
package com.dfsek.terra.config.loaders.config; package com.dfsek.terra.config.loaders.config;
import com.dfsek.tectonic.config.Configuration;
import com.dfsek.tectonic.exception.ConfigException;
import com.dfsek.tectonic.exception.LoadException; import com.dfsek.tectonic.exception.LoadException;
import com.dfsek.tectonic.loading.ConfigLoader; import com.dfsek.tectonic.loading.ConfigLoader;
import com.dfsek.tectonic.loading.TypeLoader; import com.dfsek.tectonic.loading.TypeLoader;
@ -8,6 +10,7 @@ import com.dfsek.terra.api.math.Range;
import com.dfsek.terra.api.math.noise.samplers.FastNoiseLite; import com.dfsek.terra.api.math.noise.samplers.FastNoiseLite;
import com.dfsek.terra.api.world.tree.Tree; import com.dfsek.terra.api.world.tree.Tree;
import com.dfsek.terra.config.loaders.Types; import com.dfsek.terra.config.loaders.Types;
import com.dfsek.terra.generation.config.NoiseBuilder;
import com.dfsek.terra.population.items.tree.TreeLayer; import com.dfsek.terra.population.items.tree.TreeLayer;
import java.lang.reflect.Type; import java.lang.reflect.Type;
@ -15,10 +18,6 @@ import java.util.Map;
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
public class TreeLayerLoader implements TypeLoader<TreeLayer> { public class TreeLayerLoader implements TypeLoader<TreeLayer> {
public TreeLayerLoader() {
}
@Override @Override
public TreeLayer load(Type type, Object o, ConfigLoader configLoader) throws LoadException { public TreeLayer load(Type type, Object o, ConfigLoader configLoader) throws LoadException {
Map<String, Object> map = (Map<String, Object>) o; Map<String, Object> map = (Map<String, Object>) o;
@ -27,12 +26,19 @@ public class TreeLayerLoader implements TypeLoader<TreeLayer> {
if(range == null) throw new LoadException("Tree range unspecified"); if(range == null) throw new LoadException("Tree range unspecified");
ProbabilityCollection<Tree> items = (ProbabilityCollection<Tree>) configLoader.loadType(Types.TREE_PROBABILITY_COLLECTION_TYPE, map.get("items")); ProbabilityCollection<Tree> items = (ProbabilityCollection<Tree>) configLoader.loadType(Types.TREE_PROBABILITY_COLLECTION_TYPE, map.get("items"));
if(map.containsKey("simplex-frequency")) { NoiseBuilder sampler = new NoiseBuilder();
FastNoiseLite noiseLite = new FastNoiseLite(); if(map.containsKey("distribution")) {
noiseLite.setFrequency((Double) map.get("simplex-frequency")); try {
return new TreeLayer(density, range, items, noiseLite); configLoader.load(sampler, new Configuration((Map<String, Object>) map.get("distribution")));
} catch(ConfigException e) {
throw new LoadException("Unable to load noise", e);
}
return new TreeLayer(density, range, items, sampler.build(2403));
} }
return new TreeLayer(density, range, items, null); sampler.setType(FastNoiseLite.NoiseType.WhiteNoise);
sampler.setDimensions(3);
return new TreeLayer(density, range, items, sampler.build(2403));
} }
} }

View File

@ -55,7 +55,7 @@ public class FloraPopulator implements TerraBlockPopulator {
if(entry.getValue().size() <= iter) continue; if(entry.getValue().size() <= iter) continue;
finished = false; finished = false;
FloraLayer layer = entry.getValue().get(iter); FloraLayer layer = entry.getValue().get(iter);
if(layer.getDensity() >= random.nextDouble() * 100D) layer.place(chunk, entry.getKey(), random); if(layer.getDensity() >= random.nextDouble() * 100D) layer.place(chunk, entry.getKey());
} }
iter++; iter++;
} }

View File

@ -42,7 +42,7 @@ public class TreePopulator implements TerraBlockPopulator {
UserDefinedBiome biome = (UserDefinedBiome) grid.getBiome((chunk.getX() << 4) + x, (chunk.getZ() << 4) + z, GenerationPhase.POPULATE); UserDefinedBiome biome = (UserDefinedBiome) grid.getBiome((chunk.getX() << 4) + x, (chunk.getZ() << 4) + z, GenerationPhase.POPULATE);
for(TreeLayer layer : biome.getConfig().getTrees()) { for(TreeLayer layer : biome.getConfig().getTrees()) {
if(layer.getDensity() >= random.nextDouble() * 100) if(layer.getDensity() >= random.nextDouble() * 100)
layer.place(chunk, new Vector2(offset(random, x), offset(random, z)), random); layer.place(chunk, new Vector2(offset(random, x), offset(random, z)));
} }
} }
} }

View File

@ -6,8 +6,6 @@ import com.dfsek.terra.api.math.noise.samplers.NoiseSampler;
import com.dfsek.terra.api.math.vector.Vector2; import com.dfsek.terra.api.math.vector.Vector2;
import com.dfsek.terra.api.platform.world.Chunk; import com.dfsek.terra.api.platform.world.Chunk;
import java.util.Random;
public abstract class PlaceableLayer<T> { public abstract class PlaceableLayer<T> {
protected final double density; protected final double density;
protected final Range level; protected final Range level;
@ -37,5 +35,5 @@ public abstract class PlaceableLayer<T> {
return layer; return layer;
} }
public abstract void place(Chunk chunk, Vector2 coords, Random random); public abstract void place(Chunk chunk, Vector2 coords);
} }

View File

@ -8,8 +8,6 @@ import com.dfsek.terra.api.platform.world.Chunk;
import com.dfsek.terra.api.world.flora.Flora; import com.dfsek.terra.api.world.flora.Flora;
import com.dfsek.terra.population.items.PlaceableLayer; import com.dfsek.terra.population.items.PlaceableLayer;
import java.util.Random;
public class FloraLayer extends PlaceableLayer<Flora> { public class FloraLayer extends PlaceableLayer<Flora> {
public FloraLayer(double density, Range level, ProbabilityCollection<Flora> layer, NoiseSampler noise) { public FloraLayer(double density, Range level, ProbabilityCollection<Flora> layer, NoiseSampler noise) {
@ -21,8 +19,8 @@ public class FloraLayer extends PlaceableLayer<Flora> {
} }
@Override @Override
public void place(Chunk chunk, Vector2 coords, Random random) { public void place(Chunk chunk, Vector2 coords) {
Flora item = noise == null ? layer.get(random) : layer.get(noise, (chunk.getX() << 4) + coords.getX(), (chunk.getZ() << 4) + coords.getZ()); Flora item = layer.get(noise, (chunk.getX() << 4) + coords.getX(), (chunk.getZ() << 4) + coords.getZ());
item.getValidSpawnsAt(chunk, (int) coords.getX(), (int) coords.getZ(), level).forEach(block -> item.plant(block.getLocation())); item.getValidSpawnsAt(chunk, (int) coords.getX(), (int) coords.getZ(), level).forEach(block -> item.plant(block.getLocation()));
} }
} }

View File

@ -9,8 +9,7 @@ import com.dfsek.terra.api.platform.block.BlockFace;
import com.dfsek.terra.api.platform.world.Chunk; import com.dfsek.terra.api.platform.world.Chunk;
import com.dfsek.terra.api.world.tree.Tree; import com.dfsek.terra.api.world.tree.Tree;
import com.dfsek.terra.population.items.PlaceableLayer; import com.dfsek.terra.population.items.PlaceableLayer;
import com.dfsek.terra.util.PopulationUtil;
import java.util.Random;
public class TreeLayer extends PlaceableLayer<Tree> { public class TreeLayer extends PlaceableLayer<Tree> {
@ -19,13 +18,13 @@ public class TreeLayer extends PlaceableLayer<Tree> {
} }
@Override @Override
public void place(Chunk chunk, Vector2 coords, Random random) { public void place(Chunk chunk, Vector2 coords) {
Tree item = layer.get(random); Tree item = layer.get(noise, coords.getX(), coords.getZ());
Block current = chunk.getBlock((int) coords.getX(), level.getMax(), (int) coords.getZ()); Block current = chunk.getBlock((int) coords.getX(), level.getMax(), (int) coords.getZ());
for(int ignored : level) { for(int ignored : level) {
current = current.getRelative(BlockFace.DOWN); current = current.getRelative(BlockFace.DOWN);
if(item.getSpawnable().contains(current.getType())) { if(item.getSpawnable().contains(current.getType())) {
item.plant(current.getLocation().add(0, 1, 0), random); item.plant(current.getLocation().add(0, 1, 0), PopulationUtil.getRandom(chunk));
} }
} }
} }