Skip to content

Commit 4dd34e1

Browse files
committed
refactor: drawReliefIcons, v1.108.4
1 parent 791347b commit 4dd34e1

File tree

8 files changed

+149
-145
lines changed

8 files changed

+149
-145
lines changed

index.html

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -8088,7 +8088,7 @@
80888088
<script src="config/precreated-heightmaps.js"></script>
80898089
<script src="modules/heightmap-generator.js?v=1.99.00"></script>
80908090
<script src="modules/features.js?v=1.104.0"></script>
8091-
<script src="modules/ocean-layers.js?v=1.108.3"></script>
8091+
<script src="modules/ocean-layers.js?v=1.108.4"></script>
80928092
<script src="modules/river-generator.js?v=1.106.7"></script>
80938093
<script src="modules/lakes.js?v=1.99.00"></script>
80948094
<script src="modules/biomes.js?v=1.99.00"></script>
@@ -8115,14 +8115,13 @@
81158115
<script src="modules/ui/options.js?v=1.106.2"></script>
81168116
<script src="main.js?v=1.108.1"></script>
81178117

8118-
<script defer src="modules/relief-icons.js?v=1.99.05"></script>
8119-
<script defer src="modules/ui/style.js?v=1.104.0"></script>
8118+
<script defer src="modules/ui/style.js?v=1.108.4"></script>
81208119
<script defer src="modules/ui/editors.js?v=1.108.1"></script>
8121-
<script defer src="modules/ui/tools.js?v=1.108.1"></script>
8120+
<script defer src="modules/ui/tools.js?v=1.108.4"></script>
81228121
<script defer src="modules/ui/world-configurator.js?v=1.105.4"></script>
81238122
<script defer src="modules/ui/heightmap-editor.js?v=1.105.2"></script>
81248123
<script defer src="modules/ui/provinces-editor.js?v=1.108.1"></script>
8125-
<script defer src="modules/ui/biomes-editor.js?v=1.99.05"></script>
8124+
<script defer src="modules/ui/biomes-editor.js?v=1.108.4"></script>
81268125
<script defer src="modules/ui/namesbase-editor.js?v=1.105.11"></script>
81278126
<script defer src="modules/ui/elevation-profile.js?v=1.99.00"></script>
81288127
<script defer src="modules/ui/temperature-graph.js?v=1.106.6"></script>
@@ -8175,5 +8174,6 @@
81758174
<script defer src="modules/renderers/draw-state-labels.js?v=1.108.1"></script>
81768175
<script defer src="modules/renderers/draw-burg-labels.js?v=1.108.1"></script>
81778176
<script defer src="modules/renderers/draw-burg-icons.js?v=1.104.0"></script>
8177+
<script defer src="modules/renderers/draw-relief-icons.js?v=1.108.4"></script>
81788178
</body>
81798179
</html>

modules/relief-icons.js

