33import com .mojang .blaze3d .vertex .PoseStack ;
44import de .srendi .advancedperipherals .client .smartglasses .objects .twodim .ITwoDObjectRenderer ;
55import 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 ;
68import net .minecraftforge .client .gui .overlay .ForgeGui ;
79import net .minecraftforge .client .gui .overlay .IGuiOverlay ;
810
911import java .util .ArrayList ;
1012import java .util .HashMap ;
1113import java .util .List ;
1214import java .util .Map ;
15+ import java .util .TreeMap ;
1316
1417public 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 }
0 commit comments