mirror of
https://github.com/VolmitSoftware/Iris.git
synced 2025-07-19 02:36:59 +00:00
Structures
This commit is contained in:
parent
5be89f3f31
commit
60324c041c
@ -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;
|
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user