v2 parallax fixes!

This commit is contained in:
Daniel Mills 2020-10-31 14:45:58 -04:00
parent b74a00de22
commit f2339f26ca
10 changed files with 191 additions and 67 deletions

View File

@ -320,22 +320,14 @@ public class IrisObject extends IrisRegistrant
} }
} }
public void place(int x, int z, IObjectPlacer placer, IrisObjectPlacement config, RNG rng, IrisDataManager rdata) public int place(int x, int z, IObjectPlacer placer, IrisObjectPlacement config, RNG rng, IrisDataManager rdata)
{ {
if(shitty) return place(x, -1, z, placer, config, rng, rdata);
{
return;
}
place(x, -1, z, placer, config, rng, rdata);
} }
public void place(int x, int z, IObjectPlacer placer, IrisObjectPlacement config, RNG rng, CarveResult c, IrisDataManager rdata) public int place(int x, int z, IObjectPlacer placer, IrisObjectPlacement config, RNG rng, CarveResult c, IrisDataManager rdata)
{ {
if(shitty) return place(x, -1, z, placer, config, rng, null, c, rdata);
{
return;
}
place(x, -1, z, placer, config, rng, null, c, rdata);
} }
public int place(int x, int yv, int z, IObjectPlacer placer, IrisObjectPlacement config, RNG rng, IrisDataManager rdata) public int place(int x, int yv, int z, IObjectPlacer placer, IrisObjectPlacement config, RNG rng, IrisDataManager rdata)

View File

@ -16,6 +16,23 @@ public class BlockPosition
this.z = z; this.z = z;
} }
public boolean equals(Object o)
{
if(o == null)
{
return false;
}
if(o instanceof BlockPosition)
{
BlockPosition ot = (BlockPosition) o;
return ot.x == x && ot.y == y && ot.z == z;
}
return false;
}
public int getChunkX() public int getChunkX()
{ {
return x >> 4; return x >> 4;

View File

@ -176,4 +176,8 @@ public class EngineCompositeGenerator extends ChunkGenerator implements Hotloada
public static EngineCompositeGenerator newProductionWorld() { public static EngineCompositeGenerator newProductionWorld() {
return new EngineCompositeGenerator(null, true); return new EngineCompositeGenerator(null, true);
} }
public EngineCompound getComposite() {
return compound;
}
} }

View File

