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<IrisDecorator> shoreSurfaceDecoration;
private ProceduralStream<BlockData> rockStream; private ProceduralStream<BlockData> rockStream;
private ProceduralStream<BlockData> fluidStream; private ProceduralStream<BlockData> fluidStream;
private IrisBiome focus;
public ProceduralStream<IrisBiome> getBiomeStream(InferredType type) public ProceduralStream<IrisBiome> getBiomeStream(InferredType type)
{ {
@ -86,6 +87,8 @@ public class IrisComplex implements DataProvider
double height = engine.getHeight(); double height = engine.getHeight();
fluidHeight = engine.getDimension().getFluidHeight(); fluidHeight = engine.getDimension().getFluidHeight();
generators = new KList<>(); generators = new KList<>();
focus = engine.getFocus();
IrisRegion focusRegion = focus != null ? findRegion(focus, engine) : null;
RNG rng = new RNG(engine.getWorld().getSeed()); RNG rng = new RNG(engine.getWorld().getSeed());
//@builder //@builder
engine.getDimension().getRegions().forEach((i) -> data.getRegionLoader().load(i) engine.getDimension().getRegions().forEach((i) -> data.getRegionLoader().load(i)
@ -101,7 +104,10 @@ public class IrisComplex implements DataProvider
.select(engine.getDimension().getRockPalette().getBlockData(data)); .select(engine.getDimension().getRockPalette().getBlockData(data));
fluidStream = engine.getDimension().getFluidPalette().getLayerGenerator(rng.nextParallelRNG(78), data).stream() fluidStream = engine.getDimension().getFluidPalette().getLayerGenerator(rng.nextParallelRNG(78), data).stream()
.select(engine.getDimension().getFluidPalette().getBlockData(data)); .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()) .zoom(engine.getDimension().getRegionZoom())
.selectRarity(engine.getDimension().getRegions()) .selectRarity(engine.getDimension().getRegions())
.convertCached((s) -> data.getRegionLoader().load(s)).cache2D(cacheSize); .convertCached((s) -> data.getRegionLoader().load(s)).cache2D(cacheSize);
@ -143,13 +149,18 @@ public class IrisComplex implements DataProvider
.convertCached((s) -> data.getBiomeLoader().load(s) .convertCached((s) -> data.getBiomeLoader().load(s)
.setInferredType(InferredType.SHORE)) .setInferredType(InferredType.SHORE))
).convertAware2D(ProceduralStream::get).cache2D(cacheSize); ).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); .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)) ? seaBiomeStream.get(x, z) : landBiomeStream.get(x, z))
.convertAware2D(this::implode).cache2D(cacheSize); .convertAware2D(this::implode).cache2D(cacheSize);
heightStream = ProceduralStream.of((x, z) -> { 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()); return getHeight(engine, b, x, z, engine.getWorld().getSeed());
}, Interpolated.DOUBLE).cache2D(cacheSize); }, Interpolated.DOUBLE).cache2D(cacheSize);
slopeStream = heightStream.slope(3).interpolate().bilinear(3, 3).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)))); -> str.set(Math.min(str.get(), i.getObjectChanceModifier(x, z))));
return str.get(); return str.get();
}); });
trueBiomeStream = heightStream
trueBiomeStream = focus != null ? ProceduralStream.of((x,y) -> focus, Interpolated.of(a -> 0D,
b -> focus)) : heightStream
.convertAware2D((h, x, z) -> .convertAware2D((h, x, z) ->
fixBiomeType(h, baseBiomeStream.get(x, z), fixBiomeType(h, baseBiomeStream.get(x, z),
regionStream.get(x, z), x, z, fluidHeight)).cache2D(cacheSize); regionStream.get(x, z), x, z, fluidHeight)).cache2D(cacheSize);
@ -221,6 +234,18 @@ public class IrisComplex implements DataProvider
//@done //@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) private IrisDecorator decorateFor(IrisBiome b, double x, double z, DecorationPart part)
{ {
RNG rngc = chunkRngStream.get(x, z); RNG rngc = chunkRngStream.get(x, z);

View File

@ -1,6 +1,8 @@
package com.volmit.iris.generator; package com.volmit.iris.generator;
import com.volmit.iris.Iris; 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.engine.*;
import com.volmit.iris.scaffold.hunk.Hunk; import com.volmit.iris.scaffold.hunk.Hunk;
import com.volmit.iris.util.J; 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 @Override
public void populate(@NotNull World world, @NotNull Random random, @NotNull Chunk c) 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); 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<>(); KSet<String> names = new KSet<>();
names.addAll(landBiomes); names.addAll(landBiomes);
names.addAll(caveBiomes); names.addAll(caveBiomes);
@ -390,6 +389,14 @@ public class IrisRegion extends IrisRegistrant implements IRare
spotBiomes.forEach((i) -> names.add(i.getBiome())); spotBiomes.forEach((i) -> names.add(i.getBiome()));
ridgeBiomes.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()) while(!names.isEmpty())
{ {
for(String i : new KList<>(names)) 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(); return l.getBlockY() >= getMinHeight() && l.getBlockY() <= getMaxHeight();
} }
IrisBiome getFocus();
} }