Focus mode is back!

This commit is contained in:
Daniel Mills 2021-07-05 06:01:29 -04:00
parent 151f99e343
commit 83d79e23d5
4 changed files with 53 additions and 7 deletions

View File

@ -55,6 +55,7 @@ public class IrisComplex implements DataProvider
private ProceduralStream<IrisDecorator> shoreSurfaceDecoration;
private ProceduralStream<BlockData> rockStream;
private ProceduralStream<BlockData> fluidStream;
private IrisBiome focus;
public ProceduralStream<IrisBiome> 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);

View File

@ -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)
{

View File

@ -377,9 +377,8 @@ public class IrisRegion extends IrisRegistrant implements IRare
return getShoreHeightGenerator().fitDouble(shoreHeightMin, shoreHeightMax, x / shoreHeightZoom, z / shoreHeightZoom);
}
public KList<IrisBiome> getAllBiomes(DataProvider g)
public KSet<String> getAllBiomeIds()
{
KMap<String, IrisBiome> b = new KMap<>();
KSet<String> 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<IrisBiome> getAllBiomes(DataProvider g)
{
KMap<String, IrisBiome> b = new KMap<>();
KSet<String> names = getAllBiomeIds();
while(!names.isEmpty())
{
for(String i : new KList<>(names))

View File

@ -395,4 +395,6 @@ public interface Engine extends DataProvider, Fallible, GeneratorAccess, LootPro
{
return l.getBlockY() >= getMinHeight() && l.getBlockY() <= getMaxHeight();
}
IrisBiome getFocus();
}