mirror of
https://github.com/Azgaar/Fantasy-Map-Generator.git
synced 2026-03-23 15:47:24 +01:00
fix: update type definitions and improve renderer initialization in draw-relief-icons
This commit is contained in:
parent
828534ebd9
commit
ffe350bca8
4 changed files with 19 additions and 13 deletions
|
|
@ -30,6 +30,7 @@
|
||||||
"@types/delaunator": "^5.0.3",
|
"@types/delaunator": "^5.0.3",
|
||||||
"@types/node": "^25.0.10",
|
"@types/node": "^25.0.10",
|
||||||
"@types/polylabel": "^1.1.3",
|
"@types/polylabel": "^1.1.3",
|
||||||
|
"@types/three": "^0.183.1",
|
||||||
"@vitest/browser": "^4.0.18",
|
"@vitest/browser": "^4.0.18",
|
||||||
"@vitest/browser-playwright": "^4.0.18",
|
"@vitest/browser-playwright": "^4.0.18",
|
||||||
"playwright": "^1.57.0",
|
"playwright": "^1.57.0",
|
||||||
|
|
@ -38,7 +39,6 @@
|
||||||
"vitest": "^4.0.18"
|
"vitest": "^4.0.18"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@types/three": "^0.183.1",
|
|
||||||
"alea": "^1.0.1",
|
"alea": "^1.0.1",
|
||||||
"d3": "^7.9.0",
|
"d3": "^7.9.0",
|
||||||
"delaunator": "^5.0.1",
|
"delaunator": "^5.0.1",
|
||||||
|
|
|
||||||
|
|
@ -4,10 +4,12 @@ function editReliefIcon() {
|
||||||
closeDialogs(".stable");
|
closeDialogs(".stable");
|
||||||
|
|
||||||
// Switch from WebGL to editable SVG <use> elements
|
// Switch from WebGL to editable SVG <use> elements
|
||||||
undrawRelief();
|
if (!layerIsOn("toggleRelief")) {
|
||||||
drawRelief("svg");
|
undrawRelief();
|
||||||
|
turnButtonOn("toggleRelief");
|
||||||
|
drawRelief("svg");
|
||||||
|
}
|
||||||
|
|
||||||
if (!layerIsOn("toggleRelief")) toggleRelief();
|
|
||||||
terrain.selectAll("use").call(d3.drag().on("drag", dragReliefIcon)).classed("draggable", true);
|
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.
|
// Click-to-select: delegation on the terrain group covers existing and newly added <use> elements.
|
||||||
|
|
|
||||||
|
|
@ -80,7 +80,7 @@ function processFeatureRegeneration(event, button) {
|
||||||
drawStateLabels();
|
drawStateLabels();
|
||||||
} else if (button === "regenerateReliefIcons") {
|
} else if (button === "regenerateReliefIcons") {
|
||||||
generateReliefIcons();
|
generateReliefIcons();
|
||||||
if (!layerIsOn("toggleRelief")) toggleRelief();
|
layerIsOn("toggleRelief") ? drawRelief() : toggleRelief();
|
||||||
} else if (button === "regenerateRoutes") {
|
} else if (button === "regenerateRoutes") {
|
||||||
regenerateRoutes();
|
regenerateRoutes();
|
||||||
if (!layerIsOn("toggleRoutes")) toggleRoutes();
|
if (!layerIsOn("toggleRoutes")) toggleRoutes();
|
||||||
|
|
|
||||||
|
|
@ -5,18 +5,19 @@ import { generateRelief } from "../modules/relief-generator";
|
||||||
import { byId } from "../utils";
|
import { byId } from "../utils";
|
||||||
|
|
||||||
let fo: SVGForeignObjectElement | null = null;
|
let fo: SVGForeignObjectElement | null = null;
|
||||||
let renderer: any = null; // THREE.WebGLRenderer
|
let renderer: THREE.WebGLRenderer | null = null;
|
||||||
let camera: any = null; // THREE.OrthographicCamera
|
let camera: THREE.OrthographicCamera | null = null;
|
||||||
let scene: any = null; // THREE.Scene
|
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 {
|
function preloadTextures(): void {
|
||||||
for (const set of Object.keys(RELIEF_SYMBOLS)) loadTexture(set);
|
for (const set of Object.keys(RELIEF_SYMBOLS)) loadTexture(set);
|
||||||
}
|
}
|
||||||
|
|
||||||
function loadTexture(set: string): Promise<any> {
|
function loadTexture(set: string): Promise<THREE.Texture | null> {
|
||||||
if (textureCache.has(set)) return Promise.resolve(textureCache.get(set));
|
if (textureCache.has(set))
|
||||||
|
return Promise.resolve(textureCache.get(set) || null);
|
||||||
return new Promise((resolve) => {
|
return new Promise((resolve) => {
|
||||||
const loader = new THREE.TextureLoader();
|
const loader = new THREE.TextureLoader();
|
||||||
loader.load(
|
loader.load(
|
||||||
|
|
@ -179,10 +180,13 @@ function disposeTextureCache(): void {
|
||||||
function disposeScene(): void {
|
function disposeScene(): void {
|
||||||
if (!scene) return;
|
if (!scene) return;
|
||||||
while (scene.children.length) {
|
while (scene.children.length) {
|
||||||
const mesh = scene.children[0];
|
const mesh = scene.children[0] as THREE.Mesh<
|
||||||
|
THREE.BufferGeometry,
|
||||||
|
THREE.Material
|
||||||
|
>;
|
||||||
scene.remove(mesh);
|
scene.remove(mesh);
|
||||||
mesh.geometry?.dispose();
|
mesh.geometry?.dispose();
|
||||||
if (mesh.material) {
|
if (mesh.material && "map" in mesh.material) {
|
||||||
mesh.material.map = null;
|
mesh.material.map = null;
|
||||||
mesh.material.dispose();
|
mesh.material.dispose();
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue