set grass blocks to not snowy when eroding snow
This commit is contained in:
parent
66c2a318cd
commit
5121a235f0
@ -36,7 +36,7 @@ minecraft {
|
|||||||
workingDirectory project.file("run/client")
|
workingDirectory project.file("run/client")
|
||||||
property "forge.logging.markers", "SCAN,REGISTRIES,REGISTRYDUMP"
|
property "forge.logging.markers", "SCAN,REGISTRIES,REGISTRYDUMP"
|
||||||
property "forge.logging.console.level", "debug"
|
property "forge.logging.console.level", "debug"
|
||||||
jvmArgs "-Xmx8G", "-Xms6G", "-Ddev", "-DvanillaBiomes"
|
jvmArgs "-Xmx8G", "-Xms6G", "-Ddev"
|
||||||
mods {
|
mods {
|
||||||
terraforged {
|
terraforged {
|
||||||
source sourceSets.main
|
source sourceSets.main
|
||||||
|
@ -0,0 +1,61 @@
|
|||||||
|
package com.terraforged.mod.biome;
|
||||||
|
|
||||||
|
import com.terraforged.api.biome.BiomeVariant;
|
||||||
|
import net.minecraft.entity.EntityClassification;
|
||||||
|
import net.minecraft.entity.EntityType;
|
||||||
|
import net.minecraft.world.biome.Biome;
|
||||||
|
import net.minecraft.world.biome.Biomes;
|
||||||
|
import net.minecraft.world.biome.DefaultBiomeFeatures;
|
||||||
|
import net.minecraft.world.gen.feature.Feature;
|
||||||
|
import net.minecraft.world.gen.feature.IFeatureConfig;
|
||||||
|
import net.minecraft.world.gen.feature.structure.MineshaftConfig;
|
||||||
|
import net.minecraft.world.gen.feature.structure.MineshaftStructure;
|
||||||
|
import net.minecraft.world.gen.feature.structure.VillageConfig;
|
||||||
|
import net.minecraft.world.gen.surfacebuilders.SurfaceBuilder;
|
||||||
|
|
||||||
|
public class FirForest extends BiomeVariant {
|
||||||
|
|
||||||
|
public FirForest() {
|
||||||
|
super((new Biome.Builder().surfaceBuilder(SurfaceBuilder.GIANT_TREE_TAIGA, SurfaceBuilder.GRASS_DIRT_GRAVEL_CONFIG).precipitation(Biome.RainType.RAIN).category(Biome.Category.TAIGA).depth(0.2F).scale(0.2F).temperature(0.25F).downfall(0.8F).waterColor(4159204).waterFogColor(329011).parent(null)));
|
||||||
|
this.addStructure(Feature.VILLAGE.withConfiguration(new VillageConfig("village/taiga/town_centers", 6)));
|
||||||
|
this.addStructure(Feature.PILLAGER_OUTPOST.withConfiguration(IFeatureConfig.NO_FEATURE_CONFIG));
|
||||||
|
this.addStructure(Feature.MINESHAFT.withConfiguration(new MineshaftConfig(0.004D, MineshaftStructure.Type.NORMAL)));
|
||||||
|
this.addStructure(Feature.STRONGHOLD.withConfiguration(IFeatureConfig.NO_FEATURE_CONFIG));
|
||||||
|
DefaultBiomeFeatures.addCarvers(this);
|
||||||
|
DefaultBiomeFeatures.addStructures(this);
|
||||||
|
DefaultBiomeFeatures.addMonsterRooms(this);
|
||||||
|
DefaultBiomeFeatures.addTaigaLargeFerns(this);
|
||||||
|
DefaultBiomeFeatures.addStoneVariants(this);
|
||||||
|
DefaultBiomeFeatures.addOres(this);
|
||||||
|
DefaultBiomeFeatures.addSedimentDisks(this);
|
||||||
|
DefaultBiomeFeatures.addTaigaConifers(this);
|
||||||
|
DefaultBiomeFeatures.addDefaultFlowers(this);
|
||||||
|
DefaultBiomeFeatures.addTaigaGrassAndMushrooms(this);
|
||||||
|
DefaultBiomeFeatures.addDenseGrass(this);
|
||||||
|
DefaultBiomeFeatures.addReedsAndPumpkins(this);
|
||||||
|
DefaultBiomeFeatures.addBerryBushes(this);
|
||||||
|
DefaultBiomeFeatures.addFreezeTopLayer(this);
|
||||||
|
this.addSpawn(EntityClassification.CREATURE, new Biome.SpawnListEntry(EntityType.SHEEP, 12, 4, 4));
|
||||||
|
this.addSpawn(EntityClassification.CREATURE, new Biome.SpawnListEntry(EntityType.PIG, 10, 4, 4));
|
||||||
|
this.addSpawn(EntityClassification.CREATURE, new Biome.SpawnListEntry(EntityType.CHICKEN, 10, 4, 4));
|
||||||
|
this.addSpawn(EntityClassification.CREATURE, new Biome.SpawnListEntry(EntityType.COW, 8, 4, 4));
|
||||||
|
this.addSpawn(EntityClassification.CREATURE, new Biome.SpawnListEntry(EntityType.WOLF, 8, 4, 4));
|
||||||
|
this.addSpawn(EntityClassification.CREATURE, new Biome.SpawnListEntry(EntityType.RABBIT, 4, 2, 3));
|
||||||
|
this.addSpawn(EntityClassification.CREATURE, new Biome.SpawnListEntry(EntityType.FOX, 8, 2, 4));
|
||||||
|
this.addSpawn(EntityClassification.AMBIENT, new Biome.SpawnListEntry(EntityType.BAT, 10, 8, 8));
|
||||||
|
this.addSpawn(EntityClassification.MONSTER, new Biome.SpawnListEntry(EntityType.SPIDER, 100, 4, 4));
|
||||||
|
this.addSpawn(EntityClassification.MONSTER, new Biome.SpawnListEntry(EntityType.ZOMBIE, 95, 4, 4));
|
||||||
|
this.addSpawn(EntityClassification.MONSTER, new Biome.SpawnListEntry(EntityType.ZOMBIE_VILLAGER, 5, 1, 1));
|
||||||
|
this.addSpawn(EntityClassification.MONSTER, new Biome.SpawnListEntry(EntityType.SKELETON, 100, 4, 4));
|
||||||
|
this.addSpawn(EntityClassification.MONSTER, new Biome.SpawnListEntry(EntityType.CREEPER, 100, 4, 4));
|
||||||
|
this.addSpawn(EntityClassification.MONSTER, new Biome.SpawnListEntry(EntityType.SLIME, 100, 4, 4));
|
||||||
|
this.addSpawn(EntityClassification.MONSTER, new Biome.SpawnListEntry(EntityType.ENDERMAN, 10, 1, 4));
|
||||||
|
this.addSpawn(EntityClassification.MONSTER, new Biome.SpawnListEntry(EntityType.WITCH, 5, 1, 1));
|
||||||
|
this.setRegistryName("terraforged", "fir_forest");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Biome getBase() {
|
||||||
|
return Biomes.TAIGA;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,58 @@
|
|||||||
|
package com.terraforged.mod.biome;
|
||||||
|
|
||||||
|
import com.google.common.collect.ImmutableList;
|
||||||
|
import com.terraforged.api.biome.BiomeVariant;
|
||||||
|
import net.minecraft.entity.EntityClassification;
|
||||||
|
import net.minecraft.entity.EntityType;
|
||||||
|
import net.minecraft.world.biome.Biome;
|
||||||
|
import net.minecraft.world.biome.Biomes;
|
||||||
|
import net.minecraft.world.biome.DefaultBiomeFeatures;
|
||||||
|
import net.minecraft.world.gen.GenerationStage;
|
||||||
|
import net.minecraft.world.gen.feature.Feature;
|
||||||
|
import net.minecraft.world.gen.feature.IFeatureConfig;
|
||||||
|
import net.minecraft.world.gen.feature.MultipleWithChanceRandomFeatureConfig;
|
||||||
|
import net.minecraft.world.gen.feature.structure.MineshaftConfig;
|
||||||
|
import net.minecraft.world.gen.feature.structure.MineshaftStructure;
|
||||||
|
import net.minecraft.world.gen.placement.FrequencyConfig;
|
||||||
|
import net.minecraft.world.gen.placement.Placement;
|
||||||
|
import net.minecraft.world.gen.surfacebuilders.SurfaceBuilder;
|
||||||
|
|
||||||
|
public class FlowerPlains extends BiomeVariant {
|
||||||
|
|
||||||
|
public FlowerPlains() {
|
||||||
|
super((new Biome.Builder()).surfaceBuilder(SurfaceBuilder.DEFAULT, SurfaceBuilder.GRASS_DIRT_GRAVEL_CONFIG).precipitation(Biome.RainType.RAIN).category(Biome.Category.FOREST).depth(0.1F).scale(0.4F).temperature(0.7F).downfall(0.8F).waterColor(4159204).waterFogColor(329011).parent("forest"));
|
||||||
|
this.addStructure(Feature.MINESHAFT.withConfiguration(new MineshaftConfig(0.004D, MineshaftStructure.Type.NORMAL)));
|
||||||
|
this.addStructure(Feature.STRONGHOLD.withConfiguration(IFeatureConfig.NO_FEATURE_CONFIG));
|
||||||
|
DefaultBiomeFeatures.addCarvers(this);
|
||||||
|
DefaultBiomeFeatures.addStructures(this);
|
||||||
|
DefaultBiomeFeatures.addMonsterRooms(this);
|
||||||
|
this.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, Feature.RANDOM_RANDOM_SELECTOR.withConfiguration(new MultipleWithChanceRandomFeatureConfig(ImmutableList.of(Feature.RANDOM_PATCH.withConfiguration(DefaultBiomeFeatures.LILAC_CONFIG), Feature.RANDOM_PATCH.withConfiguration(DefaultBiomeFeatures.ROSE_BUSH_CONFIG), Feature.RANDOM_PATCH.withConfiguration(DefaultBiomeFeatures.PEONY_CONFIG), Feature.FLOWER.withConfiguration(DefaultBiomeFeatures.LILY_OF_THE_VALLEY_CONFIG)), 2)).withPlacement(Placement.COUNT_HEIGHTMAP_32.configure(new FrequencyConfig(5))));
|
||||||
|
DefaultBiomeFeatures.addStoneVariants(this);
|
||||||
|
DefaultBiomeFeatures.addOres(this);
|
||||||
|
this.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, Feature.FLOWER.withConfiguration(DefaultBiomeFeatures.FOREST_FLOWER_CONFIG).withPlacement(Placement.COUNT_HEIGHTMAP_32.configure(new FrequencyConfig(100))));
|
||||||
|
DefaultBiomeFeatures.addSparseGrass(this);
|
||||||
|
DefaultBiomeFeatures.addMushrooms(this);
|
||||||
|
DefaultBiomeFeatures.addReedsAndPumpkins(this);
|
||||||
|
DefaultBiomeFeatures.addFreezeTopLayer(this);
|
||||||
|
this.addSpawn(EntityClassification.CREATURE, new Biome.SpawnListEntry(EntityType.SHEEP, 12, 4, 4));
|
||||||
|
this.addSpawn(EntityClassification.CREATURE, new Biome.SpawnListEntry(EntityType.PIG, 10, 4, 4));
|
||||||
|
this.addSpawn(EntityClassification.CREATURE, new Biome.SpawnListEntry(EntityType.CHICKEN, 10, 4, 4));
|
||||||
|
this.addSpawn(EntityClassification.CREATURE, new Biome.SpawnListEntry(EntityType.COW, 8, 4, 4));
|
||||||
|
this.addSpawn(EntityClassification.CREATURE, new Biome.SpawnListEntry(EntityType.RABBIT, 4, 2, 3));
|
||||||
|
this.addSpawn(EntityClassification.AMBIENT, new Biome.SpawnListEntry(EntityType.BAT, 10, 8, 8));
|
||||||
|
this.addSpawn(EntityClassification.MONSTER, new Biome.SpawnListEntry(EntityType.SPIDER, 100, 4, 4));
|
||||||
|
this.addSpawn(EntityClassification.MONSTER, new Biome.SpawnListEntry(EntityType.ZOMBIE, 95, 4, 4));
|
||||||
|
this.addSpawn(EntityClassification.MONSTER, new Biome.SpawnListEntry(EntityType.ZOMBIE_VILLAGER, 5, 1, 1));
|
||||||
|
this.addSpawn(EntityClassification.MONSTER, new Biome.SpawnListEntry(EntityType.SKELETON, 100, 4, 4));
|
||||||
|
this.addSpawn(EntityClassification.MONSTER, new Biome.SpawnListEntry(EntityType.CREEPER, 100, 4, 4));
|
||||||
|
this.addSpawn(EntityClassification.MONSTER, new Biome.SpawnListEntry(EntityType.SLIME, 100, 4, 4));
|
||||||
|
this.addSpawn(EntityClassification.MONSTER, new Biome.SpawnListEntry(EntityType.ENDERMAN, 10, 1, 4));
|
||||||
|
this.addSpawn(EntityClassification.MONSTER, new Biome.SpawnListEntry(EntityType.WITCH, 5, 1, 1));
|
||||||
|
setRegistryName("terraforged", "flower_plains");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Biome getBase() {
|
||||||
|
return Biomes.FLOWER_FOREST;
|
||||||
|
}
|
||||||
|
}
|
@ -47,6 +47,8 @@ public class ModBiomes {
|
|||||||
public static final Biome TAIGA_SCRUB = register(new TaigaScrub());
|
public static final Biome TAIGA_SCRUB = register(new TaigaScrub());
|
||||||
public static final Biome WARM_BEACH = register(new WarmBeach());
|
public static final Biome WARM_BEACH = register(new WarmBeach());
|
||||||
public static final Biome MARSHLAND = register(new Marshland());
|
public static final Biome MARSHLAND = register(new Marshland());
|
||||||
|
// public static final Biome FIR_FOREST = register(new FirForest());
|
||||||
|
// public static final Biome FLOWER_PLAINS = register(new FlowerPlains());
|
||||||
|
|
||||||
private static Biome register(BiomeVariant biome) {
|
private static Biome register(BiomeVariant biome) {
|
||||||
biomes.add(biome);
|
biomes.add(biome);
|
||||||
@ -59,6 +61,9 @@ public class ModBiomes {
|
|||||||
event.getRegistry().register(biome);
|
event.getRegistry().register(biome);
|
||||||
BiomeDictionary.makeBestGuess(biome);
|
BiomeDictionary.makeBestGuess(biome);
|
||||||
BiomeDictionary.addTypes(biome, BiomeDictionary.Type.OVERWORLD);
|
BiomeDictionary.addTypes(biome, BiomeDictionary.Type.OVERWORLD);
|
||||||
|
if (BiomeDictionary.getTypes(biome.getBase()).contains(BiomeDictionary.Type.RARE)) {
|
||||||
|
BiomeDictionary.addTypes(biome, BiomeDictionary.Type.RARE);
|
||||||
|
}
|
||||||
});
|
});
|
||||||
biomes.clear();
|
biomes.clear();
|
||||||
biomes.trimToSize();
|
biomes.trimToSize();
|
||||||
|
@ -90,7 +90,7 @@ public class BiomeHelper {
|
|||||||
// don't use BiomeDictionary with transient biomes
|
// don't use BiomeDictionary with transient biomes
|
||||||
if (ForgeRegistries.BIOMES.containsKey(biome.getRegistryName())) {
|
if (ForgeRegistries.BIOMES.containsKey(biome.getRegistryName())) {
|
||||||
if (BiomeDictionary.getTypes(biome).contains(BiomeDictionary.Type.RARE)) {
|
if (BiomeDictionary.getTypes(biome).contains(BiomeDictionary.Type.RARE)) {
|
||||||
weight = 2;
|
weight = 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -32,6 +32,8 @@ import com.terraforged.mod.decorator.base.ErosionDecorator;
|
|||||||
import me.dags.noise.source.Rand;
|
import me.dags.noise.source.Rand;
|
||||||
import net.minecraft.block.BlockState;
|
import net.minecraft.block.BlockState;
|
||||||
import net.minecraft.block.Blocks;
|
import net.minecraft.block.Blocks;
|
||||||
|
import net.minecraft.block.GrassBlock;
|
||||||
|
import net.minecraft.util.math.BlockPos;
|
||||||
import net.minecraft.world.chunk.IChunk;
|
import net.minecraft.world.chunk.IChunk;
|
||||||
import net.minecraft.world.gen.Heightmap;
|
import net.minecraft.world.gen.Heightmap;
|
||||||
|
|
||||||
@ -78,7 +80,7 @@ public class SnowEroder extends ErosionDecorator {
|
|||||||
context.pos.setPos(x, y + dy, z);
|
context.pos.setPos(x, y + dy, z);
|
||||||
BlockState state = chunk.getBlockState(context.pos);
|
BlockState state = chunk.getBlockState(context.pos);
|
||||||
if (!predicate.test(state) || state.getBlock() == Blocks.SNOW) {
|
if (!predicate.test(state) || state.getBlock() == Blocks.SNOW) {
|
||||||
chunk.setBlockState(context.pos, Blocks.AIR.getDefaultState(), false);
|
erodeSnow(chunk, context.pos);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -90,4 +92,16 @@ public class SnowEroder extends ErosionDecorator {
|
|||||||
|| (steepness > SNOW_ROCK_STEEPNESS && height > SNOW_ROCK_HEIGHT)
|
|| (steepness > SNOW_ROCK_STEEPNESS && height > SNOW_ROCK_HEIGHT)
|
||||||
|| super.erodeDirt(x, z, steepness, height);
|
|| super.erodeDirt(x, z, steepness, height);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void erodeSnow(IChunk chunk, BlockPos.Mutable pos) {
|
||||||
|
chunk.setBlockState(pos, Blocks.AIR.getDefaultState(), false);
|
||||||
|
|
||||||
|
if (pos.getY() > 0) {
|
||||||
|
pos.setY(pos.getY() - 1);
|
||||||
|
BlockState below = chunk.getBlockState(pos);
|
||||||
|
if (below.has(GrassBlock.SNOWY)) {
|
||||||
|
chunk.setBlockState(pos, below.with(GrassBlock.SNOWY, false), false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -14,34 +14,38 @@ import net.minecraft.world.gen.WorldGenRegion;
|
|||||||
|
|
||||||
public class BiomeVariance implements Module {
|
public class BiomeVariance implements Module {
|
||||||
|
|
||||||
private final ChunkReader chunk;
|
public static float MIN_FADE = 0.05F;
|
||||||
|
|
||||||
public BiomeVariance(ChunkReader chunk) {
|
private final ChunkReader chunk;
|
||||||
|
private final float fade;
|
||||||
|
private final float range;
|
||||||
|
|
||||||
|
public BiomeVariance(ChunkReader chunk, float fade) {
|
||||||
this.chunk = chunk;
|
this.chunk = chunk;
|
||||||
|
this.fade = fade;
|
||||||
|
this.range = fade - MIN_FADE;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public float getValue(float x, float y) {
|
public float getValue(float x, float y) {
|
||||||
int dx = ((int) x) & 15;
|
Cell<?> cell = chunk.getCell((int) x, (int) y);
|
||||||
int dz = ((int) y) & 15;
|
return NoiseUtil.map(1 - cell.biomeEdge, MIN_FADE, fade, range);
|
||||||
Cell<?> cell = chunk.getCell(dx, dz);
|
|
||||||
return NoiseUtil.map(1 - cell.biomeEdge, 0.05F, 0.25F, 0.2F);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static Module of(IWorld world) {
|
public static Module of(IWorld world, float fade) {
|
||||||
if (world instanceof RegionDelegate) {
|
if (world instanceof RegionDelegate) {
|
||||||
WorldGenRegion region = ((RegionDelegate) world).getRegion();
|
WorldGenRegion region = ((RegionDelegate) world).getRegion();
|
||||||
IChunk chunk = region.getChunk(region.getMainChunkX(), region.getMainChunkZ());
|
IChunk chunk = region.getChunk(region.getMainChunkX(), region.getMainChunkZ());
|
||||||
return of(chunk);
|
return of(chunk, fade);
|
||||||
}
|
}
|
||||||
return Source.ONE;
|
return Source.ONE;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static Module of(IChunk chunk) {
|
public static Module of(IChunk chunk, float fade) {
|
||||||
BiomeContainer container = chunk.getBiomes();
|
BiomeContainer container = chunk.getBiomes();
|
||||||
if (container instanceof TerraContainer) {
|
if (container instanceof TerraContainer) {
|
||||||
ChunkReader reader = ((TerraContainer) container).getChunkReader();
|
ChunkReader reader = ((TerraContainer) container).getChunkReader();
|
||||||
return new BiomeVariance(reader);
|
return new BiomeVariance(reader, fade);
|
||||||
}
|
}
|
||||||
return Source.ONE;
|
return Source.ONE;
|
||||||
}
|
}
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
package com.terraforged.mod.feature.decorator.poisson;
|
package com.terraforged.mod.feature.decorator.poisson;
|
||||||
|
|
||||||
import com.terraforged.core.util.concurrent.ObjectPool;
|
import com.terraforged.core.util.concurrent.ObjectPool;
|
||||||
|
import me.dags.noise.Source;
|
||||||
import me.dags.noise.util.NoiseUtil;
|
import me.dags.noise.util.NoiseUtil;
|
||||||
import me.dags.noise.util.Vec2f;
|
import me.dags.noise.util.Vec2f;
|
||||||
|
|
||||||
@ -17,6 +18,7 @@ public class Poisson {
|
|||||||
|
|
||||||
private final int radius;
|
private final int radius;
|
||||||
private final int radius2;
|
private final int radius2;
|
||||||
|
private final float halfRadius;
|
||||||
private final int maxDistance;
|
private final int maxDistance;
|
||||||
private final int regionSize;
|
private final int regionSize;
|
||||||
private final int gridSize;
|
private final int gridSize;
|
||||||
@ -27,14 +29,18 @@ public class Poisson {
|
|||||||
int size = 48;
|
int size = 48;
|
||||||
this.radius = radius;
|
this.radius = radius;
|
||||||
this.radius2 = radius * radius;
|
this.radius2 = radius * radius;
|
||||||
int halfRadius = radius / 2;
|
this.halfRadius = radius / 2F;
|
||||||
this.maxDistance = radius * 2;
|
this.maxDistance = radius * 2;
|
||||||
this.regionSize = size - halfRadius;
|
this.regionSize = size - radius;
|
||||||
this.cellSize = radius / NoiseUtil.SQRT2;
|
this.cellSize = radius / NoiseUtil.SQRT2;
|
||||||
this.gridSize = (int) Math.ceil(regionSize / cellSize);
|
this.gridSize = (int) Math.ceil(regionSize / cellSize);
|
||||||
this.pool = new ObjectPool<>(3, () -> new Vec2f[gridSize][gridSize]);
|
this.pool = new ObjectPool<>(3, () -> new Vec2f[gridSize][gridSize]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public int getRadius() {
|
||||||
|
return radius;
|
||||||
|
}
|
||||||
|
|
||||||
public void visit(int chunkX, int chunkZ, PoissonContext context, BiConsumer<Integer, Integer> consumer) {
|
public void visit(int chunkX, int chunkZ, PoissonContext context, BiConsumer<Integer, Integer> consumer) {
|
||||||
try (ObjectPool.Item<Vec2f[][]> grid = pool.get()) {
|
try (ObjectPool.Item<Vec2f[][]> grid = pool.get()) {
|
||||||
clear(grid.getValue());
|
clear(grid.getValue());
|
||||||
@ -57,8 +63,8 @@ public class Poisson {
|
|||||||
for (int i = 0; i < samples; i++) {
|
for (int i = 0; i < samples; i++) {
|
||||||
float angle = context.random.nextFloat() * NoiseUtil.PI2;
|
float angle = context.random.nextFloat() * NoiseUtil.PI2;
|
||||||
float distance = radius + (context.random.nextFloat() * maxDistance);
|
float distance = radius + (context.random.nextFloat() * maxDistance);
|
||||||
float x = px + NoiseUtil.sin(angle) * distance;
|
float x = halfRadius + px + NoiseUtil.sin(angle) * distance;
|
||||||
float z = pz + NoiseUtil.cos(angle) * distance;
|
float z = halfRadius + pz + NoiseUtil.cos(angle) * distance;
|
||||||
if (valid(x, z, grid, context)) {
|
if (valid(x, z, grid, context)) {
|
||||||
Vec2f vec = new Vec2f(x, z);
|
Vec2f vec = new Vec2f(x, z);
|
||||||
visit(vec, context, consumer);
|
visit(vec, context, consumer);
|
||||||
@ -122,7 +128,7 @@ public class Poisson {
|
|||||||
|
|
||||||
public static void main(String[] args) {
|
public static void main(String[] args) {
|
||||||
int size = 512;
|
int size = 512;
|
||||||
int radius = 10;
|
int radius = 6;
|
||||||
|
|
||||||
int chunkSize = 16;
|
int chunkSize = 16;
|
||||||
int chunks = size / chunkSize;
|
int chunks = size / chunkSize;
|
||||||
@ -130,13 +136,19 @@ public class Poisson {
|
|||||||
BufferedImage image = new BufferedImage(size, size, BufferedImage.TYPE_INT_RGB);
|
BufferedImage image = new BufferedImage(size, size, BufferedImage.TYPE_INT_RGB);
|
||||||
Poisson poisson = new Poisson(radius);
|
Poisson poisson = new Poisson(radius);
|
||||||
PoissonContext context = new PoissonContext(213, new Random());
|
PoissonContext context = new PoissonContext(213, new Random());
|
||||||
|
context.density = Source.simplex(213, 100, 1).scale(2).bias(0);
|
||||||
|
|
||||||
long time = 0L;
|
long time = 0L;
|
||||||
long count = 0L;
|
long count = 0L;
|
||||||
|
|
||||||
|
int chunkX = 342;
|
||||||
|
int chunkZ = 546;
|
||||||
for (int cz = 0; cz < chunks; cz++) {
|
for (int cz = 0; cz < chunks; cz++) {
|
||||||
for (int cx = 0; cx < chunks; cx++) {
|
for (int cx = 0; cx < chunks; cx++) {
|
||||||
long start = System.nanoTime();
|
long start = System.nanoTime();
|
||||||
poisson.visit(cx, cz, context, (x, z) -> {
|
poisson.visit(chunkX + cx, chunkZ + cz, context, (x, z) -> {
|
||||||
|
x -= chunkX << 4;
|
||||||
|
z -= chunkZ << 4;
|
||||||
if (x < 0 || x >= image.getWidth() || z < 0 || z >= image.getHeight()) {
|
if (x < 0 || x >= image.getWidth() || z < 0 || z >= image.getHeight()) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -147,8 +159,8 @@ public class Poisson {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
double avg = (double) time / count;
|
double avg = (double) (time / count) / 1000000;
|
||||||
System.out.println(avg + "ns");
|
System.out.println(avg + "ms");
|
||||||
|
|
||||||
JFrame frame = new JFrame();
|
JFrame frame = new JFrame();
|
||||||
frame.add(new JLabel(new ImageIcon(image)));
|
frame.add(new JLabel(new ImageIcon(image)));
|
||||||
|
@ -8,11 +8,17 @@ import net.minecraft.world.gen.placement.IPlacementConfig;
|
|||||||
public class PoissonConfig implements IPlacementConfig {
|
public class PoissonConfig implements IPlacementConfig {
|
||||||
|
|
||||||
public final int radius;
|
public final int radius;
|
||||||
|
public final float biomeFade;
|
||||||
public final int variance;
|
public final int variance;
|
||||||
|
public final float min;
|
||||||
|
public final float max;
|
||||||
|
|
||||||
public PoissonConfig(int radius, int variance) {
|
public PoissonConfig(int radius, float biomeFade, int variance, float min, float max) {
|
||||||
this.radius = radius;
|
this.radius = radius;
|
||||||
|
this.biomeFade = biomeFade;
|
||||||
this.variance = variance;
|
this.variance = variance;
|
||||||
|
this.min = min;
|
||||||
|
this.max = max;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -20,14 +26,20 @@ public class PoissonConfig implements IPlacementConfig {
|
|||||||
return new Dynamic<>(ops, ops.createMap(
|
return new Dynamic<>(ops, ops.createMap(
|
||||||
ImmutableMap.of(
|
ImmutableMap.of(
|
||||||
ops.createString("radius"), ops.createInt(radius),
|
ops.createString("radius"), ops.createInt(radius),
|
||||||
ops.createString("variance_scale"), ops.createInt(variance)
|
ops.createString("fade"), ops.createFloat(biomeFade),
|
||||||
|
ops.createString("scale"), ops.createInt(variance),
|
||||||
|
ops.createString("min"), ops.createFloat(min),
|
||||||
|
ops.createString("max"), ops.createFloat(max)
|
||||||
))
|
))
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static PoissonConfig deserialize(Dynamic<?> dynamic) {
|
public static PoissonConfig deserialize(Dynamic<?> dynamic) {
|
||||||
int radius = dynamic.get("radius").asInt(4);
|
int radius = dynamic.get("radius").asInt(4);
|
||||||
int variance = dynamic.get("variance_scale").asInt(0);
|
float biomeFade = dynamic.get("fade").asFloat(0.2F);
|
||||||
return new PoissonConfig(radius, variance);
|
int variance = dynamic.get("scale").asInt(0);
|
||||||
|
float min = dynamic.get("min").asFloat(0F);
|
||||||
|
float max = dynamic.get("max").asFloat(1F);
|
||||||
|
return new PoissonConfig(radius, biomeFade, variance, min, max);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -25,7 +25,7 @@ public abstract class PoissonDecorator extends Placement<PoissonConfig> {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public final <FC extends IFeatureConfig, F extends Feature<FC>> boolean place(IWorld world, ChunkGenerator<?> generator, Random random, BlockPos pos, PoissonConfig config, ConfiguredFeature<FC, F> feature) {
|
public final <FC extends IFeatureConfig, F extends Feature<FC>> boolean place(IWorld world, ChunkGenerator<?> generator, Random random, BlockPos pos, PoissonConfig config, ConfiguredFeature<FC, F> feature) {
|
||||||
int radius = Math.max(2, Math.min(30, config.radius));
|
int radius = Math.max(1, Math.min(30, config.radius));
|
||||||
Poisson poisson = getInstance(radius);
|
Poisson poisson = getInstance(radius);
|
||||||
PoissonVisitor visitor = new PoissonVisitor(this, feature, world, generator, random, pos);
|
PoissonVisitor visitor = new PoissonVisitor(this, feature, world, generator, random, pos);
|
||||||
setVariance(world, visitor, config);
|
setVariance(world, visitor, config);
|
||||||
@ -44,7 +44,7 @@ public abstract class PoissonDecorator extends Placement<PoissonConfig> {
|
|||||||
|
|
||||||
private Poisson getInstance(int radius) {
|
private Poisson getInstance(int radius) {
|
||||||
synchronized (lock) {
|
synchronized (lock) {
|
||||||
if (instance == null) {
|
if (instance == null || instance.getRadius() != radius) {
|
||||||
instance = new Poisson(radius);
|
instance = new Poisson(radius);
|
||||||
}
|
}
|
||||||
return instance;
|
return instance;
|
||||||
@ -52,13 +52,18 @@ public abstract class PoissonDecorator extends Placement<PoissonConfig> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private void setVariance(IWorld world, PoissonContext context, PoissonConfig config) {
|
private void setVariance(IWorld world, PoissonContext context, PoissonConfig config) {
|
||||||
Module module = BiomeVariance.of(world);
|
Module module = Source.ONE;
|
||||||
if (module != Source.ONE) {
|
|
||||||
if (config.variance > 0) {
|
if (config.biomeFade > 0.075F) {
|
||||||
Module variance = Source.simplex((int) world.getSeed(), config.variance, 1).scale(1.5);
|
module = BiomeVariance.of(world, config.biomeFade);
|
||||||
module = module.mult(variance);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (config.variance > 0) {
|
||||||
|
module = module.mult(Source.simplex(context.seed, config.variance, 1)
|
||||||
|
.scale(config.max - config.min)
|
||||||
|
.bias(config.min));
|
||||||
|
}
|
||||||
|
|
||||||
context.density = module;
|
context.density = module;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
Loading…
Reference in New Issue
Block a user