Skip to content

Commit 95ce3eb

Browse files
committed
Rendering
1 parent ca82723 commit 95ce3eb

File tree

3 files changed

+76
-66
lines changed

3 files changed

+76
-66
lines changed

neoforge-main/src/main/java/dev/compactmods/crafting/client/render/CubeRenderHelper.java

Lines changed: 38 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import net.minecraft.core.Direction;
66
import net.minecraft.core.Vec3i;
77
import net.minecraft.util.FastColor;
8+
import net.minecraft.util.Mth;
89
import net.minecraft.world.phys.AABB;
910
import net.minecraft.world.phys.Vec3;
1011

@@ -15,6 +16,28 @@ public static void addColoredVertex(VertexConsumer renderer, PoseStack stack, in
1516
.setNormal(stack.last(), 0, 0, 0);
1617
}
1718

19+
public static void drawLine(VertexConsumer builder, PoseStack poseStack, int color, Vec3 start, Vec3 end)
20+
{
21+
float nX = (float) (end.x - start.x);
22+
float nY = (float) (end.y - start.y);
23+
float nZ = (float) (end.z - start.z);
24+
float nLen = Mth.sqrt(nX * nX + nY * nY + nZ * nZ);
25+
26+
nX = nX / nLen;
27+
nY = nY / nLen;
28+
nZ = nZ / nLen;
29+
30+
var pose = poseStack.last();
31+
builder.addVertex(pose, (float) start.x, (float) start.y, (float) start.z)
32+
.setColor(color)
33+
.setNormal(pose, nX, nY, nZ);
34+
35+
builder.addVertex(pose, (float) end.x, (float) end.y, (float) end.z)
36+
.setColor(color)
37+
.setNormal(pose, nX, nY, nZ);
38+
}
39+
40+
1841
public static void drawCubeFace(VertexConsumer builder, PoseStack mx, AABB cube, int color, Direction face) {
1942
Vec3 TOP_LEFT = getCubeFacePoint(cube, face, EnumCubeFaceCorner.TOP_LEFT);
2043
Vec3 TOP_RIGHT = getCubeFacePoint(cube, face, EnumCubeFaceCorner.TOP_RIGHT);
@@ -119,47 +142,28 @@ public static Vec3 getCubeFacePoint(AABB cube, Direction face, EnumCubeFaceCorne
119142
public static double getScanLineHeight(AABB cube, double gameTime) {
120143
// Get the height of the scan line
121144
double zAngle = ((Math.sin(Math.toDegrees(gameTime) / -RotationSpeed.MEDIUM.getSpeed()) + 1.0d) / 2) * (cube.getYsize());
122-
double scanHeight = (cube.minY + zAngle);
123-
124-
return scanHeight;
145+
return cube.minY + zAngle;
125146
}
126147

127148
public static Vec3 getScanLineRight(Direction face, AABB cube, double gameTime) {
128149
double scanHeight = getScanLineHeight(cube, gameTime);
129-
switch (face) {
130-
case NORTH:
131-
return new Vec3(cube.minX, scanHeight, cube.minZ);
132-
133-
case SOUTH:
134-
return new Vec3(cube.maxX, scanHeight, cube.maxZ);
135-
136-
case WEST:
137-
return new Vec3(cube.minX, scanHeight, cube.maxZ);
138-
139-
case EAST:
140-
return new Vec3(cube.maxX, scanHeight, cube.minZ);
141-
}
142-
143-
return Vec3.ZERO;
150+
return switch (face) {
151+
case NORTH -> new Vec3(cube.minX, scanHeight, cube.minZ);
152+
case SOUTH -> new Vec3(cube.maxX, scanHeight, cube.maxZ);
153+
case WEST -> new Vec3(cube.minX, scanHeight, cube.maxZ);
154+
case EAST -> new Vec3(cube.maxX, scanHeight, cube.minZ);
155+
default -> Vec3.ZERO;
156+
};
144157
}
145158

146159
public static Vec3 getScanLineLeft(Direction face, AABB cube, double gameTime) {
147160
double scanHeight = getScanLineHeight(cube, gameTime);
148-
switch (face) {
149-
case NORTH:
150-
return new Vec3(cube.maxX, scanHeight, cube.minZ);
151-
152-
case SOUTH:
153-
return new Vec3(cube.minX, scanHeight, cube.maxZ);
154-
155-
case WEST:
156-
return new Vec3(cube.minX, scanHeight, cube.minZ);
157-
158-
case EAST:
159-
return new Vec3(cube.maxX, scanHeight, cube.maxZ);
160-
}
161-
162-
return Vec3.ZERO;
161+
return switch (face) {
162+
case NORTH -> new Vec3(cube.maxX, scanHeight, cube.minZ);
163+
case SOUTH -> new Vec3(cube.minX, scanHeight, cube.maxZ);
164+
case WEST -> new Vec3(cube.minX, scanHeight, cube.minZ);
165+
case EAST -> new Vec3(cube.maxX, scanHeight, cube.maxZ);
166+
default -> Vec3.ZERO;
167+
};
163168
}
164-
165169
}

neoforge-main/src/main/java/dev/compactmods/crafting/client/render/field/MiniaturizationFieldRenderer.java

Lines changed: 36 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -12,40 +12,64 @@
1212
import dev.compactmods.crafting.data.CCAttachments;
1313
import dev.compactmods.crafting.projector.EnumProjectorColorType;
1414
import dev.compactmods.crafting.projector.FieldProjectorEntity;
15+
import net.minecraft.client.Camera;
1516
import net.minecraft.client.Minecraft;
1617
import net.minecraft.client.renderer.MultiBufferSource;
1718
import net.minecraft.client.renderer.RenderType;
1819
import net.minecraft.core.Direction;
1920
import net.minecraft.util.FastColor;
20-
import net.minecraft.world.level.block.Blocks;
21+
import net.minecraft.world.level.Level;
2122
import net.minecraft.world.phys.AABB;
2223
import net.minecraft.world.phys.BlockHitResult;
2324
import net.minecraft.world.phys.HitResult;
2425
import net.minecraft.world.phys.Vec3;
2526
import net.neoforged.neoforge.client.event.RenderLevelStageEvent;
2627
import org.joml.Matrix4f;
2728

29+
import java.util.Objects;
30+
2831
public class MiniaturizationFieldRenderer {
2932

3033
public static void onRenderStage(RenderLevelStageEvent evt) {
31-
if(evt.getStage() == RenderLevelStageEvent.Stage.AFTER_TRANSLUCENT_BLOCKS) {
34+
if (evt.getStage() == RenderLevelStageEvent.Stage.AFTER_TRANSLUCENT_BLOCKS) {
3235

3336
final var mc = Minecraft.getInstance();
3437
final var level = mc.level;
3538

39+
if (level == null) return;
40+
3641
final var partialTicks = evt.getPartialTick().getGameTimeDeltaPartialTick(false);
3742
final MultiBufferSource.BufferSource buffers = mc.renderBuffers().bufferSource();
3843

3944
level.getExistingData(CCAttachments.ACTIVE_FIELDS).ifPresent(fields -> {
4045
fields.getFields().forEach(field -> {
41-
render(field, partialTicks, evt.getPoseStack());
46+
render(level, field, partialTicks, evt.getPoseStack(), buffers);
4247
});
4348
});
4449
}
4550
}
4651

47-
public static void render(IMiniaturizationField field, float partialTicks, PoseStack matrixStack) {
48-
GhostRenderer.render(Blocks.GREEN_CONCRETE.defaultBlockState(), field.getCenter(), matrixStack);
52+
public static void render(Level level, IMiniaturizationField field, float partialTicks, PoseStack matrixStack, MultiBufferSource.BufferSource buffers) {
53+
// GhostRenderer.render(Blocks.GREEN_STAINED_GLASS.defaultBlockState(), field.getCenter(), matrixStack);
54+
final Minecraft mc = Minecraft.getInstance();
55+
final Camera mainCamera = mc.gameRenderer.getMainCamera();
56+
Vec3 projectedView = mainCamera.getPosition();
57+
58+
matrixStack.pushPose();
59+
{
60+
matrixStack.translate(-projectedView.x, -projectedView.y, -projectedView.z);
61+
field.getProjectorPositions()
62+
.map(level::getBlockEntity)
63+
.map(be -> be instanceof FieldProjectorEntity fpe ? fpe : null)
64+
.filter(Objects::nonNull)
65+
.forEach(fieldProjectorEntity -> {
66+
drawScanLine(fieldProjectorEntity, matrixStack, buffers, field.getBounds(), level.getGameTime());
67+
drawProjectorArcs(fieldProjectorEntity, matrixStack, buffers, field.getBounds(), level.getGameTime());
68+
});
69+
70+
buffers.endBatch(RenderType.lines());
71+
}
72+
matrixStack.popPose();
4973
}
5074

5175
public static int getProjectionColor(EnumProjectorColorType type) {
@@ -67,51 +91,34 @@ public static int getProjectionColor(EnumProjectorColorType type) {
6791
private static void drawScanLine(FieldProjectorEntity tile, PoseStack mx, MultiBufferSource buffers, AABB fieldBounds, double gameTime) {
6892
VertexConsumer builder = buffers.getBuffer(RenderType.lines());
6993

70-
Vec3 tilePos = new Vec3(
71-
tile.getBlockPos().getX() + 0.5d,
72-
tile.getBlockPos().getY() + 0.5d,
73-
tile.getBlockPos().getZ() + 0.5d
74-
);
75-
7694
mx.pushPose();
77-
mx.translate(.5, .5, .5);
7895

7996
int colorScanLine = getProjectionColor(EnumProjectorColorType.SCAN_LINE);
8097

8198
Direction face = tile.getProjectorSide();
82-
Vec3 left = CubeRenderHelper.getScanLineLeft(face, fieldBounds, gameTime).subtract(tilePos);
83-
Vec3 right = CubeRenderHelper.getScanLineRight(face, fieldBounds, gameTime).subtract(tilePos);
84-
85-
CubeRenderHelper.addColoredVertex(builder, mx, colorScanLine, left);
86-
CubeRenderHelper.addColoredVertex(builder, mx, colorScanLine, right);
99+
Vec3 left = CubeRenderHelper.getScanLineLeft(face, fieldBounds, gameTime);
100+
Vec3 right = CubeRenderHelper.getScanLineRight(face, fieldBounds, gameTime);
87101

102+
CubeRenderHelper.drawLine(builder, mx, colorScanLine, left, right);
88103
mx.popPose();
89104
}
90105

91106
/**
92107
* Handles drawing the projection arcs that connect the projector blocks to the main projection
93108
* in the center of the crafting area.
94109
*/
95-
private void drawProjectorArcs(FieldProjectorEntity tile, PoseStack mx, MultiBufferSource buffers, AABB fieldBounds, double gameTime) {
110+
private static void drawProjectorArcs(FieldProjectorEntity tile, PoseStack mx, MultiBufferSource buffers, AABB fieldBounds, double gameTime) {
96111

97112
try {
98113

99114
Direction facing = tile.getProjectorSide();
100115

101-
Vec3 tilePos = new Vec3(
102-
tile.getBlockPos().getX() + 0.5d,
103-
tile.getBlockPos().getY() + 0.5d,
104-
tile.getBlockPos().getZ() + 0.5d
105-
);
106-
107116
mx.pushPose();
108117

109-
mx.translate(.5, .5, .5);
110-
111118
int colorProjectionArc = getProjectionColor(EnumProjectorColorType.FIELD);
112119

113-
Vec3 scanLeft = CubeRenderHelper.getScanLineRight(facing, fieldBounds, gameTime).subtract(tilePos);
114-
Vec3 scanRight = CubeRenderHelper.getScanLineLeft(facing, fieldBounds, gameTime).subtract(tilePos);
120+
Vec3 scanLeft = CubeRenderHelper.getScanLineRight(facing, fieldBounds, gameTime);
121+
Vec3 scanRight = CubeRenderHelper.getScanLineLeft(facing, fieldBounds, gameTime);
115122

116123
// 0, 0, 0 is now the edge of the projector's space
117124
final Matrix4f p = mx.last().pose();
@@ -136,9 +143,7 @@ private void drawProjectorArcs(FieldProjectorEntity tile, PoseStack mx, MultiBuf
136143
.setNormal(n, 0, 0, 0);
137144

138145
mx.popPose();
139-
}
140-
141-
catch(Exception ex) {
146+
} catch (Exception ex) {
142147
CompactCrafting.LOGGER.error(ex);
143148
}
144149
}

neoforge-main/src/main/java/dev/compactmods/crafting/field/MiniaturizationField.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -372,8 +372,9 @@ public void doRecipeScan() {
372372

373373
// Send tracking client updates
374374
if (!level.isClientSide && level instanceof ServerLevel sl) {
375+
final var recipe = currentRecipe == null ? null : currentRecipe.id();
375376
PacketDistributor.sendToPlayersTrackingChunk(sl, new ChunkPos(center),
376-
new FieldRecipeChangedPacket(this.center, Optional.of(this.currentRecipe.id())));
377+
new FieldRecipeChangedPacket(this.center, Optional.ofNullable(recipe)));
377378
}
378379

379380
// Update all listeners as well

0 commit comments

Comments
 (0)