import {createCanvas, drawRect, clipCanvas, drawCircle} from './gfx.js'; import {coords2index, random, randomInt, clamp} from './math.js'; import {sample} from './utils.js'; let cachedImageData; function cacheImageData(ctx) { const {width, height} = ctx.canvas; cachedImageData = ctx.getImageData(0, 0, width, height); } export function createTerrain(width, height) { const terrain = createCanvas(width, height); const generateTerrain = sample(Object.values(TERRAIN_TYPES)); generateTerrain(terrain); return terrain; } const TERRAIN_TYPES = { mountain(ctx) { ctx.color = sample(['palegreen', 'white']); // FIXME const {width, height} = ctx.canvas; const stepCount = 8; const stepSize = width / stepCount; let cy = random(.3, .7) * height; let dy = 0; for (let x=0; x 0) land++; } ctx.clearRect(0+x, 0, 1, height); drawRect(ctx, 0+x, height-land, 1, land, ctx.color); } cacheImageData(ctx); } export function isTerrain(ctx, x, y) { const index = coords2index(ctx.canvas.width, x, y) * 4; return cachedImageData.data[index+3] > 0; } export function closestLand(ctx, x, y) { const {width, height} = ctx.canvas; for (let i=y; i=0; i--) { const index = coords2index(width, x, i) * 4; if (cachedImageData.data[index+3] === 0) return i; } } export function clipTerrain(ctx, fn) { clipCanvas(ctx, fn); cacheImageData(ctx); }