Biome height support
This commit is contained in:
parent
21358808e4
commit
cee5c914f9
36 changed files with 212 additions and 41 deletions
|
@ -10,8 +10,8 @@ import net.minecraft.world.biome.SpawnSettings.SpawnEntry;
|
||||||
import ru.betterend.BetterEnd;
|
import ru.betterend.BetterEnd;
|
||||||
import ru.betterend.integration.Integrations;
|
import ru.betterend.integration.Integrations;
|
||||||
import ru.betterend.integration.byg.features.BYGFeatures;
|
import ru.betterend.integration.byg.features.BYGFeatures;
|
||||||
|
import ru.betterend.world.biome.BiomeDefinition;
|
||||||
import ru.betterend.world.biome.EndBiome;
|
import ru.betterend.world.biome.EndBiome;
|
||||||
import ru.betterend.world.biome.land.BiomeDefinition;
|
|
||||||
|
|
||||||
public class EterialGrove extends EndBiome {
|
public class EterialGrove extends EndBiome {
|
||||||
public EterialGrove() {
|
public EterialGrove() {
|
||||||
|
|
|
@ -13,8 +13,8 @@ import ru.betterend.BetterEnd;
|
||||||
import ru.betterend.integration.Integrations;
|
import ru.betterend.integration.Integrations;
|
||||||
import ru.betterend.integration.byg.features.BYGFeatures;
|
import ru.betterend.integration.byg.features.BYGFeatures;
|
||||||
import ru.betterend.registry.EndFeatures;
|
import ru.betterend.registry.EndFeatures;
|
||||||
|
import ru.betterend.world.biome.BiomeDefinition;
|
||||||
import ru.betterend.world.biome.EndBiome;
|
import ru.betterend.world.biome.EndBiome;
|
||||||
import ru.betterend.world.biome.land.BiomeDefinition;
|
|
||||||
|
|
||||||
public class NightshadeRedwoods extends EndBiome {
|
public class NightshadeRedwoods extends EndBiome {
|
||||||
public NightshadeRedwoods() {
|
public NightshadeRedwoods() {
|
||||||
|
|
|
@ -20,8 +20,8 @@ import ru.betterend.BetterEnd;
|
||||||
import ru.betterend.integration.Integrations;
|
import ru.betterend.integration.Integrations;
|
||||||
import ru.betterend.integration.byg.features.BYGFeatures;
|
import ru.betterend.integration.byg.features.BYGFeatures;
|
||||||
import ru.betterend.registry.EndFeatures;
|
import ru.betterend.registry.EndFeatures;
|
||||||
|
import ru.betterend.world.biome.BiomeDefinition;
|
||||||
import ru.betterend.world.biome.EndBiome;
|
import ru.betterend.world.biome.EndBiome;
|
||||||
import ru.betterend.world.biome.land.BiomeDefinition;
|
|
||||||
|
|
||||||
public class OldBulbisGardens extends EndBiome {
|
public class OldBulbisGardens extends EndBiome {
|
||||||
public OldBulbisGardens() {
|
public OldBulbisGardens() {
|
||||||
|
|
|
@ -10,17 +10,23 @@ import org.spongepowered.asm.mixin.injection.Inject;
|
||||||
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
|
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
|
||||||
|
|
||||||
import net.minecraft.world.biome.source.BiomeSource;
|
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.ChunkGeneratorSettings;
|
||||||
import net.minecraft.world.gen.chunk.NoiseChunkGenerator;
|
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.GeneratorOptions;
|
||||||
import ru.betterend.world.generator.TerrainGenerator;
|
import ru.betterend.world.generator.TerrainGenerator;
|
||||||
|
|
||||||
@Mixin(NoiseChunkGenerator.class)
|
@Mixin(NoiseChunkGenerator.class)
|
||||||
public abstract class NoiseChunkGeneratorMixin {
|
public abstract class NoiseChunkGeneratorMixin extends ChunkGenerator {
|
||||||
@Final
|
@Final
|
||||||
@Shadow
|
@Shadow
|
||||||
protected Supplier<ChunkGeneratorSettings> settings;
|
protected Supplier<ChunkGeneratorSettings> settings;
|
||||||
|
|
||||||
|
public NoiseChunkGeneratorMixin(BiomeSource populationSource, BiomeSource biomeSource, StructuresConfig structuresConfig, long worldSeed) {
|
||||||
|
super(populationSource, biomeSource, structuresConfig, worldSeed);
|
||||||
|
}
|
||||||
|
|
||||||
@Inject(method = "<init>(Lnet/minecraft/world/biome/source/BiomeSource;Lnet/minecraft/world/biome/source/BiomeSource;JLjava/util/function/Supplier;)V", at = @At("TAIL"))
|
@Inject(method = "<init>(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<ChunkGeneratorSettings> settings, CallbackInfo info) {
|
private void beOnInit(BiomeSource populationSource, BiomeSource biomeSource, long seed, Supplier<ChunkGeneratorSettings> settings, CallbackInfo info) {
|
||||||
TerrainGenerator.initNoise(seed);
|
TerrainGenerator.initNoise(seed);
|
||||||
|
@ -30,7 +36,7 @@ public abstract class NoiseChunkGeneratorMixin {
|
||||||
private void beSampleNoiseColumn(double[] buffer, int x, int z, CallbackInfo info) {
|
private void beSampleNoiseColumn(double[] buffer, int x, int z, CallbackInfo info) {
|
||||||
if (GeneratorOptions.useNewGenerator() && settings.get().equals(ChunkGeneratorSettings.END)) {
|
if (GeneratorOptions.useNewGenerator() && settings.get().equals(ChunkGeneratorSettings.END)) {
|
||||||
if (TerrainGenerator.canGenerate(x, z)) {
|
if (TerrainGenerator.canGenerate(x, z)) {
|
||||||
TerrainGenerator.fillTerrainDensity(buffer, x, z);
|
TerrainGenerator.fillTerrainDensity(buffer, x, z, getBiomeSource());
|
||||||
info.cancel();
|
info.cancel();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -287,8 +287,8 @@ public class EndBiomes {
|
||||||
* @return registered {@link EndBiome}
|
* @return registered {@link EndBiome}
|
||||||
*/
|
*/
|
||||||
public static EndBiome registerSubBiome(EndBiome biome, EndBiome parent) {
|
public static EndBiome registerSubBiome(EndBiome biome, EndBiome parent) {
|
||||||
registerBiomeDirectly(biome);
|
|
||||||
if (Configs.BIOME_CONFIG.getBoolean(biome.getID(), "enabled", true)) {
|
if (Configs.BIOME_CONFIG.getBoolean(biome.getID(), "enabled", true)) {
|
||||||
|
registerBiomeDirectly(biome);
|
||||||
parent.addSubBiome(biome);
|
parent.addSubBiome(biome);
|
||||||
SUBBIOMES.add(biome);
|
SUBBIOMES.add(biome);
|
||||||
SUBBIOMES_UNMUTABLES.add(biome.getID());
|
SUBBIOMES_UNMUTABLES.add(biome.getID());
|
||||||
|
@ -305,8 +305,8 @@ public class EndBiomes {
|
||||||
* @return registered {@link EndBiome}
|
* @return registered {@link EndBiome}
|
||||||
*/
|
*/
|
||||||
public static EndBiome registerBiome(EndBiome biome, BiomeType type) {
|
public static EndBiome registerBiome(EndBiome biome, BiomeType type) {
|
||||||
registerBiomeDirectly(biome);
|
|
||||||
if (Configs.BIOME_CONFIG.getBoolean(biome.getID(), "enabled", true)) {
|
if (Configs.BIOME_CONFIG.getBoolean(biome.getID(), "enabled", true)) {
|
||||||
|
registerBiomeDirectly(biome);
|
||||||
addToPicker(biome, type);
|
addToPicker(biome, type);
|
||||||
ID_MAP.put(biome.getID(), biome);
|
ID_MAP.put(biome.getID(), biome);
|
||||||
if (type == BiomeType.LAND) {
|
if (type == BiomeType.LAND) {
|
||||||
|
@ -325,8 +325,8 @@ public class EndBiomes {
|
||||||
* @return registered {@link EndBiome}
|
* @return registered {@link EndBiome}
|
||||||
*/
|
*/
|
||||||
public static EndBiome registerSubBiomeIntegration(EndBiome biome) {
|
public static EndBiome registerSubBiomeIntegration(EndBiome biome) {
|
||||||
registerBiomeDirectly(biome);
|
|
||||||
if (Configs.BIOME_CONFIG.getBoolean(biome.getID(), "enabled", true)) {
|
if (Configs.BIOME_CONFIG.getBoolean(biome.getID(), "enabled", true)) {
|
||||||
|
registerBiomeDirectly(biome);
|
||||||
SUBBIOMES.add(biome);
|
SUBBIOMES.add(biome);
|
||||||
SUBBIOMES_UNMUTABLES.add(biome.getID());
|
SUBBIOMES_UNMUTABLES.add(biome.getID());
|
||||||
ID_MAP.put(biome.getID(), biome);
|
ID_MAP.put(biome.getID(), biome);
|
||||||
|
@ -367,9 +367,7 @@ public class EndBiomes {
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void registerBiomeDirectly(EndBiome biome) {
|
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) {
|
private static void addLandBiomeToFabricApi(EndBiome biome) {
|
||||||
|
@ -420,8 +418,8 @@ public class EndBiomes {
|
||||||
}
|
}
|
||||||
|
|
||||||
public static EndCaveBiome registerCaveBiome(EndCaveBiome biome) {
|
public static EndCaveBiome registerCaveBiome(EndCaveBiome biome) {
|
||||||
registerBiomeDirectly(biome);
|
|
||||||
if (Configs.BIOME_CONFIG.getBoolean(biome.getID(), "enabled", true)) {
|
if (Configs.BIOME_CONFIG.getBoolean(biome.getID(), "enabled", true)) {
|
||||||
|
registerBiomeDirectly(biome);
|
||||||
CAVE_BIOMES.addBiome(biome);
|
CAVE_BIOMES.addBiome(biome);
|
||||||
ID_MAP.put(biome.getID(), biome);
|
ID_MAP.put(biome.getID(), biome);
|
||||||
}
|
}
|
||||||
|
|
|
@ -11,8 +11,8 @@ import net.minecraft.world.biome.Biome;
|
||||||
import net.minecraft.world.gen.GenerationStep;
|
import net.minecraft.world.gen.GenerationStep;
|
||||||
import net.minecraft.world.gen.feature.ConfiguredFeature;
|
import net.minecraft.world.gen.feature.ConfiguredFeature;
|
||||||
import ru.betterend.BetterEnd;
|
import ru.betterend.BetterEnd;
|
||||||
|
import ru.betterend.world.biome.BiomeDefinition;
|
||||||
import ru.betterend.world.biome.EndBiome;
|
import ru.betterend.world.biome.EndBiome;
|
||||||
import ru.betterend.world.biome.land.BiomeDefinition;
|
|
||||||
import ru.betterend.world.features.BlueVineFeature;
|
import ru.betterend.world.features.BlueVineFeature;
|
||||||
import ru.betterend.world.features.CavePumpkinFeature;
|
import ru.betterend.world.features.CavePumpkinFeature;
|
||||||
import ru.betterend.world.features.CharniaFeature;
|
import ru.betterend.world.features.CharniaFeature;
|
||||||
|
|
|
@ -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;
|
||||||
|
}
|
||||||
|
}
|
|
@ -1,4 +1,4 @@
|
||||||
package ru.betterend.world.biome.land;
|
package ru.betterend.world.biome;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
|
@ -63,6 +63,7 @@ public class BiomeDefinition {
|
||||||
private int foliageColor = DEF_FOLIAGE;
|
private int foliageColor = DEF_FOLIAGE;
|
||||||
private int grassColor = DEF_FOLIAGE;
|
private int grassColor = DEF_FOLIAGE;
|
||||||
private float fogDensity = 1F;
|
private float fogDensity = 1F;
|
||||||
|
private float depth = 0.1F;
|
||||||
|
|
||||||
private final Identifier id;
|
private final Identifier id;
|
||||||
private float genChance = 1F;
|
private float genChance = 1F;
|
||||||
|
@ -113,6 +114,11 @@ public class BiomeDefinition {
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public BiomeDefinition setDepth(float depth) {
|
||||||
|
this.depth = depth;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
public BiomeDefinition addMobSpawn(EntityType<?> type, int weight, int minGroupSize, int maxGroupSize) {
|
public BiomeDefinition addMobSpawn(EntityType<?> type, int weight, int minGroupSize, int maxGroupSize) {
|
||||||
Identifier eID = Registry.ENTITY_TYPE.getId(type);
|
Identifier eID = Registry.ENTITY_TYPE.getId(type);
|
||||||
if (eID != Registry.ENTITY_TYPE.getDefaultId()) {
|
if (eID != Registry.ENTITY_TYPE.getDefaultId()) {
|
||||||
|
@ -256,7 +262,7 @@ public class BiomeDefinition {
|
||||||
return new Biome.Builder()
|
return new Biome.Builder()
|
||||||
.precipitation(Precipitation.NONE)
|
.precipitation(Precipitation.NONE)
|
||||||
.category(isCaveBiome ? Category.NONE : Category.THEEND)
|
.category(isCaveBiome ? Category.NONE : Category.THEEND)
|
||||||
.depth(0.1F)
|
.depth(depth)
|
||||||
.scale(0.2F)
|
.scale(0.2F)
|
||||||
.temperature(2.0F)
|
.temperature(2.0F)
|
||||||
.downfall(0.0F)
|
.downfall(0.0F)
|
|
@ -14,7 +14,6 @@ import net.minecraft.world.biome.Biome;
|
||||||
import ru.betterend.config.Configs;
|
import ru.betterend.config.Configs;
|
||||||
import ru.betterend.util.JsonFactory;
|
import ru.betterend.util.JsonFactory;
|
||||||
import ru.betterend.util.StructureHelper;
|
import ru.betterend.util.StructureHelper;
|
||||||
import ru.betterend.world.biome.land.BiomeDefinition;
|
|
||||||
import ru.betterend.world.features.EndFeature;
|
import ru.betterend.world.features.EndFeature;
|
||||||
import ru.betterend.world.features.ListFeature;
|
import ru.betterend.world.features.ListFeature;
|
||||||
import ru.betterend.world.features.ListFeature.StructureInfo;
|
import ru.betterend.world.features.ListFeature.StructureInfo;
|
||||||
|
|
|
@ -4,8 +4,8 @@ import net.minecraft.entity.EntityType;
|
||||||
import ru.betterend.registry.EndFeatures;
|
import ru.betterend.registry.EndFeatures;
|
||||||
import ru.betterend.registry.EndParticles;
|
import ru.betterend.registry.EndParticles;
|
||||||
import ru.betterend.registry.EndStructures;
|
import ru.betterend.registry.EndStructures;
|
||||||
|
import ru.betterend.world.biome.BiomeDefinition;
|
||||||
import ru.betterend.world.biome.EndBiome;
|
import ru.betterend.world.biome.EndBiome;
|
||||||
import ru.betterend.world.biome.land.BiomeDefinition;
|
|
||||||
|
|
||||||
public class BiomeIceStarfield extends EndBiome {
|
public class BiomeIceStarfield extends EndBiome {
|
||||||
public BiomeIceStarfield() {
|
public BiomeIceStarfield() {
|
||||||
|
|
|
@ -3,7 +3,7 @@ package ru.betterend.world.biome.cave;
|
||||||
import ru.betterend.registry.EndFeatures;
|
import ru.betterend.registry.EndFeatures;
|
||||||
import ru.betterend.registry.EndParticles;
|
import ru.betterend.registry.EndParticles;
|
||||||
import ru.betterend.registry.EndSounds;
|
import ru.betterend.registry.EndSounds;
|
||||||
import ru.betterend.world.biome.land.BiomeDefinition;
|
import ru.betterend.world.biome.BiomeDefinition;
|
||||||
|
|
||||||
public class EmptyAuroraCaveBiome extends EndCaveBiome {
|
public class EmptyAuroraCaveBiome extends EndCaveBiome {
|
||||||
public EmptyAuroraCaveBiome() {
|
public EmptyAuroraCaveBiome() {
|
||||||
|
|
|
@ -2,7 +2,7 @@ package ru.betterend.world.biome.cave;
|
||||||
|
|
||||||
import ru.betterend.registry.EndFeatures;
|
import ru.betterend.registry.EndFeatures;
|
||||||
import ru.betterend.registry.EndSounds;
|
import ru.betterend.registry.EndSounds;
|
||||||
import ru.betterend.world.biome.land.BiomeDefinition;
|
import ru.betterend.world.biome.BiomeDefinition;
|
||||||
|
|
||||||
public class EmptyEndCaveBiome extends EndCaveBiome {
|
public class EmptyEndCaveBiome extends EndCaveBiome {
|
||||||
public EmptyEndCaveBiome() {
|
public EmptyEndCaveBiome() {
|
||||||
|
|
|
@ -3,7 +3,7 @@ package ru.betterend.world.biome.cave;
|
||||||
import ru.betterend.registry.EndFeatures;
|
import ru.betterend.registry.EndFeatures;
|
||||||
import ru.betterend.registry.EndParticles;
|
import ru.betterend.registry.EndParticles;
|
||||||
import ru.betterend.registry.EndSounds;
|
import ru.betterend.registry.EndSounds;
|
||||||
import ru.betterend.world.biome.land.BiomeDefinition;
|
import ru.betterend.world.biome.BiomeDefinition;
|
||||||
|
|
||||||
public class EmptySmaragdantCaveBiome extends EndCaveBiome {
|
public class EmptySmaragdantCaveBiome extends EndCaveBiome {
|
||||||
public EmptySmaragdantCaveBiome() {
|
public EmptySmaragdantCaveBiome() {
|
||||||
|
|
|
@ -7,8 +7,8 @@ import net.minecraft.util.collection.WeightedList;
|
||||||
import net.minecraft.util.math.BlockPos;
|
import net.minecraft.util.math.BlockPos;
|
||||||
import net.minecraft.world.gen.feature.Feature;
|
import net.minecraft.world.gen.feature.Feature;
|
||||||
import ru.betterend.registry.EndBiomes;
|
import ru.betterend.registry.EndBiomes;
|
||||||
|
import ru.betterend.world.biome.BiomeDefinition;
|
||||||
import ru.betterend.world.biome.EndBiome;
|
import ru.betterend.world.biome.EndBiome;
|
||||||
import ru.betterend.world.biome.land.BiomeDefinition;
|
|
||||||
import ru.betterend.world.features.EndFeature;
|
import ru.betterend.world.features.EndFeature;
|
||||||
import ru.betterend.world.features.terrain.caves.CaveChunkPopulatorFeature;
|
import ru.betterend.world.features.terrain.caves.CaveChunkPopulatorFeature;
|
||||||
|
|
||||||
|
|
|
@ -8,7 +8,7 @@ import ru.betterend.registry.EndBlocks;
|
||||||
import ru.betterend.registry.EndFeatures;
|
import ru.betterend.registry.EndFeatures;
|
||||||
import ru.betterend.registry.EndParticles;
|
import ru.betterend.registry.EndParticles;
|
||||||
import ru.betterend.registry.EndSounds;
|
import ru.betterend.registry.EndSounds;
|
||||||
import ru.betterend.world.biome.land.BiomeDefinition;
|
import ru.betterend.world.biome.BiomeDefinition;
|
||||||
|
|
||||||
public class LushAuroraCaveBiome extends EndCaveBiome {
|
public class LushAuroraCaveBiome extends EndCaveBiome {
|
||||||
public LushAuroraCaveBiome() {
|
public LushAuroraCaveBiome() {
|
||||||
|
|
|
@ -4,7 +4,7 @@ import ru.betterend.registry.EndBlocks;
|
||||||
import ru.betterend.registry.EndFeatures;
|
import ru.betterend.registry.EndFeatures;
|
||||||
import ru.betterend.registry.EndParticles;
|
import ru.betterend.registry.EndParticles;
|
||||||
import ru.betterend.registry.EndSounds;
|
import ru.betterend.registry.EndSounds;
|
||||||
import ru.betterend.world.biome.land.BiomeDefinition;
|
import ru.betterend.world.biome.BiomeDefinition;
|
||||||
|
|
||||||
public class LushSmaragdantCaveBiome extends EndCaveBiome {
|
public class LushSmaragdantCaveBiome extends EndCaveBiome {
|
||||||
public LushSmaragdantCaveBiome() {
|
public LushSmaragdantCaveBiome() {
|
||||||
|
|
|
@ -7,6 +7,7 @@ import ru.betterend.registry.EndEntities;
|
||||||
import ru.betterend.registry.EndFeatures;
|
import ru.betterend.registry.EndFeatures;
|
||||||
import ru.betterend.registry.EndParticles;
|
import ru.betterend.registry.EndParticles;
|
||||||
import ru.betterend.registry.EndSounds;
|
import ru.betterend.registry.EndSounds;
|
||||||
|
import ru.betterend.world.biome.BiomeDefinition;
|
||||||
import ru.betterend.world.biome.EndBiome;
|
import ru.betterend.world.biome.EndBiome;
|
||||||
|
|
||||||
public class AmberLandBiome extends EndBiome {
|
public class AmberLandBiome extends EndBiome {
|
||||||
|
|
|
@ -5,6 +5,7 @@ import ru.betterend.registry.EndBlocks;
|
||||||
import ru.betterend.registry.EndEntities;
|
import ru.betterend.registry.EndEntities;
|
||||||
import ru.betterend.registry.EndFeatures;
|
import ru.betterend.registry.EndFeatures;
|
||||||
import ru.betterend.registry.EndSounds;
|
import ru.betterend.registry.EndSounds;
|
||||||
|
import ru.betterend.world.biome.BiomeDefinition;
|
||||||
import ru.betterend.world.biome.EndBiome;
|
import ru.betterend.world.biome.EndBiome;
|
||||||
|
|
||||||
public class BlossomingSpiresBiome extends EndBiome {
|
public class BlossomingSpiresBiome extends EndBiome {
|
||||||
|
|
|
@ -9,6 +9,7 @@ import ru.betterend.registry.EndBlocks;
|
||||||
import ru.betterend.registry.EndEntities;
|
import ru.betterend.registry.EndEntities;
|
||||||
import ru.betterend.registry.EndFeatures;
|
import ru.betterend.registry.EndFeatures;
|
||||||
import ru.betterend.registry.EndSounds;
|
import ru.betterend.registry.EndSounds;
|
||||||
|
import ru.betterend.world.biome.BiomeDefinition;
|
||||||
import ru.betterend.world.biome.EndBiome;
|
import ru.betterend.world.biome.EndBiome;
|
||||||
|
|
||||||
public class ChorusForestBiome extends EndBiome {
|
public class ChorusForestBiome extends EndBiome {
|
||||||
|
|
|
@ -5,6 +5,7 @@ import ru.betterend.registry.EndBlocks;
|
||||||
import ru.betterend.registry.EndFeatures;
|
import ru.betterend.registry.EndFeatures;
|
||||||
import ru.betterend.registry.EndSounds;
|
import ru.betterend.registry.EndSounds;
|
||||||
import ru.betterend.registry.EndStructures;
|
import ru.betterend.registry.EndStructures;
|
||||||
|
import ru.betterend.world.biome.BiomeDefinition;
|
||||||
import ru.betterend.world.biome.EndBiome;
|
import ru.betterend.world.biome.EndBiome;
|
||||||
|
|
||||||
public class CrystalMountainsBiome extends EndBiome {
|
public class CrystalMountainsBiome extends EndBiome {
|
||||||
|
|
|
@ -5,6 +5,7 @@ import ru.betterend.registry.EndBlocks;
|
||||||
import ru.betterend.registry.EndFeatures;
|
import ru.betterend.registry.EndFeatures;
|
||||||
import ru.betterend.registry.EndParticles;
|
import ru.betterend.registry.EndParticles;
|
||||||
import ru.betterend.registry.EndSounds;
|
import ru.betterend.registry.EndSounds;
|
||||||
|
import ru.betterend.world.biome.BiomeDefinition;
|
||||||
import ru.betterend.world.biome.EndBiome;
|
import ru.betterend.world.biome.EndBiome;
|
||||||
|
|
||||||
public class DragonGraveyardsBiome extends EndBiome {
|
public class DragonGraveyardsBiome extends EndBiome {
|
||||||
|
|
|
@ -5,6 +5,7 @@ import net.minecraft.world.gen.feature.ConfiguredStructureFeatures;
|
||||||
import ru.betterend.registry.EndBlocks;
|
import ru.betterend.registry.EndBlocks;
|
||||||
import ru.betterend.registry.EndFeatures;
|
import ru.betterend.registry.EndFeatures;
|
||||||
import ru.betterend.registry.EndSounds;
|
import ru.betterend.registry.EndSounds;
|
||||||
|
import ru.betterend.world.biome.BiomeDefinition;
|
||||||
import ru.betterend.world.biome.EndBiome;
|
import ru.betterend.world.biome.EndBiome;
|
||||||
|
|
||||||
public class DryShrublandBiome extends EndBiome {
|
public class DryShrublandBiome extends EndBiome {
|
||||||
|
|
|
@ -5,6 +5,7 @@ import net.minecraft.particle.ParticleTypes;
|
||||||
import net.minecraft.world.gen.feature.ConfiguredStructureFeatures;
|
import net.minecraft.world.gen.feature.ConfiguredStructureFeatures;
|
||||||
import ru.betterend.registry.EndBlocks;
|
import ru.betterend.registry.EndBlocks;
|
||||||
import ru.betterend.registry.EndSounds;
|
import ru.betterend.registry.EndSounds;
|
||||||
|
import ru.betterend.world.biome.BiomeDefinition;
|
||||||
import ru.betterend.world.biome.EndBiome;
|
import ru.betterend.world.biome.EndBiome;
|
||||||
|
|
||||||
public class DustWastelandsBiome extends EndBiome {
|
public class DustWastelandsBiome extends EndBiome {
|
||||||
|
|
|
@ -8,6 +8,7 @@ import ru.betterend.registry.EndFeatures;
|
||||||
import ru.betterend.registry.EndParticles;
|
import ru.betterend.registry.EndParticles;
|
||||||
import ru.betterend.registry.EndSounds;
|
import ru.betterend.registry.EndSounds;
|
||||||
import ru.betterend.registry.EndStructures;
|
import ru.betterend.registry.EndStructures;
|
||||||
|
import ru.betterend.world.biome.BiomeDefinition;
|
||||||
import ru.betterend.world.biome.EndBiome;
|
import ru.betterend.world.biome.EndBiome;
|
||||||
|
|
||||||
public class FoggyMushroomlandBiome extends EndBiome {
|
public class FoggyMushroomlandBiome extends EndBiome {
|
||||||
|
|
|
@ -6,6 +6,7 @@ import ru.betterend.registry.EndBlocks;
|
||||||
import ru.betterend.registry.EndFeatures;
|
import ru.betterend.registry.EndFeatures;
|
||||||
import ru.betterend.registry.EndParticles;
|
import ru.betterend.registry.EndParticles;
|
||||||
import ru.betterend.registry.EndSounds;
|
import ru.betterend.registry.EndSounds;
|
||||||
|
import ru.betterend.world.biome.BiomeDefinition;
|
||||||
import ru.betterend.world.biome.EndBiome;
|
import ru.betterend.world.biome.EndBiome;
|
||||||
|
|
||||||
public class GlowingGrasslandsBiome extends EndBiome {
|
public class GlowingGrasslandsBiome extends EndBiome {
|
||||||
|
|
|
@ -6,6 +6,7 @@ import ru.betterend.registry.EndBlocks;
|
||||||
import ru.betterend.registry.EndFeatures;
|
import ru.betterend.registry.EndFeatures;
|
||||||
import ru.betterend.registry.EndParticles;
|
import ru.betterend.registry.EndParticles;
|
||||||
import ru.betterend.registry.EndSounds;
|
import ru.betterend.registry.EndSounds;
|
||||||
|
import ru.betterend.world.biome.BiomeDefinition;
|
||||||
import ru.betterend.world.biome.EndBiome;
|
import ru.betterend.world.biome.EndBiome;
|
||||||
|
|
||||||
public class LanternWoodsBiome extends EndBiome {
|
public class LanternWoodsBiome extends EndBiome {
|
||||||
|
|
|
@ -6,6 +6,7 @@ import ru.betterend.registry.EndEntities;
|
||||||
import ru.betterend.registry.EndFeatures;
|
import ru.betterend.registry.EndFeatures;
|
||||||
import ru.betterend.registry.EndSounds;
|
import ru.betterend.registry.EndSounds;
|
||||||
import ru.betterend.registry.EndStructures;
|
import ru.betterend.registry.EndStructures;
|
||||||
|
import ru.betterend.world.biome.BiomeDefinition;
|
||||||
import ru.betterend.world.biome.EndBiome;
|
import ru.betterend.world.biome.EndBiome;
|
||||||
|
|
||||||
public class MegalakeBiome extends EndBiome {
|
public class MegalakeBiome extends EndBiome {
|
||||||
|
@ -18,6 +19,7 @@ public class MegalakeBiome extends EndBiome {
|
||||||
.setMusic(EndSounds.MUSIC_WATER)
|
.setMusic(EndSounds.MUSIC_WATER)
|
||||||
.setLoop(EndSounds.AMBIENT_MEGALAKE)
|
.setLoop(EndSounds.AMBIENT_MEGALAKE)
|
||||||
.setSurface(EndBlocks.END_MOSS, EndBlocks.ENDSTONE_DUST)
|
.setSurface(EndBlocks.END_MOSS, EndBlocks.ENDSTONE_DUST)
|
||||||
|
.setDepth(0F)
|
||||||
.addStructureFeature(EndStructures.MEGALAKE)
|
.addStructureFeature(EndStructures.MEGALAKE)
|
||||||
.addFeature(EndFeatures.END_LOTUS)
|
.addFeature(EndFeatures.END_LOTUS)
|
||||||
.addFeature(EndFeatures.END_LOTUS_LEAF)
|
.addFeature(EndFeatures.END_LOTUS_LEAF)
|
||||||
|
|
|
@ -7,6 +7,7 @@ import ru.betterend.registry.EndFeatures;
|
||||||
import ru.betterend.registry.EndParticles;
|
import ru.betterend.registry.EndParticles;
|
||||||
import ru.betterend.registry.EndSounds;
|
import ru.betterend.registry.EndSounds;
|
||||||
import ru.betterend.registry.EndStructures;
|
import ru.betterend.registry.EndStructures;
|
||||||
|
import ru.betterend.world.biome.BiomeDefinition;
|
||||||
import ru.betterend.world.biome.EndBiome;
|
import ru.betterend.world.biome.EndBiome;
|
||||||
|
|
||||||
public class MegalakeGroveBiome extends EndBiome {
|
public class MegalakeGroveBiome extends EndBiome {
|
||||||
|
@ -20,6 +21,7 @@ public class MegalakeGroveBiome extends EndBiome {
|
||||||
.setMusic(EndSounds.MUSIC_WATER)
|
.setMusic(EndSounds.MUSIC_WATER)
|
||||||
.setLoop(EndSounds.AMBIENT_MEGALAKE_GROVE)
|
.setLoop(EndSounds.AMBIENT_MEGALAKE_GROVE)
|
||||||
.setSurface(EndBlocks.END_MOSS)
|
.setSurface(EndBlocks.END_MOSS)
|
||||||
|
.setDepth(0F)
|
||||||
.addStructureFeature(EndStructures.MEGALAKE_SMALL)
|
.addStructureFeature(EndStructures.MEGALAKE_SMALL)
|
||||||
.addFeature(EndFeatures.LACUGROVE)
|
.addFeature(EndFeatures.LACUGROVE)
|
||||||
.addFeature(EndFeatures.END_LOTUS)
|
.addFeature(EndFeatures.END_LOTUS)
|
||||||
|
|
|
@ -6,6 +6,7 @@ import net.minecraft.world.gen.feature.ConfiguredStructureFeatures;
|
||||||
import ru.betterend.registry.EndBlocks;
|
import ru.betterend.registry.EndBlocks;
|
||||||
import ru.betterend.registry.EndFeatures;
|
import ru.betterend.registry.EndFeatures;
|
||||||
import ru.betterend.registry.EndSounds;
|
import ru.betterend.registry.EndSounds;
|
||||||
|
import ru.betterend.world.biome.BiomeDefinition;
|
||||||
import ru.betterend.world.biome.EndBiome;
|
import ru.betterend.world.biome.EndBiome;
|
||||||
|
|
||||||
public class NeonOasisBiome extends EndBiome {
|
public class NeonOasisBiome extends EndBiome {
|
||||||
|
|
|
@ -5,6 +5,7 @@ import net.minecraft.particle.ParticleTypes;
|
||||||
import ru.betterend.registry.EndBlocks;
|
import ru.betterend.registry.EndBlocks;
|
||||||
import ru.betterend.registry.EndSounds;
|
import ru.betterend.registry.EndSounds;
|
||||||
import ru.betterend.registry.EndStructures;
|
import ru.betterend.registry.EndStructures;
|
||||||
|
import ru.betterend.world.biome.BiomeDefinition;
|
||||||
import ru.betterend.world.biome.EndBiome;
|
import ru.betterend.world.biome.EndBiome;
|
||||||
|
|
||||||
public class PaintedMountainsBiome extends EndBiome {
|
public class PaintedMountainsBiome extends EndBiome {
|
||||||
|
|
|
@ -7,6 +7,7 @@ import ru.betterend.registry.EndBlocks;
|
||||||
import ru.betterend.registry.EndEntities;
|
import ru.betterend.registry.EndEntities;
|
||||||
import ru.betterend.registry.EndFeatures;
|
import ru.betterend.registry.EndFeatures;
|
||||||
import ru.betterend.registry.EndSounds;
|
import ru.betterend.registry.EndSounds;
|
||||||
|
import ru.betterend.world.biome.BiomeDefinition;
|
||||||
import ru.betterend.world.biome.EndBiome;
|
import ru.betterend.world.biome.EndBiome;
|
||||||
|
|
||||||
public class ShadowForestBiome extends EndBiome {
|
public class ShadowForestBiome extends EndBiome {
|
||||||
|
|
|
@ -5,6 +5,7 @@ import ru.betterend.registry.EndEntities;
|
||||||
import ru.betterend.registry.EndFeatures;
|
import ru.betterend.registry.EndFeatures;
|
||||||
import ru.betterend.registry.EndParticles;
|
import ru.betterend.registry.EndParticles;
|
||||||
import ru.betterend.registry.EndSounds;
|
import ru.betterend.registry.EndSounds;
|
||||||
|
import ru.betterend.world.biome.BiomeDefinition;
|
||||||
import ru.betterend.world.biome.EndBiome;
|
import ru.betterend.world.biome.EndBiome;
|
||||||
import ru.betterend.world.surface.SurfaceBuilders;
|
import ru.betterend.world.surface.SurfaceBuilders;
|
||||||
|
|
||||||
|
@ -19,6 +20,7 @@ public class SulphurSpringsBiome extends EndBiome {
|
||||||
.setFogColor(207, 194, 62)
|
.setFogColor(207, 194, 62)
|
||||||
.setFogDensity(1.5F)
|
.setFogDensity(1.5F)
|
||||||
.setCaves(false)
|
.setCaves(false)
|
||||||
|
.setDepth(0F)
|
||||||
.setParticles(EndParticles.SULPHUR_PARTICLE, 0.001F)
|
.setParticles(EndParticles.SULPHUR_PARTICLE, 0.001F)
|
||||||
.addFeature(EndFeatures.GEYSER)
|
.addFeature(EndFeatures.GEYSER)
|
||||||
.addFeature(EndFeatures.SURFACE_VENT)
|
.addFeature(EndFeatures.SURFACE_VENT)
|
||||||
|
|
|
@ -6,6 +6,7 @@ import ru.betterend.registry.EndBlocks;
|
||||||
import ru.betterend.registry.EndFeatures;
|
import ru.betterend.registry.EndFeatures;
|
||||||
import ru.betterend.registry.EndParticles;
|
import ru.betterend.registry.EndParticles;
|
||||||
import ru.betterend.registry.EndSounds;
|
import ru.betterend.registry.EndSounds;
|
||||||
|
import ru.betterend.world.biome.BiomeDefinition;
|
||||||
import ru.betterend.world.biome.EndBiome;
|
import ru.betterend.world.biome.EndBiome;
|
||||||
|
|
||||||
public class UmbrellaJungleBiome extends EndBiome {
|
public class UmbrellaJungleBiome extends EndBiome {
|
||||||
|
|
|
@ -109,6 +109,24 @@ public class BetterEndBiomeSource extends BiomeSource {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
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
|
@Override
|
||||||
public BiomeSource withSeed(long seed) {
|
public BiomeSource withSeed(long seed) {
|
||||||
return new BetterEndBiomeSource(biomeRegistry, seed);
|
return new BetterEndBiomeSource(biomeRegistry, seed);
|
||||||
|
|
|
@ -1,7 +1,5 @@
|
||||||
package ru.betterend.world.generator;
|
package ru.betterend.world.generator;
|
||||||
|
|
||||||
import java.io.IOException;
|
|
||||||
import java.io.InputStream;
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
@ -10,13 +8,11 @@ import java.util.Random;
|
||||||
import com.google.common.collect.Lists;
|
import com.google.common.collect.Lists;
|
||||||
import com.google.common.collect.Maps;
|
import com.google.common.collect.Maps;
|
||||||
|
|
||||||
import net.minecraft.client.texture.NativeImage;
|
|
||||||
import net.minecraft.util.math.BlockPos;
|
import net.minecraft.util.math.BlockPos;
|
||||||
import ru.betterend.BetterEnd;
|
|
||||||
import ru.betterend.noise.OpenSimplexNoise;
|
import ru.betterend.noise.OpenSimplexNoise;
|
||||||
import ru.betterend.util.MHelper;
|
import ru.betterend.util.MHelper;
|
||||||
import ru.betterend.util.sdf.SDF;
|
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.SDFScale;
|
||||||
import ru.betterend.util.sdf.operator.SDFSmoothUnion;
|
import ru.betterend.util.sdf.operator.SDFSmoothUnion;
|
||||||
import ru.betterend.util.sdf.operator.SDFTranslate;
|
import ru.betterend.util.sdf.operator.SDFTranslate;
|
||||||
|
@ -24,7 +20,8 @@ import ru.betterend.util.sdf.primitive.SDFCappedCone;
|
||||||
|
|
||||||
public class IslandLayer {
|
public class IslandLayer {
|
||||||
private static final Random RANDOM = new Random();
|
private static final Random RANDOM = new Random();
|
||||||
private static final SDF[] ISLAND;
|
private final SDFRadialNoiseMap noise;
|
||||||
|
private final SDF island;
|
||||||
|
|
||||||
private final List<BlockPos> positions = new ArrayList<BlockPos>(9);
|
private final List<BlockPos> positions = new ArrayList<BlockPos>(9);
|
||||||
private final Map<BlockPos, SDF> islands = Maps.newHashMap();
|
private final Map<BlockPos, SDF> islands = Maps.newHashMap();
|
||||||
|
@ -38,6 +35,16 @@ public class IslandLayer {
|
||||||
this.density = new OpenSimplexNoise(seed);
|
this.density = new OpenSimplexNoise(seed);
|
||||||
this.options = options;
|
this.options = options;
|
||||||
this.seed = seed;
|
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) {
|
private int getSeed(int x, int z) {
|
||||||
|
@ -47,7 +54,6 @@ public class IslandLayer {
|
||||||
}
|
}
|
||||||
|
|
||||||
public void updatePositions(double x, double z) {
|
public void updatePositions(double x, double z) {
|
||||||
|
|
||||||
int ix = MHelper.floor(x / options.distance);
|
int ix = MHelper.floor(x / options.distance);
|
||||||
int iz = MHelper.floor(z / options.distance);
|
int iz = MHelper.floor(z / options.distance);
|
||||||
|
|
||||||
|
@ -91,14 +97,15 @@ public class IslandLayer {
|
||||||
SDF island = islands.get(pos);
|
SDF island = islands.get(pos);
|
||||||
if (island == null) {
|
if (island == null) {
|
||||||
if (pos.getX() == 0 && pos.getZ() == 0) {
|
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 {
|
else {
|
||||||
RANDOM.setSeed(getSeed(pos.getX(), pos.getZ()));
|
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);
|
islands.put(pos, island);
|
||||||
}
|
}
|
||||||
|
noise.setOffset(pos.getX(), pos.getZ());
|
||||||
return island;
|
return island;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -123,6 +130,12 @@ public class IslandLayer {
|
||||||
return -calculateSDF(x, y, z);
|
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() {
|
public void clearCache() {
|
||||||
if (islands.size() > 128) {
|
if (islands.size() > 128) {
|
||||||
islands.clear();
|
islands.clear();
|
||||||
|
@ -135,7 +148,7 @@ public class IslandLayer {
|
||||||
return new SDFTranslate().setTranslate(0, minY + hh, 0).setSource(sdf);
|
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);
|
InputStream stream = IslandLayer.class.getResourceAsStream(path);
|
||||||
if (stream != null) {
|
if (stream != null) {
|
||||||
try {
|
try {
|
||||||
|
@ -148,9 +161,9 @@ public class IslandLayer {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return null;
|
return null;
|
||||||
}
|
}*/
|
||||||
|
|
||||||
static {
|
/*static {
|
||||||
NativeImage map = loadMap("/assets/" + BetterEnd.MOD_ID + "/textures/heightmaps/mountain_1.png");
|
NativeImage map = loadMap("/assets/" + BetterEnd.MOD_ID + "/textures/heightmaps/mountain_1.png");
|
||||||
|
|
||||||
SDF cone1 = makeCone(0, 0.4F, 0.2F, -0.3F);
|
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 coneTop = new SDFSmoothUnion().setRadius(0.02F).setSourceA(cone3).setSourceB(cone4);
|
||||||
|
|
||||||
SDF map1 = new SDFHeightmap().setMap(map).setIntensity(0.3F).setSource(coneTop);
|
SDF map1 = new SDFHeightmap().setMap(map).setIntensity(0.3F).setSource(coneTop);
|
||||||
|
NOISE = (SDFRadialNoiseMap) new SDFRadialNoiseMap().setSource(coneTop);
|
||||||
|
|
||||||
ISLAND = new SDF[] {
|
ISLAND = new SDF[] {
|
||||||
new SDFSmoothUnion().setRadius(0.01F).setSourceA(coneTop).setSourceB(coneBottom),
|
new SDFSmoothUnion().setRadius(0.01F).setSourceA(coneTop).setSourceB(coneBottom),
|
||||||
new SDFSmoothUnion().setRadius(0.01F).setSourceA(map1).setSourceB(coneBottom)
|
new SDFSmoothUnion().setRadius(0.01F).setSourceA(map1).setSourceB(coneBottom)
|
||||||
};
|
};
|
||||||
}
|
}*/
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,9 +1,15 @@
|
||||||
package ru.betterend.world.generator;
|
package ru.betterend.world.generator;
|
||||||
|
|
||||||
|
import java.awt.Point;
|
||||||
|
import java.util.List;
|
||||||
import java.util.Random;
|
import java.util.Random;
|
||||||
import java.util.concurrent.locks.ReentrantLock;
|
import java.util.concurrent.locks.ReentrantLock;
|
||||||
|
|
||||||
|
import com.google.common.collect.Lists;
|
||||||
|
|
||||||
import net.minecraft.util.math.MathHelper;
|
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.noise.OpenSimplexNoise;
|
||||||
import ru.betterend.util.MHelper;
|
import ru.betterend.util.MHelper;
|
||||||
|
|
||||||
|
@ -11,7 +17,8 @@ public class TerrainGenerator {
|
||||||
private static final ReentrantLock LOCKER = new ReentrantLock();
|
private static final ReentrantLock LOCKER = new ReentrantLock();
|
||||||
private static final double SCALE_XZ = 8.0;
|
private static final double SCALE_XZ = 8.0;
|
||||||
private static final double SCALE_Y = 4.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 largeIslands;
|
||||||
private static IslandLayer mediumIslands;
|
private static IslandLayer mediumIslands;
|
||||||
|
@ -32,7 +39,7 @@ public class TerrainGenerator {
|
||||||
noise2 = new OpenSimplexNoise(random.nextInt());
|
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();
|
LOCKER.lock();
|
||||||
|
|
||||||
largeIslands.clearCache();
|
largeIslands.clearCache();
|
||||||
|
@ -48,11 +55,13 @@ public class TerrainGenerator {
|
||||||
mediumIslands.updatePositions(px, pz);
|
mediumIslands.updatePositions(px, pz);
|
||||||
smallIslands.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++) {
|
for (int y = 0; y < buffer.length; y++) {
|
||||||
double py = (double) y * SCALE_Y;
|
double py = (double) y * SCALE_Y;
|
||||||
float dist = largeIslands.getDensity(px, py, pz);
|
float dist = largeIslands.getDensity(px, py, pz, height);
|
||||||
dist = dist > 1 ? dist : MHelper.max(dist, mediumIslands.getDensity(px, py, pz));
|
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));
|
dist = dist > 1 ? dist : MHelper.max(dist, smallIslands.getDensity(px, py, pz, height));
|
||||||
if (dist > -0.5F) {
|
if (dist > -0.5F) {
|
||||||
dist += noise1.eval(px * 0.01, py * 0.01, pz * 0.01) * 0.02 + 0.02;
|
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;
|
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();
|
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
|
* Check if this is land
|
||||||
* @param x - biome pos x
|
* @param x - biome pos x
|
||||||
|
@ -143,4 +172,25 @@ public class TerrainGenerator {
|
||||||
LOCKER.unlock();
|
LOCKER.unlock();
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static {
|
||||||
|
float sum = 0;
|
||||||
|
List<Float> coef = Lists.newArrayList();
|
||||||
|
List<Point> 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;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue