Skip to content

Commit 28320ea

Browse files
Julien Moreau-Mathisjulien-moreau
authored andcommitted
fix: set navmesh preload as a plugin to avoid imposing @recast-navigation and @babylonjs/addons packages to be installed
1 parent d7a819f commit 28320ea

5 files changed

Lines changed: 88 additions & 60 deletions

File tree

editor/src/tools/workers/script.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ async function compile(srcAbsolutePath: string, outputAbsolutePath: string) {
4040
".ts": "ts",
4141
".node": "file",
4242
},
43-
external: ["sharp", "electron"],
43+
external: ["sharp", "electron", "@recast-navigation/core", "@recast-navigation/generators", "@babylonjs/addons"],
4444
keepNames: true,
4545
plugins: [replaceImportMetaDirname],
4646
};

tools/esbuild.mjs

Lines changed: 42 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -4,64 +4,58 @@ import { argv, exit } from "node:process";
44
import { readFile } from "node:fs/promises";
55

66
const replaceBabylonJsImports = {
7-
name: "replaceImportMetaDirname",
8-
setup(build) {
9-
build.onLoad({ filter: /.*/ }, async (args) => {
10-
const source = await readFile(args.path, "utf8");
7+
name: "replaceImportMetaDirname",
8+
setup(build) {
9+
build.onLoad({ filter: /.*/ }, async (args) => {
10+
const source = await readFile(args.path, "utf8");
1111

12-
const transformedSource = source
13-
.replace(/"@babylonjs\/core\/.*"/g, "\"babylonjs\"")
14-
.replace(/"@babylonjs\/gui\/.*"/g, "\"babylonjs-gui\"");
12+
const transformedSource = source
13+
.replace(/"@babylonjs\/core\/.*"/g, '"babylonjs"')
14+
.replace(/"@babylonjs\/gui\/.*"/g, '"babylonjs-gui"')
15+
.replace(/"@babylonjs\/addons\/.*"/g, '"babylonjs-addons"');
1516

16-
return {
17-
loader: "default",
18-
contents: transformedSource,
19-
};
20-
});
21-
},
17+
return {
18+
loader: "default",
19+
contents: transformedSource,
20+
};
21+
});
22+
},
2223
};
2324

2425
const args = argv.slice(2);
2526
const isWatch = args.includes("--watch");
2627

2728
const mainBuildOptions = {
28-
entryPoints: [
29-
"./src/index.ts",
30-
],
31-
bundle: true,
32-
platform: "node",
33-
target: "node20", // target version of Node.js
34-
format: "cjs", // output format as CommonJS
35-
outfile: "./build/index.node.js",
36-
treeShaking: false,
37-
loader: {
38-
".ts": "ts",
39-
},
40-
external: [
41-
"babylonjs",
42-
"babylonjs-gui",
43-
],
44-
keepNames: true,
45-
minify: !isWatch,
46-
plugins: [
47-
replaceBabylonJsImports
48-
],
29+
entryPoints: ["./src/index.ts"],
30+
bundle: true,
31+
platform: "node",
32+
target: "node20", // target version of Node.js
33+
format: "cjs", // output format as CommonJS
34+
outfile: "./build/index.node.js",
35+
treeShaking: false,
36+
loader: {
37+
".ts": "ts",
38+
},
39+
external: ["babylonjs", "babylonjs-gui"],
40+
keepNames: true,
41+
minify: !isWatch,
42+
plugins: [replaceBabylonJsImports],
4943
};
5044

5145
if (args.includes("--watch")) {
52-
esbuild
53-
.context(mainBuildOptions)
54-
.then(async (buildcontext) => {
55-
await buildcontext.watch();
56-
console.log("Watching...");
57-
})
58-
.catch((error) => {
59-
console.error(error);
60-
exit(1);
61-
});
46+
esbuild
47+
.context(mainBuildOptions)
48+
.then(async (buildcontext) => {
49+
await buildcontext.watch();
50+
console.log("Watching...");
51+
})
52+
.catch((error) => {
53+
console.error(error);
54+
exit(1);
55+
});
6256
} else {
63-
esbuild.build(mainBuildOptions).catch((error) => {
64-
console.error(error);
65-
exit(1);
66-
});
57+
esbuild.build(mainBuildOptions).catch((error) => {
58+
console.error(error);
59+
exit(1);
60+
});
6761
}

