package com.volmit.iris.object; import org.bukkit.block.data.BlockData; import com.volmit.iris.gen.atomics.AtomicCache; import com.volmit.iris.noise.CNG; import com.volmit.iris.util.ArrayType; import com.volmit.iris.util.B; import com.volmit.iris.util.Desc; import com.volmit.iris.util.DontObfuscate; import com.volmit.iris.util.KList; import com.volmit.iris.util.MaxNumber; import com.volmit.iris.util.MinNumber; import com.volmit.iris.util.RNG; import com.volmit.iris.util.Required; import lombok.Data; @Desc("A layer of surface / subsurface material in biomes") @Data public class IrisBiomePaletteLayer { @DontObfuscate @Desc("The style of noise") private NoiseStyle style = NoiseStyle.STATIC; @MinNumber(0) @MaxNumber(256) @DontObfuscate @Desc("The min thickness of this layer") private int minHeight = 1; @MinNumber(1) @MaxNumber(256) @DontObfuscate @Desc("The max thickness of this layer") private int maxHeight = 1; @MinNumber(0.0001) @DontObfuscate @Desc("The terrain zoom mostly for zooming in on a wispy palette") private double zoom = 5; @Required @ArrayType(min = 1, type = String.class) @DontObfuscate @Desc("The palette of blocks to be used in this layer") private KList palette = new KList().qadd("GRASS_BLOCK"); private transient AtomicCache> blockData = new AtomicCache<>(); private transient AtomicCache layerGenerator = new AtomicCache<>(); private transient AtomicCache heightGenerator = new AtomicCache<>(); public CNG getHeightGenerator(RNG rng) { return heightGenerator.aquire(() -> CNG.signature(rng.nextParallelRNG(minHeight * maxHeight + getBlockData().size()))); } public BlockData get(RNG rng, double x, double y, double z) { if(getBlockData().isEmpty()) { return null; } if(getBlockData().size() == 1) { return getBlockData().get(0); } return getLayerGenerator(rng).fit(getBlockData(), x, y, z); } public CNG getLayerGenerator(RNG rng) { return layerGenerator.aquire(() -> { RNG rngx = rng.nextParallelRNG(minHeight + maxHeight + getBlockData().size()); return style.create(rngx); }); } public KList add(String b) { palette.add(b); return palette; } public KList getBlockData() { return blockData.aquire(() -> { KList blockData = new KList<>(); for(String ix : palette) { BlockData bx = B.getBlockData(ix); if(bx != null) { blockData.add(bx); } } return blockData; }); } public IrisBiomePaletteLayer zero() { palette.clear(); return this; } }