@babylonjs/core 5.1.0 → 5.4.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 (172) hide show
  1. package/Audio/audioSceneComponent.d.ts +2 -0
  2. package/Audio/audioSceneComponent.js +9 -7
  3. package/Audio/audioSceneComponent.js.map +1 -1
  4. package/Behaviors/Cameras/autoRotationBehavior.d.ts +7 -0
  5. package/Behaviors/Cameras/autoRotationBehavior.js +15 -0
  6. package/Behaviors/Cameras/autoRotationBehavior.js.map +1 -1
  7. package/Behaviors/Meshes/pointerDragBehavior.js +1 -0
  8. package/Behaviors/Meshes/pointerDragBehavior.js.map +1 -1
  9. package/Bones/skeleton.js +2 -0
  10. package/Bones/skeleton.js.map +1 -1
  11. package/Cameras/arcRotateCamera.d.ts +5 -0
  12. package/Cameras/arcRotateCamera.js +5 -0
  13. package/Cameras/arcRotateCamera.js.map +1 -1
  14. package/Cameras/camera.d.ts +7 -2
  15. package/Cameras/camera.js +11 -8
  16. package/Cameras/camera.js.map +1 -1
  17. package/Debug/debugLayer.d.ts +5 -0
  18. package/Debug/debugLayer.js +24 -0
  19. package/Debug/debugLayer.js.map +1 -1
  20. package/DeviceInput/Helpers/eventFactory.js +14 -3
  21. package/DeviceInput/Helpers/eventFactory.js.map +1 -1
  22. package/DeviceInput/InputDevices/deviceTypes.d.ts +1 -1
  23. package/DeviceInput/InputDevices/deviceTypes.js.map +1 -1
  24. package/DeviceInput/InputDevices/nativeDeviceInputSystem.js +2 -8
  25. package/DeviceInput/InputDevices/nativeDeviceInputSystem.js.map +1 -1
  26. package/Engines/Processors/shaderCodeCursor.js +5 -0
  27. package/Engines/Processors/shaderCodeCursor.js.map +1 -1
  28. package/Engines/WebGPU/Extensions/engine.renderTarget.js +2 -2
  29. package/Engines/WebGPU/Extensions/engine.renderTarget.js.map +1 -1
  30. package/Engines/WebGPU/webgpuShaderProcessorsWGSL.js +1 -1
  31. package/Engines/WebGPU/webgpuShaderProcessorsWGSL.js.map +1 -1
  32. package/Engines/WebGPU/webgpuTextureHelper.d.ts +1 -0
  33. package/Engines/WebGPU/webgpuTextureHelper.js +16 -3
  34. package/Engines/WebGPU/webgpuTextureHelper.js.map +1 -1
  35. package/Engines/constants.d.ts +29 -1
  36. package/Engines/constants.js +29 -1
  37. package/Engines/constants.js.map +1 -1
  38. package/Engines/engine.d.ts +3 -3
  39. package/Engines/engine.js +2 -1
  40. package/Engines/engine.js.map +1 -1
  41. package/Engines/nativeEngine.d.ts +1 -1
  42. package/Engines/nativeEngine.js +7 -8
  43. package/Engines/nativeEngine.js.map +1 -1
  44. package/Engines/thinEngine.js +2 -2
  45. package/Engines/thinEngine.js.map +1 -1
  46. package/Engines/webgpuEngine.d.ts +4 -0
  47. package/Engines/webgpuEngine.js +16 -5
  48. package/Engines/webgpuEngine.js.map +1 -1
  49. package/Gizmos/axisScaleGizmo.js +3 -2
  50. package/Gizmos/axisScaleGizmo.js.map +1 -1
  51. package/Gizmos/boundingBoxGizmo.js +11 -11
  52. package/Gizmos/boundingBoxGizmo.js.map +1 -1
  53. package/Gizmos/gizmo.d.ts +5 -0
  54. package/Gizmos/gizmo.js +11 -4
  55. package/Gizmos/gizmo.js.map +1 -1
  56. package/Gizmos/planeRotationGizmo.js +3 -3
  57. package/Gizmos/planeRotationGizmo.js.map +1 -1
  58. package/Inputs/scene.inputManager.js +7 -1
  59. package/Inputs/scene.inputManager.js.map +1 -1
  60. package/Layers/effectLayer.js +1 -1
  61. package/Layers/effectLayer.js.map +1 -1
  62. package/Lights/Shadows/shadowGenerator.d.ts +9 -0
  63. package/Lights/Shadows/shadowGenerator.js +25 -3
  64. package/Lights/Shadows/shadowGenerator.js.map +1 -1
  65. package/Loading/Plugins/babylonFileLoader.js +10 -8
  66. package/Loading/Plugins/babylonFileLoader.js.map +1 -1
  67. package/Materials/Background/backgroundMaterial.js +1 -1
  68. package/Materials/Background/backgroundMaterial.js.map +1 -1
  69. package/Materials/Node/Blocks/PBR/clearCoatBlock.d.ts +4 -0
  70. package/Materials/Node/Blocks/PBR/clearCoatBlock.js +19 -1
  71. package/Materials/Node/Blocks/PBR/clearCoatBlock.js.map +1 -1
  72. package/Materials/Node/Blocks/PBR/iridescenceBlock.d.ts +54 -0
  73. package/Materials/Node/Blocks/PBR/iridescenceBlock.js +135 -0
  74. package/Materials/Node/Blocks/PBR/iridescenceBlock.js.map +1 -0
  75. package/Materials/Node/Blocks/PBR/pbrMetallicRoughnessBlock.d.ts +4 -0
  76. package/Materials/Node/Blocks/PBR/pbrMetallicRoughnessBlock.js +42 -24
  77. package/Materials/Node/Blocks/PBR/pbrMetallicRoughnessBlock.js.map +1 -1
  78. package/Materials/PBR/index.d.ts +1 -0
  79. package/Materials/PBR/index.js +1 -0
  80. package/Materials/PBR/index.js.map +1 -1
  81. package/Materials/PBR/pbrBaseMaterial.d.ts +5 -0
  82. package/Materials/PBR/pbrBaseMaterial.js +2 -0
  83. package/Materials/PBR/pbrBaseMaterial.js.map +1 -1
  84. package/Materials/PBR/pbrIridescenceConfiguration.d.ts +102 -0
  85. package/Materials/PBR/pbrIridescenceConfiguration.js +257 -0
  86. package/Materials/PBR/pbrIridescenceConfiguration.js.map +1 -0
  87. package/Materials/Textures/Loaders/ktxTextureLoader.js +31 -0
  88. package/Materials/Textures/Loaders/ktxTextureLoader.js.map +1 -1
  89. package/Materials/Textures/cubeTexture.js +3 -0
  90. package/Materials/Textures/cubeTexture.js.map +1 -1
  91. package/Materials/Textures/videoTexture.js +12 -12
  92. package/Materials/Textures/videoTexture.js.map +1 -1
  93. package/Materials/materialFlags.d.ts +6 -0
  94. package/Materials/materialFlags.js +18 -0
  95. package/Materials/materialFlags.js.map +1 -1
  96. package/Materials/materialHelper.js +1 -1
  97. package/Materials/materialHelper.js.map +1 -1
  98. package/Materials/materialPluginFactoryExport.d.ts +6 -0
  99. package/Materials/materialPluginFactoryExport.js +12 -0
  100. package/Materials/materialPluginFactoryExport.js.map +1 -1
  101. package/Materials/shaderMaterial.js +1 -0
  102. package/Materials/shaderMaterial.js.map +1 -1
  103. package/Materials/uniformBuffer.d.ts +2 -1
  104. package/Materials/uniformBuffer.js +2 -1
  105. package/Materials/uniformBuffer.js.map +1 -1
  106. package/Maths/math.vector.d.ts +4 -0
  107. package/Maths/math.vector.js +10 -0
  108. package/Maths/math.vector.js.map +1 -1
  109. package/Meshes/abstractMesh.d.ts +1 -1
  110. package/Meshes/abstractMesh.js +5 -2
  111. package/Meshes/abstractMesh.js.map +1 -1
  112. package/Meshes/mesh.d.ts +2 -2
  113. package/Meshes/mesh.js +11 -3
  114. package/Meshes/mesh.js.map +1 -1
  115. package/Meshes/subMesh.js +1 -1
  116. package/Meshes/subMesh.js.map +1 -1
  117. package/Meshes/thinInstanceMesh.js +2 -1
  118. package/Meshes/thinInstanceMesh.js.map +1 -1
  119. package/Misc/khronosTextureContainer.js +1 -1
  120. package/Misc/khronosTextureContainer.js.map +1 -1
  121. package/Misc/screenshotTools.js +6 -6
  122. package/Misc/screenshotTools.js.map +1 -1
  123. package/Physics/Plugins/oimoJSPlugin.js +1 -1
  124. package/Physics/Plugins/oimoJSPlugin.js.map +1 -1
  125. package/Physics/physicsImpostor.js +1 -1
  126. package/Physics/physicsImpostor.js.map +1 -1
  127. package/PostProcesses/volumetricLightScatteringPostProcess.js +6 -1
  128. package/PostProcesses/volumetricLightScatteringPostProcess.js.map +1 -1
  129. package/Rendering/boundingBoxRenderer.js +4 -4
  130. package/Rendering/boundingBoxRenderer.js.map +1 -1
  131. package/Rendering/renderingGroup.js +8 -0
  132. package/Rendering/renderingGroup.js.map +1 -1
  133. package/Shaders/ShadersInclude/boundingBoxRendererUboDeclaration.js +1 -1
  134. package/Shaders/ShadersInclude/boundingBoxRendererUboDeclaration.js.map +1 -1
  135. package/Shaders/ShadersInclude/helperFunctions.js +1 -1
  136. package/Shaders/ShadersInclude/helperFunctions.js.map +1 -1
  137. package/Shaders/ShadersInclude/lightFragment.js +1 -1
  138. package/Shaders/ShadersInclude/lightFragment.js.map +1 -1
  139. package/Shaders/ShadersInclude/pbrBRDFFunctions.js +1 -1
  140. package/Shaders/ShadersInclude/pbrBRDFFunctions.js.map +1 -1
  141. package/Shaders/ShadersInclude/pbrBlockIridescence.d.ts +5 -0
  142. package/Shaders/ShadersInclude/pbrBlockIridescence.js +9 -0
  143. package/Shaders/ShadersInclude/pbrBlockIridescence.js.map +1 -0
  144. package/Shaders/ShadersInclude/pbrDirectLightingFunctions.js +1 -1
  145. package/Shaders/ShadersInclude/pbrDirectLightingFunctions.js.map +1 -1
  146. package/Shaders/ShadersInclude/pbrDirectLightingSetupFunctions.js +1 -1
  147. package/Shaders/ShadersInclude/pbrDirectLightingSetupFunctions.js.map +1 -1
  148. package/Shaders/ShadersInclude/pbrFragmentDeclaration.js +1 -1
  149. package/Shaders/ShadersInclude/pbrFragmentDeclaration.js.map +1 -1
  150. package/Shaders/ShadersInclude/pbrFragmentSamplersDeclaration.js +1 -1
  151. package/Shaders/ShadersInclude/pbrFragmentSamplersDeclaration.js.map +1 -1
  152. package/Shaders/ShadersInclude/pbrVertexDeclaration.js +1 -1
  153. package/Shaders/ShadersInclude/pbrVertexDeclaration.js.map +1 -1
  154. package/Shaders/pbr.fragment.d.ts +1 -0
  155. package/Shaders/pbr.fragment.js +2 -1
  156. package/Shaders/pbr.fragment.js.map +1 -1
  157. package/Shaders/pbr.vertex.js +1 -1
  158. package/Shaders/pbr.vertex.js.map +1 -1
  159. package/Shaders/spriteMap.fragment.js +1 -1
  160. package/Shaders/spriteMap.fragment.js.map +1 -1
  161. package/XR/features/WebXRControllerPointerSelection.js +1 -0
  162. package/XR/features/WebXRControllerPointerSelection.js.map +1 -1
  163. package/XR/features/WebXRImageTracking.d.ts +0 -5
  164. package/XR/features/WebXRImageTracking.js +5 -8
  165. package/XR/features/WebXRImageTracking.js.map +1 -1
  166. package/XR/native/nativeXRFrame.d.ts +2 -1
  167. package/XR/native/nativeXRFrame.js +5 -1
  168. package/XR/native/nativeXRFrame.js.map +1 -1
  169. package/package.json +1 -1
  170. package/scene.d.ts +7 -1
  171. package/scene.js +11 -3
  172. package/scene.js.map +1 -1
