@babylonjs/core 7.10.2 → 7.11.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (86) hide show
  1. package/Engines/WebGPU/webgpuShaderProcessorsWGSL.d.ts +3 -0
  2. package/Engines/WebGPU/webgpuShaderProcessorsWGSL.js +4 -2
  3. package/Engines/WebGPU/webgpuShaderProcessorsWGSL.js.map +1 -1
  4. package/Engines/abstractEngine.js +2 -2
  5. package/Engines/abstractEngine.js.map +1 -1
  6. package/Engines/nativeEngine.d.ts +3 -1
  7. package/Engines/nativeEngine.js +2 -1
  8. package/Engines/nativeEngine.js.map +1 -1
  9. package/Engines/thinEngine.d.ts +2 -1
  10. package/Engines/thinEngine.js +2 -4
  11. package/Engines/thinEngine.js.map +1 -1
  12. package/Layers/effectLayer.js +1 -1
  13. package/Layers/effectLayer.js.map +1 -1
  14. package/Lights/Shadows/shadowGenerator.js +1 -1
  15. package/Lights/Shadows/shadowGenerator.js.map +1 -1
  16. package/Loading/sceneLoader.d.ts +20 -11
  17. package/Loading/sceneLoader.js +10 -19
  18. package/Loading/sceneLoader.js.map +1 -1
  19. package/Materials/Node/Blocks/Fragment/imageProcessingBlock.js +5 -3
  20. package/Materials/Node/Blocks/Fragment/imageProcessingBlock.js.map +1 -1
  21. package/Materials/Node/Blocks/Input/inputBlock.js +3 -0
  22. package/Materials/Node/Blocks/Input/inputBlock.js.map +1 -1
  23. package/Materials/Node/Blocks/Particle/particleBlendMultiplyBlock.js +2 -3
  24. package/Materials/Node/Blocks/Particle/particleBlendMultiplyBlock.js.map +1 -1
  25. package/Materials/Node/Blocks/Particle/particleRampGradientBlock.js +6 -11
  26. package/Materials/Node/Blocks/Particle/particleRampGradientBlock.js.map +1 -1
  27. package/Materials/Node/Blocks/Particle/particleTextureBlock.d.ts +1 -2
  28. package/Materials/Node/Blocks/Particle/particleTextureBlock.js +1 -1
  29. package/Materials/Node/Blocks/Particle/particleTextureBlock.js.map +1 -1
  30. package/Materials/Node/nodeMaterial.js +1 -1
  31. package/Materials/Node/nodeMaterial.js.map +1 -1
  32. package/Materials/Node/nodeMaterialBuildState.d.ts +9 -1
  33. package/Materials/Node/nodeMaterialBuildState.js +25 -1
  34. package/Materials/Node/nodeMaterialBuildState.js.map +1 -1
  35. package/Materials/material.d.ts +3 -1
  36. package/Materials/material.js +8 -6
  37. package/Materials/material.js.map +1 -1
  38. package/Meshes/Builders/decalBuilder.js +1 -2
  39. package/Meshes/Builders/decalBuilder.js.map +1 -1
  40. package/Meshes/Node/Blocks/Instances/instantiateOnVolumeBlock.d.ts +10 -0
  41. package/Meshes/Node/Blocks/Instances/instantiateOnVolumeBlock.js +73 -3
  42. package/Meshes/Node/Blocks/Instances/instantiateOnVolumeBlock.js.map +1 -1
  43. package/Meshes/mesh.d.ts +3 -2
  44. package/Meshes/mesh.js +18 -20
  45. package/Meshes/mesh.js.map +1 -1
  46. package/Misc/filesInput.js +13 -0
  47. package/Misc/filesInput.js.map +1 -1
  48. package/Particles/particleSystemComponent.d.ts +3 -1
  49. package/Particles/particleSystemComponent.js +3 -2
  50. package/Particles/particleSystemComponent.js.map +1 -1
  51. package/Physics/v2/IPhysicsEnginePlugin.d.ts +7 -2
  52. package/Physics/v2/IPhysicsEnginePlugin.js.map +1 -1
  53. package/Physics/v2/Plugins/havokPlugin.d.ts +1 -0
  54. package/Physics/v2/Plugins/havokPlugin.js +43 -0
  55. package/Physics/v2/Plugins/havokPlugin.js.map +1 -1
  56. package/Physics/v2/physicsAggregate.js +1 -0
  57. package/Physics/v2/physicsAggregate.js.map +1 -1
  58. package/Physics/v2/physicsShape.d.ts +27 -0
  59. package/Physics/v2/physicsShape.js +39 -0
  60. package/Physics/v2/physicsShape.js.map +1 -1
  61. package/Rendering/depthRenderer.js +1 -1
  62. package/Rendering/depthRenderer.js.map +1 -1
  63. package/Rendering/geometryBufferRenderer.js +2 -5
  64. package/Rendering/geometryBufferRenderer.js.map +1 -1
  65. package/ShadersWGSL/ShadersInclude/fogVertex.d.ts +5 -0
  66. package/ShadersWGSL/ShadersInclude/fogVertex.js +12 -0
  67. package/ShadersWGSL/ShadersInclude/fogVertex.js.map +1 -0
  68. package/ShadersWGSL/ShadersInclude/fogVertexDeclaration.d.ts +5 -0
  69. package/ShadersWGSL/ShadersInclude/fogVertexDeclaration.js +12 -0
  70. package/ShadersWGSL/ShadersInclude/fogVertexDeclaration.js.map +1 -0
  71. package/ShadersWGSL/ShadersInclude/imageProcessingDeclaration.d.ts +5 -0
  72. package/ShadersWGSL/ShadersInclude/imageProcessingDeclaration.js +35 -0
  73. package/ShadersWGSL/ShadersInclude/imageProcessingDeclaration.js.map +1 -0
  74. package/ShadersWGSL/ShadersInclude/imageProcessingFunctions.d.ts +5 -0
  75. package/ShadersWGSL/ShadersInclude/imageProcessingFunctions.js +70 -0
  76. package/ShadersWGSL/ShadersInclude/imageProcessingFunctions.js.map +1 -0
  77. package/ShadersWGSL/ShadersInclude/logDepthDeclaration.d.ts +5 -0
  78. package/ShadersWGSL/ShadersInclude/logDepthDeclaration.js +12 -0
  79. package/ShadersWGSL/ShadersInclude/logDepthDeclaration.js.map +1 -0
  80. package/ShadersWGSL/ShadersInclude/logDepthVertex.d.ts +5 -0
  81. package/ShadersWGSL/ShadersInclude/logDepthVertex.js +12 -0
  82. package/ShadersWGSL/ShadersInclude/logDepthVertex.js.map +1 -0
  83. package/ShadersWGSL/particles.vertex.d.ts +11 -0
  84. package/ShadersWGSL/particles.vertex.js +89 -0
  85. package/ShadersWGSL/particles.vertex.js.map +1 -0
  86. package/package.json +1 -1
@@ -279,6 +279,19 @@ export class FilesInput {
279
279
  });
280
280
  }
281
281
  else {
282
+ if (this._filesToLoad.length === 1) {
283
+ const name = this._filesToLoad[0].name.toLowerCase();
284
+ const extension = name.split(".").pop();
285
+ if (extension) {
286
+ switch (extension.toLowerCase()) {
287
+ case "dds":
288
+ case "env":
289
+ case "hdr": {
290
+ return; // Ignore error in that case
291
+ }
292
+ }
293
+ }
294
+ }
282
295
  Logger.Error("Please provide a valid .babylon file.");
283
296
  }
284
297
  }
