mirror of
https://github.com/VolmitSoftware/Iris.git
synced 2025-07-18 18:23:06 +00:00
More complex streams
This commit is contained in:
parent
59eda04949
commit
4d352b231c
@ -9,12 +9,15 @@ import com.volmit.iris.gen.v2.scaffold.layer.ProceduralStream;
|
|||||||
import com.volmit.iris.gen.v2.scaffold.stream.Interpolated;
|
import com.volmit.iris.gen.v2.scaffold.stream.Interpolated;
|
||||||
import com.volmit.iris.manager.IrisDataManager;
|
import com.volmit.iris.manager.IrisDataManager;
|
||||||
import com.volmit.iris.noise.CNG;
|
import com.volmit.iris.noise.CNG;
|
||||||
|
import com.volmit.iris.object.DecorationPart;
|
||||||
import com.volmit.iris.object.InferredType;
|
import com.volmit.iris.object.InferredType;
|
||||||
import com.volmit.iris.object.IrisBiome;
|
import com.volmit.iris.object.IrisBiome;
|
||||||
|
import com.volmit.iris.object.IrisDecorator;
|
||||||
import com.volmit.iris.object.IrisBiomePaletteLayer;
|
import com.volmit.iris.object.IrisBiomePaletteLayer;
|
||||||
import com.volmit.iris.object.IrisDimension;
|
import com.volmit.iris.object.IrisDimension;
|
||||||
import com.volmit.iris.object.IrisGenerator;
|
import com.volmit.iris.object.IrisGenerator;
|
||||||
import com.volmit.iris.object.IrisRegion;
|
import com.volmit.iris.object.IrisRegion;
|
||||||
|
import com.volmit.iris.util.FastBlockData;
|
||||||
import com.volmit.iris.util.KList;
|
import com.volmit.iris.util.KList;
|
||||||
import com.volmit.iris.util.M;
|
import com.volmit.iris.util.M;
|
||||||
import com.volmit.iris.util.RNG;
|
import com.volmit.iris.util.RNG;
|
||||||
@ -25,6 +28,7 @@ import lombok.Data;
|
|||||||
public class IrisComplex implements DataProvider
|
public class IrisComplex implements DataProvider
|
||||||
{
|
{
|
||||||
private RNG rng;
|
private RNG rng;
|
||||||
|
private double fluidHeight;
|
||||||
private IrisDataManager data;
|
private IrisDataManager data;
|
||||||
private KList<IrisGenerator> generators;
|
private KList<IrisGenerator> generators;
|
||||||
private static final BlockData AIR = Material.AIR.createBlockData();
|
private static final BlockData AIR = Material.AIR.createBlockData();
|
||||||
@ -41,6 +45,12 @@ public class IrisComplex implements DataProvider
|
|||||||
private ProceduralStream<Double> maxHeightStream;
|
private ProceduralStream<Double> maxHeightStream;
|
||||||
private ProceduralStream<Double> overlayStream;
|
private ProceduralStream<Double> overlayStream;
|
||||||
private ProceduralStream<Double> heightFluidStream;
|
private ProceduralStream<Double> heightFluidStream;
|
||||||
|
private ProceduralStream<RNG> rngStream;
|
||||||
|
private ProceduralStream<RNG> chunkRngStream;
|
||||||
|
private ProceduralStream<IrisDecorator> terrainSurfaceDecoration;
|
||||||
|
private ProceduralStream<IrisDecorator> terrainCeilingDecoration;
|
||||||
|
private ProceduralStream<IrisDecorator> seaSurfaceDecoration;
|
||||||
|
private ProceduralStream<IrisDecorator> shoreSurfaceDecoration;
|
||||||
private ProceduralStream<BlockData> terrainStream;
|
private ProceduralStream<BlockData> terrainStream;
|
||||||
private ProceduralStream<BlockData> rockStream;
|
private ProceduralStream<BlockData> rockStream;
|
||||||
private ProceduralStream<BlockData> fluidStream;
|
private ProceduralStream<BlockData> fluidStream;
|
||||||
@ -79,7 +89,7 @@ public class IrisComplex implements DataProvider
|
|||||||
{
|
{
|
||||||
this.rng = new RNG(seed);
|
this.rng = new RNG(seed);
|
||||||
this.data = data;
|
this.data = data;
|
||||||
double fluidHeight = dimension.getFluidHeight();
|
fluidHeight = dimension.getFluidHeight();
|
||||||
generators = new KList<>();
|
generators = new KList<>();
|
||||||
RNG rng = new RNG(seed);
|
RNG rng = new RNG(seed);
|
||||||
//@builder
|
//@builder
|
||||||
@ -89,6 +99,9 @@ public class IrisComplex implements DataProvider
|
|||||||
.forEach((c) -> registerGenerator(c.getCachedGenerator(this)))));
|
.forEach((c) -> registerGenerator(c.getCachedGenerator(this)))));
|
||||||
overlayStream = ProceduralStream.ofDouble((x, z) -> 0D);
|
overlayStream = ProceduralStream.ofDouble((x, z) -> 0D);
|
||||||
dimension.getOverlayNoise().forEach((i) -> overlayStream.add((x, z) -> i.get(rng, x, z)));
|
dimension.getOverlayNoise().forEach((i) -> overlayStream.add((x, z) -> i.get(rng, x, z)));
|
||||||
|
rngStream = ProceduralStream.of((x, z) -> new RNG(((x.longValue()) << 32) | (z.longValue() & 0xffffffffL)).nextParallelRNG(seed), Interpolated.RNG)
|
||||||
|
.cache2D(64);
|
||||||
|
chunkRngStream = rngStream.blockToChunkCoords();
|
||||||
rockStream = dimension.getRockPalette().getLayerGenerator(rng.nextRNG(), data).stream()
|
rockStream = dimension.getRockPalette().getLayerGenerator(rng.nextRNG(), data).stream()
|
||||||
.select(dimension.getRockPalette().getBlockData(data))
|
.select(dimension.getRockPalette().getBlockData(data))
|
||||||
.convert((v) -> v.getBlockData());
|
.convert((v) -> v.getBlockData());
|
||||||
@ -150,50 +163,71 @@ public class IrisComplex implements DataProvider
|
|||||||
trueBiomeDerivativeStream = trueBiomeStream.convert((b) -> b.getDerivative());
|
trueBiomeDerivativeStream = trueBiomeStream.convert((b) -> b.getDerivative());
|
||||||
heightFluidStream = heightStream.max(fluidHeight);
|
heightFluidStream = heightStream.max(fluidHeight);
|
||||||
maxHeightStream = ProceduralStream.ofDouble((x, z) -> 255D);
|
maxHeightStream = ProceduralStream.ofDouble((x, z) -> 255D);
|
||||||
terrainStream = ProceduralStream.of((x, y, z) -> {
|
terrainSurfaceDecoration = trueBiomeStream
|
||||||
double height = heightStream.get(x, z);
|
.convertAware2D((b, xx,zz) -> decorateFor(b, xx, zz, DecorationPart.NONE));
|
||||||
IrisBiome biome = trueBiomeStream.get(x, z);
|
terrainCeilingDecoration = trueBiomeStream
|
||||||
int depth = (int) (Math.round(height) - y);
|
.convertAware2D((b, xx,zz) -> decorateFor(b, xx, zz, DecorationPart.CEILING));
|
||||||
int atDepth = 0;
|
shoreSurfaceDecoration = trueBiomeStream
|
||||||
|
.convertAware2D((b, xx,zz) -> decorateFor(b, xx, zz, DecorationPart.SHORE_LINE));
|
||||||
if(y > height && y <= fluidHeight)
|
seaSurfaceDecoration = trueBiomeStream
|
||||||
{
|
.convertAware2D((b, xx,zz) -> decorateFor(b, xx, zz, DecorationPart.SEA_SURFACE));
|
||||||
return fluidStream.get(x, y, z);
|
terrainStream = ProceduralStream.of(this::fillTerrain, Interpolated.BLOCK_DATA);
|
||||||
}
|
//@done
|
||||||
|
}
|
||||||
if(depth < -1)
|
|
||||||
{
|
private BlockData fillTerrain(Double x, Double y, Double z)
|
||||||
return AIR;
|
{
|
||||||
}
|
double height = heightStream.get(x, z);
|
||||||
|
IrisBiome biome = trueBiomeStream.get(x, z);
|
||||||
for(IrisBiomePaletteLayer i : biome.getLayers())
|
int depth = (int) (Math.round(height) - y);
|
||||||
{
|
int atDepth = 0;
|
||||||
int th = i.getHeightGenerator(rng, data).fit(i.getMinHeight(), i.getMaxHeight(), x, z);
|
|
||||||
|
if(y > height && y <= fluidHeight)
|
||||||
if(atDepth + th >= depth)
|
|
||||||
{
|
|
||||||
return i.get(rng, x, y, z, data).getBlockData();
|
|
||||||
}
|
|
||||||
|
|
||||||
atDepth += th;
|
|
||||||
}
|
|
||||||
|
|
||||||
return rockStream.get(x, y, z);
|
|
||||||
}, new Interpolated<BlockData>()
|
|
||||||
{
|
{
|
||||||
@Override
|
return fluidStream.get(x, y, z);
|
||||||
public double toDouble(BlockData t)
|
}
|
||||||
|
|
||||||
|
if(depth < -1)
|
||||||
|
{
|
||||||
|
return AIR;
|
||||||
|
}
|
||||||
|
|
||||||
|
for(IrisBiomePaletteLayer i : biome.getLayers())
|
||||||
|
{
|
||||||
|
int th = i.getHeightGenerator(rng, data).fit(i.getMinHeight(), i.getMaxHeight(), x, z);
|
||||||
|
|
||||||
|
if(atDepth + th >= depth)
|
||||||
{
|
{
|
||||||
return 0;
|
return i.get(rng, x, y, z, data).getBlockData();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
atDepth += th;
|
||||||
public BlockData fromDouble(double d)
|
}
|
||||||
|
|
||||||
|
return rockStream.get(x, y, z);
|
||||||
|
}
|
||||||
|
|
||||||
|
private IrisDecorator decorateFor(IrisBiome b, double x, double z, DecorationPart part)
|
||||||
|
{
|
||||||
|
RNG rngc = chunkRngStream.get(x, z);
|
||||||
|
|
||||||
|
for(IrisDecorator i : b.getDecorators())
|
||||||
|
{
|
||||||
|
if(!i.getPartOf().equals(part))
|
||||||
{
|
{
|
||||||
return null;
|
continue;
|
||||||
}
|
}
|
||||||
});
|
|
||||||
//@done
|
FastBlockData block = i.getBlockData(b, rngc, x, z, data);
|
||||||
|
|
||||||
|
if(block != null)
|
||||||
|
{
|
||||||
|
Iris.info("DECO AT " + x + " " + z);
|
||||||
|
return i;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
private IrisBiome implode(IrisBiome b, Double x, Double z)
|
private IrisBiome implode(IrisBiome b, Double x, Double z)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user