Split off 1.14.4 overwrite from ChunkLoadingRenderGlobal
This commit is contained in:
@@ -1,153 +1,22 @@
|
|||||||
//#if MC>=10800
|
|
||||||
package com.replaymod.render.hooks;
|
package com.replaymod.render.hooks;
|
||||||
|
|
||||||
import net.minecraft.client.render.WorldRenderer;
|
import net.minecraft.client.render.WorldRenderer;
|
||||||
|
|
||||||
//#if MC>=11500
|
|
||||||
//#else
|
|
||||||
//$$ import com.replaymod.render.mixin.ChunkRenderDispatcherAccessor;
|
|
||||||
//$$ import com.replaymod.render.mixin.WorldRendererAccessor;
|
|
||||||
//$$ import com.replaymod.render.utils.JailingQueue;
|
|
||||||
//$$ import net.minecraft.client.render.chunk.BlockBufferBuilderStorage;
|
|
||||||
//$$ import net.minecraft.client.render.chunk.ChunkBuilder;
|
|
||||||
//$$ import net.minecraft.client.render.chunk.ChunkRenderTask;
|
|
||||||
//$$ import net.minecraft.client.render.chunk.ChunkRenderWorker;
|
|
||||||
//$$ import net.minecraft.client.render.chunk.ChunkRenderer;
|
|
||||||
//$$ import java.util.Iterator;
|
|
||||||
//$$ import static com.replaymod.core.versions.MCVer.*;
|
|
||||||
//#endif
|
|
||||||
|
|
||||||
//#if MC>=10904
|
|
||||||
import java.util.concurrent.PriorityBlockingQueue;
|
|
||||||
//#else
|
|
||||||
//$$ import java.util.concurrent.BlockingQueue;
|
|
||||||
//#endif
|
|
||||||
|
|
||||||
public class ChunkLoadingRenderGlobal {
|
public class ChunkLoadingRenderGlobal {
|
||||||
|
|
||||||
private final WorldRenderer hooked;
|
private final WorldRenderer hooked;
|
||||||
|
|
||||||
//#if MC>=11500
|
|
||||||
//#else
|
|
||||||
//$$ private ChunkBuilder renderDispatcher;
|
|
||||||
//#if MC>=11400
|
|
||||||
//$$ private JailingQueue<ChunkRenderTask> workerJailingQueue;
|
|
||||||
//#else
|
|
||||||
//$$ private JailingQueue<ChunkCompileTaskGenerator> workerJailingQueue;
|
|
||||||
//#endif
|
|
||||||
//$$ private ChunkRenderWorkerAccessor renderWorker;
|
|
||||||
//$$ private int frame;
|
|
||||||
//#endif
|
|
||||||
|
|
||||||
public ChunkLoadingRenderGlobal(WorldRenderer renderGlobal) {
|
public ChunkLoadingRenderGlobal(WorldRenderer renderGlobal) {
|
||||||
this.hooked = renderGlobal;
|
this.hooked = renderGlobal;
|
||||||
|
|
||||||
//#if MC>=11500
|
|
||||||
//#else
|
|
||||||
//$$ setup(((WorldRendererAccessor) renderGlobal).getRenderDispatcher());
|
|
||||||
//#endif
|
|
||||||
IForceChunkLoading.from(renderGlobal).replayModRender_setHook(this);
|
IForceChunkLoading.from(renderGlobal).replayModRender_setHook(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
//#if MC>=11500
|
|
||||||
//#else
|
|
||||||
//$$ public void updateRenderDispatcher(ChunkBuilder renderDispatcher) {
|
|
||||||
//$$ if (this.renderDispatcher != null) {
|
|
||||||
//$$ workerJailingQueue.freeAll();
|
|
||||||
//$$ this.renderDispatcher = null;
|
|
||||||
//$$ }
|
|
||||||
//$$ if (renderDispatcher != null) {
|
|
||||||
//$$ setup(renderDispatcher);
|
|
||||||
//$$ }
|
|
||||||
//$$ }
|
|
||||||
//$$
|
|
||||||
//$$ private void setup(ChunkBuilder renderDispatcher) {
|
|
||||||
//$$ this.renderDispatcher = renderDispatcher;
|
|
||||||
//$$ this.renderWorker = (ChunkRenderWorkerAccessor) new ChunkRenderWorker(renderDispatcher, new BlockBufferBuilderStorage());
|
|
||||||
//$$ ChunkRenderDispatcherAccessor renderDispatcherAcc = (ChunkRenderDispatcherAccessor) renderDispatcher;
|
|
||||||
//$$
|
|
||||||
//$$ int workerThreads = renderDispatcherAcc.getListThreadedWorkers().size();
|
|
||||||
//#if MC>=10904
|
|
||||||
//$$ PriorityBlockingQueue<ChunkRenderTask> queueChunkUpdates = renderDispatcherAcc.getQueueChunkUpdates();
|
|
||||||
//#else
|
|
||||||
//$$ BlockingQueue<ChunkCompileTaskGenerator> queueChunkUpdates = renderDispatcherAcc.getQueueChunkUpdates();
|
|
||||||
//#endif
|
|
||||||
//$$ workerJailingQueue = new JailingQueue<>(queueChunkUpdates);
|
|
||||||
//$$ renderDispatcherAcc.setQueueChunkUpdates(workerJailingQueue);
|
|
||||||
//#if MC>=10904
|
|
||||||
//$$ ChunkRenderTask element = new ChunkRenderTask(
|
|
||||||
//$$ null,
|
|
||||||
//$$ null,
|
|
||||||
//$$ 0
|
|
||||||
//#if MC>=11400
|
|
||||||
//$$ , null
|
|
||||||
//#endif
|
|
||||||
//$$ );
|
|
||||||
//#else
|
|
||||||
//$$ ChunkCompileTaskGenerator element = new ChunkCompileTaskGenerator(null, null);
|
|
||||||
//#endif
|
|
||||||
//$$ element.cancel();
|
|
||||||
//$$ for (int i = 0; i < workerThreads; i++) {
|
|
||||||
//$$ queueChunkUpdates.add(element);
|
|
||||||
//$$ }
|
|
||||||
//$$
|
|
||||||
//$$ // Temporary workaround for dead lock, will be replaced by a new (ShaderMod compatible) mechanism later
|
|
||||||
//$$ //noinspection StatementWithEmptyBody
|
|
||||||
//$$ while (renderDispatcher.runTasksSync(0)) {}
|
|
||||||
//$$
|
|
||||||
//$$ workerJailingQueue.jail(workerThreads);
|
|
||||||
//$$ renderDispatcherAcc.setQueueChunkUpdates(queueChunkUpdates);
|
|
||||||
//$$ }
|
|
||||||
//$$
|
|
||||||
//$$ public void updateChunks() {
|
|
||||||
//$$ while (renderDispatcher.runTasksSync(0)) {
|
|
||||||
//$$ ((WorldRendererAccessor) hooked).setDisplayListEntitiesDirty(true);
|
|
||||||
//$$ }
|
|
||||||
//$$
|
|
||||||
//#if MC>=10904
|
|
||||||
//$$ PriorityBlockingQueue<ChunkRenderTask> queueChunkUpdates;
|
|
||||||
//#else
|
|
||||||
//$$ BlockingQueue<ChunkCompileTaskGenerator> queueChunkUpdates;
|
|
||||||
//#endif
|
|
||||||
//$$ queueChunkUpdates = ((ChunkRenderDispatcherAccessor) renderDispatcher).getQueueChunkUpdates();
|
|
||||||
//$$ while (!queueChunkUpdates.isEmpty()) {
|
|
||||||
//$$ try {
|
|
||||||
//$$ renderWorker.doRunTask(queueChunkUpdates.poll());
|
|
||||||
//$$ } catch (InterruptedException ignored) { }
|
|
||||||
//$$ }
|
|
||||||
//$$
|
|
||||||
//$$ Iterator<ChunkRenderer> iterator = ((WorldRendererAccessor) hooked).getChunksToUpdate().iterator();
|
|
||||||
//$$ while (iterator.hasNext()) {
|
|
||||||
//$$ ChunkRenderer renderchunk = iterator.next();
|
|
||||||
//$$
|
|
||||||
//$$ renderDispatcher.rebuildSync(renderchunk);
|
|
||||||
//$$
|
|
||||||
//#if MC>=10904
|
|
||||||
//$$ renderchunk.unscheduleRebuild();
|
|
||||||
//#else
|
|
||||||
//$$ renderchunk.setNeedsUpdate(false);
|
|
||||||
//#endif
|
|
||||||
//$$ iterator.remove();
|
|
||||||
//$$ }
|
|
||||||
//$$ }
|
|
||||||
//$$
|
|
||||||
//$$ public int nextFrameId() {
|
|
||||||
//$$ return frame++;
|
|
||||||
//$$ }
|
|
||||||
//#endif
|
|
||||||
|
|
||||||
public void uninstall() {
|
public void uninstall() {
|
||||||
//#if MC<11500
|
|
||||||
//$$ workerJailingQueue.freeAll();
|
|
||||||
//#endif
|
|
||||||
|
|
||||||
IForceChunkLoading.from(hooked).replayModRender_setHook(null);
|
IForceChunkLoading.from(hooked).replayModRender_setHook(null);
|
||||||
}
|
}
|
||||||
|
|
||||||
//#if MC>=11500
|
|
||||||
public interface IBlockOnChunkRebuilds {
|
public interface IBlockOnChunkRebuilds {
|
||||||
boolean uploadEverythingBlocking();
|
boolean uploadEverythingBlocking();
|
||||||
}
|
}
|
||||||
//#endif
|
|
||||||
}
|
}
|
||||||
//#endif
|
|
||||||
|
|||||||
@@ -0,0 +1,133 @@
|
|||||||
|
//#if MC>=10800
|
||||||
|
package com.replaymod.render.hooks;
|
||||||
|
|
||||||
|
import com.replaymod.render.mixin.ChunkRenderDispatcherAccessor;
|
||||||
|
import com.replaymod.render.mixin.WorldRendererAccessor;
|
||||||
|
import com.replaymod.render.utils.JailingQueue;
|
||||||
|
import net.minecraft.client.render.WorldRenderer;
|
||||||
|
import net.minecraft.client.render.chunk.BlockBufferBuilderStorage;
|
||||||
|
import net.minecraft.client.render.chunk.ChunkBuilder;
|
||||||
|
import net.minecraft.client.render.chunk.ChunkRenderTask;
|
||||||
|
import net.minecraft.client.render.chunk.ChunkRenderWorker;
|
||||||
|
import net.minecraft.client.render.chunk.ChunkRenderer;
|
||||||
|
|
||||||
|
import java.util.Iterator;
|
||||||
|
|
||||||
|
//#if MC>=10904
|
||||||
|
import java.util.concurrent.PriorityBlockingQueue;
|
||||||
|
//#else
|
||||||
|
//$$ import java.util.concurrent.BlockingQueue;
|
||||||
|
//#endif
|
||||||
|
|
||||||
|
import static com.replaymod.core.versions.MCVer.ChunkRenderWorkerAccessor;
|
||||||
|
|
||||||
|
public class ChunkLoadingRenderGlobal {
|
||||||
|
|
||||||
|
private final WorldRenderer hooked;
|
||||||
|
|
||||||
|
private ChunkBuilder renderDispatcher;
|
||||||
|
//#if MC>=11400
|
||||||
|
private JailingQueue<ChunkRenderTask> workerJailingQueue;
|
||||||
|
//#else
|
||||||
|
//$$ private JailingQueue<ChunkCompileTaskGenerator> workerJailingQueue;
|
||||||
|
//#endif
|
||||||
|
private ChunkRenderWorkerAccessor renderWorker;
|
||||||
|
private int frame;
|
||||||
|
|
||||||
|
public ChunkLoadingRenderGlobal(WorldRenderer renderGlobal) {
|
||||||
|
this.hooked = renderGlobal;
|
||||||
|
|
||||||
|
setup(((WorldRendererAccessor) renderGlobal).getRenderDispatcher());
|
||||||
|
IForceChunkLoading.from(renderGlobal).replayModRender_setHook(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void updateRenderDispatcher(ChunkBuilder renderDispatcher) {
|
||||||
|
if (this.renderDispatcher != null) {
|
||||||
|
workerJailingQueue.freeAll();
|
||||||
|
this.renderDispatcher = null;
|
||||||
|
}
|
||||||
|
if (renderDispatcher != null) {
|
||||||
|
setup(renderDispatcher);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void setup(ChunkBuilder renderDispatcher) {
|
||||||
|
this.renderDispatcher = renderDispatcher;
|
||||||
|
this.renderWorker = (ChunkRenderWorkerAccessor) new ChunkRenderWorker(renderDispatcher, new BlockBufferBuilderStorage());
|
||||||
|
ChunkRenderDispatcherAccessor renderDispatcherAcc = (ChunkRenderDispatcherAccessor) renderDispatcher;
|
||||||
|
|
||||||
|
int workerThreads = renderDispatcherAcc.getListThreadedWorkers().size();
|
||||||
|
//#if MC>=10904
|
||||||
|
PriorityBlockingQueue<ChunkRenderTask> queueChunkUpdates = renderDispatcherAcc.getQueueChunkUpdates();
|
||||||
|
//#else
|
||||||
|
//$$ BlockingQueue<ChunkCompileTaskGenerator> queueChunkUpdates = renderDispatcherAcc.getQueueChunkUpdates();
|
||||||
|
//#endif
|
||||||
|
workerJailingQueue = new JailingQueue<>(queueChunkUpdates);
|
||||||
|
renderDispatcherAcc.setQueueChunkUpdates(workerJailingQueue);
|
||||||
|
//#if MC>=10904
|
||||||
|
ChunkRenderTask element = new ChunkRenderTask(
|
||||||
|
null,
|
||||||
|
null,
|
||||||
|
0
|
||||||
|
//#if MC>=11400
|
||||||
|
, null
|
||||||
|
//#endif
|
||||||
|
);
|
||||||
|
//#else
|
||||||
|
//$$ ChunkCompileTaskGenerator element = new ChunkCompileTaskGenerator(null, null);
|
||||||
|
//#endif
|
||||||
|
element.cancel();
|
||||||
|
for (int i = 0; i < workerThreads; i++) {
|
||||||
|
queueChunkUpdates.add(element);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Temporary workaround for dead lock, will be replaced by a new (ShaderMod compatible) mechanism later
|
||||||
|
//noinspection StatementWithEmptyBody
|
||||||
|
while (renderDispatcher.runTasksSync(0)) {}
|
||||||
|
|
||||||
|
workerJailingQueue.jail(workerThreads);
|
||||||
|
renderDispatcherAcc.setQueueChunkUpdates(queueChunkUpdates);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void updateChunks() {
|
||||||
|
while (renderDispatcher.runTasksSync(0)) {
|
||||||
|
((WorldRendererAccessor) hooked).setDisplayListEntitiesDirty(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
//#if MC>=10904
|
||||||
|
PriorityBlockingQueue<ChunkRenderTask> queueChunkUpdates;
|
||||||
|
//#else
|
||||||
|
//$$ BlockingQueue<ChunkCompileTaskGenerator> queueChunkUpdates;
|
||||||
|
//#endif
|
||||||
|
queueChunkUpdates = ((ChunkRenderDispatcherAccessor) renderDispatcher).getQueueChunkUpdates();
|
||||||
|
while (!queueChunkUpdates.isEmpty()) {
|
||||||
|
try {
|
||||||
|
renderWorker.doRunTask(queueChunkUpdates.poll());
|
||||||
|
} catch (InterruptedException ignored) { }
|
||||||
|
}
|
||||||
|
|
||||||
|
Iterator<ChunkRenderer> iterator = ((WorldRendererAccessor) hooked).getChunksToUpdate().iterator();
|
||||||
|
while (iterator.hasNext()) {
|
||||||
|
ChunkRenderer renderchunk = iterator.next();
|
||||||
|
|
||||||
|
renderDispatcher.rebuildSync(renderchunk);
|
||||||
|
|
||||||
|
//#if MC>=10904
|
||||||
|
renderchunk.unscheduleRebuild();
|
||||||
|
//#else
|
||||||
|
//$$ renderchunk.setNeedsUpdate(false);
|
||||||
|
//#endif
|
||||||
|
iterator.remove();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public int nextFrameId() {
|
||||||
|
return frame++;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void uninstall() {
|
||||||
|
workerJailingQueue.freeAll();
|
||||||
|
IForceChunkLoading.from(hooked).replayModRender_setHook(null);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
//#endif
|
||||||
Reference in New Issue
Block a user