Skip to content

Commit

Permalink
Fix StationTessellator terrain renderer
Browse files Browse the repository at this point in the history
  • Loading branch information
mineLdiver committed Jul 12, 2023
1 parent 6c0abcf commit 661c761
Show file tree
Hide file tree
Showing 8 changed files with 108 additions and 23 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

import net.mine_diver.smoothbeta.client.render.gl.GlUniform;
import net.mine_diver.smoothbeta.client.render.gl.VertexBuffer;
import net.mine_diver.smoothbeta.mixin.client.RenderListAccessor;
import net.mine_diver.smoothbeta.mixin.client.multidraw.RenderListAccessor;
import net.minecraft.client.render.RenderList;
import net.minecraft.client.render.WorldRenderer;
import net.modificationstation.stationapi.api.util.math.Vec3f;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,4 +4,8 @@ public interface SmoothTessellator {
void smoothbeta_startRenderingTerrain(TerrainContext context);

void smoothbeta_stopRenderingTerrain();

boolean smoothbeta_isRenderingTerrain();

TerrainContext smoothbeta_getTerrainContext();
}
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package net.mine_diver.smoothbeta.mixin.client;
package net.mine_diver.smoothbeta.mixin.client.multidraw;

import net.fabricmc.loader.api.FabricLoader;
import net.mine_diver.smoothbeta.client.render.*;
Expand All @@ -15,7 +15,6 @@
import org.spongepowered.asm.mixin.Unique;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.Redirect;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
import org.spongepowered.asm.mixin.injection.callback.LocalCapture;

