Skip to content

Commit 0b2fcde

Browse files
committed
Basic Box and Block renderer with depth test and culling configurable
We couldn't use batching for this. We want to change the color, opacity and depthtest/culling for every object and one render call would not support different settings for each object
1 parent c7ede95 commit 0b2fcde

22 files changed

+297
-74
lines changed

src/main/java/de/srendi/advancedperipherals/client/RenderUtil.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -129,7 +129,7 @@ public static void drawVoxelShape(PoseStack pPoseStack, VertexConsumer pConsumer
129129
}
130130

131131
public static void drawShape(PoseStack pPoseStack, VertexConsumer pConsumer, VoxelShape pShape, double pX, double pY, double pZ, float r, float g, float b, float a) {
132-
PoseStack.Pose posestack$pose = pPoseStack.last();
132+
PoseStack.Pose pose = pPoseStack.last();
133133
pShape.forAllEdges((minX, minY, minZ, maxX, maxY, maxZ) -> {
134134
float f = (float) (maxX - minX);
135135
float f1 = (float) (maxY - minY);
@@ -138,8 +138,8 @@ public static void drawShape(PoseStack pPoseStack, VertexConsumer pConsumer, Vox
138138
f /= f3;
139139
f1 /= f3;
140140
f2 /= f3;
141-
pConsumer.vertex(posestack$pose.pose(), (float) (minX + pX), (float) (minY + pY), (float) (minZ + pZ)).color(r, g, b, a).normal(posestack$pose.normal(), f, f1, f2).endVertex();
142-
pConsumer.vertex(posestack$pose.pose(), (float) (maxX + pX), (float) (maxY + pY), (float) (maxZ + pZ)).color(r, g, b, a).normal(posestack$pose.normal(), f, f1, f2).endVertex();
141+
pConsumer.vertex(pose.pose(), (float) (minX + pX), (float) (minY + pY), (float) (minZ + pZ)).color(r, g, b, a).normal(pose.normal(), f, f1, f2).endVertex();
142+
pConsumer.vertex(pose.pose(), (float) (maxX + pX), (float) (maxY + pY), (float) (maxZ + pZ)).color(r, g, b, a).normal(pose.normal(), f, f1, f2).endVertex();
143143
});
144144
}
145145

src/main/java/de/srendi/advancedperipherals/client/smartglasses/OverlayModuleLevelRenderer.java

Lines changed: 12 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
import de.srendi.advancedperipherals.AdvancedPeripherals;
1111
import de.srendi.advancedperipherals.client.RenderUtil;
1212
import de.srendi.advancedperipherals.client.smartglasses.objects.threedim.IThreeDObjectRenderer;
13-
import de.srendi.advancedperipherals.client.smartglasses.objects.twodim.ITwoDObjectRenderer;
13+
import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.objects.three_dim.ThreeDimensionalObject;
1414
import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.objects.two_dim.RenderableObject;
1515
import de.srendi.advancedperipherals.common.util.EnumColor;
1616
import net.minecraft.client.Minecraft;
@@ -19,7 +19,6 @@
1919
import net.minecraft.core.BlockPos;
2020
import net.minecraft.core.Direction;
2121
import net.minecraft.world.level.block.Block;
22-
import net.minecraft.world.level.block.Blocks;
2322
import net.minecraft.world.phys.Vec3;
2423
import net.minecraft.world.phys.shapes.VoxelShape;
2524
import net.minecraftforge.api.distmarker.Dist;
@@ -42,46 +41,33 @@ public static void renderLevelState(RenderLevelStageEvent event) {
4241

4342
BufferBuilder bufferbuilder = Tesselator.getInstance().getBuilder();
4443
if (event.getStage() == RenderLevelStageEvent.Stage.AFTER_TRANSLUCENT_BLOCKS) {
45-
Map<Class<? extends RenderableObject>, List<RenderableObject>> batches = new HashMap<>();
44+
Map<Class<? extends RenderableObject>, List<ThreeDimensionalObject>> batches = new HashMap<>();
4645

4746
for (RenderableObject object : OverlayObjectHolder.getObjects()) {
48-
if (!object.isEnabled() || object.getRenderObject() instanceof ITwoDObjectRenderer)
47+
if (!object.isEnabled() || !(object.getRenderObject() instanceof IThreeDObjectRenderer))
4948
continue;
5049

51-
Class<? extends RenderableObject> objectClass = object.getClass();
50+
ThreeDimensionalObject threeDimObject = (ThreeDimensionalObject) object;
51+
52+
Class<? extends ThreeDimensionalObject> objectClass = threeDimObject.getClass();
5253

5354
if (batches.containsKey(objectClass)) {
54-
batches.get(objectClass).add(object);
55+
batches.get(objectClass).add(threeDimObject);
5556
continue;
5657
}
5758

58-
List<RenderableObject> newBatchArray = new ArrayList<>();
59-
newBatchArray.add(object);
59+
List<ThreeDimensionalObject> newBatchArray = new ArrayList<>();
60+
newBatchArray.add(threeDimObject);
6061
batches.put(objectClass, newBatchArray);
6162
}
6263

63-
for (List<RenderableObject> batch : batches.values()) {
64+
for (List<ThreeDimensionalObject> batch : batches.values()) {
6465
((IThreeDObjectRenderer) batch.get(0).getRenderObject()).renderBatch(batch, event, posestack, view, bufferbuilder);
6566
}
6667

68+
BlockPos blockPos = new BlockPos(2, 190, 0);
6769

68-
bufferbuilder.begin(RenderType.solid().mode(), DefaultVertexFormat.BLOCK);
69-
BlockPos blockPos = new BlockPos(0, 190, 0);
70-
71-
posestack.pushPose();
72-
posestack.translate(-view.x + blockPos.getX(), -view.y + blockPos.getY(), -view.z + blockPos.getZ());
73-
float[] colors = EnumColor.GREEN.getRgb();
74-
RenderSystem.setShaderColor(colors[0], colors[1], colors[2], 0.8f);
75-
76-
Minecraft.getInstance().getBlockRenderer().renderBatched(Blocks.STONE.defaultBlockState(), blockPos, event.getCamera().getEntity().level, posestack, bufferbuilder, false, event.getCamera().getEntity().level.random);
77-
BufferUploader.drawWithShader(bufferbuilder.end());
78-
RenderSystem.setShaderColor(1f, 1f, 1f, 1f);
79-
80-
posestack.popPose();
81-
82-
blockPos = new BlockPos(2, 190, 0);
83-
84-
colors = EnumColor.DARK_PURPLE.getRgb();
70+
float[] colors = EnumColor.DARK_PURPLE.getRgb();
8571

8672
RenderSystem.setShader(GameRenderer::getPositionColorShader);
8773
bufferbuilder.begin(RenderType.translucent().mode(), DefaultVertexFormat.POSITION_COLOR_NORMAL);

src/main/java/de/srendi/advancedperipherals/client/smartglasses/OverlayModuleOverlay.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
package de.srendi.advancedperipherals.client.smartglasses;
22

33
import com.mojang.blaze3d.vertex.PoseStack;
4-
import de.srendi.advancedperipherals.client.smartglasses.objects.threedim.IThreeDObjectRenderer;
54
import de.srendi.advancedperipherals.client.smartglasses.objects.twodim.ITwoDObjectRenderer;
65
import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.objects.two_dim.RenderableObject;
76
import net.minecraftforge.client.gui.overlay.ForgeGui;

src/main/java/de/srendi/advancedperipherals/client/smartglasses/OverlayObjectHolder.java

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

33
import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.ObjectDecodeRegistry;
44
import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.objects.three_dim.BlockObject;
5+
import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.objects.three_dim.BoxObject;
56
import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.objects.two_dim.CircleObject;
67
import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.objects.two_dim.ItemObject;
78
import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.objects.two_dim.RectangleObject;
@@ -47,6 +48,7 @@ public static void registerDecodeObjects() {
4748
ObjectDecodeRegistry.register(TextObject.TYPE_ID, TextObject::decode);
4849
ObjectDecodeRegistry.register(ItemObject.TYPE_ID, ItemObject::decode);
4950

51+
ObjectDecodeRegistry.register(BoxObject.TYPE_ID, BoxObject::decode);
5052
ObjectDecodeRegistry.register(BlockObject.TYPE_ID, BlockObject::decode);
5153
}
5254
}

src/main/java/de/srendi/advancedperipherals/client/smartglasses/objects/threedim/BlockRenderer.java

Lines changed: 31 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -5,36 +5,58 @@
55
import com.mojang.blaze3d.vertex.BufferUploader;
66
import com.mojang.blaze3d.vertex.DefaultVertexFormat;
77
import com.mojang.blaze3d.vertex.PoseStack;
8-
import de.srendi.advancedperipherals.client.RenderUtil;
9-
import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.objects.two_dim.RenderableObject;
8+
import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.objects.three_dim.BlockObject;
9+
import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.objects.three_dim.ThreeDimensionalObject;
10+
import de.srendi.advancedperipherals.common.util.RegistryUtil;
11+
import net.minecraft.client.Minecraft;
1012
import net.minecraft.client.renderer.GameRenderer;
1113
import net.minecraft.client.renderer.RenderType;
14+
import net.minecraft.core.BlockPos;
15+
import net.minecraft.world.level.block.Block;
1216
import net.minecraft.world.phys.Vec3;
1317
import net.minecraftforge.client.event.RenderLevelStageEvent;
18+
import net.minecraftforge.registries.ForgeRegistries;
1419

1520
import java.util.List;
1621

1722
public class BlockRenderer implements IThreeDObjectRenderer {
1823

1924
@Override
20-
public void renderBatch(List<RenderableObject> objects, RenderLevelStageEvent event, PoseStack poseStack, Vec3 view, BufferBuilder bufferBuilder) {
25+
public void renderBatch(List<ThreeDimensionalObject> batch, RenderLevelStageEvent event, PoseStack poseStack, Vec3 view, BufferBuilder bufferBuilder) {
2126
poseStack.pushPose();
22-
bufferBuilder.begin(RenderType.translucent().mode(), DefaultVertexFormat.POSITION_COLOR_NORMAL);
2327

24-
for (RenderableObject renderableObject : objects) {
28+
for (ThreeDimensionalObject renderableObject : batch) {
2529
poseStack.pushPose();
26-
RenderSystem.setShader(GameRenderer::getPositionColorShader);
30+
onPreRender(renderableObject);
31+
32+
bufferBuilder.begin(RenderType.solid().mode(), DefaultVertexFormat.BLOCK);
33+
34+
BlockObject block = (BlockObject) renderableObject;
35+
36+
BlockPos blockPos = new BlockPos(renderableObject.getX(), renderableObject.getY(), renderableObject.getZ());
37+
38+
poseStack.translate(-view.x + blockPos.getX(), -view.y + blockPos.getY(), -view.z + blockPos.getZ());
2739
float alpha = renderableObject.opacity;
2840
float red = (float) (renderableObject.color >> 16 & 255) / 255.0F;
2941
float green = (float) (renderableObject.color >> 8 & 255) / 255.0F;
3042
float blue = (float) (renderableObject.color & 255) / 255.0F;
3143

32-
poseStack.translate(-view.x +renderableObject.getX(), -view.y + renderableObject.getY(), -view.z + renderableObject.getZ());
44+
RenderSystem.setShader(GameRenderer::getBlockShader);
45+
RenderSystem.setShaderColor(red, green, blue, alpha);
46+
47+
Block blockToRender = RegistryUtil.getRegistryEntry(block.block, ForgeRegistries.BLOCKS);
48+
49+
if (blockToRender != null)
50+
Minecraft.getInstance().getBlockRenderer().renderBatched(blockToRender.defaultBlockState(), blockPos, event.getCamera().getEntity().level, poseStack, bufferBuilder, false, event.getCamera().getEntity().level.random);
3351

34-
RenderUtil.drawBox(poseStack, bufferBuilder, red, green, blue, alpha, renderableObject.getMaxX(), renderableObject.getMaxY(), renderableObject.getMaxX());
3552
poseStack.popPose();
53+
BufferUploader.drawWithShader(bufferBuilder.end());
54+
onPostRender(renderableObject);
55+
RenderSystem.setShaderColor(1f, 1f, 1f, 1f);
3656
}
37-
BufferUploader.drawWithShader(bufferBuilder.end());
57+
58+
3859
poseStack.popPose();
60+
3961
}
4062
}
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
package de.srendi.advancedperipherals.client.smartglasses.objects.threedim;
2+
3+
import com.mojang.blaze3d.systems.RenderSystem;
4+
import com.mojang.blaze3d.vertex.BufferBuilder;
5+
import com.mojang.blaze3d.vertex.BufferUploader;
6+
import com.mojang.blaze3d.vertex.DefaultVertexFormat;
7+
import com.mojang.blaze3d.vertex.PoseStack;
8+
import de.srendi.advancedperipherals.client.RenderUtil;
9+
import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.objects.three_dim.ThreeDimensionalObject;
10+
import net.minecraft.client.renderer.GameRenderer;
11+
import net.minecraft.client.renderer.RenderType;
12+
import net.minecraft.world.phys.Vec3;
13+
import net.minecraftforge.client.event.RenderLevelStageEvent;
14+
15+
import java.util.List;
16+
17+
public class BoxRenderer implements IThreeDObjectRenderer {
18+
19+
@Override
20+
public void renderBatch(List<ThreeDimensionalObject> batch, RenderLevelStageEvent event, PoseStack poseStack, Vec3 view, BufferBuilder bufferBuilder) {
21+
poseStack.pushPose();
22+
23+
for (ThreeDimensionalObject renderableObject : batch) {
24+
poseStack.pushPose();
25+
onPreRender(renderableObject);
26+
bufferBuilder.begin(RenderType.translucent().mode(), DefaultVertexFormat.POSITION_COLOR_NORMAL);
27+
28+
RenderSystem.setShader(GameRenderer::getPositionColorShader);
29+
float alpha = renderableObject.opacity;
30+
float red = (float) (renderableObject.color >> 16 & 255) / 255.0F;
31+
float green = (float) (renderableObject.color >> 8 & 255) / 255.0F;
32+
float blue = (float) (renderableObject.color & 255) / 255.0F;
33+
34+
poseStack.translate(-view.x + renderableObject.getX(), -view.y + renderableObject.getY(), -view.z + renderableObject.getZ());
35+
RenderUtil.drawBox(poseStack, bufferBuilder, red, green, blue, alpha, renderableObject.getMaxX(), renderableObject.getMaxY(), renderableObject.getMaxX());
36+
BufferUploader.drawWithShader(bufferBuilder.end());
37+
onPostRender(renderableObject);
38+
39+
poseStack.popPose();
40+
}
41+
42+
poseStack.popPose();
43+
}
44+
}
Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,30 @@
11
package de.srendi.advancedperipherals.client.smartglasses.objects.threedim;
22

3+
import com.mojang.blaze3d.systems.RenderSystem;
34
import com.mojang.blaze3d.vertex.BufferBuilder;
45
import com.mojang.blaze3d.vertex.PoseStack;
56
import de.srendi.advancedperipherals.client.smartglasses.objects.IObjectRenderer;
6-
import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.objects.two_dim.RenderableObject;
7+
import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.objects.three_dim.ThreeDimensionalObject;
78
import net.minecraft.world.phys.Vec3;
89
import net.minecraftforge.client.event.RenderLevelStageEvent;
9-
import net.minecraftforge.client.gui.overlay.ForgeGui;
1010

1111
import java.util.List;
1212

1313
public interface IThreeDObjectRenderer extends IObjectRenderer {
1414

15-
void renderBatch(List<RenderableObject> object, RenderLevelStageEvent event, PoseStack poseStack, Vec3 view, BufferBuilder bufferBuilder);
15+
void renderBatch(List<ThreeDimensionalObject> batch, RenderLevelStageEvent event, PoseStack poseStack, Vec3 view, BufferBuilder bufferBuilder);
1616

17+
default void onPostRender(ThreeDimensionalObject object) {
18+
if (object.disableCulling)
19+
RenderSystem.enableCull();
20+
if (object.disableDepthTest)
21+
RenderSystem.enableDepthTest();
22+
}
23+
24+
default void onPreRender(ThreeDimensionalObject object) {
25+
if (object.disableCulling)
26+
RenderSystem.disableCull();
27+
if (object.disableDepthTest)
28+
RenderSystem.disableDepthTest();
29+
}
1730
}

src/main/java/de/srendi/advancedperipherals/client/smartglasses/objects/twodim/ItemRenderer.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
import com.mojang.blaze3d.vertex.PoseStack;
44
import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.objects.two_dim.ItemObject;
55
import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.objects.two_dim.RenderableObject;
6-
import de.srendi.advancedperipherals.common.util.inventory.ItemUtil;
6+
import de.srendi.advancedperipherals.common.util.RegistryUtil;
77
import net.minecraft.client.Minecraft;
88
import net.minecraft.world.item.Item;
99
import net.minecraft.world.item.ItemStack;
@@ -19,7 +19,7 @@ public void renderBatch(List<RenderableObject> objects, ForgeGui gui, PoseStack
1919
Minecraft minecraft = Minecraft.getInstance();
2020

2121
for (RenderableObject object : objects) {
22-
Item renderItem = ItemUtil.getRegistryEntry(((ItemObject) object).item, ForgeRegistries.ITEMS);
22+
Item renderItem = RegistryUtil.getRegistryEntry(((ItemObject) object).item, ForgeRegistries.ITEMS);
2323
if (renderItem == null)
2424
continue;
2525
minecraft.getItemRenderer().renderGuiItem(new ItemStack(renderItem), object.x, object.y);

src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/OverlayGlassesFunctions.java

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
import de.srendi.advancedperipherals.common.smartglasses.SmartGlassesAccess;
88
import de.srendi.advancedperipherals.common.smartglasses.modules.IModuleFunctions;
99
import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.objects.three_dim.BlockObject;
10+
import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.objects.three_dim.BoxObject;
1011
import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.objects.two_dim.CircleObject;
1112
import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.objects.two_dim.ItemObject;
1213
import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.objects.two_dim.RectangleObject;
@@ -64,6 +65,14 @@ public final MethodResult createBlock(IArguments arguments) throws LuaException
6465
return MethodResult.of(object, "SUCCESS");
6566
}
6667

68+
@LuaFunction
69+
public final MethodResult createBox(IArguments arguments) throws LuaException {
70+
BoxObject block = new BoxObject(overlayModule, arguments);
71+
RenderableObject object = overlayModule.addObject(block);
72+
73+
return MethodResult.of(object, "SUCCESS");
74+
}
75+
6776
@LuaFunction
6877
public final MethodResult getObject(IArguments arguments) throws LuaException {
6978
int id = arguments.getInt(0);
@@ -91,6 +100,11 @@ public final MethodResult getSize() {
91100
return MethodResult.of(Minecraft.getInstance().getWindow().getWidth(), Minecraft.getInstance().getWindow().getHeight());
92101
}
93102

103+
@LuaFunction
104+
public final MethodResult getCoords() {
105+
return MethodResult.of(access.getEntity().position().x, access.getEntity().position().y, access.getEntity().position().z);
106+
}
107+
94108
@LuaFunction
95109
public final MethodResult update() {
96110
return MethodResult.of(overlayModule.bulkUpdate());

src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/objects/three_dim/BlockObject.java

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,15 +6,14 @@
66
import de.srendi.advancedperipherals.AdvancedPeripherals;
77
import de.srendi.advancedperipherals.client.smartglasses.objects.IObjectRenderer;
88
import de.srendi.advancedperipherals.client.smartglasses.objects.threedim.BlockRenderer;
9-
import de.srendi.advancedperipherals.client.smartglasses.objects.twodim.ITwoDObjectRenderer;
109
import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.OverlayModule;
1110
import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.propertytypes.StringProperty;
1211
import net.minecraft.network.FriendlyByteBuf;
1312

1413
import java.util.UUID;
1514

1615
public class BlockObject extends ThreeDimensionalObject {
17-
public static final int TYPE_ID = 4;
16+
public static final int TYPE_ID = 5;
1817

1918
private final IObjectRenderer renderer = new BlockRenderer();
2019

@@ -31,7 +30,7 @@ public BlockObject(UUID player) {
3130
}
3231

3332
@LuaFunction
34-
public void setBlock(String block) {
33+
public final void setBlock(String block) {
3534
this.block = block;
3635
getModule().update(this);
3736
}
@@ -41,6 +40,7 @@ public final String getBlock() {
4140
return block;
4241
}
4342

43+
4444
@Override
4545
public void encode(FriendlyByteBuf buffer) {
4646
buffer.writeInt(TYPE_ID);
@@ -64,6 +64,11 @@ public static BlockObject decode(FriendlyByteBuf buffer) {
6464
int z = buffer.readInt();
6565
int maxX = buffer.readInt();
6666
int maxY = buffer.readInt();
67+
int maxZ = buffer.readInt();
68+
69+
boolean disableDepthTest = buffer.readBoolean();
70+
boolean disableCulling = buffer.readBoolean();
71+
6772
String block = buffer.readUtf();
6873

6974
BlockObject clientObject = new BlockObject(player);
@@ -75,6 +80,9 @@ public static BlockObject decode(FriendlyByteBuf buffer) {
7580
clientObject.z = z;
7681
clientObject.maxX = maxX;
7782
clientObject.maxY = maxY;
83+
clientObject.maxZ = maxZ;
84+
clientObject.disableDepthTest = disableDepthTest;
85+
clientObject.disableCulling = disableCulling;
7886
clientObject.block = block;
7987

8088
return clientObject;

0 commit comments

Comments
 (0)