3
0
Mirror von https://github.com/IntellectualSites/FastAsyncWorldEdit.git synchronisiert 2024-12-26 11:00:04 +01:00

Batch relighting for Starlight

Dieser Commit ist enthalten in:
Hannes Greule 2021-04-14 00:40:25 +02:00
Ursprung ab3bc3673b
Commit cd3958fa7a
2 geänderte Dateien mit 46 neuen und 27 gelöschten Zeilen

Datei anzeigen

@ -1,16 +1,18 @@
package com.boydti.fawe.bukkit.adapter.mc1_16_5; package com.boydti.fawe.bukkit.adapter.mc1_16_5;
import com.boydti.fawe.Fawe; import com.boydti.fawe.Fawe;
import com.boydti.fawe.beta.IChunkGet;
import com.boydti.fawe.beta.IQueueChunk; import com.boydti.fawe.beta.IQueueChunk;
import com.boydti.fawe.beta.IQueueExtent; import com.boydti.fawe.beta.IQueueExtent;
import com.boydti.fawe.beta.implementation.chunk.ChunkHolder; import com.boydti.fawe.beta.implementation.chunk.ChunkHolder;
import com.boydti.fawe.beta.implementation.lighting.Relighter; import com.boydti.fawe.beta.implementation.lighting.Relighter;
import com.boydti.fawe.config.Settings;
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 net.minecraft.server.v1_16_R3.BlockPosition; import it.unimi.dsi.fastutil.longs.LongArrayList;
import it.unimi.dsi.fastutil.longs.LongList;
import net.minecraft.server.v1_16_R3.ChunkCoordIntPair; import net.minecraft.server.v1_16_R3.ChunkCoordIntPair;
import net.minecraft.server.v1_16_R3.LightEngineThreaded; import net.minecraft.server.v1_16_R3.LightEngineThreaded;
import net.minecraft.server.v1_16_R3.MCUtil;
import net.minecraft.server.v1_16_R3.WorldServer; import net.minecraft.server.v1_16_R3.WorldServer;
import org.apache.logging.log4j.Logger; import org.apache.logging.log4j.Logger;
@ -18,11 +20,11 @@ import java.lang.invoke.MethodHandle;
import java.lang.invoke.MethodHandles; import java.lang.invoke.MethodHandles;
import java.lang.reflect.Method; import java.lang.reflect.Method;
import java.util.HashSet; import java.util.HashSet;
import java.util.List;
import java.util.Set; import java.util.Set;
import java.util.concurrent.locks.ReentrantLock; import java.util.concurrent.locks.ReentrantLock;
import java.util.function.Consumer; import java.util.function.Consumer;
import java.util.function.IntConsumer; import java.util.function.IntConsumer;
import java.util.stream.Collectors;
public class TuinityRelighter_1_16_5 implements Relighter { public class TuinityRelighter_1_16_5 implements Relighter {
@ -36,6 +38,9 @@ public class TuinityRelighter_1_16_5 implements Relighter {
private final IQueueExtent<IQueueChunk> queue; private final IQueueExtent<IQueueChunk> queue;
private final ReentrantLock lightLock = new ReentrantLock();
private final LongList chunks = new LongArrayList();
static { static {
MethodHandle tmp = null; MethodHandle tmp = null;
try { try {
@ -60,29 +65,15 @@ public class TuinityRelighter_1_16_5 implements Relighter {
@Override @Override
public boolean addChunk(int cx, int cz, byte[] skipReason, int bitmask) { public boolean addChunk(int cx, int cz, byte[] skipReason, int bitmask) {
List<ChunkCoordIntPair> chunks = MCUtil.getSpiralOutChunks(new BlockPosition(cx << 4, 0, cz << 4), 1); lightLock.lock();
TaskManager.IMP.task(() ->
{
try { try {
// cast is required for invokeExact chunks.add(ChunkCoordIntPair.pair(cx, cz));
int unused = (int) relight.invokeExact(world.getChunkProvider().getLightEngine(), } finally {
(Set<?>) new HashSet<>(chunks), // explicit cast to make invokeExact work lightLock.unlock();
(Consumer<?>) coord -> sendChunk(cx, cz), // send chunk after lighting was done
nothingIntConsumer
);
} catch (Throwable throwable) {
LOGGER.error("Error occurred on relighting", throwable);
} }
}
);
return true; return true;
} }
private void sendChunk(int cx, int cz) {
ChunkHolder<?> chunk = (ChunkHolder<?>) queue.getOrCreateChunk(cx, cz);
Fawe.imp().getPlatformAdapter().sendChunk(chunk.getOrCreateGet(), -1, false);
}
@Override @Override
public void addLightUpdate(int x, int y, int z) { public void addLightUpdate(int x, int y, int z) {
@ -90,7 +81,32 @@ public class TuinityRelighter_1_16_5 implements Relighter {
@Override @Override
public void fixLightingSafe(boolean sky) { public void fixLightingSafe(boolean sky) {
Set<ChunkCoordIntPair> chunks = this.chunks.stream().map(ChunkCoordIntPair::new).collect(Collectors.toSet());
TaskManager.IMP.task(() ->
{
try {
// cast is required for invokeExact
int unused = (int) relight.invokeExact(world.getChunkProvider().getLightEngine(),
(Set<?>) new HashSet<>(chunks), // explicit cast to make invokeExact work
(Consumer<?>) coord -> {}, // no callback
nothingIntConsumer
);
} catch (Throwable throwable) {
LOGGER.error("Error occurred on relighting", throwable);
}
}
);
if (Settings.IMP.LIGHTING.DELAY_PACKET_SENDING) {
for (long key : this.chunks) {
int x = ChunkCoordIntPair.getX(key);
int z = ChunkCoordIntPair.getZ(key);
ChunkHolder<?> chunk = (ChunkHolder<?>) queue.getOrCreateChunk(x, z);
IChunkGet toSend = chunk.getOrCreateGet();
TaskManager.IMP.async(() -> {
Fawe.imp().getPlatformAdapter().sendChunk(toSend, -1, false);
});
}
}
} }
@Override @Override
@ -125,7 +141,7 @@ public class TuinityRelighter_1_16_5 implements Relighter {
@Override @Override
public boolean isFinished() { public boolean isFinished() {
return true; return false;
} }
@Override @Override

Datei anzeigen

@ -41,17 +41,20 @@ public class HeightmapProcessor implements IBatchProcessor {
int skip = 0; int skip = 0;
int allSkipped = (1 << TYPES.length) - 1; // lowest types.length bits are set int allSkipped = (1 << TYPES.length) - 1; // lowest types.length bits are set
for (int y = max; y >= min; y--) { for (int y = max; y >= min; y--) {
if (!(set.hasSection(y >> 4) || get.hasSection(y >> 4))) { boolean hasSectionSet = set.hasSection(y >> 4);
boolean hasSectionGet = get.hasSection(y >> 4);
if (!(hasSectionSet || hasSectionGet)) {
y -= (SECTION_SIDE_LENGTH - 1); // - 1, as we do y-- in the loop head y -= (SECTION_SIDE_LENGTH - 1); // - 1, as we do y-- in the loop head
continue; continue;
} }
for (int z = 0; z < SECTION_SIDE_LENGTH; z++) { for (int z = 0; z < SECTION_SIDE_LENGTH; z++) {
for (int x = 0; x < SECTION_SIDE_LENGTH; x++) { for (int x = 0; x < SECTION_SIDE_LENGTH; x++) {
BlockState block = null; BlockState block = null;
if (set.hasSection(y >> 4)) { if (hasSectionSet) {
block = set.getBlock(x, y, z); block = set.getBlock(x, y, z);
} }
if (block == null || block.getBlockType() == RESERVED) { if (block == null || block.getBlockType() == RESERVED) {
if (!hasSectionGet) continue;
block = get.getBlock(x, y, z); block = get.getBlock(x, y, z);
} }
// fast skip if block isn't relevant for any height map // fast skip if block isn't relevant for any height map