fix: update type definitions and improve renderer initialization in draw-relief-icons

This commit is contained in:
Azgaar 2026-03-11 00:51:56 +01:00
parent 828534ebd9
commit ffe350bca8
4 changed files with 19 additions and 13 deletions

View file

@ -30,6 +30,7 @@
"@types/delaunator": "^5.0.3",
"@types/node": "^25.0.10",
"@types/polylabel": "^1.1.3",
"@types/three": "^0.183.1",
"@vitest/browser": "^4.0.18",
"@vitest/browser-playwright": "^4.0.18",
"playwright": "^1.57.0",
@ -38,7 +39,6 @@
"vitest": "^4.0.18"
},
"dependencies": {
"@types/three": "^0.183.1",
"alea": "^1.0.1",
"d3": "^7.9.0",
"delaunator": "^5.0.1",

View file

@ -4,10 +4,12 @@ function editReliefIcon() {
closeDialogs(".stable");
// Switch from WebGL to editable SVG <use> elements
undrawRelief();
drawRelief("svg");
if (!layerIsOn("toggleRelief")) {
undrawRelief();
turnButtonOn("toggleRelief");
drawRelief("svg");
}
if (!layerIsOn("toggleRelief")) toggleRelief();
terrain.selectAll("use").call(d3.drag().on("drag", dragReliefIcon)).classed("draggable", true);
// Click-to-select: delegation on the terrain group covers existing and newly added <use> elements.

View file

@ -80,7 +80,7 @@ function processFeatureRegeneration(event, button) {
drawStateLabels();
} else if (button === "regenerateReliefIcons") {
generateReliefIcons();
if (!layerIsOn("toggleRelief")) toggleRelief();
layerIsOn("toggleRelief") ? drawRelief() : toggleRelief();
} else if (button === "regenerateRoutes") {
regenerateRoutes();
if (!layerIsOn("toggleRoutes")) toggleRoutes();

View file

@ -5,18 +5,19 @@ import { generateRelief } from "../modules/relief-generator";
import { byId } from "../utils";
let fo: SVGForeignObjectElement | null = null;
let renderer: any = null; // THREE.WebGLRenderer
let camera: any = null; // THREE.OrthographicCamera
let scene: any = null; // THREE.Scene
let renderer: THREE.WebGLRenderer | null = null;
let camera: THREE.OrthographicCamera | null = null;
let scene: THREE.Scene | null = null;
const textureCache = new Map<string, any>(); // set name → THREE.Texture
const textureCache = new Map<string, THREE.Texture>(); // set name → THREE.Texture
function preloadTextures(): void {
for (const set of Object.keys(RELIEF_SYMBOLS)) loadTexture(set);
}
function loadTexture(set: string): Promise<any> {
if (textureCache.has(set)) return Promise.resolve(textureCache.get(set));
function loadTexture(set: string): Promise<THREE.Texture | null> {
if (textureCache.has(set))
return Promise.resolve(textureCache.get(set) || null);
return new Promise((resolve) => {
const loader = new THREE.TextureLoader();
loader.load(
@ -179,10 +180,13 @@ function disposeTextureCache(): void {
function disposeScene(): void {
if (!scene) return;
while (scene.children.length) {
const mesh = scene.children[0];
const mesh = scene.children[0] as THREE.Mesh<
THREE.BufferGeometry,
THREE.Material
>;
scene.remove(mesh);
mesh.geometry?.dispose();
if (mesh.material) {
if (mesh.material && "map" in mesh.material) {
mesh.material.map = null;
mesh.material.dispose();
}