diff --git a/src/main/java/com/volmit/iris/generator/IrisComplex.java b/src/main/java/com/volmit/iris/generator/IrisComplex.java index 1abf81f54..ce1e1580d 100644 --- a/src/main/java/com/volmit/iris/generator/IrisComplex.java +++ b/src/main/java/com/volmit/iris/generator/IrisComplex.java @@ -55,6 +55,7 @@ public class IrisComplex implements DataProvider private ProceduralStream shoreSurfaceDecoration; private ProceduralStream rockStream; private ProceduralStream fluidStream; + private IrisBiome focus; public ProceduralStream getBiomeStream(InferredType type) { @@ -86,6 +87,8 @@ public class IrisComplex implements DataProvider double height = engine.getHeight(); fluidHeight = engine.getDimension().getFluidHeight(); generators = new KList<>(); + focus = engine.getFocus(); + IrisRegion focusRegion = focus != null ? findRegion(focus, engine) : null; RNG rng = new RNG(engine.getWorld().getSeed()); //@builder engine.getDimension().getRegions().forEach((i) -> data.getRegionLoader().load(i) @@ -101,7 +104,10 @@ public class IrisComplex implements DataProvider .select(engine.getDimension().getRockPalette().getBlockData(data)); fluidStream = engine.getDimension().getFluidPalette().getLayerGenerator(rng.nextParallelRNG(78), data).stream() .select(engine.getDimension().getFluidPalette().getBlockData(data)); - regionStream = engine.getDimension().getRegionStyle().create(rng.nextParallelRNG(883)).stream() + regionStream = focusRegion != null ? + ProceduralStream.of((x,z) -> focusRegion, + Interpolated.of(a -> 0D, a -> focusRegion)) + : engine.getDimension().getRegionStyle().create(rng.nextParallelRNG(883)).stream() .zoom(engine.getDimension().getRegionZoom()) .selectRarity(engine.getDimension().getRegions()) .convertCached((s) -> data.getRegionLoader().load(s)).cache2D(cacheSize); @@ -143,13 +149,18 @@ public class IrisComplex implements DataProvider .convertCached((s) -> data.getBiomeLoader().load(s) .setInferredType(InferredType.SHORE)) ).convertAware2D(ProceduralStream::get).cache2D(cacheSize); - bridgeStream = engine.getDimension().getContinentalStyle().create(rng.nextParallelRNG(234234565)).bake().scale(1D / engine.getDimension().getContinentZoom()).bake().stream() + bridgeStream = focus != null ? ProceduralStream.of((x,z)->focus.getInferredType(), + Interpolated.of(a -> 0D, a -> focus.getInferredType())) : + engine.getDimension().getContinentalStyle().create(rng.nextParallelRNG(234234565)) + .bake().scale(1D / engine.getDimension().getContinentZoom()).bake().stream() .convert((v) -> v >= engine.getDimension().getLandChance() ? InferredType.SEA : InferredType.LAND); - baseBiomeStream = bridgeStream.convertAware2D((t, x, z) -> t.equals(InferredType.SEA) + baseBiomeStream = focus != null ? ProceduralStream.of((x,z) -> focus, + Interpolated.of(a -> 0D, a -> focus)) : + bridgeStream.convertAware2D((t, x, z) -> t.equals(InferredType.SEA) ? seaBiomeStream.get(x, z) : landBiomeStream.get(x, z)) .convertAware2D(this::implode).cache2D(cacheSize); heightStream = ProceduralStream.of((x, z) -> { - IrisBiome b = baseBiomeStream.get(x, z); + IrisBiome b = focus != null ? focus : baseBiomeStream.get(x, z); return getHeight(engine, b, x, z, engine.getWorld().getSeed()); }, Interpolated.DOUBLE).cache2D(cacheSize); slopeStream = heightStream.slope(3).interpolate().bilinear(3, 3).cache2D(cacheSize); @@ -159,7 +170,9 @@ public class IrisComplex implements DataProvider -> str.set(Math.min(str.get(), i.getObjectChanceModifier(x, z)))); return str.get(); }); - trueBiomeStream = heightStream + + trueBiomeStream = focus != null ? ProceduralStream.of((x,y) -> focus, Interpolated.of(a -> 0D, + b -> focus)) : heightStream .convertAware2D((h, x, z) -> fixBiomeType(h, baseBiomeStream.get(x, z), regionStream.get(x, z), x, z, fluidHeight)).cache2D(cacheSize); @@ -221,6 +234,18 @@ public class IrisComplex implements DataProvider //@done } + private IrisRegion findRegion(IrisBiome focus, Engine engine) { + for(IrisRegion i : engine.getDimension().getAllRegions(engine)) + { + if(i.getAllBiomeIds().contains(focus.getLoadKey())) + { + return i; + } + } + + return null; + } + private IrisDecorator decorateFor(IrisBiome b, double x, double z, DecorationPart part) { RNG rngc = chunkRngStream.get(x, z); diff --git a/src/main/java/com/volmit/iris/generator/IrisEngine.java b/src/main/java/com/volmit/iris/generator/IrisEngine.java index 5cc809562..37bfa0117 100644 --- a/src/main/java/com/volmit/iris/generator/IrisEngine.java +++ b/src/main/java/com/volmit/iris/generator/IrisEngine.java @@ -1,6 +1,8 @@ package com.volmit.iris.generator; import com.volmit.iris.Iris; +import com.volmit.iris.object.IrisBiome; +import com.volmit.iris.scaffold.cache.AtomicCache; import com.volmit.iris.scaffold.engine.*; import com.volmit.iris.scaffold.hunk.Hunk; import com.volmit.iris.util.J; @@ -122,6 +124,16 @@ public class IrisEngine extends BlockPopulator implements Engine } } + @Override + public IrisBiome getFocus() { + if(getDimension().getFocus() == null || getDimension().getFocus().trim().isEmpty()) + { + return null; + } + + return getData().getBiomeLoader().load(getDimension().getFocus()); + } + @Override public void populate(@NotNull World world, @NotNull Random random, @NotNull Chunk c) { diff --git a/src/main/java/com/volmit/iris/object/IrisRegion.java b/src/main/java/com/volmit/iris/object/IrisRegion.java index fc7791d8e..8a6be0807 100644 --- a/src/main/java/com/volmit/iris/object/IrisRegion.java +++ b/src/main/java/com/volmit/iris/object/IrisRegion.java @@ -377,9 +377,8 @@ public class IrisRegion extends IrisRegistrant implements IRare return getShoreHeightGenerator().fitDouble(shoreHeightMin, shoreHeightMax, x / shoreHeightZoom, z / shoreHeightZoom); } - public KList getAllBiomes(DataProvider g) + public KSet getAllBiomeIds() { - KMap b = new KMap<>(); KSet names = new KSet<>(); names.addAll(landBiomes); names.addAll(caveBiomes); @@ -390,6 +389,14 @@ public class IrisRegion extends IrisRegistrant implements IRare spotBiomes.forEach((i) -> names.add(i.getBiome())); ridgeBiomes.forEach((i) -> names.add(i.getBiome())); + return names; + } + + public KList getAllBiomes(DataProvider g) + { + KMap b = new KMap<>(); + KSet names = getAllBiomeIds(); + while(!names.isEmpty()) { for(String i : new KList<>(names)) diff --git a/src/main/java/com/volmit/iris/scaffold/engine/Engine.java b/src/main/java/com/volmit/iris/scaffold/engine/Engine.java index fa975f4f0..eb0a9656a 100644 --- a/src/main/java/com/volmit/iris/scaffold/engine/Engine.java +++ b/src/main/java/com/volmit/iris/scaffold/engine/Engine.java @@ -395,4 +395,6 @@ public interface Engine extends DataProvider, Fallible, GeneratorAccess, LootPro { return l.getBlockY() >= getMinHeight() && l.getBlockY() <= getMaxHeight(); } + + IrisBiome getFocus(); }