@ -24,6 +24,29 @@ public interface EngineCompound extends Listener
public void saveEngineMetadata(); public void saveEngineMetadata();
default Engine getEngineForHeight(int height)
{
if(getSize() == 1)
{
return getEngine(0);
}
int buf = 0;
for(int i = 0; i < getSize(); i++)
{
Engine e = getEngine(i);
buf += e.getHeight();
if(buf >= height)
{
return e;
}
}
return getEngine(getSize() - 1);
}
public default void save() public default void save()
{ {
saveEngineMetadata(); saveEngineMetadata();

View File

@ -1,7 +1,11 @@
package com.volmit.iris.v2.scaffold.engine; package com.volmit.iris.v2.scaffold.engine;
import java.lang.reflect.Parameter;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.atomic.AtomicInteger;
import com.volmit.iris.util.*;
import com.volmit.iris.v2.scaffold.parallax.ParallaxChunkMeta;
import org.bukkit.block.data.BlockData; import org.bukkit.block.data.BlockData;
import org.bukkit.util.BlockVector; import org.bukkit.util.BlockVector;
@ -13,12 +17,6 @@ import com.volmit.iris.object.IrisObject;
import com.volmit.iris.object.IrisObjectPlacement; import com.volmit.iris.object.IrisObjectPlacement;
import com.volmit.iris.object.IrisRegion; import com.volmit.iris.object.IrisRegion;
import com.volmit.iris.object.IrisTextPlacement; import com.volmit.iris.object.IrisTextPlacement;
import com.volmit.iris.util.B;
import com.volmit.iris.util.Form;
import com.volmit.iris.util.IObjectPlacer;
import com.volmit.iris.util.KList;
import com.volmit.iris.util.KSet;
import com.volmit.iris.util.RNG;
import com.volmit.iris.v2.generator.IrisComplex; import com.volmit.iris.v2.generator.IrisComplex;
import com.volmit.iris.v2.scaffold.cache.Cache; import com.volmit.iris.v2.scaffold.cache.Cache;
import com.volmit.iris.v2.scaffold.data.DataProvider; import com.volmit.iris.v2.scaffold.data.DataProvider;
@ -81,18 +79,26 @@ public interface EngineParallax extends DataProvider, IObjectPlacer
default void insertParallax(int x, int z, Hunk<BlockData> data) default void insertParallax(int x, int z, Hunk<BlockData> data)
{ {
data.compute3D(getEngine().getParallelism(), (xx,yy,zz,h)->{ ParallaxChunkMeta meta = getParallaxAccess().getMetaR(x>>4, z>>4);
if(!meta.isObjects()) {
return;
}
data.compute2DYRange(getEngine().getParallelism(), meta.getMinObject(), meta.getMaxObject(), (xx,yy,zz,h)->{
for(int i = x+xx; i < x+xx+ h.getWidth(); i++) for(int i = x+xx; i < x+xx+ h.getWidth(); i++)
{ {
for(int j= z+zz; j < z+zz + h.getDepth(); j++) for(int j= z+zz; j < z+zz + h.getDepth(); j++)
{ {
for(int k= yy; k < yy+h.getHeight(); k++) for(int k = yy; k < yy+h.getHeight(); k++)
{ {
BlockData d = getParallaxAccess().getBlock(i, k, j); BlockData d = getParallaxAccess().getBlock(i, k, j);
if(d != null) if(d != null)
{ {
h.set(i - (x-xx), k-yy, j - (z+zz), d); h.set(i - (x-xx), k-yy, j - (z+zz), d);
// DONT TRUST INTELIJ ^^^^
// ITS A FUCKING LIE
} }
} }
} }
@ -139,13 +145,36 @@ public interface EngineParallax extends DataProvider, IObjectPlacer
} }
default void place(RNG rng, int x, int z, IrisObjectPlacement objectPlacement) default void place(RNG rng, int x, int z, IrisObjectPlacement objectPlacement)
{
place(rng, x,-1, z, objectPlacement);
}
default void place(RNG rng, int x, int forceY, int z, IrisObjectPlacement objectPlacement)
{ {
for(int i = 0; i < objectPlacement.getDensity(); i++) for(int i = 0; i < objectPlacement.getDensity(); i++)
{ {
objectPlacement.getSchematic(getComplex(), rng).place(rng.i(x, x+16), rng.i(z, z+16), this, objectPlacement, rng, getData()); IrisObject v = objectPlacement.getSchematic(getComplex(), rng);
int xx = rng.i(x, x+16);
int zz = rng.i(z, z+16);
int id = rng.i(0, Integer.MAX_VALUE);
v.place(xx, forceY, zz, this, objectPlacement, rng, (b) -> {
getParallaxAccess().setObject(b.getX(), b.getY(), b.getZ(), v.getLoadKey() + "@" + id);
ParallaxChunkMeta meta = getParallaxAccess().getMetaRW(b.getX() >> 4, b.getZ() >> 4);
meta.setObjects(true);
meta.setMaxObject(Math.max(b.getY(), meta.getMaxObject()));
meta.setMinObject(Math.min(b.getY(), Math.max(meta.getMinObject(), 0)));
}, null, getData());
} }
} }
default void updateParallaxChunkObjectData(int minY, int maxY, int x, int z, IrisObject v)
{
ParallaxChunkMeta meta = getParallaxAccess().getMetaRW(x >> 4, z >> 4);
meta.setObjects(true);
meta.setMaxObject(Math.max(maxY, meta.getMaxObject()));
meta.setMinObject(Math.min(minY, Math.max(meta.getMinObject(), 0)));
}
default int computeParallaxSize() default int computeParallaxSize()
{ {
Iris.verbose("Calculating the Parallax Size in Parallel"); Iris.verbose("Calculating the Parallax Size in Parallel");

View File

@ -622,7 +622,31 @@ public interface Hunk<T>
{ {
rq.add(r); rq.add(r);
} }
}), (xx, yy, zz, c) -> insert(xx, yy, zz, c)); }), this::insert);
e.complete();
rq.forEach(Runnable::run);
return this;
}
default Hunk<T> compute2DYRange(int parallelism, int ymin, int ymax, Consumer4<Integer, Integer, Integer, Hunk<T>> v)
{
if(get2DDimension(parallelism) == 1)
{
v.accept(0, 0, 0, this);
return this;
}
BurstExecutor e = MultiBurst.burst.burst(parallelism);
KList<Runnable> rq = new KList<Runnable>(parallelism);
getSections2DYLimit(parallelism, ymin, ymax, (xx, yy, zz, h, r) -> e.queue(() ->
{
v.accept(xx, yy, zz, h);
synchronized(rq)
{
rq.add(r);
}
}), this::insert);
e.complete(); e.complete();
rq.forEach(Runnable::run); rq.forEach(Runnable::run);
return this; return this;
@ -650,7 +674,7 @@ public interface Hunk<T>
{ {
rq.add(r); rq.add(r);
} }
}), (xx, yy, zz, c) -> insert(xx, yy, zz, c)); }), this::insert);
e.complete(); e.complete();
rq.forEach(Runnable::run); rq.forEach(Runnable::run);
return this; return this;
@ -658,7 +682,7 @@ public interface Hunk<T>
default Hunk<T> getSections2D(int sections, Consumer5<Integer, Integer, Integer, Hunk<T>, Runnable> v) default Hunk<T> getSections2D(int sections, Consumer5<Integer, Integer, Integer, Hunk<T>, Runnable> v)
{ {
return getSections2D(sections, v, (xx, yy, zz, c) -> insert(xx, yy, zz, c)); return getSections2D(sections, v, this::insert);
} }
default Hunk<T> getSections2D(int sections, Consumer5<Integer, Integer, Integer, Hunk<T>, Runnable> v, Consumer4<Integer, Integer, Integer, Hunk<T>> inserter) default Hunk<T> getSections2D(int sections, Consumer5<Integer, Integer, Integer, Hunk<T>, Runnable> v, Consumer4<Integer, Integer, Integer, Hunk<T>> inserter)
@ -693,6 +717,38 @@ public interface Hunk<T>
return this; return this;
} }
default Hunk<T> getSections2DYLimit(int sections, int ymin, int ymax, Consumer5<Integer, Integer, Integer, Hunk<T>, Runnable> v, Consumer4<Integer, Integer, Integer, Hunk<T>> inserter)
{
int dim = (int) get2DDimension(sections);
if(sections <= 1)
{
getSection(0, 0, 0, getWidth(), getHeight(), getDepth(), (hh, r) -> v.accept(0, 0, 0, hh, r), inserter);
return this;
}
int w = getWidth() / dim;
int wr = getWidth() - (w * dim);
int d = getDepth() / dim;
int dr = getDepth() - (d * dim);
int i, j;
for(i = 0; i < getWidth(); i += w)
{
int ii = i;
for(j = 0; j < getDepth(); j += d)
{
int jj = j;
getSection(i, ymin, j, i + w + (i == 0 ? wr : 0), ymax, j + d + (j == 0 ? dr : 0), (h, r) -> v.accept(ii, ymin, jj, h, r), inserter);
i = i == 0 ? i + wr : i;
j = j == 0 ? j + dr : j;
}
}
return this;
}
default Hunk<T> getSections3D(int sections, Consumer5<Integer, Integer, Integer, Hunk<T>, Runnable> v) default Hunk<T> getSections3D(int sections, Consumer5<Integer, Integer, Integer, Hunk<T>, Runnable> v)
{ {
return getSections3D(sections, v, (xx, yy, zz, c) -> insert(xx, yy, zz, c)); return getSections3D(sections, v, (xx, yy, zz, c) -> insert(xx, yy, zz, c));

View File

@ -43,7 +43,7 @@ public class HunkRegion
in.close(); in.close();
} }
catch(Throwable e) catch(Throwable ignored)
{ {
} }
@ -80,7 +80,6 @@ public class HunkRegion
NBTOutputStream out = new NBTOutputStream(fos); NBTOutputStream out = new NBTOutputStream(fos);
out.writeTag(compound); out.writeTag(compound);
out.close(); out.close();
Iris.verbose("Saved Region: " + getX() + " " + getZ());
} }
} }

