Skip to content

Commit 5ba38b4

Browse files
committed
Prioritize batch rendering based on weight for smart glasses' overlay objects to fix rendering order issues. Add weight to object renderers and adjust transparency handling.
1 parent 94d236f commit 5ba38b4

File tree

5 files changed

+48
-20
lines changed

5 files changed

+48
-20
lines changed

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

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
import net.minecraftforge.client.event.ModelEvent;
2121
import net.minecraftforge.client.event.RegisterGuiOverlaysEvent;
2222
import net.minecraftforge.client.event.RegisterKeyMappingsEvent;
23+
import net.minecraftforge.eventbus.api.EventPriority;
2324
import net.minecraftforge.eventbus.api.SubscribeEvent;
2425
import net.minecraftforge.fml.common.Mod;
2526
import net.minecraftforge.fml.event.lifecycle.FMLClientSetupEvent;
@@ -72,9 +73,9 @@ public static void registeringRenderers(EntityRenderersEvent.RegisterRenderers e
7273
event.registerBlockEntityRenderer(APBlockEntityTypes.DISTANCE_DETECTOR.get(), DistanceDetectorRenderer::new);
7374
}
7475

75-
@SubscribeEvent
76+
@SubscribeEvent(priority = EventPriority.LOWEST)
7677
public static void registeringOverlays(RegisterGuiOverlaysEvent event) {
7778
event.registerAboveAll(SaddleTurtleScreen.ID, SADDLE_TURTLE_OVERLAY);
78-
event.registerBelowAll(OverlayModuleOverlay.ID, OVERLAY_MODULE_OVERLAY);
79+
event.registerAboveAll(OverlayModuleOverlay.ID, OVERLAY_MODULE_OVERLAY);
7980
}
8081
}

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

Lines changed: 21 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,16 @@
33
import com.mojang.blaze3d.vertex.PoseStack;
44
import de.srendi.advancedperipherals.client.smartglasses.objects.twodim.ITwoDObjectRenderer;
55
import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.objects.RenderableObject;
6+
import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.objects.two_dim.RectangleObject;
7+
import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.objects.two_dim.TextObject;
68
import net.minecraftforge.client.gui.overlay.ForgeGui;
79
import net.minecraftforge.client.gui.overlay.IGuiOverlay;
810

911
import java.util.ArrayList;
1012
import java.util.HashMap;
1113
import java.util.List;
1214
import java.util.Map;
15+
import java.util.TreeMap;
1316

