Skip to content

Commit 3f13458

Browse files
committed
split chunkMesher
1 parent 98d6605 commit 3f13458

File tree

3 files changed

+361
-358
lines changed

3 files changed

+361
-358
lines changed

src/scripts/Setup.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ async function Setup (game) {
5959
game.distanceBasedFog.addShaderToMaterial(game.ent.objectMaterial)
6060
const gui = new dat.GUI()
6161
game.params = {
62-
chunkdist: 3
62+
chunkdist: 4
6363
}
6464
game.distanceBasedFog.farnear.x = (game.params.chunkdist - 2) * 16
6565
game.distanceBasedFog.farnear.y = (game.params.chunkdist - 1) * 16

src/scripts/world/ChunkMesher.js

Lines changed: 8 additions & 357 deletions
Original file line numberDiff line numberDiff line change
@@ -1,353 +1,4 @@
1-
const CustomRender = {
2-
water: function (tVertexBuffer, VertexBuffer, pos) {
3-
const block = this.chunkTerrain.getBlock(pos[0], pos[1], pos[2])
4-
const state = block.stateId
5-
6-
// const falling = !!(state & 8);
7-
const level = state - 32
8-
if (level === 10) {
9-
for (const l in this.neighbours) {
10-
const offset = this.neighbours[l]
11-
if (
12-
this.chunkTerrain.getBlock(
13-
pos[0] + offset[0],
14-
pos[1] + offset[1],
15-
pos[2] + offset[2]
16-
).name !== 'water'
17-
) { this.addFace(tVertexBuffer, VertexBuffer, l, pos) }
18-
}
19-
} else {
20-
for (const side in this.neighbours) {
21-
const offset = this.neighbours[side]
22-
if (
23-
this.chunkTerrain.getBlock(
24-
pos[0] + offset[0],
25-
pos[1] + offset[1],
26-
pos[2] + offset[2]
27-
).name === 'water'
28-
) { continue }
29-
const faceVertex = this.genBlockFace(side, block, pos)
30-
const waterLevels = []
31-
for (let x = -1; x <= 1; x++) {
32-
for (let z = -1; z <= 1; z++) {
33-
const block = this.chunkTerrain.getBlock(
34-
pos[0] + x,
35-
pos[1],
36-
pos[2] + z
37-
)
38-
if (block.name === 'water') {
39-
if (block.stateId - 32 === 10) waterLevels.push(0)
40-
else waterLevels.push((block.stateId - 33) / 10)
41-
} else if (block.boundingBox === 'block') { waterLevels.push(10) } else waterLevels.push(1)
42-
}
43-
}
44-
const waterLevelAverages = [
45-
Math.min(
46-
waterLevels[0],
47-
waterLevels[1],
48-
waterLevels[3],
49-
waterLevels[4]
50-
),
51-
Math.min(
52-
waterLevels[1],
53-
waterLevels[2],
54-
waterLevels[4],
55-
waterLevels[5]
56-
),
57-
Math.min(
58-
waterLevels[4],
59-
waterLevels[5],
60-
waterLevels[7],
61-
waterLevels[8]
62-
),
63-
Math.min(
64-
waterLevels[3],
65-
waterLevels[4],
66-
waterLevels[6],
67-
waterLevels[7]
68-
)
69-
]
70-
71-
switch (side) {
72-
case 'py':
73-
faceVertex.pos[3 * 0 + 1] -= waterLevelAverages[3]
74-
faceVertex.pos[3 * 1 + 1] -= waterLevelAverages[0]
75-
faceVertex.pos[3 * 2 + 1] -= waterLevelAverages[2]
76-
faceVertex.pos[3 * 3 + 1] -= waterLevelAverages[2]
77-
faceVertex.pos[3 * 4 + 1] -= waterLevelAverages[0]
78-
faceVertex.pos[3 * 5 + 1] -= waterLevelAverages[1]
79-
break
80-
case 'nx':
81-
faceVertex.pos[3 * 2 + 1] -= waterLevelAverages[2]
82-
faceVertex.pos[3 * 3 + 1] -= waterLevelAverages[2]
83-
faceVertex.pos[3 * 5 + 1] -= waterLevelAverages[3]
84-
break
85-
case 'px':
86-
faceVertex.pos[3 * 2 + 1] -= waterLevelAverages[0]
87-
faceVertex.pos[3 * 3 + 1] -= waterLevelAverages[0]
88-
faceVertex.pos[3 * 5 + 1] -= waterLevelAverages[1]
89-
break
90-
case 'nz':
91-
faceVertex.pos[3 * 2 + 1] -= waterLevelAverages[3]
92-
faceVertex.pos[3 * 3 + 1] -= waterLevelAverages[3]
93-
faceVertex.pos[3 * 5 + 1] -= waterLevelAverages[0]
94-
break
95-
case 'pz':
96-
faceVertex.pos[3 * 2 + 1] -= waterLevelAverages[1]
97-
faceVertex.pos[3 * 3 + 1] -= waterLevelAverages[1]
98-
faceVertex.pos[3 * 5 + 1] -= waterLevelAverages[2]
99-
100-
break
101-
}
102-
this.ambientOcclusion(block, pos, faceVertex, side)
103-
this.push(
104-
tVertexBuffer,
105-
VertexBuffer,
106-
faceVertex,
107-
this.chunkTerrain.getBlock(...pos).transparent
108-
)
109-
}
110-
}
111-
},
112-
grass: function (tVertexBuffer, VertexBuffer, pos) {
113-
const uv = this.getUV('grass')
114-
// prettier-ignore
115-
const faceVertex = {
116-
pos: [
117-
-0.4 + pos[0], -0.5 + pos[1], 0.4 + pos[2],
118-
0.4 + pos[0], -0.5 + pos[1], -0.4 + pos[2],
119-
-0.4 + pos[0], 0.4 + pos[1], 0.4 + pos[2],
120-
-0.4 + pos[0], 0.4 + pos[1], 0.4 + pos[2],
121-
0.4 + pos[0], -0.5 + pos[1], -0.4 + pos[2],
122-
0.4 + pos[0], 0.4 + pos[1], -0.4 + pos[2],
123-
124-
-0.4 + pos[0], -0.5 + pos[1], -0.4 + pos[2],
125-
0.4 + pos[0], -0.5 + pos[1], 0.4 + pos[2],
126-
-0.4 + pos[0], 0.4 + pos[1], -0.4 + pos[2],
127-
-0.4 + pos[0], 0.4 + pos[1], -0.4 + pos[2],
128-
0.4 + pos[0], -0.5 + pos[1], 0.4 + pos[2],
129-
0.4 + pos[0], 0.4 + pos[1], 0.4 + pos[2],
130-
131-
0.4 + pos[0], -0.5 + pos[1], -0.4 + pos[2],
132-
-0.4 + pos[0], -0.5 + pos[1], 0.4 + pos[2],
133-
-0.4 + pos[0], 0.4 + pos[1], 0.4 + pos[2],
134-
135-
0.4 + pos[0], -0.5 + pos[1], -0.4 + pos[2],
136-
-0.4 + pos[0], 0.4 + pos[1], 0.4 + pos[2],
137-
0.4 + pos[0], 0.4 + pos[1], -0.4 + pos[2],
138-
139-
0.4 + pos[0], -0.5 + pos[1], 0.4 + pos[2],
140-
-0.4 + pos[0], -0.5 + pos[1], -0.4 + pos[2],
141-
-0.4 + pos[0], 0.4 + pos[1], -0.4 + pos[2],
142-
143-
0.4 + pos[0], -0.5 + pos[1], 0.4 + pos[2],
144-
-0.4 + pos[0], 0.4 + pos[1], -0.4 + pos[2],
145-
0.4 + pos[0], 0.4 + pos[1], 0.4 + pos[2]
146-
],
147-
norm: [
148-
0, 0, 1,
149-
0, 0, 1,
150-
0, 0, 1,
151-
0, 0, 1,
152-
0, 0, 1,
153-
0, 0, 1,
154-
0, 0, 1,
155-
0, 0, 1,
156-
0, 0, 1,
157-
0, 0, 1,
158-
0, 0, 1,
159-
0, 0, 1,
160-
161-
0, 0, 1,
162-
0, 0, 1,
163-
0, 0, 1,
164-
0, 0, 1,
165-
0, 0, 1,
166-
0, 0, 1,
167-
0, 0, 1,
168-
0, 0, 1,
169-
0, 0, 1,
170-
0, 0, 1,
171-
0, 0, 1,
172-
0, 0, 1
173-
],
174-
uv: [
175-
...uv[0],
176-
...uv[2],
177-
...uv[1],
178-
179-
...uv[1],
180-
...uv[2],
181-
...uv[3],
182-
183-
...uv[0],
184-
...uv[2],
185-
...uv[1],
186-
187-
...uv[1],
188-
...uv[2],
189-
...uv[3],
190-
191-
...uv[2],
192-
...uv[0],
193-
...uv[1],
194-
195-
...uv[2],
196-
...uv[1],
197-
...uv[3],
198-
199-
...uv[2],
200-
...uv[0],
201-
...uv[1],
202-
203-
...uv[2],
204-
...uv[1],
205-
...uv[3]
206-
],
207-
color: [
208-
0.1, 1, 0.1,
209-
0.1, 1, 0.1,
210-
0.1, 1, 0.1,
211-
0.1, 1, 0.1,
212-
0.1, 1, 0.1,
213-
0.1, 1, 0.1,
214-
0.1, 1, 0.1,
215-
0.1, 1, 0.1,
216-
0.1, 1, 0.1,
217-
0.1, 1, 0.1,
218-
0.1, 1, 0.1,
219-
0.1, 1, 0.1,
220-
0.1, 1, 0.1,
221-
0.1, 1, 0.1,
222-
0.1, 1, 0.1,
223-
0.1, 1, 0.1,
224-
0.1, 1, 0.1,
225-
0.1, 1, 0.1,
226-
0.1, 1, 0.1,
227-
0.1, 1, 0.1,
228-
0.1, 1, 0.1,
229-
0.1, 1, 0.1,
230-
0.1, 1, 0.1,
231-
0.1, 1, 0.1
232-
]
233-
}
234-
235-
this.push(tVertexBuffer, VertexBuffer, faceVertex, true)
236-
},
237-
lava: function (tVertexBuffer, VertexBuffer, pos) {
238-
const block = this.chunkTerrain.getBlock(pos[0], pos[1], pos[2])
239-
const state = block.stateId
240-
241-
// const falling = !!(state & 8);
242-
const level = (state & 0b001110) - 1
243-
if (level === 9) {
244-
for (const l in this.neighbours) {
245-
const offset = this.neighbours[l]
246-
if (
247-
this.chunkTerrain.getBlock(
248-
pos[0] + offset[0],
249-
pos[1] + offset[1],
250-
pos[2] + offset[2]
251-
).name !== 'lava'
252-
) { this.addFace(tVertexBuffer, VertexBuffer, l, pos) }
253-
}
254-
} else {
255-
for (const side in this.neighbours) {
256-
const offset = this.neighbours[side]
257-
if (
258-
this.chunkTerrain.getBlock(
259-
pos[0] + offset[0],
260-
pos[1] + offset[1],
261-
pos[2] + offset[2]
262-
).name === 'lava'
263-
) { continue }
264-
const faceVertex = this.genBlockFace(side, block, pos)
265-
const waterLevels = []
266-
for (let x = -1; x <= 1; x++) {
267-
for (let z = -1; z <= 1; z++) {
268-
const block = this.chunkTerrain.getBlock(
269-
pos[0] + x,
270-
pos[1],
271-
pos[2] + z
272-
)
273-
if (block.name === 'lava') {
274-
if ((block.stateId & 0b001110) - 1 === 10) { waterLevels.push(0) } else {
275-
waterLevels.push(
276-
((block.stateId & 0b001110) - 1) / 10
277-
)
278-
}
279-
} else if (block.boundingBox === 'block') { waterLevels.push(10) } else waterLevels.push(1)
280-
}
281-
}
282-
const waterLevelAverages = [
283-
Math.min(
284-
waterLevels[0],
285-
waterLevels[1],
286-
waterLevels[3],
287-
waterLevels[4]
288-
),
289-
Math.min(
290-
waterLevels[1],
291-
waterLevels[2],
292-
waterLevels[4],
293-
waterLevels[5]
294-
),
295-
Math.min(
296-
waterLevels[4],
297-
waterLevels[5],
298-
waterLevels[7],
299-
waterLevels[8]
300-
),
301-
Math.min(
302-
waterLevels[3],
303-
waterLevels[4],
304-
waterLevels[6],
305-
waterLevels[7]
306-
)
307-
]
308-
309-
switch (side) {
310-
case 'py':
311-
faceVertex.pos[3 * 0 + 1] -= waterLevelAverages[3]
312-
faceVertex.pos[3 * 1 + 1] -= waterLevelAverages[0]
313-
faceVertex.pos[3 * 2 + 1] -= waterLevelAverages[2]
314-
faceVertex.pos[3 * 3 + 1] -= waterLevelAverages[2]
315-
faceVertex.pos[3 * 4 + 1] -= waterLevelAverages[0]
316-
faceVertex.pos[3 * 5 + 1] -= waterLevelAverages[1]
317-
break
318-
case 'nx':
319-
faceVertex.pos[3 * 2 + 1] -= waterLevelAverages[2]
320-
faceVertex.pos[3 * 3 + 1] -= waterLevelAverages[2]
321-
faceVertex.pos[3 * 5 + 1] -= waterLevelAverages[3]
322-
break
323-
case 'px':
324-
faceVertex.pos[3 * 2 + 1] -= waterLevelAverages[0]
325-
faceVertex.pos[3 * 3 + 1] -= waterLevelAverages[0]
326-
faceVertex.pos[3 * 5 + 1] -= waterLevelAverages[1]
327-
break
328-
case 'nz':
329-
faceVertex.pos[3 * 2 + 1] -= waterLevelAverages[3]
330-
faceVertex.pos[3 * 3 + 1] -= waterLevelAverages[3]
331-
faceVertex.pos[3 * 5 + 1] -= waterLevelAverages[0]
332-
break
333-
case 'pz':
334-
faceVertex.pos[3 * 2 + 1] -= waterLevelAverages[1]
335-
faceVertex.pos[3 * 3 + 1] -= waterLevelAverages[1]
336-
faceVertex.pos[3 * 5 + 1] -= waterLevelAverages[2]
337-
338-
break
339-
}
340-
this.ambientOcclusion(block, pos, faceVertex, side)
341-
this.push(
342-
tVertexBuffer,
343-
VertexBuffer,
344-
faceVertex,
345-
this.chunkTerrain.getBlock(...pos).transparent
346-
)
347-
}
348-
}
349-
}
350-
}
1+
import { CustomRender } from './CustomRender.js'
3512

3523
class ChunkMesher {
3534
constructor (options) {
@@ -636,13 +287,13 @@ class ChunkMesher {
636287
for (let y = -1; y <= 1; y++) {
637288
for (let z = -1; z <= 1; z++) {
638289
loaded[`${x}:${y}:${z}`] =
639-
this.chunkTerrain.getBlock(
640-
pos[0] + x,
641-
pos[1] + y,
642-
pos[2] + z
643-
).boundingBox === 'block'
644-
? 1
645-
: 0
290+
this.chunkTerrain.getBlock(
291+
pos[0] + x,
292+
pos[1] + y,
293+
pos[2] + z
294+
).boundingBox === 'block'
295+
? 1
296+
: 0
646297
}
647298
}
648299
}

0 commit comments

Comments
 (0)