mirror of
https://github.com/PolyhedralDev/Terra.git
synced 2025-07-03 08:25:31 +00:00
noise function flora and tree dist
This commit is contained in:
parent
c59ab5d917
commit
5c469ed378
@ -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));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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++;
|
||||||
}
|
}
|
||||||
|
@ -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)));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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);
|
||||||
}
|
}
|
||||||
|
@ -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()));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user