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:
Ursprung
ab3bc3673b
Commit
cd3958fa7a
@ -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
|
||||||
|
@ -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
|
||||||
|
Laden…
In neuem Issue referenzieren
Einen Benutzer sperren