View File

@ -2,17 +2,10 @@ package com.volmit.iris.v2.scaffold.hunk.io;
import java.io.IOException; import java.io.IOException;
import com.volmit.iris.util.*;
import org.bukkit.block.data.BlockData; import org.bukkit.block.data.BlockData;
import com.volmit.iris.Iris; import com.volmit.iris.Iris;
import com.volmit.iris.util.ByteArrayTag;
import com.volmit.iris.util.CompoundTag;
import com.volmit.iris.util.Function2;
import com.volmit.iris.util.Function3;
import com.volmit.iris.util.KList;
import com.volmit.iris.util.KMap;
import com.volmit.iris.util.M;
import com.volmit.iris.util.Tag;
import com.volmit.iris.v2.scaffold.hunk.Hunk; import com.volmit.iris.v2.scaffold.hunk.Hunk;
public class HunkRegionSlice<T> public class HunkRegionSlice<T>
@ -24,9 +17,9 @@ public class HunkRegionSlice<T>
private final HunkIOAdapter<T> adapter; private final HunkIOAdapter<T> adapter;
private final CompoundTag compound; private final CompoundTag compound;
private final String key; private final String key;
private final KMap<Long, Hunk<T>> loadedChunks; private final KMap<ChunkPosition, Hunk<T>> loadedChunks;
private final KMap<Long, Long> lastUse; private final KMap<ChunkPosition, Long> lastUse;
private final KList<Long> save; private final KList<ChunkPosition> save;
private final int height; private final int height;
public HunkRegionSlice(int height, Function3<Integer, Integer, Integer, Hunk<T>> factory, HunkIOAdapter<T> adapter, CompoundTag compound, String key) public HunkRegionSlice(int height, Function3<Integer, Integer, Integer, Hunk<T>> factory, HunkIOAdapter<T> adapter, CompoundTag compound, String key)
@ -46,14 +39,21 @@ public class HunkRegionSlice<T>
if(loadedChunks.size() != lastUse.size()) if(loadedChunks.size() != lastUse.size())
{ {
Iris.warn("Incorrect chunk use counts in " + key); Iris.warn("Incorrect chunk use counts in " + key);
for(ChunkPosition i : lastUse.k())
{
if(!loadedChunks.containsKey(i))
{
Iris.warn(" Missing LoadChunkKey " + i);
}
}
} }
for(Long i : lastUse.k()) for(ChunkPosition i : lastUse.k())
{ {
if(M.ms() - lastUse.get(i) > t) if(M.ms() - lastUse.get(i) > t)
{ {
System.out.println("Trying to unload " + i); unload(i.getX(), i.getZ());
unload((int)(i >> 32), (int) i.longValue());
} }
} }
} }
@ -74,9 +74,9 @@ public class HunkRegionSlice<T>
public void save() public void save()
{ {
for(Long i : save) for(ChunkPosition i : save)
{ {
save((int)(i >> 32), (int) i.longValue()); save(i.getX(), i.getZ());
} }
save.clear(); save.clear();
@ -112,9 +112,9 @@ public class HunkRegionSlice<T>
public synchronized void unloadAll() public synchronized void unloadAll()
{ {
for(Long i : loadedChunks.k()) for(ChunkPosition i : loadedChunks.k())
{ {
unload((int)(i >> 32), (int) i.longValue()); unload(i.getX(), i.getZ());
} }
save.clear(); save.clear();
@ -136,7 +136,7 @@ public class HunkRegionSlice<T>
public boolean isLoaded(int x, int z) public boolean isLoaded(int x, int z)
{ {
return loadedChunks.containsKey(ikey(x, z)); return loadedChunks.containsKey(new ChunkPosition(x, z));
} }
public synchronized void save(int x, int z) public synchronized void save(int x, int z)
@ -149,11 +149,9 @@ public class HunkRegionSlice<T>
public synchronized void unload(int x, int z) public synchronized void unload(int x, int z)
{ {
long key = ikey(x, z); ChunkPosition key = new ChunkPosition(x, z);
System.out.println(x + "," + z + " = " + key);
if(isLoaded(x, z)) if(isLoaded(x, z))
{ {
System.out.println("HOT IT");
if(save.contains(key)) if(save.contains(key))
{ {
save(x, z); save(x, z);
@ -163,18 +161,13 @@ public class HunkRegionSlice<T>
lastUse.remove(key); lastUse.remove(key);
loadedChunks.remove(key); loadedChunks.remove(key);
} }
else
{
System.out.println("IDK WHERE " + key + " IS");
}
} }
public synchronized Hunk<T> load(int x, int z) public synchronized Hunk<T> load(int x, int z)
{ {
if(isLoaded(x, z)) if(isLoaded(x, z))
{ {
return loadedChunks.get(ikey(x, z)); return loadedChunks.get(new ChunkPosition(x, z));
} }
Hunk<T> v = null; Hunk<T> v = null;
@ -197,14 +190,14 @@ public class HunkRegionSlice<T>
v = factory.apply(16, height, 16); v = factory.apply(16, height, 16);
} }
loadedChunks.put(ikey(x, z), v); loadedChunks.put(new ChunkPosition(x, z), v);
return v; return v;
} }
public Hunk<T> get(int x, int z) public Hunk<T> get(int x, int z)
{ {
long key = ikey(x, z); ChunkPosition key = new ChunkPosition(x, z);
Hunk<T> c = loadedChunks.get(key); Hunk<T> c = loadedChunks.get(key);
@ -213,7 +206,7 @@ public class HunkRegionSlice<T>
c = load(x, z); c = load(x, z);
} }
lastUse.put(ikey(x, z), M.ms()); lastUse.put(new ChunkPosition(x, z), M.ms());
return c; return c;
} }
@ -225,15 +218,10 @@ public class HunkRegionSlice<T>
public Hunk<T> getRW(int x, int z) public Hunk<T> getRW(int x, int z)
{ {
save.addIfMissing(ikey(x, z)); save.addIfMissing(new ChunkPosition(x, z));
return get(x, z); return get(x, z);
} }
private long ikey(int x, int z)
{
return (((long) x) << 32) | (((long) z) & 0xffffffffL);
}
private String key(int x, int z) private String key(int x, int z)
{ {
if(x < 0 || x >= 32 || z < 0 || z >= 32) if(x < 0 || x >= 32 || z < 0 || z >= 32)
@ -241,7 +229,7 @@ public class HunkRegionSlice<T>
throw new IndexOutOfBoundsException("The chunk " + x + " " + z + " is out of bounds max is 31x31"); throw new IndexOutOfBoundsException("The chunk " + x + " " + z + " is out of bounds max is 31x31");
} }
return key + "." + Long.toString(ikey(x,z), 36); return key + "." + x + "." + z;
} }
public int getLoadCount() public int getLoadCount()

