diff --git a/src/main/java/ru/betterend/integration/byg/biomes/EterialGrove.java b/src/main/java/ru/betterend/integration/byg/biomes/EterialGrove.java index 55f4df4d..cec4f4c5 100644 --- a/src/main/java/ru/betterend/integration/byg/biomes/EterialGrove.java +++ b/src/main/java/ru/betterend/integration/byg/biomes/EterialGrove.java @@ -10,8 +10,8 @@ import net.minecraft.world.biome.SpawnSettings.SpawnEntry; import ru.betterend.BetterEnd; import ru.betterend.integration.Integrations; import ru.betterend.integration.byg.features.BYGFeatures; +import ru.betterend.world.biome.BiomeDefinition; import ru.betterend.world.biome.EndBiome; -import ru.betterend.world.biome.land.BiomeDefinition; public class EterialGrove extends EndBiome { public EterialGrove() { diff --git a/src/main/java/ru/betterend/integration/byg/biomes/NightshadeRedwoods.java b/src/main/java/ru/betterend/integration/byg/biomes/NightshadeRedwoods.java index b2bf0654..525b433a 100644 --- a/src/main/java/ru/betterend/integration/byg/biomes/NightshadeRedwoods.java +++ b/src/main/java/ru/betterend/integration/byg/biomes/NightshadeRedwoods.java @@ -13,8 +13,8 @@ import ru.betterend.BetterEnd; import ru.betterend.integration.Integrations; import ru.betterend.integration.byg.features.BYGFeatures; import ru.betterend.registry.EndFeatures; +import ru.betterend.world.biome.BiomeDefinition; import ru.betterend.world.biome.EndBiome; -import ru.betterend.world.biome.land.BiomeDefinition; public class NightshadeRedwoods extends EndBiome { public NightshadeRedwoods() { diff --git a/src/main/java/ru/betterend/integration/byg/biomes/OldBulbisGardens.java b/src/main/java/ru/betterend/integration/byg/biomes/OldBulbisGardens.java index da349ef9..ec711c80 100644 --- a/src/main/java/ru/betterend/integration/byg/biomes/OldBulbisGardens.java +++ b/src/main/java/ru/betterend/integration/byg/biomes/OldBulbisGardens.java @@ -20,8 +20,8 @@ import ru.betterend.BetterEnd; import ru.betterend.integration.Integrations; import ru.betterend.integration.byg.features.BYGFeatures; import ru.betterend.registry.EndFeatures; +import ru.betterend.world.biome.BiomeDefinition; import ru.betterend.world.biome.EndBiome; -import ru.betterend.world.biome.land.BiomeDefinition; public class OldBulbisGardens extends EndBiome { public OldBulbisGardens() { diff --git a/src/main/java/ru/betterend/mixin/common/NoiseChunkGeneratorMixin.java b/src/main/java/ru/betterend/mixin/common/NoiseChunkGeneratorMixin.java index a41e262b..50b859ab 100644 --- a/src/main/java/ru/betterend/mixin/common/NoiseChunkGeneratorMixin.java +++ b/src/main/java/ru/betterend/mixin/common/NoiseChunkGeneratorMixin.java @@ -10,17 +10,23 @@ import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import net.minecraft.world.biome.source.BiomeSource; +import net.minecraft.world.gen.chunk.ChunkGenerator; import net.minecraft.world.gen.chunk.ChunkGeneratorSettings; import net.minecraft.world.gen.chunk.NoiseChunkGenerator; +import net.minecraft.world.gen.chunk.StructuresConfig; import ru.betterend.world.generator.GeneratorOptions; import ru.betterend.world.generator.TerrainGenerator; @Mixin(NoiseChunkGenerator.class) -public abstract class NoiseChunkGeneratorMixin { +public abstract class NoiseChunkGeneratorMixin extends ChunkGenerator { @Final @Shadow protected Supplier settings; + public NoiseChunkGeneratorMixin(BiomeSource populationSource, BiomeSource biomeSource, StructuresConfig structuresConfig, long worldSeed) { + super(populationSource, biomeSource, structuresConfig, worldSeed); + } + @Inject(method = "(Lnet/minecraft/world/biome/source/BiomeSource;Lnet/minecraft/world/biome/source/BiomeSource;JLjava/util/function/Supplier;)V", at = @At("TAIL")) private void beOnInit(BiomeSource populationSource, BiomeSource biomeSource, long seed, Supplier settings, CallbackInfo info) { TerrainGenerator.initNoise(seed); @@ -30,7 +36,7 @@ public abstract class NoiseChunkGeneratorMixin { private void beSampleNoiseColumn(double[] buffer, int x, int z, CallbackInfo info) { if (GeneratorOptions.useNewGenerator() && settings.get().equals(ChunkGeneratorSettings.END)) { if (TerrainGenerator.canGenerate(x, z)) { - TerrainGenerator.fillTerrainDensity(buffer, x, z); + TerrainGenerator.fillTerrainDensity(buffer, x, z, getBiomeSource()); info.cancel(); } } diff --git a/src/main/java/ru/betterend/registry/EndBiomes.java b/src/main/java/ru/betterend/registry/EndBiomes.java index c32494ad..3bf04bb4 100644 --- a/src/main/java/ru/betterend/registry/EndBiomes.java +++ b/src/main/java/ru/betterend/registry/EndBiomes.java @@ -287,8 +287,8 @@ public class EndBiomes { * @return registered {@link EndBiome} */ public static EndBiome registerSubBiome(EndBiome biome, EndBiome parent) { - registerBiomeDirectly(biome); if (Configs.BIOME_CONFIG.getBoolean(biome.getID(), "enabled", true)) { + registerBiomeDirectly(biome); parent.addSubBiome(biome); SUBBIOMES.add(biome); SUBBIOMES_UNMUTABLES.add(biome.getID()); @@ -305,8 +305,8 @@ public class EndBiomes { * @return registered {@link EndBiome} */ public static EndBiome registerBiome(EndBiome biome, BiomeType type) { - registerBiomeDirectly(biome); if (Configs.BIOME_CONFIG.getBoolean(biome.getID(), "enabled", true)) { + registerBiomeDirectly(biome); addToPicker(biome, type); ID_MAP.put(biome.getID(), biome); if (type == BiomeType.LAND) { @@ -325,8 +325,8 @@ public class EndBiomes { * @return registered {@link EndBiome} */ public static EndBiome registerSubBiomeIntegration(EndBiome biome) { - registerBiomeDirectly(biome); if (Configs.BIOME_CONFIG.getBoolean(biome.getID(), "enabled", true)) { + registerBiomeDirectly(biome); SUBBIOMES.add(biome); SUBBIOMES_UNMUTABLES.add(biome.getID()); ID_MAP.put(biome.getID(), biome); @@ -367,9 +367,7 @@ public class EndBiomes { } private static void registerBiomeDirectly(EndBiome biome) { - if (Configs.BIOME_CONFIG.getBoolean(biome.getID(), "enabled", true)) { - Registry.register(BuiltinRegistries.BIOME, biome.getID(), biome.getBiome()); - } + Registry.register(BuiltinRegistries.BIOME, biome.getID(), biome.getBiome()); } private static void addLandBiomeToFabricApi(EndBiome biome) { @@ -420,8 +418,8 @@ public class EndBiomes { } public static EndCaveBiome registerCaveBiome(EndCaveBiome biome) { - registerBiomeDirectly(biome); if (Configs.BIOME_CONFIG.getBoolean(biome.getID(), "enabled", true)) { + registerBiomeDirectly(biome); CAVE_BIOMES.addBiome(biome); ID_MAP.put(biome.getID(), biome); } diff --git a/src/main/java/ru/betterend/registry/EndFeatures.java b/src/main/java/ru/betterend/registry/EndFeatures.java index 5adb90c9..ac5616d2 100644 --- a/src/main/java/ru/betterend/registry/EndFeatures.java +++ b/src/main/java/ru/betterend/registry/EndFeatures.java @@ -11,8 +11,8 @@ import net.minecraft.world.biome.Biome; import net.minecraft.world.gen.GenerationStep; import net.minecraft.world.gen.feature.ConfiguredFeature; import ru.betterend.BetterEnd; +import ru.betterend.world.biome.BiomeDefinition; import ru.betterend.world.biome.EndBiome; -import ru.betterend.world.biome.land.BiomeDefinition; import ru.betterend.world.features.BlueVineFeature; import ru.betterend.world.features.CavePumpkinFeature; import ru.betterend.world.features.CharniaFeature; diff --git a/src/main/java/ru/betterend/util/sdf/operator/SDFRadialNoiseMap.java b/src/main/java/ru/betterend/util/sdf/operator/SDFRadialNoiseMap.java new file mode 100644 index 00000000..eeeb6918 --- /dev/null +++ b/src/main/java/ru/betterend/util/sdf/operator/SDFRadialNoiseMap.java @@ -0,0 +1,60 @@ +package ru.betterend.util.sdf.operator; + +import net.minecraft.util.math.MathHelper; +import ru.betterend.noise.OpenSimplexNoise; +import ru.betterend.util.MHelper; + +public class SDFRadialNoiseMap extends SDFDisplacement { + private static final float SIN = MathHelper.sin(0.5F); + private static final float COS = MathHelper.cos(0.5F); + + private OpenSimplexNoise noise; + private float intensity = 1F; + private float radius = 1F; + private short offsetX; + private short offsetZ; + + public SDFRadialNoiseMap() { + setFunction((pos) -> { + if (intensity == 0) { + return 0F; + } + float px = pos.getX() / radius; + float pz = pos.getZ() / radius; + float distance = MHelper.lengthSqr(px, pz); + if (distance > 1) { + return 0F; + } + distance = 1 - MathHelper.sqrt(distance); + float nx = px * COS - pz * SIN; + float nz = pz * COS + px * SIN; + distance *= getNoise(nx * 0.75 + offsetX, nz * 0.75 + offsetZ); + return distance * intensity; + }); + } + + private float getNoise(double x, double z) { + return (float) noise.eval(x, z) + (float) noise.eval(x * 3 + 1000, z * 3) * 0.5F + (float) noise.eval(x * 9 + 1000, z * 9) * 0.2F; + } + + public SDFRadialNoiseMap setSeed(long seed) { + noise = new OpenSimplexNoise(seed); + return this; + } + + public SDFRadialNoiseMap setIntensity(float intensity) { + this.intensity = intensity; + return this; + } + + public SDFRadialNoiseMap setRadius(float radius) { + this.radius = radius; + return this; + } + + public SDFRadialNoiseMap setOffset(int x, int z) { + offsetX = (short) (x & 32767); + offsetZ = (short) (z & 32767); + return this; + } +} diff --git a/src/main/java/ru/betterend/world/biome/land/BiomeDefinition.java b/src/main/java/ru/betterend/world/biome/BiomeDefinition.java similarity index 95% rename from src/main/java/ru/betterend/world/biome/land/BiomeDefinition.java rename to src/main/java/ru/betterend/world/biome/BiomeDefinition.java index 378b1902..49475736 100644 --- a/src/main/java/ru/betterend/world/biome/land/BiomeDefinition.java +++ b/src/main/java/ru/betterend/world/biome/BiomeDefinition.java @@ -1,4 +1,4 @@ -package ru.betterend.world.biome.land; +package ru.betterend.world.biome; import java.util.List; @@ -63,6 +63,7 @@ public class BiomeDefinition { private int foliageColor = DEF_FOLIAGE; private int grassColor = DEF_FOLIAGE; private float fogDensity = 1F; + private float depth = 0.1F; private final Identifier id; private float genChance = 1F; @@ -112,6 +113,11 @@ public class BiomeDefinition { this.genChance = genChance; return this; } + + public BiomeDefinition setDepth(float depth) { + this.depth = depth; + return this; + } public BiomeDefinition addMobSpawn(EntityType type, int weight, int minGroupSize, int maxGroupSize) { Identifier eID = Registry.ENTITY_TYPE.getId(type); @@ -256,7 +262,7 @@ public class BiomeDefinition { return new Biome.Builder() .precipitation(Precipitation.NONE) .category(isCaveBiome ? Category.NONE : Category.THEEND) - .depth(0.1F) + .depth(depth) .scale(0.2F) .temperature(2.0F) .downfall(0.0F) diff --git a/src/main/java/ru/betterend/world/biome/EndBiome.java b/src/main/java/ru/betterend/world/biome/EndBiome.java index 81a25b3f..7b1a5f02 100644 --- a/src/main/java/ru/betterend/world/biome/EndBiome.java +++ b/src/main/java/ru/betterend/world/biome/EndBiome.java @@ -14,7 +14,6 @@ import net.minecraft.world.biome.Biome; import ru.betterend.config.Configs; import ru.betterend.util.JsonFactory; import ru.betterend.util.StructureHelper; -import ru.betterend.world.biome.land.BiomeDefinition; import ru.betterend.world.features.EndFeature; import ru.betterend.world.features.ListFeature; import ru.betterend.world.features.ListFeature.StructureInfo; diff --git a/src/main/java/ru/betterend/world/biome/air/BiomeIceStarfield.java b/src/main/java/ru/betterend/world/biome/air/BiomeIceStarfield.java index b1106d6f..a9b42808 100644 --- a/src/main/java/ru/betterend/world/biome/air/BiomeIceStarfield.java +++ b/src/main/java/ru/betterend/world/biome/air/BiomeIceStarfield.java @@ -4,8 +4,8 @@ import net.minecraft.entity.EntityType; import ru.betterend.registry.EndFeatures; import ru.betterend.registry.EndParticles; import ru.betterend.registry.EndStructures; +import ru.betterend.world.biome.BiomeDefinition; import ru.betterend.world.biome.EndBiome; -import ru.betterend.world.biome.land.BiomeDefinition; public class BiomeIceStarfield extends EndBiome { public BiomeIceStarfield() { diff --git a/src/main/java/ru/betterend/world/biome/cave/EmptyAuroraCaveBiome.java b/src/main/java/ru/betterend/world/biome/cave/EmptyAuroraCaveBiome.java index 2966bcca..93fb0624 100644 --- a/src/main/java/ru/betterend/world/biome/cave/EmptyAuroraCaveBiome.java +++ b/src/main/java/ru/betterend/world/biome/cave/EmptyAuroraCaveBiome.java @@ -3,7 +3,7 @@ package ru.betterend.world.biome.cave; import ru.betterend.registry.EndFeatures; import ru.betterend.registry.EndParticles; import ru.betterend.registry.EndSounds; -import ru.betterend.world.biome.land.BiomeDefinition; +import ru.betterend.world.biome.BiomeDefinition; public class EmptyAuroraCaveBiome extends EndCaveBiome { public EmptyAuroraCaveBiome() { diff --git a/src/main/java/ru/betterend/world/biome/cave/EmptyEndCaveBiome.java b/src/main/java/ru/betterend/world/biome/cave/EmptyEndCaveBiome.java index 9c5be371..4976fed1 100644 --- a/src/main/java/ru/betterend/world/biome/cave/EmptyEndCaveBiome.java +++ b/src/main/java/ru/betterend/world/biome/cave/EmptyEndCaveBiome.java @@ -2,7 +2,7 @@ package ru.betterend.world.biome.cave; import ru.betterend.registry.EndFeatures; import ru.betterend.registry.EndSounds; -import ru.betterend.world.biome.land.BiomeDefinition; +import ru.betterend.world.biome.BiomeDefinition; public class EmptyEndCaveBiome extends EndCaveBiome { public EmptyEndCaveBiome() { diff --git a/src/main/java/ru/betterend/world/biome/cave/EmptySmaragdantCaveBiome.java b/src/main/java/ru/betterend/world/biome/cave/EmptySmaragdantCaveBiome.java index bf73fbeb..ed5ed762 100644 --- a/src/main/java/ru/betterend/world/biome/cave/EmptySmaragdantCaveBiome.java +++ b/src/main/java/ru/betterend/world/biome/cave/EmptySmaragdantCaveBiome.java @@ -3,7 +3,7 @@ package ru.betterend.world.biome.cave; import ru.betterend.registry.EndFeatures; import ru.betterend.registry.EndParticles; import ru.betterend.registry.EndSounds; -import ru.betterend.world.biome.land.BiomeDefinition; +import ru.betterend.world.biome.BiomeDefinition; public class EmptySmaragdantCaveBiome extends EndCaveBiome { public EmptySmaragdantCaveBiome() { diff --git a/src/main/java/ru/betterend/world/biome/cave/EndCaveBiome.java b/src/main/java/ru/betterend/world/biome/cave/EndCaveBiome.java index 5ae1d3c2..dd2cab46 100644 --- a/src/main/java/ru/betterend/world/biome/cave/EndCaveBiome.java +++ b/src/main/java/ru/betterend/world/biome/cave/EndCaveBiome.java @@ -7,8 +7,8 @@ import net.minecraft.util.collection.WeightedList; import net.minecraft.util.math.BlockPos; import net.minecraft.world.gen.feature.Feature; import ru.betterend.registry.EndBiomes; +import ru.betterend.world.biome.BiomeDefinition; import ru.betterend.world.biome.EndBiome; -import ru.betterend.world.biome.land.BiomeDefinition; import ru.betterend.world.features.EndFeature; import ru.betterend.world.features.terrain.caves.CaveChunkPopulatorFeature; diff --git a/src/main/java/ru/betterend/world/biome/cave/LushAuroraCaveBiome.java b/src/main/java/ru/betterend/world/biome/cave/LushAuroraCaveBiome.java index d6052b44..4271d50a 100644 --- a/src/main/java/ru/betterend/world/biome/cave/LushAuroraCaveBiome.java +++ b/src/main/java/ru/betterend/world/biome/cave/LushAuroraCaveBiome.java @@ -8,7 +8,7 @@ import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndFeatures; import ru.betterend.registry.EndParticles; import ru.betterend.registry.EndSounds; -import ru.betterend.world.biome.land.BiomeDefinition; +import ru.betterend.world.biome.BiomeDefinition; public class LushAuroraCaveBiome extends EndCaveBiome { public LushAuroraCaveBiome() { diff --git a/src/main/java/ru/betterend/world/biome/cave/LushSmaragdantCaveBiome.java b/src/main/java/ru/betterend/world/biome/cave/LushSmaragdantCaveBiome.java index c821f6a5..c9a40749 100644 --- a/src/main/java/ru/betterend/world/biome/cave/LushSmaragdantCaveBiome.java +++ b/src/main/java/ru/betterend/world/biome/cave/LushSmaragdantCaveBiome.java @@ -4,7 +4,7 @@ import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndFeatures; import ru.betterend.registry.EndParticles; import ru.betterend.registry.EndSounds; -import ru.betterend.world.biome.land.BiomeDefinition; +import ru.betterend.world.biome.BiomeDefinition; public class LushSmaragdantCaveBiome extends EndCaveBiome { public LushSmaragdantCaveBiome() { diff --git a/src/main/java/ru/betterend/world/biome/land/AmberLandBiome.java b/src/main/java/ru/betterend/world/biome/land/AmberLandBiome.java index e6ac94c1..768ba362 100644 --- a/src/main/java/ru/betterend/world/biome/land/AmberLandBiome.java +++ b/src/main/java/ru/betterend/world/biome/land/AmberLandBiome.java @@ -7,6 +7,7 @@ import ru.betterend.registry.EndEntities; import ru.betterend.registry.EndFeatures; import ru.betterend.registry.EndParticles; import ru.betterend.registry.EndSounds; +import ru.betterend.world.biome.BiomeDefinition; import ru.betterend.world.biome.EndBiome; public class AmberLandBiome extends EndBiome { diff --git a/src/main/java/ru/betterend/world/biome/land/BlossomingSpiresBiome.java b/src/main/java/ru/betterend/world/biome/land/BlossomingSpiresBiome.java index dcbf2f7b..92c95867 100644 --- a/src/main/java/ru/betterend/world/biome/land/BlossomingSpiresBiome.java +++ b/src/main/java/ru/betterend/world/biome/land/BlossomingSpiresBiome.java @@ -5,6 +5,7 @@ import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndEntities; import ru.betterend.registry.EndFeatures; import ru.betterend.registry.EndSounds; +import ru.betterend.world.biome.BiomeDefinition; import ru.betterend.world.biome.EndBiome; public class BlossomingSpiresBiome extends EndBiome { diff --git a/src/main/java/ru/betterend/world/biome/land/ChorusForestBiome.java b/src/main/java/ru/betterend/world/biome/land/ChorusForestBiome.java index 8535aa3c..fb55b03a 100644 --- a/src/main/java/ru/betterend/world/biome/land/ChorusForestBiome.java +++ b/src/main/java/ru/betterend/world/biome/land/ChorusForestBiome.java @@ -9,6 +9,7 @@ import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndEntities; import ru.betterend.registry.EndFeatures; import ru.betterend.registry.EndSounds; +import ru.betterend.world.biome.BiomeDefinition; import ru.betterend.world.biome.EndBiome; public class ChorusForestBiome extends EndBiome { diff --git a/src/main/java/ru/betterend/world/biome/land/CrystalMountainsBiome.java b/src/main/java/ru/betterend/world/biome/land/CrystalMountainsBiome.java index 3275fc28..d5c1d1d6 100644 --- a/src/main/java/ru/betterend/world/biome/land/CrystalMountainsBiome.java +++ b/src/main/java/ru/betterend/world/biome/land/CrystalMountainsBiome.java @@ -5,6 +5,7 @@ import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndFeatures; import ru.betterend.registry.EndSounds; import ru.betterend.registry.EndStructures; +import ru.betterend.world.biome.BiomeDefinition; import ru.betterend.world.biome.EndBiome; public class CrystalMountainsBiome extends EndBiome { diff --git a/src/main/java/ru/betterend/world/biome/land/DragonGraveyardsBiome.java b/src/main/java/ru/betterend/world/biome/land/DragonGraveyardsBiome.java index 822c43cf..a0f5f500 100644 --- a/src/main/java/ru/betterend/world/biome/land/DragonGraveyardsBiome.java +++ b/src/main/java/ru/betterend/world/biome/land/DragonGraveyardsBiome.java @@ -5,6 +5,7 @@ import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndFeatures; import ru.betterend.registry.EndParticles; import ru.betterend.registry.EndSounds; +import ru.betterend.world.biome.BiomeDefinition; import ru.betterend.world.biome.EndBiome; public class DragonGraveyardsBiome extends EndBiome { diff --git a/src/main/java/ru/betterend/world/biome/land/DryShrublandBiome.java b/src/main/java/ru/betterend/world/biome/land/DryShrublandBiome.java index dabd1e95..97715260 100644 --- a/src/main/java/ru/betterend/world/biome/land/DryShrublandBiome.java +++ b/src/main/java/ru/betterend/world/biome/land/DryShrublandBiome.java @@ -5,6 +5,7 @@ import net.minecraft.world.gen.feature.ConfiguredStructureFeatures; import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndFeatures; import ru.betterend.registry.EndSounds; +import ru.betterend.world.biome.BiomeDefinition; import ru.betterend.world.biome.EndBiome; public class DryShrublandBiome extends EndBiome { diff --git a/src/main/java/ru/betterend/world/biome/land/DustWastelandsBiome.java b/src/main/java/ru/betterend/world/biome/land/DustWastelandsBiome.java index 50d3b5f9..8e26f57a 100644 --- a/src/main/java/ru/betterend/world/biome/land/DustWastelandsBiome.java +++ b/src/main/java/ru/betterend/world/biome/land/DustWastelandsBiome.java @@ -5,6 +5,7 @@ import net.minecraft.particle.ParticleTypes; import net.minecraft.world.gen.feature.ConfiguredStructureFeatures; import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndSounds; +import ru.betterend.world.biome.BiomeDefinition; import ru.betterend.world.biome.EndBiome; public class DustWastelandsBiome extends EndBiome { diff --git a/src/main/java/ru/betterend/world/biome/land/FoggyMushroomlandBiome.java b/src/main/java/ru/betterend/world/biome/land/FoggyMushroomlandBiome.java index 1240a138..76f2623c 100644 --- a/src/main/java/ru/betterend/world/biome/land/FoggyMushroomlandBiome.java +++ b/src/main/java/ru/betterend/world/biome/land/FoggyMushroomlandBiome.java @@ -8,6 +8,7 @@ import ru.betterend.registry.EndFeatures; import ru.betterend.registry.EndParticles; import ru.betterend.registry.EndSounds; import ru.betterend.registry.EndStructures; +import ru.betterend.world.biome.BiomeDefinition; import ru.betterend.world.biome.EndBiome; public class FoggyMushroomlandBiome extends EndBiome { diff --git a/src/main/java/ru/betterend/world/biome/land/GlowingGrasslandsBiome.java b/src/main/java/ru/betterend/world/biome/land/GlowingGrasslandsBiome.java index a4849806..df39d84a 100644 --- a/src/main/java/ru/betterend/world/biome/land/GlowingGrasslandsBiome.java +++ b/src/main/java/ru/betterend/world/biome/land/GlowingGrasslandsBiome.java @@ -6,6 +6,7 @@ import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndFeatures; import ru.betterend.registry.EndParticles; import ru.betterend.registry.EndSounds; +import ru.betterend.world.biome.BiomeDefinition; import ru.betterend.world.biome.EndBiome; public class GlowingGrasslandsBiome extends EndBiome { diff --git a/src/main/java/ru/betterend/world/biome/land/LanternWoodsBiome.java b/src/main/java/ru/betterend/world/biome/land/LanternWoodsBiome.java index 333dbd86..cad741a0 100644 --- a/src/main/java/ru/betterend/world/biome/land/LanternWoodsBiome.java +++ b/src/main/java/ru/betterend/world/biome/land/LanternWoodsBiome.java @@ -6,6 +6,7 @@ import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndFeatures; import ru.betterend.registry.EndParticles; import ru.betterend.registry.EndSounds; +import ru.betterend.world.biome.BiomeDefinition; import ru.betterend.world.biome.EndBiome; public class LanternWoodsBiome extends EndBiome { diff --git a/src/main/java/ru/betterend/world/biome/land/MegalakeBiome.java b/src/main/java/ru/betterend/world/biome/land/MegalakeBiome.java index 53921f95..4c275a1b 100644 --- a/src/main/java/ru/betterend/world/biome/land/MegalakeBiome.java +++ b/src/main/java/ru/betterend/world/biome/land/MegalakeBiome.java @@ -6,6 +6,7 @@ import ru.betterend.registry.EndEntities; import ru.betterend.registry.EndFeatures; import ru.betterend.registry.EndSounds; import ru.betterend.registry.EndStructures; +import ru.betterend.world.biome.BiomeDefinition; import ru.betterend.world.biome.EndBiome; public class MegalakeBiome extends EndBiome { @@ -18,6 +19,7 @@ public class MegalakeBiome extends EndBiome { .setMusic(EndSounds.MUSIC_WATER) .setLoop(EndSounds.AMBIENT_MEGALAKE) .setSurface(EndBlocks.END_MOSS, EndBlocks.ENDSTONE_DUST) + .setDepth(0F) .addStructureFeature(EndStructures.MEGALAKE) .addFeature(EndFeatures.END_LOTUS) .addFeature(EndFeatures.END_LOTUS_LEAF) diff --git a/src/main/java/ru/betterend/world/biome/land/MegalakeGroveBiome.java b/src/main/java/ru/betterend/world/biome/land/MegalakeGroveBiome.java index 19889a67..2ff13bbf 100644 --- a/src/main/java/ru/betterend/world/biome/land/MegalakeGroveBiome.java +++ b/src/main/java/ru/betterend/world/biome/land/MegalakeGroveBiome.java @@ -7,6 +7,7 @@ import ru.betterend.registry.EndFeatures; import ru.betterend.registry.EndParticles; import ru.betterend.registry.EndSounds; import ru.betterend.registry.EndStructures; +import ru.betterend.world.biome.BiomeDefinition; import ru.betterend.world.biome.EndBiome; public class MegalakeGroveBiome extends EndBiome { @@ -20,6 +21,7 @@ public class MegalakeGroveBiome extends EndBiome { .setMusic(EndSounds.MUSIC_WATER) .setLoop(EndSounds.AMBIENT_MEGALAKE_GROVE) .setSurface(EndBlocks.END_MOSS) + .setDepth(0F) .addStructureFeature(EndStructures.MEGALAKE_SMALL) .addFeature(EndFeatures.LACUGROVE) .addFeature(EndFeatures.END_LOTUS) diff --git a/src/main/java/ru/betterend/world/biome/land/NeonOasisBiome.java b/src/main/java/ru/betterend/world/biome/land/NeonOasisBiome.java index 0b896855..bc49f6f8 100644 --- a/src/main/java/ru/betterend/world/biome/land/NeonOasisBiome.java +++ b/src/main/java/ru/betterend/world/biome/land/NeonOasisBiome.java @@ -6,6 +6,7 @@ import net.minecraft.world.gen.feature.ConfiguredStructureFeatures; import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndFeatures; import ru.betterend.registry.EndSounds; +import ru.betterend.world.biome.BiomeDefinition; import ru.betterend.world.biome.EndBiome; public class NeonOasisBiome extends EndBiome { diff --git a/src/main/java/ru/betterend/world/biome/land/PaintedMountainsBiome.java b/src/main/java/ru/betterend/world/biome/land/PaintedMountainsBiome.java index c4552613..a25f388e 100644 --- a/src/main/java/ru/betterend/world/biome/land/PaintedMountainsBiome.java +++ b/src/main/java/ru/betterend/world/biome/land/PaintedMountainsBiome.java @@ -5,6 +5,7 @@ import net.minecraft.particle.ParticleTypes; import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndSounds; import ru.betterend.registry.EndStructures; +import ru.betterend.world.biome.BiomeDefinition; import ru.betterend.world.biome.EndBiome; public class PaintedMountainsBiome extends EndBiome { diff --git a/src/main/java/ru/betterend/world/biome/land/ShadowForestBiome.java b/src/main/java/ru/betterend/world/biome/land/ShadowForestBiome.java index 8196e40f..ba4e7bed 100644 --- a/src/main/java/ru/betterend/world/biome/land/ShadowForestBiome.java +++ b/src/main/java/ru/betterend/world/biome/land/ShadowForestBiome.java @@ -7,6 +7,7 @@ import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndEntities; import ru.betterend.registry.EndFeatures; import ru.betterend.registry.EndSounds; +import ru.betterend.world.biome.BiomeDefinition; import ru.betterend.world.biome.EndBiome; public class ShadowForestBiome extends EndBiome { diff --git a/src/main/java/ru/betterend/world/biome/land/SulphurSpringsBiome.java b/src/main/java/ru/betterend/world/biome/land/SulphurSpringsBiome.java index eb274769..12888729 100644 --- a/src/main/java/ru/betterend/world/biome/land/SulphurSpringsBiome.java +++ b/src/main/java/ru/betterend/world/biome/land/SulphurSpringsBiome.java @@ -5,6 +5,7 @@ import ru.betterend.registry.EndEntities; import ru.betterend.registry.EndFeatures; import ru.betterend.registry.EndParticles; import ru.betterend.registry.EndSounds; +import ru.betterend.world.biome.BiomeDefinition; import ru.betterend.world.biome.EndBiome; import ru.betterend.world.surface.SurfaceBuilders; @@ -19,6 +20,7 @@ public class SulphurSpringsBiome extends EndBiome { .setFogColor(207, 194, 62) .setFogDensity(1.5F) .setCaves(false) + .setDepth(0F) .setParticles(EndParticles.SULPHUR_PARTICLE, 0.001F) .addFeature(EndFeatures.GEYSER) .addFeature(EndFeatures.SURFACE_VENT) diff --git a/src/main/java/ru/betterend/world/biome/land/UmbrellaJungleBiome.java b/src/main/java/ru/betterend/world/biome/land/UmbrellaJungleBiome.java index f4a07e03..e14e62cd 100644 --- a/src/main/java/ru/betterend/world/biome/land/UmbrellaJungleBiome.java +++ b/src/main/java/ru/betterend/world/biome/land/UmbrellaJungleBiome.java @@ -6,6 +6,7 @@ import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndFeatures; import ru.betterend.registry.EndParticles; import ru.betterend.registry.EndSounds; +import ru.betterend.world.biome.BiomeDefinition; import ru.betterend.world.biome.EndBiome; public class UmbrellaJungleBiome extends EndBiome { diff --git a/src/main/java/ru/betterend/world/generator/BetterEndBiomeSource.java b/src/main/java/ru/betterend/world/generator/BetterEndBiomeSource.java index 503ab264..2c808ebe 100644 --- a/src/main/java/ru/betterend/world/generator/BetterEndBiomeSource.java +++ b/src/main/java/ru/betterend/world/generator/BetterEndBiomeSource.java @@ -108,6 +108,24 @@ public class BetterEndBiomeSource extends BiomeSource { return endBiome.getActualBiome(); } } + + public Biome getLandBiome(int biomeX, int biomeY, int biomeZ) { + boolean hasVoid = !GeneratorOptions.useNewGenerator() || !GeneratorOptions.noRingVoid(); + long i = (long) biomeX * (long) biomeX; + long j = (long) biomeZ * (long) biomeZ; + + long dist = i + j; + if (hasVoid) { + if (dist <= 65536L) return this.centerBiome; + } + else if (dist <= 625L) { + dist += noise.sample(i * 0.2, j * 0.2) * 10; + if (dist <= 625L) { + return this.centerBiome; + } + } + return mapLand.getBiome(biomeX << 2, biomeZ << 2).getActualBiome(); + } @Override public BiomeSource withSeed(long seed) { diff --git a/src/main/java/ru/betterend/world/generator/IslandLayer.java b/src/main/java/ru/betterend/world/generator/IslandLayer.java index bd08ff1c..26858fe9 100644 --- a/src/main/java/ru/betterend/world/generator/IslandLayer.java +++ b/src/main/java/ru/betterend/world/generator/IslandLayer.java @@ -1,7 +1,5 @@ package ru.betterend.world.generator; -import java.io.IOException; -import java.io.InputStream; import java.util.ArrayList; import java.util.List; import java.util.Map; @@ -10,13 +8,11 @@ import java.util.Random; import com.google.common.collect.Lists; import com.google.common.collect.Maps; -import net.minecraft.client.texture.NativeImage; import net.minecraft.util.math.BlockPos; -import ru.betterend.BetterEnd; import ru.betterend.noise.OpenSimplexNoise; import ru.betterend.util.MHelper; import ru.betterend.util.sdf.SDF; -import ru.betterend.util.sdf.operator.SDFHeightmap; +import ru.betterend.util.sdf.operator.SDFRadialNoiseMap; import ru.betterend.util.sdf.operator.SDFScale; import ru.betterend.util.sdf.operator.SDFSmoothUnion; import ru.betterend.util.sdf.operator.SDFTranslate; @@ -24,7 +20,8 @@ import ru.betterend.util.sdf.primitive.SDFCappedCone; public class IslandLayer { private static final Random RANDOM = new Random(); - private static final SDF[] ISLAND; + private final SDFRadialNoiseMap noise; + private final SDF island; private final List positions = new ArrayList(9); private final Map islands = Maps.newHashMap(); @@ -38,6 +35,16 @@ public class IslandLayer { this.density = new OpenSimplexNoise(seed); this.options = options; this.seed = seed; + + SDF cone1 = makeCone(0, 0.4F, 0.2F, -0.3F); + SDF cone2 = makeCone(0.4F, 0.5F, 0.1F, -0.1F); + SDF cone3 = makeCone(0.5F, 0.45F, 0.03F, 0.0F); + SDF cone4 = makeCone(0.45F, 0, 0.02F, 0.03F); + + SDF coneBottom = new SDFSmoothUnion().setRadius(0.02F).setSourceA(cone1).setSourceB(cone2); + SDF coneTop = new SDFSmoothUnion().setRadius(0.02F).setSourceA(cone3).setSourceB(cone4); + noise = (SDFRadialNoiseMap) new SDFRadialNoiseMap().setSeed(seed).setRadius(0.5F).setIntensity(0.2F).setSource(coneTop); + island = new SDFSmoothUnion().setRadius(0.01F).setSourceA(noise).setSourceB(coneBottom); } private int getSeed(int x, int z) { @@ -47,7 +54,6 @@ public class IslandLayer { } public void updatePositions(double x, double z) { - int ix = MHelper.floor(x / options.distance); int iz = MHelper.floor(z / options.distance); @@ -91,14 +97,15 @@ public class IslandLayer { SDF island = islands.get(pos); if (island == null) { if (pos.getX() == 0 && pos.getZ() == 0) { - island = new SDFScale().setScale(1.3F).setSource(ISLAND[0]); + island = new SDFScale().setScale(1.3F).setSource(this.island); } else { RANDOM.setSeed(getSeed(pos.getX(), pos.getZ())); - island = new SDFScale().setScale(RANDOM.nextFloat() + 0.5F).setSource(ISLAND[0]); + island = new SDFScale().setScale(RANDOM.nextFloat() + 0.5F).setSource(this.island); } islands.put(pos, island); } + noise.setOffset(pos.getX(), pos.getZ()); return island; } @@ -123,6 +130,12 @@ public class IslandLayer { return -calculateSDF(x, y, z); } + public float getDensity(double x, double y, double z, float height) { + noise.setIntensity(height); + noise.setRadius(0.5F / (1 + height)); + return -calculateSDF(x, y, z); + } + public void clearCache() { if (islands.size() > 128) { islands.clear(); @@ -135,7 +148,7 @@ public class IslandLayer { return new SDFTranslate().setTranslate(0, minY + hh, 0).setSource(sdf); } - private static NativeImage loadMap(String path) { + /*private static NativeImage loadMap(String path) { InputStream stream = IslandLayer.class.getResourceAsStream(path); if (stream != null) { try { @@ -148,9 +161,9 @@ public class IslandLayer { } } return null; - } + }*/ - static { + /*static { NativeImage map = loadMap("/assets/" + BetterEnd.MOD_ID + "/textures/heightmaps/mountain_1.png"); SDF cone1 = makeCone(0, 0.4F, 0.2F, -0.3F); @@ -162,10 +175,11 @@ public class IslandLayer { SDF coneTop = new SDFSmoothUnion().setRadius(0.02F).setSourceA(cone3).setSourceB(cone4); SDF map1 = new SDFHeightmap().setMap(map).setIntensity(0.3F).setSource(coneTop); + NOISE = (SDFRadialNoiseMap) new SDFRadialNoiseMap().setSource(coneTop); ISLAND = new SDF[] { new SDFSmoothUnion().setRadius(0.01F).setSourceA(coneTop).setSourceB(coneBottom), new SDFSmoothUnion().setRadius(0.01F).setSourceA(map1).setSourceB(coneBottom) }; - } + }*/ } diff --git a/src/main/java/ru/betterend/world/generator/TerrainGenerator.java b/src/main/java/ru/betterend/world/generator/TerrainGenerator.java index 6c72f3cf..39ff228f 100644 --- a/src/main/java/ru/betterend/world/generator/TerrainGenerator.java +++ b/src/main/java/ru/betterend/world/generator/TerrainGenerator.java @@ -1,9 +1,15 @@ package ru.betterend.world.generator; +import java.awt.Point; +import java.util.List; import java.util.Random; import java.util.concurrent.locks.ReentrantLock; +import com.google.common.collect.Lists; + import net.minecraft.util.math.MathHelper; +import net.minecraft.world.biome.Biome; +import net.minecraft.world.biome.source.BiomeSource; import ru.betterend.noise.OpenSimplexNoise; import ru.betterend.util.MHelper; @@ -11,7 +17,8 @@ public class TerrainGenerator { private static final ReentrantLock LOCKER = new ReentrantLock(); private static final double SCALE_XZ = 8.0; private static final double SCALE_Y = 4.0; - //private static final int CENTER = MHelper.floor(500 / SCALE_XZ); + private static final float[] COEF; + private static final Point[] OFFS; private static IslandLayer largeIslands; private static IslandLayer mediumIslands; @@ -32,7 +39,7 @@ public class TerrainGenerator { noise2 = new OpenSimplexNoise(random.nextInt()); } - public static void fillTerrainDensity(double[] buffer, int x, int z) { + public static void fillTerrainDensity(double[] buffer, int x, int z, BiomeSource biomeSource) { LOCKER.lock(); largeIslands.clearCache(); @@ -48,11 +55,13 @@ public class TerrainGenerator { mediumIslands.updatePositions(px, pz); smallIslands.updatePositions(px, pz); + float height = getAverageDepth(biomeSource, x << 1, z << 1) * 0.5F; + for (int y = 0; y < buffer.length; y++) { double py = (double) y * SCALE_Y; - float dist = largeIslands.getDensity(px, py, pz); - dist = dist > 1 ? dist : MHelper.max(dist, mediumIslands.getDensity(px, py, pz)); - dist = dist > 1 ? dist : MHelper.max(dist, smallIslands.getDensity(px, py, pz)); + float dist = largeIslands.getDensity(px, py, pz, height); + dist = dist > 1 ? dist : MHelper.max(dist, mediumIslands.getDensity(px, py, pz, height)); + dist = dist > 1 ? dist : MHelper.max(dist, smallIslands.getDensity(px, py, pz, height)); if (dist > -0.5F) { dist += noise1.eval(px * 0.01, py * 0.01, pz * 0.01) * 0.02 + 0.02; dist += noise2.eval(px * 0.05, py * 0.05, pz * 0.05) * 0.01 + 0.01; @@ -64,6 +73,26 @@ public class TerrainGenerator { LOCKER.unlock(); } + private static float getAverageDepth(BiomeSource biomeSource, int x, int z) { + if (getBiome(biomeSource, x, z).getDepth() < 0.1F) { + return 0F; + } + float depth = 0F; + for (int i = 0; i < OFFS.length; i++) { + int px = x + OFFS[i].x; + int pz = z + OFFS[i].y; + depth += getBiome(biomeSource, px, pz).getDepth() * COEF[i]; + } + return depth; + } + + private static Biome getBiome(BiomeSource biomeSource, int x, int z) { + if (biomeSource instanceof BetterEndBiomeSource) { + return ((BetterEndBiomeSource) biomeSource).getLandBiome(x, 0, z); + } + return biomeSource.getBiomeForNoiseGen(x, 0, z); + } + /** * Check if this is land * @param x - biome pos x @@ -143,4 +172,25 @@ public class TerrainGenerator { LOCKER.unlock(); return 0; } + + static { + float sum = 0; + List coef = Lists.newArrayList(); + List pos = Lists.newArrayList(); + for (int x = -3; x <= 3; x++) { + for (int z = -3; z <= 3; z++) { + float dist = MHelper.length(x, z) / 3F; + if (dist <= 1) { + sum += dist; + coef.add(dist); + pos.add(new Point(x, z)); + } + } + } + OFFS = pos.toArray(new Point[] {}); + COEF = new float[coef.size()]; + for (int i = 0; i < COEF.length; i++) { + COEF[i] = coef.get(i) / sum; + } + } }