Skip to content

Commit c4a7e94

Browse files
committed
Optimized line boxes
1 parent b74c799 commit c4a7e94

2 files changed

Lines changed: 95 additions & 31 deletions

File tree

src/main/java/dev/latvian/mods/kmath/VoxelShapeBox.java

Lines changed: 60 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -26,40 +26,81 @@ public static VoxelShapeBox of(VoxelShape shape) {
2626
return FULL;
2727
}
2828

29-
var boxes = new ArrayList<AABB>();
29+
var boxes = new ArrayList<AABB>(1);
3030
shape.forAllBoxes((minX, minY, minZ, maxX, maxY, maxZ) -> boxes.add(new AABB(minX, minY, minZ, maxX, maxY, maxZ)));
31-
var edges = new ArrayList<Line>();
31+
32+
if (boxes.size() == 1) {
33+
return of(boxes.getFirst());
34+
}
35+
36+
var edges = new ArrayList<Line>(12);
3237
shape.forAllEdges((minX, minY, minZ, maxX, maxY, maxZ) -> edges.add(new Line(new Vec3(minX, minY, minZ), new Vec3(maxX, maxY, maxZ))));
3338
return edges.isEmpty() && boxes.isEmpty() ? EMPTY : new VoxelShapeBox(List.copyOf(edges), List.copyOf(boxes));
3439
}
3540

3641
private static void edge(double minX, double minY, double minZ, double maxX, double maxY, double maxZ, List<Line> edges) {
37-
if (minX != maxX || minY != maxY || minZ != maxZ) {
38-
edges.add(new Line(new Vec3(minX, minY, minZ), new Vec3(maxX, maxY, maxZ)));
39-
}
42+
edges.add(new Line(new Vec3(minX, minY, minZ), new Vec3(maxX, maxY, maxZ)));
4043
}
4144