@@ -1 +1 @@
1
- {"version":3,"file":"filesInput.js","sourceRoot":"","sources":["../../../../dev/core/src/Misc/filesInput.ts"],"names":[],"mappings":"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","sourcesContent":["import type { AbstractEngine } from \"../Engines/abstractEngine\";\r\nimport type { Scene } from \"../scene\";\r\nimport type { ISceneLoaderProgressEvent } from \"../Loading/sceneLoader\";\r\nimport { SceneLoader } from \"../Loading/sceneLoader\";\r\nimport { Logger } from \"../Misc/logger\";\r\nimport { FilesInputStore } from \"./filesInputStore\";\r\nimport type { Nullable } from \"../types\";\r\n\r\n/**\r\n * Class used to help managing file picking and drag-n-drop\r\n */\r\nexport class FilesInput {\r\n /**\r\n * List of files ready to be loaded\r\n */\r\n public static get FilesToLoad() {\r\n return FilesInputStore.FilesToLoad;\r\n }\r\n\r\n /**\r\n * Callback called when a file is processed\r\n * @returns false to abort the process\r\n */\r\n public onProcessFileCallback: (file: File, name: string, extension: string, setSceneFileToLoad: (sceneFile: File) => void) => boolean = () => {\r\n return true;\r\n };\r\n\r\n /**\r\n * If a loading UI should be displayed while loading a file\r\n */\r\n public displayLoadingUI: boolean = true;\r\n\r\n /**\r\n * Function used when loading the scene file\r\n * @param sceneFile defines the file to load\r\n * @param onProgress onProgress callback called while loading the file\r\n * @returns a promise completing when the load is complete\r\n */\r\n public loadAsync: (sceneFile: File, onProgress: Nullable<(event: ISceneLoaderProgressEvent) => void>) => Promise<Scene> = (sceneFile, onProgress) =>\r\n this.useAppend ? SceneLoader.AppendAsync(\"file:\", sceneFile, this._currentScene, onProgress) : SceneLoader.LoadAsync(\"file:\", sceneFile, this._engine, onProgress);\r\n\r\n private _engine: AbstractEngine;\r\n private _currentScene: Nullable<Scene>;\r\n private _sceneLoadedCallback: Nullable<(sceneFile: File, scene: Scene) => void>;\r\n private _progressCallback: Nullable<(progress: ISceneLoaderProgressEvent) => void>;\r\n private _additionalRenderLoopLogicCallback: Nullable<() => void>;\r\n private _textureLoadingCallback: Nullable<(remaining: number) => void>;\r\n private _startingProcessingFilesCallback: Nullable<(files?: File[]) => void>;\r\n private _onReloadCallback: Nullable<(sceneFile: File) => void>;\r\n private _errorCallback: Nullable<(sceneFile: File, scene: Nullable<Scene>, message: string) => void>;\r\n private _elementToMonitor: HTMLElement;\r\n\r\n private _sceneFileToLoad: File;\r\n private _filesToLoad: File[];\r\n\r\n /**\r\n * Creates a new FilesInput\r\n * @param engine defines the rendering engine\r\n * @param scene defines the hosting scene\r\n * @param sceneLoadedCallback callback called when scene (files provided) is loaded\r\n * @param progressCallback callback called to track progress\r\n * @param additionalRenderLoopLogicCallback callback called to add user logic to the rendering loop\r\n * @param textureLoadingCallback callback called when a texture is loading\r\n * @param startingProcessingFilesCallback callback called when the system is about to process all files\r\n * @param onReloadCallback callback called when a reload is requested\r\n * @param errorCallback callback call if an error occurs\r\n * @param useAppend defines if the file loaded must be appended (true) or have the scene replaced (false, default behavior)\r\n */\r\n constructor(\r\n engine: AbstractEngine,\r\n scene: Nullable<Scene>,\r\n sceneLoadedCallback: Nullable<(sceneFile: File, scene: Scene) => void>,\r\n progressCallback: Nullable<(progress: ISceneLoaderProgressEvent) => void>,\r\n additionalRenderLoopLogicCallback: Nullable<() => void>,\r\n textureLoadingCallback: Nullable<(remaining: number) => void>,\r\n startingProcessingFilesCallback: Nullable<(files?: File[]) => void>,\r\n onReloadCallback: Nullable<(sceneFile: File) => void>,\r\n errorCallback: Nullable<(sceneFile: File, scene: Nullable<Scene>, message: string) => void>,\r\n public readonly useAppend = false\r\n ) {\r\n this._engine = engine;\r\n this._currentScene = scene;\r\n\r\n this._sceneLoadedCallback = sceneLoadedCallback;\r\n this._progressCallback = progressCallback;\r\n this._additionalRenderLoopLogicCallback = additionalRenderLoopLogicCallback;\r\n this._textureLoadingCallback = textureLoadingCallback;\r\n this._startingProcessingFilesCallback = startingProcessingFilesCallback;\r\n this._onReloadCallback = onReloadCallback;\r\n this._errorCallback = errorCallback;\r\n }\r\n\r\n private _dragEnterHandler: (e: any) => void;\r\n private _dragOverHandler: (e: any) => void;\r\n private _dropHandler: (e: any) => void;\r\n\r\n /**\r\n * Calls this function to listen to drag'n'drop events on a specific DOM element\r\n * @param elementToMonitor defines the DOM element to track\r\n */\r\n public monitorElementForDragNDrop(elementToMonitor: HTMLElement): void {\r\n if (elementToMonitor) {\r\n this._elementToMonitor = elementToMonitor;\r\n\r\n this._dragEnterHandler = (e) => {\r\n this._drag(e);\r\n };\r\n this._dragOverHandler = (e) => {\r\n this._drag(e);\r\n };\r\n this._dropHandler = (e) => {\r\n this._drop(e);\r\n };\r\n\r\n this._elementToMonitor.addEventListener(\"dragenter\", this._dragEnterHandler, false);\r\n this._elementToMonitor.addEventListener(\"dragover\", this._dragOverHandler, false);\r\n this._elementToMonitor.addEventListener(\"drop\", this._dropHandler, false);\r\n }\r\n }\r\n\r\n /** Gets the current list of files to load */\r\n public get filesToLoad() {\r\n return this._filesToLoad;\r\n }\r\n\r\n /**\r\n * Release all associated resources\r\n */\r\n public dispose() {\r\n if (!this._elementToMonitor) {\r\n return;\r\n }\r\n\r\n this._elementToMonitor.removeEventListener(\"dragenter\", this._dragEnterHandler);\r\n this._elementToMonitor.removeEventListener(\"dragover\", this._dragOverHandler);\r\n this._elementToMonitor.removeEventListener(\"drop\", this._dropHandler);\r\n }\r\n\r\n private _renderFunction(): void {\r\n if (this._additionalRenderLoopLogicCallback) {\r\n this._additionalRenderLoopLogicCallback();\r\n }\r\n\r\n if (this._currentScene) {\r\n if (this._textureLoadingCallback) {\r\n const remaining = this._currentScene.getWaitingItemsCount();\r\n\r\n if (remaining > 0) {\r\n this._textureLoadingCallback(remaining);\r\n }\r\n }\r\n this._currentScene.render();\r\n }\r\n }\r\n\r\n private _drag(e: DragEvent): void {\r\n e.stopPropagation();\r\n e.preventDefault();\r\n }\r\n\r\n private _drop(eventDrop: DragEvent): void {\r\n eventDrop.stopPropagation();\r\n eventDrop.preventDefault();\r\n\r\n this.loadFiles(eventDrop);\r\n }\r\n\r\n private _traverseFolder(folder: any, files: Array<any>, remaining: { count: number }, callback: () => void) {\r\n const reader = folder.createReader();\r\n const relativePath = folder.fullPath.replace(/^\\//, \"\").replace(/(.+?)\\/?$/, \"$1/\");\r\n reader.readEntries((entries: any) => {\r\n remaining.count += entries.length;\r\n for (const entry of entries) {\r\n if (entry.isFile) {\r\n entry.file((file: any) => {\r\n file.correctName = relativePath + file.name;\r\n files.push(file);\r\n\r\n if (--remaining.count === 0) {\r\n callback();\r\n }\r\n });\r\n } else if (entry.isDirectory) {\r\n this._traverseFolder(entry, files, remaining, callback);\r\n }\r\n }\r\n\r\n if (--remaining.count === 0) {\r\n callback();\r\n }\r\n });\r\n }\r\n\r\n private _processFiles(files: Array<any>): void {\r\n for (let i = 0; i < files.length; i++) {\r\n const name = files[i].correctName.toLowerCase();\r\n const extension = name.split(\".\").pop();\r\n\r\n if (!this.onProcessFileCallback(files[i], name, extension, (sceneFile) => (this._sceneFileToLoad = sceneFile))) {\r\n continue;\r\n }\r\n\r\n if (SceneLoader.IsPluginForExtensionAvailable(\".\" + extension)) {\r\n this._sceneFileToLoad = files[i];\r\n }\r\n\r\n FilesInput.FilesToLoad[name] = files[i];\r\n }\r\n }\r\n\r\n /**\r\n * Load files from a drop event\r\n * @param event defines the drop event to use as source\r\n */\r\n public loadFiles(event: any): void {\r\n // Handling data transfer via drag'n'drop\r\n if (event && event.dataTransfer && event.dataTransfer.files) {\r\n this._filesToLoad = event.dataTransfer.files;\r\n }\r\n\r\n // Handling files from input files\r\n if (event && event.target && event.target.files) {\r\n this._filesToLoad = event.target.files;\r\n }\r\n\r\n if (!this._filesToLoad || this._filesToLoad.length === 0) {\r\n return;\r\n }\r\n\r\n if (this._startingProcessingFilesCallback) {\r\n this._startingProcessingFilesCallback(this._filesToLoad);\r\n }\r\n\r\n if (this._filesToLoad && this._filesToLoad.length > 0) {\r\n const files: File[] = [];\r\n const folders = [];\r\n const items = event.dataTransfer ? event.dataTransfer.items : null;\r\n\r\n for (let i = 0; i < this._filesToLoad.length; i++) {\r\n const fileToLoad: any = this._filesToLoad[i];\r\n const name = fileToLoad.name.toLowerCase();\r\n let entry;\r\n\r\n fileToLoad.correctName = name;\r\n\r\n if (items) {\r\n const item = items[i];\r\n if (item.getAsEntry) {\r\n entry = item.getAsEntry();\r\n } else if (item.webkitGetAsEntry) {\r\n entry = item.webkitGetAsEntry();\r\n }\r\n }\r\n\r\n if (!entry) {\r\n files.push(fileToLoad);\r\n } else {\r\n if (entry.isDirectory) {\r\n folders.push(entry);\r\n } else {\r\n files.push(fileToLoad);\r\n }\r\n }\r\n }\r\n\r\n if (folders.length === 0) {\r\n this._processFiles(files);\r\n this._processReload();\r\n } else {\r\n const remaining = { count: folders.length };\r\n for (const folder of folders) {\r\n this._traverseFolder(folder, files, remaining, () => {\r\n this._processFiles(files);\r\n\r\n if (remaining.count === 0) {\r\n this._processReload();\r\n }\r\n });\r\n }\r\n }\r\n }\r\n }\r\n\r\n private _processReload() {\r\n if (this._onReloadCallback) {\r\n this._onReloadCallback(this._sceneFileToLoad);\r\n } else {\r\n this.reload();\r\n }\r\n }\r\n\r\n /**\r\n * Reload the current scene from the loaded files\r\n */\r\n public reload() {\r\n // If a scene file has been provided\r\n if (this._sceneFileToLoad) {\r\n if (!this.useAppend) {\r\n if (this._currentScene) {\r\n if (Logger.errorsCount > 0) {\r\n Logger.ClearLogCache();\r\n }\r\n this._engine.stopRenderLoop();\r\n }\r\n }\r\n\r\n SceneLoader.ShowLoadingScreen = false;\r\n if (this.displayLoadingUI) {\r\n this._engine.displayLoadingUI();\r\n }\r\n\r\n this.loadAsync(this._sceneFileToLoad, this._progressCallback)\r\n .then((scene) => {\r\n // if appending do nothing\r\n if (!this.useAppend) {\r\n if (this._currentScene) {\r\n this._currentScene.dispose();\r\n }\r\n\r\n this._currentScene = scene;\r\n\r\n // Wait for textures and shaders to be ready\r\n this._currentScene.executeWhenReady(() => {\r\n if (this.displayLoadingUI) {\r\n this._engine.hideLoadingUI();\r\n }\r\n this._engine.runRenderLoop(() => {\r\n this._renderFunction();\r\n });\r\n });\r\n } else {\r\n if (this.displayLoadingUI) {\r\n this._engine.hideLoadingUI();\r\n }\r\n }\r\n if (this._sceneLoadedCallback && this._currentScene) {\r\n this._sceneLoadedCallback(this._sceneFileToLoad, this._currentScene);\r\n }\r\n })\r\n .catch((error) => {\r\n if (this.displayLoadingUI) {\r\n this._engine.hideLoadingUI();\r\n }\r\n if (this._errorCallback) {\r\n this._errorCallback(this._sceneFileToLoad, this._currentScene, error.message);\r\n }\r\n });\r\n } else {\r\n Logger.Error(\"Please provide a valid .babylon file.\");\r\n }\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"filesInput.js","sourceRoot":"","sources":["../../../../dev/core/src/Misc/filesInput.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AACrD,OAAO,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AACxC,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAGpD;;GAEG;AACH,MAAM,OAAO,UAAU;IACnB;;OAEG;IACI,MAAM,KAAK,WAAW;QACzB,OAAO,eAAe,CAAC,WAAW,CAAC;IACvC,CAAC;IAsCD;;;;;;;;;;;;OAYG;IACH,YACI,MAAsB,EACtB,KAAsB,EACtB,mBAAsE,EACtE,gBAAyE,EACzE,iCAAuD,EACvD,sBAA6D,EAC7D,+BAAmE,EACnE,gBAAqD,EACrD,aAA2F,EAC3E,YAAY,KAAK;QAAjB,cAAS,GAAT,SAAS,CAAQ;QA3DrC;;;WAGG;QACI,0BAAqB,GAA4G,GAAG,EAAE;YACzI,OAAO,IAAI,CAAC;QAChB,CAAC,CAAC;QAEF;;WAEG;QACI,qBAAgB,GAAY,IAAI,CAAC;QAExC;;;;;WAKG;QACI,cAAS,GAA0G,CAAC,SAAS,EAAE,UAAU,EAAE,EAAE,CAChJ,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,WAAW,CAAC,WAAW,CAAC,OAAO,EAAE,SAAS,EAAE,IAAI,CAAC,aAAa,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,SAAS,CAAC,OAAO,EAAE,SAAS,EAAE,IAAI,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;QAyCnK,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC;QACtB,IAAI,CAAC,aAAa,GAAG,KAAK,CAAC;QAE3B,IAAI,CAAC,oBAAoB,GAAG,mBAAmB,CAAC;QAChD,IAAI,CAAC,iBAAiB,GAAG,gBAAgB,CAAC;QAC1C,IAAI,CAAC,kCAAkC,GAAG,iCAAiC,CAAC;QAC5E,IAAI,CAAC,uBAAuB,GAAG,sBAAsB,CAAC;QACtD,IAAI,CAAC,gCAAgC,GAAG,+BAA+B,CAAC;QACxE,IAAI,CAAC,iBAAiB,GAAG,gBAAgB,CAAC;QAC1C,IAAI,CAAC,cAAc,GAAG,aAAa,CAAC;IACxC,CAAC;IAMD;;;OAGG;IACI,0BAA0B,CAAC,gBAA6B;QAC3D,IAAI,gBAAgB,EAAE;YAClB,IAAI,CAAC,iBAAiB,GAAG,gBAAgB,CAAC;YAE1C,IAAI,CAAC,iBAAiB,GAAG,CAAC,CAAC,EAAE,EAAE;gBAC3B,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC,CAAC;YACF,IAAI,CAAC,gBAAgB,GAAG,CAAC,CAAC,EAAE,EAAE;gBAC1B,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC,CAAC;YACF,IAAI,CAAC,YAAY,GAAG,CAAC,CAAC,EAAE,EAAE;gBACtB,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC,CAAC;YAEF,IAAI,CAAC,iBAAiB,CAAC,gBAAgB,CAAC,WAAW,EAAE,IAAI,CAAC,iBAAiB,EAAE,KAAK,CAAC,CAAC;YACpF,IAAI,CAAC,iBAAiB,CAAC,gBAAgB,CAAC,UAAU,EAAE,IAAI,CAAC,gBAAgB,EAAE,KAAK,CAAC,CAAC;YAClF,IAAI,CAAC,iBAAiB,CAAC,gBAAgB,CAAC,MAAM,EAAE,IAAI,CAAC,YAAY,EAAE,KAAK,CAAC,CAAC;SAC7E;IACL,CAAC;IAED,6CAA6C;IAC7C,IAAW,WAAW;QAClB,OAAO,IAAI,CAAC,YAAY,CAAC;IAC7B,CAAC;IAED;;OAEG;IACI,OAAO;QACV,IAAI,CAAC,IAAI,CAAC,iBAAiB,EAAE;YACzB,OAAO;SACV;QAED,IAAI,CAAC,iBAAiB,CAAC,mBAAmB,CAAC,WAAW,EAAE,IAAI,CAAC,iBAAiB,CAAC,CAAC;QAChF,IAAI,CAAC,iBAAiB,CAAC,mBAAmB,CAAC,UAAU,EAAE,IAAI,CAAC,gBAAgB,CAAC,CAAC;QAC9E,IAAI,CAAC,iBAAiB,CAAC,mBAAmB,CAAC,MAAM,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC;IAC1E,CAAC;IAEO,eAAe;QACnB,IAAI,IAAI,CAAC,kCAAkC,EAAE;YACzC,IAAI,CAAC,kCAAkC,EAAE,CAAC;SAC7C;QAED,IAAI,IAAI,CAAC,aAAa,EAAE;YACpB,IAAI,IAAI,CAAC,uBAAuB,EAAE;gBAC9B,MAAM,SAAS,GAAG,IAAI,CAAC,aAAa,CAAC,oBAAoB,EAAE,CAAC;gBAE5D,IAAI,SAAS,GAAG,CAAC,EAAE;oBACf,IAAI,CAAC,uBAAuB,CAAC,SAAS,CAAC,CAAC;iBAC3C;aACJ;YACD,IAAI,CAAC,aAAa,CAAC,MAAM,EAAE,CAAC;SAC/B;IACL,CAAC;IAEO,KAAK,CAAC,CAAY;QACtB,CAAC,CAAC,eAAe,EAAE,CAAC;QACpB,CAAC,CAAC,cAAc,EAAE,CAAC;IACvB,CAAC;IAEO,KAAK,CAAC,SAAoB;QAC9B,SAAS,CAAC,eAAe,EAAE,CAAC;QAC5B,SAAS,CAAC,cAAc,EAAE,CAAC;QAE3B,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;IAC9B,CAAC;IAEO,eAAe,CAAC,MAAW,EAAE,KAAiB,EAAE,SAA4B,EAAE,QAAoB;QACtG,MAAM,MAAM,GAAG,MAAM,CAAC,YAAY,EAAE,CAAC;QACrC,MAAM,YAAY,GAAG,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC;QACpF,MAAM,CAAC,WAAW,CAAC,CAAC,OAAY,EAAE,EAAE;YAChC,SAAS,CAAC,KAAK,IAAI,OAAO,CAAC,MAAM,CAAC;YAClC,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE;gBACzB,IAAI,KAAK,CAAC,MAAM,EAAE;oBACd,KAAK,CAAC,IAAI,CAAC,CAAC,IAAS,EAAE,EAAE;wBACrB,IAAI,CAAC,WAAW,GAAG,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC;wBAC5C,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;wBAEjB,IAAI,EAAE,SAAS,CAAC,KAAK,KAAK,CAAC,EAAE;4BACzB,QAAQ,EAAE,CAAC;yBACd;oBACL,CAAC,CAAC,CAAC;iBACN;qBAAM,IAAI,KAAK,CAAC,WAAW,EAAE;oBAC1B,IAAI,CAAC,eAAe,CAAC,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC;iBAC3D;aACJ;YAED,IAAI,EAAE,SAAS,CAAC,KAAK,KAAK,CAAC,EAAE;gBACzB,QAAQ,EAAE,CAAC;aACd;QACL,CAAC,CAAC,CAAC;IACP,CAAC;IAEO,aAAa,CAAC,KAAiB;QACnC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;YACnC,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,WAAW,EAAE,CAAC;YAChD,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC;YAExC,IAAI,CAAC,IAAI,CAAC,qBAAqB,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,gBAAgB,GAAG,SAAS,CAAC,CAAC,EAAE;gBAC5G,SAAS;aACZ;YAED,IAAI,WAAW,CAAC,6BAA6B,CAAC,GAAG,GAAG,SAAS,CAAC,EAAE;gBAC5D,IAAI,CAAC,gBAAgB,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;aACpC;YAED,UAAU,CAAC,WAAW,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;SAC3C;IACL,CAAC;IAED;;;OAGG;IACI,SAAS,CAAC,KAAU;QACvB,yCAAyC;QACzC,IAAI,KAAK,IAAI,KAAK,CAAC,YAAY,IAAI,KAAK,CAAC,YAAY,CAAC,KAAK,EAAE;YACzD,IAAI,CAAC,YAAY,GAAG,KAAK,CAAC,YAAY,CAAC,KAAK,CAAC;SAChD;QAED,kCAAkC;QAClC,IAAI,KAAK,IAAI,KAAK,CAAC,MAAM,IAAI,KAAK,CAAC,MAAM,CAAC,KAAK,EAAE;YAC7C,IAAI,CAAC,YAAY,GAAG,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC;SAC1C;QAED,IAAI,CAAC,IAAI,CAAC,YAAY,IAAI,IAAI,CAAC,YAAY,CAAC,MAAM,KAAK,CAAC,EAAE;YACtD,OAAO;SACV;QAED,IAAI,IAAI,CAAC,gCAAgC,EAAE;YACvC,IAAI,CAAC,gCAAgC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;SAC5D;QAED,IAAI,IAAI,CAAC,YAAY,IAAI,IAAI,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE;YACnD,MAAM,KAAK,GAAW,EAAE,CAAC;YACzB,MAAM,OAAO,GAAG,EAAE,CAAC;YACnB,MAAM,KAAK,GAAG,KAAK,CAAC,YAAY,CAAC,CAAC,CAAC,KAAK,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC;YAEnE,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;gBAC/C,MAAM,UAAU,GAAQ,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;gBAC7C,MAAM,IAAI,GAAG,UAAU,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;gBAC3C,IAAI,KAAK,CAAC;gBAEV,UAAU,CAAC,WAAW,GAAG,IAAI,CAAC;gBAE9B,IAAI,KAAK,EAAE;oBACP,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;oBACtB,IAAI,IAAI,CAAC,UAAU,EAAE;wBACjB,KAAK,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC;qBAC7B;yBAAM,IAAI,IAAI,CAAC,gBAAgB,EAAE;wBAC9B,KAAK,GAAG,IAAI,CAAC,gBAAgB,EAAE,CAAC;qBACnC;iBACJ;gBAED,IAAI,CAAC,KAAK,EAAE;oBACR,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;iBAC1B;qBAAM;oBACH,IAAI,KAAK,CAAC,WAAW,EAAE;wBACnB,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;qBACvB;yBAAM;wBACH,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;qBAC1B;iBACJ;aACJ;YAED,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE;gBACtB,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;gBAC1B,IAAI,CAAC,cAAc,EAAE,CAAC;aACzB;iBAAM;gBACH,MAAM,SAAS,GAAG,EAAE,KAAK,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC;gBAC5C,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE;oBAC1B,IAAI,CAAC,eAAe,CAAC,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,GAAG,EAAE;wBAChD,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;wBAE1B,IAAI,SAAS,CAAC,KAAK,KAAK,CAAC,EAAE;4BACvB,IAAI,CAAC,cAAc,EAAE,CAAC;yBACzB;oBACL,CAAC,CAAC,CAAC;iBACN;aACJ;SACJ;IACL,CAAC;IAEO,cAAc;QAClB,IAAI,IAAI,CAAC,iBAAiB,EAAE;YACxB,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;SACjD;aAAM;YACH,IAAI,CAAC,MAAM,EAAE,CAAC;SACjB;IACL,CAAC;IAED;;OAEG;IACI,MAAM;QACT,oCAAoC;QACpC,IAAI,IAAI,CAAC,gBAAgB,EAAE;YACvB,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE;gBACjB,IAAI,IAAI,CAAC,aAAa,EAAE;oBACpB,IAAI,MAAM,CAAC,WAAW,GAAG,CAAC,EAAE;wBACxB,MAAM,CAAC,aAAa,EAAE,CAAC;qBAC1B;oBACD,IAAI,CAAC,OAAO,CAAC,cAAc,EAAE,CAAC;iBACjC;aACJ;YAED,WAAW,CAAC,iBAAiB,GAAG,KAAK,CAAC;YACtC,IAAI,IAAI,CAAC,gBAAgB,EAAE;gBACvB,IAAI,CAAC,OAAO,CAAC,gBAAgB,EAAE,CAAC;aACnC;YAED,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,gBAAgB,EAAE,IAAI,CAAC,iBAAiB,CAAC;iBACxD,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE;gBACZ,0BAA0B;gBAC1B,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE;oBACjB,IAAI,IAAI,CAAC,aAAa,EAAE;wBACpB,IAAI,CAAC,aAAa,CAAC,OAAO,EAAE,CAAC;qBAChC;oBAED,IAAI,CAAC,aAAa,GAAG,KAAK,CAAC;oBAE3B,4CAA4C;oBAC5C,IAAI,CAAC,aAAa,CAAC,gBAAgB,CAAC,GAAG,EAAE;wBACrC,IAAI,IAAI,CAAC,gBAAgB,EAAE;4BACvB,IAAI,CAAC,OAAO,CAAC,aAAa,EAAE,CAAC;yBAChC;wBACD,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,GAAG,EAAE;4BAC5B,IAAI,CAAC,eAAe,EAAE,CAAC;wBAC3B,CAAC,CAAC,CAAC;oBACP,CAAC,CAAC,CAAC;iBACN;qBAAM;oBACH,IAAI,IAAI,CAAC,gBAAgB,EAAE;wBACvB,IAAI,CAAC,OAAO,CAAC,aAAa,EAAE,CAAC;qBAChC;iBACJ;gBACD,IAAI,IAAI,CAAC,oBAAoB,IAAI,IAAI,CAAC,aAAa,EAAE;oBACjD,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,gBAAgB,EAAE,IAAI,CAAC,aAAa,CAAC,CAAC;iBACxE;YACL,CAAC,CAAC;iBACD,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;gBACb,IAAI,IAAI,CAAC,gBAAgB,EAAE;oBACvB,IAAI,CAAC,OAAO,CAAC,aAAa,EAAE,CAAC;iBAChC;gBACD,IAAI,IAAI,CAAC,cAAc,EAAE;oBACrB,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,gBAAgB,EAAE,IAAI,CAAC,aAAa,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;iBACjF;YACL,CAAC,CAAC,CAAC;SACV;aAAM;YACH,IAAI,IAAI,CAAC,YAAY,CAAC,MAAM,KAAK,CAAC,EAAE;gBAChC,MAAM,IAAI,GAAG,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;gBACrD,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC;gBACxC,IAAI,SAAS,EAAE;oBACX,QAAQ,SAAS,CAAC,WAAW,EAAE,EAAE;wBAC7B,KAAK,KAAK,CAAC;wBACX,KAAK,KAAK,CAAC;wBACX,KAAK,KAAK,CAAC,CAAC;4BACR,OAAO,CAAC,4BAA4B;yBACvC;qBACJ;iBACJ;aACJ;YACD,MAAM,CAAC,KAAK,CAAC,uCAAuC,CAAC,CAAC;SACzD;IACL,CAAC;CACJ","sourcesContent":["import type { AbstractEngine } from \"../Engines/abstractEngine\";\r\nimport type { Scene } from \"../scene\";\r\nimport type { ISceneLoaderProgressEvent } from \"../Loading/sceneLoader\";\r\nimport { SceneLoader } from \"../Loading/sceneLoader\";\r\nimport { Logger } from \"../Misc/logger\";\r\nimport { FilesInputStore } from \"./filesInputStore\";\r\nimport type { Nullable } from \"../types\";\r\n\r\n/**\r\n * Class used to help managing file picking and drag-n-drop\r\n */\r\nexport class FilesInput {\r\n /**\r\n * List of files ready to be loaded\r\n */\r\n public static get FilesToLoad() {\r\n return FilesInputStore.FilesToLoad;\r\n }\r\n\r\n /**\r\n * Callback called when a file is processed\r\n * @returns false to abort the process\r\n */\r\n public onProcessFileCallback: (file: File, name: string, extension: string, setSceneFileToLoad: (sceneFile: File) => void) => boolean = () => {\r\n return true;\r\n };\r\n\r\n /**\r\n * If a loading UI should be displayed while loading a file\r\n */\r\n public displayLoadingUI: boolean = true;\r\n\r\n /**\r\n * Function used when loading the scene file\r\n * @param sceneFile defines the file to load\r\n * @param onProgress onProgress callback called while loading the file\r\n * @returns a promise completing when the load is complete\r\n */\r\n public loadAsync: (sceneFile: File, onProgress: Nullable<(event: ISceneLoaderProgressEvent) => void>) => Promise<Scene> = (sceneFile, onProgress) =>\r\n this.useAppend ? SceneLoader.AppendAsync(\"file:\", sceneFile, this._currentScene, onProgress) : SceneLoader.LoadAsync(\"file:\", sceneFile, this._engine, onProgress);\r\n\r\n private _engine: AbstractEngine;\r\n private _currentScene: Nullable<Scene>;\r\n private _sceneLoadedCallback: Nullable<(sceneFile: File, scene: Scene) => void>;\r\n private _progressCallback: Nullable<(progress: ISceneLoaderProgressEvent) => void>;\r\n private _additionalRenderLoopLogicCallback: Nullable<() => void>;\r\n private _textureLoadingCallback: Nullable<(remaining: number) => void>;\r\n private _startingProcessingFilesCallback: Nullable<(files?: File[]) => void>;\r\n private _onReloadCallback: Nullable<(sceneFile: File) => void>;\r\n private _errorCallback: Nullable<(sceneFile: File, scene: Nullable<Scene>, message: string) => void>;\r\n private _elementToMonitor: HTMLElement;\r\n\r\n private _sceneFileToLoad: File;\r\n private _filesToLoad: File[];\r\n\r\n /**\r\n * Creates a new FilesInput\r\n * @param engine defines the rendering engine\r\n * @param scene defines the hosting scene\r\n * @param sceneLoadedCallback callback called when scene (files provided) is loaded\r\n * @param progressCallback callback called to track progress\r\n * @param additionalRenderLoopLogicCallback callback called to add user logic to the rendering loop\r\n * @param textureLoadingCallback callback called when a texture is loading\r\n * @param startingProcessingFilesCallback callback called when the system is about to process all files\r\n * @param onReloadCallback callback called when a reload is requested\r\n * @param errorCallback callback call if an error occurs\r\n * @param useAppend defines if the file loaded must be appended (true) or have the scene replaced (false, default behavior)\r\n */\r\n constructor(\r\n engine: AbstractEngine,\r\n scene: Nullable<Scene>,\r\n sceneLoadedCallback: Nullable<(sceneFile: File, scene: Scene) => void>,\r\n progressCallback: Nullable<(progress: ISceneLoaderProgressEvent) => void>,\r\n additionalRenderLoopLogicCallback: Nullable<() => void>,\r\n textureLoadingCallback: Nullable<(remaining: number) => void>,\r\n startingProcessingFilesCallback: Nullable<(files?: File[]) => void>,\r\n onReloadCallback: Nullable<(sceneFile: File) => void>,\r\n errorCallback: Nullable<(sceneFile: File, scene: Nullable<Scene>, message: string) => void>,\r\n public readonly useAppend = false\r\n ) {\r\n this._engine = engine;\r\n this._currentScene = scene;\r\n\r\n this._sceneLoadedCallback = sceneLoadedCallback;\r\n this._progressCallback = progressCallback;\r\n this._additionalRenderLoopLogicCallback = additionalRenderLoopLogicCallback;\r\n this._textureLoadingCallback = textureLoadingCallback;\r\n this._startingProcessingFilesCallback = startingProcessingFilesCallback;\r\n this._onReloadCallback = onReloadCallback;\r\n this._errorCallback = errorCallback;\r\n }\r\n\r\n private _dragEnterHandler: (e: any) => void;\r\n private _dragOverHandler: (e: any) => void;\r\n private _dropHandler: (e: any) => void;\r\n\r\n /**\r\n * Calls this function to listen to drag'n'drop events on a specific DOM element\r\n * @param elementToMonitor defines the DOM element to track\r\n */\r\n public monitorElementForDragNDrop(elementToMonitor: HTMLElement): void {\r\n if (elementToMonitor) {\r\n this._elementToMonitor = elementToMonitor;\r\n\r\n this._dragEnterHandler = (e) => {\r\n this._drag(e);\r\n };\r\n this._dragOverHandler = (e) => {\r\n this._drag(e);\r\n };\r\n this._dropHandler = (e) => {\r\n this._drop(e);\r\n };\r\n\r\n this._elementToMonitor.addEventListener(\"dragenter\", this._dragEnterHandler, false);\r\n this._elementToMonitor.addEventListener(\"dragover\", this._dragOverHandler, false);\r\n this._elementToMonitor.addEventListener(\"drop\", this._dropHandler, false);\r\n }\r\n }\r\n\r\n /** Gets the current list of files to load */\r\n public get filesToLoad() {\r\n return this._filesToLoad;\r\n }\r\n\r\n /**\r\n * Release all associated resources\r\n */\r\n public dispose() {\r\n if (!this._elementToMonitor) {\r\n return;\r\n }\r\n\r\n this._elementToMonitor.removeEventListener(\"dragenter\", this._dragEnterHandler);\r\n this._elementToMonitor.removeEventListener(\"dragover\", this._dragOverHandler);\r\n this._elementToMonitor.removeEventListener(\"drop\", this._dropHandler);\r\n }\r\n\r\n private _renderFunction(): void {\r\n if (this._additionalRenderLoopLogicCallback) {\r\n this._additionalRenderLoopLogicCallback();\r\n }\r\n\r\n if (this._currentScene) {\r\n if (this._textureLoadingCallback) {\r\n const remaining = this._currentScene.getWaitingItemsCount();\r\n\r\n if (remaining > 0) {\r\n this._textureLoadingCallback(remaining);\r\n }\r\n }\r\n this._currentScene.render();\r\n }\r\n }\r\n\r\n private _drag(e: DragEvent): void {\r\n e.stopPropagation();\r\n e.preventDefault();\r\n }\r\n\r\n private _drop(eventDrop: DragEvent): void {\r\n eventDrop.stopPropagation();\r\n eventDrop.preventDefault();\r\n\r\n this.loadFiles(eventDrop);\r\n }\r\n\r\n private _traverseFolder(folder: any, files: Array<any>, remaining: { count: number }, callback: () => void) {\r\n const reader = folder.createReader();\r\n const relativePath = folder.fullPath.replace(/^\\//, \"\").replace(/(.+?)\\/?$/, \"$1/\");\r\n reader.readEntries((entries: any) => {\r\n remaining.count += entries.length;\r\n for (const entry of entries) {\r\n if (entry.isFile) {\r\n entry.file((file: any) => {\r\n file.correctName = relativePath + file.name;\r\n files.push(file);\r\n\r\n if (--remaining.count === 0) {\r\n callback();\r\n }\r\n });\r\n } else if (entry.isDirectory) {\r\n this._traverseFolder(entry, files, remaining, callback);\r\n }\r\n }\r\n\r\n if (--remaining.count === 0) {\r\n callback();\r\n }\r\n });\r\n }\r\n\r\n private _processFiles(files: Array<any>): void {\r\n for (let i = 0; i < files.length; i++) {\r\n const name = files[i].correctName.toLowerCase();\r\n const extension = name.split(\".\").pop();\r\n\r\n if (!this.onProcessFileCallback(files[i], name, extension, (sceneFile) => (this._sceneFileToLoad = sceneFile))) {\r\n continue;\r\n }\r\n\r\n if (SceneLoader.IsPluginForExtensionAvailable(\".\" + extension)) {\r\n this._sceneFileToLoad = files[i];\r\n }\r\n\r\n FilesInput.FilesToLoad[name] = files[i];\r\n }\r\n }\r\n\r\n /**\r\n * Load files from a drop event\r\n * @param event defines the drop event to use as source\r\n */\r\n public loadFiles(event: any): void {\r\n // Handling data transfer via drag'n'drop\r\n if (event && event.dataTransfer && event.dataTransfer.files) {\r\n this._filesToLoad = event.dataTransfer.files;\r\n }\r\n\r\n // Handling files from input files\r\n if (event && event.target && event.target.files) {\r\n this._filesToLoad = event.target.files;\r\n }\r\n\r\n if (!this._filesToLoad || this._filesToLoad.length === 0) {\r\n return;\r\n }\r\n\r\n if (this._startingProcessingFilesCallback) {\r\n this._startingProcessingFilesCallback(this._filesToLoad);\r\n }\r\n\r\n if (this._filesToLoad && this._filesToLoad.length > 0) {\r\n const files: File[] = [];\r\n const folders = [];\r\n const items = event.dataTransfer ? event.dataTransfer.items : null;\r\n\r\n for (let i = 0; i < this._filesToLoad.length; i++) {\r\n const fileToLoad: any = this._filesToLoad[i];\r\n const name = fileToLoad.name.toLowerCase();\r\n let entry;\r\n\r\n fileToLoad.correctName = name;\r\n\r\n if (items) {\r\n const item = items[i];\r\n if (item.getAsEntry) {\r\n entry = item.getAsEntry();\r\n } else if (item.webkitGetAsEntry) {\r\n entry = item.webkitGetAsEntry();\r\n }\r\n }\r\n\r\n if (!entry) {\r\n files.push(fileToLoad);\r\n } else {\r\n if (entry.isDirectory) {\r\n folders.push(entry);\r\n } else {\r\n files.push(fileToLoad);\r\n }\r\n }\r\n }\r\n\r\n if (folders.length === 0) {\r\n this._processFiles(files);\r\n this._processReload();\r\n } else {\r\n const remaining = { count: folders.length };\r\n for (const folder of folders) {\r\n this._traverseFolder(folder, files, remaining, () => {\r\n this._processFiles(files);\r\n\r\n if (remaining.count === 0) {\r\n this._processReload();\r\n }\r\n });\r\n }\r\n }\r\n }\r\n }\r\n\r\n private _processReload() {\r\n if (this._onReloadCallback) {\r\n this._onReloadCallback(this._sceneFileToLoad);\r\n } else {\r\n this.reload();\r\n }\r\n }\r\n\r\n /**\r\n * Reload the current scene from the loaded files\r\n */\r\n public reload() {\r\n // If a scene file has been provided\r\n if (this._sceneFileToLoad) {\r\n if (!this.useAppend) {\r\n if (this._currentScene) {\r\n if (Logger.errorsCount > 0) {\r\n Logger.ClearLogCache();\r\n }\r\n this._engine.stopRenderLoop();\r\n }\r\n }\r\n\r\n SceneLoader.ShowLoadingScreen = false;\r\n if (this.displayLoadingUI) {\r\n this._engine.displayLoadingUI();\r\n }\r\n\r\n this.loadAsync(this._sceneFileToLoad, this._progressCallback)\r\n .then((scene) => {\r\n // if appending do nothing\r\n if (!this.useAppend) {\r\n if (this._currentScene) {\r\n this._currentScene.dispose();\r\n }\r\n\r\n this._currentScene = scene;\r\n\r\n // Wait for textures and shaders to be ready\r\n this._currentScene.executeWhenReady(() => {\r\n if (this.displayLoadingUI) {\r\n this._engine.hideLoadingUI();\r\n }\r\n this._engine.runRenderLoop(() => {\r\n this._renderFunction();\r\n });\r\n });\r\n } else {\r\n if (this.displayLoadingUI) {\r\n this._engine.hideLoadingUI();\r\n }\r\n }\r\n if (this._sceneLoadedCallback && this._currentScene) {\r\n this._sceneLoadedCallback(this._sceneFileToLoad, this._currentScene);\r\n }\r\n })\r\n .catch((error) => {\r\n if (this.displayLoadingUI) {\r\n this._engine.hideLoadingUI();\r\n }\r\n if (this._errorCallback) {\r\n this._errorCallback(this._sceneFileToLoad, this._currentScene, error.message);\r\n }\r\n });\r\n } else {\r\n if (this._filesToLoad.length === 1) {\r\n const name = this._filesToLoad[0].name.toLowerCase();\r\n const extension = name.split(\".\").pop();\r\n if (extension) {\r\n switch (extension.toLowerCase()) {\r\n case \"dds\":\r\n case \"env\":\r\n case \"hdr\": {\r\n return; // Ignore error in that case\r\n }\r\n }\r\n }\r\n }\r\n Logger.Error(\"Please provide a valid .babylon file.\");\r\n }\r\n }\r\n}\r\n"]}
@@ -2,6 +2,7 @@ import type { IParticleSystem } from "./IParticleSystem";
2
2
  import type { Effect } from "../Materials/effect";
