Caves!!
This commit is contained in:
52
world.js
52
world.js
@@ -1,7 +1,7 @@
|
||||
import { makeBufferFromFaces, makeFace } from "./geometry";
|
||||
import { loadTexture, makeProgram } from "./gl";
|
||||
import * as se3 from './se3';
|
||||
import { makeTerrain, random } from "./terrain";
|
||||
import { checkCave, makeTerrain, random } from "./terrain";
|
||||
|
||||
const VSHADER = `
|
||||
attribute vec3 aPosition;
|
||||
@@ -132,6 +132,54 @@ function makeChunk(z, x) {
|
||||
makeATree(data, tree, seed, z, x);
|
||||
}
|
||||
|
||||
// caves
|
||||
// [ ] 3d perlin noise up to 64
|
||||
// [ ] sample 4x4x4 to check for caves
|
||||
// [ ] fill with air where appropriate
|
||||
|
||||
function propagateCave(i, j, k) {
|
||||
const neighbors = (i, j, k) => [
|
||||
[i - 1, j, k],
|
||||
[i + 1, j, k],
|
||||
[i, j - 1, k],
|
||||
[i, j + 1, k],
|
||||
[i, j, k - 1],
|
||||
[i, j, k + 1],
|
||||
];
|
||||
|
||||
const queue = neighbors(i, j, k);
|
||||
|
||||
while (queue.length > 0) {
|
||||
const [ni, nj, nk] = queue.pop();
|
||||
if (ni < 0 || ni > 15 || nj < 0 || nj > 15 || nk < 0 || nk > 255) {
|
||||
continue;
|
||||
}
|
||||
const bi = 256 * (16 * ni + nj) + nk;
|
||||
if (data[bi] === BlockType.AIR || data[bi] === BlockType.WATER) {
|
||||
continue;
|
||||
}
|
||||
if (checkCave(seed, x + nj, nk, z + ni)) {
|
||||
data[bi] = BlockType.AIR;
|
||||
queue.push(...neighbors(ni, nj, nk));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
for (let i = 0; i < 16; i += 4) {
|
||||
for (let j = 0; j < 16; j += 4) {
|
||||
let bi = 256 * (16 * i + j);
|
||||
for (let k = 0; k < 58; k += 4, bi += 4) {
|
||||
if (data[bi] === BlockType.AIR) {
|
||||
continue;
|
||||
}
|
||||
if (checkCave(seed, x + j, k, z + i)) {
|
||||
data[bi] = BlockType.AIR;
|
||||
propagateCave(i, j, k);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return {
|
||||
position: {z, x},
|
||||
data,
|
||||
@@ -302,7 +350,7 @@ function makeFaces(chunk, blocks, neighbors) {
|
||||
.filter(({ block }) => isTransparent(block) && block !== BlockType.WATER)
|
||||
) {
|
||||
if (chunk.data[bi] === BlockType.WATER) {
|
||||
faceCenter[1] -= 0.15;
|
||||
faceCenter[1] -= 0.15; // TODO: lower face should be normal
|
||||
}
|
||||
chunk.transparentFaces.push({
|
||||
dir,
|
||||
|
||||
Reference in New Issue
Block a user