3
0
Mirror von https://github.com/IntellectualSites/FastAsyncWorldEdit.git synchronisiert 2024-12-27 03:12:37 +01:00

Remove heightmap code from NMSRelighter

Dieser Commit ist enthalten in:
Hannes Greule 2021-04-12 12:40:18 +02:00
Ursprung 9ec9c56377
Commit 3c19944300
3 geänderte Dateien mit 15 neuen und 95 gelöschten Zeilen

Datei anzeigen

@ -13,7 +13,7 @@ import org.jetbrains.annotations.NotNull;
public class NMSRelighterFactory implements RelighterFactory { public class NMSRelighterFactory implements RelighterFactory {
@Override @Override
public @NotNull Relighter createRelighter(RelightMode relightMode, World world, IQueueExtent<IQueueChunk> queue) { public @NotNull Relighter createRelighter(RelightMode relightMode, World world, IQueueExtent<IQueueChunk> queue) {
return new NMSRelighter(queue, Settings.IMP.LIGHTING.DO_HEIGHTMAPS, return new NMSRelighter(queue,
relightMode != null ? relightMode : RelightMode.valueOf(Settings.IMP.LIGHTING.MODE)); relightMode != null ? relightMode : RelightMode.valueOf(Settings.IMP.LIGHTING.MODE));
} }
} }

Datei anzeigen