tools/package.json

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,10 @@
1616
"types": "./declaration/src/index.d.ts",
1717
"import": "./build/src/index.js",
1818
"require": "./build/index.node.js"
19+
},
20+
"./*": {
21+
"types": "./declaration/src/*.d.ts",
22+
"import": "./build/src/*.js"
1923
}
2024
},
2125
"typings": "declaration/src/index.d.ts",

tools/src/loading/script/preload.ts

Lines changed: 35 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -5,13 +5,39 @@ import { AdvancedAssetContainer } from "../container";
55

66
import { preloadSceneScriptAsset } from "./preload/scene";
77
import { preloadCommonScriptAsset } from "./preload/common";
8-
import { preloadNavMeshScriptAsset } from "./preload/navmesh";
98

109
/**
11-
* Defines the cache of all
10+
* Defines the cache of all preloaded assets for scripts.
11+
* Used to populate decorated properties in scripts using @visibleAsAsset.
1212
*/
1313
export const scriptAssetsCache = new Map<string, any>();
1414

15+
/**
16+
* Defines the map of all parsers available to parse script assets.
17+
* Some assets may not be needed by the game directly such as navmeshes which require @recast-navigation packages to be included.
18+
* This map allows to register parsers only when needed to profit from tree shaking.
19+
*/
20+
export const scriptAssetsParsers = new Map<string, (parameters: IScriptAssetParserParameters) => Promise<unknown>>();
21+
22+
export interface IScriptAssetParserParameters {
23+
key: string;
24+
rootUrl: string;
25+
scene: Scene;
26+
}
27+
28+
/**
29+
*
30+
* @param extension defines the extension supported by the parser. ie: "navmesh"
31+
* @param parser defines the parser function to parse the asset.
32+
*/
33+
export function registerScriptAssetParser(extension: string, parser: (parameters: IScriptAssetParserParameters) => Promise<unknown>) {
34+
if (scriptAssetsParsers.has(extension)) {
35+
console.warn(`A parser for the extension '${extension}' was already registered. It will be overwritten.`);
36+
}
37+
38+
scriptAssetsParsers.set(extension, parser);
39+
}
40+
1541
/**
1642
* @internal
1743
*/
@@ -56,12 +82,14 @@ export async function _preloadScriptsAssets(rootUrl: string, scene: Scene, scrip
5682
scriptAssetsCache.set(key, new AdvancedAssetContainer(await preloadSceneScriptAsset(key, rootUrl, scene), rootUrl, scriptsMap));
5783
break;
5884

59-
case "navmesh":
60-
scriptAssetsCache.set(key, await preloadNavMeshScriptAsset(key, rootUrl));
61-
break;
62-
6385
default:
64-
scriptAssetsCache.set(key, await preloadCommonScriptAsset(key, rootUrl));
86+
if (scriptAssetsParsers.has(extension!)) {
87+
const parser = scriptAssetsParsers.get(extension!)!;
88+
scriptAssetsCache.set(key, await parser({ key, rootUrl, scene }));
89+
break;
90+
} else {
91+
scriptAssetsCache.set(key, await preloadCommonScriptAsset(key, rootUrl));
92+
}
6593
break;
6694
}
6795
} catch (e) {

tools/src/loading/script/preload/navmesh.ts renamed to tools/src/loading/script/preload/plugins/navmesh.ts

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,13 @@ import { Vector3 } from "@babylonjs/core/Maths/math.vector";
22

33
import { CreateNavigationPluginAsync } from "@babylonjs/addons";
44

5-
export async function preloadNavMeshScriptAsset(key: string, rootUrl: string) {
5+
import { IScriptAssetParserParameters } from "../../preload";
6+
7+
export async function preloadNavMeshScriptAsset(parameters: IScriptAssetParserParameters) {
68
const [configResponse, navmeshResponse, tilesResponse] = await Promise.all([
7-
fetch(`${rootUrl}${key}/config.json`),
8-
fetch(`${rootUrl}${key}/navmesh.bin`),
9-
fetch(`${rootUrl}${key}/tilecache.bin`),
9+
fetch(`${parameters.rootUrl}${parameters.key}/config.json`),
10+
fetch(`${parameters.rootUrl}${parameters.key}/navmesh.bin`),
11+
fetch(`${parameters.rootUrl}${parameters.key}/tilecache.bin`),
1012
]);
1113
const [config, navmeshData, tilesData] = await Promise.all([configResponse.json(), navmeshResponse.arrayBuffer(), tilesResponse.arrayBuffer()]);
1214

0 commit comments

Comments
 (0)