From 0f869edf26246fe037d199fad94604e21803b408 Mon Sep 17 00:00:00 2001
From: grondag <grondag@users.noreply.github.com>
Date: Thu, 17 Oct 2019 08:54:54 -0700
Subject: [PATCH] Fix indigo rendering in 19w42a (#405)

* Fix indigo rendering in 19w42a
* Prevent crashes for modded item rendering

VertexConsumer now thows unless all vertex elements are populated.  Overlay UV coordinates are thus required for block breaking, item glint, etc.  Block breaking doesn't seem to work fully for non-vanilla models, but cause isn't yet clear.
---
 build.gradle                                  |  2 +-
 fabric-renderer-indigo/build.gradle           |  2 +-
 .../indigo/IndigoMixinConfigPlugin.java       |  8 --------
 .../renderer/render/AbstractQuadRenderer.java |  7 +++++--
 .../render/AbstractRenderContext.java         | 15 +--------------
 .../renderer/render/BlockRenderContext.java   | 12 ++++++++----
 .../renderer/render/ItemRenderContext.java    |  3 ++-
 .../render/TerrainFallbackConsumer.java       |  2 +-
 .../renderer/render/TerrainMeshConsumer.java  |  2 +-
 .../renderer/render/TerrainRenderContext.java | 19 +++++++++++++++----
 10 files changed, 35 insertions(+), 37 deletions(-)

diff --git a/build.gradle b/build.gradle
index f3b2e55e0..7267e28b0 100644
--- a/build.gradle
+++ b/build.gradle
@@ -12,7 +12,7 @@ plugins {
 def ENV = System.getenv()
 
 class Globals {
-	static def baseVersion = "0.4.6"
+	static def baseVersion = "0.4.7"
 	static def mcVersion = "19w42a"
 	static def yarnVersion = "+build.1"
 }
diff --git a/fabric-renderer-indigo/build.gradle b/fabric-renderer-indigo/build.gradle
index fb95c542b..dfca605aa 100644
--- a/fabric-renderer-indigo/build.gradle
+++ b/fabric-renderer-indigo/build.gradle
@@ -1,5 +1,5 @@
 archivesBaseName = "fabric-renderer-indigo"
-version = getSubprojectVersion(project, "0.2.6")
+version = getSubprojectVersion(project, "0.2.7")
 
 dependencies {
 	compile project(path: ':fabric-api-base', configuration: 'dev')
diff --git a/fabric-renderer-indigo/src/main/java/net/fabricmc/indigo/IndigoMixinConfigPlugin.java b/fabric-renderer-indigo/src/main/java/net/fabricmc/indigo/IndigoMixinConfigPlugin.java
index faf8a5739..c31b4811c 100644
--- a/fabric-renderer-indigo/src/main/java/net/fabricmc/indigo/IndigoMixinConfigPlugin.java
+++ b/fabric-renderer-indigo/src/main/java/net/fabricmc/indigo/IndigoMixinConfigPlugin.java
@@ -61,14 +61,6 @@ public class IndigoMixinConfigPlugin implements IMixinConfigPlugin {
 	}
 
 	static boolean shouldForceCompatibility() {
-		if(true){
-			/**
-			 * TODO: remove me, and fix indigo
-			 *
-			 * This has been done to work around some funky rendering issues as of 19w42a
-			 */
-			return true;
-		}
 		loadIfNeeded();
 		return forceCompatibility;
 	}
diff --git a/fabric-renderer-indigo/src/main/java/net/fabricmc/indigo/renderer/render/AbstractQuadRenderer.java b/fabric-renderer-indigo/src/main/java/net/fabricmc/indigo/renderer/render/AbstractQuadRenderer.java
index 21e1d221b..f54791c23 100644
--- a/fabric-renderer-indigo/src/main/java/net/fabricmc/indigo/renderer/render/AbstractQuadRenderer.java
+++ b/fabric-renderer-indigo/src/main/java/net/fabricmc/indigo/renderer/render/AbstractQuadRenderer.java
@@ -45,6 +45,8 @@ public abstract class AbstractQuadRenderer {
 
 	protected abstract Matrix4f matrix();
 
+	protected abstract int overlay();
+
 	AbstractQuadRenderer(BlockRenderInfo blockInfo, Function<RenderLayer, VertexConsumer> bufferFunc, AoCalculator aoCalc, QuadTransform transform) {
 		this.blockInfo = blockInfo;
 		this.bufferFunc = bufferFunc;
@@ -69,15 +71,16 @@ public abstract class AbstractQuadRenderer {
 
 	/** final output step, common to all renders */
 	private void bufferQuad(MutableQuadViewImpl quad, RenderLayer renderLayer) {
-		bufferQuad(bufferFunc.apply(renderLayer), quad, matrix());
+		bufferQuad(bufferFunc.apply(renderLayer), quad, matrix(), overlay());
 	}
 
-	public static void bufferQuad(VertexConsumer buff, MutableQuadViewImpl quad, Matrix4f matrix) {
+	public static void bufferQuad(VertexConsumer buff, MutableQuadViewImpl quad, Matrix4f matrix, int overlay) {
 		for (int i = 0; i < 4; i++) {
 			buff.vertex(matrix, quad.x(i), quad.y(i), quad.z(i));
 			final int color = quad.spriteColor(i, 0);
 			buff.color(color & 0xFF, (color >> 8) & 0xFF, (color >> 16) & 0xFF, (color >> 24) & 0xFF);
 			buff.texture(quad.spriteU(i, 0), quad.spriteV(i, 0));
+			buff.defaultOverlay(overlay);
 			buff.light(quad.lightmap(i));
 			buff.normal(quad.normalX(i), quad.normalY(i), quad.normalZ(i));
 			buff.next();
diff --git a/fabric-renderer-indigo/src/main/java/net/fabricmc/indigo/renderer/render/AbstractRenderContext.java b/fabric-renderer-indigo/src/main/java/net/fabricmc/indigo/renderer/render/AbstractRenderContext.java
index 11aeffc94..a575e553e 100644
--- a/fabric-renderer-indigo/src/main/java/net/fabricmc/indigo/renderer/render/AbstractRenderContext.java
+++ b/fabric-renderer-indigo/src/main/java/net/fabricmc/indigo/renderer/render/AbstractRenderContext.java
@@ -19,26 +19,13 @@ package net.fabricmc.indigo.renderer.render;
 import it.unimi.dsi.fastutil.objects.ObjectArrayList;
 import net.fabricmc.fabric.api.renderer.v1.mesh.MutableQuadView;
 import net.fabricmc.fabric.api.renderer.v1.render.RenderContext;
-import net.minecraft.block.BlockState;
 import net.minecraft.client.util.math.Matrix4f;
-import net.minecraft.util.math.BlockPos;
-import net.minecraft.util.math.MatrixStack;
-import net.minecraft.util.math.Vec3d;
-import net.minecraft.world.BlockRenderView;
 
 abstract class AbstractRenderContext implements RenderContext {
 	private final ObjectArrayList<QuadTransform> transformStack = new ObjectArrayList<>();
 	private static final QuadTransform NO_TRANSFORM = (q) -> true;
-	protected MatrixStack matrixStack;
 	protected Matrix4f matrix;
-
-	protected void prepareMatrix(BlockState blockState, BlockPos blockPos, BlockRenderView blockView, MatrixStack matrixStack) {
-		this.matrixStack = matrixStack;
-		Vec3d vec = blockState.getOffsetPos(blockView, blockPos);
-		matrixStack.push();
-		matrixStack.translate((double)(blockPos.getX() & 15) + vec.x, (double)(blockPos.getY() & 15) + vec.y, (double)(blockPos.getZ() & 15) + vec.z);
-		matrix = matrixStack.peek();
-	}
+	protected int overlay;
 
 	private final QuadTransform stackTransform = (q) -> {
 		int i = transformStack.size() - 1;
diff --git a/fabric-renderer-indigo/src/main/java/net/fabricmc/indigo/renderer/render/BlockRenderContext.java b/fabric-renderer-indigo/src/main/java/net/fabricmc/indigo/renderer/render/BlockRenderContext.java
index 5776d91e6..f56d14701 100644
--- a/fabric-renderer-indigo/src/main/java/net/fabricmc/indigo/renderer/render/BlockRenderContext.java
+++ b/fabric-renderer-indigo/src/main/java/net/fabricmc/indigo/renderer/render/BlockRenderContext.java
@@ -47,9 +47,9 @@ public class BlockRenderContext extends AbstractRenderContext implements RenderC
 	private BlockModelRenderer vanillaRenderer;
 	private VertexConsumer bufferBuilder;
 	private long seed;
-	private int overlay;
 	private boolean isCallingVanilla = false;
 	private boolean didOutput = false;
+	private MatrixStack matrixStack;
 
 	public boolean isCallingVanilla() {
 		return isCallingVanilla;
@@ -76,7 +76,8 @@ public class BlockRenderContext extends AbstractRenderContext implements RenderC
 	public boolean tesselate(BlockModelRenderer vanillaRenderer, BlockRenderView blockView, BakedModel model, BlockState state, BlockPos pos, MatrixStack matrixStack, VertexConsumer buffer, boolean checkSides, long seed, int overlay) {
 		this.vanillaRenderer = vanillaRenderer;
 		this.bufferBuilder = buffer;
-		this.prepareMatrix(state, pos, blockView, matrixStack);
+		this.matrixStack = matrixStack;
+		this.matrix = matrixStack.peek();
 
 		this.seed = seed;
 		this.overlay = overlay;
@@ -91,8 +92,6 @@ public class BlockRenderContext extends AbstractRenderContext implements RenderC
 		blockInfo.release();
 		this.bufferBuilder = null;
 
-		matrixStack.pop();
-
 		return didOutput;
 	}
 
@@ -111,6 +110,11 @@ public class BlockRenderContext extends AbstractRenderContext implements RenderC
 		protected Matrix4f matrix() {
 			return matrix;
 		}
+
+		@Override
+		protected int overlay() {
+			return overlay;
+		}
 	}
 
 	@Override
diff --git a/fabric-renderer-indigo/src/main/java/net/fabricmc/indigo/renderer/render/ItemRenderContext.java b/fabric-renderer-indigo/src/main/java/net/fabricmc/indigo/renderer/render/ItemRenderContext.java
index 9e304893e..b11e57c63 100644
--- a/fabric-renderer-indigo/src/main/java/net/fabricmc/indigo/renderer/render/ItemRenderContext.java
+++ b/fabric-renderer-indigo/src/main/java/net/fabricmc/indigo/renderer/render/ItemRenderContext.java
@@ -88,6 +88,7 @@ public class ItemRenderContext extends AbstractRenderContext implements RenderCo
 		this.bufferBuilder = buffer;
 		this.matrixStack = matrixStack;
 		this.matrix = matrixStack.peek();
+		this.overlay = overlay;
 
 		this.vanillaHandler = vanillaHandler;
 		model.emitItemQuads(stack, randomSupplier, this);
@@ -155,7 +156,7 @@ public class ItemRenderContext extends AbstractRenderContext implements RenderCo
 			quad.lightmap(i, ColorHelper.maxBrightness(quad.lightmap(i), lightmap));
 		}
 
-		AbstractQuadRenderer.bufferQuad(bufferBuilder, quad, matrix);
+		AbstractQuadRenderer.bufferQuad(bufferBuilder, quad, matrix, overlay);
 	}
 
 	@Override
diff --git a/fabric-renderer-indigo/src/main/java/net/fabricmc/indigo/renderer/render/TerrainFallbackConsumer.java b/fabric-renderer-indigo/src/main/java/net/fabricmc/indigo/renderer/render/TerrainFallbackConsumer.java
index 25cf923e5..6dea18ba0 100644
--- a/fabric-renderer-indigo/src/main/java/net/fabricmc/indigo/renderer/render/TerrainFallbackConsumer.java
+++ b/fabric-renderer-indigo/src/main/java/net/fabricmc/indigo/renderer/render/TerrainFallbackConsumer.java
@@ -55,7 +55,7 @@ import net.minecraft.util.math.Direction;
  *  vertex data is sent to the byte buffer.  Generally POJO array access will be faster than
  *  manipulating the data via NIO.
  */
-public class TerrainFallbackConsumer extends AbstractQuadRenderer implements Consumer<BakedModel> {
+public abstract class TerrainFallbackConsumer extends AbstractQuadRenderer implements Consumer<BakedModel> {
 	private static Value MATERIAL_FLAT = (Value) IndigoRenderer.INSTANCE.materialFinder().disableAo(0, true).find();
 	private static Value MATERIAL_SHADED = (Value) IndigoRenderer.INSTANCE.materialFinder().find();
 
diff --git a/fabric-renderer-indigo/src/main/java/net/fabricmc/indigo/renderer/render/TerrainMeshConsumer.java b/fabric-renderer-indigo/src/main/java/net/fabricmc/indigo/renderer/render/TerrainMeshConsumer.java
index a698c608a..589dad54b 100644
--- a/fabric-renderer-indigo/src/main/java/net/fabricmc/indigo/renderer/render/TerrainMeshConsumer.java
+++ b/fabric-renderer-indigo/src/main/java/net/fabricmc/indigo/renderer/render/TerrainMeshConsumer.java
@@ -22,7 +22,7 @@ import net.fabricmc.fabric.api.renderer.v1.render.RenderContext.QuadTransform;
 import net.fabricmc.indigo.renderer.aocalc.AoCalculator;
 import net.minecraft.client.util.math.Matrix4f;
 
-public class TerrainMeshConsumer extends AbstractMeshConsumer {
+public abstract class TerrainMeshConsumer extends AbstractMeshConsumer {
 	final Supplier<Matrix4f> matrixSupplier;
 
 	TerrainMeshConsumer(TerrainBlockRenderInfo blockInfo, ChunkRenderInfo chunkInfo, AoCalculator aoCalc, QuadTransform transform, Supplier<Matrix4f> matrixSupplier) {
diff --git a/fabric-renderer-indigo/src/main/java/net/fabricmc/indigo/renderer/render/TerrainRenderContext.java b/fabric-renderer-indigo/src/main/java/net/fabricmc/indigo/renderer/render/TerrainRenderContext.java
index deefefe6c..221204164 100644
--- a/fabric-renderer-indigo/src/main/java/net/fabricmc/indigo/renderer/render/TerrainRenderContext.java
+++ b/fabric-renderer-indigo/src/main/java/net/fabricmc/indigo/renderer/render/TerrainRenderContext.java
@@ -46,8 +46,20 @@ public class TerrainRenderContext extends AbstractRenderContext implements Rende
 	private final TerrainBlockRenderInfo blockInfo = new TerrainBlockRenderInfo();
 	private final ChunkRenderInfo chunkInfo = new ChunkRenderInfo();
 	private final AoCalculator aoCalc = new AoCalculator(blockInfo, chunkInfo::cachedBrightness, chunkInfo::cachedAoLevel);
-	private final TerrainMeshConsumer meshConsumer = new TerrainMeshConsumer(blockInfo, chunkInfo, aoCalc, this::transform, this::matrix);
-	private final TerrainFallbackConsumer fallbackConsumer = new TerrainFallbackConsumer(blockInfo, chunkInfo, aoCalc, this::transform, this::matrix);
+
+	private final TerrainMeshConsumer meshConsumer = new TerrainMeshConsumer(blockInfo, chunkInfo, aoCalc, this::transform, this::matrix) {
+		@Override
+		protected int overlay() {
+			return overlay;
+		}
+	};
+
+	private final TerrainFallbackConsumer fallbackConsumer = new TerrainFallbackConsumer(blockInfo, chunkInfo, aoCalc, this::transform, this::matrix) {
+		@Override
+		protected int overlay() {
+			return overlay;
+		}
+	};
 
 	public TerrainRenderContext prepare(ChunkRendererRegion blockView, ChunkRenderer chunkRenderer, ChunkRenderData chunkData, BlockLayeredBufferBuilderStorage builders) {
 		blockInfo.setBlockView(blockView);
@@ -66,7 +78,7 @@ public class TerrainRenderContext extends AbstractRenderContext implements Rende
 
 	/** Called from chunk renderer hook. */
 	public boolean tesselateBlock(BlockState blockState, BlockPos blockPos, final BakedModel model, MatrixStack matrixStack) {
-		prepareMatrix(blockState, blockPos, blockInfo.blockView, matrixStack);
+		this.matrix = matrixStack.peek();
 		try {
 			aoCalc.clear();
 			blockInfo.prepareForBlock(blockState, blockPos, model.useAmbientOcclusion());
@@ -77,7 +89,6 @@ public class TerrainRenderContext extends AbstractRenderContext implements Rende
 			CrashReportSection.addBlockInfo(crashReportElement_1, blockPos, blockState);
 			throw new CrashException(crashReport_1);
 		}
-		matrixStack.pop();
 		// false because we've already marked the chunk as populated - caller doesn't need to
 		return false;
 	}