Lines changed: 0 additions & 128 deletions
This file was deleted.
Lines changed: 124 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,124 @@
1+
"use strict";
2+
3+
function drawReliefIcons() {
4+
TIME && console.time("drawRelief");
5+
terrain.selectAll("*").remove();
6+
7+
const cells = pack.cells;
8+
const density = terrain.attr("density") || 0.4;
9+
const size = 2 * (terrain.attr("size") || 1);
10+
const mod = 0.2 * size; // size modifier
11+
const relief = [];
12+
13+
for (const i of cells.i) {
14+
const height = cells.h[i];
15+
if (height < 20) continue; // no icons on water
16+
if (cells.r[i]) continue; // no icons on rivers
17+
const biome = cells.biome[i];
18+
if (height < 50 && biomesData.iconsDensity[biome] === 0) continue; // no icons for this biome
19+
20+
const polygon = getPackPolygon(i);
21+
const [minX, maxX] = d3.extent(polygon, p => p[0]);
22+
const [minY, maxY] = d3.extent(polygon, p => p[1]);
23+
24+
if (height < 50) placeBiomeIcons(i, biome);
25+
else placeReliefIcons(i);
26+
27+
function placeBiomeIcons() {
28+
const iconsDensity = biomesData.iconsDensity[biome] / 100;
29+
const radius = 2 / iconsDensity / density;
30+
if (Math.random() > iconsDensity * 10) return;
31+
32+
for (const [cx, cy] of poissonDiscSampler(minX, minY, maxX, maxY, radius)) {
33+
if (!d3.polygonContains(polygon, [cx, cy])) continue;
34+
let h = (4 + Math.random()) * size;
35+
const icon = getBiomeIcon(i, biomesData.icons[biome]);
36+
if (icon === "#relief-grass-1") h *= 1.2;
37+
relief.push({i: icon, x: rn(cx - h, 2), y: rn(cy - h, 2), s: rn(h * 2, 2)});
38+
}
39+
}
40+
41+
function placeReliefIcons(i) {
42+
const radius = 2 / density;
43+
const [icon, h] = getReliefIcon(i, height);
44+
45+
for (const [cx, cy] of poissonDiscSampler(minX, minY, maxX, maxY, radius)) {
46+
if (!d3.polygonContains(polygon, [cx, cy])) continue;
47+
relief.push({i: icon, x: rn(cx - h, 2), y: rn(cy - h, 2), s: rn(h * 2, 2)});
48+
}
49+
}
50+
51+
function getReliefIcon(i, h) {
52+
const temp = grid.cells.temp[pack.cells.g[i]];
53+
const type = h > 70 && temp < 0 ? "mountSnow" : h > 70 ? "mount" : "hill";
54+
const size = h > 70 ? (h - 45) * mod : minmax((h - 40) * mod, 3, 6);
55+
return [getIcon(type), size];
56+
}
57+
}
58+
59+
// sort relief icons by y+size
60+
relief.sort((a, b) => a.y + a.s - (b.y + b.s));
61+
62+
const reliefHTML = new Array(relief.length);
63+
for (const r of relief) {
64+
reliefHTML.push(`<use href="${r.i}" x="${r.x}" y="${r.y}" width="${r.s}" height="${r.s}"/>`);
65+
}
66+
terrain.html(reliefHTML.join(""));
67+
68+
TIME && console.timeEnd("drawRelief");
69+
70+
function getBiomeIcon(i, b) {
71+
let type = b[Math.floor(Math.random() * b.length)];
72+
const temp = grid.cells.temp[pack.cells.g[i]];
73+
if (type === "conifer" && temp < 0) type = "coniferSnow";
74+
return getIcon(type);
75+
}
76+
77+
function getVariant(type) {
78+
switch (type) {
79+
case "mount":
80+
return rand(2, 7);
81+
case "mountSnow":
82+
return rand(1, 6);
83+
case "hill":
84+
return rand(2, 5);
85+
case "conifer":
86+
return 2;
87+
case "coniferSnow":
88+
return 1;
89+
case "swamp":
90+
return rand(2, 3);
91+
case "cactus":
92+
return rand(1, 3);
93+
case "deadTree":
94+
return rand(1, 2);
95+
default:
96+
return 2;
97+
}
98+
}
99+
100+
function getOldIcon(type) {
101+
switch (type) {
102+
case "mountSnow":
103+
return "mount";
104+
case "vulcan":
105+
return "mount";
106+
case "coniferSnow":
107+
return "conifer";
108+
case "cactus":
109+
return "dune";
110+
case "deadTree":
111+
return "dune";
112+
default:
113+
return type;
114+
}
115+
}
116+
117+
function getIcon(type) {
118+
const set = terrain.attr("set") || "simple";
119+
if (set === "simple") return "#relief-" + getOldIcon(type) + "-1";
120+
if (set === "colored") return "#relief-" + type + "-" + getVariant(type);
121+
if (set === "gray") return "#relief-" + type + "-" + getVariant(type) + "-bw";
122+
return "#relief-" + getOldIcon(type) + "-1"; // simple
123+
}
124+
}

modules/ui/biomes-editor.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -317,7 +317,7 @@ function editBiomes() {
317317
}
318318

