From 11d237f5f2817bf08acee1271406763cba256304 Mon Sep 17 00:00:00 2001 From: RainWarrior Date: Sun, 22 Nov 2015 02:10:30 +0300 Subject: [PATCH] Fixed forge lighting working incorrectly outside 0x1000000 coordinates. --- .../model/pipeline/ForgeBlockModelRenderer.java | 13 +++++++++++-- .../client/model/pipeline/VertexLighterFlat.java | 7 ++++--- .../model/pipeline/WorldRendererConsumer.java | 9 ++++++++- 3 files changed, 23 insertions(+), 6 deletions(-) diff --git a/src/main/java/net/minecraftforge/client/model/pipeline/ForgeBlockModelRenderer.java b/src/main/java/net/minecraftforge/client/model/pipeline/ForgeBlockModelRenderer.java index 7c8e638933a..f7c7cf19650 100644 --- a/src/main/java/net/minecraftforge/client/model/pipeline/ForgeBlockModelRenderer.java +++ b/src/main/java/net/minecraftforge/client/model/pipeline/ForgeBlockModelRenderer.java @@ -22,6 +22,7 @@ protected VertexLighterFlat initialValue() return new VertexLighterFlat(); } }; + private final ThreadLocal lighterSmooth = new ThreadLocal() { @Override @@ -31,6 +32,8 @@ protected VertexLighterSmoothAo initialValue() } }; + private final ThreadLocal wrFlat = new ThreadLocal(); + private final ThreadLocal wrSmooth = new ThreadLocal(); private final ThreadLocal lastRendererFlat = new ThreadLocal(); private final ThreadLocal lastRendererSmooth = new ThreadLocal(); @@ -42,8 +45,11 @@ public boolean renderModelStandard(IBlockAccess world, IBakedModel model, Block if(wr != lastRendererFlat.get()) { lastRendererFlat.set(wr); - lighterFlat.get().setParent(new WorldRendererConsumer(wr)); + WorldRendererConsumer newCons = new WorldRendererConsumer(wr); + wrFlat.set(newCons); + lighterFlat.get().setParent(newCons); } + wrFlat.get().setOffset(pos); return render(lighterFlat.get(), world, model, block, pos, wr, checkSides); } else @@ -60,8 +66,11 @@ public boolean renderModelAmbientOcclusion(IBlockAccess world, IBakedModel model if(wr != lastRendererSmooth.get()) { lastRendererSmooth.set(wr); - lighterSmooth.get().setParent(new WorldRendererConsumer(wr)); + WorldRendererConsumer newCons = new WorldRendererConsumer(wr); + wrSmooth.set(newCons); + lighterSmooth.get().setParent(newCons); } + wrSmooth.get().setOffset(pos); return render(lighterSmooth.get(), world, model, block, pos, wr, checkSides); } else diff --git a/src/main/java/net/minecraftforge/client/model/pipeline/VertexLighterFlat.java b/src/main/java/net/minecraftforge/client/model/pipeline/VertexLighterFlat.java index 039c3eb31f3..6ded96597cd 100644 --- a/src/main/java/net/minecraftforge/client/model/pipeline/VertexLighterFlat.java +++ b/src/main/java/net/minecraftforge/client/model/pipeline/VertexLighterFlat.java @@ -144,12 +144,13 @@ protected void processQuad() switch(parent.getVertexFormat().getElement(e).getUsage()) { case POSITION: - float[] pos = new float[4]; + // position adding moved to WorldRendererConsumer due to x and z not fitting completely into a float + /*float[] pos = new float[4]; System.arraycopy(position[v], 0, pos, 0, position[v].length); pos[0] += blockInfo.getBlockPos().getX(); pos[1] += blockInfo.getBlockPos().getY(); - pos[2] += blockInfo.getBlockPos().getZ(); - parent.put(e, pos); + pos[2] += blockInfo.getBlockPos().getZ();*/ + parent.put(e, position[v]); break; case NORMAL: if(normalIndex != -1) { diff --git a/src/main/java/net/minecraftforge/client/model/pipeline/WorldRendererConsumer.java b/src/main/java/net/minecraftforge/client/model/pipeline/WorldRendererConsumer.java index 2e9ee09aa2b..fea7dff2273 100644 --- a/src/main/java/net/minecraftforge/client/model/pipeline/WorldRendererConsumer.java +++ b/src/main/java/net/minecraftforge/client/model/pipeline/WorldRendererConsumer.java @@ -4,6 +4,7 @@ import net.minecraft.client.renderer.WorldRenderer; import net.minecraft.client.renderer.vertex.VertexFormat; +import net.minecraft.util.BlockPos; import net.minecraft.util.EnumFacing; /** @@ -14,6 +15,7 @@ public class WorldRendererConsumer implements IVertexConsumer private final WorldRenderer renderer; private final int[] quadData; private int v = 0; + private BlockPos offset = BlockPos.ORIGIN; public WorldRendererConsumer(WorldRenderer renderer) { @@ -36,13 +38,18 @@ public void put(int e, float... data) if(v == 4) { renderer.addVertexData(quadData); - renderer.putPosition(0, 0, 0); + renderer.putPosition(offset.getX(), offset.getY(), offset.getZ()); Arrays.fill(quadData, 0); v = 0; } } } + public void setOffset(BlockPos offset) + { + this.offset = new BlockPos(offset); + } + public void setQuadTint(int tint) {} public void setQuadOrientation(EnumFacing orientation) {} public void setQuadColored() {}