@ -12,7 +12,6 @@ import com.boydti.fawe.util.MathMan;
import com.boydti.fawe.util.TaskManager; import com.boydti.fawe.util.TaskManager;
import com.sk89q.worldedit.internal.util.LogManagerCompat; import com.sk89q.worldedit.internal.util.LogManagerCompat;
import com.sk89q.worldedit.math.MutableBlockVector3; import com.sk89q.worldedit.math.MutableBlockVector3;
import com.sk89q.worldedit.registry.state.BooleanProperty;
import com.sk89q.worldedit.registry.state.DirectionalProperty; import com.sk89q.worldedit.registry.state.DirectionalProperty;
import com.sk89q.worldedit.registry.state.EnumProperty; import com.sk89q.worldedit.registry.state.EnumProperty;
import com.sk89q.worldedit.registry.state.Property; import com.sk89q.worldedit.registry.state.Property;
@ -37,7 +36,6 @@ import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentLinkedQueue; import java.util.concurrent.ConcurrentLinkedQueue;
import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicBoolean;
import java.util.concurrent.locks.ReentrantLock; import java.util.concurrent.locks.ReentrantLock;
import java.util.stream.Collectors;
public class NMSRelighter implements Relighter { public class NMSRelighter implements Relighter {
@ -47,14 +45,12 @@ public class NMSRelighter implements Relighter {
private static final EnumProperty stairHalf; private static final EnumProperty stairHalf;
private static final EnumProperty stairShape; private static final EnumProperty stairShape;
private static final EnumProperty slabHalf; private static final EnumProperty slabHalf;
private static final BooleanProperty waterLogged;
static { static {
stairDirection = (DirectionalProperty) (Property<?>) BlockTypes.SANDSTONE_STAIRS.getProperty("facing"); stairDirection = (DirectionalProperty) (Property<?>) BlockTypes.SANDSTONE_STAIRS.getProperty("facing");
stairHalf = (EnumProperty) (Property<?>) BlockTypes.SANDSTONE_STAIRS.getProperty("half"); stairHalf = (EnumProperty) (Property<?>) BlockTypes.SANDSTONE_STAIRS.getProperty("half");
stairShape = (EnumProperty) (Property<?>) BlockTypes.SANDSTONE_STAIRS.getProperty("shape"); stairShape = (EnumProperty) (Property<?>) BlockTypes.SANDSTONE_STAIRS.getProperty("shape");
slabHalf = (EnumProperty) (Property<?>) BlockTypes.SANDSTONE_SLAB.getProperty("type"); slabHalf = (EnumProperty) (Property<?>) BlockTypes.SANDSTONE_SLAB.getProperty("type");
waterLogged = (BooleanProperty) (Property<?>) BlockTypes.SANDSTONE_SLAB.getProperty("waterlogged");
} }
public final MutableBlockVector3 mutableBlockPos = new MutableBlockVector3(0, 0, 0); public final MutableBlockVector3 mutableBlockPos = new MutableBlockVector3(0, 0, 0);
@ -62,31 +58,27 @@ public class NMSRelighter implements Relighter {
private final Map<Long, RelightSkyEntry> skyToRelight; private final Map<Long, RelightSkyEntry> skyToRelight;
private final Object present = new Object(); private final Object present = new Object();
private final Map<Long, Integer> chunksToSend; private final Map<Long, Integer> chunksToSend;
private final Map<Long, Map<HeightMapType, int[]>> heightMaps;
private final ConcurrentLinkedQueue<RelightSkyEntry> extentdSkyToRelight = new ConcurrentLinkedQueue<>(); private final ConcurrentLinkedQueue<RelightSkyEntry> extentdSkyToRelight = new ConcurrentLinkedQueue<>();
private final Map<Long, long[][][] /* z y x */> lightQueue; private final Map<Long, long[][][] /* z y x */> lightQueue;
private final AtomicBoolean lightLock = new AtomicBoolean(false); private final AtomicBoolean lightLock = new AtomicBoolean(false);
private final ConcurrentHashMap<Long, long[][][]> concurrentLightQueue; private final ConcurrentHashMap<Long, long[][][]> concurrentLightQueue;
private final RelightMode relightMode; private final RelightMode relightMode;
private final int maxY; private final int maxY;
private final boolean calculateHeightMaps;
private final ReentrantLock lightingLock; private final ReentrantLock lightingLock;
private final AtomicBoolean finished = new AtomicBoolean(false); private final AtomicBoolean finished = new AtomicBoolean(false);
private boolean removeFirst; private boolean removeFirst;
public NMSRelighter(IQueueExtent<IQueueChunk> queue, boolean calculateHeightMaps) { public NMSRelighter(IQueueExtent<IQueueChunk> queue, boolean calculateHeightMaps) {
this(queue, calculateHeightMaps, null); this(queue, null);
} }
public NMSRelighter(IQueueExtent<IQueueChunk> queue, boolean calculateHeightMaps, RelightMode relightMode) { public NMSRelighter(IQueueExtent<IQueueChunk> queue, RelightMode relightMode) {
this.queue = queue; this.queue = queue;
this.skyToRelight = new Long2ObjectOpenHashMap<>(12); this.skyToRelight = new Long2ObjectOpenHashMap<>(12);
this.lightQueue = new Long2ObjectOpenHashMap<>(12); this.lightQueue = new Long2ObjectOpenHashMap<>(12);
this.chunksToSend = new Long2ObjectOpenHashMap<>(12); this.chunksToSend = new Long2ObjectOpenHashMap<>(12);
this.concurrentLightQueue = new ConcurrentHashMap<>(12); this.concurrentLightQueue = new ConcurrentHashMap<>(12);
this.heightMaps = new Long2ObjectOpenHashMap<>(12);
this.maxY = queue.getMaxY(); this.maxY = queue.getMaxY();
this.calculateHeightMaps = calculateHeightMaps;
this.relightMode = relightMode != null ? relightMode : RelightMode.valueOf(Settings.IMP.LIGHTING.MODE); this.relightMode = relightMode != null ? relightMode : RelightMode.valueOf(Settings.IMP.LIGHTING.MODE);
this.lightingLock = new ReentrantLock(); this.lightingLock = new ReentrantLock();
} }
@ -160,12 +152,11 @@ public class NMSRelighter implements Relighter {
extentdSkyToRelight.clear(); extentdSkyToRelight.clear();
skyToRelight.clear(); skyToRelight.clear();
chunksToSend.clear(); chunksToSend.clear();
heightMaps.clear();
lightQueue.clear(); lightQueue.clear();
} }
public boolean addChunk(int cx, int cz, byte[] fix, int bitmask) { public boolean addChunk(int cx, int cz, byte[] fix, int bitmask) {
RelightSkyEntry toPut = new RelightSkyEntry(cx, cz, fix, bitmask, calculateHeightMaps); RelightSkyEntry toPut = new RelightSkyEntry(cx, cz, fix, bitmask);
extentdSkyToRelight.add(toPut); extentdSkyToRelight.add(toPut);
return true; return true;
} }
@ -834,14 +825,6 @@ public class NMSRelighter implements Relighter {
int z = MathMan.unpairIntY(pair); int z = MathMan.unpairIntY(pair);
ChunkHolder<?> chunk = (ChunkHolder<?>) queue.getOrCreateChunk(x, z); ChunkHolder<?> chunk = (ChunkHolder<?>) queue.getOrCreateChunk(x, z);
chunk.setBitMask(bitMask); chunk.setBitMask(bitMask);
if (calculateHeightMaps && heightMaps != null) {
Map<HeightMapType, int[]> heightMapList = heightMaps.get(pair);
if (heightMapList != null) {
for (Map.Entry<HeightMapType, int[]> heightMapEntry : heightMapList.entrySet()) {
chunk.setHeightMap(heightMapEntry.getKey(), heightMapEntry.getValue());
}
}
}
iter.remove(); iter.remove();
} }
if (Settings.IMP.LIGHTING.ASYNC) { if (Settings.IMP.LIGHTING.ASYNC) {
@ -870,14 +853,6 @@ public class NMSRelighter implements Relighter {
int z = MathMan.unpairIntY(pair); int z = MathMan.unpairIntY(pair);
ChunkHolder<?> chunk = (ChunkHolder<?>) queue.getOrCreateChunk(x, z); ChunkHolder<?> chunk = (ChunkHolder<?>) queue.getOrCreateChunk(x, z);
chunk.setBitMask(bitMask); chunk.setBitMask(bitMask);
if (calculateHeightMaps && heightMaps != null) {
Map<HeightMapType, int[]> heightMapList = heightMaps.get(pair);
if (heightMapList != null) {
for (Map.Entry<HeightMapType, int[]> heightMapEntry : heightMapList.entrySet()) {
chunk.setHeightMap(heightMapEntry.getKey(), heightMapEntry.getValue());
}
}
}
chunk.flushLightToGet(true); chunk.flushLightToGet(true);
Fawe.imp().getPlatformAdapter().sendChunk(chunk.getOrCreateGet(), bitMask, true); Fawe.imp().getPlatformAdapter().sendChunk(chunk.getOrCreateGet(), bitMask, true);
iter.remove(); iter.remove();
@ -944,33 +919,19 @@ public class NMSRelighter implements Relighter {
private void fixSkyLighting(List<RelightSkyEntry> sorted) { private void fixSkyLighting(List<RelightSkyEntry> sorted) {
RelightSkyEntry[] chunks = sorted.toArray(new RelightSkyEntry[sorted.size()]); RelightSkyEntry[] chunks = sorted.toArray(new RelightSkyEntry[sorted.size()]);
boolean remove = this.removeFirst; boolean remove = this.removeFirst;
boolean heightMaps = this.calculateHeightMaps;
BlockVectorSet chunkSet = null; BlockVectorSet chunkSet = null;
if (remove || heightMaps) { if (remove) {
BlockVectorSet tmpSet = new BlockVectorSet(); BlockVectorSet tmpSet = new BlockVectorSet();
if (remove) { chunkSet = new BlockVectorSet();
chunkSet = new BlockVectorSet(); for (RelightSkyEntry chunk : chunks) {
for (RelightSkyEntry chunk : chunks) { tmpSet.add(chunk.x, 0, chunk.z);
tmpSet.add(chunk.x, 0, chunk.z);
}
} }
for (RelightSkyEntry chunk : chunks) { for (RelightSkyEntry chunk : chunks) {
if (remove) { int x = chunk.x;
int x = chunk.x; int z = chunk.z;
int z = chunk.z; if (tmpSet.contains(x + 1, 0, z) && tmpSet.contains(x - 1, 0, z) && tmpSet.contains(x, 0, z + 1) && tmpSet
if (tmpSet.contains(x + 1, 0, z) && tmpSet.contains(x - 1, 0, z) && tmpSet.contains(x, 0, z + 1) && tmpSet .contains(x, 0, z - 1)) {
.contains(x, 0, z - 1)) { chunkSet.add(x, 0, z);
chunkSet.add(x, 0, z);
}
}
if (heightMaps) {
long pair = MathMan.pairInt(chunk.x, chunk.z);
this.heightMaps.putIfAbsent(pair, new HashMap<>());
Map<HeightMapType, int[]> heightMapList = this.heightMaps.get(pair);
heightMapList.putIfAbsent(HeightMapType.WORLD_SURFACE, new int[256]);
heightMapList.putIfAbsent(HeightMapType.OCEAN_FLOOR, new int[256]);
heightMapList.putIfAbsent(HeightMapType.MOTION_BLOCKING, new int[256]);
heightMapList.putIfAbsent(HeightMapType.MOTION_BLOCKING_NO_LEAVES, new int[256]);
} }
} }
} }
@ -996,12 +957,6 @@ public class NMSRelighter implements Relighter {
iChunk.removeSectionLighting(y >> 4, true); iChunk.removeSectionLighting(y >> 4, true);
} }
Map<HeightMapType, int[]> heightMapList = null;
if (heightMaps) {
long pair = MathMan.pairInt(chunk.x, chunk.z);
heightMapList = this.heightMaps.get(pair);
}
for (int j = 0; j < 256; j++) { for (int j = 0; j < 256; j++) {
int x = j & 15; int x = j & 15;
int z = j >> 4; int z = j >> 4;
@ -1014,38 +969,6 @@ public class NMSRelighter implements Relighter {
addLightUpdate(bx + x, y, bz + z); addLightUpdate(bx + x, y, bz + z);
} }
if (heightMaps) {
if (heightMapList.get(HeightMapType.WORLD_SURFACE)[j] == 0 && !material.isAir()) {
// MC Requires y+1
heightMapList.get(HeightMapType.WORLD_SURFACE)[j] = y + 1;
}
if (heightMapList.get(HeightMapType.OCEAN_FLOOR)[j] == 0 && material.isSolid()) {
heightMapList.get(HeightMapType.OCEAN_FLOOR)[j] = y + 1;
}
Map<Property<?>, Object> states = state.getStates();
try {
if (heightMapList.get(HeightMapType.MOTION_BLOCKING)[j] == 0 && (material.isSolid() || material.isLiquid() || (
states.containsKey(waterLogged) && state.getState(waterLogged)))) {
heightMapList.get(HeightMapType.MOTION_BLOCKING)[j] = y + 1;
}
} catch (Exception ignored) {
LOGGER.debug("Error calculating waterlogged state for BlockState: " + state.getBlockType().getId() + ". States:");
LOGGER.debug(states.entrySet().stream().map(e -> e.getKey() + "=" + e.getValue())
.collect(Collectors.joining(", ", "{", "}")));
}
try {
if (heightMapList.get(HeightMapType.MOTION_BLOCKING_NO_LEAVES)[j] == 0 && (material.isSolid() || material.isLiquid() || (
states.containsKey(waterLogged) && state.getState(waterLogged))) && !state.getBlockType().getId()
.toLowerCase().contains("leaves")) {
heightMapList.get(HeightMapType.MOTION_BLOCKING_NO_LEAVES)[j] = y + 1;
}
} catch (Exception ignored) {
LOGGER.debug("Error calculating waterlogged state for BlockState: " + state.getBlockType().getId() + ". States:");
LOGGER.debug(states.entrySet().stream().map(e -> e.getKey() + "=" + e.getValue())
.collect(Collectors.joining(", ", "{", "}")));
}
}
switch (value) { switch (value) {
case 0: case 0:
if (opacity > 1) { if (opacity > 1) {
@ -1223,7 +1146,7 @@ public class NMSRelighter implements Relighter {
public int bitmask; public int bitmask;
public boolean smooth; public boolean smooth;
public RelightSkyEntry(int x, int z, byte[] fix, int bitmask, boolean heightmaps) { public RelightSkyEntry(int x, int z, byte[] fix, int bitmask) {
this.x = x; this.x = x;
this.z = z; this.z = z;
byte[] array = new byte[256]; byte[] array = new byte[256];

Datei anzeigen

@ -411,10 +411,7 @@ public class EditSessionBuilder {
} else { } else {
relighter = NullRelighter.INSTANCE; relighter = NullRelighter.INSTANCE;
} }
// TODO dirty workaround, NMSRelighter and HeightmapProcessor don't work well together extent.addProcessor(new HeightmapProcessor(world));
if (Settings.IMP.LIGHTING.MODE == 0 || relighter.getClass().getSimpleName().startsWith("Tuinity")) {
extent.addProcessor(new HeightmapProcessor(world));
}
if (limit != null && !limit.isUnlimited() && regionExtent != null) { if (limit != null && !limit.isUnlimited() && regionExtent != null) {
this.extent = new LimitExtent(regionExtent, limit); this.extent = new LimitExtent(regionExtent, limit);
} else if (limit != null && !limit.isUnlimited()) { } else if (limit != null && !limit.isUnlimited()) {