Expand All @@ -31,9 +30,6 @@ public class ChunkRendererMixin implements SmoothChunkRenderer {
@Shadow public int field_240;
@Shadow public int field_241;
@Shadow public int field_242;
@Shadow public int field_231;
@Shadow public int field_233;
@Shadow public int field_232;
@Unique
private VertexBuffer[] smoothbeta_buffers;
@Unique
Expand Down Expand Up @@ -75,7 +71,6 @@ private void smoothbeta_startRenderingTerrain(
float f = 1.000001f;
smoothbeta_matrices.scale(f, f, f);
smoothbeta_matrices.translate((float)this.field_236 / 2.0f, (float)this.field_235 / 2.0f, (float)this.field_236 / 2.0f);
smoothbeta_matrices.translate(-this.field_231, -this.field_232, -this.field_233);
((SmoothTessellator) tesselator).smoothbeta_startRenderingTerrain(
new TerrainContext(
smoothbeta_matrices,
Expand All @@ -96,13 +91,4 @@ private void smoothbeta_stopRenderingTerrain(CallbackInfo ci) {
((SmoothTessellator) tesselator).smoothbeta_stopRenderingTerrain();
smoothbeta_matrices.pop();
}

@Redirect(
method = "method_296",
at = @At(
value = "INVOKE",
target = "Lnet/minecraft/client/render/Tessellator;setOffset(DDD)V"
)
)
private void smoothbeta_disableTessellatorOffset(Tessellator instance, double e, double f, double v) {}
}
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package net.mine_diver.smoothbeta.mixin.client;
package net.mine_diver.smoothbeta.mixin.client.multidraw;

import net.minecraft.client.render.RenderList;
import org.spongepowered.asm.mixin.Mixin;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package net.mine_diver.smoothbeta.mixin.client;
package net.mine_diver.smoothbeta.mixin.client.multidraw;

import net.mine_diver.smoothbeta.client.render.SmoothTessellator;
import net.mine_diver.smoothbeta.client.render.TerrainContext;
Expand Down Expand Up @@ -38,6 +38,16 @@ public void smoothbeta_stopRenderingTerrain() {
smoothbeta_terrainConext = null;
}

@Override
public boolean smoothbeta_isRenderingTerrain() {
return smoothbeta_renderingTerrain;
}

@Override
public TerrainContext smoothbeta_getTerrainContext() {
return smoothbeta_terrainConext;
}

@Inject(
method = "draw",
at = @At(
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package net.mine_diver.smoothbeta.mixin.client;
package net.mine_diver.smoothbeta.mixin.client.multidraw;

import net.mine_diver.smoothbeta.client.render.*;
import net.mine_diver.smoothbeta.client.render.gl.VertexBuffer;
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,84 @@
package net.mine_diver.smoothbeta.mixin.client.multidraw.compat.arsenic;

import net.mine_diver.smoothbeta.client.render.SmoothTessellator;
import net.minecraft.client.render.Tessellator;
import net.modificationstation.stationapi.api.client.render.model.BakedQuad;
import net.modificationstation.stationapi.api.util.math.Vector4f;
import net.modificationstation.stationapi.impl.client.render.StationTessellatorImpl;
import net.modificationstation.stationapi.mixin.render.client.TessellatorAccessor;
import org.spongepowered.asm.mixin.Final;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Shadow;
import org.spongepowered.asm.mixin.Unique;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;

@Mixin(StationTessellatorImpl.class)
public abstract class StationTessellatorImplMixin {
@Shadow @Final private Tessellator self;

@Shadow @Final private int[] fastVertexData;
@Shadow @Final private TessellatorAccessor access;

@Shadow public abstract void ensureBufferCapacity(int criticalCapacity);

@Unique
private final Vector4f smoothbeta_pos = new Vector4f();

@Inject(
method = "quad",
at = @At("HEAD"),
cancellable = true,
remap = false
)
private void smoothbeta_renderTerrain(BakedQuad quad, float x, float y, float z, int colour0, int colour1, int colour2, int colour3, float normalX, float normalY, float normalZ, boolean spreadUV, CallbackInfo ci) {
if (((SmoothTessellator) self).smoothbeta_isRenderingTerrain()) {
smoothbeta_pos.set(x, y, z, 1);
smoothbeta_pos.transform(((SmoothTessellator) self).smoothbeta_getTerrainContext().matrices().peek().getPositionMatrix());
x = smoothbeta_pos.getX();
y = smoothbeta_pos.getY();
z = smoothbeta_pos.getZ();
byte by = (byte)(normalX * 128.0f);
byte by2 = (byte)(normalY * 127.0f);
byte by3 = (byte)(normalZ * 127.0f);
int normal = by | by2 << 8 | by3 << 16;
int[] vertexData = quad.getVertexData();
System.arraycopy(vertexData, 0, fastVertexData, 0, 7);
System.arraycopy(vertexData, 8, fastVertexData, 7, 7);
System.arraycopy(vertexData, 16, fastVertexData, 14, 7);
System.arraycopy(vertexData, 24, fastVertexData, 21, 7);
fastVertexData[0] = Float.floatToRawIntBits((float) (Float.intBitsToFloat(fastVertexData[0]) + x + access.getXOffset()));
fastVertexData[1] = Float.floatToRawIntBits((float) (Float.intBitsToFloat(fastVertexData[1]) + y + access.getYOffset()));
fastVertexData[2] = Float.floatToRawIntBits((float) (Float.intBitsToFloat(fastVertexData[2]) + z + access.getZOffset()));
fastVertexData[6] = normal;
fastVertexData[7] = Float.floatToRawIntBits((float) (Float.intBitsToFloat(fastVertexData[7]) + x + access.getXOffset()));
fastVertexData[8] = Float.floatToRawIntBits((float) (Float.intBitsToFloat(fastVertexData[8]) + y + access.getYOffset()));
fastVertexData[9] = Float.floatToRawIntBits((float) (Float.intBitsToFloat(fastVertexData[9]) + z + access.getZOffset()));
fastVertexData[13] = normal;
fastVertexData[14] = Float.floatToRawIntBits((float) (Float.intBitsToFloat(fastVertexData[14]) + x + access.getXOffset()));
fastVertexData[15] = Float.floatToRawIntBits((float) (Float.intBitsToFloat(fastVertexData[15]) + y + access.getYOffset()));
fastVertexData[16] = Float.floatToRawIntBits((float) (Float.intBitsToFloat(fastVertexData[16]) + z + access.getZOffset()));
fastVertexData[20] = normal;
fastVertexData[21] = Float.floatToRawIntBits((float) (Float.intBitsToFloat(fastVertexData[21]) + x + access.getXOffset()));
fastVertexData[22] = Float.floatToRawIntBits((float) (Float.intBitsToFloat(fastVertexData[22]) + y + access.getYOffset()));
fastVertexData[23] = Float.floatToRawIntBits((float) (Float.intBitsToFloat(fastVertexData[23]) + z + access.getZOffset()));
fastVertexData[27] = normal;
if (!access.getDisableColour()) {
fastVertexData[5] = colour0;
fastVertexData[12] = colour1;
fastVertexData[19] = colour2;
fastVertexData[26] = colour3;
access.setHasColour(true);
}
access.setHasTexture(true);
access.setHasNormals(true);
System.arraycopy(fastVertexData, 0, access.stationapi$getBufferArray(), access.stationapi$getBufferPosition(), 28);
access.stationapi$setVertexAmount(access.stationapi$getVertexAmount() + 4);
access.stationapi$setBufferPosition(access.stationapi$getBufferPosition() + 28);
access.stationapi$setVertexCount(access.stationapi$getVertexCount() + 4);
ensureBufferCapacity(28);
ci.cancel();
}
}
}
9 changes: 5 additions & 4 deletions src/main/resources/smoothbeta.mixins.json
Original file line number Diff line number Diff line change
Expand Up @@ -4,13 +4,14 @@
"package": "net.mine_diver.smoothbeta.mixin",
"compatibilityLevel": "JAVA_8",
"client": [
"client.ChunkRendererMixin",
"client.MinecraftAccessor",
"client.MixinEntityRendererDispatcher",
"client.MixinTileEntityRenderDispatcher",
"client.RenderListAccessor",
"client.TessellatorMixin",
"client.WorldRendererMixin"
"client.multidraw.ChunkRendererMixin",
"client.multidraw.RenderListAccessor",
"client.multidraw.TessellatorMixin",
"client.multidraw.WorldRendererMixin",
"client.multidraw.compat.arsenic.StationTessellatorImplMixin"
],
"mixins": [
"MixinEntityRegistry",
Expand Down

0 comments on commit 661c761

Please sign in to comment.