Structures

This commit is contained in:
Daniel Mills 2020-08-07 01:29:05 -04:00
parent 5be89f3f31
commit 60324c041c
2 changed files with 43 additions and 62 deletions

View File

@ -1,6 +1,7 @@
package com.volmit.iris.object; package com.volmit.iris.object;
import com.volmit.iris.gen.atomics.AtomicCache; import com.volmit.iris.gen.atomics.AtomicCache;
import com.volmit.iris.util.BlockPosition;
import com.volmit.iris.util.CNG; import com.volmit.iris.util.CNG;
import com.volmit.iris.util.Desc; import com.volmit.iris.util.Desc;
import com.volmit.iris.util.DontObfuscate; import com.volmit.iris.util.DontObfuscate;
@ -44,14 +45,6 @@ public class IrisStructure extends IrisRegistrant
@Desc("The tiles") @Desc("The tiles")
private KList<IrisStructureTile> tiles = new KList<>(); private KList<IrisStructureTile> tiles = new KList<>();
@DontObfuscate
@Desc("This is the wall chance zoom")
private double wallChanceZoom = 1D;
@DontObfuscate
@Desc("The dispersion of walls")
private Dispersion dispersion = Dispersion.SCATTER;
private transient AtomicCache<CNG> wallGenerator = new AtomicCache<>(); private transient AtomicCache<CNG> wallGenerator = new AtomicCache<>();
public TileResult getTile(RNG rng, double x, double y, double z) public TileResult getTile(RNG rng, double x, double y, double z)
@ -117,20 +110,8 @@ public class IrisStructure extends IrisRegistrant
return true; return true;
} }
int gs = getGridSize() + 1; BlockPosition p = asTileHorizon(new BlockPosition((int) x, (int) y, (int) z), face);
int gh = getGridHeight() + 1; return (getWallGenerator(rng).fitDoubleD(0, 1, p.getX(), p.getY(), p.getZ()) < getWallChance());
int gx = getTileHorizon(x);
int gy = getTileVertical(y);
int gz = getTileHorizon(z);
int hx = face.x();
int hy = face.y();
int hz = face.z();
int tx = (gx * 2) + (hx * gs);
int ty = (gy * 2) + (hy * gh);
int tz = (gz * 2) + (hz * gs);
return getWallGenerator(rng).fitDoubleD(0, 1, (tx) / wallChanceZoom, ty / wallChanceZoom, tz / wallChanceZoom) < getWallChance();
} }
public int getTileHorizon(double v) public int getTileHorizon(double v)
@ -138,29 +119,20 @@ public class IrisStructure extends IrisRegistrant
return (int) Math.floor(v / gridSize); return (int) Math.floor(v / gridSize);
} }
public int getTileVertical(double v) public BlockPosition asTileHorizon(BlockPosition b, StructureTileFace face)
{ {
return (int) Math.floor(v / gridHeight); b.setX((int) (Math.floor((b.getX() * 2) / gridSize) + face.x()));
b.setY((int) (Math.floor((b.getY() * 2) / gridHeight) + face.y()));
b.setZ((int) (Math.floor((b.getZ() * 2) / gridSize) + face.z()));
return b;
} }
public CNG getWallGenerator(RNG rng) public CNG getWallGenerator(RNG rng)
{ {
return wallGenerator.aquire(() -> return wallGenerator.aquire(() ->
{ {
CNG wallGenerator = new CNG(rng); RNG rngx = rng.nextParallelRNG((int) (name.hashCode() + gridHeight - gridSize + maxLayers + tiles.size()));
RNG rngx = rng.nextParallelRNG((int) ((wallChance * 102005) + gridHeight - gridSize + maxLayers + tiles.size())); return CNG.signature(rngx).scale(0.8);
switch(dispersion)
{
case SCATTER:
wallGenerator = CNG.signature(rngx).freq(1000000);
break;
case WISPY:
wallGenerator = CNG.signature(rngx);
break;
}
return wallGenerator;
}); });
} }

View File

