ocean and slant palettes

This commit is contained in:
dfsek 2021-07-16 12:07:10 -07:00
parent 0bd6ff9469
commit 2e6b62d690
4 changed files with 40 additions and 21 deletions

View File

@ -2,7 +2,6 @@ package com.dfsek.terra.addons.chunkgenerator;
import com.dfsek.tectonic.annotations.Default; import com.dfsek.tectonic.annotations.Default;
import com.dfsek.tectonic.annotations.Value; import com.dfsek.tectonic.annotations.Value;
import com.dfsek.tectonic.config.ConfigTemplate;
import com.dfsek.tectonic.loading.object.ObjectTemplate; import com.dfsek.tectonic.loading.object.ObjectTemplate;
import com.dfsek.terra.addons.chunkgenerator.palette.PaletteHolder; import com.dfsek.terra.addons.chunkgenerator.palette.PaletteHolder;
import com.dfsek.terra.addons.chunkgenerator.palette.PaletteInfo; import com.dfsek.terra.addons.chunkgenerator.palette.PaletteInfo;

View File

@ -2,6 +2,7 @@ package com.dfsek.terra.addons.chunkgenerator;
import com.dfsek.terra.addons.chunkgenerator.generation.generators.NoiseChunkGenerator3D; import com.dfsek.terra.addons.chunkgenerator.generation.generators.NoiseChunkGenerator3D;
import com.dfsek.terra.addons.chunkgenerator.palette.PaletteHolder; import com.dfsek.terra.addons.chunkgenerator.palette.PaletteHolder;
import com.dfsek.terra.addons.chunkgenerator.palette.PaletteHolderLoader;
import com.dfsek.terra.addons.chunkgenerator.palette.PaletteInfo; import com.dfsek.terra.addons.chunkgenerator.palette.PaletteInfo;
import com.dfsek.terra.addons.chunkgenerator.palette.SlantHolder; import com.dfsek.terra.addons.chunkgenerator.palette.SlantHolder;
import com.dfsek.terra.addons.chunkgenerator.palette.SlantHolderLoader; import com.dfsek.terra.addons.chunkgenerator.palette.SlantHolderLoader;
@ -15,6 +16,7 @@ import com.dfsek.terra.api.event.events.config.ConfigurationLoadEvent;
import com.dfsek.terra.api.event.events.config.pack.ConfigPackPreLoadEvent; import com.dfsek.terra.api.event.events.config.pack.ConfigPackPreLoadEvent;
import com.dfsek.terra.api.injection.annotations.Inject; import com.dfsek.terra.api.injection.annotations.Inject;
import com.dfsek.terra.api.registry.exception.DuplicateEntryException; import com.dfsek.terra.api.registry.exception.DuplicateEntryException;
import com.dfsek.terra.api.util.seeded.BiomeBuilder;
import com.dfsek.terra.api.world.biome.TerraBiome; import com.dfsek.terra.api.world.biome.TerraBiome;
import com.dfsek.terra.api.world.generator.ChunkGeneratorProvider; import com.dfsek.terra.api.world.generator.ChunkGeneratorProvider;
@ -28,7 +30,7 @@ public class NoiseChunkGenerator3DAddon extends TerraAddon implements EventListe
@Inject @Inject
private TerraPlugin main; private TerraPlugin main;
private final Map<TerraBiome, PaletteInfo> palettes = new HashMap<>(); private final Map<String, PaletteInfo> palettes = new HashMap<>();
@Override @Override
public void initialize() { public void initialize() {
@ -36,14 +38,18 @@ public class NoiseChunkGenerator3DAddon extends TerraAddon implements EventListe
} }
public void onPackLoad(ConfigPackPreLoadEvent event) throws DuplicateEntryException { public void onPackLoad(ConfigPackPreLoadEvent event) throws DuplicateEntryException {
event.getPack().getOrCreateRegistry(ChunkGeneratorProvider.class).register("NOISE_3D", pack -> new NoiseChunkGenerator3D(pack, main)); event.getPack().getOrCreateRegistry(ChunkGeneratorProvider.class).register("NOISE_3D", pack -> new NoiseChunkGenerator3D(pack, main, this));
event.getPack().applyLoader(SlantHolder.class, new SlantHolderLoader()); event.getPack().applyLoader(SlantHolder.class, new SlantHolderLoader())
.applyLoader(PaletteHolder.class, new PaletteHolderLoader());
} }
public void onBiomeLoad(ConfigurationLoadEvent event) { public void onBiomeLoad(ConfigurationLoadEvent event) {
if(event.is(TerraBiome.class)) { if(event.is(BiomeBuilder.class)) {
TerraBiome biome = event.getLoadedObject(); palettes.put(event.getConfiguration().getID(), event.load(new BiomePaletteTemplate()).get());
palettes.put(biome, event.load(new BiomePaletteTemplate()).get());
} }
} }
public PaletteInfo getPalette(TerraBiome biome) {
return palettes.get(biome.getID());
}
} }

