Skip to content

Commit ab256d4

Browse files
committed
Don't go back and forth between floats and doubles, and simplify how we unpack the vertices and calculate normal
1 parent 2912fc3 commit ab256d4

File tree

4 files changed

+41
-60
lines changed

4 files changed

+41
-60
lines changed

src/main/java/mekanism/client/render/RenderTickHandler.java

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

33
import com.mojang.blaze3d.vertex.PoseStack;
44
import com.mojang.blaze3d.vertex.VertexConsumer;
5+
import it.unimi.dsi.fastutil.objects.Reference2ObjectOpenHashMap;
56
import java.util.ArrayList;
67
import java.util.Comparator;
78
import java.util.EnumMap;
8-
import java.util.HashMap;
99
import java.util.List;
1010
import java.util.Map;
1111
import java.util.Map.Entry;
@@ -21,9 +21,6 @@
2121
import mekanism.client.render.hud.RadiationOverlay;
2222
import mekanism.client.render.lib.Outlines;
2323
import mekanism.client.render.lib.Outlines.Line;
24-
import mekanism.client.render.lib.Quad;
25-
import mekanism.client.render.lib.QuadUtils;
26-
import mekanism.client.render.lib.Vertex;
2724
import mekanism.client.render.lib.effect.BoltRenderer;
2825
import mekanism.client.render.tileentity.IWireFrameRenderer;
2926
import mekanism.common.Mekanism;
@@ -44,7 +41,6 @@
4441
import mekanism.common.tile.component.TileComponentConfig;
4542
import mekanism.common.tile.component.config.DataType;
4643
import mekanism.common.tile.interfaces.ISideConfiguration;
47-
import mekanism.common.util.EnumUtils;
4844
import mekanism.common.util.MekanismUtils;
4945
import mekanism.common.util.WorldUtils;
5046
import mezz.jei.api.runtime.IRecipesGui;
@@ -106,7 +102,7 @@ public class RenderTickHandler {
106102

107103
public static final Minecraft minecraft = Minecraft.getInstance();
108104

109-
private static final Map<BlockState, List<Line>> cachedWireFrames = new HashMap<>();
105+
private static final Map<BlockState, List<Line>> cachedWireFrames = new Reference2ObjectOpenHashMap<>();
110106
private static final Map<Direction, Map<TransmissionType, Model3D>> cachedOverlays = new EnumMap<>(Direction.class);
111107
private static final List<LazyRender> transparentRenderers = new ArrayList<>();
112108
private static final BoltRenderer boltRenderer = new BoltRenderer();
@@ -473,8 +469,7 @@ private void renderQuadsWireFrame(BlockState state, VertexConsumer buffer, PoseS
473469
if (lines == null) {
474470
BakedModel bakedModel = Minecraft.getInstance().getBlockRenderer().getBlockModel(state);
475471
//TODO: Eventually we may want to add support for Model data and maybe render type
476-
ModelData modelData = ModelData.EMPTY;
477-
lines = Outlines.extract(bakedModel, state, rand, modelData);
472+
lines = Outlines.extract(bakedModel, state, rand, ModelData.EMPTY, null);
478473
cachedWireFrames.put(state, lines);
479474
}
480475
PoseStack.Pose pose = matrix.last();

src/main/java/mekanism/client/render/lib/Outlines.java

Lines changed: 36 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -1,36 +1,34 @@
11
package mekanism.client.render.lib;
22

3-
import com.mojang.blaze3d.vertex.DefaultVertexFormat;
4-
import java.nio.ByteBuffer;
5-
import java.nio.IntBuffer;
63
import java.util.ArrayList;
74
import java.util.Arrays;
85
import java.util.List;
96
import mekanism.common.util.EnumUtils;
107
import net.minecraft.MethodsReturnNonnullByDefault;
8+
import net.minecraft.client.renderer.RenderType;
119
import net.minecraft.client.renderer.block.model.BakedQuad;
1210
import net.minecraft.client.resources.model.BakedModel;
1311
import net.minecraft.core.Direction;
1412
import net.minecraft.util.Mth;
1513
import net.minecraft.util.RandomSource;
1614
import net.minecraft.world.level.block.state.BlockState;
17-
import net.minecraft.world.phys.Vec3;
15+
import net.neoforged.neoforge.client.model.IQuadTransformer;
1816
import net.neoforged.neoforge.client.model.data.ModelData;
19-
import org.lwjgl.system.MemoryStack;
17+
import org.jetbrains.annotations.Nullable;
18+
import org.joml.Vector3f;
2019

2120
public class Outlines {
2221

23-
public static List<Line> extract(BakedModel model, BlockState state, RandomSource rand, ModelData modelData) {
22+
public static List<Line> extract(BakedModel model, @Nullable BlockState state, RandomSource rand, ModelData modelData, @Nullable RenderType renderType) {
2423
List<Line> lines = new ArrayList<>();
2524
VertexExtractor consumer = new VertexExtractor(lines);
2625
for (Direction direction : EnumUtils.DIRECTIONS) {
27-
//TODO: Eventually we may want to add support for Model data and maybe render type
28-
for (BakedQuad quad : model.getQuads(state, direction, rand, modelData, null)) {
26+
for (BakedQuad quad : model.getQuads(state, direction, rand, modelData, renderType)) {
2927
consumer.unpack(quad);
3028
}
3129
}
3230

33-
for (BakedQuad quad : model.getQuads(state, null, rand, modelData, null)) {
31+
for (BakedQuad quad : model.getQuads(state, null, rand, modelData, renderType)) {
3432
consumer.unpack(quad);
3533
}
3634
return lines;
@@ -41,72 +39,61 @@ public static List<Line> extract(BakedModel model, BlockState state, RandomSourc
4139
private static class VertexExtractor {
4240

4341
final List<Line> lines;
44-
final Vec3[] vertices = new Vec3[4];
42+
final Vector3f[] vertices = new Vector3f[4];
4543
int vertexIndex = 0;
4644

4745
private VertexExtractor(List<Line> lines) {
4846
this.lines = lines;
4947
}
5048

51-
public void vertex(double pX, double pY, double pZ) {
52-
vertices[vertexIndex++] = new Vec3(pX, pY, pZ);
49+
public void vertex(float pX, float pY, float pZ) {
50+
vertices[vertexIndex++] = new Vector3f(pX, pY, pZ);
5351
if (vertexIndex == 4) {
5452
vertexIndex = 0;
55-
addLine(vertices[0].x, vertices[0].y, vertices[0].z, vertices[1].x, vertices[1].y, vertices[1].z);
56-
addLine(vertices[1].x, vertices[1].y, vertices[1].z, vertices[2].x, vertices[2].y, vertices[2].z);
57-
addLine(vertices[2].x, vertices[2].y, vertices[2].z, vertices[3].x, vertices[3].y, vertices[3].z);
58-
addLine(vertices[3].x, vertices[3].y, vertices[3].z, vertices[0].x, vertices[0].y, vertices[0].z);
53+
addLine(vertices[0], vertices[1]);
54+
addLine(vertices[1], vertices[2]);
55+
addLine(vertices[2], vertices[3]);
56+
addLine(vertices[3], vertices[0]);
5957
Arrays.fill(vertices, null);
6058
}
6159
}
6260

63-
//slimmed down version of putBulkData
64-
public void unpack(BakedQuad pQuad) {
65-
int[] quadVertices = pQuad.getVertices();
66-
int elementCount = quadVertices.length / 8;
67-
68-
try (MemoryStack memorystack = MemoryStack.stackPush()) {
69-
ByteBuffer bytebuffer = memorystack.malloc(DefaultVertexFormat.BLOCK.getVertexSize());
70-
IntBuffer intbuffer = bytebuffer.asIntBuffer();
71-
72-
for (int k = 0; k < elementCount; ++k) {
73-
intbuffer.clear();
74-
intbuffer.put(quadVertices, k * 8, 8);
75-
float f = bytebuffer.getFloat(0);
76-
float f1 = bytebuffer.getFloat(4);
77-
float f2 = bytebuffer.getFloat(8);
78-
this.vertex(f, f1, f2);
79-
}
80-
}
81-
}
82-
83-
private void addLine(double x1, double y1, double z1, double x2, double y2, double z2) {
84-
double nX = (x2 - x1);
85-
double nY = (y2 - y1);
86-
double nZ = (z2 - z1);
87-
double nLen = Math.sqrt(nX * nX + nY * nY + nZ * nZ);
88-
89-
nX = nX / nLen;
90-
nY = nY / nLen;
91-
nZ = nZ / nLen;
92-
93-
Line line = new Line((float) x1, (float) y1, (float) z1, (float) x2, (float) y2, (float) z2, (float) nX, (float) nY, (float) nZ);
61+
private void addLine(Vector3f v1, Vector3f v2) {
62+
Line line = new Line(v1, v2);
9463
if (!lines.contains(line)) {
9564
lines.add(line);
9665
}
9766
}
9867

68+
//Based on how QuadTransformers#applying extracts the vertex positions
69+
public void unpack(BakedQuad pQuad) {
70+
int[] quadVertices = pQuad.getVertices();
71+
for (int i = 0; i < 4; i++) {
72+
int offset = i * IQuadTransformer.STRIDE + IQuadTransformer.POSITION;
73+
float x = Float.intBitsToFloat(quadVertices[offset]);
74+
float y = Float.intBitsToFloat(quadVertices[offset + 1]);
75+
float z = Float.intBitsToFloat(quadVertices[offset + 2]);
76+
this.vertex(x, y, z);
77+
}
78+
}
9979
}
10080

10181
public record Line(float x1, float y1, float z1, float x2, float y2, float z2, float nX, float nY, float nZ) {
10282

83+
public Line(Vector3f v1, Vector3f v2, Vector3f normal) {
84+
this(v1.x, v1.y, v1.z, v2.x, v2.y, v2.z, normal.x, normal.y, normal.z);
85+
}
86+
87+
public Line(Vector3f v1, Vector3f v2) {
88+
this(v1, v2, v2.sub(v1, new Vector3f()).normalize());
89+
}
90+
10391
@SuppressWarnings("SuspiciousNameCombination")
10492
@Override
10593
public boolean equals(Object obj) {
10694
if (obj == this) {
10795
return true;
108-
}
109-
if (obj == null || obj.getClass() != Line.class) {
96+
} else if (obj == null || obj.getClass() != Line.class) {
11097
return false;
11198
}
11299
Line other = (Line) obj;

src/main/java/mekanism/client/render/tileentity/RenderPigmentMixer.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@
1111
import mekanism.client.render.RenderTickHandler;
1212
import mekanism.client.render.lib.Outlines;
1313
import mekanism.client.render.lib.Outlines.Line;
14-
import mekanism.client.render.lib.Vertex;
1514
import mekanism.common.base.ProfilerConstants;
1615
import mekanism.common.block.attribute.Attribute;
1716
import mekanism.common.tile.machine.TileEntityPigmentMixer;
@@ -77,7 +76,7 @@ public boolean isCombined() {
7776
public void renderWireFrame(BlockEntity tile, float partialTick, PoseStack matrix, VertexConsumer buffer, int red, int green, int blue, int alpha) {
7877
if (tile instanceof TileEntityPigmentMixer mixer) {
7978
if (lines.isEmpty()) {
80-
lines.addAll(Outlines.extract(MekanismModelCache.INSTANCE.PIGMENT_MIXER_SHAFT.getBakedModel(), null, tile.getLevel().random, ModelData.EMPTY));
79+
lines.addAll(Outlines.extract(MekanismModelCache.INSTANCE.PIGMENT_MIXER_SHAFT.getBakedModel(), null, tile.getLevel().random, ModelData.EMPTY, null));
8180
}
8281
setupRenderer(mixer, partialTick, matrix);
8382
Pose pose = matrix.last();

src/main/java/mekanism/client/render/tileentity/RenderSeismicVibrator.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@ public boolean isCombined() {
6161
public void renderWireFrame(BlockEntity tile, float partialTick, PoseStack matrix, VertexConsumer buffer, int red, int green, int blue, int alpha) {
6262
if (tile instanceof TileEntitySeismicVibrator vibrator) {
6363
if (lines.isEmpty()) {
64-
lines.addAll(Outlines.extract(MekanismModelCache.INSTANCE.VIBRATOR_SHAFT.getBakedModel(), null, tile.getLevel().random, ModelData.EMPTY));
64+
lines.addAll(Outlines.extract(MekanismModelCache.INSTANCE.VIBRATOR_SHAFT.getBakedModel(), null, tile.getLevel().random, ModelData.EMPTY, null));
6565
}
6666
setupRenderer(vibrator, partialTick, matrix);
6767
Pose pose = matrix.last();

0 commit comments

Comments
 (0)