From 8939a90307aab9a8fab5a749e3f956cdde26c934 Mon Sep 17 00:00:00 2001 From: Paul Mathieu Date: Mon, 20 Dec 2021 01:25:40 -0800 Subject: [PATCH] Placing blocks. Also better terrain. And still water. Just a few things. --- game.js | 81 +++++++++++++++------- terrain.js | 150 ++++++++++++++++++++++++++++++++++++++++ texture.png | Bin 39953 -> 40386 bytes world.js | 192 ++++++++++++++++++++++++++-------------------------- 4 files changed, 304 insertions(+), 119 deletions(-) create mode 100644 terrain.js diff --git a/game.js b/game.js index 2e78d5a..d2f0474 100644 --- a/game.js +++ b/game.js @@ -1,6 +1,15 @@ import { makeBufferFromFaces } from "./geometry"; import * as se3 from './se3'; -import { checkCollision, destroySelectedBlock, generateMissingChunks, markBlock, updateWorldGeometry } from './world'; +import { + BlockType, + castRay, + checkCollision, + destroyBlock, + generateMissingChunks, + makeBlock, + markBlock, + updateWorldGeometry, +} from './world'; /** Draw. * @@ -116,7 +125,7 @@ function handleKeys(params) { } function getObjects(world, z, x, glContext) { - return world.chunks + const drawedChunks = world.chunks .filter(chunk => { if (chunk.position.z < z - 8 * 16) return false; if (chunk.position.z > z + 7 * 16) return false; @@ -128,13 +137,16 @@ function getObjects(world, z, x, glContext) { } return true; - }) - .map(chunk => ({ - position: [0.0, 0.0, 0.0], - orientation: [0.0, 0.0, 0.0], - geometry: chunk.buffer, - glContext, - })); + }); + const buffers = drawedChunks + .map(chunk => chunk.buffer) + .concat(drawedChunks.map(chunk => chunk.transparentBuffer)); + return buffers.map(buffer => ({ + position: [0.0, 0.0, 0.0], + orientation: [0.0, 0.0, 0.0], + geometry: buffer, + glContext, + })); } function updatePhysics(params) { @@ -180,32 +192,25 @@ function tagABlock(gl, params, objects) { objects.push(obj); } -// Mine & place -// ------------ -// [x] ray casting -// [x] block outline -// [ ] crosshair -// [ ] dynamic terrain re-rendering -// [ ] should use a linked list of air contact blocks -// --> might not be needed. Only need to re-render a single chunk, -// should be fast enough. We render 16 of them every time we -// walk 16 blocks in any direction. - // Stuff I need to do: // [x] a skybox // [x] a movable camera // [x] some kind of gravity // [x] collision detection // [x] more blocks -// [ ] ability to mine & place +// [x] ability to mine & place // [x] generating & loading of more chunks // [x] distance fog +// [x] better controls // [ ] different biomes (with different noise stats) // [ ] non-flowy water // [ ] flowy water -// [ ] ALIGN CHUNK WITH WORLD COORDS -// [x] better controls // [ ] save the world (yay) to local storage (bah) +// [ ] mines +// [ ] crafting +// [ ] fix bugs +// [ ] better light +// [ ] inventory export function setupParamPanel(params) { document.querySelector('#lightx').oninput = e => { @@ -234,6 +239,33 @@ export function setupParamPanel(params) { } } +function viewDirection(params) { + const dir = [0, 0, -1, 1.0]; + const camori = params.camera.orientation; + const ori = se3.inverse(se3.rotxyz(-camori[0], -camori[1], -camori[2])); + return se3.apply(ori, dir).slice(0, 3); +} + +function destroySelectedBlock(params) { + const hit = castRay(params.world, params.camera.position, viewDirection(params), params.blockSelectDistance); + if (hit === undefined || hit.block.type === BlockType.UNDEFINED) { + return; + } + if (hit.block.type === BlockType.WATER) { + return; + } + destroyBlock(params.world, hit.block); +} + +function makeDirBlock(params) { + const hit = castRay(params.world, params.camera.position, viewDirection(params), params.blockSelectDistance); + if (hit === undefined || hit.block.type === BlockType.UNDEFINED) { + return; + } + const newBlockPosition = hit.block.centerPosition.map((v, i) => v + hit.normal[i]); + makeBlock(params.world, newBlockPosition, BlockType.DIRT); +} + export function initUiListeners(params, canvas) { const canvasClickHandler = () => { canvas.requestPointerLock(); @@ -244,6 +276,7 @@ export function initUiListeners(params, canvas) { destroySelectedBlock(params); break; case 2: // right click + makeDirBlock(params); break; } }; @@ -298,7 +331,7 @@ export function tick(time, gl, params) { // frame time is typically 16.7ms, so this may lag a bit let timeLeft = 30; const start = performance.now(); - generateMissingChunks(params.world, campos[2], campos[0], timeLeft); + generateMissingChunks(params.world, campos[2], campos[0], 5); timeLeft -= performance.now() - start; updateWorldGeometry(gl, params.world, campos[2], campos[0], timeLeft); diff --git a/terrain.js b/terrain.js new file mode 100644 index 0000000..5090b54 --- /dev/null +++ b/terrain.js @@ -0,0 +1,150 @@ +const smoothstep = x => x*x*(3 - 2*x); +function interpolate(a, b, x, f = smoothstep) { + const val = a + f(x) * (b - a); + return val; +} +const sigmoid = (a, b, f = smoothstep) => x => { + if (x < a) return 0; + if (x > b) return 1; + return f((x - a) / (b - a)); +}; + +function ghettoPerlinNoise(seed, x, y, gridSize = 16) { + const dot = (vx, vy) => vx[0] * vy[0] + vx[1] * vy[1]; + // super ghetto random + const xorshift = (x) => { + x ^= x << 13; + x ^= x >> 7; + x ^= x << 17; + return x; + }; + + const randGrad = (x0, y0) => { + const rand = xorshift(1337 * x0 + seed + 80085 * y0); + return [Math.sin(rand), Math.cos(rand)]; + }; + + const x0 = Math.floor(x / gridSize); + const y0 = Math.floor(y / gridSize); + const sx = x / gridSize - x0; + const sy = y / gridSize - y0; + + const n0 = dot(randGrad(x0, y0), [sx, sy]); + const n1 = dot(randGrad(x0 + 1, y0), [sx - 1, sy]); + const n2 = dot(randGrad(x0, y0 + 1), [sx, sy - 1]); + const n3 = dot(randGrad(x0 + 1, y0 + 1), [sx - 1, sy - 1]); + + return 1.5 * interpolate(interpolate(n0, n1, sx), interpolate(n2, n3, sx), sy); +} + +function cliffPerlin(seed, x, y) { + const noise1 = ghettoPerlinNoise(seed, x, y); + const noise2 = ghettoPerlinNoise(seed+1, x, y); + + const softerEdge = x => { + if (x < 0.1) return 0.5 - 5 * x; + if (x > 0.8) return 1.0 - 2.5 * (x - 0.8); + return (x - 0.1) / 0.8; + }; + + return interpolate(-1, 1, 0.5 * (1 + Math.atan2(noise1, noise2) / Math.PI), softerEdge); +} + +export function makeTerrain(x, y) { + const seed = 1337; + const lacunarity = 2.1; + const persistence = 0.35; + const noiseMap = (x, y) => cliffPerlin(seed, x / 2, y / 2); + + const fractalNoise = (x, y) => { + let value = 0; + let power = 0.6; + let scale = 0.1; + const noises = [ghettoPerlinNoise, ghettoPerlinNoise, cliffPerlin, cliffPerlin]; + + for (const noiseFun of noises) { + const noise = noiseFun(seed, scale * x, scale * y); + + value += noise * power; + + power *= persistence; + scale *= lacunarity; + } + + return interpolate(-0.2, 0.6, value);//, x=>x*x); // between 0 and 1 + } + + const scaledNoise = (x, y) => noiseMap(x / 1, y / 1); + const outputNoise = fractalNoise; +// const outputNoise = scaledNoise; + + const terrain = new Uint8Array(16 * 16); + for (let i = 0; i < 16; i++) { + for (let j = 0; j < 16; j++) { + terrain[i * 16 + j] = Math.floor(64 + 64 * outputNoise(x + i, y + j)); + } + } + + return terrain; +} + +function colorInterp(x) { + const ocean = [0.0, 0.0, 0.5]; + const grass = [0.2, 0.7, 0.2]; + const mountain = [0.4, 0.3, 0.1]; + const snow = [0.9, 0.9, 0.9]; + + const grassHeight = 75 / 255; + const mountainHeight = 100 / 255; + + const interp = dim => { + return x => { + if (x < grassHeight) { + return interpolate(ocean[dim], grass[dim], x / grassHeight, sigmoid(0.6, 0.95)); + } else if (x < mountainHeight) { + return interpolate(grass[dim], mountain[dim], (x - grassHeight) / (mountainHeight - grassHeight)); + } else { + return interpolate(mountain[dim], snow[dim], (x - mountainHeight) / (1.0 - mountainHeight), sigmoid(0, 0.2)); + } + }; + }; + + return { + r: 255 * interp(0)(x/255), + g: 255 * interp(1)(x/255), + b: 255 * interp(2)(x/255), + }; +} + +function main() { + const canvas = document.querySelector('#canvas'); + const ctx = canvas.getContext('2d'); + ctx.fillStyle = 'gray'; + ctx.fill(); + + for (let i = 0; i < canvas.width; i += 16) { + for (let j = 0; j < canvas.height; j += 16) { + + const imgdat = ctx.createImageData(16, 16); + const dat = imgdat.data; + + const chunk = makeTerrain(i - canvas.width / 2, j - canvas.height / 2); + for (let k = 0; k < 16; k++) { + for (let l = 0; l < 16; l++) { + const offset = 4 * (16 * (15 - l) + k); + const val = chunk[16 * k + l]; + + dat[offset + 0] = colorInterp(val).r; + dat[offset + 1] = colorInterp(val).g; + dat[offset + 2] = colorInterp(val).b; + dat[offset + 3] = 255; + } + + } + ctx.putImageData(imgdat, i, canvas.height - 16 - j); + + } + } +} + +//window.onload = main; diff --git a/texture.png b/texture.png index 72efbd49318104837bcaf7b22898fef306638a09..4795d440575770ed74944c047d70783818519b13 100644 GIT binary patch delta 33422 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 GLSTZBaSlfS delta 33155 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 vx[0] * vy[0] + vx[1] * vy[1]; - // super ghetto random - const xorshift = (x) => { - x ^= x << 13; - x ^= x >> 7; - x ^= x << 17; - return x; - }; - - const randGrad = (x0, y0) => { - const rand = xorshift(1337 * x0 + seed + 80085 * y0); - return [Math.sin(rand), Math.cos(rand)]; - }; - - const interpol = (a, b, x) => a + (x*x*(3 - 2*x)) * (b - a); - - const x0 = Math.floor(x / gridSize); - const y0 = Math.floor(y / gridSize); - const sx = x / gridSize - x0; - const sy = y / gridSize - y0; - - const n0 = dot(randGrad(x0, y0), [sx, sy]); - const n1 = dot(randGrad(x0 + 1, y0), [sx - 1, sy]); - const n2 = dot(randGrad(x0, y0 + 1), [sx, sy - 1]); - const n3 = dot(randGrad(x0 + 1, y0 + 1), [sx - 1, sy - 1]); - - return interpol(interpol(n0, n1, sx), interpol(n2, n3, sx), sy); -} - -function makeTerrain(x, y) { - const seed = 1337; - - const fractalNoise = (x, y) => ( - ghettoPerlinNoise(seed, x, y, 8) * 0.06 - + ghettoPerlinNoise(seed, x, y, 16) * 0.125 - + ghettoPerlinNoise(seed, x, y, 32) * 0.25 - + ghettoPerlinNoise(seed, x, y, 64) * 0.5 - ); - - const terrain = Array(16 * 16); - - for (let i = 0; i < 16; i++) { - for (let j = 0; j < 16; j++) { - terrain[i * 16 + j] = fractalNoise(x + i, y + j); - } - } - - return terrain; -} - function makeChunk(z, x) { const terrain = makeTerrain(z, x); @@ -114,18 +65,23 @@ function makeChunk(z, x) { for (let i = 0; i < 16; i++) { for (let j = 0; j < 16; j++) { - const height = Math.floor(64 + 64 * terrain[i * 16 + j]); + const height = terrain[i * 16 + j]; // everything above is air // that block is grass // everything below is dirt const offset = i * (16 * 256) + j * 256; - const stoneHeight = Math.min(52, height); + const stoneHeight = Math.max(48, height); + const grassHeight = stoneHeight + 8; + const waterHeight = 67; data.set(Array(stoneHeight).fill(BlockType.STONE), offset); - if (stoneHeight < height) { - data.set(Array(height - 1 - stoneHeight).fill(BlockType.DIRT), offset + stoneHeight); - data[offset + height - 1] = BlockType.GRASS; + data.set(Array(grassHeight - 1 - stoneHeight).fill(BlockType.DIRT), offset + stoneHeight); + if (grassHeight < waterHeight) { + data.set(Array(waterHeight - grassHeight + 1).fill(BlockType.WATER), offset + grassHeight - 1); + } else { + data[offset + grassHeight - 1] = BlockType.GRASS; } - data.set(Array(256 - height).fill(BlockType.AIR), offset + height); + const surfaceHeight = Math.max(waterHeight, grassHeight); + data.set(Array(256 - surfaceHeight).fill(BlockType.AIR), offset + surfaceHeight); } } @@ -183,6 +139,7 @@ function faceTexture(type, dir) { } case BlockType.DIRT: return [2, 15]; case BlockType.STONE: return [3, 15]; + case BlockType.WATER: return [4, 15]; default: return [0, 0]; } } @@ -218,7 +175,8 @@ function makeFaceList(data, chunkz, chunkx, blockLookup) { { block: lookup(i, j, k + 1), dir: '+y', faceCenter: [chunkx + j, k + 0.5, chunkz + i] }, ]; - const faces = []; + const solidFaces = []; + const waterFaces = []; for (let i = 0; i < 16; i++) { for (let j = 0; j < 16; j++) { @@ -227,17 +185,31 @@ function makeFaceList(data, chunkz, chunkx, blockLookup) { if (data[bi] === BlockType.AIR) { continue; } - for (const {block, dir, faceCenter} of neighbors(i, j, k).filter(({block}) => block === BlockType.AIR)) { - faces.push({ - blockIndex: bi, - face: makeFace(dir, faceTexture(data[bi], dir), faceCenter), - }); + for (const {dir, faceCenter} of neighbors(i, j, k) + .filter(({ block }) => block === BlockType.AIR || (block === BlockType.WATER && data[bi] !== BlockType.WATER))) { + if (data[bi] !== BlockType.WATER) { + solidFaces.push({ + blockIndex: bi, + dir, + face: makeFace(dir, faceTexture(data[bi], dir), faceCenter), + }); + } else { + faceCenter[1] -= 0.15; + waterFaces.push({ + blockIndex: bi, + dir, + face: makeFace(dir, faceTexture(data[bi], dir), faceCenter), + }) + } } } } } - return faces; + return { + solidFaces, + waterFaces, + }; } // - data <-- need to generate the first time, update when m&p @@ -315,6 +287,7 @@ function invalidateChunkGeometry(world, i, j) { export function createChunkFace(block, dir) { return { + dir, blockIndex: block.blockIndex, face: makeFace(dir, faceTexture(block.type, dir), faceCenter(block.centerPosition, dir)), }; @@ -342,10 +315,13 @@ export function updateWorldGeometry(gl, world, z, x, timeLimit = 10000) { const chunkx = 16 * j; const lookup = (i, j, k) => blockLookup(world, j + chunkx, k, i + chunkz).type; - chunk.faces = makeFaceList(chunk.data, chunk.position.z, chunk.position.x, lookup); + const faces = makeFaceList(chunk.data, chunk.position.z, chunk.position.x, lookup); + chunk.faces = faces.solidFaces; + chunk.transparentFaces = faces.waterFaces; } chunk.buffer = makeBufferFromFaces(gl, chunk.faces.map(f => f.face)); + chunk.transparentBuffer = makeBufferFromFaces(gl, chunk.transparentFaces.map(f => f.face)); // throttle this for fluidity if (performance.now() - start > timeLimit) { @@ -435,7 +411,7 @@ function rayThroughGrid(origin, direction, maxDistance) { return {position, normal, distance: rayLength}; } -function castRay(world, origin, direction, maxDistance) { +export function castRay(world, origin, direction, maxDistance) { let currentPoint = origin; while (maxDistance > 0) { @@ -488,49 +464,33 @@ export function markBlock(world, cameraPosition, direction, maxDistance) { } -function viewDirection(params) { - const dir = [0, 0, -1, 1.0]; - const camori = params.camera.orientation; - const ori = se3.inverse(se3.rotxyz(-camori[0], -camori[1], -camori[2])); - return se3.apply(ori, dir).slice(0, 3); -} - -export function destroySelectedBlock(params) { - const hit = castRay(params.world, params.camera.position, viewDirection(params), params.blockSelectDistance); - if (hit === undefined || hit.block.type === BlockType.UNDEFINED) { - return; - } - +export function destroyBlock(world, block) { const trimFaces = chunk => { chunk.faces = chunk.faces.filter(({blockIndex}) => chunk.data[blockIndex] !== BlockType.AIR); } - hit.block.chunk.data[hit.block.blockIndex] = BlockType.AIR; - if (hit.block.chunk.buffer !== undefined) { - hit.block.chunk.buffer.delete(); - delete hit.block.chunk.buffer; + block.chunk.data[block.blockIndex] = BlockType.AIR; + if (block.chunk.buffer !== undefined) { + block.chunk.buffer.delete(); + delete block.chunk.buffer; } - trimFaces(hit.block.chunk); + trimFaces(block.chunk); - const [bx, by, bz] = hit.block.centerPosition; + const [bx, by, bz] = block.centerPosition; const neighbors = [ - { block: blockLookup(params.world, bx - 1, by, bz), dir: '+x' }, - { block: blockLookup(params.world, bx + 1, by, bz), dir: '-x' }, - { block: blockLookup(params.world, bx, by - 1, bz), dir: '+y' }, - { block: blockLookup(params.world, bx, by + 1, bz), dir: '-y' }, - { block: blockLookup(params.world, bx, by, bz - 1), dir: '+z' }, - { block: blockLookup(params.world, bx, by, bz + 1), dir: '-z' }, + { block: blockLookup(world, bx - 1, by, bz), dir: '+x' }, + { block: blockLookup(world, bx + 1, by, bz), dir: '-x' }, + { block: blockLookup(world, bx, by - 1, bz), dir: '+y' }, + { block: blockLookup(world, bx, by + 1, bz), dir: '-y' }, + { block: blockLookup(world, bx, by, bz - 1), dir: '+z' }, + { block: blockLookup(world, bx, by, bz + 1), dir: '-z' }, ]; neighbors .filter(({ block }) => block.type !== BlockType.AIR && block.type !== BlockType.UNDEFINED) .forEach(({ block, dir }) => { - const blocki = Math.floor(block.blockIndex / (16 * 256)); - const blockj = Math.floor(block.blockIndex / 256) - 16 * blocki; - const blockk = block.blockIndex % 256; - block.chunk.faces.push(createChunkFace(block, dir)); trimFaces(block.chunk); @@ -541,6 +501,48 @@ export function destroySelectedBlock(params) { }); } +export function makeBlock(world, position, type) { + const block = blockLookup(world, ...position); + console.assert(block.type === BlockType.AIR); + + block.chunk.data[block.blockIndex] = type; + block.type = type; + + const [bx, by, bz] = block.centerPosition; + + const neighbors = [ + { block: blockLookup(world, bx - 1, by, bz), dir: '-x', ndir: '+x' }, + { block: blockLookup(world, bx + 1, by, bz), dir: '+x', ndir: '-x' }, + { block: blockLookup(world, bx, by - 1, bz), dir: '-y', ndir: '+y' }, + { block: blockLookup(world, bx, by + 1, bz), dir: '+y', ndir: '-y' }, + { block: blockLookup(world, bx, by, bz - 1), dir: '-z', ndir: '+z' }, + { block: blockLookup(world, bx, by, bz + 1), dir: '+z', ndir: '-z' }, + ]; + + const refresh = chunk => { + if (chunk.buffer !== undefined) { + chunk.buffer.delete(); + delete chunk.buffer; + } + } + + neighbors + .filter(({ block }) => block.type !== BlockType.UNDEFINED) + .forEach(({ block: nblock, dir, ndir }) => { + if (nblock.type === BlockType.AIR) { + block.chunk.faces.push(createChunkFace(block, dir)); + } else { + nblock.chunk.faces = nblock.chunk.faces.filter(f => ( + f.blockIndex !== nblock.blockIndex || + f.dir !== ndir + )); + refresh(nblock.chunk); + } + }); + + refresh(block.chunk); +} + export async function initWorldGl(gl) { const program = makeProgram(gl, VSHADER, FSHADER); const texture = await loadTexture(gl, 'texture.png');