-
Notifications
You must be signed in to change notification settings - Fork 3.4k
/
navMeshWorker.js
46 lines (41 loc) · 1.89 KB
/
navMeshWorker.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
importScripts("https://preview.babylonjs.com/recast.js");
onmessage = function(messageEvent) {
// get message datas
const meshData = messageEvent.data;
const positions = meshData[0];
const offset = meshData[1];
const indices = meshData[2];
const indicesLength = meshData[3];
const parameters = meshData[4];
// initialize Recast
Recast().then((recast) => {
// build rc config from parameters
const rc = new recast.rcConfig();
rc.cs = parameters.cs;
rc.ch = parameters.ch;
rc.borderSize = parameters.borderSize ? parameters.borderSize : 0;
rc.tileSize = parameters.tileSize ? parameters.tileSize : 0;
rc.walkableSlopeAngle = parameters.walkableSlopeAngle;
rc.walkableHeight = parameters.walkableHeight;
rc.walkableClimb = parameters.walkableClimb;
rc.walkableRadius = parameters.walkableRadius;
rc.maxEdgeLen = parameters.maxEdgeLen;
rc.maxSimplificationError = parameters.maxSimplificationError;
rc.minRegionArea = parameters.minRegionArea;
rc.mergeRegionArea = parameters.mergeRegionArea;
rc.maxVertsPerPoly = parameters.maxVertsPerPoly;
rc.detailSampleDist = parameters.detailSampleDist;
rc.detailSampleMaxError = parameters.detailSampleMaxError;
// create navmesh and build it from message datas
const navMesh = new recast.NavMesh();
navMesh.build(positions, offset, indices, indicesLength, rc);
// get recast uint8array
const navmeshData = navMesh.getNavmeshData();
const arrView = new Uint8Array(recast.HEAPU8.buffer, navmeshData.dataPointer, navmeshData.size);
const ret = new Uint8Array(navmeshData.size);
ret.set(arrView);
navMesh.freeNavmeshData(navmeshData);
// job done, returns the result
postMessage(ret);
});
}