Skip to content

Commit

Permalink
Initial tests
Browse files Browse the repository at this point in the history
  • Loading branch information
mineLdiver committed Nov 19, 2023
1 parent 04e4089 commit cad4753
Show file tree
Hide file tree
Showing 7 changed files with 163 additions and 8 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
package net.mine_diver.smoothbeta.client.render;

import net.mine_diver.smoothbeta.mixin.client.multidraw.TessellatorAccessor;
import net.minecraft.client.render.Tessellator;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class ChunkBuilderManager {
public static final ExecutorService EXECUTOR_SERVICE = Executors.newSingleThreadExecutor();
public static final Tessellator THREAD_TESSELLATOR = TessellatorAccessor.smoothbeta_create(((TessellatorAccessor) Tessellator.INSTANCE).smoothbeta_getBufferSize());
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
package net.mine_diver.smoothbeta.client.render;

import java.util.Queue;
import java.util.concurrent.ConcurrentLinkedQueue;
import java.util.concurrent.Executors;

public class UpdateThread extends Thread {
private static final Object LOCK = new Object();
private static final Queue<Runnable> TASKS = new ConcurrentLinkedQueue<>();

public static void enqueue(Runnable task) {
TASKS.add(task);
LOCK.notifyAll();
}

public UpdateThread() {
setDaemon(true);
}

@Override
public void run() {
// Executors.newSingleThreadExecutor().execute();
// while (true) {
// try {
// LOCK.wait();
// } catch (InterruptedException e) {
// continue;
// }
// Runnable task;
// while ((task = TASKS.poll()) != null) task.run();
// }
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
package net.mine_diver.smoothbeta.mixin.client.multidraw;

import com.llamalad7.mixinextras.injector.ModifyExpressionValue;
import net.mine_diver.smoothbeta.client.render.ChunkBuilderManager;
import net.minecraft.client.render.Tessellator;
import net.minecraft.client.render.block.BlockRenderManager;
import org.objectweb.asm.Opcodes;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.injection.At;

@Mixin(BlockRenderManager.class)
public class BlockRenderManagerMixin {
@ModifyExpressionValue(
method = "*",
at = @At(
value = "FIELD",
target = "Lnet/minecraft/client/render/Tessellator;INSTANCE:Lnet/minecraft/client/render/Tessellator;",
opcode = Opcodes.GETSTATIC
)
)
private static Tessellator smoothbeta_getTessellator(Tessellator tessellator) {
return Thread.currentThread().getName().equals("Minecraft main thread") ? tessellator : ChunkBuilderManager.THREAD_TESSELLATOR;
}
}
Original file line number Diff line number Diff line change
@@ -1,17 +1,17 @@
package net.mine_diver.smoothbeta.mixin.client.multidraw;

import com.llamalad7.mixinextras.injector.ModifyExpressionValue;
import com.llamalad7.mixinextras.injector.ModifyReturnValue;
import net.fabricmc.loader.api.FabricLoader;
import net.mine_diver.smoothbeta.client.render.SmoothChunkRenderer;
import net.mine_diver.smoothbeta.client.render.SmoothTessellator;
import net.mine_diver.smoothbeta.client.render.SmoothWorldRenderer;
import net.mine_diver.smoothbeta.client.render.VboPool;
import net.mine_diver.smoothbeta.client.render.*;
import net.mine_diver.smoothbeta.client.render.gl.VertexBuffer;
import net.minecraft.block.entity.BlockEntity;
import net.minecraft.class_42;
import net.minecraft.client.Minecraft;
import net.minecraft.client.render.Tessellator;
import net.minecraft.client.render.block.BlockRenderManager;
import net.minecraft.client.render.chunk.ChunkBuilder;
import org.objectweb.asm.Opcodes;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Shadow;
import org.spongepowered.asm.mixin.Unique;
Expand All @@ -22,6 +22,8 @@

import java.util.HashSet;

import static net.mine_diver.smoothbeta.client.render.ChunkBuilderManager.THREAD_TESSELLATOR;

@Mixin(ChunkBuilder.class)
class ChunkRendererMixin implements SmoothChunkRenderer {
@Shadow private static Tessellator tessellator;
Expand Down Expand Up @@ -100,4 +102,32 @@ private void smoothbeta_stopRenderingTerrain(CallbackInfo ci) {
smoothbeta_currentBufferIndex = -1;
((SmoothTessellator) tessellator).smoothbeta_stopRenderingTerrain();
}

@ModifyExpressionValue(
method = "<clinit>",
at = @At(
value = "FIELD",
target = "Lnet/minecraft/client/render/Tessellator;INSTANCE:Lnet/minecraft/client/render/Tessellator;",
opcode = Opcodes.GETSTATIC
)
)
private static Tessellator smoothbeta_returnThreadTessellator(Tessellator value) {
return THREAD_TESSELLATOR;
}

@Inject(
method = "rebuild",
at = @At(
value = "FIELD",
target = "Lnet/minecraft/client/render/chunk/ChunkBuilder;chunkUpdates:I",
opcode = Opcodes.GETSTATIC
),
cancellable = true
)
private void smoothbeta_execute(CallbackInfo ci) {
if (Thread.currentThread().getName().equals("Minecraft main thread")) {
ChunkBuilderManager.EXECUTOR_SERVICE.execute(((ChunkBuilder) (Object) this)::rebuild);
ci.cancel();
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
package net.mine_diver.smoothbeta.mixin.client.multidraw;

import net.minecraft.client.render.Tessellator;
import net.modificationstation.stationapi.api.util.Util;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.gen.Accessor;
import org.spongepowered.asm.mixin.gen.Invoker;

@Mixin(Tessellator.class)
public interface TessellatorAccessor {
@Invoker("<init>")
static Tessellator smoothbeta_create(int bufferSize) {
return Util.assertMixin();
}

@Accessor("bufferSize")
int smoothbeta_getBufferSize();
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,11 @@

import net.mine_diver.smoothbeta.client.render.SmoothChunkRenderer;
import net.mine_diver.smoothbeta.client.render.SmoothTessellator;
import net.mine_diver.smoothbeta.client.render.gl.VertexBuffer;
import net.minecraft.client.render.Tessellator;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Shadow;
import org.spongepowered.asm.mixin.Unique;
import net.modificationstation.stationapi.api.tick.TickScheduler;
import org.objectweb.asm.Opcodes;
import org.spongepowered.asm.mixin.*;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Constant;
import org.spongepowered.asm.mixin.injection.Inject;
Expand All @@ -19,6 +20,13 @@ abstract class TessellatorMixin implements SmoothTessellator {
@Shadow protected abstract void reset();

@Shadow private ByteBuffer byteBuffer;

@Mutable
@Shadow @Final public static Tessellator INSTANCE;

@Unique
private static Tessellator smoothbeta_vanillaInstance;

@Unique
private boolean smoothbeta_renderingTerrain;
@Unique
Expand All @@ -29,13 +37,15 @@ abstract class TessellatorMixin implements SmoothTessellator {
public void smoothbeta_startRenderingTerrain(SmoothChunkRenderer chunkRenderer) {
smoothbeta_renderingTerrain = true;
smoothbeta_chunkRenderer = chunkRenderer;
// INSTANCE = (Tessellator) (Object) this;
}

@Override
@Unique
public void smoothbeta_stopRenderingTerrain() {
smoothbeta_renderingTerrain = false;
smoothbeta_chunkRenderer = null;
// INSTANCE = smoothbeta_vanillaInstance;
}

@Override
Expand All @@ -54,11 +64,24 @@ public boolean smoothbeta_isRenderingTerrain() {
)
private void smoothbeta_uploadTerrain(CallbackInfo ci) {
if (!smoothbeta_renderingTerrain) return;
smoothbeta_chunkRenderer.smoothbeta_getCurrentBuffer().upload(byteBuffer);
ByteBuffer byteBuffer1 = clone(byteBuffer);
VertexBuffer vertexBuffer = smoothbeta_chunkRenderer.smoothbeta_getCurrentBuffer();
TickScheduler.CLIENT_RENDER_START.immediate(() -> vertexBuffer.upload(byteBuffer1));
reset();
ci.cancel();
}

@Unique
private static ByteBuffer clone(ByteBuffer original) {
ByteBuffer clone = ByteBuffer.allocateDirect(original.capacity());
original.rewind();
clone.put(original);
// original.rewind();
// clone.flip();
return clone;
}


@ModifyConstant(
method = "vertex(DDD)V",
constant = @Constant(intValue = 7)
Expand All @@ -77,4 +100,17 @@ private int smoothbeta_prohibitExtraVertices(int constant) {
private int smoothbeta_compactVertices(int constant) {
return smoothbeta_renderingTerrain ? 7 : 8;
}

@Inject(
method = "<clinit>",
at = @At(
value = "FIELD",
target = "Lnet/minecraft/client/render/Tessellator;INSTANCE:Lnet/minecraft/client/render/Tessellator;",
opcode = Opcodes.PUTSTATIC,
shift = At.Shift.AFTER
)
)
private static void smoothbeta_setVanillaInstance(CallbackInfo ci) {
smoothbeta_vanillaInstance = INSTANCE;
}
}
2 changes: 2 additions & 0 deletions src/main/resources/smoothbeta.mixins.json
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,10 @@
"client.MinecraftAccessor",
"client.MixinEntityRendererDispatcher",
"client.MixinTileEntityRenderDispatcher",
"client.multidraw.BlockRenderManagerMixin",
"client.multidraw.ChunkRendererMixin",
"client.multidraw.RenderListAccessor",
"client.multidraw.TessellatorAccessor",
"client.multidraw.TessellatorMixin",
"client.multidraw.WorldRendererMixin",
"client.multidraw.compat.arsenic.ArsenicTessellatorMixin",
Expand Down

0 comments on commit cad4753

Please sign in to comment.