4245
public static VoxelShapeBox of(AABB box) {
43-
var edges = new ArrayList<Line>(12);
4446
double minX = box.minX;
4547
double minY = box.minY;
4648
double minZ = box.minZ;
4749
double maxX = box.maxX;
4850
double maxY = box.maxY;
4951
double maxZ = box.maxZ;
50-
edge(minX, minY, minZ, maxX, minY, minZ, edges);
51-
edge(minX, minY, minZ, minX, maxY, minZ, edges);
52-
edge(minX, minY, minZ, minX, minY, maxZ, edges);
53-
edge(maxX, minY, minZ, maxX, maxY, minZ, edges);
54-
edge(maxX, maxY, minZ, minX, maxY, minZ, edges);
55-
edge(minX, maxY, minZ, minX, maxY, maxZ, edges);
56-
edge(minX, maxY, maxZ, minX, minY, maxZ, edges);
57-
edge(minX, minY, maxZ, maxX, minY, maxZ, edges);
58-
edge(maxX, minY, maxZ, maxX, minY, minZ, edges);
59-
edge(minX, maxY, maxZ, maxX, maxY, maxZ, edges);
60-
edge(maxX, minY, maxZ, maxX, maxY, maxZ, edges);
61-
edge(maxX, maxY, minZ, maxX, maxY, maxZ, edges);
62-
return new VoxelShapeBox(List.copyOf(edges), List.of(box));
52+
53+
if (minX == maxX && minY == maxY && minZ == maxZ) {
54+
return EMPTY;
55+
} else if (minY == maxY && minZ == maxZ) {
56+
var edges = new ArrayList<Line>(1);
57+
edge(minX, minY, minZ, maxX, minY, minZ, edges);
58+
return new VoxelShapeBox(List.copyOf(edges), List.of(box));
59+
} else if (minX == maxX && minZ == maxZ) {
60+
var edges = new ArrayList<Line>(1);
61+
edge(minX, minY, minZ, minX, maxY, minZ, edges);
62+
return new VoxelShapeBox(List.copyOf(edges), List.of(box));
63+
} else if (minX == maxX && minY == maxY) {
64+
var edges = new ArrayList<Line>(1);
65+
edge(minX, minY, minZ, minX, minY, maxZ, edges);
66+
return new VoxelShapeBox(List.copyOf(edges), List.of(box));
67+
} else if (minX == maxX) {
68+
var edges = new ArrayList<Line>(4);
69+
edge(minX, minY, minZ, minX, maxY, minZ, edges);
70+
edge(minX, minY, minZ, minX, minY, maxZ, edges);
71+
edge(minX, maxY, minZ, minX, maxY, maxZ, edges);
72+
edge(minX, maxY, maxZ, minX, minY, maxZ, edges);
73+
return new VoxelShapeBox(List.copyOf(edges), List.of(box));
74+
} else if (minY == maxY) {
75+
var edges = new ArrayList<Line>(4);
76+
edge(minX, minY, minZ, maxX, minY, minZ, edges);
77+
edge(minX, minY, minZ, minX, minY, maxZ, edges);
78+
edge(minX, minY, maxZ, maxX, minY, maxZ, edges);
79+
edge(maxX, minY, maxZ, maxX, minY, minZ, edges);
80+
return new VoxelShapeBox(List.copyOf(edges), List.of(box));
81+
} else if (minZ == maxZ) {
82+
var edges = new ArrayList<Line>(4);
83+
edge(minX, minY, minZ, maxX, minY, minZ, edges);
84+
edge(minX, minY, minZ, minX, maxY, minZ, edges);
85+
edge(maxX, minY, minZ, maxX, maxY, minZ, edges);
86+
edge(maxX, maxY, minZ, minX, maxY, minZ, edges);
87+
return new VoxelShapeBox(List.copyOf(edges), List.of(box));
88+
} else {
89+
var edges = new ArrayList<Line>(12);
90+
edge(minX, minY, minZ, maxX, minY, minZ, edges);
91+
edge(minX, minY, minZ, minX, maxY, minZ, edges);
92+
edge(minX, minY, minZ, minX, minY, maxZ, edges);
93+
edge(maxX, minY, minZ, maxX, maxY, minZ, edges);
94+
edge(maxX, maxY, minZ, minX, maxY, minZ, edges);
95+
edge(minX, maxY, minZ, minX, maxY, maxZ, edges);
96+
edge(minX, maxY, maxZ, minX, minY, maxZ, edges);
97+
edge(minX, minY, maxZ, maxX, minY, maxZ, edges);
98+
edge(maxX, minY, maxZ, maxX, minY, minZ, edges);
99+
edge(minX, maxY, maxZ, maxX, maxY, maxZ, edges);
100+
edge(maxX, minY, maxZ, maxX, maxY, maxZ, edges);
101+
edge(maxX, maxY, minZ, maxX, maxY, maxZ, edges);
102+
return new VoxelShapeBox(List.copyOf(edges), List.of(box));
103+
}
63104
}
64105

