This commit is contained in:
Daniel Mills 2020-10-24 03:44:45 -04:00
parent ed40dc34cf
commit 27694036a5
13 changed files with 168 additions and 67 deletions

View File

@ -31,6 +31,7 @@ import com.volmit.iris.gen.scaffold.Provisioned;
import com.volmit.iris.gen.scaffold.TerrainChunk; import com.volmit.iris.gen.scaffold.TerrainChunk;
import com.volmit.iris.gen.scaffold.TerrainProvider; import com.volmit.iris.gen.scaffold.TerrainProvider;
import com.volmit.iris.gen.scaffold.TerrainTarget; import com.volmit.iris.gen.scaffold.TerrainTarget;
import com.volmit.iris.gen.v2.DataProvider;
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.IrisBiome; import com.volmit.iris.object.IrisBiome;
@ -54,7 +55,7 @@ import lombok.EqualsAndHashCode;
@Data @Data
@EqualsAndHashCode(callSuper = false) @EqualsAndHashCode(callSuper = false)
public abstract class ContextualTerrainProvider implements TerrainProvider, Listener public abstract class ContextualTerrainProvider implements TerrainProvider, Listener, DataProvider
{ {
private Provisioned provisioner; private Provisioned provisioner;
private KList<BlockPosition> noLoot; private KList<BlockPosition> noLoot;

View File

@ -0,0 +1,8 @@
package com.volmit.iris.gen.v2;
import com.volmit.iris.manager.IrisDataManager;
public interface DataProvider
{
public IrisDataManager getData();
}

View File

@ -1,25 +1,31 @@
package com.volmit.iris.gen.v2; package com.volmit.iris.gen.v2;
import com.volmit.iris.Iris;
import com.volmit.iris.gen.v2.scaffold.layer.ProceduralStream; import com.volmit.iris.gen.v2.scaffold.layer.ProceduralStream;
import com.volmit.iris.manager.IrisDataManager; import com.volmit.iris.manager.IrisDataManager;
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.IrisBiomeGeneratorLink;
import com.volmit.iris.object.IrisDimension; import com.volmit.iris.object.IrisDimension;
import com.volmit.iris.object.IrisRegion; import com.volmit.iris.object.IrisRegion;
import com.volmit.iris.object.NoiseStyle; import com.volmit.iris.object.NoiseStyle;
import com.volmit.iris.util.M;
import com.volmit.iris.util.RNG; import com.volmit.iris.util.RNG;
import lombok.Data; import lombok.Data;
@Data @Data
public class IrisComplex public class IrisComplex implements DataProvider
{ {
private IrisDataManager data;
private ProceduralStream<IrisRegion> regionStream; private ProceduralStream<IrisRegion> regionStream;
private ProceduralStream<InferredType> bridgeStream; private ProceduralStream<InferredType> bridgeStream;
private ProceduralStream<IrisBiome> landBiomeStream; private ProceduralStream<IrisBiome> landBiomeStream;
private ProceduralStream<IrisBiome> seaBiomeStream; private ProceduralStream<IrisBiome> seaBiomeStream;
private ProceduralStream<IrisBiome> shoreBiomeStream; private ProceduralStream<IrisBiome> shoreBiomeStream;
private ProceduralStream<IrisBiome> baseBiomeStream; private ProceduralStream<IrisBiome> baseBiomeStream;
private ProceduralStream<Double> heightStream;
private ProceduralStream<Double> heightMinStream;
public IrisComplex() public IrisComplex()
{ {
@ -53,6 +59,7 @@ public class IrisComplex
public void flash(long seed, IrisDimension dimension, IrisDataManager data) public void flash(long seed, IrisDimension dimension, IrisDataManager data)
{ {
this.data = data;
RNG rng = new RNG(seed); RNG rng = new RNG(seed);
//@builder //@builder
regionStream = NoiseStyle.CELLULAR.stream(rng.nextRNG()) regionStream = NoiseStyle.CELLULAR.stream(rng.nextRNG())
@ -81,6 +88,25 @@ public class IrisComplex
.convert((v) -> v >= dimension.getLandChance() ? InferredType.SEA : InferredType.LAND); .convert((v) -> v >= dimension.getLandChance() ? InferredType.SEA : InferredType.LAND);
baseBiomeStream = bridgeStream.convertAware2D((t, x, z) -> t.equals(InferredType.SEA) baseBiomeStream = 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));
heightStream = baseBiomeStream.convertAware2D((b, x, z) -> {
double h = 0;
for(IrisBiomeGeneratorLink i : b.getGenerators())
{
// TODO Use gen interp ..... or
// try trilerp again....
try
{
h += i.getHeight(this, x, z, seed);
}
catch(Throwable e)
{
e.printStackTrace();
}
}
return h+63;
}).forceDouble().interpolate().starcast9(12).into().bihermite(4, 0.01, 0);
//@done //@done
} }
} }

View File

@ -1,34 +0,0 @@
package com.volmit.iris.gen.v2;
import org.bukkit.block.Biome;
import org.bukkit.block.data.BlockData;
import com.volmit.iris.gen.v2.scaffold.Hunk;
import com.volmit.iris.manager.IrisDataManager;
import com.volmit.iris.object.IrisDimension;
import com.volmit.iris.util.RNG;
public class IrisGenerator
{
private long seed;
private IrisDataManager data;
private IrisDimension dimension;
private IrisComplex complex;
public IrisGenerator(long seed, IrisDimension dimension, IrisDataManager data)
{
this.seed = seed;
flash();
}
public void flash()
{
complex.flash(seed, dimension, data);
}
public void generate(int x, int z, Hunk<BlockData> blocks, Hunk<Biome> biomes)
{
RNG rng = new RNG((((long) x) << 32) | (z & 0xffffffffL));
}
}

View File

@ -0,0 +1,51 @@
package com.volmit.iris.gen.v2;
import org.bukkit.Material;
import org.bukkit.block.Biome;
import org.bukkit.block.data.BlockData;
import com.volmit.iris.gen.v2.scaffold.Hunk;
import com.volmit.iris.gen.v2.scaffold.layer.ProceduralStream;
import com.volmit.iris.manager.IrisDataManager;
import com.volmit.iris.object.IrisDimension;
import com.volmit.iris.object.NoiseStyle;
import com.volmit.iris.util.RNG;
public class IrisTerrainGenerator
{
private long seed;
private IrisDataManager data;
private IrisDimension dimension;
private IrisComplex complex;
public IrisTerrainGenerator(long seed, IrisDimension dimension, IrisDataManager data)
{
this.seed = seed;
complex = new IrisComplex();
this.data = data;
this.dimension = dimension;
flash();
}
public void flash()
{
complex.flash(seed, dimension, data);
}
public ProceduralStream<Double> height = NoiseStyle.CELLULAR
.stream(69)
.fit(1, 69)
.interpolate().starcast9(4).into().bilinear(4)
;
public ProceduralStream<BlockData> rock = NoiseStyle.STATIC
.stream(88)
.select(Material.STONE, Material.ANDESITE)
.convertCached((mat) -> mat.createBlockData());
public void generate(int x, int z, Hunk<BlockData> blocks, Hunk<Biome> biomes)
{
RNG rng = new RNG((((long) x) << 32) | (z & 0xffffffffL));
complex.getHeightStream().fill2D(blocks, x * 16, z * 16, Material.STONE.createBlockData());
}
}

View File

@ -12,6 +12,7 @@ import org.bukkit.block.data.BlockData;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.bukkit.generator.ChunkGenerator; import org.bukkit.generator.ChunkGenerator;
import com.volmit.iris.Iris;
import com.volmit.iris.gen.v2.scaffold.Hunk; import com.volmit.iris.gen.v2.scaffold.Hunk;
import com.volmit.iris.gen.v2.scaffold.layer.ProceduralStream; import com.volmit.iris.gen.v2.scaffold.layer.ProceduralStream;
import com.volmit.iris.object.NoiseStyle; import com.volmit.iris.object.NoiseStyle;
@ -22,27 +23,13 @@ public class TestGen
{ {
p.teleport(new WorldCreator("t/" + UUID.randomUUID().toString()).generator(new ChunkGenerator() p.teleport(new WorldCreator("t/" + UUID.randomUUID().toString()).generator(new ChunkGenerator()
{ {
//@builder IrisTerrainGenerator tg = new IrisTerrainGenerator(1337, Iris.globaldata.getDimensionLoader().load("overworld"), Iris.globaldata);
ProceduralStream<BlockData> rock = NoiseStyle.STATIC.stream(1337)
.select(new Material[] {
Material.STONE,
Material.ANDESITE
}).convertCached((m) -> m.createBlockData());
ProceduralStream<Double> terrain = NoiseStyle.CELLULAR.stream(1337)
.fit(1, 32)
.zoom(1.75)
.interpolate().bilinear(4)
.into().starcast(4, 9);
//@done
@Override @Override
public ChunkData generateChunkData(World world, Random random, int x, int z, BiomeGrid biome) public ChunkData generateChunkData(World world, Random random, int x, int z, BiomeGrid biome)
{ {
ChunkData c = createChunkData(world); ChunkData c = createChunkData(world);
Hunk<BlockData> data = Hunk.view(c); tg.generate(x, z, Hunk.view(c), null);
terrain.fill2D(data, x * 16, z * 16, rock);
return c; return c;
} }
}).createWorld().getSpawnLocation()); }).createWorld().getSpawnLocation());

View File

@ -11,6 +11,7 @@ import com.volmit.iris.gen.v2.scaffold.stream.CachedStream2D;
import com.volmit.iris.gen.v2.scaffold.stream.ClampedStream; import com.volmit.iris.gen.v2.scaffold.stream.ClampedStream;
import com.volmit.iris.gen.v2.scaffold.stream.ConversionStream; import com.volmit.iris.gen.v2.scaffold.stream.ConversionStream;
import com.volmit.iris.gen.v2.scaffold.stream.FittedStream; import com.volmit.iris.gen.v2.scaffold.stream.FittedStream;
import com.volmit.iris.gen.v2.scaffold.stream.ForceDoubleStream;
import com.volmit.iris.gen.v2.scaffold.stream.Interpolated; import com.volmit.iris.gen.v2.scaffold.stream.Interpolated;
import com.volmit.iris.gen.v2.scaffold.stream.OffsetStream; import com.volmit.iris.gen.v2.scaffold.stream.OffsetStream;
import com.volmit.iris.gen.v2.scaffold.stream.RoundingStream; import com.volmit.iris.gen.v2.scaffold.stream.RoundingStream;
@ -26,6 +27,11 @@ public interface ProceduralStream<T> extends ProceduralLayer, Interpolated<T>
return new RoundingStream(this); return new RoundingStream(this);
} }
default ProceduralStream<T> forceDouble()
{
return new ForceDoubleStream<T>(this);
}
default ProceduralStream<T> cache2D(int maxSize) default ProceduralStream<T> cache2D(int maxSize)
{ {
return new CachedStream2D<T>(this, maxSize); return new CachedStream2D<T>(this, maxSize);
@ -115,7 +121,7 @@ public interface ProceduralStream<T> extends ProceduralLayer, Interpolated<T>
} }
} }
default <V> void fillUp2D(Hunk<V> h, double x, double z, V v) default <V> void fill2D(Hunk<V> h, double x, double z, V v)
{ {
for(int i = 0; i < h.getWidth(); i++) for(int i = 0; i < h.getWidth(); i++)
{ {
@ -131,7 +137,7 @@ public interface ProceduralStream<T> extends ProceduralLayer, Interpolated<T>
} }
} }
default <V> void fillUp3D(Hunk<V> h, double x, int y, double z, V v) default <V> void fill3D(Hunk<V> h, double x, int y, double z, V v)
{ {
for(int i = 0; i < h.getWidth(); i++) for(int i = 0; i < h.getWidth(); i++)
{ {

View File

@ -19,6 +19,11 @@ public class AwareConversionStream2D<T, V> extends BasicLayer implements Procedu
@Override @Override
public double toDouble(V t) public double toDouble(V t)
{ {
if(t instanceof Double)
{
return (double) t;
}
return 0; return 0;
} }

View File

@ -19,6 +19,11 @@ public class AwareConversionStream3D<T, V> extends BasicLayer implements Procedu
@Override @Override
public double toDouble(V t) public double toDouble(V t)
{ {
if(t instanceof Double)
{
return (double) t;
}
return 0; return 0;
} }

View File

@ -20,6 +20,11 @@ public class ConversionStream<T, V> extends BasicLayer implements ProceduralStre
@Override @Override
public double toDouble(V t) public double toDouble(V t)
{ {
if(t instanceof Double)
{
return (double) t;
}
return 0; return 0;
} }

View File

@ -0,0 +1,41 @@
package com.volmit.iris.gen.v2.scaffold.stream;
import com.volmit.iris.gen.v2.scaffold.layer.BasicLayer;
import com.volmit.iris.gen.v2.scaffold.layer.ProceduralStream;
public class ForceDoubleStream<T> extends BasicLayer implements ProceduralStream<T>
{
private final ProceduralStream<T> stream;
public ForceDoubleStream(ProceduralStream<T> stream)
{
super();
this.stream = stream;
}
@Override
public double toDouble(T t)
{
return (double) t;
}
@SuppressWarnings("unchecked")
@Override
public T fromDouble(double d)
{
return (T) Double.valueOf(d);
}
@Override
public T get(double x, double z)
{
return stream.get(x, z);
}
@Override
public T get(double x, double y, double z)
{
return stream.get(x, y, z);
}
}

View File

@ -1,8 +1,8 @@
package com.volmit.iris.object; package com.volmit.iris.object;
import com.volmit.iris.Iris; import com.volmit.iris.Iris;
import com.volmit.iris.gen.ContextualTerrainProvider;
import com.volmit.iris.gen.atomics.AtomicCache; import com.volmit.iris.gen.atomics.AtomicCache;
import com.volmit.iris.gen.v2.DataProvider;
import com.volmit.iris.util.DependsOn; import com.volmit.iris.util.DependsOn;
import com.volmit.iris.util.Desc; import com.volmit.iris.util.Desc;
import com.volmit.iris.util.DontObfuscate; import com.volmit.iris.util.DontObfuscate;
@ -48,11 +48,11 @@ public class IrisBiomeGeneratorLink
private final transient AtomicCache<IrisGenerator> gen = new AtomicCache<>(); private final transient AtomicCache<IrisGenerator> gen = new AtomicCache<>();
public IrisGenerator getCachedGenerator(ContextualTerrainProvider g) public IrisGenerator getCachedGenerator(DataProvider g)
{ {
return gen.aquire(() -> return gen.aquire(() ->
{ {
IrisGenerator gen = g != null ? g.loadGenerator(getGenerator()) : Iris.globaldata.getGeneratorLoader().load(getGenerator()); IrisGenerator gen = g != null ? g.getData().getGeneratorLoader().load(getGenerator()) : Iris.globaldata.getGeneratorLoader().load(getGenerator());
if(gen == null) if(gen == null)
{ {
@ -63,7 +63,7 @@ public class IrisBiomeGeneratorLink
}); });
} }
public double getHeight(ContextualTerrainProvider xg, double x, double z, long seed) public double getHeight(DataProvider xg, double x, double z, long seed)
{ {
double g = getCachedGenerator(xg).getHeight(x, z, seed); double g = getCachedGenerator(xg).getHeight(x, z, seed);
g = g < 0 ? 0 : g; g = g < 0 ? 0 : g;

View File

@ -1,8 +1,8 @@
package com.volmit.iris.object; package com.volmit.iris.object;
import com.volmit.iris.Iris; import com.volmit.iris.Iris;
import com.volmit.iris.gen.ContextualTerrainProvider;
import com.volmit.iris.gen.atomics.AtomicCache; import com.volmit.iris.gen.atomics.AtomicCache;
import com.volmit.iris.gen.v2.DataProvider;
import com.volmit.iris.noise.CNG; import com.volmit.iris.noise.CNG;
import com.volmit.iris.util.ArrayType; import com.volmit.iris.util.ArrayType;
import com.volmit.iris.util.Desc; import com.volmit.iris.util.Desc;
@ -382,7 +382,7 @@ 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(ContextualTerrainProvider g) public KList<IrisBiome> getAllBiomes(DataProvider g)
{ {
KMap<String, IrisBiome> b = new KMap<>(); KMap<String, IrisBiome> b = new KMap<>();
KSet<String> names = new KSet<>(); KSet<String> names = new KSet<>();
@ -422,7 +422,7 @@ public class IrisRegion extends IrisRegistrant implements IRare
return b.v(); return b.v();
} }
public KList<IrisBiome> getBiomes(ContextualTerrainProvider g, InferredType type) public KList<IrisBiome> getBiomes(DataProvider g, InferredType type)
{ {
if(type.equals(InferredType.LAND)) if(type.equals(InferredType.LAND))
{ {
@ -457,7 +457,7 @@ public class IrisRegion extends IrisRegistrant implements IRare
return new KList<>(); return new KList<>();
} }
public KList<IrisBiome> getRealCaveBiomes(ContextualTerrainProvider g) public KList<IrisBiome> getRealCaveBiomes(DataProvider g)
{ {
return realCaveBiomes.aquire(() -> return realCaveBiomes.aquire(() ->
{ {
@ -472,7 +472,7 @@ public class IrisRegion extends IrisRegistrant implements IRare
}); });
} }
public KList<IrisBiome> getRealLakeBiomes(ContextualTerrainProvider g) public KList<IrisBiome> getRealLakeBiomes(DataProvider g)
{ {
return realLakeBiomes.aquire(() -> return realLakeBiomes.aquire(() ->
{ {
@ -487,7 +487,7 @@ public class IrisRegion extends IrisRegistrant implements IRare
}); });
} }
public KList<IrisBiome> getRealRiverBiomes(ContextualTerrainProvider g) public KList<IrisBiome> getRealRiverBiomes(DataProvider g)
{ {
return realRiverBiomes.aquire(() -> return realRiverBiomes.aquire(() ->
{ {
@ -502,7 +502,7 @@ public class IrisRegion extends IrisRegistrant implements IRare
}); });
} }
public KList<IrisBiome> getRealShoreBiomes(ContextualTerrainProvider g) public KList<IrisBiome> getRealShoreBiomes(DataProvider g)
{ {
return realShoreBiomes.aquire(() -> return realShoreBiomes.aquire(() ->
{ {
@ -517,7 +517,7 @@ public class IrisRegion extends IrisRegistrant implements IRare
}); });
} }
public KList<IrisBiome> getRealSeaBiomes(ContextualTerrainProvider g) public KList<IrisBiome> getRealSeaBiomes(DataProvider g)
{ {
return realSeaBiomes.aquire(() -> return realSeaBiomes.aquire(() ->
{ {
@ -532,7 +532,7 @@ public class IrisRegion extends IrisRegistrant implements IRare
}); });
} }
public KList<IrisBiome> getRealLandBiomes(ContextualTerrainProvider g) public KList<IrisBiome> getRealLandBiomes(DataProvider g)
{ {
return realLandBiomes.aquire(() -> return realLandBiomes.aquire(() ->
{ {