View File

@ -1,14 +1,15 @@
package com.dfsek.terra.addons.chunkgenerator; package com.dfsek.terra.addons.chunkgenerator;
import com.dfsek.terra.addons.chunkgenerator.palette.PaletteInfo;
import com.dfsek.terra.addons.chunkgenerator.palette.SlantHolder;
import com.dfsek.terra.api.util.MathUtil;
import com.dfsek.terra.api.world.biome.Generator; import com.dfsek.terra.api.world.biome.Generator;
import com.dfsek.terra.api.world.generator.Palette; import com.dfsek.terra.api.world.generator.Palette;
import com.dfsek.terra.api.world.generator.Sampler; import com.dfsek.terra.api.world.generator.Sampler;
public final class PaletteUtil { public final class PaletteUtil {
public static Palette getPalette(int x, int y, int z, Generator c, Sampler sampler) { public static Palette getPalette(int x, int y, int z, Generator c, Sampler sampler, PaletteInfo paletteInfo) {
SlantHolder slant = paletteInfo.getSlantHolder();
/*
SlantHolder slant = c.getSlant();
if(slant != null) { if(slant != null) {
double slope = MathUtil.derivative(sampler, x, y, z); double slope = MathUtil.derivative(sampler, x, y, z);
if(slope > slant.getMinSlope()) { if(slope > slant.getMinSlope()) {
@ -16,8 +17,6 @@ public final class PaletteUtil {
} }
} }
*/
return c.getPaletteSettings().getPalette(y); return c.getPaletteSettings().getPalette(y);
} }
} }

View File