package/Meshes/subMesh.js CHANGED
@@ -270,7 +270,7 @@ var SubMesh = /** @class */ (function () {
270
270
  SubMesh.prototype.getMaterial = function () {
271
271
  var _a;
272
272
  var rootMaterial = (_a = this._renderingMesh.getMaterialForRenderPass(this._engine.currentRenderPassId)) !== null && _a !== void 0 ? _a : this._renderingMesh.material;
273
- if (rootMaterial === null || rootMaterial === undefined) {
273
+ if (!rootMaterial) {
274
274
  return this._mesh.getScene().defaultMaterial;
275
275
  }
276
276
  else if (this._isMultiMaterial(rootMaterial)) {
@@ -1 +1 @@
1
- {"version":3,"file":"subMesh.js","sourceRoot":"","sources":["../../../../../lts/core/generated/Meshes/subMesh.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Nullable, IndicesArray, DeepImmutable, FloatArray } from \"../types\";\r\nimport type { Matrix, Vector3 } from \"../Maths/math.vector\";\r\nimport type { Engine } from \"../Engines/engine\";\r\nimport { VertexBuffer } from \"../Buffers/buffer\";\r\nimport { IntersectionInfo } from \"../Collisions/intersectionInfo\";\r\nimport type { ICullable } from \"../Culling/boundingInfo\";\r\nimport { BoundingInfo } from \"../Culling/boundingInfo\";\r\nimport type { Effect } from \"../Materials/effect\";\r\nimport { Constants } from \"../Engines/constants\";\r\nimport type { DataBuffer } from \"../Buffers/dataBuffer\";\r\nimport { extractMinAndMaxIndexed } from \"../Maths/math.functions\";\r\nimport type { Plane } from \"../Maths/math.plane\";\r\nimport { DrawWrapper } from \"../Materials/drawWrapper\";\r\nimport type { IMaterialContext } from \"../Engines/IMaterialContext\";\r\n\r\ndeclare type Collider = import(\"../Collisions/collider\").Collider;\r\ndeclare type Material = import(\"../Materials/material\").Material;\r\ndeclare type MaterialDefines = import(\"../Materials/materialDefines\").MaterialDefines;\r\ndeclare type MultiMaterial = import(\"../Materials/multiMaterial\").MultiMaterial;\r\ndeclare type AbstractMesh = import(\"./abstractMesh\").AbstractMesh;\r\ndeclare type Mesh = import(\"./mesh\").Mesh;\r\ndeclare type Ray = import(\"../Culling/ray\").Ray;\r\ndeclare type TrianglePickingPredicate = import(\"../Culling/ray\").TrianglePickingPredicate;\r\n\r\n/**\r\n * Defines a subdivision inside a mesh\r\n */\r\nexport class SubMesh implements ICullable {\r\n private _engine: Engine;\r\n /** @hidden */\r\n public _drawWrappers: Array<DrawWrapper>; // index in this array = pass id\r\n private _mainDrawWrapperOverride: Nullable<DrawWrapper> = null;\r\n\r\n /**\r\n * Gets material defines used by the effect associated to the sub mesh\r\n */\r\n public get materialDefines(): Nullable<MaterialDefines> {\r\n return this._mainDrawWrapperOverride ? (this._mainDrawWrapperOverride.defines as MaterialDefines) : (this._getDrawWrapper()?.defines as Nullable<MaterialDefines>);\r\n }\r\n\r\n /**\r\n * Sets material defines used by the effect associated to the sub mesh\r\n */\r\n public set materialDefines(defines: Nullable<MaterialDefines>) {\r\n const drawWrapper = this._mainDrawWrapperOverride ?? this._getDrawWrapper(undefined, true)!;\r\n drawWrapper.defines = defines;\r\n }\r\n\r\n /**\r\n * @param passId\r\n * @param createIfNotExisting\r\n * @hidden\r\n */\r\n public _getDrawWrapper(passId?: number, createIfNotExisting = false): DrawWrapper | undefined {\r\n passId = passId ?? this._engine.currentRenderPassId;\r\n let drawWrapper = this._drawWrappers[passId];\r\n if (!drawWrapper && createIfNotExisting) {\r\n this._drawWrappers[passId] = drawWrapper = new DrawWrapper(this._mesh.getScene().getEngine());\r\n }\r\n return drawWrapper;\r\n }\r\n\r\n /**\r\n * @param passId\r\n * @param disposeWrapper\r\n * @hidden\r\n */\r\n public _removeDrawWrapper(passId: number, disposeWrapper = true) {\r\n if (disposeWrapper) {\r\n this._drawWrappers[passId]?.dispose();\r\n }\r\n this._drawWrappers[passId] = undefined as any;\r\n }\r\n\r\n /**\r\n * Gets associated (main) effect (possibly the effect override if defined)\r\n */\r\n public get effect(): Nullable<Effect> {\r\n return this._mainDrawWrapperOverride ? this._mainDrawWrapperOverride.effect : this._getDrawWrapper()?.effect ?? null;\r\n }\r\n\r\n /** @hidden */\r\n public get _drawWrapper(): DrawWrapper {\r\n return this._mainDrawWrapperOverride ?? this._getDrawWrapper(undefined, true)!;\r\n }\r\n\r\n /** @hidden */\r\n public get _drawWrapperOverride(): Nullable<DrawWrapper> {\r\n return this._mainDrawWrapperOverride;\r\n }\r\n\r\n /**\r\n * @param wrapper\r\n * @hidden\r\n */\r\n public _setMainDrawWrapperOverride(wrapper: Nullable<DrawWrapper>): void {\r\n this._mainDrawWrapperOverride = wrapper;\r\n }\r\n\r\n /**\r\n * Sets associated effect (effect used to render this submesh)\r\n * @param effect defines the effect to associate with\r\n * @param defines defines the set of defines used to compile this effect\r\n * @param materialContext material context associated to the effect\r\n * @param resetContext true to reset the draw context\r\n */\r\n public setEffect(effect: Nullable<Effect>, defines: Nullable<string | MaterialDefines> = null, materialContext?: IMaterialContext, resetContext = true) {\r\n const drawWrapper = this._drawWrapper;\r\n drawWrapper.setEffect(effect, defines, resetContext);\r\n if (materialContext !== undefined) {\r\n drawWrapper.materialContext = materialContext;\r\n }\r\n if (!effect) {\r\n drawWrapper.defines = null;\r\n drawWrapper.materialContext = undefined;\r\n }\r\n }\r\n\r\n /**\r\n * Resets the draw wrappers cache\r\n * @param passId If provided, releases only the draw wrapper corresponding to this render pass id\r\n */\r\n public resetDrawCache(passId?: number): void {\r\n if (this._drawWrappers) {\r\n if (passId !== undefined) {\r\n this._removeDrawWrapper(passId);\r\n return;\r\n } else {\r\n for (const drawWrapper of this._drawWrappers) {\r\n drawWrapper?.dispose();\r\n }\r\n }\r\n }\r\n this._drawWrappers = [];\r\n }\r\n\r\n /** @hidden */\r\n public _linesIndexCount: number = 0;\r\n private _mesh: AbstractMesh;\r\n private _renderingMesh: Mesh;\r\n private _boundingInfo: BoundingInfo;\r\n private _linesIndexBuffer: Nullable<DataBuffer> = null;\r\n /** @hidden */\r\n public _lastColliderWorldVertices: Nullable<Vector3[]> = null;\r\n /** @hidden */\r\n public _trianglePlanes: Plane[];\r\n /** @hidden */\r\n public _lastColliderTransformMatrix: Nullable<Matrix> = null;\r\n\r\n /** @hidden */\r\n public _renderId = 0;\r\n /** @hidden */\r\n public _alphaIndex: number = 0;\r\n /** @hidden */\r\n public _distanceToCamera: number = 0;\r\n /** @hidden */\r\n public _id: number;\r\n\r\n private _currentMaterial: Nullable<Material> = null;\r\n\r\n /**\r\n * Add a new submesh to a mesh\r\n * @param materialIndex defines the material index to use\r\n * @param verticesStart defines vertex index start\r\n * @param verticesCount defines vertices count\r\n * @param indexStart defines index start\r\n * @param indexCount defines indices count\r\n * @param mesh defines the parent mesh\r\n * @param renderingMesh defines an optional rendering mesh\r\n * @param createBoundingBox defines if bounding box should be created for this submesh\r\n * @returns the new submesh\r\n */\r\n public static AddToMesh(\r\n materialIndex: number,\r\n verticesStart: number,\r\n verticesCount: number,\r\n indexStart: number,\r\n indexCount: number,\r\n mesh: AbstractMesh,\r\n renderingMesh?: Mesh,\r\n createBoundingBox: boolean = true\r\n ): SubMesh {\r\n return new SubMesh(materialIndex, verticesStart, verticesCount, indexStart, indexCount, mesh, renderingMesh, createBoundingBox);\r\n }\r\n\r\n /**\r\n * Creates a new submesh\r\n * @param materialIndex defines the material index to use\r\n * @param verticesStart defines vertex index start\r\n * @param verticesCount defines vertices count\r\n * @param indexStart defines index start\r\n * @param indexCount defines indices count\r\n * @param mesh defines the parent mesh\r\n * @param renderingMesh defines an optional rendering mesh\r\n * @param createBoundingBox defines if bounding box should be created for this submesh\r\n * @param addToMesh defines a boolean indicating that the submesh must be added to the mesh.subMeshes array (true by default)\r\n */\r\n constructor(\r\n /** the material index to use */\r\n public materialIndex: number,\r\n /** vertex index start */\r\n public verticesStart: number,\r\n /** vertices count */\r\n public verticesCount: number,\r\n /** index start */\r\n public indexStart: number,\r\n /** indices count */\r\n public indexCount: number,\r\n mesh: AbstractMesh,\r\n renderingMesh?: Mesh,\r\n createBoundingBox: boolean = true,\r\n addToMesh = true\r\n ) {\r\n this._mesh = mesh;\r\n this._renderingMesh = renderingMesh || <Mesh>mesh;\r\n if (addToMesh) {\r\n mesh.subMeshes.push(this);\r\n }\r\n\r\n this._engine = this._mesh.getScene().getEngine();\r\n this.resetDrawCache();\r\n this._trianglePlanes = [];\r\n\r\n this._id = mesh.subMeshes.length - 1;\r\n\r\n if (createBoundingBox) {\r\n this.refreshBoundingInfo();\r\n mesh.computeWorldMatrix(true);\r\n }\r\n }\r\n\r\n /**\r\n * Returns true if this submesh covers the entire parent mesh\r\n * @ignorenaming\r\n */\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n public get IsGlobal(): boolean {\r\n return this.verticesStart === 0 && this.verticesCount === this._mesh.getTotalVertices();\r\n }\r\n\r\n /**\r\n * Returns the submesh BoundingInfo object\r\n * @returns current bounding info (or mesh's one if the submesh is global)\r\n */\r\n public getBoundingInfo(): BoundingInfo {\r\n if (this.IsGlobal) {\r\n return this._mesh.getBoundingInfo();\r\n }\r\n\r\n return this._boundingInfo;\r\n }\r\n\r\n /**\r\n * Sets the submesh BoundingInfo\r\n * @param boundingInfo defines the new bounding info to use\r\n * @returns the SubMesh\r\n */\r\n public setBoundingInfo(boundingInfo: BoundingInfo): SubMesh {\r\n this._boundingInfo = boundingInfo;\r\n return this;\r\n }\r\n\r\n /**\r\n * Returns the mesh of the current submesh\r\n * @return the parent mesh\r\n */\r\n public getMesh(): AbstractMesh {\r\n return this._mesh;\r\n }\r\n\r\n /**\r\n * Returns the rendering mesh of the submesh\r\n * @returns the rendering mesh (could be different from parent mesh)\r\n */\r\n public getRenderingMesh(): Mesh {\r\n return this._renderingMesh;\r\n }\r\n\r\n /**\r\n * Returns the replacement mesh of the submesh\r\n * @returns the replacement mesh (could be different from parent mesh)\r\n */\r\n public getReplacementMesh(): Nullable<AbstractMesh> {\r\n return this._mesh._internalAbstractMeshDataInfo._actAsRegularMesh ? this._mesh : null;\r\n }\r\n\r\n /**\r\n * Returns the effective mesh of the submesh\r\n * @returns the effective mesh (could be different from parent mesh)\r\n */\r\n public getEffectiveMesh(): AbstractMesh {\r\n const replacementMesh = this._mesh._internalAbstractMeshDataInfo._actAsRegularMesh ? this._mesh : null;\r\n\r\n return replacementMesh ? replacementMesh : this._renderingMesh;\r\n }\r\n\r\n /**\r\n * Returns the submesh material\r\n * @returns null or the current material\r\n */\r\n public getMaterial(): Nullable<Material> {\r\n const rootMaterial = this._renderingMesh.getMaterialForRenderPass(this._engine.currentRenderPassId) ?? this._renderingMesh.material;\r\n\r\n if (rootMaterial === null || rootMaterial === undefined) {\r\n return this._mesh.getScene().defaultMaterial;\r\n } else if (this._isMultiMaterial(rootMaterial)) {\r\n const effectiveMaterial = rootMaterial.getSubMaterial(this.materialIndex);\r\n\r\n if (this._currentMaterial !== effectiveMaterial) {\r\n this._currentMaterial = effectiveMaterial;\r\n this.resetDrawCache();\r\n }\r\n\r\n return effectiveMaterial;\r\n }\r\n\r\n return rootMaterial;\r\n }\r\n\r\n private _isMultiMaterial(material: Material): material is MultiMaterial {\r\n return (material as MultiMaterial).getSubMaterial !== undefined;\r\n }\r\n\r\n // Methods\r\n\r\n /**\r\n * Sets a new updated BoundingInfo object to the submesh\r\n * @param data defines an optional position array to use to determine the bounding info\r\n * @returns the SubMesh\r\n */\r\n public refreshBoundingInfo(data: Nullable<FloatArray> = null): SubMesh {\r\n this._lastColliderWorldVertices = null;\r\n\r\n if (this.IsGlobal || !this._renderingMesh || !this._renderingMesh.geometry) {\r\n return this;\r\n }\r\n\r\n if (!data) {\r\n data = this._renderingMesh.getVerticesData(VertexBuffer.PositionKind);\r\n }\r\n\r\n if (!data) {\r\n this._boundingInfo = this._mesh.getBoundingInfo();\r\n return this;\r\n }\r\n\r\n const indices = <IndicesArray>this._renderingMesh.getIndices();\r\n let extend: { minimum: Vector3; maximum: Vector3 };\r\n\r\n //is this the only submesh?\r\n if (this.indexStart === 0 && this.indexCount === indices.length) {\r\n const boundingInfo = this._renderingMesh.getBoundingInfo();\r\n\r\n //the rendering mesh's bounding info can be used, it is the standard submesh for all indices.\r\n extend = { minimum: boundingInfo.minimum.clone(), maximum: boundingInfo.maximum.clone() };\r\n } else {\r\n extend = extractMinAndMaxIndexed(data, indices, this.indexStart, this.indexCount, this._renderingMesh.geometry.boundingBias);\r\n }\r\n\r\n if (this._boundingInfo) {\r\n this._boundingInfo.reConstruct(extend.minimum, extend.maximum);\r\n } else {\r\n this._boundingInfo = new BoundingInfo(extend.minimum, extend.maximum);\r\n }\r\n return this;\r\n }\r\n\r\n /**\r\n * @param collider\r\n * @hidden\r\n */\r\n public _checkCollision(collider: Collider): boolean {\r\n const boundingInfo = this.getBoundingInfo();\r\n\r\n return boundingInfo._checkCollision(collider);\r\n }\r\n\r\n /**\r\n * Updates the submesh BoundingInfo\r\n * @param world defines the world matrix to use to update the bounding info\r\n * @returns the submesh\r\n */\r\n public updateBoundingInfo(world: DeepImmutable<Matrix>): SubMesh {\r\n let boundingInfo = this.getBoundingInfo();\r\n\r\n if (!boundingInfo) {\r\n this.refreshBoundingInfo();\r\n boundingInfo = this.getBoundingInfo();\r\n }\r\n if (boundingInfo) {\r\n (<BoundingInfo>boundingInfo).update(world);\r\n }\r\n return this;\r\n }\r\n\r\n /**\r\n * True is the submesh bounding box intersects the frustum defined by the passed array of planes.\r\n * @param frustumPlanes defines the frustum planes\r\n * @returns true if the submesh is intersecting with the frustum\r\n */\r\n public isInFrustum(frustumPlanes: Plane[]): boolean {\r\n const boundingInfo = this.getBoundingInfo();\r\n\r\n if (!boundingInfo) {\r\n return false;\r\n }\r\n return boundingInfo.isInFrustum(frustumPlanes, this._mesh.cullingStrategy);\r\n }\r\n\r\n /**\r\n * True is the submesh bounding box is completely inside the frustum defined by the passed array of planes\r\n * @param frustumPlanes defines the frustum planes\r\n * @returns true if the submesh is inside the frustum\r\n */\r\n public isCompletelyInFrustum(frustumPlanes: Plane[]): boolean {\r\n const boundingInfo = this.getBoundingInfo();\r\n\r\n if (!boundingInfo) {\r\n return false;\r\n }\r\n return boundingInfo.isCompletelyInFrustum(frustumPlanes);\r\n }\r\n\r\n /**\r\n * Renders the submesh\r\n * @param enableAlphaMode defines if alpha needs to be used\r\n * @returns the submesh\r\n */\r\n public render(enableAlphaMode: boolean): SubMesh {\r\n this._renderingMesh.render(this, enableAlphaMode, this._mesh._internalAbstractMeshDataInfo._actAsRegularMesh ? this._mesh : undefined);\r\n return this;\r\n }\r\n\r\n /**\r\n * @param indices\r\n * @param engine\r\n * @hidden\r\n */\r\n public _getLinesIndexBuffer(indices: IndicesArray, engine: Engine): DataBuffer {\r\n if (!this._linesIndexBuffer) {\r\n const linesIndices = [];\r\n\r\n for (let index = this.indexStart; index < this.indexStart + this.indexCount; index += 3) {\r\n linesIndices.push(indices[index], indices[index + 1], indices[index + 1], indices[index + 2], indices[index + 2], indices[index]);\r\n }\r\n\r\n this._linesIndexBuffer = engine.createIndexBuffer(linesIndices);\r\n this._linesIndexCount = linesIndices.length;\r\n }\r\n return this._linesIndexBuffer;\r\n }\r\n\r\n /**\r\n * Checks if the submesh intersects with a ray\r\n * @param ray defines the ray to test\r\n * @returns true is the passed ray intersects the submesh bounding box\r\n */\r\n public canIntersects(ray: Ray): boolean {\r\n const boundingInfo = this.getBoundingInfo();\r\n\r\n if (!boundingInfo) {\r\n return false;\r\n }\r\n return ray.intersectsBox(boundingInfo.boundingBox);\r\n }\r\n\r\n /**\r\n * Intersects current submesh with a ray\r\n * @param ray defines the ray to test\r\n * @param positions defines mesh's positions array\r\n * @param indices defines mesh's indices array\r\n * @param fastCheck defines if the first intersection will be used (and not the closest)\r\n * @param trianglePredicate defines an optional predicate used to select faces when a mesh intersection is detected\r\n * @returns intersection info or null if no intersection\r\n */\r\n public intersects(ray: Ray, positions: Vector3[], indices: IndicesArray, fastCheck?: boolean, trianglePredicate?: TrianglePickingPredicate): Nullable<IntersectionInfo> {\r\n const material = this.getMaterial();\r\n if (!material) {\r\n return null;\r\n }\r\n let step = 3;\r\n let checkStopper = false;\r\n\r\n switch (material.fillMode) {\r\n case Constants.MATERIAL_PointListDrawMode:\r\n case Constants.MATERIAL_LineLoopDrawMode:\r\n case Constants.MATERIAL_LineStripDrawMode:\r\n case Constants.MATERIAL_TriangleFanDrawMode:\r\n return null;\r\n case Constants.MATERIAL_TriangleStripDrawMode:\r\n step = 1;\r\n checkStopper = true;\r\n break;\r\n default:\r\n break;\r\n }\r\n\r\n // LineMesh first as it's also a Mesh...\r\n if (material.fillMode === Constants.MATERIAL_LineListDrawMode) {\r\n // Check if mesh is unindexed\r\n if (!indices.length) {\r\n return this._intersectUnIndexedLines(ray, positions, indices, (this._mesh as any).intersectionThreshold, fastCheck);\r\n }\r\n return this._intersectLines(ray, positions, indices, (this._mesh as any).intersectionThreshold, fastCheck);\r\n } else {\r\n // Check if mesh is unindexed\r\n if (!indices.length && this._mesh._unIndexed) {\r\n return this._intersectUnIndexedTriangles(ray, positions, indices, fastCheck, trianglePredicate);\r\n }\r\n\r\n return this._intersectTriangles(ray, positions, indices, step, checkStopper, fastCheck, trianglePredicate);\r\n }\r\n }\r\n\r\n /**\r\n * @param ray\r\n * @param positions\r\n * @param indices\r\n * @param intersectionThreshold\r\n * @param fastCheck\r\n * @hidden\r\n */\r\n private _intersectLines(ray: Ray, positions: Vector3[], indices: IndicesArray, intersectionThreshold: number, fastCheck?: boolean): Nullable<IntersectionInfo> {\r\n let intersectInfo: Nullable<IntersectionInfo> = null;\r\n\r\n // Line test\r\n for (let index = this.indexStart; index < this.indexStart + this.indexCount; index += 2) {\r\n const p0 = positions[indices[index]];\r\n const p1 = positions[indices[index + 1]];\r\n\r\n const length = ray.intersectionSegment(p0, p1, intersectionThreshold);\r\n if (length < 0) {\r\n continue;\r\n }\r\n\r\n if (fastCheck || !intersectInfo || length < intersectInfo.distance) {\r\n intersectInfo = new IntersectionInfo(null, null, length);\r\n intersectInfo.faceId = index / 2;\r\n if (fastCheck) {\r\n break;\r\n }\r\n }\r\n }\r\n return intersectInfo;\r\n }\r\n\r\n /**\r\n * @param ray\r\n * @param positions\r\n * @param indices\r\n * @param intersectionThreshold\r\n * @param fastCheck\r\n * @hidden\r\n */\r\n private _intersectUnIndexedLines(ray: Ray, positions: Vector3[], indices: IndicesArray, intersectionThreshold: number, fastCheck?: boolean): Nullable<IntersectionInfo> {\r\n let intersectInfo: Nullable<IntersectionInfo> = null;\r\n\r\n // Line test\r\n for (let index = this.verticesStart; index < this.verticesStart + this.verticesCount; index += 2) {\r\n const p0 = positions[index];\r\n const p1 = positions[index + 1];\r\n\r\n const length = ray.intersectionSegment(p0, p1, intersectionThreshold);\r\n if (length < 0) {\r\n continue;\r\n }\r\n\r\n if (fastCheck || !intersectInfo || length < intersectInfo.distance) {\r\n intersectInfo = new IntersectionInfo(null, null, length);\r\n intersectInfo.faceId = index / 2;\r\n if (fastCheck) {\r\n break;\r\n }\r\n }\r\n }\r\n\r\n return intersectInfo;\r\n }\r\n\r\n /**\r\n * @param ray\r\n * @param positions\r\n * @param indices\r\n * @param step\r\n * @param checkStopper\r\n * @param fastCheck\r\n * @param trianglePredicate\r\n * @hidden\r\n */\r\n private _intersectTriangles(\r\n ray: Ray,\r\n positions: Vector3[],\r\n indices: IndicesArray,\r\n step: number,\r\n checkStopper: boolean,\r\n fastCheck?: boolean,\r\n trianglePredicate?: TrianglePickingPredicate\r\n ): Nullable<IntersectionInfo> {\r\n let intersectInfo: Nullable<IntersectionInfo> = null;\r\n\r\n // Triangles test\r\n let faceId = -1;\r\n for (let index = this.indexStart; index < this.indexStart + this.indexCount - (3 - step); index += step) {\r\n faceId++;\r\n const indexA = indices[index];\r\n const indexB = indices[index + 1];\r\n const indexC = indices[index + 2];\r\n\r\n if (checkStopper && indexC === 0xffffffff) {\r\n index += 2;\r\n continue;\r\n }\r\n\r\n const p0 = positions[indexA];\r\n const p1 = positions[indexB];\r\n const p2 = positions[indexC];\r\n\r\n // stay defensive and don't check against undefined positions.\r\n if (!p0 || !p1 || !p2) {\r\n continue;\r\n }\r\n\r\n if (trianglePredicate && !trianglePredicate(p0, p1, p2, ray)) {\r\n continue;\r\n }\r\n\r\n const currentIntersectInfo = ray.intersectsTriangle(p0, p1, p2);\r\n\r\n if (currentIntersectInfo) {\r\n if (currentIntersectInfo.distance < 0) {\r\n continue;\r\n }\r\n\r\n if (fastCheck || !intersectInfo || currentIntersectInfo.distance < intersectInfo.distance) {\r\n intersectInfo = currentIntersectInfo;\r\n intersectInfo.faceId = faceId;\r\n\r\n if (fastCheck) {\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n return intersectInfo;\r\n }\r\n\r\n /**\r\n * @param ray\r\n * @param positions\r\n * @param indices\r\n * @param fastCheck\r\n * @param trianglePredicate\r\n * @hidden\r\n */\r\n private _intersectUnIndexedTriangles(\r\n ray: Ray,\r\n positions: Vector3[],\r\n indices: IndicesArray,\r\n fastCheck?: boolean,\r\n trianglePredicate?: TrianglePickingPredicate\r\n ): Nullable<IntersectionInfo> {\r\n let intersectInfo: Nullable<IntersectionInfo> = null;\r\n // Triangles test\r\n for (let index = this.verticesStart; index < this.verticesStart + this.verticesCount; index += 3) {\r\n const p0 = positions[index];\r\n const p1 = positions[index + 1];\r\n const p2 = positions[index + 2];\r\n\r\n if (trianglePredicate && !trianglePredicate(p0, p1, p2, ray)) {\r\n continue;\r\n }\r\n\r\n const currentIntersectInfo = ray.intersectsTriangle(p0, p1, p2);\r\n\r\n if (currentIntersectInfo) {\r\n if (currentIntersectInfo.distance < 0) {\r\n continue;\r\n }\r\n\r\n if (fastCheck || !intersectInfo || currentIntersectInfo.distance < intersectInfo.distance) {\r\n intersectInfo = currentIntersectInfo;\r\n intersectInfo.faceId = index / 3;\r\n\r\n if (fastCheck) {\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n return intersectInfo;\r\n }\r\n\r\n /** @hidden */\r\n public _rebuild(): void {\r\n if (this._linesIndexBuffer) {\r\n this._linesIndexBuffer = null;\r\n }\r\n }\r\n\r\n // Clone\r\n /**\r\n * Creates a new submesh from the passed mesh\r\n * @param newMesh defines the new hosting mesh\r\n * @param newRenderingMesh defines an optional rendering mesh\r\n * @returns the new submesh\r\n */\r\n public clone(newMesh: AbstractMesh, newRenderingMesh?: Mesh): SubMesh {\r\n const result = new SubMesh(this.materialIndex, this.verticesStart, this.verticesCount, this.indexStart, this.indexCount, newMesh, newRenderingMesh, false);\r\n\r\n if (!this.IsGlobal) {\r\n const boundingInfo = this.getBoundingInfo();\r\n\r\n if (!boundingInfo) {\r\n return result;\r\n }\r\n\r\n result._boundingInfo = new BoundingInfo(boundingInfo.minimum, boundingInfo.maximum);\r\n }\r\n\r\n return result;\r\n }\r\n\r\n // Dispose\r\n\r\n /**\r\n * Release associated resources\r\n */\r\n public dispose(): void {\r\n if (this._linesIndexBuffer) {\r\n this._mesh.getScene().getEngine()._releaseBuffer(this._linesIndexBuffer);\r\n this._linesIndexBuffer = null;\r\n }\r\n\r\n // Remove from mesh\r\n const index = this._mesh.subMeshes.indexOf(this);\r\n this._mesh.subMeshes.splice(index, 1);\r\n\r\n this.resetDrawCache();\r\n }\r\n\r\n /**\r\n * Gets the class name\r\n * @returns the string \"SubMesh\".\r\n */\r\n public getClassName(): string {\r\n return \"SubMesh\";\r\n }\r\n\r\n // Statics\r\n /**\r\n * Creates a new submesh from indices data\r\n * @param materialIndex the index of the main mesh material\r\n * @param startIndex the index where to start the copy in the mesh indices array\r\n * @param indexCount the number of indices to copy then from the startIndex\r\n * @param mesh the main mesh to create the submesh from\r\n * @param renderingMesh the optional rendering mesh\r\n * @param createBoundingBox defines if bounding box should be created for this submesh\r\n * @returns a new submesh\r\n */\r\n public static CreateFromIndices(\r\n materialIndex: number,\r\n startIndex: number,\r\n indexCount: number,\r\n mesh: AbstractMesh,\r\n renderingMesh?: Mesh,\r\n createBoundingBox: boolean = true\r\n ): SubMesh {\r\n let minVertexIndex = Number.MAX_VALUE;\r\n let maxVertexIndex = -Number.MAX_VALUE;\r\n\r\n const whatWillRender = renderingMesh || mesh;\r\n const indices = whatWillRender!.getIndices()!;\r\n\r\n for (let index = startIndex; index < startIndex + indexCount; index++) {\r\n const vertexIndex = indices[index];\r\n\r\n if (vertexIndex < minVertexIndex) {\r\n minVertexIndex = vertexIndex;\r\n }\r\n if (vertexIndex > maxVertexIndex) {\r\n maxVertexIndex = vertexIndex;\r\n }\r\n }\r\n\r\n return new SubMesh(materialIndex, minVertexIndex, maxVertexIndex - minVertexIndex + 1, startIndex, indexCount, mesh, renderingMesh, createBoundingBox);\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"subMesh.js","sourceRoot":"","sources":["../../../../../lts/core/generated/Meshes/subMesh.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Nullable, IndicesArray, DeepImmutable, FloatArray } from \"../types\";\r\nimport type { Matrix, Vector3 } from \"../Maths/math.vector\";\r\nimport type { Engine } from \"../Engines/engine\";\r\nimport { VertexBuffer } from \"../Buffers/buffer\";\r\nimport { IntersectionInfo } from \"../Collisions/intersectionInfo\";\r\nimport type { ICullable } from \"../Culling/boundingInfo\";\r\nimport { BoundingInfo } from \"../Culling/boundingInfo\";\r\nimport type { Effect } from \"../Materials/effect\";\r\nimport { Constants } from \"../Engines/constants\";\r\nimport type { DataBuffer } from \"../Buffers/dataBuffer\";\r\nimport { extractMinAndMaxIndexed } from \"../Maths/math.functions\";\r\nimport type { Plane } from \"../Maths/math.plane\";\r\nimport { DrawWrapper } from \"../Materials/drawWrapper\";\r\nimport type { IMaterialContext } from \"../Engines/IMaterialContext\";\r\n\r\ndeclare type Collider = import(\"../Collisions/collider\").Collider;\r\ndeclare type Material = import(\"../Materials/material\").Material;\r\ndeclare type MaterialDefines = import(\"../Materials/materialDefines\").MaterialDefines;\r\ndeclare type MultiMaterial = import(\"../Materials/multiMaterial\").MultiMaterial;\r\ndeclare type AbstractMesh = import(\"./abstractMesh\").AbstractMesh;\r\ndeclare type Mesh = import(\"./mesh\").Mesh;\r\ndeclare type Ray = import(\"../Culling/ray\").Ray;\r\ndeclare type TrianglePickingPredicate = import(\"../Culling/ray\").TrianglePickingPredicate;\r\n\r\n/**\r\n * Defines a subdivision inside a mesh\r\n */\r\nexport class SubMesh implements ICullable {\r\n private _engine: Engine;\r\n /** @hidden */\r\n public _drawWrappers: Array<DrawWrapper>; // index in this array = pass id\r\n private _mainDrawWrapperOverride: Nullable<DrawWrapper> = null;\r\n\r\n /**\r\n * Gets material defines used by the effect associated to the sub mesh\r\n */\r\n public get materialDefines(): Nullable<MaterialDefines> {\r\n return this._mainDrawWrapperOverride ? (this._mainDrawWrapperOverride.defines as MaterialDefines) : (this._getDrawWrapper()?.defines as Nullable<MaterialDefines>);\r\n }\r\n\r\n /**\r\n * Sets material defines used by the effect associated to the sub mesh\r\n */\r\n public set materialDefines(defines: Nullable<MaterialDefines>) {\r\n const drawWrapper = this._mainDrawWrapperOverride ?? this._getDrawWrapper(undefined, true)!;\r\n drawWrapper.defines = defines;\r\n }\r\n\r\n /**\r\n * @param passId\r\n * @param createIfNotExisting\r\n * @hidden\r\n */\r\n public _getDrawWrapper(passId?: number, createIfNotExisting = false): DrawWrapper | undefined {\r\n passId = passId ?? this._engine.currentRenderPassId;\r\n let drawWrapper = this._drawWrappers[passId];\r\n if (!drawWrapper && createIfNotExisting) {\r\n this._drawWrappers[passId] = drawWrapper = new DrawWrapper(this._mesh.getScene().getEngine());\r\n }\r\n return drawWrapper;\r\n }\r\n\r\n /**\r\n * @param passId\r\n * @param disposeWrapper\r\n * @hidden\r\n */\r\n public _removeDrawWrapper(passId: number, disposeWrapper = true) {\r\n if (disposeWrapper) {\r\n this._drawWrappers[passId]?.dispose();\r\n }\r\n this._drawWrappers[passId] = undefined as any;\r\n }\r\n\r\n /**\r\n * Gets associated (main) effect (possibly the effect override if defined)\r\n */\r\n public get effect(): Nullable<Effect> {\r\n return this._mainDrawWrapperOverride ? this._mainDrawWrapperOverride.effect : this._getDrawWrapper()?.effect ?? null;\r\n }\r\n\r\n /** @hidden */\r\n public get _drawWrapper(): DrawWrapper {\r\n return this._mainDrawWrapperOverride ?? this._getDrawWrapper(undefined, true)!;\r\n }\r\n\r\n /** @hidden */\r\n public get _drawWrapperOverride(): Nullable<DrawWrapper> {\r\n return this._mainDrawWrapperOverride;\r\n }\r\n\r\n /**\r\n * @param wrapper\r\n * @hidden\r\n */\r\n public _setMainDrawWrapperOverride(wrapper: Nullable<DrawWrapper>): void {\r\n this._mainDrawWrapperOverride = wrapper;\r\n }\r\n\r\n /**\r\n * Sets associated effect (effect used to render this submesh)\r\n * @param effect defines the effect to associate with\r\n * @param defines defines the set of defines used to compile this effect\r\n * @param materialContext material context associated to the effect\r\n * @param resetContext true to reset the draw context\r\n */\r\n public setEffect(effect: Nullable<Effect>, defines: Nullable<string | MaterialDefines> = null, materialContext?: IMaterialContext, resetContext = true) {\r\n const drawWrapper = this._drawWrapper;\r\n drawWrapper.setEffect(effect, defines, resetContext);\r\n if (materialContext !== undefined) {\r\n drawWrapper.materialContext = materialContext;\r\n }\r\n if (!effect) {\r\n drawWrapper.defines = null;\r\n drawWrapper.materialContext = undefined;\r\n }\r\n }\r\n\r\n /**\r\n * Resets the draw wrappers cache\r\n * @param passId If provided, releases only the draw wrapper corresponding to this render pass id\r\n */\r\n public resetDrawCache(passId?: number): void {\r\n if (this._drawWrappers) {\r\n if (passId !== undefined) {\r\n this._removeDrawWrapper(passId);\r\n return;\r\n } else {\r\n for (const drawWrapper of this._drawWrappers) {\r\n drawWrapper?.dispose();\r\n }\r\n }\r\n }\r\n this._drawWrappers = [];\r\n }\r\n\r\n /** @hidden */\r\n public _linesIndexCount: number = 0;\r\n private _mesh: AbstractMesh;\r\n private _renderingMesh: Mesh;\r\n private _boundingInfo: BoundingInfo;\r\n private _linesIndexBuffer: Nullable<DataBuffer> = null;\r\n /** @hidden */\r\n public _lastColliderWorldVertices: Nullable<Vector3[]> = null;\r\n /** @hidden */\r\n public _trianglePlanes: Plane[];\r\n /** @hidden */\r\n public _lastColliderTransformMatrix: Nullable<Matrix> = null;\r\n\r\n /** @hidden */\r\n public _renderId = 0;\r\n /** @hidden */\r\n public _alphaIndex: number = 0;\r\n /** @hidden */\r\n public _distanceToCamera: number = 0;\r\n /** @hidden */\r\n public _id: number;\r\n\r\n private _currentMaterial: Nullable<Material> = null;\r\n\r\n /**\r\n * Add a new submesh to a mesh\r\n * @param materialIndex defines the material index to use\r\n * @param verticesStart defines vertex index start\r\n * @param verticesCount defines vertices count\r\n * @param indexStart defines index start\r\n * @param indexCount defines indices count\r\n * @param mesh defines the parent mesh\r\n * @param renderingMesh defines an optional rendering mesh\r\n * @param createBoundingBox defines if bounding box should be created for this submesh\r\n * @returns the new submesh\r\n */\r\n public static AddToMesh(\r\n materialIndex: number,\r\n verticesStart: number,\r\n verticesCount: number,\r\n indexStart: number,\r\n indexCount: number,\r\n mesh: AbstractMesh,\r\n renderingMesh?: Mesh,\r\n createBoundingBox: boolean = true\r\n ): SubMesh {\r\n return new SubMesh(materialIndex, verticesStart, verticesCount, indexStart, indexCount, mesh, renderingMesh, createBoundingBox);\r\n }\r\n\r\n /**\r\n * Creates a new submesh\r\n * @param materialIndex defines the material index to use\r\n * @param verticesStart defines vertex index start\r\n * @param verticesCount defines vertices count\r\n * @param indexStart defines index start\r\n * @param indexCount defines indices count\r\n * @param mesh defines the parent mesh\r\n * @param renderingMesh defines an optional rendering mesh\r\n * @param createBoundingBox defines if bounding box should be created for this submesh\r\n * @param addToMesh defines a boolean indicating that the submesh must be added to the mesh.subMeshes array (true by default)\r\n */\r\n constructor(\r\n /** the material index to use */\r\n public materialIndex: number,\r\n /** vertex index start */\r\n public verticesStart: number,\r\n /** vertices count */\r\n public verticesCount: number,\r\n /** index start */\r\n public indexStart: number,\r\n /** indices count */\r\n public indexCount: number,\r\n mesh: AbstractMesh,\r\n renderingMesh?: Mesh,\r\n createBoundingBox: boolean = true,\r\n addToMesh = true\r\n ) {\r\n this._mesh = mesh;\r\n this._renderingMesh = renderingMesh || <Mesh>mesh;\r\n if (addToMesh) {\r\n mesh.subMeshes.push(this);\r\n }\r\n\r\n this._engine = this._mesh.getScene().getEngine();\r\n this.resetDrawCache();\r\n this._trianglePlanes = [];\r\n\r\n this._id = mesh.subMeshes.length - 1;\r\n\r\n if (createBoundingBox) {\r\n this.refreshBoundingInfo();\r\n mesh.computeWorldMatrix(true);\r\n }\r\n }\r\n\r\n /**\r\n * Returns true if this submesh covers the entire parent mesh\r\n * @ignorenaming\r\n */\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n public get IsGlobal(): boolean {\r\n return this.verticesStart === 0 && this.verticesCount === this._mesh.getTotalVertices();\r\n }\r\n\r\n /**\r\n * Returns the submesh BoundingInfo object\r\n * @returns current bounding info (or mesh's one if the submesh is global)\r\n */\r\n public getBoundingInfo(): BoundingInfo {\r\n if (this.IsGlobal) {\r\n return this._mesh.getBoundingInfo();\r\n }\r\n\r\n return this._boundingInfo;\r\n }\r\n\r\n /**\r\n * Sets the submesh BoundingInfo\r\n * @param boundingInfo defines the new bounding info to use\r\n * @returns the SubMesh\r\n */\r\n public setBoundingInfo(boundingInfo: BoundingInfo): SubMesh {\r\n this._boundingInfo = boundingInfo;\r\n return this;\r\n }\r\n\r\n /**\r\n * Returns the mesh of the current submesh\r\n * @return the parent mesh\r\n */\r\n public getMesh(): AbstractMesh {\r\n return this._mesh;\r\n }\r\n\r\n /**\r\n * Returns the rendering mesh of the submesh\r\n * @returns the rendering mesh (could be different from parent mesh)\r\n */\r\n public getRenderingMesh(): Mesh {\r\n return this._renderingMesh;\r\n }\r\n\r\n /**\r\n * Returns the replacement mesh of the submesh\r\n * @returns the replacement mesh (could be different from parent mesh)\r\n */\r\n public getReplacementMesh(): Nullable<AbstractMesh> {\r\n return this._mesh._internalAbstractMeshDataInfo._actAsRegularMesh ? this._mesh : null;\r\n }\r\n\r\n /**\r\n * Returns the effective mesh of the submesh\r\n * @returns the effective mesh (could be different from parent mesh)\r\n */\r\n public getEffectiveMesh(): AbstractMesh {\r\n const replacementMesh = this._mesh._internalAbstractMeshDataInfo._actAsRegularMesh ? this._mesh : null;\r\n\r\n return replacementMesh ? replacementMesh : this._renderingMesh;\r\n }\r\n\r\n /**\r\n * Returns the submesh material\r\n * @returns null or the current material\r\n */\r\n public getMaterial(): Nullable<Material> {\r\n const rootMaterial = this._renderingMesh.getMaterialForRenderPass(this._engine.currentRenderPassId) ?? this._renderingMesh.material;\r\n\r\n if (!rootMaterial) {\r\n return this._mesh.getScene().defaultMaterial;\r\n } else if (this._isMultiMaterial(rootMaterial)) {\r\n const effectiveMaterial = rootMaterial.getSubMaterial(this.materialIndex);\r\n\r\n if (this._currentMaterial !== effectiveMaterial) {\r\n this._currentMaterial = effectiveMaterial;\r\n this.resetDrawCache();\r\n }\r\n\r\n return effectiveMaterial;\r\n }\r\n\r\n return rootMaterial;\r\n }\r\n\r\n private _isMultiMaterial(material: Material): material is MultiMaterial {\r\n return (material as MultiMaterial).getSubMaterial !== undefined;\r\n }\r\n\r\n // Methods\r\n\r\n /**\r\n * Sets a new updated BoundingInfo object to the submesh\r\n * @param data defines an optional position array to use to determine the bounding info\r\n * @returns the SubMesh\r\n */\r\n public refreshBoundingInfo(data: Nullable<FloatArray> = null): SubMesh {\r\n this._lastColliderWorldVertices = null;\r\n\r\n if (this.IsGlobal || !this._renderingMesh || !this._renderingMesh.geometry) {\r\n return this;\r\n }\r\n\r\n if (!data) {\r\n data = this._renderingMesh.getVerticesData(VertexBuffer.PositionKind);\r\n }\r\n\r\n if (!data) {\r\n this._boundingInfo = this._mesh.getBoundingInfo();\r\n return this;\r\n }\r\n\r\n const indices = <IndicesArray>this._renderingMesh.getIndices();\r\n let extend: { minimum: Vector3; maximum: Vector3 };\r\n\r\n //is this the only submesh?\r\n if (this.indexStart === 0 && this.indexCount === indices.length) {\r\n const boundingInfo = this._renderingMesh.getBoundingInfo();\r\n\r\n //the rendering mesh's bounding info can be used, it is the standard submesh for all indices.\r\n extend = { minimum: boundingInfo.minimum.clone(), maximum: boundingInfo.maximum.clone() };\r\n } else {\r\n extend = extractMinAndMaxIndexed(data, indices, this.indexStart, this.indexCount, this._renderingMesh.geometry.boundingBias);\r\n }\r\n\r\n if (this._boundingInfo) {\r\n this._boundingInfo.reConstruct(extend.minimum, extend.maximum);\r\n } else {\r\n this._boundingInfo = new BoundingInfo(extend.minimum, extend.maximum);\r\n }\r\n return this;\r\n }\r\n\r\n /**\r\n * @param collider\r\n * @hidden\r\n */\r\n public _checkCollision(collider: Collider): boolean {\r\n const boundingInfo = this.getBoundingInfo();\r\n\r\n return boundingInfo._checkCollision(collider);\r\n }\r\n\r\n /**\r\n * Updates the submesh BoundingInfo\r\n * @param world defines the world matrix to use to update the bounding info\r\n * @returns the submesh\r\n */\r\n public updateBoundingInfo(world: DeepImmutable<Matrix>): SubMesh {\r\n let boundingInfo = this.getBoundingInfo();\r\n\r\n if (!boundingInfo) {\r\n this.refreshBoundingInfo();\r\n boundingInfo = this.getBoundingInfo();\r\n }\r\n if (boundingInfo) {\r\n (<BoundingInfo>boundingInfo).update(world);\r\n }\r\n return this;\r\n }\r\n\r\n /**\r\n * True is the submesh bounding box intersects the frustum defined by the passed array of planes.\r\n * @param frustumPlanes defines the frustum planes\r\n * @returns true if the submesh is intersecting with the frustum\r\n */\r\n public isInFrustum(frustumPlanes: Plane[]): boolean {\r\n const boundingInfo = this.getBoundingInfo();\r\n\r\n if (!boundingInfo) {\r\n return false;\r\n }\r\n return boundingInfo.isInFrustum(frustumPlanes, this._mesh.cullingStrategy);\r\n }\r\n\r\n /**\r\n * True is the submesh bounding box is completely inside the frustum defined by the passed array of planes\r\n * @param frustumPlanes defines the frustum planes\r\n * @returns true if the submesh is inside the frustum\r\n */\r\n public isCompletelyInFrustum(frustumPlanes: Plane[]): boolean {\r\n const boundingInfo = this.getBoundingInfo();\r\n\r\n if (!boundingInfo) {\r\n return false;\r\n }\r\n return boundingInfo.isCompletelyInFrustum(frustumPlanes);\r\n }\r\n\r\n /**\r\n * Renders the submesh\r\n * @param enableAlphaMode defines if alpha needs to be used\r\n * @returns the submesh\r\n */\r\n public render(enableAlphaMode: boolean): SubMesh {\r\n this._renderingMesh.render(this, enableAlphaMode, this._mesh._internalAbstractMeshDataInfo._actAsRegularMesh ? this._mesh : undefined);\r\n return this;\r\n }\r\n\r\n /**\r\n * @param indices\r\n * @param engine\r\n * @hidden\r\n */\r\n public _getLinesIndexBuffer(indices: IndicesArray, engine: Engine): DataBuffer {\r\n if (!this._linesIndexBuffer) {\r\n const linesIndices = [];\r\n\r\n for (let index = this.indexStart; index < this.indexStart + this.indexCount; index += 3) {\r\n linesIndices.push(indices[index], indices[index + 1], indices[index + 1], indices[index + 2], indices[index + 2], indices[index]);\r\n }\r\n\r\n this._linesIndexBuffer = engine.createIndexBuffer(linesIndices);\r\n this._linesIndexCount = linesIndices.length;\r\n }\r\n return this._linesIndexBuffer;\r\n }\r\n\r\n /**\r\n * Checks if the submesh intersects with a ray\r\n * @param ray defines the ray to test\r\n * @returns true is the passed ray intersects the submesh bounding box\r\n */\r\n public canIntersects(ray: Ray): boolean {\r\n const boundingInfo = this.getBoundingInfo();\r\n\r\n if (!boundingInfo) {\r\n return false;\r\n }\r\n return ray.intersectsBox(boundingInfo.boundingBox);\r\n }\r\n\r\n /**\r\n * Intersects current submesh with a ray\r\n * @param ray defines the ray to test\r\n * @param positions defines mesh's positions array\r\n * @param indices defines mesh's indices array\r\n * @param fastCheck defines if the first intersection will be used (and not the closest)\r\n * @param trianglePredicate defines an optional predicate used to select faces when a mesh intersection is detected\r\n * @returns intersection info or null if no intersection\r\n */\r\n public intersects(ray: Ray, positions: Vector3[], indices: IndicesArray, fastCheck?: boolean, trianglePredicate?: TrianglePickingPredicate): Nullable<IntersectionInfo> {\r\n const material = this.getMaterial();\r\n if (!material) {\r\n return null;\r\n }\r\n let step = 3;\r\n let checkStopper = false;\r\n\r\n switch (material.fillMode) {\r\n case Constants.MATERIAL_PointListDrawMode:\r\n case Constants.MATERIAL_LineLoopDrawMode:\r\n case Constants.MATERIAL_LineStripDrawMode:\r\n case Constants.MATERIAL_TriangleFanDrawMode:\r\n return null;\r\n case Constants.MATERIAL_TriangleStripDrawMode:\r\n step = 1;\r\n checkStopper = true;\r\n break;\r\n default:\r\n break;\r\n }\r\n\r\n // LineMesh first as it's also a Mesh...\r\n if (material.fillMode === Constants.MATERIAL_LineListDrawMode) {\r\n // Check if mesh is unindexed\r\n if (!indices.length) {\r\n return this._intersectUnIndexedLines(ray, positions, indices, (this._mesh as any).intersectionThreshold, fastCheck);\r\n }\r\n return this._intersectLines(ray, positions, indices, (this._mesh as any).intersectionThreshold, fastCheck);\r\n } else {\r\n // Check if mesh is unindexed\r\n if (!indices.length && this._mesh._unIndexed) {\r\n return this._intersectUnIndexedTriangles(ray, positions, indices, fastCheck, trianglePredicate);\r\n }\r\n\r\n return this._intersectTriangles(ray, positions, indices, step, checkStopper, fastCheck, trianglePredicate);\r\n }\r\n }\r\n\r\n /**\r\n * @param ray\r\n * @param positions\r\n * @param indices\r\n * @param intersectionThreshold\r\n * @param fastCheck\r\n * @hidden\r\n */\r\n private _intersectLines(ray: Ray, positions: Vector3[], indices: IndicesArray, intersectionThreshold: number, fastCheck?: boolean): Nullable<IntersectionInfo> {\r\n let intersectInfo: Nullable<IntersectionInfo> = null;\r\n\r\n // Line test\r\n for (let index = this.indexStart; index < this.indexStart + this.indexCount; index += 2) {\r\n const p0 = positions[indices[index]];\r\n const p1 = positions[indices[index + 1]];\r\n\r\n const length = ray.intersectionSegment(p0, p1, intersectionThreshold);\r\n if (length < 0) {\r\n continue;\r\n }\r\n\r\n if (fastCheck || !intersectInfo || length < intersectInfo.distance) {\r\n intersectInfo = new IntersectionInfo(null, null, length);\r\n intersectInfo.faceId = index / 2;\r\n if (fastCheck) {\r\n break;\r\n }\r\n }\r\n }\r\n return intersectInfo;\r\n }\r\n\r\n /**\r\n * @param ray\r\n * @param positions\r\n * @param indices\r\n * @param intersectionThreshold\r\n * @param fastCheck\r\n * @hidden\r\n */\r\n private _intersectUnIndexedLines(ray: Ray, positions: Vector3[], indices: IndicesArray, intersectionThreshold: number, fastCheck?: boolean): Nullable<IntersectionInfo> {\r\n let intersectInfo: Nullable<IntersectionInfo> = null;\r\n\r\n // Line test\r\n for (let index = this.verticesStart; index < this.verticesStart + this.verticesCount; index += 2) {\r\n const p0 = positions[index];\r\n const p1 = positions[index + 1];\r\n\r\n const length = ray.intersectionSegment(p0, p1, intersectionThreshold);\r\n if (length < 0) {\r\n continue;\r\n }\r\n\r\n if (fastCheck || !intersectInfo || length < intersectInfo.distance) {\r\n intersectInfo = new IntersectionInfo(null, null, length);\r\n intersectInfo.faceId = index / 2;\r\n if (fastCheck) {\r\n break;\r\n }\r\n }\r\n }\r\n\r\n return intersectInfo;\r\n }\r\n\r\n /**\r\n * @param ray\r\n * @param positions\r\n * @param indices\r\n * @param step\r\n * @param checkStopper\r\n * @param fastCheck\r\n * @param trianglePredicate\r\n * @hidden\r\n */\r\n private _intersectTriangles(\r\n ray: Ray,\r\n positions: Vector3[],\r\n indices: IndicesArray,\r\n step: number,\r\n checkStopper: boolean,\r\n fastCheck?: boolean,\r\n trianglePredicate?: TrianglePickingPredicate\r\n ): Nullable<IntersectionInfo> {\r\n let intersectInfo: Nullable<IntersectionInfo> = null;\r\n\r\n // Triangles test\r\n let faceId = -1;\r\n for (let index = this.indexStart; index < this.indexStart + this.indexCount - (3 - step); index += step) {\r\n faceId++;\r\n const indexA = indices[index];\r\n const indexB = indices[index + 1];\r\n const indexC = indices[index + 2];\r\n\r\n if (checkStopper && indexC === 0xffffffff) {\r\n index += 2;\r\n continue;\r\n }\r\n\r\n const p0 = positions[indexA];\r\n const p1 = positions[indexB];\r\n const p2 = positions[indexC];\r\n\r\n // stay defensive and don't check against undefined positions.\r\n if (!p0 || !p1 || !p2) {\r\n continue;\r\n }\r\n\r\n if (trianglePredicate && !trianglePredicate(p0, p1, p2, ray)) {\r\n continue;\r\n }\r\n\r\n const currentIntersectInfo = ray.intersectsTriangle(p0, p1, p2);\r\n\r\n if (currentIntersectInfo) {\r\n if (currentIntersectInfo.distance < 0) {\r\n continue;\r\n }\r\n\r\n if (fastCheck || !intersectInfo || currentIntersectInfo.distance < intersectInfo.distance) {\r\n intersectInfo = currentIntersectInfo;\r\n intersectInfo.faceId = faceId;\r\n\r\n if (fastCheck) {\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n return intersectInfo;\r\n }\r\n\r\n /**\r\n * @param ray\r\n * @param positions\r\n * @param indices\r\n * @param fastCheck\r\n * @param trianglePredicate\r\n * @hidden\r\n */\r\n private _intersectUnIndexedTriangles(\r\n ray: Ray,\r\n positions: Vector3[],\r\n indices: IndicesArray,\r\n fastCheck?: boolean,\r\n trianglePredicate?: TrianglePickingPredicate\r\n ): Nullable<IntersectionInfo> {\r\n let intersectInfo: Nullable<IntersectionInfo> = null;\r\n // Triangles test\r\n for (let index = this.verticesStart; index < this.verticesStart + this.verticesCount; index += 3) {\r\n const p0 = positions[index];\r\n const p1 = positions[index + 1];\r\n const p2 = positions[index + 2];\r\n\r\n if (trianglePredicate && !trianglePredicate(p0, p1, p2, ray)) {\r\n continue;\r\n }\r\n\r\n const currentIntersectInfo = ray.intersectsTriangle(p0, p1, p2);\r\n\r\n if (currentIntersectInfo) {\r\n if (currentIntersectInfo.distance < 0) {\r\n continue;\r\n }\r\n\r\n if (fastCheck || !intersectInfo || currentIntersectInfo.distance < intersectInfo.distance) {\r\n intersectInfo = currentIntersectInfo;\r\n intersectInfo.faceId = index / 3;\r\n\r\n if (fastCheck) {\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n return intersectInfo;\r\n }\r\n\r\n /** @hidden */\r\n public _rebuild(): void {\r\n if (this._linesIndexBuffer) {\r\n this._linesIndexBuffer = null;\r\n }\r\n }\r\n\r\n // Clone\r\n /**\r\n * Creates a new submesh from the passed mesh\r\n * @param newMesh defines the new hosting mesh\r\n * @param newRenderingMesh defines an optional rendering mesh\r\n * @returns the new submesh\r\n */\r\n public clone(newMesh: AbstractMesh, newRenderingMesh?: Mesh): SubMesh {\r\n const result = new SubMesh(this.materialIndex, this.verticesStart, this.verticesCount, this.indexStart, this.indexCount, newMesh, newRenderingMesh, false);\r\n\r\n if (!this.IsGlobal) {\r\n const boundingInfo = this.getBoundingInfo();\r\n\r\n if (!boundingInfo) {\r\n return result;\r\n }\r\n\r\n result._boundingInfo = new BoundingInfo(boundingInfo.minimum, boundingInfo.maximum);\r\n }\r\n\r\n return result;\r\n }\r\n\r\n // Dispose\r\n\r\n /**\r\n * Release associated resources\r\n */\r\n public dispose(): void {\r\n if (this._linesIndexBuffer) {\r\n this._mesh.getScene().getEngine()._releaseBuffer(this._linesIndexBuffer);\r\n this._linesIndexBuffer = null;\r\n }\r\n\r\n // Remove from mesh\r\n const index = this._mesh.subMeshes.indexOf(this);\r\n this._mesh.subMeshes.splice(index, 1);\r\n\r\n this.resetDrawCache();\r\n }\r\n\r\n /**\r\n * Gets the class name\r\n * @returns the string \"SubMesh\".\r\n */\r\n public getClassName(): string {\r\n return \"SubMesh\";\r\n }\r\n\r\n // Statics\r\n /**\r\n * Creates a new submesh from indices data\r\n * @param materialIndex the index of the main mesh material\r\n * @param startIndex the index where to start the copy in the mesh indices array\r\n * @param indexCount the number of indices to copy then from the startIndex\r\n * @param mesh the main mesh to create the submesh from\r\n * @param renderingMesh the optional rendering mesh\r\n * @param createBoundingBox defines if bounding box should be created for this submesh\r\n * @returns a new submesh\r\n */\r\n public static CreateFromIndices(\r\n materialIndex: number,\r\n startIndex: number,\r\n indexCount: number,\r\n mesh: AbstractMesh,\r\n renderingMesh?: Mesh,\r\n createBoundingBox: boolean = true\r\n ): SubMesh {\r\n let minVertexIndex = Number.MAX_VALUE;\r\n let maxVertexIndex = -Number.MAX_VALUE;\r\n\r\n const whatWillRender = renderingMesh || mesh;\r\n const indices = whatWillRender!.getIndices()!;\r\n\r\n for (let index = startIndex; index < startIndex + indexCount; index++) {\r\n const vertexIndex = indices[index];\r\n\r\n if (vertexIndex < minVertexIndex) {\r\n minVertexIndex = vertexIndex;\r\n }\r\n if (vertexIndex > maxVertexIndex) {\r\n maxVertexIndex = vertexIndex;\r\n }\r\n }\r\n\r\n return new SubMesh(materialIndex, minVertexIndex, maxVertexIndex - minVertexIndex + 1, startIndex, indexCount, mesh, renderingMesh, createBoundingBox);\r\n }\r\n}\r\n"]}
@@ -64,7 +64,8 @@ Object.defineProperty(Mesh.prototype, "thinInstanceCount", {
64
64
  },
65
65
  set: function (value) {
66
66
  var _a, _b;
67
- var numMaxInstances = ((_b = (_a = this._thinInstanceDataStorage.matrixData) === null || _a === void 0 ? void 0 : _a.length) !== null && _b !== void 0 ? _b : 0) / 16;
67
+ var matrixData = (_a = this._thinInstanceDataStorage.matrixData) !== null && _a !== void 0 ? _a : (_b = this.source) === null || _b === void 0 ? void 0 : _b._thinInstanceDataStorage.matrixData;
68
+ var numMaxInstances = matrixData ? matrixData.length / 16 : 0;
68
69
  if (value <= numMaxInstances) {
69
70
  this._thinInstanceDataStorage.instancesCount = value;
70
71
  }
@@ -1 +1 @@
1
- {"version":3,"file":"thinInstanceMesh.js","sourceRoot":"","sources":["../../../../../lts/core/generated/Meshes/thinInstanceMesh.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Nullable, DeepImmutableObject } from \"../types\";\r\nimport { Mesh } from \"../Meshes/mesh\";\r\nimport { VertexBuffer, Buffer } from \"../Buffers/buffer\";\r\nimport { Matrix, Vector3, TmpVectors } from \"../Maths/math.vector\";\r\n\r\ndeclare module \"./mesh\" {\r\n export interface Mesh {\r\n /**\r\n * Gets or sets a boolean defining if we want picking to pick thin instances as well\r\n */\r\n thinInstanceEnablePicking: boolean;\r\n /**\r\n * Creates a new thin instance\r\n * @param matrix the matrix or array of matrices (position, rotation, scale) of the thin instance(s) to create\r\n * @param refresh true to refresh the underlying gpu buffer (default: true). If you do multiple calls to this method in a row, set refresh to true only for the last call to save performance\r\n * @returns the thin instance index number. If you pass an array of matrices, other instance indexes are index+1, index+2, etc\r\n */\r\n thinInstanceAdd(matrix: DeepImmutableObject<Matrix> | Array<DeepImmutableObject<Matrix>>, refresh?: boolean): number;\r\n\r\n /**\r\n * Adds the transformation (matrix) of the current mesh as a thin instance\r\n * @param refresh true to refresh the underlying gpu buffer (default: true). If you do multiple calls to this method in a row, set refresh to true only for the last call to save performance\r\n * @returns the thin instance index number\r\n */\r\n thinInstanceAddSelf(refresh?: boolean): number;\r\n\r\n /**\r\n * Registers a custom attribute to be used with thin instances\r\n * @param kind name of the attribute\r\n * @param stride size in floats of the attribute\r\n */\r\n thinInstanceRegisterAttribute(kind: string, stride: number): void;\r\n\r\n /**\r\n * Sets the matrix of a thin instance\r\n * @param index index of the thin instance\r\n * @param matrix matrix to set\r\n * @param refresh true to refresh the underlying gpu buffer (default: true). If you do multiple calls to this method in a row, set refresh to true only for the last call to save performance\r\n */\r\n thinInstanceSetMatrixAt(index: number, matrix: DeepImmutableObject<Matrix>, refresh?: boolean): void;\r\n\r\n /**\r\n * Sets the value of a custom attribute for a thin instance\r\n * @param kind name of the attribute\r\n * @param index index of the thin instance\r\n * @param value value to set\r\n * @param refresh true to refresh the underlying gpu buffer (default: true). If you do multiple calls to this method in a row, set refresh to true only for the last call to save performance\r\n */\r\n thinInstanceSetAttributeAt(kind: string, index: number, value: Array<number>, refresh?: boolean): void;\r\n\r\n /**\r\n * Gets / sets the number of thin instances to display. Note that you can't set a number higher than what the underlying buffer can handle.\r\n */\r\n thinInstanceCount: number;\r\n\r\n /**\r\n * Sets a buffer to be used with thin instances. This method is a faster way to setup multiple instances than calling thinInstanceAdd repeatedly\r\n * @param kind name of the attribute. Use \"matrix\" to setup the buffer of matrices\r\n * @param buffer buffer to set\r\n * @param stride size in floats of each value of the buffer\r\n * @param staticBuffer indicates that the buffer is static, so that you won't change it after it is set (better performances - false by default)\r\n */\r\n thinInstanceSetBuffer(kind: string, buffer: Nullable<Float32Array>, stride?: number, staticBuffer?: boolean): void;\r\n\r\n /**\r\n * Gets the list of world matrices\r\n * @return an array containing all the world matrices from the thin instances\r\n */\r\n thinInstanceGetWorldMatrices(): Matrix[];\r\n\r\n /**\r\n * Synchronize the gpu buffers with a thin instance buffer. Call this method if you update later on the buffers passed to thinInstanceSetBuffer\r\n * @param kind name of the attribute to update. Use \"matrix\" to update the buffer of matrices\r\n */\r\n thinInstanceBufferUpdated(kind: string): void;\r\n\r\n /**\r\n * Applies a partial update to a buffer directly on the GPU\r\n * Note that the buffer located on the CPU is NOT updated! It's up to you to update it (or not) with the same data you pass to this method\r\n * @param kind name of the attribute to update. Use \"matrix\" to update the buffer of matrices\r\n * @param data the data to set in the GPU buffer\r\n * @param offset the offset in the GPU buffer where to update the data\r\n */\r\n thinInstancePartialBufferUpdate(kind: string, data: Float32Array, offset: number): void;\r\n\r\n /**\r\n * Refreshes the bounding info, taking into account all the thin instances defined\r\n * @param forceRefreshParentInfo true to force recomputing the mesh bounding info and use it to compute the aggregated bounding info\r\n * @param applySkeleton defines whether to apply the skeleton before computing the bounding info\r\n * @param applyMorph defines whether to apply the morph target before computing the bounding info\r\n */\r\n thinInstanceRefreshBoundingInfo(forceRefreshParentInfo?: boolean, applySkeleton?: boolean, applyMorph?: boolean): void;\r\n\r\n /** @hidden */\r\n _thinInstanceInitializeUserStorage(): void;\r\n\r\n /** @hidden */\r\n _thinInstanceUpdateBufferSize(kind: string, numInstances?: number): void;\r\n\r\n /** @hidden */\r\n _thinInstanceCreateMatrixBuffer(kind: string, buffer: Nullable<Float32Array>, staticBuffer: boolean): Buffer;\r\n\r\n /** @hidden */\r\n _userThinInstanceBuffersStorage: {\r\n data: { [key: string]: Float32Array };\r\n sizes: { [key: string]: number };\r\n vertexBuffers: { [key: string]: Nullable<VertexBuffer> };\r\n strides: { [key: string]: number };\r\n };\r\n }\r\n}\r\n\r\nMesh.prototype.thinInstanceAdd = function (matrix: DeepImmutableObject<Matrix> | Array<DeepImmutableObject<Matrix>>, refresh: boolean = true): number {\r\n this._thinInstanceUpdateBufferSize(\"matrix\", Array.isArray(matrix) ? matrix.length : 1);\r\n\r\n const index = this._thinInstanceDataStorage.instancesCount;\r\n\r\n if (Array.isArray(matrix)) {\r\n for (let i = 0; i < matrix.length; ++i) {\r\n this.thinInstanceSetMatrixAt(this._thinInstanceDataStorage.instancesCount++, matrix[i], i === matrix.length - 1 && refresh);\r\n }\r\n } else {\r\n this.thinInstanceSetMatrixAt(this._thinInstanceDataStorage.instancesCount++, matrix, refresh);\r\n }\r\n\r\n return index;\r\n};\r\n\r\nMesh.prototype.thinInstanceAddSelf = function (refresh: boolean = true): number {\r\n return this.thinInstanceAdd(Matrix.IdentityReadOnly, refresh);\r\n};\r\n\r\nMesh.prototype.thinInstanceRegisterAttribute = function (kind: string, stride: number): void {\r\n this.removeVerticesData(kind);\r\n\r\n this._thinInstanceInitializeUserStorage();\r\n\r\n this._userThinInstanceBuffersStorage.strides[kind] = stride;\r\n this._userThinInstanceBuffersStorage.sizes[kind] = stride * Math.max(32, this._thinInstanceDataStorage.instancesCount); // Initial size\r\n this._userThinInstanceBuffersStorage.data[kind] = new Float32Array(this._userThinInstanceBuffersStorage.sizes[kind]);\r\n this._userThinInstanceBuffersStorage.vertexBuffers[kind] = new VertexBuffer(this.getEngine(), this._userThinInstanceBuffersStorage.data[kind], kind, true, false, stride, true);\r\n\r\n this.setVerticesBuffer(this._userThinInstanceBuffersStorage.vertexBuffers[kind]!);\r\n};\r\n\r\nMesh.prototype.thinInstanceSetMatrixAt = function (index: number, matrix: DeepImmutableObject<Matrix>, refresh: boolean = true): boolean {\r\n if (!this._thinInstanceDataStorage.matrixData || index >= this._thinInstanceDataStorage.instancesCount) {\r\n return false;\r\n }\r\n\r\n const matrixData = this._thinInstanceDataStorage.matrixData;\r\n\r\n matrix.copyToArray(matrixData, index * 16);\r\n\r\n if (this._thinInstanceDataStorage.worldMatrices) {\r\n this._thinInstanceDataStorage.worldMatrices[index] = matrix as Matrix;\r\n }\r\n\r\n if (refresh) {\r\n this.thinInstanceBufferUpdated(\"matrix\");\r\n\r\n if (!this.doNotSyncBoundingInfo) {\r\n this.thinInstanceRefreshBoundingInfo(false);\r\n }\r\n }\r\n\r\n return true;\r\n};\r\n\r\nMesh.prototype.thinInstanceSetAttributeAt = function (kind: string, index: number, value: Array<number>, refresh: boolean = true): boolean {\r\n if (!this._userThinInstanceBuffersStorage || !this._userThinInstanceBuffersStorage.data[kind] || index >= this._thinInstanceDataStorage.instancesCount) {\r\n return false;\r\n }\r\n\r\n this._thinInstanceUpdateBufferSize(kind, 0); // make sur the buffer for the kind attribute is big enough\r\n\r\n this._userThinInstanceBuffersStorage.data[kind].set(value, index * this._userThinInstanceBuffersStorage.strides[kind]);\r\n\r\n if (refresh) {\r\n this.thinInstanceBufferUpdated(kind);\r\n }\r\n\r\n return true;\r\n};\r\n\r\nObject.defineProperty(Mesh.prototype, \"thinInstanceCount\", {\r\n get: function (this: Mesh) {\r\n return this._thinInstanceDataStorage.instancesCount;\r\n },\r\n set: function (this: Mesh, value: number) {\r\n const numMaxInstances = (this._thinInstanceDataStorage.matrixData?.length ?? 0) / 16;\r\n\r\n if (value <= numMaxInstances) {\r\n this._thinInstanceDataStorage.instancesCount = value;\r\n }\r\n },\r\n enumerable: true,\r\n configurable: true,\r\n});\r\n\r\nMesh.prototype._thinInstanceCreateMatrixBuffer = function (kind: string, buffer: Float32Array, staticBuffer: boolean = false): Buffer {\r\n const matrixBuffer = new Buffer(this.getEngine(), buffer, !staticBuffer, 16, false, true);\r\n\r\n for (let i = 0; i < 4; i++) {\r\n this.setVerticesBuffer(matrixBuffer.createVertexBuffer(kind + i, i * 4, 4));\r\n }\r\n\r\n return matrixBuffer;\r\n};\r\n\r\nMesh.prototype.thinInstanceSetBuffer = function (kind: string, buffer: Nullable<Float32Array>, stride: number = 0, staticBuffer: boolean = false): void {\r\n stride = stride || 16;\r\n\r\n if (kind === \"matrix\") {\r\n this._thinInstanceDataStorage.matrixBuffer?.dispose();\r\n this._thinInstanceDataStorage.matrixBuffer = null;\r\n this._thinInstanceDataStorage.matrixBufferSize = buffer ? buffer.length : 32 * stride;\r\n this._thinInstanceDataStorage.matrixData = buffer;\r\n this._thinInstanceDataStorage.worldMatrices = null;\r\n\r\n if (buffer !== null) {\r\n this._thinInstanceDataStorage.instancesCount = buffer.length / stride;\r\n this._thinInstanceDataStorage.matrixBuffer = this._thinInstanceCreateMatrixBuffer(\"world\", buffer, staticBuffer);\r\n\r\n if (!this.doNotSyncBoundingInfo) {\r\n this.thinInstanceRefreshBoundingInfo(false);\r\n }\r\n } else {\r\n this._thinInstanceDataStorage.instancesCount = 0;\r\n if (!this.doNotSyncBoundingInfo) {\r\n // mesh has no more thin instances, so need to recompute the bounding box because it's the regular mesh that will now be displayed\r\n this.refreshBoundingInfo();\r\n }\r\n }\r\n } else if (kind === \"previousMatrix\") {\r\n this._thinInstanceDataStorage.previousMatrixBuffer?.dispose();\r\n this._thinInstanceDataStorage.previousMatrixBuffer = null;\r\n this._thinInstanceDataStorage.previousMatrixData = buffer;\r\n if (buffer !== null) {\r\n this._thinInstanceDataStorage.previousMatrixBuffer = this._thinInstanceCreateMatrixBuffer(\"previousWorld\", buffer, staticBuffer);\r\n }\r\n } else {\r\n // color for instanced mesh is ColorInstanceKind and not ColorKind because of native that needs to do the differenciation\r\n // hot switching kind here to preserve backward compatibility\r\n if (kind === VertexBuffer.ColorKind) {\r\n kind = VertexBuffer.ColorInstanceKind;\r\n }\r\n\r\n if (buffer === null) {\r\n if (this._userThinInstanceBuffersStorage?.data[kind]) {\r\n this.removeVerticesData(kind);\r\n delete this._userThinInstanceBuffersStorage.data[kind];\r\n delete this._userThinInstanceBuffersStorage.strides[kind];\r\n delete this._userThinInstanceBuffersStorage.sizes[kind];\r\n delete this._userThinInstanceBuffersStorage.vertexBuffers[kind];\r\n }\r\n } else {\r\n this._thinInstanceInitializeUserStorage();\r\n\r\n this._userThinInstanceBuffersStorage.data[kind] = buffer;\r\n this._userThinInstanceBuffersStorage.strides[kind] = stride;\r\n this._userThinInstanceBuffersStorage.sizes[kind] = buffer.length;\r\n this._userThinInstanceBuffersStorage.vertexBuffers[kind] = new VertexBuffer(this.getEngine(), buffer, kind, !staticBuffer, false, stride, true);\r\n\r\n this.setVerticesBuffer(this._userThinInstanceBuffersStorage.vertexBuffers[kind]!);\r\n }\r\n }\r\n};\r\n\r\nMesh.prototype.thinInstanceBufferUpdated = function (kind: string): void {\r\n if (kind === \"matrix\") {\r\n this._thinInstanceDataStorage.matrixBuffer?.updateDirectly(this._thinInstanceDataStorage.matrixData!, 0, this._thinInstanceDataStorage.instancesCount);\r\n } else if (kind === \"previousMatrix\") {\r\n this._thinInstanceDataStorage.previousMatrixBuffer?.updateDirectly(this._thinInstanceDataStorage.previousMatrixData!, 0, this._thinInstanceDataStorage.instancesCount);\r\n } else if (this._userThinInstanceBuffersStorage?.vertexBuffers[kind]) {\r\n this._userThinInstanceBuffersStorage.vertexBuffers[kind]!.updateDirectly(this._userThinInstanceBuffersStorage.data[kind], 0);\r\n }\r\n};\r\n\r\nMesh.prototype.thinInstancePartialBufferUpdate = function (kind: string, data: Float32Array, offset: number): void {\r\n if (kind === \"matrix\") {\r\n if (this._thinInstanceDataStorage.matrixBuffer) {\r\n this._thinInstanceDataStorage.matrixBuffer.updateDirectly(data, offset);\r\n }\r\n } else if (this._userThinInstanceBuffersStorage?.vertexBuffers[kind]) {\r\n this._userThinInstanceBuffersStorage.vertexBuffers[kind]!.updateDirectly(data, offset);\r\n }\r\n};\r\n\r\nMesh.prototype.thinInstanceGetWorldMatrices = function (): Matrix[] {\r\n if (!this._thinInstanceDataStorage.matrixData || !this._thinInstanceDataStorage.matrixBuffer) {\r\n return [];\r\n }\r\n const matrixData = this._thinInstanceDataStorage.matrixData;\r\n\r\n if (!this._thinInstanceDataStorage.worldMatrices) {\r\n this._thinInstanceDataStorage.worldMatrices = new Array<Matrix>();\r\n\r\n for (let i = 0; i < this._thinInstanceDataStorage.instancesCount; ++i) {\r\n this._thinInstanceDataStorage.worldMatrices[i] = Matrix.FromArray(matrixData, i * 16);\r\n }\r\n }\r\n\r\n return this._thinInstanceDataStorage.worldMatrices;\r\n};\r\n\r\nMesh.prototype.thinInstanceRefreshBoundingInfo = function (forceRefreshParentInfo: boolean = false, applySkeleton: boolean = false, applyMorph: boolean = false) {\r\n if (!this._thinInstanceDataStorage.matrixData || !this._thinInstanceDataStorage.matrixBuffer) {\r\n return;\r\n }\r\n\r\n const vectors = this._thinInstanceDataStorage.boundingVectors;\r\n\r\n if (forceRefreshParentInfo) {\r\n vectors.length = 0;\r\n this.refreshBoundingInfo(applySkeleton, applyMorph);\r\n }\r\n\r\n const boundingInfo = this.getBoundingInfo();\r\n const matrixData = this._thinInstanceDataStorage.matrixData;\r\n\r\n if (vectors.length === 0) {\r\n for (let v = 0; v < boundingInfo.boundingBox.vectors.length; ++v) {\r\n vectors.push(boundingInfo.boundingBox.vectors[v].clone());\r\n }\r\n }\r\n\r\n TmpVectors.Vector3[0].setAll(Number.POSITIVE_INFINITY); // min\r\n TmpVectors.Vector3[1].setAll(Number.NEGATIVE_INFINITY); // max\r\n\r\n for (let i = 0; i < this._thinInstanceDataStorage.instancesCount; ++i) {\r\n Matrix.FromArrayToRef(matrixData, i * 16, TmpVectors.Matrix[0]);\r\n\r\n for (let v = 0; v < vectors.length; ++v) {\r\n Vector3.TransformCoordinatesToRef(vectors[v], TmpVectors.Matrix[0], TmpVectors.Vector3[2]);\r\n TmpVectors.Vector3[0].minimizeInPlace(TmpVectors.Vector3[2]);\r\n TmpVectors.Vector3[1].maximizeInPlace(TmpVectors.Vector3[2]);\r\n }\r\n }\r\n\r\n boundingInfo.reConstruct(TmpVectors.Vector3[0], TmpVectors.Vector3[1]);\r\n\r\n this._updateBoundingInfo();\r\n};\r\n\r\nMesh.prototype._thinInstanceUpdateBufferSize = function (kind: string, numInstances: number = 1) {\r\n const kindIsMatrix = kind === \"matrix\";\r\n\r\n if (!kindIsMatrix && (!this._userThinInstanceBuffersStorage || !this._userThinInstanceBuffersStorage.strides[kind])) {\r\n return;\r\n }\r\n\r\n const stride = kindIsMatrix ? 16 : this._userThinInstanceBuffersStorage.strides[kind];\r\n const currentSize = kindIsMatrix ? this._thinInstanceDataStorage.matrixBufferSize : this._userThinInstanceBuffersStorage.sizes[kind];\r\n let data = kindIsMatrix ? this._thinInstanceDataStorage.matrixData : this._userThinInstanceBuffersStorage.data[kind];\r\n\r\n const bufferSize = (this._thinInstanceDataStorage.instancesCount + numInstances) * stride;\r\n\r\n let newSize = currentSize;\r\n\r\n while (newSize < bufferSize) {\r\n newSize *= 2;\r\n }\r\n\r\n if (!data || currentSize != newSize) {\r\n if (!data) {\r\n data = new Float32Array(newSize);\r\n } else {\r\n const newData = new Float32Array(newSize);\r\n newData.set(data, 0);\r\n data = newData;\r\n }\r\n\r\n if (kindIsMatrix) {\r\n this._thinInstanceDataStorage.matrixBuffer?.dispose();\r\n this._thinInstanceDataStorage.matrixBuffer = this._thinInstanceCreateMatrixBuffer(\"world\", data, false);\r\n this._thinInstanceDataStorage.matrixData = data;\r\n this._thinInstanceDataStorage.matrixBufferSize = newSize;\r\n if (this._scene.needsPreviousWorldMatrices && !this._thinInstanceDataStorage.previousMatrixData) {\r\n this._thinInstanceDataStorage.previousMatrixBuffer?.dispose();\r\n this._thinInstanceDataStorage.previousMatrixBuffer = this._thinInstanceCreateMatrixBuffer(\"previousWorld\", data, false);\r\n }\r\n } else {\r\n this._userThinInstanceBuffersStorage.vertexBuffers[kind]?.dispose();\r\n\r\n this._userThinInstanceBuffersStorage.data[kind] = data;\r\n this._userThinInstanceBuffersStorage.sizes[kind] = newSize;\r\n this._userThinInstanceBuffersStorage.vertexBuffers[kind] = new VertexBuffer(this.getEngine(), data, kind, true, false, stride, true);\r\n\r\n this.setVerticesBuffer(this._userThinInstanceBuffersStorage.vertexBuffers[kind]!);\r\n }\r\n }\r\n};\r\n\r\nMesh.prototype._thinInstanceInitializeUserStorage = function () {\r\n if (!this._userThinInstanceBuffersStorage) {\r\n this._userThinInstanceBuffersStorage = {\r\n data: {},\r\n sizes: {},\r\n vertexBuffers: {},\r\n strides: {},\r\n };\r\n }\r\n};\r\n\r\nMesh.prototype._disposeThinInstanceSpecificData = function () {\r\n if (this._thinInstanceDataStorage?.matrixBuffer) {\r\n this._thinInstanceDataStorage.matrixBuffer.dispose();\r\n this._thinInstanceDataStorage.matrixBuffer = null;\r\n }\r\n};\r\n"]}
1
+ {"version":3,"file":"thinInstanceMesh.js","sourceRoot":"","sources":["../../../../../lts/core/generated/Meshes/thinInstanceMesh.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Nullable, DeepImmutableObject } from \"../types\";\r\nimport { Mesh } from \"../Meshes/mesh\";\r\nimport { VertexBuffer, Buffer } from \"../Buffers/buffer\";\r\nimport { Matrix, Vector3, TmpVectors } from \"../Maths/math.vector\";\r\n\r\ndeclare module \"./mesh\" {\r\n export interface Mesh {\r\n /**\r\n * Gets or sets a boolean defining if we want picking to pick thin instances as well\r\n */\r\n thinInstanceEnablePicking: boolean;\r\n /**\r\n * Creates a new thin instance\r\n * @param matrix the matrix or array of matrices (position, rotation, scale) of the thin instance(s) to create\r\n * @param refresh true to refresh the underlying gpu buffer (default: true). If you do multiple calls to this method in a row, set refresh to true only for the last call to save performance\r\n * @returns the thin instance index number. If you pass an array of matrices, other instance indexes are index+1, index+2, etc\r\n */\r\n thinInstanceAdd(matrix: DeepImmutableObject<Matrix> | Array<DeepImmutableObject<Matrix>>, refresh?: boolean): number;\r\n\r\n /**\r\n * Adds the transformation (matrix) of the current mesh as a thin instance\r\n * @param refresh true to refresh the underlying gpu buffer (default: true). If you do multiple calls to this method in a row, set refresh to true only for the last call to save performance\r\n * @returns the thin instance index number\r\n */\r\n thinInstanceAddSelf(refresh?: boolean): number;\r\n\r\n /**\r\n * Registers a custom attribute to be used with thin instances\r\n * @param kind name of the attribute\r\n * @param stride size in floats of the attribute\r\n */\r\n thinInstanceRegisterAttribute(kind: string, stride: number): void;\r\n\r\n /**\r\n * Sets the matrix of a thin instance\r\n * @param index index of the thin instance\r\n * @param matrix matrix to set\r\n * @param refresh true to refresh the underlying gpu buffer (default: true). If you do multiple calls to this method in a row, set refresh to true only for the last call to save performance\r\n */\r\n thinInstanceSetMatrixAt(index: number, matrix: DeepImmutableObject<Matrix>, refresh?: boolean): void;\r\n\r\n /**\r\n * Sets the value of a custom attribute for a thin instance\r\n * @param kind name of the attribute\r\n * @param index index of the thin instance\r\n * @param value value to set\r\n * @param refresh true to refresh the underlying gpu buffer (default: true). If you do multiple calls to this method in a row, set refresh to true only for the last call to save performance\r\n */\r\n thinInstanceSetAttributeAt(kind: string, index: number, value: Array<number>, refresh?: boolean): void;\r\n\r\n /**\r\n * Gets / sets the number of thin instances to display. Note that you can't set a number higher than what the underlying buffer can handle.\r\n */\r\n thinInstanceCount: number;\r\n\r\n /**\r\n * Sets a buffer to be used with thin instances. This method is a faster way to setup multiple instances than calling thinInstanceAdd repeatedly\r\n * @param kind name of the attribute. Use \"matrix\" to setup the buffer of matrices\r\n * @param buffer buffer to set\r\n * @param stride size in floats of each value of the buffer\r\n * @param staticBuffer indicates that the buffer is static, so that you won't change it after it is set (better performances - false by default)\r\n */\r\n thinInstanceSetBuffer(kind: string, buffer: Nullable<Float32Array>, stride?: number, staticBuffer?: boolean): void;\r\n\r\n /**\r\n * Gets the list of world matrices\r\n * @return an array containing all the world matrices from the thin instances\r\n */\r\n thinInstanceGetWorldMatrices(): Matrix[];\r\n\r\n /**\r\n * Synchronize the gpu buffers with a thin instance buffer. Call this method if you update later on the buffers passed to thinInstanceSetBuffer\r\n * @param kind name of the attribute to update. Use \"matrix\" to update the buffer of matrices\r\n */\r\n thinInstanceBufferUpdated(kind: string): void;\r\n\r\n /**\r\n * Applies a partial update to a buffer directly on the GPU\r\n * Note that the buffer located on the CPU is NOT updated! It's up to you to update it (or not) with the same data you pass to this method\r\n * @param kind name of the attribute to update. Use \"matrix\" to update the buffer of matrices\r\n * @param data the data to set in the GPU buffer\r\n * @param offset the offset in the GPU buffer where to update the data\r\n */\r\n thinInstancePartialBufferUpdate(kind: string, data: Float32Array, offset: number): void;\r\n\r\n /**\r\n * Refreshes the bounding info, taking into account all the thin instances defined\r\n * @param forceRefreshParentInfo true to force recomputing the mesh bounding info and use it to compute the aggregated bounding info\r\n * @param applySkeleton defines whether to apply the skeleton before computing the bounding info\r\n * @param applyMorph defines whether to apply the morph target before computing the bounding info\r\n */\r\n thinInstanceRefreshBoundingInfo(forceRefreshParentInfo?: boolean, applySkeleton?: boolean, applyMorph?: boolean): void;\r\n\r\n /** @hidden */\r\n _thinInstanceInitializeUserStorage(): void;\r\n\r\n /** @hidden */\r\n _thinInstanceUpdateBufferSize(kind: string, numInstances?: number): void;\r\n\r\n /** @hidden */\r\n _thinInstanceCreateMatrixBuffer(kind: string, buffer: Nullable<Float32Array>, staticBuffer: boolean): Buffer;\r\n\r\n /** @hidden */\r\n _userThinInstanceBuffersStorage: {\r\n data: { [key: string]: Float32Array };\r\n sizes: { [key: string]: number };\r\n vertexBuffers: { [key: string]: Nullable<VertexBuffer> };\r\n strides: { [key: string]: number };\r\n };\r\n }\r\n}\r\n\r\nMesh.prototype.thinInstanceAdd = function (matrix: DeepImmutableObject<Matrix> | Array<DeepImmutableObject<Matrix>>, refresh: boolean = true): number {\r\n this._thinInstanceUpdateBufferSize(\"matrix\", Array.isArray(matrix) ? matrix.length : 1);\r\n\r\n const index = this._thinInstanceDataStorage.instancesCount;\r\n\r\n if (Array.isArray(matrix)) {\r\n for (let i = 0; i < matrix.length; ++i) {\r\n this.thinInstanceSetMatrixAt(this._thinInstanceDataStorage.instancesCount++, matrix[i], i === matrix.length - 1 && refresh);\r\n }\r\n } else {\r\n this.thinInstanceSetMatrixAt(this._thinInstanceDataStorage.instancesCount++, matrix, refresh);\r\n }\r\n\r\n return index;\r\n};\r\n\r\nMesh.prototype.thinInstanceAddSelf = function (refresh: boolean = true): number {\r\n return this.thinInstanceAdd(Matrix.IdentityReadOnly, refresh);\r\n};\r\n\r\nMesh.prototype.thinInstanceRegisterAttribute = function (kind: string, stride: number): void {\r\n this.removeVerticesData(kind);\r\n\r\n this._thinInstanceInitializeUserStorage();\r\n\r\n this._userThinInstanceBuffersStorage.strides[kind] = stride;\r\n this._userThinInstanceBuffersStorage.sizes[kind] = stride * Math.max(32, this._thinInstanceDataStorage.instancesCount); // Initial size\r\n this._userThinInstanceBuffersStorage.data[kind] = new Float32Array(this._userThinInstanceBuffersStorage.sizes[kind]);\r\n this._userThinInstanceBuffersStorage.vertexBuffers[kind] = new VertexBuffer(this.getEngine(), this._userThinInstanceBuffersStorage.data[kind], kind, true, false, stride, true);\r\n\r\n this.setVerticesBuffer(this._userThinInstanceBuffersStorage.vertexBuffers[kind]!);\r\n};\r\n\r\nMesh.prototype.thinInstanceSetMatrixAt = function (index: number, matrix: DeepImmutableObject<Matrix>, refresh: boolean = true): boolean {\r\n if (!this._thinInstanceDataStorage.matrixData || index >= this._thinInstanceDataStorage.instancesCount) {\r\n return false;\r\n }\r\n\r\n const matrixData = this._thinInstanceDataStorage.matrixData;\r\n\r\n matrix.copyToArray(matrixData, index * 16);\r\n\r\n if (this._thinInstanceDataStorage.worldMatrices) {\r\n this._thinInstanceDataStorage.worldMatrices[index] = matrix as Matrix;\r\n }\r\n\r\n if (refresh) {\r\n this.thinInstanceBufferUpdated(\"matrix\");\r\n\r\n if (!this.doNotSyncBoundingInfo) {\r\n this.thinInstanceRefreshBoundingInfo(false);\r\n }\r\n }\r\n\r\n return true;\r\n};\r\n\r\nMesh.prototype.thinInstanceSetAttributeAt = function (kind: string, index: number, value: Array<number>, refresh: boolean = true): boolean {\r\n if (!this._userThinInstanceBuffersStorage || !this._userThinInstanceBuffersStorage.data[kind] || index >= this._thinInstanceDataStorage.instancesCount) {\r\n return false;\r\n }\r\n\r\n this._thinInstanceUpdateBufferSize(kind, 0); // make sur the buffer for the kind attribute is big enough\r\n\r\n this._userThinInstanceBuffersStorage.data[kind].set(value, index * this._userThinInstanceBuffersStorage.strides[kind]);\r\n\r\n if (refresh) {\r\n this.thinInstanceBufferUpdated(kind);\r\n }\r\n\r\n return true;\r\n};\r\n\r\nObject.defineProperty(Mesh.prototype, \"thinInstanceCount\", {\r\n get: function (this: Mesh) {\r\n return this._thinInstanceDataStorage.instancesCount;\r\n },\r\n set: function (this: Mesh, value: number) {\r\n const matrixData = this._thinInstanceDataStorage.matrixData ?? this.source?._thinInstanceDataStorage.matrixData;\r\n const numMaxInstances = matrixData ? matrixData.length / 16 : 0;\r\n\r\n if (value <= numMaxInstances) {\r\n this._thinInstanceDataStorage.instancesCount = value;\r\n }\r\n },\r\n enumerable: true,\r\n configurable: true,\r\n});\r\n\r\nMesh.prototype._thinInstanceCreateMatrixBuffer = function (kind: string, buffer: Float32Array, staticBuffer: boolean = false): Buffer {\r\n const matrixBuffer = new Buffer(this.getEngine(), buffer, !staticBuffer, 16, false, true);\r\n\r\n for (let i = 0; i < 4; i++) {\r\n this.setVerticesBuffer(matrixBuffer.createVertexBuffer(kind + i, i * 4, 4));\r\n }\r\n\r\n return matrixBuffer;\r\n};\r\n\r\nMesh.prototype.thinInstanceSetBuffer = function (kind: string, buffer: Nullable<Float32Array>, stride: number = 0, staticBuffer: boolean = false): void {\r\n stride = stride || 16;\r\n\r\n if (kind === \"matrix\") {\r\n this._thinInstanceDataStorage.matrixBuffer?.dispose();\r\n this._thinInstanceDataStorage.matrixBuffer = null;\r\n this._thinInstanceDataStorage.matrixBufferSize = buffer ? buffer.length : 32 * stride;\r\n this._thinInstanceDataStorage.matrixData = buffer;\r\n this._thinInstanceDataStorage.worldMatrices = null;\r\n\r\n if (buffer !== null) {\r\n this._thinInstanceDataStorage.instancesCount = buffer.length / stride;\r\n this._thinInstanceDataStorage.matrixBuffer = this._thinInstanceCreateMatrixBuffer(\"world\", buffer, staticBuffer);\r\n\r\n if (!this.doNotSyncBoundingInfo) {\r\n this.thinInstanceRefreshBoundingInfo(false);\r\n }\r\n } else {\r\n this._thinInstanceDataStorage.instancesCount = 0;\r\n if (!this.doNotSyncBoundingInfo) {\r\n // mesh has no more thin instances, so need to recompute the bounding box because it's the regular mesh that will now be displayed\r\n this.refreshBoundingInfo();\r\n }\r\n }\r\n } else if (kind === \"previousMatrix\") {\r\n this._thinInstanceDataStorage.previousMatrixBuffer?.dispose();\r\n this._thinInstanceDataStorage.previousMatrixBuffer = null;\r\n this._thinInstanceDataStorage.previousMatrixData = buffer;\r\n if (buffer !== null) {\r\n this._thinInstanceDataStorage.previousMatrixBuffer = this._thinInstanceCreateMatrixBuffer(\"previousWorld\", buffer, staticBuffer);\r\n }\r\n } else {\r\n // color for instanced mesh is ColorInstanceKind and not ColorKind because of native that needs to do the differenciation\r\n // hot switching kind here to preserve backward compatibility\r\n if (kind === VertexBuffer.ColorKind) {\r\n kind = VertexBuffer.ColorInstanceKind;\r\n }\r\n\r\n if (buffer === null) {\r\n if (this._userThinInstanceBuffersStorage?.data[kind]) {\r\n this.removeVerticesData(kind);\r\n delete this._userThinInstanceBuffersStorage.data[kind];\r\n delete this._userThinInstanceBuffersStorage.strides[kind];\r\n delete this._userThinInstanceBuffersStorage.sizes[kind];\r\n delete this._userThinInstanceBuffersStorage.vertexBuffers[kind];\r\n }\r\n } else {\r\n this._thinInstanceInitializeUserStorage();\r\n\r\n this._userThinInstanceBuffersStorage.data[kind] = buffer;\r\n this._userThinInstanceBuffersStorage.strides[kind] = stride;\r\n this._userThinInstanceBuffersStorage.sizes[kind] = buffer.length;\r\n this._userThinInstanceBuffersStorage.vertexBuffers[kind] = new VertexBuffer(this.getEngine(), buffer, kind, !staticBuffer, false, stride, true);\r\n\r\n this.setVerticesBuffer(this._userThinInstanceBuffersStorage.vertexBuffers[kind]!);\r\n }\r\n }\r\n};\r\n\r\nMesh.prototype.thinInstanceBufferUpdated = function (kind: string): void {\r\n if (kind === \"matrix\") {\r\n this._thinInstanceDataStorage.matrixBuffer?.updateDirectly(this._thinInstanceDataStorage.matrixData!, 0, this._thinInstanceDataStorage.instancesCount);\r\n } else if (kind === \"previousMatrix\") {\r\n this._thinInstanceDataStorage.previousMatrixBuffer?.updateDirectly(this._thinInstanceDataStorage.previousMatrixData!, 0, this._thinInstanceDataStorage.instancesCount);\r\n } else if (this._userThinInstanceBuffersStorage?.vertexBuffers[kind]) {\r\n this._userThinInstanceBuffersStorage.vertexBuffers[kind]!.updateDirectly(this._userThinInstanceBuffersStorage.data[kind], 0);\r\n }\r\n};\r\n\r\nMesh.prototype.thinInstancePartialBufferUpdate = function (kind: string, data: Float32Array, offset: number): void {\r\n if (kind === \"matrix\") {\r\n if (this._thinInstanceDataStorage.matrixBuffer) {\r\n this._thinInstanceDataStorage.matrixBuffer.updateDirectly(data, offset);\r\n }\r\n } else if (this._userThinInstanceBuffersStorage?.vertexBuffers[kind]) {\r\n this._userThinInstanceBuffersStorage.vertexBuffers[kind]!.updateDirectly(data, offset);\r\n }\r\n};\r\n\r\nMesh.prototype.thinInstanceGetWorldMatrices = function (): Matrix[] {\r\n if (!this._thinInstanceDataStorage.matrixData || !this._thinInstanceDataStorage.matrixBuffer) {\r\n return [];\r\n }\r\n const matrixData = this._thinInstanceDataStorage.matrixData;\r\n\r\n if (!this._thinInstanceDataStorage.worldMatrices) {\r\n this._thinInstanceDataStorage.worldMatrices = new Array<Matrix>();\r\n\r\n for (let i = 0; i < this._thinInstanceDataStorage.instancesCount; ++i) {\r\n this._thinInstanceDataStorage.worldMatrices[i] = Matrix.FromArray(matrixData, i * 16);\r\n }\r\n }\r\n\r\n return this._thinInstanceDataStorage.worldMatrices;\r\n};\r\n\r\nMesh.prototype.thinInstanceRefreshBoundingInfo = function (forceRefreshParentInfo: boolean = false, applySkeleton: boolean = false, applyMorph: boolean = false) {\r\n if (!this._thinInstanceDataStorage.matrixData || !this._thinInstanceDataStorage.matrixBuffer) {\r\n return;\r\n }\r\n\r\n const vectors = this._thinInstanceDataStorage.boundingVectors;\r\n\r\n if (forceRefreshParentInfo) {\r\n vectors.length = 0;\r\n this.refreshBoundingInfo(applySkeleton, applyMorph);\r\n }\r\n\r\n const boundingInfo = this.getBoundingInfo();\r\n const matrixData = this._thinInstanceDataStorage.matrixData;\r\n\r\n if (vectors.length === 0) {\r\n for (let v = 0; v < boundingInfo.boundingBox.vectors.length; ++v) {\r\n vectors.push(boundingInfo.boundingBox.vectors[v].clone());\r\n }\r\n }\r\n\r\n TmpVectors.Vector3[0].setAll(Number.POSITIVE_INFINITY); // min\r\n TmpVectors.Vector3[1].setAll(Number.NEGATIVE_INFINITY); // max\r\n\r\n for (let i = 0; i < this._thinInstanceDataStorage.instancesCount; ++i) {\r\n Matrix.FromArrayToRef(matrixData, i * 16, TmpVectors.Matrix[0]);\r\n\r\n for (let v = 0; v < vectors.length; ++v) {\r\n Vector3.TransformCoordinatesToRef(vectors[v], TmpVectors.Matrix[0], TmpVectors.Vector3[2]);\r\n TmpVectors.Vector3[0].minimizeInPlace(TmpVectors.Vector3[2]);\r\n TmpVectors.Vector3[1].maximizeInPlace(TmpVectors.Vector3[2]);\r\n }\r\n }\r\n\r\n boundingInfo.reConstruct(TmpVectors.Vector3[0], TmpVectors.Vector3[1]);\r\n\r\n this._updateBoundingInfo();\r\n};\r\n\r\nMesh.prototype._thinInstanceUpdateBufferSize = function (kind: string, numInstances: number = 1) {\r\n const kindIsMatrix = kind === \"matrix\";\r\n\r\n if (!kindIsMatrix && (!this._userThinInstanceBuffersStorage || !this._userThinInstanceBuffersStorage.strides[kind])) {\r\n return;\r\n }\r\n\r\n const stride = kindIsMatrix ? 16 : this._userThinInstanceBuffersStorage.strides[kind];\r\n const currentSize = kindIsMatrix ? this._thinInstanceDataStorage.matrixBufferSize : this._userThinInstanceBuffersStorage.sizes[kind];\r\n let data = kindIsMatrix ? this._thinInstanceDataStorage.matrixData : this._userThinInstanceBuffersStorage.data[kind];\r\n\r\n const bufferSize = (this._thinInstanceDataStorage.instancesCount + numInstances) * stride;\r\n\r\n let newSize = currentSize;\r\n\r\n while (newSize < bufferSize) {\r\n newSize *= 2;\r\n }\r\n\r\n if (!data || currentSize != newSize) {\r\n if (!data) {\r\n data = new Float32Array(newSize);\r\n } else {\r\n const newData = new Float32Array(newSize);\r\n newData.set(data, 0);\r\n data = newData;\r\n }\r\n\r\n if (kindIsMatrix) {\r\n this._thinInstanceDataStorage.matrixBuffer?.dispose();\r\n this._thinInstanceDataStorage.matrixBuffer = this._thinInstanceCreateMatrixBuffer(\"world\", data, false);\r\n this._thinInstanceDataStorage.matrixData = data;\r\n this._thinInstanceDataStorage.matrixBufferSize = newSize;\r\n if (this._scene.needsPreviousWorldMatrices && !this._thinInstanceDataStorage.previousMatrixData) {\r\n this._thinInstanceDataStorage.previousMatrixBuffer?.dispose();\r\n this._thinInstanceDataStorage.previousMatrixBuffer = this._thinInstanceCreateMatrixBuffer(\"previousWorld\", data, false);\r\n }\r\n } else {\r\n this._userThinInstanceBuffersStorage.vertexBuffers[kind]?.dispose();\r\n\r\n this._userThinInstanceBuffersStorage.data[kind] = data;\r\n this._userThinInstanceBuffersStorage.sizes[kind] = newSize;\r\n this._userThinInstanceBuffersStorage.vertexBuffers[kind] = new VertexBuffer(this.getEngine(), data, kind, true, false, stride, true);\r\n\r\n this.setVerticesBuffer(this._userThinInstanceBuffersStorage.vertexBuffers[kind]!);\r\n }\r\n }\r\n};\r\n\r\nMesh.prototype._thinInstanceInitializeUserStorage = function () {\r\n if (!this._userThinInstanceBuffersStorage) {\r\n this._userThinInstanceBuffersStorage = {\r\n data: {},\r\n sizes: {},\r\n vertexBuffers: {},\r\n strides: {},\r\n };\r\n }\r\n};\r\n\r\nMesh.prototype._disposeThinInstanceSpecificData = function () {\r\n if (this._thinInstanceDataStorage?.matrixBuffer) {\r\n this._thinInstanceDataStorage.matrixBuffer.dispose();\r\n this._thinInstanceDataStorage.matrixBuffer = null;\r\n }\r\n};\r\n"]}
@@ -94,7 +94,7 @@ var KhronosTextureContainer = /** @class */ (function () {
94
94
  for (var face = 0; face < this.numberOfFaces; face++) {
95
95
  var byteArray = new Uint8Array(this.data.buffer, this.data.byteOffset + dataOffset, imageSize);
96
96
  var engine = texture.getEngine();
97
- engine._uploadCompressedDataToTextureDirectly(texture, this.glInternalFormat, width, height, byteArray, face, level);
97
+ engine._uploadCompressedDataToTextureDirectly(texture, texture.format, width, height, byteArray, face, level);
98
98
  dataOffset += imageSize; // add size of the image for the next face/mipmap
99
99
  dataOffset += 3 - ((imageSize + 3) % 4); // add padding for odd sized image
100
100
  }
@@ -1 +1 @@
1
- {"version":3,"file":"khronosTextureContainer.js","sourceRoot":"","sources":["../../../../../lts/core/generated/Misc/khronosTextureContainer.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable @typescript-eslint/naming-convention */\r\nimport { Logger } from \"../Misc/logger\";\r\nimport type { InternalTexture } from \"../Materials/Textures/internalTexture\";\r\n\r\n/**\r\n * for description see https://www.khronos.org/opengles/sdk/tools/KTX/\r\n * for file layout see https://www.khronos.org/opengles/sdk/tools/KTX/file_format_spec/\r\n */\r\nexport class KhronosTextureContainer {\r\n private static HEADER_LEN = 12 + 13 * 4; // identifier + header elements (not including key value meta-data pairs)\r\n\r\n // load types\r\n private static COMPRESSED_2D = 0; // uses a gl.compressedTexImage2D()\r\n private static COMPRESSED_3D = 1; // uses a gl.compressedTexImage3D()\r\n private static TEX_2D = 2; // uses a gl.texImage2D()\r\n private static TEX_3D = 3; // uses a gl.texImage3D()\r\n\r\n // elements of the header\r\n /**\r\n * Gets the openGL type\r\n */\r\n public glType: number;\r\n /**\r\n * Gets the openGL type size\r\n */\r\n public glTypeSize: number;\r\n /**\r\n * Gets the openGL format\r\n */\r\n public glFormat: number;\r\n /**\r\n * Gets the openGL internal format\r\n */\r\n public glInternalFormat: number;\r\n /**\r\n * Gets the base internal format\r\n */\r\n public glBaseInternalFormat: number;\r\n /**\r\n * Gets image width in pixel\r\n */\r\n public pixelWidth: number;\r\n /**\r\n * Gets image height in pixel\r\n */\r\n public pixelHeight: number;\r\n /**\r\n * Gets image depth in pixels\r\n */\r\n public pixelDepth: number;\r\n /**\r\n * Gets the number of array elements\r\n */\r\n public numberOfArrayElements: number;\r\n /**\r\n * Gets the number of faces\r\n */\r\n public numberOfFaces: number;\r\n /**\r\n * Gets the number of mipmap levels\r\n */\r\n public numberOfMipmapLevels: number;\r\n /**\r\n * Gets the bytes of key value data\r\n */\r\n public bytesOfKeyValueData: number;\r\n /**\r\n * Gets the load type\r\n */\r\n public loadType: number;\r\n /**\r\n * If the container has been made invalid (eg. constructor failed to correctly load array buffer)\r\n */\r\n public isInvalid = false;\r\n\r\n /**\r\n * Creates a new KhronosTextureContainer\r\n * @param data contents of the KTX container file\r\n * @param facesExpected should be either 1 or 6, based whether a cube texture or or\r\n */\r\n public constructor(\r\n /** contents of the KTX container file */\r\n public data: ArrayBufferView,\r\n facesExpected: number\r\n ) {\r\n if (!KhronosTextureContainer.IsValid(data)) {\r\n this.isInvalid = true;\r\n Logger.Error(\"texture missing KTX identifier\");\r\n return;\r\n }\r\n\r\n // load the reset of the header in native 32 bit uint\r\n const dataSize = Uint32Array.BYTES_PER_ELEMENT;\r\n const headerDataView = new DataView(this.data.buffer, this.data.byteOffset + 12, 13 * dataSize);\r\n const endianness = headerDataView.getUint32(0, true);\r\n const littleEndian = endianness === 0x04030201;\r\n\r\n this.glType = headerDataView.getUint32(1 * dataSize, littleEndian); // must be 0 for compressed textures\r\n this.glTypeSize = headerDataView.getUint32(2 * dataSize, littleEndian); // must be 1 for compressed textures\r\n this.glFormat = headerDataView.getUint32(3 * dataSize, littleEndian); // must be 0 for compressed textures\r\n this.glInternalFormat = headerDataView.getUint32(4 * dataSize, littleEndian); // the value of arg passed to gl.compressedTexImage2D(,,x,,,,)\r\n this.glBaseInternalFormat = headerDataView.getUint32(5 * dataSize, littleEndian); // specify GL_RGB, GL_RGBA, GL_ALPHA, etc (un-compressed only)\r\n this.pixelWidth = headerDataView.getUint32(6 * dataSize, littleEndian); // level 0 value of arg passed to gl.compressedTexImage2D(,,,x,,,)\r\n this.pixelHeight = headerDataView.getUint32(7 * dataSize, littleEndian); // level 0 value of arg passed to gl.compressedTexImage2D(,,,,x,,)\r\n this.pixelDepth = headerDataView.getUint32(8 * dataSize, littleEndian); // level 0 value of arg passed to gl.compressedTexImage3D(,,,,,x,,)\r\n this.numberOfArrayElements = headerDataView.getUint32(9 * dataSize, littleEndian); // used for texture arrays\r\n this.numberOfFaces = headerDataView.getUint32(10 * dataSize, littleEndian); // used for cubemap textures, should either be 1 or 6\r\n this.numberOfMipmapLevels = headerDataView.getUint32(11 * dataSize, littleEndian); // number of levels; disregard possibility of 0 for compressed textures\r\n this.bytesOfKeyValueData = headerDataView.getUint32(12 * dataSize, littleEndian); // the amount of space after the header for meta-data\r\n\r\n // Make sure we have a compressed type. Not only reduces work, but probably better to let dev know they are not compressing.\r\n if (this.glType !== 0) {\r\n Logger.Error(\"only compressed formats currently supported\");\r\n return;\r\n } else {\r\n // value of zero is an indication to generate mipmaps @ runtime. Not usually allowed for compressed, so disregard.\r\n this.numberOfMipmapLevels = Math.max(1, this.numberOfMipmapLevels);\r\n }\r\n\r\n if (this.pixelHeight === 0 || this.pixelDepth !== 0) {\r\n Logger.Error(\"only 2D textures currently supported\");\r\n return;\r\n }\r\n\r\n if (this.numberOfArrayElements !== 0) {\r\n Logger.Error(\"texture arrays not currently supported\");\r\n return;\r\n }\r\n\r\n if (this.numberOfFaces !== facesExpected) {\r\n Logger.Error(\"number of faces expected\" + facesExpected + \", but found \" + this.numberOfFaces);\r\n return;\r\n }\r\n\r\n // we now have a completely validated file, so could use existence of loadType as success\r\n // would need to make this more elaborate & adjust checks above to support more than one load type\r\n this.loadType = KhronosTextureContainer.COMPRESSED_2D;\r\n }\r\n\r\n /**\r\n * Uploads KTX content to a Babylon Texture.\r\n * It is assumed that the texture has already been created & is currently bound\r\n * @param texture\r\n * @param loadMipmaps\r\n * @hidden\r\n */\r\n public uploadLevels(texture: InternalTexture, loadMipmaps: boolean): void {\r\n switch (this.loadType) {\r\n case KhronosTextureContainer.COMPRESSED_2D:\r\n this._upload2DCompressedLevels(texture, loadMipmaps);\r\n break;\r\n\r\n case KhronosTextureContainer.TEX_2D:\r\n case KhronosTextureContainer.COMPRESSED_3D:\r\n case KhronosTextureContainer.TEX_3D:\r\n }\r\n }\r\n\r\n private _upload2DCompressedLevels(texture: InternalTexture, loadMipmaps: boolean): void {\r\n // initialize width & height for level 1\r\n let dataOffset = KhronosTextureContainer.HEADER_LEN + this.bytesOfKeyValueData;\r\n let width = this.pixelWidth;\r\n let height = this.pixelHeight;\r\n\r\n const mipmapCount = loadMipmaps ? this.numberOfMipmapLevels : 1;\r\n for (let level = 0; level < mipmapCount; level++) {\r\n const imageSize = new Int32Array(this.data.buffer, this.data.byteOffset + dataOffset, 1)[0]; // size per face, since not supporting array cubemaps\r\n dataOffset += 4; //image data starts from next multiple of 4 offset. Each face refers to same imagesize field above.\r\n for (let face = 0; face < this.numberOfFaces; face++) {\r\n const byteArray = new Uint8Array(this.data.buffer, this.data.byteOffset + dataOffset, imageSize);\r\n\r\n const engine = texture.getEngine();\r\n engine._uploadCompressedDataToTextureDirectly(texture, this.glInternalFormat, width, height, byteArray, face, level);\r\n\r\n dataOffset += imageSize; // add size of the image for the next face/mipmap\r\n dataOffset += 3 - ((imageSize + 3) % 4); // add padding for odd sized image\r\n }\r\n width = Math.max(1.0, width * 0.5);\r\n height = Math.max(1.0, height * 0.5);\r\n }\r\n }\r\n\r\n /**\r\n * Checks if the given data starts with a KTX file identifier.\r\n * @param data the data to check\r\n * @returns true if the data is a KTX file or false otherwise\r\n */\r\n public static IsValid(data: ArrayBufferView): boolean {\r\n if (data.byteLength >= 12) {\r\n // '«', 'K', 'T', 'X', ' ', '1', '1', '»', '\\r', '\\n', '\\x1A', '\\n'\r\n const identifier = new Uint8Array(data.buffer, data.byteOffset, 12);\r\n if (\r\n identifier[0] === 0xab &&\r\n identifier[1] === 0x4b &&\r\n identifier[2] === 0x54 &&\r\n identifier[3] === 0x58 &&\r\n identifier[4] === 0x20 &&\r\n identifier[5] === 0x31 &&\r\n identifier[6] === 0x31 &&\r\n identifier[7] === 0xbb &&\r\n identifier[8] === 0x0d &&\r\n identifier[9] === 0x0a &&\r\n identifier[10] === 0x1a &&\r\n identifier[11] === 0x0a\r\n ) {\r\n return true;\r\n }\r\n }\r\n\r\n return false;\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"khronosTextureContainer.js","sourceRoot":"","sources":["../../../../../lts/core/generated/Misc/khronosTextureContainer.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable @typescript-eslint/naming-convention */\r\nimport { Logger } from \"../Misc/logger\";\r\nimport type { InternalTexture } from \"../Materials/Textures/internalTexture\";\r\n\r\n/**\r\n * for description see https://www.khronos.org/opengles/sdk/tools/KTX/\r\n * for file layout see https://www.khronos.org/opengles/sdk/tools/KTX/file_format_spec/\r\n */\r\nexport class KhronosTextureContainer {\r\n private static HEADER_LEN = 12 + 13 * 4; // identifier + header elements (not including key value meta-data pairs)\r\n\r\n // load types\r\n private static COMPRESSED_2D = 0; // uses a gl.compressedTexImage2D()\r\n private static COMPRESSED_3D = 1; // uses a gl.compressedTexImage3D()\r\n private static TEX_2D = 2; // uses a gl.texImage2D()\r\n private static TEX_3D = 3; // uses a gl.texImage3D()\r\n\r\n // elements of the header\r\n /**\r\n * Gets the openGL type\r\n */\r\n public glType: number;\r\n /**\r\n * Gets the openGL type size\r\n */\r\n public glTypeSize: number;\r\n /**\r\n * Gets the openGL format\r\n */\r\n public glFormat: number;\r\n /**\r\n * Gets the openGL internal format\r\n */\r\n public glInternalFormat: number;\r\n /**\r\n * Gets the base internal format\r\n */\r\n public glBaseInternalFormat: number;\r\n /**\r\n * Gets image width in pixel\r\n */\r\n public pixelWidth: number;\r\n /**\r\n * Gets image height in pixel\r\n */\r\n public pixelHeight: number;\r\n /**\r\n * Gets image depth in pixels\r\n */\r\n public pixelDepth: number;\r\n /**\r\n * Gets the number of array elements\r\n */\r\n public numberOfArrayElements: number;\r\n /**\r\n * Gets the number of faces\r\n */\r\n public numberOfFaces: number;\r\n /**\r\n * Gets the number of mipmap levels\r\n */\r\n public numberOfMipmapLevels: number;\r\n /**\r\n * Gets the bytes of key value data\r\n */\r\n public bytesOfKeyValueData: number;\r\n /**\r\n * Gets the load type\r\n */\r\n public loadType: number;\r\n /**\r\n * If the container has been made invalid (eg. constructor failed to correctly load array buffer)\r\n */\r\n public isInvalid = false;\r\n\r\n /**\r\n * Creates a new KhronosTextureContainer\r\n * @param data contents of the KTX container file\r\n * @param facesExpected should be either 1 or 6, based whether a cube texture or or\r\n */\r\n public constructor(\r\n /** contents of the KTX container file */\r\n public data: ArrayBufferView,\r\n facesExpected: number\r\n ) {\r\n if (!KhronosTextureContainer.IsValid(data)) {\r\n this.isInvalid = true;\r\n Logger.Error(\"texture missing KTX identifier\");\r\n return;\r\n }\r\n\r\n // load the reset of the header in native 32 bit uint\r\n const dataSize = Uint32Array.BYTES_PER_ELEMENT;\r\n const headerDataView = new DataView(this.data.buffer, this.data.byteOffset + 12, 13 * dataSize);\r\n const endianness = headerDataView.getUint32(0, true);\r\n const littleEndian = endianness === 0x04030201;\r\n\r\n this.glType = headerDataView.getUint32(1 * dataSize, littleEndian); // must be 0 for compressed textures\r\n this.glTypeSize = headerDataView.getUint32(2 * dataSize, littleEndian); // must be 1 for compressed textures\r\n this.glFormat = headerDataView.getUint32(3 * dataSize, littleEndian); // must be 0 for compressed textures\r\n this.glInternalFormat = headerDataView.getUint32(4 * dataSize, littleEndian); // the value of arg passed to gl.compressedTexImage2D(,,x,,,,)\r\n this.glBaseInternalFormat = headerDataView.getUint32(5 * dataSize, littleEndian); // specify GL_RGB, GL_RGBA, GL_ALPHA, etc (un-compressed only)\r\n this.pixelWidth = headerDataView.getUint32(6 * dataSize, littleEndian); // level 0 value of arg passed to gl.compressedTexImage2D(,,,x,,,)\r\n this.pixelHeight = headerDataView.getUint32(7 * dataSize, littleEndian); // level 0 value of arg passed to gl.compressedTexImage2D(,,,,x,,)\r\n this.pixelDepth = headerDataView.getUint32(8 * dataSize, littleEndian); // level 0 value of arg passed to gl.compressedTexImage3D(,,,,,x,,)\r\n this.numberOfArrayElements = headerDataView.getUint32(9 * dataSize, littleEndian); // used for texture arrays\r\n this.numberOfFaces = headerDataView.getUint32(10 * dataSize, littleEndian); // used for cubemap textures, should either be 1 or 6\r\n this.numberOfMipmapLevels = headerDataView.getUint32(11 * dataSize, littleEndian); // number of levels; disregard possibility of 0 for compressed textures\r\n this.bytesOfKeyValueData = headerDataView.getUint32(12 * dataSize, littleEndian); // the amount of space after the header for meta-data\r\n\r\n // Make sure we have a compressed type. Not only reduces work, but probably better to let dev know they are not compressing.\r\n if (this.glType !== 0) {\r\n Logger.Error(\"only compressed formats currently supported\");\r\n return;\r\n } else {\r\n // value of zero is an indication to generate mipmaps @ runtime. Not usually allowed for compressed, so disregard.\r\n this.numberOfMipmapLevels = Math.max(1, this.numberOfMipmapLevels);\r\n }\r\n\r\n if (this.pixelHeight === 0 || this.pixelDepth !== 0) {\r\n Logger.Error(\"only 2D textures currently supported\");\r\n return;\r\n }\r\n\r\n if (this.numberOfArrayElements !== 0) {\r\n Logger.Error(\"texture arrays not currently supported\");\r\n return;\r\n }\r\n\r\n if (this.numberOfFaces !== facesExpected) {\r\n Logger.Error(\"number of faces expected\" + facesExpected + \", but found \" + this.numberOfFaces);\r\n return;\r\n }\r\n\r\n // we now have a completely validated file, so could use existence of loadType as success\r\n // would need to make this more elaborate & adjust checks above to support more than one load type\r\n this.loadType = KhronosTextureContainer.COMPRESSED_2D;\r\n }\r\n\r\n /**\r\n * Uploads KTX content to a Babylon Texture.\r\n * It is assumed that the texture has already been created & is currently bound\r\n * @param texture\r\n * @param loadMipmaps\r\n * @hidden\r\n */\r\n public uploadLevels(texture: InternalTexture, loadMipmaps: boolean): void {\r\n switch (this.loadType) {\r\n case KhronosTextureContainer.COMPRESSED_2D:\r\n this._upload2DCompressedLevels(texture, loadMipmaps);\r\n break;\r\n\r\n case KhronosTextureContainer.TEX_2D:\r\n case KhronosTextureContainer.COMPRESSED_3D:\r\n case KhronosTextureContainer.TEX_3D:\r\n }\r\n }\r\n\r\n private _upload2DCompressedLevels(texture: InternalTexture, loadMipmaps: boolean): void {\r\n // initialize width & height for level 1\r\n let dataOffset = KhronosTextureContainer.HEADER_LEN + this.bytesOfKeyValueData;\r\n let width = this.pixelWidth;\r\n let height = this.pixelHeight;\r\n\r\n const mipmapCount = loadMipmaps ? this.numberOfMipmapLevels : 1;\r\n for (let level = 0; level < mipmapCount; level++) {\r\n const imageSize = new Int32Array(this.data.buffer, this.data.byteOffset + dataOffset, 1)[0]; // size per face, since not supporting array cubemaps\r\n dataOffset += 4; //image data starts from next multiple of 4 offset. Each face refers to same imagesize field above.\r\n for (let face = 0; face < this.numberOfFaces; face++) {\r\n const byteArray = new Uint8Array(this.data.buffer, this.data.byteOffset + dataOffset, imageSize);\r\n\r\n const engine = texture.getEngine();\r\n engine._uploadCompressedDataToTextureDirectly(texture, texture.format, width, height, byteArray, face, level);\r\n\r\n dataOffset += imageSize; // add size of the image for the next face/mipmap\r\n dataOffset += 3 - ((imageSize + 3) % 4); // add padding for odd sized image\r\n }\r\n width = Math.max(1.0, width * 0.5);\r\n height = Math.max(1.0, height * 0.5);\r\n }\r\n }\r\n\r\n /**\r\n * Checks if the given data starts with a KTX file identifier.\r\n * @param data the data to check\r\n * @returns true if the data is a KTX file or false otherwise\r\n */\r\n public static IsValid(data: ArrayBufferView): boolean {\r\n if (data.byteLength >= 12) {\r\n // '«', 'K', 'T', 'X', ' ', '1', '1', '»', '\\r', '\\n', '\\x1A', '\\n'\r\n const identifier = new Uint8Array(data.buffer, data.byteOffset, 12);\r\n if (\r\n identifier[0] === 0xab &&\r\n identifier[1] === 0x4b &&\r\n identifier[2] === 0x54 &&\r\n identifier[3] === 0x58 &&\r\n identifier[4] === 0x20 &&\r\n identifier[5] === 0x31 &&\r\n identifier[6] === 0x31 &&\r\n identifier[7] === 0xbb &&\r\n identifier[8] === 0x0d &&\r\n identifier[9] === 0x0a &&\r\n identifier[10] === 0x1a &&\r\n identifier[11] === 0x0a\r\n ) {\r\n return true;\r\n }\r\n }\r\n\r\n return false;\r\n }\r\n}\r\n"]}
@@ -155,13 +155,13 @@ export function CreateScreenshotUsingRenderTarget(engine, camera, size, successC
155
155
  texture.renderList = null;
156
156
  texture.samples = samples;
157
157
  texture.renderSprites = renderSprites;
158
- engine.onEndFrameObservable.addOnce(function () {
159
- texture.readPixels(undefined, undefined, undefined, false).then(function (data) {
160
- Tools.DumpData(width, height, data, successCallback, mimeType, fileName, true);
161
- texture.dispose();
162
- });
163
- });
164
158
  var renderToTexture = function () {
159
+ engine.onEndFrameObservable.addOnce(function () {
160
+ texture.readPixels(undefined, undefined, undefined, false).then(function (data) {
161
+ Tools.DumpData(width, height, data, successCallback, mimeType, fileName, true);
162
+ texture.dispose();
163
+ });
164
+ });
165
165
  // render the RTT
166
166
  scene.incrementRenderId();
167
167
  scene.resetCachedMaterial();