319319
function regenerateIcons() {
320-
ReliefIcons.draw();
320+
drawReliefIcons();
321321
if (!layerIsOn("toggleRelief")) toggleRelief();
322322
}
323323

modules/ui/layers.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -192,7 +192,7 @@ function drawLayers() {
192192
if (layerIsOn("toggleCoordinates")) drawCoordinates();
193193
if (layerIsOn("toggleCompass")) compass.style("display", "block");
194194
if (layerIsOn("toggleRivers")) drawRivers();
195-
if (layerIsOn("toggleRelief")) ReliefIcons.draw();
195+
if (layerIsOn("toggleRelief")) drawReliefIcons();
196196
if (layerIsOn("toggleReligions")) drawReligions();
197197
if (layerIsOn("toggleCultures")) drawCultures();
198198
if (layerIsOn("toggleStates")) drawStates();
@@ -742,7 +742,7 @@ function toggleCompass(event) {
742742
function toggleRelief(event) {
743743
if (!layerIsOn("toggleRelief")) {
744744
turnButtonOn("toggleRelief");
745-
if (!terrain.selectAll("*").size()) ReliefIcons.draw();
745+
if (!terrain.selectAll("*").size()) drawReliefIcons();
746746
$("#terrain").fadeIn();
747747
if (event && isCtrlClick(event)) editStyle("terrain");
748748
} else {

modules/ui/style.js

Lines changed: 15 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -140,9 +140,17 @@ function selectStyleElement() {
140140

141141
// stroke dash
142142
if (
143-
["borders", "cells", "coordinates", "gridOverlay", "legend", "population", "routes", "temperature", "zones"].includes(
144-
styleElement
145-
)
143+
[
144+
"borders",
145+
"cells",
146+
"coordinates",
147+
"gridOverlay",
148+
"legend",
149+
"population",
150+
"routes",
151+
"temperature",
152+
"zones"
153+
].includes(styleElement)
146154
) {
147155
styleStrokeDash.style.display = "block";
148156
styleStrokeDasharrayInput.value = el.attr("stroke-dasharray") || "";
@@ -711,19 +719,19 @@ styleHeightmapCurve.on("change", e => {
711719

712720
styleReliefSet.on("change", e => {
713721
terrain.attr("set", e.target.value);
714-
ReliefIcons.draw();
722+
drawReliefIcons();
715723
if (!layerIsOn("toggleRelief")) toggleRelief();
716724
});
717725

718726
styleReliefSize.on("change", e => {
719727
terrain.attr("size", e.target.value);
720-
ReliefIcons.draw();
728+
drawReliefIcons();
721729
if (!layerIsOn("toggleRelief")) toggleRelief();
722730
});
723731

724732
styleReliefDensity.on("change", e => {
725733
terrain.attr("density", e.target.value);
726-
ReliefIcons.draw();
734+
drawReliefIcons();
727735
if (!layerIsOn("toggleRelief")) toggleRelief();
728736
});
729737

@@ -788,7 +796,7 @@ styleShadowInput.on("input", function () {
788796
styleFontAdd.on("click", function () {
789797
addFontNameInput.value = "";
790798
addFontURLInput.value = "";
791-
799+
792800
$("#addFontDialog").dialog({
793801
title: "Add custom font",
794802
width: "26em",

modules/ui/tools.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,7 @@ function processFeatureRegeneration(event, button) {
7979
$("#labels").fadeIn();
8080
drawStateLabels();
8181
} else if (button === "regenerateReliefIcons") {
82-
ReliefIcons.draw();
82+
drawReliefIcons();
8383
if (!layerIsOn("toggleRelief")) toggleRelief();
8484
} else if (button === "regenerateRoutes") {
8585
regenerateRoutes();

versioning.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
* Example: 1.102.2 -> Major version 1, Minor version 102, Patch version 2
1414
*/
1515

16-
const VERSION = "1.108.3";
16+
const VERSION = "1.108.4";
1717
if (parseMapVersion(VERSION) !== VERSION) alert("versioning.js: Invalid format or parsing function");
1818

1919
{

0 commit comments

Comments
 (0)