3
3
  import "../Shaders/particles.vertex";
4
4
  import type { EffectFallbacks } from "../Materials/effectFallbacks";
5
+ import { ShaderLanguage } from "../Materials/shaderLanguage.js";
5
6
  declare module "../Engines/abstractEngine" {
6
7
  interface AbstractEngine {
7
8
  /**
@@ -16,9 +17,10 @@ declare module "../Engines/abstractEngine" {
16
17
  * @param onCompiled defines a function to call when the effect creation is successful
17
18
  * @param onError defines a function to call when the effect creation has failed
18
19
  * @param particleSystem the particle system you want to create the effect for
20
+ * @param shaderLanguage defines the shader language to use
19
21
  * @returns the new Effect
20
22
  */
21
- createEffectForParticles(fragmentName: string, uniformsNames: string[], samplers: string[], defines: string, fallbacks?: EffectFallbacks, onCompiled?: (effect: Effect) => void, onError?: (effect: Effect, errors: string) => void, particleSystem?: IParticleSystem): Effect;
23
+ createEffectForParticles(fragmentName: string, uniformsNames: string[], samplers: string[], defines: string, fallbacks?: EffectFallbacks, onCompiled?: (effect: Effect) => void, onError?: (effect: Effect, errors: string) => void, particleSystem?: IParticleSystem, shaderLanguage?: ShaderLanguage): Effect;
22
24
  }
23
25
  }
24
26
  declare module "../Meshes/mesh" {
@@ -5,6 +5,7 @@ import { ParticleSystem } from "./particleSystem.js";
5
5
  import { SceneComponentConstants } from "../sceneComponent.js";
6
6
  import "../Shaders/particles.vertex.js";
7
7
  import { AbstractEngine } from "../Engines/abstractEngine.js";
8
+ import { ShaderLanguage } from "../Materials/shaderLanguage.js";
8
9
  // Adds the parsers to the scene parsers.
9
10
  AbstractScene.AddParser(SceneComponentConstants.NAME_PARTICLESYSTEM, (parsedData, scene, container, rootUrl) => {
10
11
  const individualParser = AbstractScene.GetIndividualParser(SceneComponentConstants.NAME_PARTICLESYSTEM);
@@ -29,7 +30,7 @@ AbstractScene.AddIndividualParser(SceneComponentConstants.NAME_PARTICLESYSTEM, (
29
30
  return ps;
30
31
  }
31
32
  });
32
- AbstractEngine.prototype.createEffectForParticles = function (fragmentName, uniformsNames = [], samplers = [], defines = "", fallbacks, onCompiled, onError, particleSystem) {
33
+ AbstractEngine.prototype.createEffectForParticles = function (fragmentName, uniformsNames = [], samplers = [], defines = "", fallbacks, onCompiled, onError, particleSystem, shaderLanguage = ShaderLanguage.GLSL) {
33
34
  let attributesNamesOrOptions = [];
34
35
  let effectCreationOption = [];
35
36
  const allSamplers = [];
@@ -54,7 +55,7 @@ AbstractEngine.prototype.createEffectForParticles = function (fragmentName, unif
54
55
  return this.createEffect({
55
56
  vertex: particleSystem?.vertexShaderName ?? "particles",
56
57
  fragmentElement: fragmentName,
57
- }, attributesNamesOrOptions, effectCreationOption.concat(uniformsNames), allSamplers.concat(samplers), defines, fallbacks, onCompiled, onError);
58
+ }, attributesNamesOrOptions, effectCreationOption.concat(uniformsNames), allSamplers.concat(samplers), defines, fallbacks, onCompiled, onError, undefined, shaderLanguage);
58
59
  };
59
60
  Mesh.prototype.getEmittedParticleSystems = function () {
60
61
  const results = [];
@@ -1 +1 @@
1
- {"version":3,"file":"particleSystemComponent.js","sourceRoot":"","sources":["../../../../dev/core/src/Particles/particleSystemComponent.ts"],"names":[],"mappings":"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","sourcesContent":["import { Mesh } from \"../Meshes/mesh\";\r\nimport type { IParticleSystem } from \"./IParticleSystem\";\r\nimport { GPUParticleSystem } from \"./gpuParticleSystem\";\r\nimport { AbstractScene } from \"../abstractScene\";\r\nimport type { Effect } from \"../Materials/effect\";\r\nimport { ParticleSystem } from \"./particleSystem\";\r\nimport type { Scene } from \"../scene\";\r\nimport { SceneComponentConstants } from \"../sceneComponent\";\r\nimport type { AssetContainer } from \"../assetContainer\";\r\nimport \"../Shaders/particles.vertex\";\r\nimport type { EffectFallbacks } from \"../Materials/effectFallbacks\";\r\nimport { AbstractEngine } from \"../Engines/abstractEngine\";\r\n\r\n// Adds the parsers to the scene parsers.\r\nAbstractScene.AddParser(SceneComponentConstants.NAME_PARTICLESYSTEM, (parsedData: any, scene: Scene, container: AssetContainer, rootUrl: string) => {\r\n const individualParser = AbstractScene.GetIndividualParser(SceneComponentConstants.NAME_PARTICLESYSTEM);\r\n\r\n if (!individualParser) {\r\n return;\r\n }\r\n\r\n // Particles Systems\r\n if (parsedData.particleSystems !== undefined && parsedData.particleSystems !== null) {\r\n for (let index = 0, cache = parsedData.particleSystems.length; index < cache; index++) {\r\n const parsedParticleSystem = parsedData.particleSystems[index];\r\n container.particleSystems.push(individualParser(parsedParticleSystem, scene, rootUrl));\r\n }\r\n }\r\n});\r\n\r\nAbstractScene.AddIndividualParser(SceneComponentConstants.NAME_PARTICLESYSTEM, (parsedParticleSystem: any, scene: Scene, rootUrl: string) => {\r\n if (parsedParticleSystem.activeParticleCount) {\r\n const ps = GPUParticleSystem.Parse(parsedParticleSystem, scene, rootUrl);\r\n return ps;\r\n } else {\r\n const ps = ParticleSystem.Parse(parsedParticleSystem, scene, rootUrl);\r\n return ps;\r\n }\r\n});\r\n\r\ndeclare module \"../Engines/abstractEngine\" {\r\n export interface AbstractEngine {\r\n /**\r\n * Create an effect to use with particle systems.\r\n * Please note that some parameters like animation sheets or not being billboard are not supported in this configuration, except if you pass\r\n * the particle system for which you want to create a custom effect in the last parameter\r\n * @param fragmentName defines the base name of the effect (The name of file without .fragment.fx)\r\n * @param uniformsNames defines a list of attribute names\r\n * @param samplers defines an array of string used to represent textures\r\n * @param defines defines the string containing the defines to use to compile the shaders\r\n * @param fallbacks defines the list of potential fallbacks to use if shader compilation fails\r\n * @param onCompiled defines a function to call when the effect creation is successful\r\n * @param onError defines a function to call when the effect creation has failed\r\n * @param particleSystem the particle system you want to create the effect for\r\n * @returns the new Effect\r\n */\r\n createEffectForParticles(\r\n fragmentName: string,\r\n uniformsNames: string[],\r\n samplers: string[],\r\n defines: string,\r\n fallbacks?: EffectFallbacks,\r\n onCompiled?: (effect: Effect) => void,\r\n onError?: (effect: Effect, errors: string) => void,\r\n particleSystem?: IParticleSystem\r\n ): Effect;\r\n }\r\n}\r\n\r\nAbstractEngine.prototype.createEffectForParticles = function (\r\n fragmentName: string,\r\n uniformsNames: string[] = [],\r\n samplers: string[] = [],\r\n defines = \"\",\r\n fallbacks?: EffectFallbacks,\r\n onCompiled?: (effect: Effect) => void,\r\n onError?: (effect: Effect, errors: string) => void,\r\n particleSystem?: IParticleSystem\r\n): Effect {\r\n let attributesNamesOrOptions: Array<string> = [];\r\n let effectCreationOption: Array<string> = [];\r\n const allSamplers: Array<string> = [];\r\n\r\n if (particleSystem) {\r\n particleSystem.fillUniformsAttributesAndSamplerNames(effectCreationOption, attributesNamesOrOptions, allSamplers);\r\n } else {\r\n attributesNamesOrOptions = ParticleSystem._GetAttributeNamesOrOptions();\r\n effectCreationOption = ParticleSystem._GetEffectCreationOptions();\r\n }\r\n\r\n if (defines.indexOf(\" BILLBOARD\") === -1) {\r\n defines += \"\\n#define BILLBOARD\\n\";\r\n }\r\n\r\n if (particleSystem?.isAnimationSheetEnabled) {\r\n if (defines.indexOf(\" ANIMATESHEET\") === -1) {\r\n defines += \"\\n#define ANIMATESHEET\\n\";\r\n }\r\n }\r\n\r\n if (samplers.indexOf(\"diffuseSampler\") === -1) {\r\n samplers.push(\"diffuseSampler\");\r\n }\r\n\r\n return this.createEffect(\r\n {\r\n vertex: particleSystem?.vertexShaderName ?? \"particles\",\r\n fragmentElement: fragmentName,\r\n },\r\n attributesNamesOrOptions,\r\n effectCreationOption.concat(uniformsNames),\r\n allSamplers.concat(samplers),\r\n defines,\r\n fallbacks,\r\n onCompiled,\r\n onError\r\n );\r\n};\r\n\r\ndeclare module \"../Meshes/mesh\" {\r\n export interface Mesh {\r\n /**\r\n * Returns an array populated with IParticleSystem objects whose the mesh is the emitter\r\n * @returns an array of IParticleSystem\r\n */\r\n getEmittedParticleSystems(): IParticleSystem[];\r\n\r\n /**\r\n * Returns an array populated with IParticleSystem objects whose the mesh or its children are the emitter\r\n * @returns an array of IParticleSystem\r\n */\r\n getHierarchyEmittedParticleSystems(): IParticleSystem[];\r\n }\r\n}\r\n\r\nMesh.prototype.getEmittedParticleSystems = function (): IParticleSystem[] {\r\n const results: IParticleSystem[] = [];\r\n for (let index = 0; index < this.getScene().particleSystems.length; index++) {\r\n const particleSystem = this.getScene().particleSystems[index];\r\n if (particleSystem.emitter === this) {\r\n results.push(particleSystem);\r\n }\r\n }\r\n return results;\r\n};\r\n\r\nMesh.prototype.getHierarchyEmittedParticleSystems = function (): IParticleSystem[] {\r\n const results: IParticleSystem[] = [];\r\n const descendants = this.getDescendants();\r\n descendants.push(this);\r\n\r\n for (let index = 0; index < this.getScene().particleSystems.length; index++) {\r\n const particleSystem = this.getScene().particleSystems[index];\r\n const emitter: any = particleSystem.emitter;\r\n\r\n if (emitter.position && descendants.indexOf(emitter) !== -1) {\r\n results.push(particleSystem);\r\n }\r\n }\r\n\r\n return results;\r\n};\r\n"]}
1
+ {"version":3,"file":"particleSystemComponent.js","sourceRoot":"","sources":["../../../../dev/core/src/Particles/particleSystemComponent.ts"],"names":[],"mappings":"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","sourcesContent":["import { Mesh } from \"../Meshes/mesh\";\r\nimport type { IParticleSystem } from \"./IParticleSystem\";\r\nimport { GPUParticleSystem } from \"./gpuParticleSystem\";\r\nimport { AbstractScene } from \"../abstractScene\";\r\nimport type { Effect } from \"../Materials/effect\";\r\nimport { ParticleSystem } from \"./particleSystem\";\r\nimport type { Scene } from \"../scene\";\r\nimport { SceneComponentConstants } from \"../sceneComponent\";\r\nimport type { AssetContainer } from \"../assetContainer\";\r\nimport \"../Shaders/particles.vertex\";\r\nimport type { EffectFallbacks } from \"../Materials/effectFallbacks\";\r\nimport { AbstractEngine } from \"../Engines/abstractEngine\";\r\nimport { ShaderLanguage } from \"core/Materials/shaderLanguage\";\r\n\r\n// Adds the parsers to the scene parsers.\r\nAbstractScene.AddParser(SceneComponentConstants.NAME_PARTICLESYSTEM, (parsedData: any, scene: Scene, container: AssetContainer, rootUrl: string) => {\r\n const individualParser = AbstractScene.GetIndividualParser(SceneComponentConstants.NAME_PARTICLESYSTEM);\r\n\r\n if (!individualParser) {\r\n return;\r\n }\r\n\r\n // Particles Systems\r\n if (parsedData.particleSystems !== undefined && parsedData.particleSystems !== null) {\r\n for (let index = 0, cache = parsedData.particleSystems.length; index < cache; index++) {\r\n const parsedParticleSystem = parsedData.particleSystems[index];\r\n container.particleSystems.push(individualParser(parsedParticleSystem, scene, rootUrl));\r\n }\r\n }\r\n});\r\n\r\nAbstractScene.AddIndividualParser(SceneComponentConstants.NAME_PARTICLESYSTEM, (parsedParticleSystem: any, scene: Scene, rootUrl: string) => {\r\n if (parsedParticleSystem.activeParticleCount) {\r\n const ps = GPUParticleSystem.Parse(parsedParticleSystem, scene, rootUrl);\r\n return ps;\r\n } else {\r\n const ps = ParticleSystem.Parse(parsedParticleSystem, scene, rootUrl);\r\n return ps;\r\n }\r\n});\r\n\r\ndeclare module \"../Engines/abstractEngine\" {\r\n export interface AbstractEngine {\r\n /**\r\n * Create an effect to use with particle systems.\r\n * Please note that some parameters like animation sheets or not being billboard are not supported in this configuration, except if you pass\r\n * the particle system for which you want to create a custom effect in the last parameter\r\n * @param fragmentName defines the base name of the effect (The name of file without .fragment.fx)\r\n * @param uniformsNames defines a list of attribute names\r\n * @param samplers defines an array of string used to represent textures\r\n * @param defines defines the string containing the defines to use to compile the shaders\r\n * @param fallbacks defines the list of potential fallbacks to use if shader compilation fails\r\n * @param onCompiled defines a function to call when the effect creation is successful\r\n * @param onError defines a function to call when the effect creation has failed\r\n * @param particleSystem the particle system you want to create the effect for\r\n * @param shaderLanguage defines the shader language to use\r\n * @returns the new Effect\r\n */\r\n createEffectForParticles(\r\n fragmentName: string,\r\n uniformsNames: string[],\r\n samplers: string[],\r\n defines: string,\r\n fallbacks?: EffectFallbacks,\r\n onCompiled?: (effect: Effect) => void,\r\n onError?: (effect: Effect, errors: string) => void,\r\n particleSystem?: IParticleSystem,\r\n shaderLanguage?: ShaderLanguage\r\n ): Effect;\r\n }\r\n}\r\n\r\nAbstractEngine.prototype.createEffectForParticles = function (\r\n fragmentName: string,\r\n uniformsNames: string[] = [],\r\n samplers: string[] = [],\r\n defines = \"\",\r\n fallbacks?: EffectFallbacks,\r\n onCompiled?: (effect: Effect) => void,\r\n onError?: (effect: Effect, errors: string) => void,\r\n particleSystem?: IParticleSystem,\r\n shaderLanguage = ShaderLanguage.GLSL\r\n): Effect {\r\n let attributesNamesOrOptions: Array<string> = [];\r\n let effectCreationOption: Array<string> = [];\r\n const allSamplers: Array<string> = [];\r\n\r\n if (particleSystem) {\r\n particleSystem.fillUniformsAttributesAndSamplerNames(effectCreationOption, attributesNamesOrOptions, allSamplers);\r\n } else {\r\n attributesNamesOrOptions = ParticleSystem._GetAttributeNamesOrOptions();\r\n effectCreationOption = ParticleSystem._GetEffectCreationOptions();\r\n }\r\n\r\n if (defines.indexOf(\" BILLBOARD\") === -1) {\r\n defines += \"\\n#define BILLBOARD\\n\";\r\n }\r\n\r\n if (particleSystem?.isAnimationSheetEnabled) {\r\n if (defines.indexOf(\" ANIMATESHEET\") === -1) {\r\n defines += \"\\n#define ANIMATESHEET\\n\";\r\n }\r\n }\r\n\r\n if (samplers.indexOf(\"diffuseSampler\") === -1) {\r\n samplers.push(\"diffuseSampler\");\r\n }\r\n\r\n return this.createEffect(\r\n {\r\n vertex: particleSystem?.vertexShaderName ?? \"particles\",\r\n fragmentElement: fragmentName,\r\n },\r\n attributesNamesOrOptions,\r\n effectCreationOption.concat(uniformsNames),\r\n allSamplers.concat(samplers),\r\n defines,\r\n fallbacks,\r\n onCompiled,\r\n onError,\r\n undefined,\r\n shaderLanguage\r\n );\r\n};\r\n\r\ndeclare module \"../Meshes/mesh\" {\r\n export interface Mesh {\r\n /**\r\n * Returns an array populated with IParticleSystem objects whose the mesh is the emitter\r\n * @returns an array of IParticleSystem\r\n */\r\n getEmittedParticleSystems(): IParticleSystem[];\r\n\r\n /**\r\n * Returns an array populated with IParticleSystem objects whose the mesh or its children are the emitter\r\n * @returns an array of IParticleSystem\r\n */\r\n getHierarchyEmittedParticleSystems(): IParticleSystem[];\r\n }\r\n}\r\n\r\nMesh.prototype.getEmittedParticleSystems = function (): IParticleSystem[] {\r\n const results: IParticleSystem[] = [];\r\n for (let index = 0; index < this.getScene().particleSystems.length; index++) {\r\n const particleSystem = this.getScene().particleSystems[index];\r\n if (particleSystem.emitter === this) {\r\n results.push(particleSystem);\r\n }\r\n }\r\n return results;\r\n};\r\n\r\nMesh.prototype.getHierarchyEmittedParticleSystems = function (): IParticleSystem[] {\r\n const results: IParticleSystem[] = [];\r\n const descendants = this.getDescendants();\r\n descendants.push(this);\r\n\r\n for (let index = 0; index < this.getScene().particleSystems.length; index++) {\r\n const particleSystem = this.getScene().particleSystems[index];\r\n const emitter: any = particleSystem.emitter;\r\n\r\n if (emitter.position && descendants.indexOf(emitter) !== -1) {\r\n results.push(particleSystem);\r\n }\r\n }\r\n\r\n return results;\r\n};\r\n"]}
@@ -7,8 +7,9 @@ import type { BoundingBox } from "../../Culling/boundingBox";
7
7
  import type { TransformNode } from "../../Meshes/transformNode";
8
8
  import type { PhysicsMaterial } from "./physicsMaterial";
9
9
  import type { Mesh } from "../../Meshes/mesh";
10
- import type { Nullable } from "../../types.js";
11
- import type { Observable } from "../../Misc/observable.js";
10
+ import type { Nullable } from "../../types";
11
+ import type { Observable } from "../../Misc/observable";
12
+ import type { GroundMesh } from "../../Meshes/groundMesh";
12
13
  /** How a specific axis can be constrained */
13
14
  export declare enum PhysicsConstraintAxisLimitMode {
14
15
  FREE = 0,
@@ -182,6 +183,10 @@ export interface PhysicsShapeParameters {
182
183
  * The data for the heightfield
183
184
  */
184
185
  heightFieldData?: Float32Array;
186
+ /**
187
+ * Ground mesh used for display
188
+ */
189
+ groundMesh?: GroundMesh;
185
190
  }
186
191
  /**
187
192
  * Parameters used to describe a Constraint
@@ -1 +1 @@
1
- {"version":3,"file":"IPhysicsEnginePlugin.js","sourceRoot":"","sources":["../../../../../dev/core/src/Physics/v2/IPhysicsEnginePlugin.ts"],"names":[],"mappings":"AAYA,6CAA6C;AAC7C,MAAM,CAAN,IAAY,8BAaX;AAbD,WAAY,8BAA8B;IACtC;;OAEG;IACH,mFAAI,CAAA;IACJ;;OAEG;IACH,yFAAO,CAAA;IACP;;OAEG;IACH,uFAAM,CAAA;AACV,CAAC,EAbW,8BAA8B,KAA9B,8BAA8B,QAazC;AAED,2GAA2G;AAC3G,MAAM,CAAN,IAAY,qBAqCX;AArCD,WAAY,qBAAqB;IAC7B;;;OAGG;IACH,yEAAQ,CAAA;IACR;;;OAGG;IACH,yEAAQ,CAAA;IACR;;;OAGG;IACH,yEAAQ,CAAA;IACR;;;OAGG;IACH,2EAAS,CAAA;IACT;;;OAGG;IACH,2EAAS,CAAA;IACT;;;OAGG;IACH,2EAAS,CAAA;IACT;;;;OAIG;IACH,uFAAe,CAAA;AACnB,CAAC,EArCW,qBAAqB,KAArB,qBAAqB,QAqChC;AAED,yBAAyB;AACzB,MAAM,CAAN,IAAY,qBAsCX;AAtCD,WAAY,qBAAqB;IAC7B;;;OAGG;IACH,uFAAmB,CAAA;IACnB;;;OAGG;IACH,yEAAY,CAAA;IACZ;;;OAGG;IACH,mEAAS,CAAA;IACT;;;;OAIG;IACH,qEAAU,CAAA;IACV;;;OAGG;IACH,iEAAQ,CAAA;IACR;;;OAGG;IACH,2EAAa,CAAA;IACb;;;;OAIG;IACH,uEAAW,CAAA;AACf,CAAC,EAtCW,qBAAqB,KAArB,qBAAqB,QAsChC;AAED,oBAAoB;AACpB,MAAM,CAAN,IAAY,gBASX;AATD,WAAY,gBAAgB;IACxB,2DAAM,CAAA;IACN,6DAAO,CAAA;IACP,+DAAQ,CAAA;IACR,qDAAG,CAAA;IACH,qEAAW,CAAA;IACX,iEAAS,CAAA;IACT,uDAAI,CAAA;IACJ,qEAAW,CAAA;AACf,CAAC,EATW,gBAAgB,KAAhB,gBAAgB,QAS3B;AAED,qGAAqG;AACrG,MAAM,CAAN,IAAY,0BAIX;AAJD,WAAY,0BAA0B;IAClC,2EAAI,CAAA;IACJ,mFAAQ,CAAA;IACR,mFAAQ,CAAA;AACZ,CAAC,EAJW,0BAA0B,KAA1B,0BAA0B,QAIrC;AAED,MAAM,CAAN,IAAY,gBAMX;AAND,WAAY,gBAAgB;IACxB,2DAAuC,CAAA;IACvC,+DAA2C,CAAA;IAC3C,6DAAyC,CAAA;IACzC,uDAAmC,CAAA;IACnC,qDAAiC,CAAA;AACrC,CAAC,EANW,gBAAgB,KAAhB,gBAAgB,QAM3B;AA6MD;;GAEG;AACH,MAAM,CAAN,IAAY,iBAIX;AAJD,WAAY,iBAAiB;IACzB,6DAAM,CAAA;IACN,iEAAQ,CAAA;IACR,+DAAO,CAAA;AACX,CAAC,EAJW,iBAAiB,KAAjB,iBAAiB,QAI5B;AAED;;GAEG;AACH,MAAM,CAAN,IAAY,wBAIX;AAJD,WAAY,wBAAwB;IAChC,yGAAqB,CAAA;IACrB,yFAAa,CAAA;IACb,6FAAe,CAAA;AACnB,CAAC,EAJW,wBAAwB,KAAxB,wBAAwB,QAInC","sourcesContent":["import type { Vector3, Quaternion } from \"../../Maths/math.vector\";\r\nimport type { IRaycastQuery, PhysicsRaycastResult } from \"../physicsRaycastResult\";\r\nimport type { PhysicsBody } from \"./physicsBody\";\r\nimport type { PhysicsShape } from \"./physicsShape\";\r\nimport type { PhysicsConstraint } from \"./physicsConstraint\";\r\nimport type { BoundingBox } from \"../../Culling/boundingBox\";\r\nimport type { TransformNode } from \"../../Meshes/transformNode\";\r\nimport type { PhysicsMaterial } from \"./physicsMaterial\";\r\nimport type { Mesh } from \"../../Meshes/mesh\";\r\nimport type { Nullable } from \"core/types\";\r\nimport type { Observable } from \"core/Misc/observable\";\r\n\r\n/** How a specific axis can be constrained */\r\nexport enum PhysicsConstraintAxisLimitMode {\r\n /*\r\n * The axis is not restricted at all\r\n */\r\n FREE,\r\n /*\r\n * The axis has a minimum/maximum limit\r\n */\r\n LIMITED,\r\n /*\r\n * The axis allows no relative movement of the pivots\r\n */\r\n LOCKED,\r\n}\r\n\r\n/** The constraint specific axis to use when setting Friction, `ConstraintAxisLimitMode`, max force, ... */\r\nexport enum PhysicsConstraintAxis {\r\n /*\r\n * Translation along the primary axis of the constraint (i.e. the\r\n * direction specified by PhysicsConstraintParameters.axisA/axisB)\r\n */\r\n LINEAR_X,\r\n /*\r\n * Translation along the second axis of the constraint (i.e. the\r\n * direction specified by PhysicsConstraintParameters.perpAxisA/perpAxisB)\r\n */\r\n LINEAR_Y,\r\n /*\r\n * Translation along the third axis of the constraint. This axis is\r\n * computed from the cross product of axisA/axisB and perpAxisA/perpAxisB)\r\n */\r\n LINEAR_Z,\r\n /*\r\n * Rotation around the primary axis of the constraint (i.e. the\r\n * axis specified by PhysicsConstraintParameters.axisA/axisB)\r\n */\r\n ANGULAR_X,\r\n /*\r\n * Rotation around the second axis of the constraint (i.e. the\r\n * axis specified by PhysicsConstraintParameters.perpAxisA/perpAxisB)\r\n */\r\n ANGULAR_Y,\r\n /*\r\n * Rotation around the third axis of the constraint. This axis is\r\n * computed from the cross product of axisA/axisB and perpAxisA/perpAxisB)\r\n */\r\n ANGULAR_Z,\r\n /*\r\n * A 3D distance limit; similar to specifying the LINEAR_X/Y/Z axes\r\n * individually, but the distance calculation uses all three axes\r\n * simultaneously, instead of individually.\r\n */\r\n LINEAR_DISTANCE,\r\n}\r\n\r\n/** Type of Constraint */\r\nexport enum PhysicsConstraintType {\r\n /**\r\n * A ball and socket constraint will attempt to line up the pivot\r\n * positions in each body, and have no restrictions on rotation\r\n */\r\n BALL_AND_SOCKET = 1,\r\n /**\r\n * A distance constraint will attempt to keep the pivot locations\r\n * within a specified distance.\r\n */\r\n DISTANCE = 2,\r\n /**\r\n * A hinge constraint will keep the pivot positions aligned as well\r\n * as two angular axes. The remaining angular axis will be free to rotate.\r\n */\r\n HINGE = 3,\r\n /**\r\n * A slider constraint allows bodies to translate along one axis and\r\n * rotate about the same axis. The remaining two axes are locked in\r\n * place\r\n */\r\n SLIDER = 4,\r\n /**\r\n * A lock constraint will attempt to keep the pivots completely lined\r\n * up between both bodies, allowing no relative movement.\r\n */\r\n LOCK = 5,\r\n /*\r\n * A prismatic will lock the rotations of the bodies, and allow translation\r\n * only along one axis\r\n */\r\n PRISMATIC = 6,\r\n /*\r\n * A generic constraint; this starts with no limits on how the bodies can\r\n * move relative to each other, but limits can be added via the PhysicsConstraint\r\n * interfaces. This can be used to specify a large variety of constraints\r\n */\r\n SIX_DOF = 7,\r\n}\r\n\r\n/** Type of Shape */\r\nexport enum PhysicsShapeType {\r\n SPHERE,\r\n CAPSULE,\r\n CYLINDER,\r\n BOX,\r\n CONVEX_HULL,\r\n CONTAINER,\r\n MESH,\r\n HEIGHTFIELD,\r\n}\r\n\r\n/** Optional motor which attempts to move a body at a specific velocity, or at a specific position */\r\nexport enum PhysicsConstraintMotorType {\r\n NONE,\r\n VELOCITY,\r\n POSITION,\r\n}\r\n\r\nexport enum PhysicsEventType {\r\n COLLISION_STARTED = \"COLLISION_STARTED\",\r\n COLLISION_CONTINUED = \"COLLISION_CONTINUED\",\r\n COLLISION_FINISHED = \"COLLISION_FINISHED\",\r\n TRIGGER_ENTERED = \"TRIGGER_ENTERED\",\r\n TRIGGER_EXITED = \"TRIGGER_EXITED\",\r\n}\r\n\r\n/**\r\n * Base collision object\r\n */\r\nexport interface IBasePhysicsCollisionEvent {\r\n /**\r\n * 1st physics body that collided\r\n */\r\n collider: PhysicsBody;\r\n /**\r\n * 2nd physics body that collided\r\n */\r\n collidedAgainst: PhysicsBody;\r\n /**\r\n * index in instances array for the collider\r\n */\r\n colliderIndex: number;\r\n /**\r\n * index in instances array for the collidedAgainst\r\n */\r\n collidedAgainstIndex: number;\r\n /**\r\n * Event type\r\n */\r\n type: PhysicsEventType;\r\n}\r\n\r\n/**\r\n * Collision object that is the parameter when notification for collision fires.\r\n */\r\nexport interface IPhysicsCollisionEvent extends IBasePhysicsCollisionEvent {\r\n /**\r\n * World position where the collision occured\r\n */\r\n point: Nullable<Vector3>;\r\n /**\r\n * Penetration distance\r\n */\r\n distance: number;\r\n /**\r\n * Impulse value computed by the solver response\r\n */\r\n impulse: number;\r\n /**\r\n * Collision world normal direction\r\n */\r\n normal: Nullable<Vector3>;\r\n}\r\n\r\n/**\r\n * Parameters used to describe the Shape\r\n */\r\nexport interface PhysicsShapeParameters {\r\n /**\r\n * Shape center position\r\n */\r\n center?: Vector3;\r\n /**\r\n * Radius for cylinder, shape and capsule\r\n */\r\n radius?: number;\r\n /**\r\n * First point position that defines the cylinder or capsule\r\n */\r\n pointA?: Vector3;\r\n /**\r\n * Second point position that defines the cylinder or capsule\r\n */\r\n pointB?: Vector3;\r\n /**\r\n * Shape orientation\r\n */\r\n rotation?: Quaternion;\r\n /**\r\n * Dimesion extention for the box\r\n */\r\n extents?: Vector3;\r\n /**\r\n * Mesh used for Mesh shape or convex hull. It can be different than the mesh the body is attached to.\r\n */\r\n mesh?: Mesh;\r\n /**\r\n * Use children hierarchy\r\n */\r\n includeChildMeshes?: boolean;\r\n /**\r\n * The size of the heightfield in the X axis\r\n */\r\n heightFieldSizeX?: number;\r\n /**\r\n * The size of the heightfield in the Z axis\r\n */\r\n heightFieldSizeZ?: number;\r\n /**\r\n * The number of samples along the X axis\r\n */\r\n numHeightFieldSamplesX?: number;\r\n /**\r\n * The number of samples along the Z axis\r\n */\r\n numHeightFieldSamplesZ?: number;\r\n /**\r\n * The data for the heightfield\r\n */\r\n heightFieldData?: Float32Array;\r\n}\r\n\r\n/**\r\n * Parameters used to describe a Constraint\r\n */\r\nexport interface PhysicsConstraintParameters {\r\n /**\r\n * Location of the constraint pivot in the space of first body\r\n */\r\n pivotA?: Vector3;\r\n /**\r\n * Location of the constraint pivot in the space of the second body\r\n */\r\n pivotB?: Vector3;\r\n /**\r\n * An axis in the space of the first body which determines how\r\n * distances/angles are measured for LINEAR_X/ANGULAR_X limits.\r\n */\r\n axisA?: Vector3;\r\n /**\r\n * An axis in the space of the second body which determines how\r\n * distances/angles are measured for LINEAR_X/ANGULAR_X limits.\r\n */\r\n axisB?: Vector3;\r\n\r\n /**\r\n * An axis in the space of the first body which determines how\r\n * distances/angles are measured for LINEAR_Y/ANGULAR_Y limits.\r\n */\r\n perpAxisA?: Vector3;\r\n\r\n /**\r\n * An axis in the space of the second body which determines how\r\n * distances/angles are measured for LINEAR_Y/ANGULAR_Y limits.\r\n */\r\n perpAxisB?: Vector3;\r\n\r\n /**\r\n * The maximum distance that can seperate the two pivots.\r\n * Only used for DISTANCE constraints\r\n */\r\n maxDistance?: number;\r\n\r\n /**\r\n * Determines if the connected bodies should collide. Generally,\r\n * it is preferable to set this to false, especially if the constraint\r\n * positions the bodies so that they overlap. Otherwise, the constraint\r\n * will \"fight\" the collision detection and may cause jitter.\r\n */\r\n collision?: boolean;\r\n}\r\n\r\n/**\r\n * Parameters used to describe mass and inertia of the Physics Body\r\n */\r\nexport interface PhysicsMassProperties {\r\n /**\r\n * The center of mass, in local space. This is The\r\n * point the body will rotate around when applying\r\n * an angular velocity.\r\n *\r\n * If not provided, the physics engine will compute\r\n * an appropriate value.\r\n */\r\n centerOfMass?: Vector3;\r\n /**\r\n * The total mass of this object, in kilograms. This\r\n * affects how easy it is to move the body. A value\r\n * of zero will be used as an infinite mass.\r\n *\r\n * If not provided, the physics engine will compute\r\n * an appropriate value.\r\n */\r\n mass?: number;\r\n /**\r\n * The principal moments of inertia of this object\r\n * for a unit mass. This determines how easy it is\r\n * for the body to rotate. A value of zero on any\r\n * axis will be used as infinite interia about that\r\n * axis.\r\n *\r\n * If not provided, the physics engine will compute\r\n * an appropriate value.\r\n */\r\n inertia?: Vector3;\r\n /**\r\n * The rotation rotating from inertia major axis space\r\n * to parent space (i.e., the rotation which, when\r\n * applied to the 3x3 inertia tensor causes the inertia\r\n * tensor to become a diagonal matrix). This determines\r\n * how the values of inertia are aligned with the parent\r\n * object.\r\n *\r\n * If not provided, the physics engine will compute\r\n * an appropriate value.\r\n */\r\n inertiaOrientation?: Quaternion;\r\n}\r\n\r\n/**\r\n * Indicates how the body will behave.\r\n */\r\nexport enum PhysicsMotionType {\r\n STATIC,\r\n ANIMATED,\r\n DYNAMIC,\r\n}\r\n\r\n/**\r\n * Controls the body sleep mode.\r\n */\r\nexport enum PhysicsActivationControl {\r\n SIMULATION_CONTROLLED,\r\n ALWAYS_ACTIVE,\r\n ALWAYS_INACTIVE,\r\n}\r\n\r\n/**\r\n * Represents a pair of bodies connected by a constraint.\r\n */\r\nexport type ConstrainedBodyPair = { parentBody: PhysicsBody; parentBodyIndex: number; childBody: PhysicsBody; childBodyIndex: number };\r\n\r\n/** @internal */\r\nexport interface IPhysicsEnginePluginV2 {\r\n /**\r\n * Physics plugin world instance\r\n */\r\n world: any;\r\n /**\r\n * Physics plugin name\r\n */\r\n name: string;\r\n\r\n /**\r\n * Collision observable\r\n */\r\n onCollisionObservable: Observable<IPhysicsCollisionEvent>;\r\n /**\r\n * Collision ended observable\r\n */\r\n onCollisionEndedObservable: Observable<IBasePhysicsCollisionEvent>;\r\n /**\r\n * Trigger observable\r\n */\r\n onTriggerCollisionObservable: Observable<IBasePhysicsCollisionEvent>;\r\n\r\n setGravity(gravity: Vector3): void;\r\n setTimeStep(timeStep: number): void;\r\n getTimeStep(): number;\r\n executeStep(delta: number, bodies: Array<PhysicsBody>): void; //not forgetting pre and post events\r\n getPluginVersion(): number;\r\n setVelocityLimits(maxLinearVelocity: number, maxAngularVelocity: number): void;\r\n getMaxLinearVelocity(): number;\r\n getMaxAngularVelocity(): number;\r\n\r\n // body\r\n initBody(body: PhysicsBody, motionType: PhysicsMotionType, position: Vector3, orientation: Quaternion): void;\r\n initBodyInstances(body: PhysicsBody, motionType: PhysicsMotionType, mesh: Mesh): void;\r\n updateBodyInstances(body: PhysicsBody, mesh: Mesh): void;\r\n removeBody(body: PhysicsBody): void;\r\n sync(body: PhysicsBody): void;\r\n syncTransform(body: PhysicsBody, transformNode: TransformNode): void;\r\n setShape(body: PhysicsBody, shape: Nullable<PhysicsShape>): void;\r\n getShape(body: PhysicsBody): Nullable<PhysicsShape>;\r\n getShapeType(shape: PhysicsShape): PhysicsShapeType;\r\n setEventMask(body: PhysicsBody, eventMask: number, instanceIndex?: number): void;\r\n getEventMask(body: PhysicsBody, instanceIndex?: number): number;\r\n setMotionType(body: PhysicsBody, motionType: PhysicsMotionType, instanceIndex?: number): void;\r\n getMotionType(body: PhysicsBody, instanceIndex?: number): PhysicsMotionType;\r\n computeMassProperties(body: PhysicsBody, instanceIndex?: number): PhysicsMassProperties;\r\n setMassProperties(body: PhysicsBody, massProps: PhysicsMassProperties, instanceIndex?: number): void;\r\n getMassProperties(body: PhysicsBody, instanceIndex?: number): PhysicsMassProperties;\r\n setLinearDamping(body: PhysicsBody, damping: number, instanceIndex?: number): void;\r\n getLinearDamping(body: PhysicsBody, instanceIndex?: number): number;\r\n setAngularDamping(body: PhysicsBody, damping: number, instanceIndex?: number): void;\r\n getAngularDamping(body: PhysicsBody, instanceIndex?: number): number;\r\n setLinearVelocity(body: PhysicsBody, linVel: Vector3, instanceIndex?: number): void;\r\n getLinearVelocityToRef(body: PhysicsBody, linVel: Vector3, instanceIndex?: number): void;\r\n applyImpulse(body: PhysicsBody, impulse: Vector3, location: Vector3, instanceIndex?: number): void;\r\n applyAngularImpulse(body: PhysicsBody, angularImpulse: Vector3, instanceIndex?: number): void;\r\n applyForce(body: PhysicsBody, force: Vector3, location: Vector3, instanceIndex?: number): void;\r\n setAngularVelocity(body: PhysicsBody, angVel: Vector3, instanceIndex?: number): void;\r\n getAngularVelocityToRef(body: PhysicsBody, angVel: Vector3, instanceIndex?: number): void;\r\n getBodyGeometry(body: PhysicsBody): {};\r\n disposeBody(body: PhysicsBody): void;\r\n setCollisionCallbackEnabled(body: PhysicsBody, enabled: boolean, instanceIndex?: number): void;\r\n setCollisionEndedCallbackEnabled(body: PhysicsBody, enabled: boolean, instanceIndex?: number): void;\r\n addConstraint(body: PhysicsBody, childBody: PhysicsBody, constraint: PhysicsConstraint, instanceIndex?: number, childInstanceIndex?: number): void;\r\n getCollisionObservable(body: PhysicsBody, instanceIndex?: number): Observable<IPhysicsCollisionEvent>;\r\n getCollisionEndedObservable(body: PhysicsBody, instanceIndex?: number): Observable<IBasePhysicsCollisionEvent>;\r\n setGravityFactor(body: PhysicsBody, factor: number, instanceIndex?: number): void;\r\n getGravityFactor(body: PhysicsBody, instanceIndex?: number): number;\r\n setTargetTransform(body: PhysicsBody, position: Vector3, rotation: Quaternion, instanceIndex?: number): void;\r\n\r\n // shape\r\n initShape(shape: PhysicsShape, type: PhysicsShapeType, options: PhysicsShapeParameters): void;\r\n setShapeFilterMembershipMask(shape: PhysicsShape, membershipMask: number): void;\r\n getShapeFilterMembershipMask(shape: PhysicsShape): number;\r\n setShapeFilterCollideMask(shape: PhysicsShape, collideMask: number): void;\r\n getShapeFilterCollideMask(shape: PhysicsShape): number;\r\n setMaterial(shape: PhysicsShape, material: PhysicsMaterial): void;\r\n getMaterial(shape: PhysicsShape): PhysicsMaterial;\r\n setDensity(shape: PhysicsShape, density: number): void;\r\n getDensity(shape: PhysicsShape): number;\r\n addChild(shape: PhysicsShape, newChild: PhysicsShape, translation?: Vector3, rotation?: Quaternion, scale?: Vector3): void;\r\n removeChild(shape: PhysicsShape, childIndex: number): void;\r\n getNumChildren(shape: PhysicsShape): number;\r\n getBoundingBox(shape: PhysicsShape): BoundingBox;\r\n getBodyBoundingBox(body: PhysicsBody): BoundingBox;\r\n disposeShape(shape: PhysicsShape): void;\r\n setTrigger(shape: PhysicsShape, isTrigger: boolean): void;\r\n\r\n // constraint\r\n initConstraint(constraint: PhysicsConstraint, body: PhysicsBody, childBody: PhysicsBody): void;\r\n setEnabled(constraint: PhysicsConstraint, isEnabled: boolean): void;\r\n getEnabled(constraint: PhysicsConstraint): boolean;\r\n setCollisionsEnabled(constraint: PhysicsConstraint, isEnabled: boolean): void;\r\n getCollisionsEnabled(constraint: PhysicsConstraint): boolean;\r\n setAxisFriction(constraint: PhysicsConstraint, axis: PhysicsConstraintAxis, friction: number): void;\r\n getAxisFriction(constraint: PhysicsConstraint, axis: PhysicsConstraintAxis): Nullable<number>;\r\n setAxisMode(constraint: PhysicsConstraint, axis: PhysicsConstraintAxis, limitMode: PhysicsConstraintAxisLimitMode): void;\r\n getAxisMode(constraint: PhysicsConstraint, axis: PhysicsConstraintAxis): Nullable<PhysicsConstraintAxisLimitMode>;\r\n setAxisMinLimit(constraint: PhysicsConstraint, axis: PhysicsConstraintAxis, minLimit: number): void;\r\n getAxisMinLimit(constraint: PhysicsConstraint, axis: PhysicsConstraintAxis): Nullable<number>;\r\n setAxisMaxLimit(constraint: PhysicsConstraint, axis: PhysicsConstraintAxis, limit: number): void;\r\n getAxisMaxLimit(constraint: PhysicsConstraint, axis: PhysicsConstraintAxis): Nullable<number>;\r\n setAxisMotorType(constraint: PhysicsConstraint, axis: PhysicsConstraintAxis, motorType: PhysicsConstraintMotorType): void;\r\n getAxisMotorType(constraint: PhysicsConstraint, axis: PhysicsConstraintAxis): Nullable<PhysicsConstraintMotorType>;\r\n setAxisMotorTarget(constraint: PhysicsConstraint, axis: PhysicsConstraintAxis, target: number): void;\r\n getAxisMotorTarget(constraint: PhysicsConstraint, axis: PhysicsConstraintAxis): Nullable<number>;\r\n setAxisMotorMaxForce(constraint: PhysicsConstraint, axis: PhysicsConstraintAxis, maxForce: number): void;\r\n getAxisMotorMaxForce(constraint: PhysicsConstraint, axis: PhysicsConstraintAxis): Nullable<number>;\r\n disposeConstraint(constraint: PhysicsConstraint): void;\r\n getBodiesUsingConstraint(constraint: PhysicsConstraint): ConstrainedBodyPair[];\r\n\r\n // raycast\r\n raycast(from: Vector3, to: Vector3, result: PhysicsRaycastResult, query?: IRaycastQuery): void;\r\n\r\n dispose(): void;\r\n}\r\n"]}
1
+ {"version":3,"file":"IPhysicsEnginePlugin.js","sourceRoot":"","sources":["../../../../../dev/core/src/Physics/v2/IPhysicsEnginePlugin.ts"],"names":[],"mappings":"AAaA,6CAA6C;AAC7C,MAAM,CAAN,IAAY,8BAaX;AAbD,WAAY,8BAA8B;IACtC;;OAEG;IACH,mFAAI,CAAA;IACJ;;OAEG;IACH,yFAAO,CAAA;IACP;;OAEG;IACH,uFAAM,CAAA;AACV,CAAC,EAbW,8BAA8B,KAA9B,8BAA8B,QAazC;AAED,2GAA2G;AAC3G,MAAM,CAAN,IAAY,qBAqCX;AArCD,WAAY,qBAAqB;IAC7B;;;OAGG;IACH,yEAAQ,CAAA;IACR;;;OAGG;IACH,yEAAQ,CAAA;IACR;;;OAGG;IACH,yEAAQ,CAAA;IACR;;;OAGG;IACH,2EAAS,CAAA;IACT;;;OAGG;IACH,2EAAS,CAAA;IACT;;;OAGG;IACH,2EAAS,CAAA;IACT;;;;OAIG;IACH,uFAAe,CAAA;AACnB,CAAC,EArCW,qBAAqB,KAArB,qBAAqB,QAqChC;AAED,yBAAyB;AACzB,MAAM,CAAN,IAAY,qBAsCX;AAtCD,WAAY,qBAAqB;IAC7B;;;OAGG;IACH,uFAAmB,CAAA;IACnB;;;OAGG;IACH,yEAAY,CAAA;IACZ;;;OAGG;IACH,mEAAS,CAAA;IACT;;;;OAIG;IACH,qEAAU,CAAA;IACV;;;OAGG;IACH,iEAAQ,CAAA;IACR;;;OAGG;IACH,2EAAa,CAAA;IACb;;;;OAIG;IACH,uEAAW,CAAA;AACf,CAAC,EAtCW,qBAAqB,KAArB,qBAAqB,QAsChC;AAED,oBAAoB;AACpB,MAAM,CAAN,IAAY,gBASX;AATD,WAAY,gBAAgB;IACxB,2DAAM,CAAA;IACN,6DAAO,CAAA;IACP,+DAAQ,CAAA;IACR,qDAAG,CAAA;IACH,qEAAW,CAAA;IACX,iEAAS,CAAA;IACT,uDAAI,CAAA;IACJ,qEAAW,CAAA;AACf,CAAC,EATW,gBAAgB,KAAhB,gBAAgB,QAS3B;AAED,qGAAqG;AACrG,MAAM,CAAN,IAAY,0BAIX;AAJD,WAAY,0BAA0B;IAClC,2EAAI,CAAA;IACJ,mFAAQ,CAAA;IACR,mFAAQ,CAAA;AACZ,CAAC,EAJW,0BAA0B,KAA1B,0BAA0B,QAIrC;AAED,MAAM,CAAN,IAAY,gBAMX;AAND,WAAY,gBAAgB;IACxB,2DAAuC,CAAA;IACvC,+DAA2C,CAAA;IAC3C,6DAAyC,CAAA;IACzC,uDAAmC,CAAA;IACnC,qDAAiC,CAAA;AACrC,CAAC,EANW,gBAAgB,KAAhB,gBAAgB,QAM3B;AAiND;;GAEG;AACH,MAAM,CAAN,IAAY,iBAIX;AAJD,WAAY,iBAAiB;IACzB,6DAAM,CAAA;IACN,iEAAQ,CAAA;IACR,+DAAO,CAAA;AACX,CAAC,EAJW,iBAAiB,KAAjB,iBAAiB,QAI5B;AAED;;GAEG;AACH,MAAM,CAAN,IAAY,wBAIX;AAJD,WAAY,wBAAwB;IAChC,yGAAqB,CAAA;IACrB,yFAAa,CAAA;IACb,6FAAe,CAAA;AACnB,CAAC,EAJW,wBAAwB,KAAxB,wBAAwB,QAInC","sourcesContent":["import type { Vector3, Quaternion } from \"../../Maths/math.vector\";\r\nimport type { IRaycastQuery, PhysicsRaycastResult } from \"../physicsRaycastResult\";\r\nimport type { PhysicsBody } from \"./physicsBody\";\r\nimport type { PhysicsShape } from \"./physicsShape\";\r\nimport type { PhysicsConstraint } from \"./physicsConstraint\";\r\nimport type { BoundingBox } from \"../../Culling/boundingBox\";\r\nimport type { TransformNode } from \"../../Meshes/transformNode\";\r\nimport type { PhysicsMaterial } from \"./physicsMaterial\";\r\nimport type { Mesh } from \"../../Meshes/mesh\";\r\nimport type { Nullable } from \"../../types\";\r\nimport type { Observable } from \"../../Misc/observable\";\r\nimport type { GroundMesh } from \"../../Meshes/groundMesh\";\r\n\r\n/** How a specific axis can be constrained */\r\nexport enum PhysicsConstraintAxisLimitMode {\r\n /*\r\n * The axis is not restricted at all\r\n */\r\n FREE,\r\n /*\r\n * The axis has a minimum/maximum limit\r\n */\r\n LIMITED,\r\n /*\r\n * The axis allows no relative movement of the pivots\r\n */\r\n LOCKED,\r\n}\r\n\r\n/** The constraint specific axis to use when setting Friction, `ConstraintAxisLimitMode`, max force, ... */\r\nexport enum PhysicsConstraintAxis {\r\n /*\r\n * Translation along the primary axis of the constraint (i.e. the\r\n * direction specified by PhysicsConstraintParameters.axisA/axisB)\r\n */\r\n LINEAR_X,\r\n /*\r\n * Translation along the second axis of the constraint (i.e. the\r\n * direction specified by PhysicsConstraintParameters.perpAxisA/perpAxisB)\r\n */\r\n LINEAR_Y,\r\n /*\r\n * Translation along the third axis of the constraint. This axis is\r\n * computed from the cross product of axisA/axisB and perpAxisA/perpAxisB)\r\n */\r\n LINEAR_Z,\r\n /*\r\n * Rotation around the primary axis of the constraint (i.e. the\r\n * axis specified by PhysicsConstraintParameters.axisA/axisB)\r\n */\r\n ANGULAR_X,\r\n /*\r\n * Rotation around the second axis of the constraint (i.e. the\r\n * axis specified by PhysicsConstraintParameters.perpAxisA/perpAxisB)\r\n */\r\n ANGULAR_Y,\r\n /*\r\n * Rotation around the third axis of the constraint. This axis is\r\n * computed from the cross product of axisA/axisB and perpAxisA/perpAxisB)\r\n */\r\n ANGULAR_Z,\r\n /*\r\n * A 3D distance limit; similar to specifying the LINEAR_X/Y/Z axes\r\n * individually, but the distance calculation uses all three axes\r\n * simultaneously, instead of individually.\r\n */\r\n LINEAR_DISTANCE,\r\n}\r\n\r\n/** Type of Constraint */\r\nexport enum PhysicsConstraintType {\r\n /**\r\n * A ball and socket constraint will attempt to line up the pivot\r\n * positions in each body, and have no restrictions on rotation\r\n */\r\n BALL_AND_SOCKET = 1,\r\n /**\r\n * A distance constraint will attempt to keep the pivot locations\r\n * within a specified distance.\r\n */\r\n DISTANCE = 2,\r\n /**\r\n * A hinge constraint will keep the pivot positions aligned as well\r\n * as two angular axes. The remaining angular axis will be free to rotate.\r\n */\r\n HINGE = 3,\r\n /**\r\n * A slider constraint allows bodies to translate along one axis and\r\n * rotate about the same axis. The remaining two axes are locked in\r\n * place\r\n */\r\n SLIDER = 4,\r\n /**\r\n * A lock constraint will attempt to keep the pivots completely lined\r\n * up between both bodies, allowing no relative movement.\r\n */\r\n LOCK = 5,\r\n /*\r\n * A prismatic will lock the rotations of the bodies, and allow translation\r\n * only along one axis\r\n */\r\n PRISMATIC = 6,\r\n /*\r\n * A generic constraint; this starts with no limits on how the bodies can\r\n * move relative to each other, but limits can be added via the PhysicsConstraint\r\n * interfaces. This can be used to specify a large variety of constraints\r\n */\r\n SIX_DOF = 7,\r\n}\r\n\r\n/** Type of Shape */\r\nexport enum PhysicsShapeType {\r\n SPHERE,\r\n CAPSULE,\r\n CYLINDER,\r\n BOX,\r\n CONVEX_HULL,\r\n CONTAINER,\r\n MESH,\r\n HEIGHTFIELD,\r\n}\r\n\r\n/** Optional motor which attempts to move a body at a specific velocity, or at a specific position */\r\nexport enum PhysicsConstraintMotorType {\r\n NONE,\r\n VELOCITY,\r\n POSITION,\r\n}\r\n\r\nexport enum PhysicsEventType {\r\n COLLISION_STARTED = \"COLLISION_STARTED\",\r\n COLLISION_CONTINUED = \"COLLISION_CONTINUED\",\r\n COLLISION_FINISHED = \"COLLISION_FINISHED\",\r\n TRIGGER_ENTERED = \"TRIGGER_ENTERED\",\r\n TRIGGER_EXITED = \"TRIGGER_EXITED\",\r\n}\r\n\r\n/**\r\n * Base collision object\r\n */\r\nexport interface IBasePhysicsCollisionEvent {\r\n /**\r\n * 1st physics body that collided\r\n */\r\n collider: PhysicsBody;\r\n /**\r\n * 2nd physics body that collided\r\n */\r\n collidedAgainst: PhysicsBody;\r\n /**\r\n * index in instances array for the collider\r\n */\r\n colliderIndex: number;\r\n /**\r\n * index in instances array for the collidedAgainst\r\n */\r\n collidedAgainstIndex: number;\r\n /**\r\n * Event type\r\n */\r\n type: PhysicsEventType;\r\n}\r\n\r\n/**\r\n * Collision object that is the parameter when notification for collision fires.\r\n */\r\nexport interface IPhysicsCollisionEvent extends IBasePhysicsCollisionEvent {\r\n /**\r\n * World position where the collision occured\r\n */\r\n point: Nullable<Vector3>;\r\n /**\r\n * Penetration distance\r\n */\r\n distance: number;\r\n /**\r\n * Impulse value computed by the solver response\r\n */\r\n impulse: number;\r\n /**\r\n * Collision world normal direction\r\n */\r\n normal: Nullable<Vector3>;\r\n}\r\n\r\n/**\r\n * Parameters used to describe the Shape\r\n */\r\nexport interface PhysicsShapeParameters {\r\n /**\r\n * Shape center position\r\n */\r\n center?: Vector3;\r\n /**\r\n * Radius for cylinder, shape and capsule\r\n */\r\n radius?: number;\r\n /**\r\n * First point position that defines the cylinder or capsule\r\n */\r\n pointA?: Vector3;\r\n /**\r\n * Second point position that defines the cylinder or capsule\r\n */\r\n pointB?: Vector3;\r\n /**\r\n * Shape orientation\r\n */\r\n rotation?: Quaternion;\r\n /**\r\n * Dimesion extention for the box\r\n */\r\n extents?: Vector3;\r\n /**\r\n * Mesh used for Mesh shape or convex hull. It can be different than the mesh the body is attached to.\r\n */\r\n mesh?: Mesh;\r\n /**\r\n * Use children hierarchy\r\n */\r\n includeChildMeshes?: boolean;\r\n /**\r\n * The size of the heightfield in the X axis\r\n */\r\n heightFieldSizeX?: number;\r\n /**\r\n * The size of the heightfield in the Z axis\r\n */\r\n heightFieldSizeZ?: number;\r\n /**\r\n * The number of samples along the X axis\r\n */\r\n numHeightFieldSamplesX?: number;\r\n /**\r\n * The number of samples along the Z axis\r\n */\r\n numHeightFieldSamplesZ?: number;\r\n /**\r\n * The data for the heightfield\r\n */\r\n heightFieldData?: Float32Array;\r\n /**\r\n * Ground mesh used for display\r\n */\r\n groundMesh?: GroundMesh;\r\n}\r\n\r\n/**\r\n * Parameters used to describe a Constraint\r\n */\r\nexport interface PhysicsConstraintParameters {\r\n /**\r\n * Location of the constraint pivot in the space of first body\r\n */\r\n pivotA?: Vector3;\r\n /**\r\n * Location of the constraint pivot in the space of the second body\r\n */\r\n pivotB?: Vector3;\r\n /**\r\n * An axis in the space of the first body which determines how\r\n * distances/angles are measured for LINEAR_X/ANGULAR_X limits.\r\n */\r\n axisA?: Vector3;\r\n /**\r\n * An axis in the space of the second body which determines how\r\n * distances/angles are measured for LINEAR_X/ANGULAR_X limits.\r\n */\r\n axisB?: Vector3;\r\n\r\n /**\r\n * An axis in the space of the first body which determines how\r\n * distances/angles are measured for LINEAR_Y/ANGULAR_Y limits.\r\n */\r\n perpAxisA?: Vector3;\r\n\r\n /**\r\n * An axis in the space of the second body which determines how\r\n * distances/angles are measured for LINEAR_Y/ANGULAR_Y limits.\r\n */\r\n perpAxisB?: Vector3;\r\n\r\n /**\r\n * The maximum distance that can seperate the two pivots.\r\n * Only used for DISTANCE constraints\r\n */\r\n maxDistance?: number;\r\n\r\n /**\r\n * Determines if the connected bodies should collide. Generally,\r\n * it is preferable to set this to false, especially if the constraint\r\n * positions the bodies so that they overlap. Otherwise, the constraint\r\n * will \"fight\" the collision detection and may cause jitter.\r\n */\r\n collision?: boolean;\r\n}\r\n\r\n/**\r\n * Parameters used to describe mass and inertia of the Physics Body\r\n */\r\nexport interface PhysicsMassProperties {\r\n /**\r\n * The center of mass, in local space. This is The\r\n * point the body will rotate around when applying\r\n * an angular velocity.\r\n *\r\n * If not provided, the physics engine will compute\r\n * an appropriate value.\r\n */\r\n centerOfMass?: Vector3;\r\n /**\r\n * The total mass of this object, in kilograms. This\r\n * affects how easy it is to move the body. A value\r\n * of zero will be used as an infinite mass.\r\n *\r\n * If not provided, the physics engine will compute\r\n * an appropriate value.\r\n */\r\n mass?: number;\r\n /**\r\n * The principal moments of inertia of this object\r\n * for a unit mass. This determines how easy it is\r\n * for the body to rotate. A value of zero on any\r\n * axis will be used as infinite interia about that\r\n * axis.\r\n *\r\n * If not provided, the physics engine will compute\r\n * an appropriate value.\r\n */\r\n inertia?: Vector3;\r\n /**\r\n * The rotation rotating from inertia major axis space\r\n * to parent space (i.e., the rotation which, when\r\n * applied to the 3x3 inertia tensor causes the inertia\r\n * tensor to become a diagonal matrix). This determines\r\n * how the values of inertia are aligned with the parent\r\n * object.\r\n *\r\n * If not provided, the physics engine will compute\r\n * an appropriate value.\r\n */\r\n inertiaOrientation?: Quaternion;\r\n}\r\n\r\n/**\r\n * Indicates how the body will behave.\r\n */\r\nexport enum PhysicsMotionType {\r\n STATIC,\r\n ANIMATED,\r\n DYNAMIC,\r\n}\r\n\r\n/**\r\n * Controls the body sleep mode.\r\n */\r\nexport enum PhysicsActivationControl {\r\n SIMULATION_CONTROLLED,\r\n ALWAYS_ACTIVE,\r\n ALWAYS_INACTIVE,\r\n}\r\n\r\n/**\r\n * Represents a pair of bodies connected by a constraint.\r\n */\r\nexport type ConstrainedBodyPair = { parentBody: PhysicsBody; parentBodyIndex: number; childBody: PhysicsBody; childBodyIndex: number };\r\n\r\n/** @internal */\r\nexport interface IPhysicsEnginePluginV2 {\r\n /**\r\n * Physics plugin world instance\r\n */\r\n world: any;\r\n /**\r\n * Physics plugin name\r\n */\r\n name: string;\r\n\r\n /**\r\n * Collision observable\r\n */\r\n onCollisionObservable: Observable<IPhysicsCollisionEvent>;\r\n /**\r\n * Collision ended observable\r\n */\r\n onCollisionEndedObservable: Observable<IBasePhysicsCollisionEvent>;\r\n /**\r\n * Trigger observable\r\n */\r\n onTriggerCollisionObservable: Observable<IBasePhysicsCollisionEvent>;\r\n\r\n setGravity(gravity: Vector3): void;\r\n setTimeStep(timeStep: number): void;\r\n getTimeStep(): number;\r\n executeStep(delta: number, bodies: Array<PhysicsBody>): void; //not forgetting pre and post events\r\n getPluginVersion(): number;\r\n setVelocityLimits(maxLinearVelocity: number, maxAngularVelocity: number): void;\r\n getMaxLinearVelocity(): number;\r\n getMaxAngularVelocity(): number;\r\n\r\n // body\r\n initBody(body: PhysicsBody, motionType: PhysicsMotionType, position: Vector3, orientation: Quaternion): void;\r\n initBodyInstances(body: PhysicsBody, motionType: PhysicsMotionType, mesh: Mesh): void;\r\n updateBodyInstances(body: PhysicsBody, mesh: Mesh): void;\r\n removeBody(body: PhysicsBody): void;\r\n sync(body: PhysicsBody): void;\r\n syncTransform(body: PhysicsBody, transformNode: TransformNode): void;\r\n setShape(body: PhysicsBody, shape: Nullable<PhysicsShape>): void;\r\n getShape(body: PhysicsBody): Nullable<PhysicsShape>;\r\n getShapeType(shape: PhysicsShape): PhysicsShapeType;\r\n setEventMask(body: PhysicsBody, eventMask: number, instanceIndex?: number): void;\r\n getEventMask(body: PhysicsBody, instanceIndex?: number): number;\r\n setMotionType(body: PhysicsBody, motionType: PhysicsMotionType, instanceIndex?: number): void;\r\n getMotionType(body: PhysicsBody, instanceIndex?: number): PhysicsMotionType;\r\n computeMassProperties(body: PhysicsBody, instanceIndex?: number): PhysicsMassProperties;\r\n setMassProperties(body: PhysicsBody, massProps: PhysicsMassProperties, instanceIndex?: number): void;\r\n getMassProperties(body: PhysicsBody, instanceIndex?: number): PhysicsMassProperties;\r\n setLinearDamping(body: PhysicsBody, damping: number, instanceIndex?: number): void;\r\n getLinearDamping(body: PhysicsBody, instanceIndex?: number): number;\r\n setAngularDamping(body: PhysicsBody, damping: number, instanceIndex?: number): void;\r\n getAngularDamping(body: PhysicsBody, instanceIndex?: number): number;\r\n setLinearVelocity(body: PhysicsBody, linVel: Vector3, instanceIndex?: number): void;\r\n getLinearVelocityToRef(body: PhysicsBody, linVel: Vector3, instanceIndex?: number): void;\r\n applyImpulse(body: PhysicsBody, impulse: Vector3, location: Vector3, instanceIndex?: number): void;\r\n applyAngularImpulse(body: PhysicsBody, angularImpulse: Vector3, instanceIndex?: number): void;\r\n applyForce(body: PhysicsBody, force: Vector3, location: Vector3, instanceIndex?: number): void;\r\n setAngularVelocity(body: PhysicsBody, angVel: Vector3, instanceIndex?: number): void;\r\n getAngularVelocityToRef(body: PhysicsBody, angVel: Vector3, instanceIndex?: number): void;\r\n getBodyGeometry(body: PhysicsBody): {};\r\n disposeBody(body: PhysicsBody): void;\r\n setCollisionCallbackEnabled(body: PhysicsBody, enabled: boolean, instanceIndex?: number): void;\r\n setCollisionEndedCallbackEnabled(body: PhysicsBody, enabled: boolean, instanceIndex?: number): void;\r\n addConstraint(body: PhysicsBody, childBody: PhysicsBody, constraint: PhysicsConstraint, instanceIndex?: number, childInstanceIndex?: number): void;\r\n getCollisionObservable(body: PhysicsBody, instanceIndex?: number): Observable<IPhysicsCollisionEvent>;\r\n getCollisionEndedObservable(body: PhysicsBody, instanceIndex?: number): Observable<IBasePhysicsCollisionEvent>;\r\n setGravityFactor(body: PhysicsBody, factor: number, instanceIndex?: number): void;\r\n getGravityFactor(body: PhysicsBody, instanceIndex?: number): number;\r\n setTargetTransform(body: PhysicsBody, position: Vector3, rotation: Quaternion, instanceIndex?: number): void;\r\n\r\n // shape\r\n initShape(shape: PhysicsShape, type: PhysicsShapeType, options: PhysicsShapeParameters): void;\r\n setShapeFilterMembershipMask(shape: PhysicsShape, membershipMask: number): void;\r\n getShapeFilterMembershipMask(shape: PhysicsShape): number;\r\n setShapeFilterCollideMask(shape: PhysicsShape, collideMask: number): void;\r\n getShapeFilterCollideMask(shape: PhysicsShape): number;\r\n setMaterial(shape: PhysicsShape, material: PhysicsMaterial): void;\r\n getMaterial(shape: PhysicsShape): PhysicsMaterial;\r\n setDensity(shape: PhysicsShape, density: number): void;\r\n getDensity(shape: PhysicsShape): number;\r\n addChild(shape: PhysicsShape, newChild: PhysicsShape, translation?: Vector3, rotation?: Quaternion, scale?: Vector3): void;\r\n removeChild(shape: PhysicsShape, childIndex: number): void;\r\n getNumChildren(shape: PhysicsShape): number;\r\n getBoundingBox(shape: PhysicsShape): BoundingBox;\r\n getBodyBoundingBox(body: PhysicsBody): BoundingBox;\r\n disposeShape(shape: PhysicsShape): void;\r\n setTrigger(shape: PhysicsShape, isTrigger: boolean): void;\r\n\r\n // constraint\r\n initConstraint(constraint: PhysicsConstraint, body: PhysicsBody, childBody: PhysicsBody): void;\r\n setEnabled(constraint: PhysicsConstraint, isEnabled: boolean): void;\r\n getEnabled(constraint: PhysicsConstraint): boolean;\r\n setCollisionsEnabled(constraint: PhysicsConstraint, isEnabled: boolean): void;\r\n getCollisionsEnabled(constraint: PhysicsConstraint): boolean;\r\n setAxisFriction(constraint: PhysicsConstraint, axis: PhysicsConstraintAxis, friction: number): void;\r\n getAxisFriction(constraint: PhysicsConstraint, axis: PhysicsConstraintAxis): Nullable<number>;\r\n setAxisMode(constraint: PhysicsConstraint, axis: PhysicsConstraintAxis, limitMode: PhysicsConstraintAxisLimitMode): void;\r\n getAxisMode(constraint: PhysicsConstraint, axis: PhysicsConstraintAxis): Nullable<PhysicsConstraintAxisLimitMode>;\r\n setAxisMinLimit(constraint: PhysicsConstraint, axis: PhysicsConstraintAxis, minLimit: number): void;\r\n getAxisMinLimit(constraint: PhysicsConstraint, axis: PhysicsConstraintAxis): Nullable<number>;\r\n setAxisMaxLimit(constraint: PhysicsConstraint, axis: PhysicsConstraintAxis, limit: number): void;\r\n getAxisMaxLimit(constraint: PhysicsConstraint, axis: PhysicsConstraintAxis): Nullable<number>;\r\n setAxisMotorType(constraint: PhysicsConstraint, axis: PhysicsConstraintAxis, motorType: PhysicsConstraintMotorType): void;\r\n getAxisMotorType(constraint: PhysicsConstraint, axis: PhysicsConstraintAxis): Nullable<PhysicsConstraintMotorType>;\r\n setAxisMotorTarget(constraint: PhysicsConstraint, axis: PhysicsConstraintAxis, target: number): void;\r\n getAxisMotorTarget(constraint: PhysicsConstraint, axis: PhysicsConstraintAxis): Nullable<number>;\r\n setAxisMotorMaxForce(constraint: PhysicsConstraint, axis: PhysicsConstraintAxis, maxForce: number): void;\r\n getAxisMotorMaxForce(constraint: PhysicsConstraint, axis: PhysicsConstraintAxis): Nullable<number>;\r\n disposeConstraint(constraint: PhysicsConstraint): void;\r\n getBodiesUsingConstraint(constraint: PhysicsConstraint): ConstrainedBodyPair[];\r\n\r\n // raycast\r\n raycast(from: Vector3, to: Vector3, result: PhysicsRaycastResult, query?: IRaycastQuery): void;\r\n\r\n dispose(): void;\r\n}\r\n"]}
@@ -448,6 +448,7 @@ export declare class HavokPlugin implements IPhysicsEnginePluginV2 {
448
448
  * This is important for avoiding memory leaks in the physics engine.
449
449
  */
450
450
  disposeBody(body: PhysicsBody): void;
451
+ private _createOptionsFromGroundMesh;
451
452
  /**
452
453
  * Initializes a physics shape with the given type and parameters.
453
454
  * @param shape - The physics shape to initialize.
@@ -1049,6 +1049,45 @@ export class HavokPlugin {
1049
1049
  body._pluginData.hpBodyId = undefined;
1050
1050
  }
1051
1051
  }
1052
+ _createOptionsFromGroundMesh(options) {
1053
+ const mesh = options.groundMesh;
1054
+ if (!mesh) {
1055
+ return;
1056
+ }
1057
+ let pos = mesh.getVerticesData(VertexBuffer.PositionKind);
1058
+ const transform = mesh.computeWorldMatrix(true);
1059
+ // convert rawVerts to object space
1060
+ const transformedVertices = [];
1061
+ let index;
1062
+ for (index = 0; index < pos.length; index += 3) {
1063
+ Vector3.FromArrayToRef(pos, index, TmpVectors.Vector3[0]);
1064
+ Vector3.TransformCoordinatesToRef(TmpVectors.Vector3[0], transform, TmpVectors.Vector3[1]);
1065
+ TmpVectors.Vector3[1].toArray(transformedVertices, index);
1066
+ }
1067
+ pos = transformedVertices;
1068
+ const arraySize = ~~(Math.sqrt(pos.length / 3) - 1);
1069
+ const boundingInfo = mesh.getBoundingInfo();
1070
+ const dim = Math.min(boundingInfo.boundingBox.extendSizeWorld.x, boundingInfo.boundingBox.extendSizeWorld.z);
1071
+ const minX = boundingInfo.boundingBox.minimumWorld.x;
1072
+ const minY = boundingInfo.boundingBox.minimumWorld.y;
1073
+ const minZ = boundingInfo.boundingBox.minimumWorld.z;
1074
+ const matrix = new Float32Array((arraySize + 1) * (arraySize + 1));
1075
+ const elementSize = (dim * 2) / arraySize;
1076
+ for (let i = 0; i < matrix.length; i++) {
1077
+ matrix[i] = minY;
1078
+ }
1079
+ for (let i = 0; i < pos.length; i = i + 3) {
1080
+ const x = Math.round((pos[i + 0] - minX) / elementSize);
1081
+ const z = arraySize - Math.round((pos[i + 2] - minZ) / elementSize);
1082
+ const y = pos[i + 1] - minY;
1083
+ matrix[z * (arraySize + 1) + x] = y;
1084
+ }
1085
+ options.numHeightFieldSamplesX = arraySize + 1;
1086
+ options.numHeightFieldSamplesZ = arraySize + 1;
1087
+ options.heightFieldSizeX = boundingInfo.boundingBox.extendSizeWorld.x * 2;
1088
+ options.heightFieldSizeZ = boundingInfo.boundingBox.extendSizeWorld.z * 2;
1089
+ options.heightFieldData = matrix;
1090
+ }
1052
1091
  /**
1053
1092
  * Initializes a physics shape with the given type and parameters.
1054
1093
  * @param shape - The physics shape to initialize.
@@ -1127,6 +1166,10 @@ export class HavokPlugin {
1127
1166
  break;
1128
1167
  case PhysicsShapeType.HEIGHTFIELD:
1129
1168
  {
1169
+ if (options.groundMesh) {
1170
+ // update options with datas from groundMesh
1171
+ this._createOptionsFromGroundMesh(options);
1172
+ }
1130
1173
  if (options.numHeightFieldSamplesX && options.numHeightFieldSamplesZ && options.heightFieldSizeX && options.heightFieldSizeZ && options.heightFieldData) {
1131
1174
  const totalNumHeights = options.numHeightFieldSamplesX * options.numHeightFieldSamplesZ;
1132
1175
  const numBytes = totalNumHeights * 4;