|
19 | 19 |
|
20 | 20 | import se.llbit.chunky.model.Model; |
21 | 21 | import se.llbit.chunky.model.QuadModel; |
| 22 | +import se.llbit.chunky.model.builder.QuadModelBuilder; |
| 23 | +import se.llbit.chunky.renderer.scene.Scene; |
22 | 24 | 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; |
24 | 29 |
|
25 | | -import java.util.ArrayList; |
26 | | -import java.util.Arrays; |
27 | | -import java.util.function.Consumer; |
| 30 | +import java.util.function.BiFunction; |
28 | 31 |
|
29 | 32 | 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 | + ) |
58 | 46 | }; |
59 | 47 |
|
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 | + }; |
84 | 51 |
|
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 | + }; |
91 | 84 |
|
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 | + }; |
95 | 117 |
|
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)), |
99 | 118 |
|
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 | + ) |
104 | 126 | }; |
105 | 127 |
|
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 | + }; |
116 | 136 |
|
117 | 137 | private final Quad[] quads; |
118 | 138 | private final Texture[] textures; |
119 | 139 |
|
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); |
143 | 147 | } |
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(); |
153 | 165 | } |
154 | 166 |
|
155 | 167 | @Override |
|
0 commit comments