Skip to content

Commit e793405

Browse files
committed
Add the grindstone
1 parent a320015 commit e793405

File tree

5 files changed

+290
-3
lines changed

5 files changed

+290
-3
lines changed

chunky/src/java/se/llbit/chunky/block/BlockSpec.java

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1476,9 +1476,11 @@ private Block blockFromTag(String name) {
14761476
return new TexturedBlock(name, Texture.cartographyTableSide3, Texture.cartographyTableSide1, Texture.cartographyTableSide2, Texture.cartographyTableSide3, Texture.cartographyTableTop, Texture.darkOakPlanks);
14771477
case "fletching_table":
14781478
return new TexturedBlock(name, Texture.fletchingTableFront, Texture.fletchingTableFront, Texture.fletchingTableSide, Texture.fletchingTableSide, Texture.fletchingTableTop, Texture.birchPlanks);
1479-
case "grindstone":
1480-
// TODO
1481-
return new UnknownBlock(name);
1479+
case "grindstone": {
1480+
String face = tag.get("Properties").get("face").stringValue("floor");
1481+
String facing = getFacing(tag, "north");
1482+
return new Grindstone(face, facing);
1483+
}
14821484
case "lectern":
14831485
// TODO
14841486
return new UnknownBlock(name);
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
package se.llbit.chunky.block;
2+
3+
import se.llbit.chunky.model.GrindstoneModel;
4+
import se.llbit.chunky.renderer.scene.Scene;
5+
import se.llbit.chunky.resources.Texture;
6+
import se.llbit.math.Ray;
7+
8+
public class Grindstone extends MinecraftBlockTranslucent {
9+
private final String face;
10+
private final String facing;
11+
12+
public Grindstone(String face, String facing) {
13+
super("grindstone", Texture.grindstoneSide);
14+
this.face = face;
15+
this.facing = facing;
16+
localIntersect = true;
17+
}
18+
19+
@Override
20+
public boolean intersect(Ray ray, Scene scene) {
21+
return GrindstoneModel.intersect(ray, this.face, this.facing);
22+
}
23+
}
Lines changed: 255 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,255 @@
1+
package se.llbit.chunky.model;
2+
3+
import se.llbit.chunky.resources.Texture;
4+
import se.llbit.math.Quad;
5+
import se.llbit.math.Ray;
6+
import se.llbit.math.Vector3;
7+
import se.llbit.math.Vector4;
8+
9+
public class GrindstoneModel {
10+
private static final Texture pivot = Texture.grindstonePivot;
11+
private static final Texture round = Texture.grindstoneRound;
12+
private static final Texture side = Texture.grindstoneSide;
13+
private static final Texture leg = Texture.darkOakWood;
14+
private static final Texture[] tex = new Texture[]{
15+
leg, leg, leg, leg, leg,
16+
leg, leg, leg, leg, leg,
17+
pivot, pivot, pivot, pivot, pivot,
18+
pivot, pivot, pivot, pivot, pivot,
19+
round, round, side, side, round, round
20+
};
21+
22+
private static final Quad[] quadsFloorNorth = new Quad[]{
23+
new Quad(
24+
new Vector3(12 / 16.0, 0 / 16.0, 6 / 16.0),
25+
new Vector3(14 / 16.0, 0 / 16.0, 6 / 16.0),
26+
new Vector3(12 / 16.0, 0 / 16.0, 10 / 16.0),
27+
new Vector4(12 / 16.0, 14 / 16.0, 6 / 16.0, 10 / 16.0)
28+
),
29+
new Quad(
30+
new Vector3(12 / 16.0, 7 / 16.0, 10 / 16.0),
31+
new Vector3(12 / 16.0, 7 / 16.0, 6 / 16.0),
32+
new Vector3(12 / 16.0, 0 / 16.0, 10 / 16.0),
33+
new Vector4(10 / 16.0, 6 / 16.0, 7 / 16.0, 0 / 16.0)
34+
),
35+
new Quad(
36+
new Vector3(14 / 16.0, 7 / 16.0, 6 / 16.0),
37+
new Vector3(14 / 16.0, 7 / 16.0, 10 / 16.0),
38+
new Vector3(14 / 16.0, 0 / 16.0, 6 / 16.0),
39+
new Vector4(6 / 16.0, 10 / 16.0, 0 / 16.0, 7 / 16.0)
40+
),
41+
new Quad(
42+
new Vector3(12 / 16.0, 7 / 16.0, 6 / 16.0),
43+
new Vector3(14 / 16.0, 7 / 16.0, 6 / 16.0),
44+
new Vector3(12 / 16.0, 0 / 16.0, 6 / 16.0),
45+
new Vector4(4 / 16.0, 2 / 16.0, 7 / 16.0, 0 / 16.0)
46+
),
47+
new Quad(
48+
new Vector3(14 / 16.0, 7 / 16.0, 10 / 16.0),
49+
new Vector3(12 / 16.0, 7 / 16.0, 10 / 16.0),
50+
new Vector3(14 / 16.0, 0 / 16.0, 10 / 16.0),
51+
new Vector4(14 / 16.0, 12 / 16.0, 7 / 16.0, 0 / 16.0)
52+
),
53+
new Quad(
54+
new Vector3(2 / 16.0, 0 / 16.0, 6 / 16.0),
55+
new Vector3(4 / 16.0, 0 / 16.0, 6 / 16.0),
56+
new Vector3(2 / 16.0, 0 / 16.0, 10 / 16.0),
57+
new Vector4(2 / 16.0, 4 / 16.0, 6 / 16.0, 10 / 16.0)
58+
),
59+
new Quad(
60+
new Vector3(2 / 16.0, 7 / 16.0, 10 / 16.0),
61+
new Vector3(2 / 16.0, 7 / 16.0, 6 / 16.0),
62+
new Vector3(2 / 16.0, 0 / 16.0, 10 / 16.0),
63+
new Vector4(10 / 16.0, 6 / 16.0, 7 / 16.0, 0 / 16.0)
64+
),
65+
new Quad(
66+
new Vector3(4 / 16.0, 7 / 16.0, 6 / 16.0),
67+
new Vector3(4 / 16.0, 7 / 16.0, 10 / 16.0),
68+
new Vector3(4 / 16.0, 0 / 16.0, 6 / 16.0),
69+
new Vector4(6 / 16.0, 10 / 16.0, 0 / 16.0, 7 / 16.0)
70+
),
71+
new Quad(
72+
new Vector3(2 / 16.0, 7 / 16.0, 6 / 16.0),
73+
new Vector3(4 / 16.0, 7 / 16.0, 6 / 16.0),
74+
new Vector3(2 / 16.0, 0 / 16.0, 6 / 16.0),
75+
new Vector4(14 / 16.0, 12 / 16.0, 7 / 16.0, 0 / 16.0)
76+
),
77+
new Quad(
78+
new Vector3(4 / 16.0, 7 / 16.0, 10 / 16.0),
79+
new Vector3(2 / 16.0, 7 / 16.0, 10 / 16.0),
80+
new Vector3(4 / 16.0, 0 / 16.0, 10 / 16.0),
81+
new Vector4(4 / 16.0, 2 / 16.0, 7 / 16.0, 0 / 16.0)
82+
),
83+
new Quad(
84+
new Vector3(12 / 16.0, 13 / 16.0, 11 / 16.0),
85+
new Vector3(14 / 16.0, 13 / 16.0, 11 / 16.0),
86+
new Vector3(12 / 16.0, 13 / 16.0, 5 / 16.0),
87+
new Vector4(8 / 16.0, 10 / 16.0, 10 / 16.0, 16 / 16.0)
88+
),
89+
new Quad(
90+
new Vector3(12 / 16.0, 7 / 16.0, 5 / 16.0),
91+
new Vector3(14 / 16.0, 7 / 16.0, 5 / 16.0),
92+
new Vector3(12 / 16.0, 7 / 16.0, 11 / 16.0),
93+
new Vector4(8 / 16.0, 10 / 16.0, 10 / 16.0, 16 / 16.0)
94+
),
95+
new Quad(
96+
new Vector3(14 / 16.0, 13 / 16.0, 5 / 16.0),
97+
new Vector3(14 / 16.0, 13 / 16.0, 11 / 16.0),
98+
new Vector3(14 / 16.0, 7 / 16.0, 5 / 16.0),
99+
new Vector4(6 / 16.0, 0 / 16.0, 16 / 16.0, 10 / 16.0)
100+
),
101+
new Quad(
102+
new Vector3(12 / 16.0, 13 / 16.0, 5 / 16.0),
103+
new Vector3(14 / 16.0, 13 / 16.0, 5 / 16.0),
104+
new Vector3(12 / 16.0, 7 / 16.0, 5 / 16.0),
105+
new Vector4(8 / 16.0, 6 / 16.0, 16 / 16.0, 10 / 16.0)
106+
),
107+
new Quad(
108+
new Vector3(14 / 16.0, 13 / 16.0, 11 / 16.0),
109+
new Vector3(12 / 16.0, 13 / 16.0, 11 / 16.0),
110+
new Vector3(14 / 16.0, 7 / 16.0, 11 / 16.0),
111+
new Vector4(8 / 16.0, 6 / 16.0, 16 / 16.0, 10 / 16.0)
112+
),
113+
new Quad(
114+
new Vector3(2 / 16.0, 13 / 16.0, 11 / 16.0),
115+
new Vector3(4 / 16.0, 13 / 16.0, 11 / 16.0),
116+
new Vector3(2 / 16.0, 13 / 16.0, 5 / 16.0),
117+
new Vector4(8 / 16.0, 10 / 16.0, 10 / 16.0, 16 / 16.0)
118+
),
119+
new Quad(
120+
new Vector3(2 / 16.0, 7 / 16.0, 5 / 16.0),
121+
new Vector3(4 / 16.0, 7 / 16.0, 5 / 16.0),
122+
new Vector3(2 / 16.0, 7 / 16.0, 11 / 16.0),
123+
new Vector4(8 / 16.0, 10 / 16.0, 10 / 16.0, 16 / 16.0)
124+
),
125+
new Quad(
126+
new Vector3(2 / 16.0, 13 / 16.0, 11 / 16.0),
127+
new Vector3(2 / 16.0, 13 / 16.0, 5 / 16.0),
128+
new Vector3(2 / 16.0, 7 / 16.0, 11 / 16.0),
129+
new Vector4(6 / 16.0, 0 / 16.0, 16 / 16.0, 10 / 16.0)
130+
),
131+
new Quad(
132+
new Vector3(2 / 16.0, 13 / 16.0, 5 / 16.0),
133+
new Vector3(4 / 16.0, 13 / 16.0, 5 / 16.0),
134+
new Vector3(2 / 16.0, 7 / 16.0, 5 / 16.0),
135+
new Vector4(8 / 16.0, 6 / 16.0, 16 / 16.0, 10 / 16.0)
136+
),
137+
new Quad(
138+
new Vector3(4 / 16.0, 13 / 16.0, 11 / 16.0),
139+
new Vector3(2 / 16.0, 13 / 16.0, 11 / 16.0),
140+
new Vector3(4 / 16.0, 7 / 16.0, 11 / 16.0),
141+
new Vector4(8 / 16.0, 6 / 16.0, 16 / 16.0, 10 / 16.0)
142+
),
143+
new Quad(
144+
new Vector3(4 / 16.0, 16 / 16.0, 14 / 16.0),
145+
new Vector3(12 / 16.0, 16 / 16.0, 14 / 16.0),
146+
new Vector3(4 / 16.0, 16 / 16.0, 2 / 16.0),
147+
new Vector4(0 / 16.0, 8 / 16.0, 4 / 16.0, 16 / 16.0)
148+
),
149+
new Quad(
150+
new Vector3(4 / 16.0, 4 / 16.0, 2 / 16.0),
151+
new Vector3(12 / 16.0, 4 / 16.0, 2 / 16.0),
152+
new Vector3(4 / 16.0, 4 / 16.0, 14 / 16.0),
153+
new Vector4(0 / 16.0, 8 / 16.0, 4 / 16.0, 16 / 16.0)
154+
),
155+
new Quad(
156+
new Vector3(4 / 16.0, 16 / 16.0, 14 / 16.0),
157+
new Vector3(4 / 16.0, 16 / 16.0, 2 / 16.0),
158+
new Vector3(4 / 16.0, 4 / 16.0, 14 / 16.0),
159+
new Vector4(12 / 16.0, 0 / 16.0, 16 / 16.0, 4 / 16.0)
160+
),
161+
new Quad(
162+
new Vector3(12 / 16.0, 16 / 16.0, 2 / 16.0),
163+
new Vector3(12 / 16.0, 16 / 16.0, 14 / 16.0),
164+
new Vector3(12 / 16.0, 4 / 16.0, 2 / 16.0),
165+
new Vector4(12 / 16.0, 0 / 16.0, 16 / 16.0, 4 / 16.0)
166+
),
167+
new Quad(
168+
new Vector3(4 / 16.0, 16 / 16.0, 2 / 16.0),
169+
new Vector3(12 / 16.0, 16 / 16.0, 2 / 16.0),
170+
new Vector3(4 / 16.0, 4 / 16.0, 2 / 16.0),
171+
new Vector4(8 / 16.0, 0 / 16.0, 16 / 16.0, 4 / 16.0)
172+
),
173+
new Quad(
174+
new Vector3(12 / 16.0, 16 / 16.0, 14 / 16.0),
175+
new Vector3(4 / 16.0, 16 / 16.0, 14 / 16.0),
176+
new Vector3(12 / 16.0, 4 / 16.0, 14 / 16.0),
177+
new Vector4(8 / 16.0, 0 / 16.0, 16 / 16.0, 4 / 16.0)
178+
)
179+
};
180+
181+
static final Quad[][][] orientedQuads = new Quad[3][4][];
182+
183+
static {
184+
// face=floor
185+
orientedQuads[0][0] = quadsFloorNorth;
186+
orientedQuads[0][1] = Model.rotateY(orientedQuads[0][0]);
187+
orientedQuads[0][2] = Model.rotateY(orientedQuads[0][1]);
188+
orientedQuads[0][3] = Model.rotateY(orientedQuads[0][2]);
189+
190+
// face=wall
191+
orientedQuads[1][0] = Model.rotateX(quadsFloorNorth, Math.toRadians(-90));
192+
orientedQuads[1][1] = Model.rotateY(orientedQuads[1][0]);
193+
orientedQuads[1][2] = Model.rotateY(orientedQuads[1][1]);
194+
orientedQuads[1][3] = Model.rotateY(orientedQuads[1][2]);
195+
196+
// face=ceiling
197+
orientedQuads[2][2] = Model.rotateX(quadsFloorNorth, Math.toRadians(180));
198+
orientedQuads[2][3] = Model.rotateY(orientedQuads[2][2]);
199+
orientedQuads[2][0] = Model.rotateY(orientedQuads[2][3]);
200+
orientedQuads[2][1] = Model.rotateY(orientedQuads[2][0]);
201+
}
202+
203+
public static boolean intersect(Ray ray, String face, String facing) {
204+
boolean hit = false;
205+
ray.t = Double.POSITIVE_INFINITY;
206+
207+
Quad[] quads = orientedQuads[getFaceIndex(face)][getOrientationIndex(facing)];
208+
for (int i = 0; i < quads.length; ++i) {
209+
Quad quad = quads[i];
210+
if (quad.intersect(ray)) {
211+
float[] color = tex[i].getColor(ray.u, ray.v);
212+
if (color[3] > Ray.EPSILON) {
213+
ray.color.set(color);
214+
ray.t = ray.tNext;
215+
ray.n.set(quad.n);
216+
hit = true;
217+
}
218+
}
219+
}
220+
221+
if (hit) {
222+
ray.distance += ray.t;
223+
ray.o.scaleAdd(ray.t, ray.d);
224+
}
225+
return hit;
226+
}
227+
228+
private static int getFaceIndex(String face) {
229+
switch (face) {
230+
case "floor":
231+
return 0;
232+
case "wall":
233+
return 1;
234+
case "ceiling":
235+
return 2;
236+
default:
237+
return 0;
238+
}
239+
}
240+
241+
private static int getOrientationIndex(String facing) {
242+
switch (facing) {
243+
case "north":
244+
return 0;
245+
case "east":
246+
return 1;
247+
case "south":
248+
return 2;
249+
case "west":
250+
return 3;
251+
default:
252+
return 0;
253+
}
254+
}
255+
}

chunky/src/java/se/llbit/chunky/resources/Texture.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -774,6 +774,9 @@ public class Texture {
774774
public static final Texture stonecutterTop = new Texture();
775775
public static final Texture stonecutterSide = new Texture();
776776
public static final Texture stonecutterSaw = new Texture();
777+
public static final Texture grindstonePivot = new Texture();
778+
public static final Texture grindstoneRound = new Texture();
779+
public static final Texture grindstoneSide = new Texture();
777780

778781
// [1.15]
779782
public static final Texture honeyBlockTop = new Texture();

chunky/src/java/se/llbit/chunky/resources/TexturePackLoader.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3350,6 +3350,10 @@ public class TexturePackLoader {
33503350
addSimpleTexture("assets/minecraft/textures/block/stonecutter_side", Texture.stonecutterSide);
33513351
addSimpleTexture("assets/minecraft/textures/block/stonecutter_saw", Texture.stonecutterSaw);
33523352

3353+
addSimpleTexture("assets/minecraft/textures/block/grindstone_pivot", Texture.grindstonePivot);
3354+
addSimpleTexture("assets/minecraft/textures/block/grindstone_round", Texture.grindstoneRound);
3355+
addSimpleTexture("assets/minecraft/textures/block/grindstone_side", Texture.grindstoneSide);
3356+
33533357
addSimpleTexture("assets/minecraft/textures/block/honey_block_top", Texture.honeyBlockTop);
33543358
addSimpleTexture("assets/minecraft/textures/block/honey_block_side", Texture.honeyBlockSide);
33553359
addSimpleTexture("assets/minecraft/textures/block/honey_block_bottom", Texture.honeyBlockBottom);

0 commit comments

Comments
 (0)