diff --git a/modules/river-generator.js b/modules/river-generator.js index 1c67b594..8b440309 100644 --- a/modules/river-generator.js +++ b/modules/river-generator.js @@ -8,6 +8,7 @@ console.time('generateRivers'); Math.seedrandom(seed); const cells = pack.cells, p = cells.p, features = pack.features; + resolveDepressions(); features.forEach(f => {delete f.river; delete f.flux;}); const riversData = []; // rivers data @@ -18,7 +19,7 @@ void function drainWater() { const land = cells.i.filter(isLand).sort(highest); - + land.forEach(function(i) { cells.fl[i] += grid.cells.prec[cells.g[i]]; // flux from precipitation const x = p[i][0], y = p[i][1]; @@ -110,6 +111,27 @@ console.timeEnd('generateRivers'); } + // depression filling algorithm (for a correct water flux modeling) + function resolveDepressions() { + console.time('resolveDepressions'); + const cells = pack.cells; + const land = cells.i.filter(i => cells.h[i] >= 20 && cells.h[i] < 95 && !cells.b[i]); // exclude near-border cells + land.sort(highest); // highest cells go first + + for (let l = 0, depression = Infinity; depression > 1 && l < 100; l++) { + depression = 0; + for (const i of land) { + const minHeight = d3.min(cells.c[i].map(c => cells.h[c])); + if (minHeight === 100) continue; // already max height + if (cells.h[i] <= minHeight) {cells.h[i] = minHeight + 1; depression++;} + } + } + + console.timeEnd('resolveDepressions'); + //const depressed = cells.i.filter(i => cells.h[i] >= 20 && cells.h[i] < 95 && !cells.b[i] && cells.h[i] <= d3.min(cells.c[i].map(c => cells.h[c]))); + //debug.selectAll(".deps").data(depressed).enter().append("circle").attr("r", 0.8).attr("cx", d => cells.p[d][0]).attr("cy", d => cells.p[d][1]); + } + // add more river points on 1/3 and 2/3 of length const addMeandring = function(segments, rndFactor = 0.3) { const riverEnhanced = []; // to store enhanced segments diff --git a/modules/ui/heightmap-editor.js b/modules/ui/heightmap-editor.js index 9259a016..cf436ee7 100644 --- a/modules/ui/heightmap-editor.js +++ b/modules/ui/heightmap-editor.js @@ -143,9 +143,8 @@ function editHeightmap() { drawCoastline(); elevateLakes(); - resolveDepressions(); Rivers.generate(); - + if (!change) { for (const i of pack.cells.i) { const g = pack.cells.g[i]; @@ -219,7 +218,6 @@ function editHeightmap() { if (change) { elevateLakes(); - resolveDepressions(); Rivers.generate(); defineBiomes(); } diff --git a/modules/ui/tools.js b/modules/ui/tools.js index a4d00c40..b5494829 100644 --- a/modules/ui/tools.js +++ b/modules/ui/tools.js @@ -19,7 +19,12 @@ toolsContent.addEventListener("click", function(event) { if (button === "regenerateStateLabels") {BurgsAndStates.drawStateLabels(); if (!layerIsOn("toggleLabels")) toggleLabels();} else if (button === "regenerateReliefIcons") {ReliefIcons(); if (!layerIsOn("toggleRelief")) toggleRelief();} else if (button === "regenerateRoutes") {Routes.regenerate(); if (!layerIsOn("toggleRoutes")) toggleRoutes();} else - if (button === "regenerateRivers") {Rivers.generate(); if (!layerIsOn("toggleRivers")) toggleRivers();} else + if (button === "regenerateRivers") { + const heights = new Uint8Array(pack.cells.h); + Rivers.generate(); + pack.cells.h = new Uint8Array(heights); + if (!layerIsOn("toggleRivers")) toggleRivers(); + } else if (button === "regeneratePopulation") recalculatePopulation(); // Click to Add buttons diff --git a/modules/ui/world-configurator.js b/modules/ui/world-configurator.js index 2030ce06..d9195b56 100644 --- a/modules/ui/world-configurator.js +++ b/modules/ui/world-configurator.js @@ -32,7 +32,9 @@ function editWorld() { calculateTemperatures(); generatePrecipitation(); elevateLakes(); + const heights = new Uint8Array(pack.cells.h); Rivers.generate(); + pack.cells.h = new Uint8Array(heights); defineBiomes(); if (layerIsOn("toggleTemp")) drawTemp();