View File

@ -19,18 +19,34 @@ public class ParallaxChunkMeta {
public void write(ParallaxChunkMeta parallaxChunkMeta, DataOutputStream dos) throws IOException { public void write(ParallaxChunkMeta parallaxChunkMeta, DataOutputStream dos) throws IOException {
dos.writeBoolean(parallaxChunkMeta.isGenerated()); dos.writeBoolean(parallaxChunkMeta.isGenerated());
dos.writeBoolean(parallaxChunkMeta.isParallaxGenerated()); dos.writeBoolean(parallaxChunkMeta.isParallaxGenerated());
dos.writeBoolean(parallaxChunkMeta.isObjects());
if(parallaxChunkMeta.isObjects())
{
dos.writeByte(parallaxChunkMeta.getMinObject() + Byte.MIN_VALUE);
dos.writeByte(parallaxChunkMeta.getMaxObject() + Byte.MIN_VALUE);
}
} }
@Override @Override
public ParallaxChunkMeta read(DataInputStream din) throws IOException { public ParallaxChunkMeta read(DataInputStream din) throws IOException {
return new ParallaxChunkMeta(din.readBoolean(), din.readBoolean()); boolean g = din.readBoolean();
boolean p = din.readBoolean();
boolean o = din.readBoolean();
int min = o ? din.readByte() - Byte.MIN_VALUE : -1;
int max = o ? din.readByte() - Byte.MIN_VALUE : -1;
return new ParallaxChunkMeta(g, p, o, min, max);
} }
}; };
private boolean generated; private boolean generated;
private boolean parallaxGenerated; private boolean parallaxGenerated;
private boolean objects;
private int maxObject = -1;
private int minObject = -1;
public ParallaxChunkMeta() public ParallaxChunkMeta()
{ {
this(false, false); this(false, false, false, -1, -1);
} }
} }

View File

@ -192,7 +192,7 @@ public class ParallaxWorld implements ParallaxAccess
public void cleanup() public void cleanup()
{ {
cleanup(10000, 3000); cleanup(10000, 5000);
} }
@Override @Override