Skip to content

Commit bdb6fc1

Browse files
committed
item rendering start
1 parent 7754215 commit bdb6fc1

File tree

6 files changed

+87
-44
lines changed

6 files changed

+87
-44
lines changed

src/main/java/net/ludocrypt/limlib/access/IrisClientAccess.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,4 +4,6 @@ public interface IrisClientAccess {
44

55
public boolean areShadersInUse();
66

7+
public boolean isHandRenderingActive();
8+
79
}

src/main/java/net/ludocrypt/limlib/access/WorldRendererAccess.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,4 +20,6 @@ public interface WorldRendererAccess {
2020

2121
public boolean isRenderingHands();
2222

23+
public boolean isRenderingItems();
24+
2325
}

src/main/java/net/ludocrypt/limlib/api/render/LiminalQuadRenderer.java

Lines changed: 27 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -37,29 +37,15 @@
3737
@Environment(EnvType.CLIENT)
3838
public abstract class LiminalQuadRenderer {
3939

40-
public List<Runnable> renderQueue = Lists.newArrayList();
40+
public List<Runnable> heldItemRenderQueue = Lists.newArrayList();
41+
42+
public List<Runnable> itemRenderQueue = Lists.newArrayList();
4143

4244
public abstract void renderQuad(BakedQuad quad, BufferBuilder bufferBuilder, Matrix4f matrix, Camera camera, World world, MatrixStack matrices, List<Pair<BakedQuad, Optional<Direction>>> quads);
4345

4446
public void renderQuads(List<Pair<BakedQuad, Optional<Direction>>> quads, World world, BlockPos pos, BlockState state, MatrixStack matrices, Camera camera) {
45-
Matrix4f matrix = new MatrixStack().peek().getPositionMatrix().copy();
46-
47-
// Stationize
48-
matrix.multiply(Vec3f.NEGATIVE_Y.getDegreesQuaternion(180));
49-
matrix.multiply(Vec3f.NEGATIVE_Y.getDegreesQuaternion(camera.getYaw()));
50-
matrix.multiply(Vec3f.NEGATIVE_X.getDegreesQuaternion(camera.getPitch()));
51-
52-
matrix.multiply(matrices.peek().getPositionMatrix().copy());
53-
54-
RenderSystem.disableTexture();
55-
RenderSystem.depthMask(true);
56-
RenderSystem.enableBlend();
57-
RenderSystem.enableDepthTest();
58-
RenderSystem.blendFuncSeparate(GlStateManager.SrcFactor.SRC_ALPHA, GlStateManager.DstFactor.ONE_MINUS_SRC_ALPHA, GlStateManager.SrcFactor.ONE, GlStateManager.DstFactor.ONE_MINUS_SRC_ALPHA);
59-
RenderSystem.polygonOffset(this.renderBehind() ? 3.0F : -3.0F, this.renderBehind() ? 3.0F : -3.0F);
60-
RenderSystem.enablePolygonOffset();
61-
BufferBuilder bufferBuilder = Tessellator.getInstance().getBuffer();
62-
bufferBuilder.begin(drawMode(), vertexFormat());
47+
Matrix4f matrix = setupMatrix(matrices, camera);
48+
BufferBuilder bufferBuilder = setupRenderer(matrices, camera);
6349

6450
for (Pair<BakedQuad, Optional<Direction>> quadPair : quads) {
6551
BakedQuad quad = quadPair.getFirst();
@@ -72,23 +58,19 @@ public void renderQuads(List<Pair<BakedQuad, Optional<Direction>>> quads, World
7258
}
7359
}
7460

75-
BufferRenderer.drawWithShader(bufferBuilder.end());
76-
RenderSystem.polygonOffset(0.0F, 0.0F);
77-
RenderSystem.disablePolygonOffset();
78-
RenderSystem.disableBlend();
79-
RenderSystem.enableTexture();
61+
this.endRenderer(bufferBuilder, matrices, camera);
8062
}
8163

8264
public void renderItemQuads(List<Pair<BakedQuad, Optional<Direction>>> quads, World world, ItemStack stack, MatrixStack matrices, Camera camera) {
83-
Matrix4f matrix = new MatrixStack().peek().getPositionMatrix().copy();
65+
Matrix4f matrix = setupMatrix(matrices, camera);
66+
BufferBuilder bufferBuilder = setupRenderer(matrices, camera);
8467

85-
// Stationize
86-
matrix.multiply(Vec3f.NEGATIVE_Y.getDegreesQuaternion(180));
87-
matrix.multiply(Vec3f.NEGATIVE_Y.getDegreesQuaternion(camera.getYaw()));
88-
matrix.multiply(Vec3f.NEGATIVE_X.getDegreesQuaternion(camera.getPitch()));
68+
quads.forEach((pair) -> this.renderQuad(pair.getFirst(), bufferBuilder, matrix, camera, world, matrices, quads));
8969

90-
matrix.multiply(matrices.peek().getPositionMatrix().copy());
70+
this.endRenderer(bufferBuilder, matrices, camera);
71+
}
9172

73+
public BufferBuilder setupRenderer(MatrixStack matrices, Camera camera) {
9274
RenderSystem.disableTexture();
9375
RenderSystem.depthMask(true);
9476
RenderSystem.enableBlend();
@@ -99,8 +81,22 @@ public void renderItemQuads(List<Pair<BakedQuad, Optional<Direction>>> quads, Wo
9981
BufferBuilder bufferBuilder = Tessellator.getInstance().getBuffer();
10082
bufferBuilder.begin(drawMode(), vertexFormat());
10183

102-
quads.forEach((pair) -> this.renderQuad(pair.getFirst(), bufferBuilder, matrix, camera, world, matrices, quads));
84+
return bufferBuilder;
85+
}
86+
87+
public Matrix4f setupMatrix(MatrixStack matrices, Camera camera) {
88+
Matrix4f matrix = new MatrixStack().peek().getPositionMatrix().copy();
89+
90+
// Stationize
91+
matrix.multiply(Vec3f.NEGATIVE_Y.getDegreesQuaternion(180));
92+
matrix.multiply(Vec3f.NEGATIVE_Y.getDegreesQuaternion(camera.getYaw()));
93+
matrix.multiply(Vec3f.NEGATIVE_X.getDegreesQuaternion(camera.getPitch()));
94+
95+
matrix.multiply(matrices.peek().getPositionMatrix().copy());
96+
return matrix;
97+
}
10398

99+
public void endRenderer(BufferBuilder bufferBuilder, MatrixStack matrices, Camera camera) {
104100
BufferRenderer.drawWithShader(bufferBuilder.end());
105101
RenderSystem.polygonOffset(0.0F, 0.0F);
106102
RenderSystem.disablePolygonOffset();

src/main/java/net/ludocrypt/limlib/mixin/ItemRendererMixin.java

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -24,17 +24,14 @@ public class ItemRendererMixin {
2424
private void limlib$renderBakedItemModel(BakedModel model, ItemStack stack, int light, int overlay, MatrixStack matrices, VertexConsumer vertices, CallbackInfo ci) {
2525
MinecraftClient client = MinecraftClient.getInstance();
2626

27-
boolean isIris = false;
27+
boolean isHandRendering = ((WorldRendererAccess) client.worldRenderer).isRenderingHands() || (FabricLoader.getInstance().isModLoaded("iris") && ((IrisClientAccess) client).isHandRenderingActive());
28+
boolean isItemRendering = ((WorldRendererAccess) client.worldRenderer).isRenderingItems();
2829

29-
if (FabricLoader.getInstance().isModLoaded("iris")) {
30-
isIris = ((IrisClientAccess) client).areShadersInUse();
31-
}
32-
33-
if (((WorldRendererAccess) client.worldRenderer).isRenderingHands() || isIris) {
30+
if (isHandRendering || isItemRendering) {
3431
MatrixStack matrixStack = new MatrixStack();
3532
matrixStack.multiplyPositionMatrix(matrices.peek().getPositionMatrix().copy());
3633

37-
((BakedModelAccess) model).getSubQuads().forEach((id, quads) -> LimlibRegistries.LIMINAL_QUAD_RENDERER.get(id).renderQueue.add(() -> LimlibRegistries.LIMINAL_QUAD_RENDERER.get(id).renderItemQuads(quads, client.world, stack.copy(), matrixStack, client.gameRenderer.getCamera())));
34+
((BakedModelAccess) model).getSubQuads().forEach((id, quads) -> (isHandRendering ? LimlibRegistries.LIMINAL_QUAD_RENDERER.get(id).heldItemRenderQueue : LimlibRegistries.LIMINAL_QUAD_RENDERER.get(id).itemRenderQueue).add(() -> LimlibRegistries.LIMINAL_QUAD_RENDERER.get(id).renderItemQuads(quads, client.world, stack.copy(), matrixStack, client.gameRenderer.getCamera())));
3835
}
3936
}
4037
}

src/main/java/net/ludocrypt/limlib/mixin/WorldRendererMixin.java

Lines changed: 46 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -25,10 +25,13 @@
2525
import net.minecraft.client.gl.SimpleFramebuffer;
2626
import net.minecraft.client.render.BufferBuilderStorage;
2727
import net.minecraft.client.render.Camera;
28+
import net.minecraft.client.render.VertexConsumerProvider;
2829
import net.minecraft.client.render.WorldRenderer;
2930
import net.minecraft.client.render.WorldRenderer.ChunkInfo;
3031
import net.minecraft.client.util.math.MatrixStack;
3132
import net.minecraft.client.world.ClientWorld;
33+
import net.minecraft.entity.Entity;
34+
import net.minecraft.entity.ItemEntity;
3235
import net.minecraft.util.math.BlockPos;
3336
import net.minecraft.util.math.Matrix4f;
3437
import net.minecraft.util.math.Vec3f;
@@ -54,6 +57,9 @@ public abstract class WorldRendererMixin implements WorldRendererAccess {
5457
@Unique
5558
private boolean isRenderingHands = false;
5659

60+
@Unique
61+
private boolean isRenderingItems = false;
62+
5763
@Override
5864
public void renderSky(MatrixStack matrices, Matrix4f positionMatrix, float tickDelta) {
5965
Optional<LiminalSkyRenderer> sky = ((DimensionEffectsAccess) (Object) this.world.getDimension()).getLiminalEffects().getSky();
@@ -73,9 +79,10 @@ public void renderQuads(float tickDelta, MatrixStack matrices, Camera camera) {
7379

7480
Matrix4f projectionMatrix = RenderSystem.getProjectionMatrix().copy();
7581

76-
if (((GameRendererAccessor) client.gameRenderer).isRenderHand()) {
77-
SimpleFramebuffer frameBuffer = new SimpleFramebuffer(client.getFramebuffer().viewportWidth, client.getFramebuffer().viewportHeight, false, false);
82+
SimpleFramebuffer frameBuffer = new SimpleFramebuffer(client.getFramebuffer().viewportWidth, client.getFramebuffer().viewportHeight, false, false);
7883

84+
// Render Hands
85+
if (((GameRendererAccessor) client.gameRenderer).isRenderHand()) {
7986
frameBuffer.beginWrite(true);
8087

8188
this.isRenderingHands = true;
@@ -92,18 +99,41 @@ public void renderQuads(float tickDelta, MatrixStack matrices, Camera camera) {
9299
this.isRenderingHands = false;
93100

94101
frameBuffer.endWrite();
95-
frameBuffer.delete();
96-
102+
frameBuffer.clear(MinecraftClient.IS_SYSTEM_MAC);
97103
client.getFramebuffer().beginWrite(true);
98104
}
99105

100106
LimlibRegistries.LIMINAL_QUAD_RENDERER.forEach((renderer) -> {
101-
renderer.renderQueue.forEach(Runnable::run);
102-
renderer.renderQueue.clear();
107+
renderer.heldItemRenderQueue.forEach(Runnable::run);
108+
renderer.heldItemRenderQueue.clear();
103109
});
104110

111+
// Reset Projection matrix
105112
RenderSystem.setProjectionMatrix(projectionMatrix);
106113

114+
// Render Entities
115+
frameBuffer.beginWrite(true);
116+
117+
isRenderingItems = true;
118+
119+
for (Entity entity : this.world.getEntities()) {
120+
if (entity instanceof ItemEntity) {
121+
this.renderEntity(entity, camera.getPos().getX(), camera.getPos().getY(), camera.getPos().getZ(), tickDelta, matrices, this.bufferBuilders.getEntityVertexConsumers());
122+
}
123+
}
124+
125+
isRenderingItems = false;
126+
127+
frameBuffer.endWrite();
128+
frameBuffer.clear(MinecraftClient.IS_SYSTEM_MAC);
129+
client.getFramebuffer().beginWrite(true);
130+
131+
LimlibRegistries.LIMINAL_QUAD_RENDERER.forEach((renderer) -> {
132+
renderer.itemRenderQueue.forEach(Runnable::run);
133+
renderer.itemRenderQueue.clear();
134+
});
135+
136+
// Render Blocks
107137
this.getQuadRenderData().forEach((pair) -> {
108138
BlockPos pos = pair.getFirst();
109139
BlockState state = pair.getSecond();
@@ -117,6 +147,8 @@ public void renderQuads(float tickDelta, MatrixStack matrices, Camera camera) {
117147

118148
modelViewStack.pop();
119149
RenderSystem.applyModelViewMatrix();
150+
151+
frameBuffer.delete();
120152
}
121153

122154
@Override
@@ -137,4 +169,12 @@ public boolean isRenderingHands() {
137169
return isRenderingHands;
138170
}
139171

172+
@Override
173+
public boolean isRenderingItems() {
174+
return isRenderingItems;
175+
}
176+
177+
@Shadow
178+
abstract void renderEntity(Entity entity, double cameraX, double cameraY, double cameraZ, float tickDelta, MatrixStack matrices, VertexConsumerProvider vertexConsumers);
179+
140180
}

src/main/java/net/ludocrypt/limlib/mixin/iris/MinecraftClientMixin.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import org.spongepowered.asm.mixin.Mixin;
44

5+
import net.coderbot.iris.pipeline.HandRenderer;
56
import net.irisshaders.iris.api.v0.IrisApi;
67
import net.ludocrypt.limlib.access.IrisClientAccess;
78
import net.minecraft.client.MinecraftClient;
@@ -14,4 +15,9 @@ public boolean areShadersInUse() {
1415
return IrisApi.getInstance().isShaderPackInUse();
1516
}
1617

18+
@Override
19+
public boolean isHandRenderingActive() {
20+
return HandRenderer.INSTANCE.isActive();
21+
}
22+
1723
}

0 commit comments

Comments
 (0)