@ -46,13 +46,11 @@ public class IrisStructurePlacement
} }
public void place(ParallaxChunkGenerator g, RNG rng, int cx, int cz) public void place(ParallaxChunkGenerator g, RNG rngno, int cx, int cz)
{ {
try try
{ {
TileResult t; RNG rng = g.getMasterRandom().nextParallelRNG(-88738456);
IrisObject o;
int h;
RNG rnp = rng.nextParallelRNG(cx - (cz * cz)); RNG rnp = rng.nextParallelRNG(cx - (cz * cz));
int s = gridSize() - (getStructure().isMergeEdges() ? 1 : 0); int s = gridSize() - (getStructure().isMergeEdges() ? 1 : 0);
int sh = gridHeight() - (getStructure().isMergeEdges() ? 1 : 0); int sh = gridHeight() - (getStructure().isMergeEdges() ? 1 : 0);
@ -61,26 +59,15 @@ public class IrisStructurePlacement
{ {
for(int j = cz << 4; j < (cz << 4) + 15; j += Math.max(s / 2, 1)) for(int j = cz << 4; j < (cz << 4) + 15; j += Math.max(s / 2, 1))
{ {
if(getStructure().getMaxLayers() <= 1)
{
placeLayer(g, rng, rnp, i, 0, j, s, sh);
continue;
}
for(int k = 0; k < s * getStructure().getMaxLayers(); k += Math.max(sh, 1)) for(int k = 0; k < s * getStructure().getMaxLayers(); k += Math.max(sh, 1))
{ {
if(!hasStructure(rng, i, k, j)) placeLayer(g, rng, rnp, i, k, j, s, sh);
{
continue;
}
h = (height == -1 ? 0 : height) + (Math.floorDiv(k, sh) * sh);
t = getStructure().getTile(rng, i / zoom, h / zoom, j / zoom);
if(t != null)
{
if(height >= 0)
{
t.getPlacement().setBore(true);
}
o = load(t.getTile().getObjects().get(rnp.nextInt(t.getTile().getObjects().size())));
o.place(Math.floorDiv(i, s) * s, height == -1 ? -1 : h, Math.floorDiv(j, s) * s, g, t.getPlacement(), rng);
}
} }
} }
} }
@ -92,6 +79,28 @@ public class IrisStructurePlacement
} }
} }
public void placeLayer(ParallaxChunkGenerator g, RNG rng, RNG rnp, int i, int k, int j, int s, int sh)
{
if(!hasStructure(rng, i, k, j))
{
return;
}
int h = (height == -1 ? 0 : height) + (Math.floorDiv(k, sh) * sh);
TileResult t = getStructure().getTile(rng, i, h, j);
if(t != null)
{
if(height >= 0)
{
t.getPlacement().setBore(true);
}
IrisObject o = load(t.getTile().getObjects().get(rnp.nextInt(t.getTile().getObjects().size())));
o.place(Math.floorDiv(i, s) * s, height == -1 ? -1 : h, Math.floorDiv(j, s) * s, g, t.getPlacement(), rng);
}
}
private IrisObjectPlacement getConfig() private IrisObjectPlacement getConfig()
{ {
return config.aquire(() -> new IrisObjectPlacement()); return config.aquire(() -> new IrisObjectPlacement());
@ -119,9 +128,9 @@ public class IrisStructurePlacement
public boolean hasStructure(RNG random, double x, double y, double z) public boolean hasStructure(RNG random, double x, double y, double z)
{ {
if(getChanceGenerator(random).getIndex(x, y, z, getRarity()) == getRarity() / 2) if(getChanceGenerator(random).getIndex(x / zoom, y / zoom, z / zoom, getRarity()) == getRarity() / 2)
{ {
return ratio > 0 ? getChanceGenerator(random).getDistance(x, z) > ratio : getChanceGenerator(random).getDistance(x, z) < Math.abs(ratio); return ratio > 0 ? getChanceGenerator(random).getDistance(x / zoom, z / zoom) > ratio : getChanceGenerator(random).getDistance(x / zoom, z / zoom) < Math.abs(ratio);
} }
return false; return false;