65106
public void buildQuads(Vec3 offset, VertexCallback callback) {

src/main/java/dev/latvian/mods/kmath/render/BoxBuilder.java

Lines changed: 35 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -86,18 +86,41 @@ static void line(float minX, float minY, float minZ, float maxX, float maxY, flo
8686
}
8787

8888
static void lines(float minX, float minY, float minZ, float maxX, float maxY, float maxZ, VertexCallback callback) {
89-
line(minX, minY, minZ, maxX, minY, minZ, 1F, 0F, 0F, callback);
90-
line(minX, minY, minZ, minX, maxY, minZ, 0F, 1F, 0F, callback);
91-
line(minX, minY, minZ, minX, minY, maxZ, 0F, 0F, 1F, callback);
92-
line(maxX, minY, minZ, maxX, maxY, minZ, 0F, 1F, 0F, callback);
93-
line(maxX, maxY, minZ, minX, maxY, minZ, -1F, 0F, 0F, callback);
94-
line(minX, maxY, minZ, minX, maxY, maxZ, 0F, 0F, 1F, callback);
95-
line(minX, maxY, maxZ, minX, minY, maxZ, 0F, -1F, 0F, callback);
96-
line(minX, minY, maxZ, maxX, minY, maxZ, 1F, 0F, 0F, callback);
97-
line(maxX, minY, maxZ, maxX, minY, minZ, 0F, 0F, -1F, callback);
98-
line(minX, maxY, maxZ, maxX, maxY, maxZ, 1F, 0F, 0F, callback);
99-
line(maxX, minY, maxZ, maxX, maxY, maxZ, 0F, 1F, 0F, callback);
100-
line(maxX, maxY, minZ, maxX, maxY, maxZ, 0F, 0F, 1F, callback);
89+
if (minY == maxY && minZ == maxZ) {
90+
line(minX, minY, minZ, maxX, minY, minZ, 1F, 0F, 0F, callback);
91+
} else if (minX == maxX && minZ == maxZ) {
92+
line(minX, minY, minZ, minX, maxY, minZ, 0F, 1F, 0F, callback);
93+
} else if (minX == maxX && minY == maxY) {
94+
line(minX, minY, minZ, minX, minY, maxZ, 0F, 0F, 1F, callback);
95+
} else if (minX == maxX) {
96+
line(minX, minY, minZ, minX, maxY, minZ, 0F, 1F, 0F, callback);
97+
line(minX, minY, minZ, minX, minY, maxZ, 0F, 0F, 1F, callback);
98+
line(minX, maxY, minZ, minX, maxY, maxZ, 0F, 0F, 1F, callback);
99+
line(minX, maxY, maxZ, minX, minY, maxZ, 0F, -1F, 0F, callback);
100+
} else if (minY == maxY) {
101+
line(minX, minY, minZ, maxX, minY, minZ, 1F, 0F, 0F, callback);
102+
line(minX, minY, minZ, minX, minY, maxZ, 0F, 0F, 1F, callback);
103+
line(minX, minY, maxZ, maxX, minY, maxZ, 1F, 0F, 0F, callback);
104+
line(maxX, minY, maxZ, maxX, minY, minZ, 0F, 0F, -1F, callback);
105+
} else if (minZ == maxZ) {
106+
line(minX, minY, minZ, maxX, minY, minZ, 1F, 0F, 0F, callback);
107+
line(minX, minY, minZ, minX, maxY, minZ, 0F, 1F, 0F, callback);
108+
line(maxX, minY, minZ, maxX, maxY, minZ, 0F, 1F, 0F, callback);
109+
line(maxX, maxY, minZ, minX, maxY, minZ, -1F, 0F, 0F, callback);
110+
} else if (minX != maxX || minY != maxY || minZ != maxZ) {
111+
line(minX, minY, minZ, maxX, minY, minZ, 1F, 0F, 0F, callback);
112+
line(minX, minY, minZ, minX, maxY, minZ, 0F, 1F, 0F, callback);
113+
line(minX, minY, minZ, minX, minY, maxZ, 0F, 0F, 1F, callback);
114+
line(maxX, minY, minZ, maxX, maxY, minZ, 0F, 1F, 0F, callback);
115+
line(maxX, maxY, minZ, minX, maxY, minZ, -1F, 0F, 0F, callback);
116+
line(minX, maxY, minZ, minX, maxY, maxZ, 0F, 0F, 1F, callback);
117+
line(minX, maxY, maxZ, minX, minY, maxZ, 0F, -1F, 0F, callback);
118+
line(minX, minY, maxZ, maxX, minY, maxZ, 1F, 0F, 0F, callback);
119+
line(maxX, minY, maxZ, maxX, minY, minZ, 0F, 0F, -1F, callback);
120+
line(minX, maxY, maxZ, maxX, maxY, maxZ, 1F, 0F, 0F, callback);
121+
line(maxX, minY, maxZ, maxX, maxY, maxZ, 0F, 1F, 0F, callback);
122+
line(maxX, maxY, minZ, maxX, maxY, maxZ, 0F, 0F, 1F, callback);
123+
}
101124
}
102125

103126
static void frameQuads(float minX, float minY, float minZ, float maxX, float maxY, float maxZ, float cornerSize, float edgeSize, VertexCallback callback) {

0 commit comments

Comments
 (0)