Skip to content

Commit 88e491b

Browse files
committed
Update glass pane model to match the ingame model and not include extra refraction boundaries.
Fixes #892
1 parent 31571c0 commit 88e491b

File tree

1 file changed

+126
-114
lines changed

1 file changed

+126
-114
lines changed

chunky/src/java/se/llbit/chunky/model/minecraft/GlassPaneModel.java

Lines changed: 126 additions & 114 deletions
Original file line numberDiff line numberDiff line change
@@ -19,137 +19,149 @@
1919

2020
import se.llbit.chunky.model.Model;
2121
import se.llbit.chunky.model.QuadModel;
22+
import se.llbit.chunky.model.builder.QuadModelBuilder;
23+
import se.llbit.chunky.renderer.scene.Scene;
2224
import se.llbit.chunky.resources.Texture;
23-
import se.llbit.math.*;
25+
import se.llbit.math.Quad;
26+
import se.llbit.math.Ray;
27+
import se.llbit.math.Vector3;
28+
import se.llbit.math.Vector4;
2429

25-
import java.util.ArrayList;
26-
import java.util.Arrays;
27-
import java.util.function.Consumer;
30+
import java.util.function.BiFunction;
2831

2932
public class GlassPaneModel extends QuadModel {
30-
//region quads
31-
private static final Quad[] core = {
32-
// Top
33-
new Quad(
34-
new Vector3(7 / 16.0, 16 / 16.0, 9 / 16.0),
35-
new Vector3(9 / 16.0, 16 / 16.0, 9 / 16.0),
36-
new Vector3(7 / 16.0, 16 / 16.0, 7 / 16.0),
37-
new Vector4(7 / 16.0, 9 / 16.0, 7 / 16.0, 9 / 16.0)
38-
),
39-
40-
// Bottom
41-
new Quad(
42-
new Vector3(7 / 16.0, 0 / 16.0, 7 / 16.0),
43-
new Vector3(9 / 16.0, 0 / 16.0, 7 / 16.0),
44-
new Vector3(7 / 16.0, 0 / 16.0, 9 / 16.0),
45-
new Vector4(7 / 16.0, 9 / 16.0, 7 / 16.0, 9 / 16.0)
46-
),
47-
48-
// North
49-
new Quad(
50-
new Vector3(7 / 16.0, 16 / 16.0, 7 / 16.0),
51-
new Vector3(9 / 16.0, 16 / 16.0, 7 / 16.0),
52-
new Vector3(7 / 16.0, 0 / 16.0, 7 / 16.0),
53-
new Vector4(7 / 16.0, 9 / 16.0, 16 / 16.0, 0 / 16.0)
54-
),
55-
null, // East
56-
null, // South
57-
null // West
33+
private static final Quad[] panePostQuads = {
34+
new Quad(
35+
new Vector3(7 / 16.0, 16 / 16.0, 9 / 16.0),
36+
new Vector3(9 / 16.0, 16 / 16.0, 9 / 16.0),
37+
new Vector3(7 / 16.0, 16 / 16.0, 7 / 16.0),
38+
new Vector4(7 / 16.0, 9 / 16.0, 7 / 16.0, 9 / 16.0)
39+
),
40+
new Quad(
41+
new Vector3(7 / 16.0, 0 / 16.0, 7 / 16.0),
42+
new Vector3(9 / 16.0, 0 / 16.0, 7 / 16.0),
43+
new Vector3(7 / 16.0, 0 / 16.0, 9 / 16.0),
44+
new Vector4(7 / 16.0, 9 / 16.0, 7 / 16.0, 9 / 16.0)
45+
)
5846
};
5947

60-
static {
61-
core[3] = new Quad(core[2], Transform.NONE.rotateY());
62-
core[4] = new Quad(core[3], Transform.NONE.rotateY());
63-
core[5] = new Quad(core[4], Transform.NONE.rotateY());
64-
}
65-
66-
private static final Quad[][] connector = {
67-
// Front side.
68-
{
69-
// Left face.
70-
new Quad(new Vector3(7 / 16., 1, 7 / 16.), new Vector3(7 / 16., 1, 0),
71-
new Vector3(7 / 16., 0, 7 / 16.), new Vector4(7 / 16., 0, 1, 0)),
72-
73-
// Right face.
74-
new Quad(new Vector3(9 / 16., 1, 0), new Vector3(9 / 16., 1, 7 / 16.),
75-
new Vector3(9 / 16., 0, 0), new Vector4(0, 7 / 16., 1, 0)),
76-
77-
// Top face.
78-
new Quad(new Vector3(9 / 16., 1, 0), new Vector3(7 / 16., 1, 0),
79-
new Vector3(9 / 16., 1, 7 / 16.), new Vector4(9 / 16., 7 / 16., 0, 7 / 16.)),
80-
81-
// Bottom face.
82-
new Quad(new Vector3(7 / 16., 0, 0), new Vector3(9 / 16., 0, 0),
83-
new Vector3(7 / 16., 0, 7 / 16.), new Vector4(7 / 16., 9 / 16., 0, 7 / 16.)),
48+
private static final BiFunction<Texture, Texture, Texture[]> paneSideTex = (edge, pane) -> new Texture[]{
49+
edge, edge, pane, pane, edge
50+
};
8451

85-
},
86-
// Back side.
87-
{
88-
// Left face.
89-
new Quad(new Vector3(7 / 16., 1, 1), new Vector3(7 / 16., 1, 9 / 16.),
90-
new Vector3(7 / 16., 0, 1), new Vector4(1, 9 / 16., 1, 0)),
52+
private static final Quad[] paneSideQuads = new Quad[]{
53+
new Quad(
54+
new Vector3(7 / 16.0, 16 / 16.0, 7 / 16.0),
55+
new Vector3(9 / 16.0, 16 / 16.0, 7 / 16.0),
56+
new Vector3(7 / 16.0, 16 / 16.0, 0 / 16.0),
57+
new Vector4(7 / 16.0, 9 / 16.0, 9 / 16.0, 16 / 16.0)
58+
),
59+
new Quad(
60+
new Vector3(7 / 16.0, 0 / 16.0, 0 / 16.0),
61+
new Vector3(9 / 16.0, 0 / 16.0, 0 / 16.0),
62+
new Vector3(7 / 16.0, 0 / 16.0, 7 / 16.0),
63+
new Vector4(7 / 16.0, 9 / 16.0, 9 / 16.0, 16 / 16.0)
64+
),
65+
new Quad(
66+
new Vector3(7 / 16.0, 16 / 16.0, 7 / 16.0),
67+
new Vector3(7 / 16.0, 16 / 16.0, 0 / 16.0),
68+
new Vector3(7 / 16.0, 0 / 16.0, 7 / 16.0),
69+
new Vector4(9 / 16.0, 16 / 16.0, 16 / 16.0, 0 / 16.0)
70+
),
71+
new Quad(
72+
new Vector3(9 / 16.0, 16 / 16.0, 0 / 16.0),
73+
new Vector3(9 / 16.0, 16 / 16.0, 7 / 16.0),
74+
new Vector3(9 / 16.0, 0 / 16.0, 0 / 16.0),
75+
new Vector4(16 / 16.0, 9 / 16.0, 16 / 16.0, 0 / 16.0)
76+
),
77+
new Quad(
78+
new Vector3(7 / 16.0, 16 / 16.0, 0 / 16.0),
79+
new Vector3(9 / 16.0, 16 / 16.0, 0 / 16.0),
80+
new Vector3(7 / 16.0, 0 / 16.0, 0 / 16.0),
81+
new Vector4(9 / 16.0, 7 / 16.0, 16 / 16.0, 0 / 16.0)
82+
)
83+
};
9184

92-
// Right face.
93-
new Quad(new Vector3(9 / 16., 1, 9 / 16.), new Vector3(9 / 16., 1, 1),
94-
new Vector3(9 / 16., 0, 9 / 16.), new Vector4(9 / 16., 1, 1, 0)),
85+
private static final Quad[] paneSideAltQuads = new Quad[]{
86+
new Quad(
87+
new Vector3(7 / 16.0, 16 / 16.0, 16 / 16.0),
88+
new Vector3(9 / 16.0, 16 / 16.0, 16 / 16.0),
89+
new Vector3(7 / 16.0, 16 / 16.0, 9 / 16.0),
90+
new Vector4(7 / 16.0, 9 / 16.0, 9 / 16.0, 16 / 16.0)
91+
),
92+
new Quad(
93+
new Vector3(7 / 16.0, 0 / 16.0, 9 / 16.0),
94+
new Vector3(9 / 16.0, 0 / 16.0, 9 / 16.0),
95+
new Vector3(7 / 16.0, 0 / 16.0, 16 / 16.0),
96+
new Vector4(7 / 16.0, 9 / 16.0, 9 / 16.0, 16 / 16.0)
97+
),
98+
new Quad(
99+
new Vector3(7 / 16.0, 16 / 16.0, 16 / 16.0),
100+
new Vector3(7 / 16.0, 16 / 16.0, 9 / 16.0),
101+
new Vector3(7 / 16.0, 0 / 16.0, 16 / 16.0),
102+
new Vector4(0 / 16.0, 7 / 16.0, 16 / 16.0, 0 / 16.0)
103+
),
104+
new Quad(
105+
new Vector3(9 / 16.0, 16 / 16.0, 9 / 16.0),
106+
new Vector3(9 / 16.0, 16 / 16.0, 16 / 16.0),
107+
new Vector3(9 / 16.0, 0 / 16.0, 9 / 16.0),
108+
new Vector4(7 / 16.0, 0 / 16.0, 16 / 16.0, 0 / 16.0)
109+
),
110+
new Quad(
111+
new Vector3(9 / 16.0, 16 / 16.0, 16 / 16.0),
112+
new Vector3(7 / 16.0, 16 / 16.0, 16 / 16.0),
113+
new Vector3(9 / 16.0, 0 / 16.0, 16 / 16.0),
114+
new Vector4(9 / 16.0, 7 / 16.0, 16 / 16.0, 0 / 16.0)
115+
)
116+
};
95117

96-
// Top face.
97-
new Quad(new Vector3(9 / 16., 1, 9 / 16.), new Vector3(7 / 16., 1, 9 / 16.),
98-
new Vector3(9 / 16., 1, 1), new Vector4(9 / 16., 7 / 16., 9 / 16., 1)),
99118

100-
// Bottom face.
101-
new Quad(new Vector3(7 / 16., 0, 9 / 16.), new Vector3(9 / 16., 0, 9 / 16.),
102-
new Vector3(7 / 16., 0, 1), new Vector4(7 / 16., 9 / 16., 9 / 16., 1)),
103-
},
119+
private static final Quad[] paneNoSideQuads = new Quad[]{
120+
new Quad(
121+
new Vector3(7 / 16.0, 16 / 16.0, 7 / 16.0),
122+
new Vector3(9 / 16.0, 16 / 16.0, 7 / 16.0),
123+
new Vector3(7 / 16.0, 0 / 16.0, 7 / 16.0),
124+
new Vector4(7 / 16.0, 9 / 16.0, 16 / 16.0, 0 / 16.0)
125+
)
104126
};
105127

106-
private static final Quad[][] panes = new Quad[4][];
107-
108-
static {
109-
panes[0] = connector[0];
110-
panes[1] = connector[1];
111-
for (int j = 2; j < 4; ++j) {
112-
panes[j] = Model.rotateY(connector[j - 2]);
113-
}
114-
}
115-
//endregion
128+
private static final Quad[] paneNoSideAltQuads = new Quad[]{
129+
new Quad(
130+
new Vector3(9 / 16.0, 16 / 16.0, 7 / 16.0),
131+
new Vector3(9 / 16.0, 16 / 16.0, 9 / 16.0),
132+
new Vector3(9 / 16.0, 0 / 16.0, 7 / 16.0),
133+
new Vector4(9 / 16.0, 7 / 16.0, 16 / 16.0, 0 / 16.0)
134+
)
135+
};
116136

117137
private final Quad[] quads;
118138
private final Texture[] textures;
119139

120-
public GlassPaneModel(Texture top, Texture side, boolean north, boolean south, boolean east, boolean west) {
121-
ArrayList<Quad> quads = new ArrayList<>();
122-
ArrayList<Texture> textures = new ArrayList<>();
123-
124-
Consumer<Quad[]> addConnector = qs -> {
125-
quads.addAll(Arrays.asList(qs));
126-
textures.addAll(Arrays.asList(side, side, top, top));
127-
};
128-
129-
// Top and bottom
130-
quads.add(core[0]);
131-
quads.add(core[1]);
132-
textures.add(top);
133-
textures.add(top);
134-
135-
// Cull sides
136-
if (!north) quads.add(core[2]);
137-
if (!east) quads.add(core[3]);
138-
if (!south) quads.add(core[4]);
139-
if (!west) quads.add(core[5]);
140-
141-
while (textures.size() < quads.size()) {
142-
textures.add(side);
140+
public GlassPaneModel(Texture edge, Texture pane, boolean north, boolean south, boolean east, boolean west) {
141+
QuadModelBuilder builder = new QuadModelBuilder();
142+
builder.addModel(panePostQuads, edge);
143+
if (north) {
144+
builder.addModel(paneSideQuads, paneSideTex.apply(edge, pane));
145+
} else {
146+
builder.addModel(paneNoSideQuads, pane);
143147
}
144-
145-
// Add connectors
146-
if (north) addConnector.accept(panes[0]);
147-
if (south) addConnector.accept(panes[1]);
148-
if (east) addConnector.accept(panes[2]);
149-
if (west) addConnector.accept(panes[3]);
150-
151-
this.quads = quads.toArray(new Quad[0]);
152-
this.textures = textures.toArray(new Texture[0]);
148+
if (east) {
149+
builder.addModel(Model.rotateY(paneSideQuads), paneSideTex.apply(edge, pane));
150+
} else {
151+
builder.addModel(paneNoSideAltQuads, pane);
152+
}
153+
if (south) {
154+
builder.addModel(paneSideAltQuads, paneSideTex.apply(edge, pane));
155+
} else {
156+
builder.addModel(Model.rotateY(paneNoSideAltQuads), pane);
157+
}
158+
if (west) {
159+
builder.addModel(Model.rotateY(paneSideAltQuads), paneSideTex.apply(edge, pane));
160+
} else {
161+
builder.addModel(Model.rotateNegY(paneNoSideQuads), pane);
162+
}
163+
quads = builder.getQuads();
164+
textures = builder.getTextures();
153165
}
154166

155167
@Override

0 commit comments

Comments
 (0)