Skip to content

Commit 4e4aadd

Browse files
committed
add relativePosition and relativeRotation fields to 3d objects
1 parent 43c26c0 commit 4e4aadd

14 files changed

Lines changed: 145 additions & 50 deletions

File tree

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

Lines changed: 26 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import de.srendi.advancedperipherals.client.smartglasses.objects.threedim.IThreeDObjectRenderer;
55
import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.OverlayObject;
66
import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.objects.three_dim.ThreeDimensionalObject;
7+
import net.minecraft.client.Camera;
78
import net.minecraft.world.phys.Vec3;
89
import net.neoforged.api.distmarker.Dist;
910
import net.neoforged.bus.api.SubscribeEvent;
@@ -21,27 +22,37 @@ public class OverlayModuleLevelRenderer {
2122
@SuppressWarnings("rawtypes")
2223
@SubscribeEvent
2324
public static void renderLevelState(RenderLevelStageEvent event) {
25+
if (event.getStage() != RenderLevelStageEvent.Stage.AFTER_TRANSLUCENT_BLOCKS) {
26+
return;
27+
}
2428
PoseStack poseStack = event.getPoseStack();
25-
Vec3 view = event.getCamera().getPosition();
29+
Camera camera = event.getCamera();
30+
if (camera.getEntity() == null) {
31+
return;
32+
}
2633

27-
if (event.getStage() == RenderLevelStageEvent.Stage.AFTER_TRANSLUCENT_BLOCKS) {
28-
Map<IThreeDObjectRenderer, List<ThreeDimensionalObject>> batches = new HashMap<>();
34+
Vec3 view = camera.getPosition();
35+
Vec3 eyePos = camera.getEntity().getEyePosition(camera.getPartialTickTime());
36+
poseStack.pushPose();
37+
poseStack.translate(-view.x, -view.y, -view.z);
2938

30-
for (OverlayObject object : OverlayObjectHolder.getObjects()) {
31-
if (!object.isEnabled()) {
32-
continue;
33-
}
34-
if (!(object instanceof ThreeDimensionalObject threeDimObject)) {
35-
continue;
36-
}
39+
Map<IThreeDObjectRenderer, List<ThreeDimensionalObject>> batches = new HashMap<>();
3740

38-
IThreeDObjectRenderer renderer = (IThreeDObjectRenderer) object.getType().getRenderer();
39-
batches.computeIfAbsent(renderer, (r) -> new ArrayList<>()).add(threeDimObject);
41+
for (OverlayObject object : OverlayObjectHolder.getObjects()) {
42+
if (!object.isEnabled()) {
43+
continue;
4044
}
41-
42-
for (Map.Entry<IThreeDObjectRenderer, List<ThreeDimensionalObject>> entry : batches.entrySet()) {
43-
entry.getKey().renderBatch(entry.getValue(), event, poseStack, view);
45+
if (!(object instanceof ThreeDimensionalObject threeDimObject)) {
46+
continue;
4447
}
48+
49+
IThreeDObjectRenderer renderer = (IThreeDObjectRenderer) object.getType().getRenderer();
50+
batches.computeIfAbsent(renderer, (r) -> new ArrayList<>()).add(threeDimObject);
51+
}
52+
53+
for (Map.Entry<IThreeDObjectRenderer, List<ThreeDimensionalObject>> entry : batches.entrySet()) {
54+
entry.getKey().renderBatch(entry.getValue(), event, poseStack, eyePos);
4555
}
56+
poseStack.popPose();
4657
}
4758
}

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

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import com.mojang.blaze3d.vertex.VertexConsumer;
55
import de.srendi.advancedperipherals.client.RenderUtil;
66
import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.objects.three_dim.BlockObject;
7+
import net.minecraft.client.Camera;
78
import net.minecraft.client.Minecraft;
89
import net.minecraft.client.renderer.MultiBufferSource;
910
import net.minecraft.client.renderer.RenderType;
@@ -19,8 +20,9 @@
1920
public class BlockRenderer implements IThreeDObjectRenderer<BlockObject> {
2021

2122
@Override
22-
public void renderBatch(List<BlockObject> batch, RenderLevelStageEvent event, PoseStack poseStack, Vec3 view) {
23-
Level level = event.getCamera().getEntity().level();
23+
public void renderBatch(List<BlockObject> batch, RenderLevelStageEvent event, PoseStack poseStack, Vec3 eyePos) {
24+
Camera camera = event.getCamera();
25+
Level level = camera.getEntity().level();
2426
BlockRenderDispatcher blockRenderer = Minecraft.getInstance().getBlockRenderer();
2527
MultiBufferSource.BufferSource bufferSource = Minecraft.getInstance().renderBuffers().bufferSource();
2628
VertexConsumer bufferBuilder = bufferSource.getBuffer(RenderType.solid());
@@ -35,7 +37,12 @@ public void renderBatch(List<BlockObject> batch, RenderLevelStageEvent event, Po
3537

3638
poseStack.pushPose();
3739

38-
poseStack.translate(-view.x, -view.y, -view.z);
40+
if (block.relativePosition) {
41+
poseStack.translate(eyePos.x, eyePos.y, eyePos.z);
42+
if (block.relativeRotation) {
43+
poseStack.mulPose(camera.rotation());
44+
}
45+
}
3946
poseStack.translate(block.x - 0.5, block.y - 0.5, block.z - 0.5);
4047
poseStack.rotateAround(block.getRotation(), 0.5f, 0.5f, 0.5f);
4148

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

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import com.mojang.blaze3d.vertex.VertexConsumer;
55
import de.srendi.advancedperipherals.client.RenderUtil;
66
import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.objects.three_dim.BoxObject;
7+
import net.minecraft.client.Camera;
78
import net.minecraft.client.Minecraft;
89
import net.minecraft.client.renderer.MultiBufferSource;
910
import net.minecraft.client.renderer.RenderType;
@@ -18,7 +19,8 @@ public class BoxRenderer implements IThreeDObjectRenderer<BoxObject> {
1819
private static final RenderUtil.BoxLightMap FULL_BRIGHT = RenderUtil.BoxLightMap.createFullBright();
1920

2021
@Override
21-
public void renderBatch(List<BoxObject> batch, RenderLevelStageEvent event, PoseStack poseStack, Vec3 view) {
22+
public void renderBatch(List<BoxObject> batch, RenderLevelStageEvent event, PoseStack poseStack, Vec3 eyePos) {
23+
Camera camera = event.getCamera();
2224
MultiBufferSource.BufferSource bufferSource = Minecraft.getInstance().renderBuffers().bufferSource();
2325
VertexConsumer bufferBuilder = bufferSource.getBuffer(RenderType.debugStructureQuads());
2426

@@ -28,7 +30,12 @@ public void renderBatch(List<BoxObject> batch, RenderLevelStageEvent event, Pose
2830

2931
Vector4f color = new Vector4f(RenderUtil.getRed(box.color), RenderUtil.getGreen(box.color), RenderUtil.getBlue(box.color), box.opacity);
3032

31-
poseStack.translate(-view.x, -view.y, -view.z);
33+
if (box.relativePosition) {
34+
poseStack.translate(eyePos.x, eyePos.y, eyePos.z);
35+
if (box.relativeRotation) {
36+
poseStack.mulPose(camera.rotation());
37+
}
38+
}
3239
poseStack.translate(box.x, box.y, box.z);
3340
poseStack.mulPose(box.getRotation());
3441
RenderUtil.drawBox(

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212

1313
public interface IThreeDObjectRenderer<O extends ThreeDimensionalObject> extends IObjectRenderer {
1414

15-
void renderBatch(List<O> batch, RenderLevelStageEvent event, PoseStack poseStack, Vec3 view);
15+
void renderBatch(List<O> batch, RenderLevelStageEvent event, PoseStack poseStack, Vec3 eyePos);
1616

1717
default void onPreRender(@NotNull O object) {
1818
if (!object.culling) {

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

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import com.mojang.blaze3d.vertex.VertexConsumer;
66
import de.srendi.advancedperipherals.client.RenderUtil;
77
import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.objects.three_dim.SphereObject;
8+
import net.minecraft.client.Camera;
89
import net.minecraft.client.Minecraft;
910
import net.minecraft.client.renderer.GameRenderer;
1011
import net.minecraft.client.renderer.MultiBufferSource;
@@ -17,7 +18,8 @@
1718
public class SphereRenderer implements IThreeDObjectRenderer<SphereObject> {
1819

1920
@Override
20-
public void renderBatch(List<SphereObject> batch, RenderLevelStageEvent event, PoseStack poseStack, Vec3 view) {
21+
public void renderBatch(List<SphereObject> batch, RenderLevelStageEvent event, PoseStack poseStack, Vec3 eyePos) {
22+
Camera camera = event.getCamera();
2123
MultiBufferSource.BufferSource bufferSource = Minecraft.getInstance().renderBuffers().bufferSource();
2224
VertexConsumer bufferBuilder = bufferSource.getBuffer(RenderType.debugStructureQuads());
2325

@@ -31,7 +33,12 @@ public void renderBatch(List<SphereObject> batch, RenderLevelStageEvent event, P
3133
float green = RenderUtil.getGreen(sphere.color);
3234
float blue = RenderUtil.getBlue(sphere.color);
3335

34-
poseStack.translate(-view.x, -view.y, -view.z);
36+
if (sphere.relativePosition) {
37+
poseStack.translate(eyePos.x, eyePos.y, eyePos.z);
38+
if (sphere.relativeRotation) {
39+
poseStack.mulPose(camera.rotation());
40+
}
41+
}
3542
poseStack.translate(sphere.x, sphere.y, sphere.z);
3643
poseStack.mulPose(sphere.getRotation());
3744
RenderUtil.drawSphere(poseStack, bufferBuilder, sphere.radius, red, green, blue, alpha, sphere.sectors, sphere.stacks);

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

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import com.mojang.blaze3d.vertex.VertexConsumer;
66
import de.srendi.advancedperipherals.client.RenderUtil;
77
import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.objects.three_dim.TorusObject;
8+
import net.minecraft.client.Camera;
89
import net.minecraft.client.Minecraft;
910
import net.minecraft.client.renderer.GameRenderer;
1011
import net.minecraft.client.renderer.MultiBufferSource;
@@ -17,7 +18,8 @@
1718
public class TorusRenderer implements IThreeDObjectRenderer<TorusObject> {
1819

1920
@Override
20-
public void renderBatch(List<TorusObject> batch, RenderLevelStageEvent event, PoseStack poseStack, Vec3 view) {
21+
public void renderBatch(List<TorusObject> batch, RenderLevelStageEvent event, PoseStack poseStack, Vec3 eyePos) {
22+
Camera camera = event.getCamera();
2123
MultiBufferSource.BufferSource bufferSource = Minecraft.getInstance().renderBuffers().bufferSource();
2224
VertexConsumer bufferBuilder = bufferSource.getBuffer(RenderType.debugStructureQuads());
2325

@@ -31,7 +33,12 @@ public void renderBatch(List<TorusObject> batch, RenderLevelStageEvent event, Po
3133
float green = RenderUtil.getGreen(torus.color);
3234
float blue = RenderUtil.getBlue(torus.color);
3335

34-
poseStack.translate(-view.x, -view.y, -view.z);
36+
if (torus.relativePosition) {
37+
poseStack.translate(eyePos.x, eyePos.y, eyePos.z);
38+
if (torus.relativeRotation) {
39+
poseStack.mulPose(camera.rotation());
40+
}
41+
}
3542
poseStack.translate(torus.x, torus.y, torus.z);
3643
poseStack.mulPose(torus.getRotation());
3744
RenderUtil.drawTorus(poseStack, bufferBuilder, torus.majorRadius, torus.minorRadius, red, green, blue, alpha, torus.rings, torus.sides);

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

Lines changed: 31 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,16 @@
11
package de.srendi.advancedperipherals.client.smartglasses.objects.threedim;
22

3+
import com.mojang.blaze3d.vertex.DefaultVertexFormat;
34
import com.mojang.blaze3d.vertex.PoseStack;
45
import com.mojang.blaze3d.vertex.VertexConsumer;
6+
import com.mojang.blaze3d.vertex.VertexFormat;
57
import de.srendi.advancedperipherals.client.RenderUtil;
68
import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.objects.three_dim.TriangleObject;
9+
import net.minecraft.client.Camera;
710
import net.minecraft.client.Minecraft;
811
import net.minecraft.client.renderer.LightTexture;
912
import net.minecraft.client.renderer.MultiBufferSource;
13+
import net.minecraft.client.renderer.RenderStateShard;
1014
import net.minecraft.client.renderer.RenderType;
1115
import net.minecraft.world.phys.Vec3;
1216
import net.neoforged.neoforge.client.event.RenderLevelStageEvent;
@@ -15,21 +19,44 @@
1519
import java.util.List;
1620

1721
public class TriangleRenderer implements IThreeDObjectRenderer<TriangleObject> {
22+
public static final TriangleRenderer INSTANCE = new TriangleRenderer();
23+
24+
private static final RenderType TRIANGLE_TYPE = RenderType.create(
25+
"ap_overlay_triangle",
26+
DefaultVertexFormat.POSITION_COLOR,
27+
VertexFormat.Mode.TRIANGLE_STRIP,
28+
1536,
29+
false,
30+
true,
31+
RenderType.CompositeState.builder()
32+
.setShaderState(RenderStateShard.POSITION_COLOR_SHADER)
33+
.setLayeringState(RenderStateShard.VIEW_OFFSET_Z_LAYERING)
34+
.setTransparencyState(RenderStateShard.TRANSLUCENT_TRANSPARENCY)
35+
.createCompositeState(false)
36+
);
37+
1838
@Override
19-
public void renderBatch(List<TriangleObject> batch, RenderLevelStageEvent event, PoseStack poseStack, Vec3 view) {
39+
public void renderBatch(List<TriangleObject> batch, RenderLevelStageEvent event, PoseStack poseStack, Vec3 eyePos) {
40+
Camera camera = event.getCamera();
2041
MultiBufferSource.BufferSource bufferSource = Minecraft.getInstance().renderBuffers().bufferSource();
21-
VertexConsumer buffer = bufferSource.getBuffer(RenderType.debugFilledBox());
42+
VertexConsumer buffer = bufferSource.getBuffer(TRIANGLE_TYPE);
2243

2344
for (TriangleObject tri : batch) {
2445
this.onPreRender(tri);
2546
poseStack.pushPose();
2647

2748
float r = RenderUtil.getRed(tri.color), g = RenderUtil.getGreen(tri.color), b = RenderUtil.getBlue(tri.color), a = tri.opacity;
2849

29-
poseStack.translate(-view.x, -view.y, -view.z);
50+
if (tri.relativePosition) {
51+
poseStack.translate(eyePos.x, eyePos.y, eyePos.z);
52+
if (tri.relativeRotation) {
53+
poseStack.mulPose(camera.rotation());
54+
}
55+
}
56+
poseStack.rotateAround(tri.getRotation(), tri.x, tri.y, tri.z);
3057

3158
Matrix4f mat = poseStack.last().pose();
32-
buffer.addVertex(mat, tri.x, tri.y, tri.z).setColor(r, g, b, a).setLight(LightTexture.FULL_BRIGHT);
59+
buffer.addVertex(mat, tri.x1, tri.y1, tri.z1).setColor(r, g, b, a).setLight(LightTexture.FULL_BRIGHT);
3360
buffer.addVertex(mat, tri.x2, tri.y2, tri.z2).setColor(r, g, b, a).setLight(LightTexture.FULL_BRIGHT);
3461
buffer.addVertex(mat, tri.x3, tri.y3, tri.z3).setColor(r, g, b, a).setLight(LightTexture.FULL_BRIGHT);
3562

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

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ public void renderBatch(List<CircleObject> objects, GuiGraphics gui, DeltaTracke
2929
}
3030
}
3131

32-
public void drawCircle(PoseStack t, CircleObject circle, float red, float green, float blue, float alpha) {
32+
private void drawCircle(PoseStack poseStack, CircleObject circle, float red, float green, float blue, float alpha) {
3333
float r = circle.radius;
3434
float cx = circle.x;
3535
float cy = circle.y;
@@ -40,8 +40,6 @@ public void drawCircle(PoseStack t, CircleObject circle, float red, float green,
4040
boolean isFilled = circle.filled;
4141
boolean isPixelated = circle.pixelated;
4242

43-
PoseStack poseStack = new PoseStack();
44-
4543
poseStack.pushPose();
4644

4745
poseStack.translate(cx, cy, cz);

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
@@ -20,9 +20,9 @@ public void renderBatch(List<ItemObject> objects, GuiGraphics gui, DeltaTracker
2020
if (renderItem == null) {
2121
continue;
2222
}
23-
int x = (int) obj.x, y = (int) obj.y;
23+
int x = Math.round(obj.x), y = Math.round(obj.y);
2424
gui.pose().pushPose();
25-
gui.pose().rotateAround(obj.getRotation(), x, y, 0);
25+
gui.pose().rotateAround(obj.getRotation(), x + 8, y + 8, 150);
2626
gui.renderFakeItem(new ItemStack(renderItem), x, y);
2727
gui.pose().popPose();
2828
}

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ public void renderBatch(List<TextObject> objects, GuiGraphics gui, DeltaTracker
2121

2222
gui.pose().translate(x, text.y, text.z);
2323
gui.pose().scale(text.fontSize, text.fontSize, 1);
24-
gui.pose().mulPose(text.getRotation());
24+
gui.pose().rotateAround(text.getRotation(), width / 2, 9f / 2, 0);
2525

2626
int color = (text.color & 0xffffff) | ((int) (Math.min(Math.max(text.opacity, 0), 1) * 0xff) << 24);
2727

0 commit comments

Comments
 (0)