From dc10a0b6cbf02c18c489af34d06c2f871d41a1a1 Mon Sep 17 00:00:00 2001 From: Azgaar Date: Thu, 29 Jul 2021 23:50:01 +0300 Subject: [PATCH 1/4] refactor heightmap generator - separate templates to file --- index.html | 24 +-- modules/heightmap-generator.js | 277 +++++---------------------------- modules/heightmap-templates.js | 126 +++++++++++++++ modules/ui/heightmap-editor.js | 1 - modules/ui/options.js | 23 +-- 5 files changed, 190 insertions(+), 261 deletions(-) create mode 100644 modules/heightmap-templates.js diff --git a/index.html b/index.html index 0900d23d..98bcf1c8 100644 --- a/index.html +++ b/index.html @@ -1000,17 +1000,18 @@ Map template @@ -4187,6 +4188,7 @@ + diff --git a/modules/heightmap-generator.js b/modules/heightmap-generator.js index ab2f51a0..b3e1e684 100644 --- a/modules/heightmap-generator.js +++ b/modules/heightmap-generator.js @@ -1,8 +1,8 @@ +"use strict"; + (function (global, factory) { typeof exports === "object" && typeof module !== "undefined" ? (module.exports = factory()) : typeof define === "function" && define.amd ? define(factory) : (global.HeightmapGenerator = factory()); })(this, function () { - "use strict"; - let cells, p; const generate = function () { @@ -12,46 +12,20 @@ cells.h = new Uint8Array(grid.points.length); const template = document.getElementById("templateInput").value; - switch (template) { - case "Volcano": - templateVolcano(); - break; - case "High Island": - templateHighIsland(); - break; - case "Low Island": - templateLowIsland(); - break; - case "Continents": - templateContinents(); - break; - case "Archipelago": - templateArchipelago(); - break; - case "Atoll": - templateAtoll(); - break; - case "Mediterranean": - templateMediterranean(); - break; - case "Peninsula": - templatePeninsula(); - break; - case "Pangea": - templatePangea(); - break; - case "Isthmus": - templateIsthmus(); - break; - case "Shattered": - templateShattered(); - break; + const templateString = HeightmapTemplates[template]; + const steps = templateString.split("\n"); + + if (!steps.length) throw new Error(`Heightmap template: no steps. Template: ${template}. Steps: ${steps}`); + + for (const step of steps) { + const elements = step.trim().split(" "); + if (elements.length < 2) throw new Error(`Heightmap template: steps < 2. Template: ${template}. Step: ${elements}`); + addStep(...elements); } TIME && console.timeEnd("generateHeightmap"); }; - // parse template step function addStep(a1, a2, a3, a4, a5) { if (a1 === "Hill") return addHill(a2, a3, a4, a5); if (a1 === "Pit") return addPit(a2, a3, a4, a5); @@ -63,211 +37,38 @@ if (a1 === "Smooth") return smooth(a2); } - // Heighmap Template: Volcano - function templateVolcano() { - addStep("Hill", "1", "90-100", "44-56", "40-60"); - addStep("Multiply", 0.8, "50-100"); - addStep("Range", "1.5", "30-55", "45-55", "40-60"); - addStep("Smooth", 2); - addStep("Hill", "1.5", "25-35", "25-30", "20-75"); - addStep("Hill", "1", "25-35", "75-80", "25-75"); - addStep("Hill", "0.5", "20-25", "10-15", "20-25"); - } - - // Heighmap Template: High Island - function templateHighIsland() { - addStep("Hill", "1", "90-100", "65-75", "47-53"); - addStep("Add", 5, "all"); - addStep("Hill", "6", "20-23", "25-55", "45-55"); - addStep("Range", "1", "40-50", "45-55", "45-55"); - addStep("Smooth", 2); - addStep("Trough", "2-3", "20-30", "20-30", "20-30"); - addStep("Trough", "2-3", "20-30", "60-80", "70-80"); - addStep("Hill", "1", "10-15", "60-60", "50-50"); - addStep("Hill", "1.5", "13-16", "15-20", "20-75"); - addStep("Multiply", 0.8, "20-100"); - addStep("Range", "1.5", "30-40", "15-85", "30-40"); - addStep("Range", "1.5", "30-40", "15-85", "60-70"); - addStep("Pit", "2-3", "10-15", "15-85", "20-80"); - } - - // Heighmap Template: Low Island - function templateLowIsland() { - addStep("Hill", "1", "90-99", "60-80", "45-55"); - addStep("Hill", "4-5", "25-35", "20-65", "40-60"); - addStep("Range", "1", "40-50", "45-55", "45-55"); - addStep("Smooth", 3); - addStep("Trough", "1.5", "20-30", "15-85", "20-30"); - addStep("Trough", "1.5", "20-30", "15-85", "70-80"); - addStep("Hill", "1.5", "10-15", "5-15", "20-80"); - addStep("Hill", "1", "10-15", "85-95", "70-80"); - addStep("Pit", "3-5", "10-15", "15-85", "20-80"); - addStep("Multiply", 0.4, "20-100"); - } - - // Heighmap Template: Continents - function templateContinents() { - addStep("Hill", "1", "80-85", "75-80", "40-60"); - addStep("Hill", "1", "80-85", "20-25", "40-60"); - addStep("Multiply", 0.22, "20-100"); - addStep("Hill", "5-6", "15-20", "25-75", "20-82"); - addStep("Range", ".8", "30-60", "5-15", "20-45"); - addStep("Range", ".8", "30-60", "5-15", "55-80"); - addStep("Range", "0-3", "30-60", "80-90", "20-80"); - addStep("Trough", "3-4", "15-20", "15-85", "20-80"); - addStep("Strait", "2", "vertical"); - addStep("Smooth", 2); - addStep("Trough", "1-2", "5-10", "45-55", "45-55"); - addStep("Pit", "3-4", "10-15", "15-85", "20-80"); - addStep("Hill", "1", "5-10", "40-60", "40-60"); - } - - // Heighmap Template: Archipelago - function templateArchipelago() { - addStep("Add", 11, "all"); - addStep("Range", "2-3", "40-60", "20-80", "20-80"); - addStep("Hill", "5", "15-20", "10-90", "30-70"); - addStep("Hill", "2", "10-15", "10-30", "20-80"); - addStep("Hill", "2", "10-15", "60-90", "20-80"); - addStep("Smooth", 3); - addStep("Trough", "10", "20-30", "5-95", "5-95"); - addStep("Strait", "2", "vertical"); - addStep("Strait", "2", "horizontal"); - } - - // Heighmap Template: Atoll - function templateAtoll() { - addStep("Hill", "1", "75-80", "50-60", "45-55"); - addStep("Hill", "1.5", "30-50", "25-75", "30-70"); - addStep("Hill", ".5", "30-50", "25-35", "30-70"); - addStep("Smooth", 1); - addStep("Multiply", 0.2, "25-100"); - addStep("Hill", ".5", "10-20", "50-55", "48-52"); - } - - // Heighmap Template: Mediterranean - function templateMediterranean() { - addStep("Range", "3-4", "30-50", "0-100", "0-10"); - addStep("Range", "3-4", "30-50", "0-100", "90-100"); - addStep("Hill", "5-6", "30-70", "0-100", "0-5"); - addStep("Hill", "5-6", "30-70", "0-100", "95-100"); - addStep("Smooth", 1); - addStep("Hill", "2-3", "30-70", "0-5", "20-80"); - addStep("Hill", "2-3", "30-70", "95-100", "20-80"); - addStep("Multiply", 0.8, "land"); - addStep("Trough", "3-5", "40-50", "0-100", "0-10"); - addStep("Trough", "3-5", "40-50", "0-100", "90-100"); - } - - // Heighmap Template: Peninsula - function templatePeninsula() { - addStep("Range", "2-3", "20-35", "40-50", "0-15"); - addStep("Add", 5, "all"); - addStep("Hill", "1", "90-100", "10-90", "0-5"); - addStep("Add", 13, "all"); - addStep("Hill", "3-4", "3-5", "5-95", "80-100"); - addStep("Hill", "1-2", "3-5", "5-95", "40-60"); - addStep("Trough", "5-6", "10-25", "5-95", "5-95"); - addStep("Smooth", 3); - } - - // Heighmap Template: Pangea - function templatePangea() { - addStep("Hill", "1-2", "25-40", "15-50", "0-10"); - addStep("Hill", "1-2", "5-40", "50-85", "0-10"); - addStep("Hill", "1-2", "25-40", "50-85", "90-100"); - addStep("Hill", "1-2", "5-40", "15-50", "90-100"); - addStep("Hill", "8-12", "20-40", "20-80", "48-52"); - addStep("Smooth", 2); - addStep("Multiply", 0.7, "land"); - addStep("Trough", "3-4", "25-35", "5-95", "10-20"); - addStep("Trough", "3-4", "25-35", "5-95", "80-90"); - addStep("Range", "5-6", "30-40", "10-90", "35-65"); - } - - // Heighmap Template: Isthmus - function templateIsthmus() { - addStep("Hill", "5-10", "15-30", "0-30", "0-20"); - addStep("Hill", "5-10", "15-30", "10-50", "20-40"); - addStep("Hill", "5-10", "15-30", "30-70", "40-60"); - addStep("Hill", "5-10", "15-30", "50-90", "60-80"); - addStep("Hill", "5-10", "15-30", "70-100", "80-100"); - addStep("Smooth", 2); - addStep("Trough", "4-8", "15-30", "0-30", "0-20"); - addStep("Trough", "4-8", "15-30", "10-50", "20-40"); - addStep("Trough", "4-8", "15-30", "30-70", "40-60"); - addStep("Trough", "4-8", "15-30", "50-90", "60-80"); - addStep("Trough", "4-8", "15-30", "70-100", "80-100"); - } - - // Heighmap Template: Shattered - function templateShattered() { - addStep("Hill", "8", "35-40", "15-85", "30-70"); - addStep("Trough", "10-20", "40-50", "5-95", "5-95"); - addStep("Range", "5-7", "30-40", "10-90", "20-80"); - addStep("Pit", "12-20", "30-40", "15-85", "20-80"); - } - function getBlobPower() { - switch (+pointsInput.dataset.cells) { - case 1000: - return 0.93; - case 2000: - return 0.95; - case 5000: - return 0.96; - case 10000: - return 0.98; - case 20000: - return 0.985; - case 30000: - return 0.987; - case 40000: - return 0.9892; - case 50000: - return 0.9911; - case 60000: - return 0.9921; - case 70000: - return 0.9934; - case 80000: - return 0.9942; - case 90000: - return 0.9946; - case 100000: - return 0.995; - } + const cells = +pointsInput.dataset.cells; + if (cells === 1000) return 0.93; + if (cells === 2000) return 0.95; + if (cells === 5000) return 0.96; + if (cells === 10000) return 0.98; + if (cells === 20000) return 0.985; + if (cells === 30000) return 0.987; + if (cells === 40000) return 0.9892; + if (cells === 50000) return 0.9911; + if (cells === 60000) return 0.9921; + if (cells === 70000) return 0.9934; + if (cells === 80000) return 0.9942; + if (cells === 90000) return 0.9946; + if (cells === 100000) return 0.995; } function getLinePower() { - switch (+pointsInput.dataset.cells) { - case 1000: - return 0.74; - case 2000: - return 0.75; - case 5000: - return 0.78; - case 10000: - return 0.81; - case 20000: - return 0.82; - case 30000: - return 0.83; - case 40000: - return 0.84; - case 50000: - return 0.855; - case 60000: - return 0.87; - case 70000: - return 0.885; - case 80000: - return 0.91; - case 90000: - return 0.92; - case 100000: - return 0.93; - } + const cells = +pointsInput.dataset.cells; + if (cells === 1000) return 0.74; + if (cells === 2000) return 0.75; + if (cells === 5000) return 0.78; + if (cells === 10000) return 0.81; + if (cells === 20000) return 0.82; + if (cells === 30000) return 0.83; + if (cells === 40000) return 0.84; + if (cells === 50000) return 0.855; + if (cells === 60000) return 0.87; + if (cells === 70000) return 0.885; + if (cells === 80000) return 0.91; + if (cells === 90000) return 0.92; + if (cells === 100000) return 0.93; } const addHill = function (count, height, rangeX, rangeY) { diff --git a/modules/heightmap-templates.js b/modules/heightmap-templates.js new file mode 100644 index 00000000..4a5860b8 --- /dev/null +++ b/modules/heightmap-templates.js @@ -0,0 +1,126 @@ +"use strict"; + +window.HeightmapTemplates = (function () { + const volcano = `Hill 1 90-100 44-56 40-60 + Multiply 0.8 50-100 0 0 + Range 1.5 30-55 45-55 40-60 + Smooth 2 0 0 0 + Hill 1.5 25-35 25-30 20-75 + Hill 1 25-35 75-80 25-75 + Hill 0.5 20-25 10-15 20-25`; + + const highIsland = `Hill 1 90-100 65-75 47-53 + Add 5 all 0 0 + Hill 6 20-23 25-55 45-55 + Range 1 40-50 45-55 45-55 + Smooth 2 0 0 0 + Trough 2-3 20-30 20-30 20-30 + Trough 2-3 20-30 60-80 70-80 + Hill 1 10-15 60-60 50-50 + Hill 1.5 13-16 15-20 20-75 + Multiply 0.8 20-100 0 0 + Range 1.5 30-40 15-85 30-40 + Range 1.5 30-40 15-85 60-70 + Pit 2-3 10-15 15-85 20-80`; + + const lowIsland = `Hill 1 90-99 60-80 45-55 + Hill 4-5 25-35 20-65 40-60 + Range 1 40-50 45-55 45-55 + Smooth 3 0 0 0 + Trough 1.5 20-30 15-85 20-30 + Trough 1.5 20-30 15-85 70-80 + Hill 1.5 10-15 5-15 20-80 + Hill 1 10-15 85-95 70-80 + Pit 3-5 10-15 15-85 20-80 + Multiply 0.4 20-100 0 0`; + + const continents = `Hill 1 80-85 75-80 40-60 + Hill 1 80-85 20-25 40-60 + Multiply 0.22 20-100 0 0 + Hill 5-6 15-20 25-75 20-82 + Range .8 30-60 5-15 20-45 + Range .8 30-60 5-15 55-80 + Range 0-3 30-60 80-90 20-80 + Trough 3-4 15-20 15-85 20-80 + Strait 2 vertical 0 0 + Smooth 2 0 0 0 + Trough 1-2 5-10 45-55 45-55 + Pit 3-4 10-15 15-85 20-80 + Hill 1 5-10 40-60 40-60`; + + const archipelago = `Add 11 all 0 0 + Range 2-3 40-60 20-80 20-80 + Hill 5 15-20 10-90 30-70 + Hill 2 10-15 10-30 20-80 + Hill 2 10-15 60-90 20-80 + Smooth 3 0 0 0 + Trough 10 20-30 5-95 5-95 + Strait 2 vertical 0 0 + Strait 2 horizontal 0 0`; + + const atoll = `Add 11 all 0 0 + Range 2-3 40-60 20-80 20-80 + Hill 5 15-20 10-90 30-70 + Hill 2 10-15 10-30 20-80 + Hill 2 10-15 60-90 20-80 + Smooth 3 0 0 0 + Trough 10 20-30 5-95 5-95 + Strait 2 vertical 0 0 + Strait 2 horizontal 0 0`; + + const mediterranean = `Range 3-4 30-50 0-100 0-10 + Range 3-4 30-50 0-100 90-100 + Hill 5-6 30-70 0-100 0-5 + Hill 5-6 30-70 0-100 95-100 + Smooth 1 0 0 0 + Hill 2-3 30-70 0-5 20-80 + Hill 2-3 30-70 95-100 20-80 + Multiply 0.8 land 0 0 + Trough 3-5 40-50 0-100 0-10 + Trough 3-5 40-50 0-100 90-100`; + + const peninsula = `Range 2-3 20-35 40-50 0-15 + Add 5 all 0 0 + Hill 1 90-100 10-90 0-5 + Add 13 all 0 0 + Hill 3-4 3-5 5-95 80-100 + Hill 1-2 3-5 5-95 40-60 + Trough 5-6 10-25 5-95 5-95 + Smooth 3 0 0 0`; + + const pangea = `Hill 1-2 25-40 15-50 0-10 + Hill 1-2 5-40 50-85 0-10 + Hill 1-2 25-40 50-85 90-100 + Hill 1-2 5-40 15-50 90-100 + Hill 8-12 20-40 20-80 48-52 + Smooth 2 0 0 0 + Multiply 0.7 land 0 0 + Trough 3-4 25-35 5-95 10-20 + Trough 3-4 25-35 5-95 80-90 + Range 5-6 30-40 10-90 35-65`; + + const isthmus = `Hill 5-10 15-30 0-30 0-20 + Hill 5-10 15-30 10-50 20-40 + Hill 5-10 15-30 30-70 40-60 + Hill 5-10 15-30 50-90 60-80 + Hill 5-10 15-30 70-100 80-100 + Smooth 2 0 0 0 + Trough 4-8 15-30 0-30 0-20 + Trough 4-8 15-30 10-50 20-40 + Trough 4-8 15-30 30-70 40-60 + Trough 4-8 15-30 50-90 60-80 + Trough 4-8 15-30 70-100 80-100`; + + const shattered = `Hill 8 35-40 15-85 30-70 + Trough 10-20 40-50 5-95 5-95 + Range 5-7 30-40 10-90 20-80 + Pit 12-20 30-40 15-85 20-80`; + + const taklamakan = `Hill 1-3 20-30 30-70 30-70 + Hill 2-4 60-85 0-5 0-100 + Hill 2-4 60-85 95-100 0-100 + Hill 3-4 60-85 20-80 0-5 + Hill 3-4 60-85 20-80 95-100`; + + return {volcano, highIsland, lowIsland, continents, archipelago, atoll, mediterranean, peninsula, peninsula, pangea, isthmus, shattered, taklamakan}; +})(); diff --git a/modules/ui/heightmap-editor.js b/modules/ui/heightmap-editor.js index f19e8cf0..d6c2296f 100644 --- a/modules/ui/heightmap-editor.js +++ b/modules/ui/heightmap-editor.js @@ -1,4 +1,3 @@ -// heightmap-editor module. To be added to window as for now "use strict"; function editHeightmap() { diff --git a/modules/ui/options.js b/modules/ui/options.js index e6f1d629..9d8b43df 100644 --- a/modules/ui/options.js +++ b/modules/ui/options.js @@ -541,17 +541,18 @@ function randomizeOptions() { // select heightmap template pseudo-randomly function randomizeHeightmapTemplate() { const templates = { - Volcano: 3, - "High Island": 22, - "Low Island": 9, - Continents: 20, - Archipelago: 25, - Mediterranean: 3, - Peninsula: 3, - Pangea: 5, - Isthmus: 2, - Atoll: 1, - Shattered: 7 + volcano: 3, + highIsland: 22, + lowIsland: 9, + continents: 20, + archipelago: 25, + mediterranean: 3, + peninsula: 3, + pangea: 5, + isthmus: 2, + atoll: 1, + shattered: 7, + taklamakan: 2 }; document.getElementById("templateInput").value = rw(templates); } From d542b761d0971e06ca2331255ce38f856b6a6131 Mon Sep 17 00:00:00 2001 From: Azgaar Date: Thu, 29 Jul 2021 23:53:07 +0300 Subject: [PATCH 2/4] simplify IIFE - expose to window --- modules/heightmap-generator.js | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/modules/heightmap-generator.js b/modules/heightmap-generator.js index b3e1e684..7fc70a6c 100644 --- a/modules/heightmap-generator.js +++ b/modules/heightmap-generator.js @@ -1,8 +1,6 @@ "use strict"; -(function (global, factory) { - typeof exports === "object" && typeof module !== "undefined" ? (module.exports = factory()) : typeof define === "function" && define.amd ? define(factory) : (global.HeightmapGenerator = factory()); -})(this, function () { +window.HeightmapGenerator = (function () { let cells, p; const generate = function () { @@ -411,4 +409,4 @@ } return {generate, addHill, addRange, addTrough, addStrait, addPit, smooth, modify}; -}); +})(); From a17457ae350efe7274e10f14db6df76f9c3e7b11 Mon Sep 17 00:00:00 2001 From: Azgaar Date: Sat, 31 Jul 2021 14:49:36 +0300 Subject: [PATCH 3/4] template editor - use the same template source as generator --- index.html | 25 +++---- modules/ui/heightmap-editor.js | 121 +++------------------------------ 2 files changed, 22 insertions(+), 124 deletions(-) diff --git a/index.html b/index.html index 98bcf1c8..c61ff644 100644 --- a/index.html +++ b/index.html @@ -2333,18 +2333,19 @@