@@ -6110,7 +6111,7 @@
-
+
@@ -6140,7 +6141,7 @@
-
+
diff --git a/modules/heightmap-generator.js b/modules/heightmap-generator.js
index 0723a34a..0f77e770 100644
--- a/modules/heightmap-generator.js
+++ b/modules/heightmap-generator.js
@@ -26,7 +26,7 @@ window.HeightmapGenerator = (function () {
// load heightmap into image and render to canvas
const img = new Image();
img.src = `./heightmaps/${input.value}.png`;
- img.onload = function () {
+ img.onload = () => {
ctx.drawImage(img, 0, 0, cellsX, cellsY);
const imageData = ctx.getImageData(0, 0, cellsX, cellsY);
assignColorsToHeight(imageData.data);
@@ -61,6 +61,7 @@ window.HeightmapGenerator = (function () {
if (a1 === "Range") return addRange(a2, a3, a4, a5);
if (a1 === "Trough") return addTrough(a2, a3, a4, a5);
if (a1 === "Strait") return addStrait(a2, a3);
+ if (a1 === "Insulate") return insulate(a2);
if (a1 === "Add") return modify(a3, +a2, 1);
if (a1 === "Multiply") return modify(a3, 0, +a2);
if (a1 === "Smooth") return smooth(a2);
@@ -100,7 +101,7 @@ window.HeightmapGenerator = (function () {
if (cells === 100000) return 0.93;
}
- const addHill = function (count, height, rangeX, rangeY) {
+ const addHill = (count, height, rangeX, rangeY) => {
count = getNumberInRange(count);
const power = getBlobPower();
while (count > 0) {
@@ -137,7 +138,7 @@ window.HeightmapGenerator = (function () {
}
};
- const addPit = function (count, height, rangeX, rangeY) {
+ const addPit = (count, height, rangeX, rangeY) => {
count = getNumberInRange(count);
while (count > 0) {
addOnePit();
@@ -173,7 +174,7 @@ window.HeightmapGenerator = (function () {
}
};
- const addRange = function (count, height, rangeX, rangeY) {
+ const addRange = (count, height, rangeX, rangeY) => {
count = getNumberInRange(count);
const power = getLinePower();
while (count > 0) {
@@ -259,7 +260,7 @@ window.HeightmapGenerator = (function () {
}
};
- const addTrough = function (count, height, rangeX, rangeY) {
+ const addTrough = (count, height, rangeX, rangeY) => {
count = getNumberInRange(count);
const power = getLinePower();
while (count > 0) {
@@ -354,7 +355,7 @@ window.HeightmapGenerator = (function () {
}
};
- const addStrait = function (width, direction = "vertical") {
+ const addStrait = (width, direction = "vertical") => {
width = Math.min(getNumberInRange(width), grid.cellsX / 3);
if (width < 1 && P(width)) return;
const used = new Uint8Array(cells.h.length);
@@ -407,7 +408,7 @@ window.HeightmapGenerator = (function () {
}
};
- const modify = function (range, add, mult, power) {
+ const modify = (range, add, mult, power) => {
const min = range === "land" ? 20 : range === "all" ? 0 : +range.split("-")[0];
const max = range === "land" || range === "all" ? 100 : +range.split("-")[1];
const isLand = min === 20;
@@ -422,14 +423,26 @@ window.HeightmapGenerator = (function () {
});
};
- const smooth = function (fr = 2, add = 0) {
+ const smooth = (fr = 2, add = 0) => {
cells.h = cells.h.map((h, i) => {
const a = [h];
cells.c[i].forEach(c => a.push(cells.h[c]));
+ if (fr === 1) return d3.mean(a) + add;
return lim((h * (fr - 1) + d3.mean(a) + add) / fr);
});
};
+ const insulate = (fr = 2) => {
+ const power = fr * 2;
+ cells.h = cells.h.map((h, i) => {
+ const [x, y] = p[i];
+ const nx = (2 * x) / graphWidth - 1;
+ const ny = (2 * y) / graphHeight - 1;
+ const distance = (1 - nx ** power) * (1 - ny ** power); // 1 is center, 0 is edge
+ return h * distance;
+ });
+ };
+
function getPointInRange(range, length) {
if (typeof range !== "string") {
ERROR && console.error("Range should be a string");
@@ -449,5 +462,5 @@ window.HeightmapGenerator = (function () {
}
}
- return {generate, addHill, addRange, addTrough, addStrait, addPit, smooth, modify};
+ return {generate, addHill, addRange, addTrough, addStrait, addPit, smooth, modify, insulate};
})();
diff --git a/modules/heightmap-templates.js b/modules/heightmap-templates.js
index bd371e10..0266ce39 100644
--- a/modules/heightmap-templates.js
+++ b/modules/heightmap-templates.js
@@ -119,7 +119,6 @@ window.HeightmapTemplates = (function () {
Hill 3-4 60-85 20-80 0-5
Hill 3-4 60-85 20-80 95-100`;
-
const oldWorld = `Hill 4-6 20-40 15-85 30-45
Hill 3-7 20-40 15-85 55-70
Strait 2-7 vertical 0 0
@@ -170,5 +169,20 @@ window.HeightmapTemplates = (function () {
Strait 3-7 vertical 0 0
Trough 1-2 40-50 45-65 45-65`;
- return {volcano, highIsland, lowIsland, continents, archipelago, atoll, mediterranean, peninsula, peninsula, pangea, isthmus, shattered, taklamakan, oldWorld};
+ return {
+ volcano,
+ highIsland,
+ lowIsland,
+ continents,
+ archipelago,
+ atoll,
+ mediterranean,
+ peninsula,
+ peninsula,
+ pangea,
+ isthmus,
+ shattered,
+ taklamakan,
+ oldWorld
+ };
})();
diff --git a/modules/ui/heightmap-editor.js b/modules/ui/heightmap-editor.js
index fae944f3..8e11965b 100644
--- a/modules/ui/heightmap-editor.js
+++ b/modules/ui/heightmap-editor.js
@@ -34,19 +34,19 @@ function editHeightmap() {
modules.editHeightmap = true;
// add listeners
- document.getElementById("paintBrushes").addEventListener("click", openBrushesPanel);
- document.getElementById("applyTemplate").addEventListener("click", openTemplateEditor);
- document.getElementById("convertImage").addEventListener("click", openImageConverter);
- document.getElementById("heightmapPreview").addEventListener("click", toggleHeightmapPreview);
- document.getElementById("heightmap3DView").addEventListener("click", changeViewMode);
- document.getElementById("finalizeHeightmap").addEventListener("click", finalizeHeightmap);
- document.getElementById("renderOcean").addEventListener("click", mockHeightmap);
- document.getElementById("templateUndo").addEventListener("click", () => restoreHistory(edits.n - 1));
- document.getElementById("templateRedo").addEventListener("click", () => restoreHistory(edits.n + 1));
+ byId("paintBrushes").on("click", openBrushesPanel);
+ byId("applyTemplate").on("click", openTemplateEditor);
+ byId("convertImage").on("click", openImageConverter);
+ byId("heightmapPreview").on("click", toggleHeightmapPreview);
+ byId("heightmap3DView").on("click", changeViewMode);
+ byId("finalizeHeightmap").on("click", finalizeHeightmap);
+ byId("renderOcean").on("click", mockHeightmap);
+ byId("templateUndo").on("click", () => restoreHistory(edits.n - 1));
+ byId("templateRedo").on("click", () => restoreHistory(edits.n + 1));
function enterHeightmapEditMode(type) {
editHeightmap.layers = Array.from(mapLayers.querySelectorAll("li:not(.buttonoff)")).map(node => node.id); // store layers preset
- editHeightmap.layers.forEach(l => document.getElementById(l).click()); // turn off all layers
+ editHeightmap.layers.forEach(l => byId(l).click()); // turn off all layers
customization = 1;
closeDialogs();
@@ -113,7 +113,7 @@ function editHeightmap() {
if (tooltip.dataset.main) showMainTip();
// move radius circle if drag mode is active
- const pressed = document.getElementById("brushesButtons").querySelector("button.pressed");
+ const pressed = byId("brushesButtons").querySelector("button.pressed");
if (!pressed) return;
moveCircle(p[0], p[1], brushRadius.valueAsNumber, "#333");
}
@@ -137,7 +137,7 @@ function editHeightmap() {
function finalizeHeightmap() {
if (viewbox.select("#heights").selectAll("*").size() < 200)
return tip("Insufficient land area! There should be at least 200 land cells to finalize the heightmap", null, "error");
- if (document.getElementById("imageConverter").offsetParent) return tip("Please exit the Image Conversion mode first", null, "error");
+ if (byId("imageConverter").offsetParent) return tip("Please exit the Image Conversion mode first", null, "error");
delete window.edits; // remove global variable
redo.disabled = templateRedo.disabled = true;
@@ -145,7 +145,7 @@ function editHeightmap() {
customization = 0;
customizationMenu.style.display = "none";
- if (document.getElementById("options").querySelector(".tab > button.active").id === "toolsTab") toolsContent.style.display = "block";
+ if (byId("options").querySelector(".tab > button.active").id === "toolsTab") toolsContent.style.display = "block";
layersPreset.disabled = false;
exitCustomization.style.display = "none"; // hide finalize button
restoreDefaultEvents();
@@ -153,8 +153,8 @@ function editHeightmap() {
closeDialogs();
resetZoom();
- if (document.getElementById("preview")) document.getElementById("preview").remove();
- if (document.getElementById("canvas3d")) enterStandardView();
+ if (byId("preview")) byId("preview").remove();
+ if (byId("canvas3d")) enterStandardView();
const mode = heightmapEditMode.innerHTML;
if (mode === "erase") regenerateErasedData();
@@ -163,7 +163,7 @@ function editHeightmap() {
// restore initial layers
//viewbox.select("#heights").remove();
- document.getElementById("heights").remove();
+ byId("heights").remove();
turnButtonOff("toggleHeight");
document
.getElementById("mapLayers")
@@ -501,8 +501,8 @@ function editHeightmap() {
redo.disabled = templateRedo.disabled = true;
if (!noStat) {
updateStatistics();
- if (document.getElementById("preview")) drawHeightmapPreview(); // update heightmap preview if opened
- if (document.getElementById("canvas3d")) ThreeD.redraw(); // update 3d heightmap preview if opened
+ if (byId("preview")) drawHeightmapPreview(); // update heightmap preview if opened
+ if (byId("canvas3d")) ThreeD.redraw(); // update 3d heightmap preview if opened
}
}
@@ -516,8 +516,8 @@ function editHeightmap() {
mockHeightmap();
updateStatistics();
- if (document.getElementById("preview")) drawHeightmapPreview(); // update heightmap preview if opened
- if (document.getElementById("canvas3d")) ThreeD.redraw(); // update 3d heightmap preview if opened
+ if (byId("preview")) drawHeightmapPreview(); // update heightmap preview if opened
+ if (byId("canvas3d")) ThreeD.redraw(); // update 3d heightmap preview if opened
}
// restart edits from 1st step
@@ -543,31 +543,31 @@ function editHeightmap() {
modules.openBrushesPanel = true;
// add listeners
- document.getElementById("brushesButtons").addEventListener("click", e => toggleBrushMode(e));
- document.getElementById("changeOnlyLand").addEventListener("click", e => changeOnlyLandClick(e));
- document.getElementById("undo").addEventListener("click", () => restoreHistory(edits.n - 1));
- document.getElementById("redo").addEventListener("click", () => restoreHistory(edits.n + 1));
- document.getElementById("rescaleShow").addEventListener("click", () => {
- document.getElementById("modifyButtons").style.display = "none";
- document.getElementById("rescaleSection").style.display = "block";
+ byId("brushesButtons").on("click", e => toggleBrushMode(e));
+ byId("changeOnlyLand").on("click", e => changeOnlyLandClick(e));
+ byId("undo").on("click", () => restoreHistory(edits.n - 1));
+ byId("redo").on("click", () => restoreHistory(edits.n + 1));
+ byId("rescaleShow").on("click", () => {
+ byId("modifyButtons").style.display = "none";
+ byId("rescaleSection").style.display = "block";
});
- document.getElementById("rescaleHide").addEventListener("click", () => {
- document.getElementById("modifyButtons").style.display = "block";
- document.getElementById("rescaleSection").style.display = "none";
+ byId("rescaleHide").on("click", () => {
+ byId("modifyButtons").style.display = "block";
+ byId("rescaleSection").style.display = "none";
});
- document.getElementById("rescaler").addEventListener("change", e => rescale(e.target.valueAsNumber));
- document.getElementById("rescaleCondShow").addEventListener("click", () => {
- document.getElementById("modifyButtons").style.display = "none";
- document.getElementById("rescaleCondSection").style.display = "block";
+ byId("rescaler").on("change", e => rescale(e.target.valueAsNumber));
+ byId("rescaleCondShow").on("click", () => {
+ byId("modifyButtons").style.display = "none";
+ byId("rescaleCondSection").style.display = "block";
});
- document.getElementById("rescaleCondHide").addEventListener("click", () => {
- document.getElementById("modifyButtons").style.display = "block";
- document.getElementById("rescaleCondSection").style.display = "none";
+ byId("rescaleCondHide").on("click", () => {
+ byId("modifyButtons").style.display = "block";
+ byId("rescaleCondSection").style.display = "none";
});
- document.getElementById("rescaleExecute").addEventListener("click", rescaleWithCondition);
- document.getElementById("smoothHeights").addEventListener("click", smoothAllHeights);
- document.getElementById("disruptHeights").addEventListener("click", disruptAllHeights);
- document.getElementById("brushClear").addEventListener("click", startFromScratch);
+ byId("rescaleExecute").on("click", rescaleWithCondition);
+ byId("smoothHeights").on("click", smoothAllHeights);
+ byId("disruptHeights").on("click", disruptAllHeights);
+ byId("brushClear").on("click", startFromScratch);
function exitBrushMode() {
const pressed = document.querySelector("#brushesButtons > button.pressed");
@@ -576,7 +576,7 @@ function editHeightmap() {
viewbox.style("cursor", "default").on(".drag", null);
removeCircle();
- document.getElementById("brushesSliders").style.display = "none";
+ byId("brushesSliders").style.display = "none";
}
const dragBrushThrottled = throttle(dragBrush, 100);
@@ -586,7 +586,7 @@ function editHeightmap() {
return;
}
exitBrushMode();
- document.getElementById("brushesSliders").style.display = "block";
+ byId("brushesSliders").style.display = "block";
e.target.classList.add("pressed");
viewbox.style("cursor", "crosshair").call(d3.drag().on("start", dragBrushThrottled));
}
@@ -644,21 +644,15 @@ function editHeightmap() {
const land = changeOnlyLand.checked;
grid.cells.h = grid.cells.h.map(h => (land && (h < 20 || h + v < 20) ? h : lim(h + v)));
updateHeightmap();
- document.getElementById("rescaler").value = 0;
+ byId("rescaler").value = 0;
}
function rescaleWithCondition() {
const range = rescaleLower.value + "-" + rescaleHigher.value;
const operator = conditionSign.value;
const operand = rescaleModifier.valueAsNumber;
- if (Number.isNaN(operand)) {
- tip("Operand should be a number", false, "error");
- return;
- }
- if ((operator === "add" || operator === "subtract") && !Number.isInteger(operand)) {
- tip("Operand should be an integer", false, "error");
- return;
- }
+ if (Number.isNaN(operand)) return tip("Operand should be a number", false, "error");
+ if ((operator === "add" || operator === "subtract") && !Number.isInteger(operand)) return tip("Operand should be an integer", false, "error");
if (operator === "multiply") HeightmapGenerator.modify(range, 0, operand, 0);
else if (operator === "divide") HeightmapGenerator.modify(range, 0, 1 / operand, 0);
@@ -697,7 +691,7 @@ function editHeightmap() {
function openTemplateEditor() {
if ($("#templateEditor").is(":visible")) return;
- const body = document.getElementById("templateBody");
+ const body = byId("templateBody");
$("#templateEditor").dialog({
title: "Template Editor",
@@ -713,7 +707,7 @@ function editHeightmap() {
$("#templateBody").sortable({items: "> div", handle: ".icon-resize-vertical", containment: "#templateBody", axis: "y"});
// add listeners
- body.addEventListener("click", function (ev) {
+ body.on("click", function (ev) {
const el = ev.target;
if (el.classList.contains("icon-check")) {
el.classList.remove("icon-check");
@@ -734,27 +728,27 @@ function editHeightmap() {
}
});
- document.getElementById("templateTools").addEventListener("click", e => addStepOnClick(e));
- document.getElementById("templateSelect").addEventListener("change", e => selectTemplate(e));
- document.getElementById("templateRun").addEventListener("click", executeTemplate);
- document.getElementById("templateSave").addEventListener("click", downloadTemplate);
- document.getElementById("templateLoad").addEventListener("click", () => templateToLoad.click());
- document.getElementById("templateToLoad").addEventListener("change", function () {
+ byId("templateTools").on("click", addStepOnClick);
+ byId("templateSelect").on("change", selectTemplate);
+ byId("templateRun").on("click", executeTemplate);
+ byId("templateSave").on("click", downloadTemplate);
+ byId("templateLoad").on("click", () => templateToLoad.click());
+ byId("templateToLoad").on("change", function () {
uploadFile(this, uploadTemplate);
});
function addStepOnClick(e) {
if (e.target.tagName !== "BUTTON") return;
- const type = e.target.id.replace("template", "");
- document.getElementById("templateBody").dataset.changed = 1;
+ const type = e.target.dataset.type;
+ byId("templateBody").dataset.changed = 1;
addStep(type);
}
function addStep(type, count, dist, arg4, arg5) {
- const body = document.getElementById("templateBody");
+ const body = byId("templateBody");
body.insertAdjacentHTML("beforeend", getStepHTML(type, count, dist, arg4, arg5));
const elDist = body.querySelector("div:last-child").querySelector(".templateDist");
- if (elDist) elDist.addEventListener("change", setRange);
+ if (elDist) elDist.on("change", setRange);
if (dist && elDist && elDist.tagName === "SELECT") {
for (const o of elDist.options) {
if (o.value === dist) elDist.value = dist;
@@ -769,36 +763,56 @@ function editHeightmap() {
}
function getStepHTML(type, count, arg3, arg4, arg5) {
- const Trash = `
`;
- const Hide = `
`;
- const Reorder = `
`;
- const common = `
${Hide}
${type}
${Trash}${Reorder}`;
+ const Trash = /* html */ `
`;
+ const Hide = /* html */ `
`;
+ const Reorder = /* html */ `
`;
+ const common = /* html */ `
`;
+ const TempY = /* html */ `
y:`;
+
+ const TempX = /* html */ `
x:`;
+
+ const Height = /* html */ `
h:`;
+
+ const Count = /* html */ `
n:`;
+
+ if (type === "Hill" || type === "Pit" || type === "Range" || type === "Trough") return /* html */ `${common}${TempY}${TempX}${Height}${Count}
`;
- if (type === "Hill" || type === "Pit" || type === "Range" || type === "Trough") return blob;
if (type === "Strait")
- return `${common}
d:w: