Skip to content

Commit 81c86db

Browse files
committed
add triangle overlay object & add overlay object registry
1 parent b443e17 commit 81c86db

28 files changed

Lines changed: 372 additions & 314 deletions

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

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

33
import com.mojang.blaze3d.platform.InputConstants;
44
import com.mojang.blaze3d.platform.Window;
5+
import de.srendi.advancedperipherals.client.smartglasses.OverlayObjectHolder;
56
import de.srendi.advancedperipherals.common.entity.TurtleSeatEntity;
67
import de.srendi.advancedperipherals.common.network.toserver.OverlayModuleClientInfoPacket;
78
import de.srendi.advancedperipherals.common.network.toserver.SaddleTurtleControlPacket;
@@ -30,6 +31,12 @@ public static void onClientLoggingIn(ClientPlayerNetworkEvent.LoggingIn event) {
3031
ClientUUIDCache.reset();
3132
}
3233

34+
@SubscribeEvent
35+
public static void onClientLoggingOut(ClientPlayerNetworkEvent.LoggingOut event) {
36+
ClientUUIDCache.reset();
37+
OverlayObjectHolder.clear();
38+
}
39+
3340
@SubscribeEvent
3441
public static void preClientTick(ClientTickEvent.Pre event) {
3542
Minecraft minecraft = Minecraft.getInstance();

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

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@
99
import de.srendi.advancedperipherals.client.screens.SaddleTurtleOverlay;
1010
import de.srendi.advancedperipherals.client.screens.SmartGlassesScreen;
1111
import de.srendi.advancedperipherals.client.smartglasses.OverlayModuleOverlay;
12-
import de.srendi.advancedperipherals.client.smartglasses.OverlayObjectHolder;
1312
import de.srendi.advancedperipherals.common.setup.APBlockEntityTypes;
1413
import de.srendi.advancedperipherals.common.setup.APContainerTypes;
1514
import de.srendi.advancedperipherals.common.setup.CCRegistration;
@@ -32,7 +31,6 @@ public class ClientRegistry {
3231
@SubscribeEvent
3332
public static void onClientSetup(FMLClientSetupEvent event) {
3433
ItemPropertiesRegistry.register();
35-
OverlayObjectHolder.registerDecodeObjects();
3634
}
3735

3836
@SubscribeEvent

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

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

33
import com.mojang.blaze3d.vertex.PoseStack;
44
import de.srendi.advancedperipherals.client.smartglasses.objects.threedim.IThreeDObjectRenderer;
5-
import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.objects.RenderableObject;
5+
import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.OverlayObject;
66
import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.objects.three_dim.ThreeDimensionalObject;
77
import net.minecraft.world.phys.Vec3;
88
import net.neoforged.api.distmarker.Dist;
@@ -18,34 +18,29 @@
1818
@EventBusSubscriber(Dist.CLIENT)
1919
public class OverlayModuleLevelRenderer {
2020

21+
@SuppressWarnings("rawtypes")
2122
@SubscribeEvent
2223
public static void renderLevelState(RenderLevelStageEvent event) {
2324
PoseStack poseStack = event.getPoseStack();
2425
Vec3 view = event.getCamera().getPosition();
2526

2627
if (event.getStage() == RenderLevelStageEvent.Stage.AFTER_TRANSLUCENT_BLOCKS) {
27-
Map<Class<? extends ThreeDimensionalObject>, List<ThreeDimensionalObject>> batches = new HashMap<>();
28+
Map<IThreeDObjectRenderer, List<ThreeDimensionalObject>> batches = new HashMap<>();
2829

29-
for (RenderableObject object : OverlayObjectHolder.getObjects()) {
30+
for (OverlayObject object : OverlayObjectHolder.getObjects()) {
3031
if (!object.isEnabled()) {
3132
continue;
3233
}
3334
if (!(object instanceof ThreeDimensionalObject threeDimObject)) {
3435
continue;
3536
}
3637

37-
Class<? extends ThreeDimensionalObject> objectClass = threeDimObject.getClass();
38-
39-
List<ThreeDimensionalObject> batchList = batches.get(objectClass);
40-
if (batchList == null) {
41-
batchList = new ArrayList<>();
42-
batches.put(objectClass, batchList);
43-
}
44-
batchList.add(threeDimObject);
38+
IThreeDObjectRenderer renderer = (IThreeDObjectRenderer) object.getType().getRenderer();
39+
batches.computeIfAbsent(renderer, (r) -> new ArrayList<>()).add(threeDimObject);
4540
}
4641

47-
for (List<ThreeDimensionalObject> batch : batches.values()) {
48-
((IThreeDObjectRenderer) batch.get(0).getObjectRenderer()).renderBatch(batch, event, poseStack, view);
42+
for (Map.Entry<IThreeDObjectRenderer, List<ThreeDimensionalObject>> entry : batches.entrySet()) {
43+
entry.getKey().renderBatch(entry.getValue(), event, poseStack, view);
4944
}
5045
}
5146
}

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

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

33
import de.srendi.advancedperipherals.AdvancedPeripherals;
44
import de.srendi.advancedperipherals.client.smartglasses.objects.twodim.ITwoDObjectRenderer;
5-
import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.objects.RenderableObject;
5+
import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.OverlayObject;
66
import net.minecraft.client.DeltaTracker;
77
import net.minecraft.client.gui.GuiGraphics;
88
import net.minecraft.client.gui.LayeredDraw;
@@ -18,34 +18,35 @@
1818
public class OverlayModuleOverlay implements LayeredDraw.Layer {
1919
public static final ResourceLocation ID = AdvancedPeripherals.getRL("overlay_module_overlay");
2020

21+
@SuppressWarnings("rawtypes")
2122
@Override
2223
public void render(GuiGraphics gui, DeltaTracker deltaTracker) {
23-
NavigableMap<Integer, Map<Class<?>, List<RenderableObject>>> prioritizedBatches = new TreeMap<>();
24+
NavigableMap<Integer, Map<ITwoDObjectRenderer, List<OverlayObject>>> prioritizedBatches = new TreeMap<>();
2425

25-
for (RenderableObject object : OverlayObjectHolder.getObjects()) {
26-
if (!object.isEnabled() || !(object.getObjectRenderer() instanceof ITwoDObjectRenderer)) {
26+
for (OverlayObject object : OverlayObjectHolder.getObjects()) {
27+
if (!object.isEnabled()) {
28+
continue;
29+
}
30+
if (!(object.getType().getRenderer() instanceof ITwoDObjectRenderer renderer)) {
2731
continue;
2832
}
2933

3034
// We need to sort the objects by their weight, some things can't be rendered before something else.
3135
// For example, when texts are rendered before our circles, rectangles, etc., the other objects can't be transparent anymore
32-
int weight = object.getObjectRenderer().getWeight();
33-
Class<?> objectClass = object.getClass();
36+
int weight = renderer.getWeight();
3437

3538
// Get or create the batch map for the current weight
36-
Map<Class<?>, List<RenderableObject>> batchesForWeight = prioritizedBatches.computeIfAbsent(weight, k -> new HashMap<>());
37-
List<RenderableObject> batch = batchesForWeight.computeIfAbsent(objectClass, k -> new ArrayList<>());
38-
batch.add(object);
39+
Map<ITwoDObjectRenderer, List<OverlayObject>> batches = prioritizedBatches.computeIfAbsent(weight, k -> new HashMap<>());
40+
batches.computeIfAbsent(renderer, k -> new ArrayList<>()).add(object);
3941
}
4042

41-
for (Map<Class<?>, List<RenderableObject>> batchesForWeight : prioritizedBatches.values()) {
42-
for (List<RenderableObject> batch : batchesForWeight.values()) {
43-
if (batch.isEmpty()) {
43+
for (Map<ITwoDObjectRenderer, List<OverlayObject>> batches : prioritizedBatches.values()) {
44+
for (Map.Entry<ITwoDObjectRenderer, List<OverlayObject>> entry : batches.entrySet()) {
45+
if (entry.getValue().isEmpty()) {
4446
continue;
4547
}
46-
((ITwoDObjectRenderer) batch.get(0).getObjectRenderer()).renderBatch(batch, gui, deltaTracker);
48+
entry.getKey().renderBatch(entry.getValue(), gui, deltaTracker);
4749
}
4850
}
4951
}
50-
5152
}
Lines changed: 7 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,6 @@
11
package de.srendi.advancedperipherals.client.smartglasses;
22

3-
import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.ObjectFactoryRegistry;
4-
import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.objects.RenderableObject;
5-
import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.objects.three_dim.BlockObject;
6-
import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.objects.three_dim.BoxObject;
7-
import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.objects.three_dim.SphereObject;
8-
import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.objects.three_dim.TorusObject;
9-
import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.objects.two_dim.CircleObject;
10-
import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.objects.two_dim.ItemObject;
11-
import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.objects.two_dim.LineObject;
12-
import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.objects.two_dim.RectangleObject;
13-
import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.objects.two_dim.TextObject;
3+
import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.OverlayObject;
144

155
import java.util.Collection;
166
import java.util.Map;
@@ -21,40 +11,27 @@
2111
*/
2212
public class OverlayObjectHolder {
2313

24-
public static Map<Integer, RenderableObject> objects = new ConcurrentHashMap<>();
14+
public static Map<Integer, OverlayObject> objects = new ConcurrentHashMap<>();
2515

26-
public static void addOrUpdateObject(RenderableObject object) {
16+
public static void addOrUpdateObject(OverlayObject object) {
2717
objects.put(object.getId(), object);
2818
}
2919

30-
public static void addOrUpdateObjects(Collection<RenderableObject> objects) {
31-
for (RenderableObject renderableObject : objects) {
32-
addOrUpdateObject(renderableObject);
20+
public static void addOrUpdateObjects(Collection<OverlayObject> objects) {
21+
for (OverlayObject overlayObject : objects) {
22+
addOrUpdateObject(overlayObject);
3323
}
3424
}
3525

3626
public static void removeObject(int id) {
3727
objects.remove(id);
3828
}
3929

40-
public static Collection<RenderableObject> getObjects() {
30+
public static Collection<OverlayObject> getObjects() {
4131
return objects.values();
4232
}
4333

4434
public static void clear() {
4535
objects.clear();
4636
}
47-
48-
public static void registerDecodeObjects() {
49-
ObjectFactoryRegistry.register(RectangleObject.TYPE_ID, RectangleObject::new);
50-
ObjectFactoryRegistry.register(CircleObject.TYPE_ID, CircleObject::new);
51-
ObjectFactoryRegistry.register(TextObject.TYPE_ID, TextObject::new);
52-
ObjectFactoryRegistry.register(ItemObject.TYPE_ID, ItemObject::new);
53-
ObjectFactoryRegistry.register(LineObject.TYPE_ID, LineObject::new);
54-
55-
ObjectFactoryRegistry.register(BoxObject.TYPE_ID, BoxObject::new);
56-
ObjectFactoryRegistry.register(BlockObject.TYPE_ID, BlockObject::new);
57-
ObjectFactoryRegistry.register(SphereObject.TYPE_ID, SphereObject::new);
58-
ObjectFactoryRegistry.register(TorusObject.TYPE_ID, TorusObject::new);
59-
}
6037
}
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
package de.srendi.advancedperipherals.client.smartglasses.objects.threedim;
2+
3+
import com.mojang.blaze3d.vertex.PoseStack;
4+
import com.mojang.blaze3d.vertex.VertexConsumer;
5+
import de.srendi.advancedperipherals.client.RenderUtil;
6+
import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.objects.three_dim.TriangleObject;
7+
import net.minecraft.client.Minecraft;
8+
import net.minecraft.client.renderer.LightTexture;
9+
import net.minecraft.client.renderer.MultiBufferSource;
10+
import net.minecraft.client.renderer.RenderType;
11+
import net.minecraft.world.phys.Vec3;
12+
import net.neoforged.neoforge.client.event.RenderLevelStageEvent;
13+
import org.joml.Matrix4f;
14+
15+
import java.util.List;
16+
17+
public class TriangleRenderer implements IThreeDObjectRenderer<TriangleObject> {
18+
@Override
19+
public void renderBatch(List<TriangleObject> batch, RenderLevelStageEvent event, PoseStack poseStack, Vec3 view) {
20+
MultiBufferSource.BufferSource bufferSource = Minecraft.getInstance().renderBuffers().bufferSource();
21+
VertexConsumer buffer = bufferSource.getBuffer(RenderType.debugFilledBox());
22+
23+
for (TriangleObject tri : batch) {
24+
this.onPreRender(tri);
25+
poseStack.pushPose();
26+
27+
float r = RenderUtil.getRed(tri.color), g = RenderUtil.getGreen(tri.color), b = RenderUtil.getBlue(tri.color), a = tri.opacity;
28+
29+
poseStack.translate(-view.x, -view.y, -view.z);
30+
31+
Matrix4f mat = poseStack.last().pose();
32+
buffer.addVertex(mat, tri.x, tri.y, tri.z).setColor(r, g, b, a).setLight(LightTexture.FULL_BRIGHT);
33+
buffer.addVertex(mat, tri.x2, tri.y2, tri.z2).setColor(r, g, b, a).setLight(LightTexture.FULL_BRIGHT);
34+
buffer.addVertex(mat, tri.x3, tri.y3, tri.z3).setColor(r, g, b, a).setLight(LightTexture.FULL_BRIGHT);
35+
36+
poseStack.popPose();
37+
this.onPostRender(tri);
38+
}
39+
40+
bufferSource.endLastBatch();
41+
}
42+
}

src/main/java/de/srendi/advancedperipherals/common/network/toclient/RenderableObjectBulkSyncPacket.java

Lines changed: 14 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,10 @@
33
import de.srendi.advancedperipherals.AdvancedPeripherals;
44
import de.srendi.advancedperipherals.client.smartglasses.OverlayObjectHolder;
55
import de.srendi.advancedperipherals.common.network.IAPPacket;
6-
import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.ObjectFactoryRegistry;
7-
import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.objects.RenderableObject;
6+
import de.srendi.advancedperipherals.common.setup.APRegistries;
7+
import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.OverlayObject;
8+
import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.OverlayObjectType;
9+
import net.minecraft.core.Registry;
810
import net.minecraft.network.RegistryFriendlyByteBuf;
911
import net.minecraft.network.protocol.common.custom.CustomPacketPayload;
1012
import net.neoforged.neoforge.network.handling.IPayloadContext;
@@ -19,20 +21,21 @@ public class RenderableObjectBulkSyncPacket implements IAPPacket {
1921
public static final Type<RenderableObjectBulkSyncPacket> TYPE = new Type<>(AdvancedPeripherals.getRL("renderable_object_bulk_sync"));
2022

2123
private final UUID player;
22-
private final Collection<RenderableObject> objects;
24+
private final Collection<OverlayObject> objects;
2325

24-
public RenderableObjectBulkSyncPacket(UUID player, Collection<RenderableObject> objects) {
26+
public RenderableObjectBulkSyncPacket(UUID player, Collection<OverlayObject> objects) {
2527
this.player = player;
2628
this.objects = objects;
2729
}
2830

2931
public RenderableObjectBulkSyncPacket(RegistryFriendlyByteBuf buffer) {
32+
Registry<OverlayObjectType<?>> registry = buffer.registryAccess().registryOrThrow(APRegistries.OVERLAY_OBJECTS);
3033
this.player = buffer.readUUID();
3134
int size = buffer.readVarInt();
32-
List<RenderableObject> objects = new ArrayList<>();
35+
List<OverlayObject> objects = new ArrayList<>();
3336
for (int i = 0; i < size; i++) {
3437
int typeId = buffer.readVarInt();
35-
RenderableObject object = ObjectFactoryRegistry.buildObject(typeId, this.player);
38+
OverlayObject object = registry.byIdOrThrow(typeId).createClient(this.player);
3639
object.decode(buffer);
3740
objects.add(object);
3841
}
@@ -41,15 +44,16 @@ public RenderableObjectBulkSyncPacket(RegistryFriendlyByteBuf buffer) {
4144

4245
@Override
4346
public void handle(IPayloadContext context) {
44-
OverlayObjectHolder.addOrUpdateObjects(objects);
47+
OverlayObjectHolder.addOrUpdateObjects(this.objects);
4548
}
4649

4750
@Override
4851
public void write(RegistryFriendlyByteBuf buffer) {
52+
Registry<OverlayObjectType<?>> registry = buffer.registryAccess().registryOrThrow(APRegistries.OVERLAY_OBJECTS);
4953
buffer.writeUUID(this.player);
50-
buffer.writeVarInt(objects.size());
51-
for (RenderableObject object : objects) {
52-
buffer.writeVarInt(object.getTypeId());
54+
buffer.writeVarInt(this.objects.size());
55+
for (OverlayObject object : this.objects) {
56+
buffer.writeVarInt(registry.getIdOrThrow(object.getType()));
5357
object.encode(buffer);
5458
}
5559
}

src/main/java/de/srendi/advancedperipherals/common/network/toclient/RenderableObjectSyncPacket.java

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,10 @@
33
import de.srendi.advancedperipherals.AdvancedPeripherals;
44
import de.srendi.advancedperipherals.client.smartglasses.OverlayObjectHolder;
55
import de.srendi.advancedperipherals.common.network.IAPPacket;
6-
import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.ObjectFactoryRegistry;
7-
import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.objects.RenderableObject;
6+
import de.srendi.advancedperipherals.common.setup.APRegistries;
7+
import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.OverlayObject;
8+
import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.OverlayObjectType;
9+
import net.minecraft.core.Registry;
810
import net.minecraft.network.RegistryFriendlyByteBuf;
911
import net.minecraft.network.protocol.common.custom.CustomPacketPayload;
1012
import net.neoforged.neoforge.network.handling.IPayloadContext;
@@ -16,29 +18,31 @@ public class RenderableObjectSyncPacket implements IAPPacket {
1618
public static final CustomPacketPayload.Type<RenderableObjectSyncPacket> TYPE = new Type<>(AdvancedPeripherals.getRL("renderable_object_sync"));
1719

1820
private final UUID player;
19-
private final RenderableObject object;
21+
private final OverlayObject object;
2022

21-
public RenderableObjectSyncPacket(UUID player, RenderableObject object) {
23+
public RenderableObjectSyncPacket(UUID player, OverlayObject object) {
2224
this.player = player;
2325
this.object = object;
2426
}
2527

2628
public RenderableObjectSyncPacket(RegistryFriendlyByteBuf buffer) {
29+
Registry<OverlayObjectType<?>> registry = buffer.registryAccess().registryOrThrow(APRegistries.OVERLAY_OBJECTS);
2730
this.player = buffer.readUUID();
2831
int typeId = buffer.readVarInt();
29-
this.object = ObjectFactoryRegistry.buildObject(typeId, this.player);
32+
this.object = registry.byIdOrThrow(typeId).createClient(this.player);
3033
this.object.decode(buffer);
3134
}
3235

3336
@Override
3437
public void handle(IPayloadContext context) {
35-
OverlayObjectHolder.addOrUpdateObject(object);
38+
OverlayObjectHolder.addOrUpdateObject(this.object);
3639
}
3740

3841
@Override
3942
public void write(RegistryFriendlyByteBuf buffer) {
43+
Registry<OverlayObjectType<?>> registry = buffer.registryAccess().registryOrThrow(APRegistries.OVERLAY_OBJECTS);
4044
buffer.writeUUID(this.player);
41-
buffer.writeVarInt(object.getTypeId());
45+
buffer.writeVarInt(registry.getIdOrThrow(this.object.getType()));
4246
object.encode(buffer);
4347
}
4448

0 commit comments

Comments
 (0)