This commit is contained in:
Paul Mathieu
2021-12-28 08:45:31 -08:00
parent d0f1749ef2
commit 19fb285d18
5 changed files with 159 additions and 27 deletions

View File

@@ -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,