Explorar o código

Merge pull request #7800 from CedricGuillemet/recastjsLoadSave

Recastjs load save binary stream
mergify[bot] %!s(int64=5) %!d(string=hai) anos
pai
achega
1096d0c096

A diferenza do arquivo foi suprimida porque é demasiado grande
+ 8 - 8
dist/preview release/recast.js


+ 2 - 0
dist/preview release/what's new.md

@@ -35,6 +35,8 @@
 ### Loaders
 - Added support for glTF mesh instancing extension ([#7521](https://github.com/BabylonJS/Babylon.js/issues/7521)) ([drigax](https://github.com/Drigax))
 
+### Navigation
+- export/load prebuilt binary navigation mesh ([cedricguillemet](https://github.com/cedricguillemet))
 
 ### Materials
 - Added the `roughness` and `albedoScaling` parameters to PBR sheen ([Popov72](https://github.com/Popov72))

+ 12 - 0
src/Navigation/INavigationEngine.ts

@@ -110,6 +110,18 @@ export interface INavigationEnginePlugin {
     getDefaultQueryExtent(): Vector3;
 
     /**
+     * build the navmesh from a previously saved state using getNavmeshData
+     * @param data the Uint8Array returned by getNavmeshData
+     */
+    buildFromNavmeshData(data: Uint8Array): void;
+
+    /**
+     * returns the navmesh data that can be used later. The navmesh must be built before retrieving the data
+     * @returns data the Uint8Array that can be saved and reused
+     */
+    getNavmeshData(): Uint8Array;
+
+    /**
      * Get the Bounding box extent result specified by setDefaultQueryExtent
      * @param result output the box extent values
      */

+ 36 - 0
src/Navigation/Plugins/recastJSPlugin.ts

@@ -282,6 +282,42 @@ export class RecastJSPlugin implements INavigationEnginePlugin {
     }
 
     /**
+     * build the navmesh from a previously saved state using getNavmeshData
+     * @param data the Uint8Array returned by getNavmeshData
+     */
+    buildFromNavmeshData(data: Uint8Array): void
+    {
+        var nDataBytes = data.length * data.BYTES_PER_ELEMENT;
+        var dataPtr = this.bjsRECAST._malloc(nDataBytes);
+
+        var dataHeap = new Uint8Array(this.bjsRECAST.HEAPU8.buffer, dataPtr, nDataBytes);
+        dataHeap.set(data);
+
+        let buf = new this.bjsRECAST.NavmeshData();
+        buf.dataPointer = dataHeap.byteOffset;
+        buf.size = data.length;
+        this.navMesh = new this.bjsRECAST.NavMesh();
+        this.navMesh.buildFromNavmeshData(buf);
+
+        // Free memory
+        this.bjsRECAST._free(dataHeap.byteOffset);
+    }
+
+    /**
+     * returns the navmesh data that can be used later. The navmesh must be built before retrieving the data
+     * @returns data the Uint8Array that can be saved and reused
+     */
+    getNavmeshData(): Uint8Array
+    {
+        let navmeshData = this.navMesh.getNavmeshData();
+        var arrView = new Uint8Array(this.bjsRECAST.HEAPU8.buffer, navmeshData.dataPointer, navmeshData.size);
+        var ret = new Uint8Array(navmeshData.size);
+        ret.set(arrView);
+        this.navMesh.freeNavmeshData(navmeshData);
+        return ret;
+    }
+
+    /**
      * Get the Bounding box extent result specified by setDefaultQueryExtent
      * @param result output the box extent values
      */