@ -1,13 +1,17 @@
package com.dfsek.terra.addons.chunkgenerator.generation.generators; package com.dfsek.terra.addons.chunkgenerator.generation.generators;
import com.dfsek.terra.addons.chunkgenerator.NoiseChunkGenerator3DAddon;
import com.dfsek.terra.addons.chunkgenerator.PaletteUtil; import com.dfsek.terra.addons.chunkgenerator.PaletteUtil;
import com.dfsek.terra.addons.chunkgenerator.generation.math.samplers.Sampler3D; import com.dfsek.terra.addons.chunkgenerator.generation.math.samplers.Sampler3D;
import com.dfsek.terra.addons.chunkgenerator.palette.PaletteInfo;
import com.dfsek.terra.addons.chunkgenerator.palette.SlantHolder;
import com.dfsek.terra.api.TerraPlugin; import com.dfsek.terra.api.TerraPlugin;
import com.dfsek.terra.api.block.state.BlockState; import com.dfsek.terra.api.block.state.BlockState;
import com.dfsek.terra.api.block.state.properties.base.Properties; import com.dfsek.terra.api.block.state.properties.base.Properties;
import com.dfsek.terra.api.block.state.properties.enums.Direction; import com.dfsek.terra.api.block.state.properties.enums.Direction;
import com.dfsek.terra.api.config.ConfigPack; import com.dfsek.terra.api.config.ConfigPack;
import com.dfsek.terra.api.profiler.ProfileFrame; import com.dfsek.terra.api.profiler.ProfileFrame;
import com.dfsek.terra.api.util.MathUtil;
import com.dfsek.terra.api.vector.Vector3; import com.dfsek.terra.api.vector.Vector3;
import com.dfsek.terra.api.world.BiomeGrid; import com.dfsek.terra.api.world.BiomeGrid;
import com.dfsek.terra.api.world.TerraWorld; import com.dfsek.terra.api.world.TerraWorld;
@ -30,14 +34,17 @@ import java.util.Random;
public class NoiseChunkGenerator3D implements TerraChunkGenerator { public class NoiseChunkGenerator3D implements TerraChunkGenerator {
private final ConfigPack configPack; private final ConfigPack configPack;
private final TerraPlugin main; private final TerraPlugin main;
private final NoiseChunkGenerator3DAddon addon;
private final List<TerraGenerationStage> blockPopulators = new ArrayList<>(); private final List<TerraGenerationStage> blockPopulators = new ArrayList<>();
private final BlockState air; private final BlockState air;
public NoiseChunkGenerator3D(ConfigPack c, TerraPlugin main) { public NoiseChunkGenerator3D(ConfigPack c, TerraPlugin main, NoiseChunkGenerator3DAddon addon) {
this.configPack = c; this.configPack = c;
this.main = main; this.main = main;
this.air = main.getWorldHandle().air(); this.air = main.getWorldHandle().air();
this.addon = addon;
c.getStages().forEach(stage -> blockPopulators.add(stage.newInstance(c))); c.getStages().forEach(stage -> blockPopulators.add(stage.newInstance(c)));
} }
@ -88,27 +95,35 @@ public class NoiseChunkGenerator3D implements TerraChunkGenerator {
int cx = xOrig + x; int cx = xOrig + x;
int cz = zOrig + z; int cz = zOrig + z;
TerraBiome b = grid.getBiome(cx, cz); TerraBiome biome = grid.getBiome(cx, cz);
Generator g = b.getGenerator(world);
//int sea = c.getSeaLevel(); PaletteInfo paletteInfo = addon.getPalette(biome);
//Palette seaPalette = c.getOceanPalette();
if(paletteInfo == null) {
main.logger().info("null palette: " + biome.getID());
}
Generator generator = biome.getGenerator(world);
int sea = paletteInfo.getSeaLevel();
Palette seaPalette = paletteInfo.getOcean();
boolean justSet = false; boolean justSet = false;
BlockState data = null; BlockState data = null;
for(int y = world.getMaxHeight() - 1; y >= world.getMinHeight(); y--) { for(int y = world.getMaxHeight() - 1; y >= world.getMinHeight(); y--) {
if(sampler.sample(x, y, z) > 0) { if(sampler.sample(x, y, z) > 0) {
justSet = true; justSet = true;
data = PaletteUtil.getPalette(x, y, z, g, sampler).get(paletteLevel, cx, y, cz);
data = PaletteUtil.getPalette(x, y, z, generator, sampler, paletteInfo).get(paletteLevel, cx, y, cz);
chunk.setBlock(x, y, z, data); chunk.setBlock(x, y, z, data);
paletteLevel++; paletteLevel++;
} /*else if(y <= sea) { } else if(y <= sea) {
chunk.setBlock(x, y, z, seaPalette.get(sea - y, x + xOrig, y, z + zOrig)); chunk.setBlock(x, y, z, seaPalette.get(sea - y, x + xOrig, y, z + zOrig));
justSet = false; justSet = false;
paletteLevel = 0; paletteLevel = 0;
} */ else { } else {
justSet = false; justSet = false;
paletteLevel = 0; paletteLevel = 0;