1417
public class OverlayModuleOverlay implements IGuiOverlay {
1518
public static final String ID = "overlay_module_overlay";
@@ -18,28 +21,34 @@ public class OverlayModuleOverlay implements IGuiOverlay {
1821
public void render(ForgeGui gui, PoseStack poseStack, float partialTick, int screenWidth, int screenHeight) {
1922
poseStack.pushPose();
2023

21-
Map<Class<? extends RenderableObject>, List<RenderableObject>> batches = new HashMap<>();
24+
Map<Integer, Map<Class<? extends RenderableObject>, List<RenderableObject>>> prioritizedBatches = new TreeMap<>();
2225

2326
for (RenderableObject object : OverlayObjectHolder.getObjects()) {
24-
if (!object.isEnabled() || !(object.getRenderObject() instanceof ITwoDObjectRenderer))
27+
if (!object.isEnabled() || !(object.getRenderObject() instanceof ITwoDObjectRenderer)) {
2528
continue;
29+
}
2630

31+
// We need to sort the objects by their weight, some things can't be rendered before something else.
32+
// For example, when texts are rendered before our circles, rectangles, etc., the other objects can't be transparent anymore
33+
int weight = object.getRenderObject().getWeight();
2734
Class<? extends RenderableObject> objectClass = object.getClass();
2835

29-
if (batches.containsKey(objectClass)) {
30-
batches.get(objectClass).add(object);
31-
continue;
32-
}
36+
// Get or create the batch map for the current weight
37+
Map<Class<? extends RenderableObject>, List<RenderableObject>> batchesForWeight = prioritizedBatches.computeIfAbsent(weight, k -> new HashMap<>());
3338

34-
List<RenderableObject> newBatchArray = new ArrayList<>();
35-
newBatchArray.add(object);
36-
batches.put(objectClass, newBatchArray);
37-
}
39+
List<RenderableObject> batch = batchesForWeight.computeIfAbsent(objectClass, k -> new ArrayList<>());
3840

39-
for (List<RenderableObject> batch : batches.values()) {
40-
((ITwoDObjectRenderer) batch.get(0).getRenderObject()).renderBatch(batch, gui, poseStack, partialTick, screenWidth, screenHeight);
41+
batch.add(object);
4142
}
4243

44+
for (Map<Class<? extends RenderableObject>, List<RenderableObject>> batchesForWeight : prioritizedBatches.values()) {
45+
for (List<RenderableObject> batch : batchesForWeight.values()) {
46+
47+
if (!batch.isEmpty()) {
48+
((ITwoDObjectRenderer) batch.get(0).getRenderObject()).renderBatch(batch, gui, poseStack, partialTick, screenWidth, screenHeight);
49+
}
50+
}
51+
}
4352
poseStack.popPose();
4453

4554
}
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,13 @@
11
package de.srendi.advancedperipherals.client.smartglasses.objects;
22

33
public interface IObjectRenderer {
4+
/**
5+
* Get the weight of the renderer. Lower weight means higher priority and it will render first.
6+
* Some things need to be rendered before others to prevent color and opacity issues.
7+
* @return the weight of the renderer.
8+
*/
9+
default int getWeight() {
10+
return 100;
11+
}
12+
413
}

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

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -21,19 +21,24 @@ public class RectangleRenderer implements ITwoDObjectRenderer {
2121
public void renderBatch(List<RenderableObject> objects, ForgeGui gui, PoseStack poseStack, float partialTick, int screenWidth, int screenHeight) {
2222
RenderSystem.setShader(GameRenderer::getPositionColorShader);
2323
BufferBuilder bufferbuilder = Tesselator.getInstance().getBuilder();
24-
Matrix4f matrix = poseStack.last().pose();
24+
2525
bufferbuilder.begin(VertexFormat.Mode.QUADS, DefaultVertexFormat.POSITION_COLOR);
2626

2727
for (RenderableObject obj : objects) {
28+
poseStack.pushPose();
29+
Matrix4f matrix = poseStack.last().pose();
30+
2831
float alpha = obj.opacity;
2932
float red = RenderUtil.getRed(obj.color);
3033
float green = RenderUtil.getGreen(obj.color);
3134
float blue = RenderUtil.getBlue(obj.color);
3235

33-
bufferbuilder.vertex(matrix, obj.x, obj.maxY, obj.z).color(red, green, blue, 0.0001f).endVertex();
34-
bufferbuilder.vertex(matrix, obj.maxX, obj.maxY, obj.z).color(red, green, blue, 0.00f).endVertex();
35-
bufferbuilder.vertex(matrix, obj.maxX, obj.y, obj.z).color(red, green, blue, 0.0f).endVertex();
36-
bufferbuilder.vertex(matrix, obj.x, obj.y, obj.z).color(red, green, blue, 0f).endVertex();
36+
bufferbuilder.vertex(matrix, obj.x, obj.maxY, obj.z).color(red, green, blue, alpha).endVertex();
37+
bufferbuilder.vertex(matrix, obj.maxX, obj.maxY, obj.z).color(red, green, blue, alpha).endVertex();
38+
bufferbuilder.vertex(matrix, obj.maxX, obj.y, obj.z).color(red, green, blue, alpha).endVertex();
39+
bufferbuilder.vertex(matrix, obj.x, obj.y, obj.z).color(red, green, blue, alpha).endVertex();
40+
poseStack.popPose();
41+
3742
}
3843

3944
BufferUploader.drawWithShader(bufferbuilder.end());

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

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,13 +24,17 @@ public void renderBatch(List<RenderableObject> objects, ForgeGui gui, PoseStack
2424
x -= (minecraft.font.width(text.content) * text.fontSize) / 2f;
2525
}
2626

27-
if (text.shadow) {
27+
if (!text.shadow) {
2828
minecraft.font.drawShadow(poseStack, text.content, x / text.fontSize, text.y / text.fontSize, text.color);
2929
} else {
3030
minecraft.font.draw(poseStack, text.content, x / text.fontSize, text.y / text.fontSize, text.color);
3131
}
3232
poseStack.popPose();
3333
}
34+
}
3435

36+
@Override
37+
public int getWeight() {
38+
return 110;
3539
}
3640
}

0 commit comments

Comments
 (0)