@babylonjs/core 7.29.0 → 7.30.1

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 (169) hide show
  1. package/Engines/WebGPU/webgpuCacheBindGroups.js +13 -2
  2. package/Engines/WebGPU/webgpuCacheBindGroups.js.map +1 -1
  3. package/Engines/WebGPU/webgpuCacheSampler.js +2 -3
  4. package/Engines/WebGPU/webgpuCacheSampler.js.map +1 -1
  5. package/Engines/WebGPU/webgpuShaderProcessorsWGSL.js +4 -1
  6. package/Engines/WebGPU/webgpuShaderProcessorsWGSL.js.map +1 -1
  7. package/Engines/abstractEngine.js +2 -2
  8. package/Engines/abstractEngine.js.map +1 -1
  9. package/Engines/engine.d.ts +2 -1
  10. package/Engines/nullEngine.d.ts +1 -0
  11. package/Engines/nullEngine.js +1 -0
  12. package/Engines/nullEngine.js.map +1 -1
  13. package/Engines/webgpuEngine.d.ts +4 -0
  14. package/Engines/webgpuEngine.js +1 -3
  15. package/Engines/webgpuEngine.js.map +1 -1
  16. package/Materials/Background/backgroundMaterial.js +1 -11
  17. package/Materials/Background/backgroundMaterial.js.map +1 -1
  18. package/Materials/GaussianSplatting/gaussianSplattingMaterial.d.ts +8 -0
  19. package/Materials/GaussianSplatting/gaussianSplattingMaterial.js +43 -34
  20. package/Materials/GaussianSplatting/gaussianSplattingMaterial.js.map +1 -1
  21. package/Materials/Node/Blocks/GaussianSplatting/gaussianBlock.d.ts +32 -0
  22. package/Materials/Node/Blocks/GaussianSplatting/gaussianBlock.js +64 -0
  23. package/Materials/Node/Blocks/GaussianSplatting/gaussianBlock.js.map +1 -0
  24. package/Materials/Node/Blocks/GaussianSplatting/gaussianSplattingBlock.d.ts +48 -0
  25. package/Materials/Node/Blocks/GaussianSplatting/gaussianSplattingBlock.js +102 -0
  26. package/Materials/Node/Blocks/GaussianSplatting/gaussianSplattingBlock.js.map +1 -0
  27. package/Materials/Node/Blocks/GaussianSplatting/index.d.ts +3 -0
  28. package/Materials/Node/Blocks/GaussianSplatting/index.js +4 -0
  29. package/Materials/Node/Blocks/GaussianSplatting/index.js.map +1 -0
  30. package/Materials/Node/Blocks/GaussianSplatting/splatReaderBlock.d.ts +40 -0
  31. package/Materials/Node/Blocks/GaussianSplatting/splatReaderBlock.js +96 -0
  32. package/Materials/Node/Blocks/GaussianSplatting/splatReaderBlock.js.map +1 -0
  33. package/Materials/Node/Blocks/Input/inputBlock.js +6 -0
  34. package/Materials/Node/Blocks/Input/inputBlock.js.map +1 -1
  35. package/Materials/Node/Blocks/index.d.ts +1 -0
  36. package/Materials/Node/Blocks/index.js +1 -0
  37. package/Materials/Node/Blocks/index.js.map +1 -1
  38. package/Materials/Node/Enums/nodeMaterialModes.d.ts +3 -1
  39. package/Materials/Node/Enums/nodeMaterialModes.js +2 -0
  40. package/Materials/Node/Enums/nodeMaterialModes.js.map +1 -1
  41. package/Materials/Node/index.d.ts +1 -0
  42. package/Materials/Node/index.js +1 -0
  43. package/Materials/Node/index.js.map +1 -1
  44. package/Materials/Node/nodeMaterialDefault.d.ts +6 -0
  45. package/Materials/Node/nodeMaterialDefault.js +53 -0
  46. package/Materials/Node/nodeMaterialDefault.js.map +1 -0
  47. package/Materials/PBR/pbrBaseMaterial.js +1 -11
  48. package/Materials/PBR/pbrBaseMaterial.js.map +1 -1
  49. package/Materials/Textures/rawTexture3D.d.ts +12 -0
  50. package/Materials/Textures/rawTexture3D.js +18 -0
  51. package/Materials/Textures/rawTexture3D.js.map +1 -1
  52. package/Materials/Textures/texture.js +7 -3
  53. package/Materials/Textures/texture.js.map +1 -1
  54. package/Materials/Textures/textureSampler.d.ts +1 -1
  55. package/Materials/Textures/textureSampler.js.map +1 -1
  56. package/Materials/effect.d.ts +11 -0
  57. package/Materials/effect.js +20 -0
  58. package/Materials/effect.js.map +1 -1
  59. package/Materials/material.d.ts +5 -1
  60. package/Materials/material.js +19 -1
  61. package/Materials/material.js.map +1 -1
  62. package/Materials/materialPluginBase.d.ts +46 -46
  63. package/Materials/materialPluginBase.js +46 -60
  64. package/Materials/materialPluginBase.js.map +1 -1
  65. package/Materials/materialPluginManager.js +2 -2
  66. package/Materials/materialPluginManager.js.map +1 -1
  67. package/Materials/pushMaterial.d.ts +1 -1
  68. package/Materials/pushMaterial.js +2 -2
  69. package/Materials/pushMaterial.js.map +1 -1
  70. package/Materials/standardMaterial.js +1 -11
  71. package/Materials/standardMaterial.js.map +1 -1
  72. package/Meshes/GaussianSplatting/gaussianSplattingMesh.d.ts +11 -0
  73. package/Meshes/GaussianSplatting/gaussianSplattingMesh.js +72 -37
  74. package/Meshes/GaussianSplatting/gaussianSplattingMesh.js.map +1 -1
  75. package/Meshes/Node/Blocks/Set/aggregatorBlock.d.ts +76 -0
  76. package/Meshes/Node/Blocks/Set/aggregatorBlock.js +210 -0
  77. package/Meshes/Node/Blocks/Set/aggregatorBlock.js.map +1 -0
  78. package/Meshes/Node/Blocks/Set/latticeBlock.d.ts +91 -0
  79. package/Meshes/Node/Blocks/Set/latticeBlock.js +194 -0
  80. package/Meshes/Node/Blocks/Set/latticeBlock.js.map +1 -0
  81. package/Meshes/Node/Blocks/booleanGeometryBlock.d.ts +6 -0
  82. package/Meshes/Node/Blocks/booleanGeometryBlock.js +16 -4
  83. package/Meshes/Node/Blocks/booleanGeometryBlock.js.map +1 -1
  84. package/Meshes/Node/Blocks/geometryClampBlock.d.ts +8 -0
  85. package/Meshes/Node/Blocks/geometryClampBlock.js +22 -6
  86. package/Meshes/Node/Blocks/geometryClampBlock.js.map +1 -1
  87. package/Meshes/Node/Blocks/geometryInputBlock.js +2 -0
  88. package/Meshes/Node/Blocks/geometryInputBlock.js.map +1 -1
  89. package/Meshes/Node/Blocks/geometryInterceptorBlock.d.ts +5 -0
  90. package/Meshes/Node/Blocks/geometryInterceptorBlock.js +5 -1
  91. package/Meshes/Node/Blocks/geometryInterceptorBlock.js.map +1 -1
  92. package/Meshes/Node/Blocks/geometryTransformBlock.d.ts +6 -0
  93. package/Meshes/Node/Blocks/geometryTransformBlock.js +14 -2
  94. package/Meshes/Node/Blocks/geometryTransformBlock.js.map +1 -1
  95. package/Meshes/Node/Enums/nodeGeometryContextualSources.d.ts +5 -1
  96. package/Meshes/Node/Enums/nodeGeometryContextualSources.js +4 -0
  97. package/Meshes/Node/Enums/nodeGeometryContextualSources.js.map +1 -1
  98. package/Meshes/Node/index.d.ts +2 -0
  99. package/Meshes/Node/index.js +2 -0
  100. package/Meshes/Node/index.js.map +1 -1
  101. package/Meshes/Node/nodeGeometry.d.ts +1 -1
  102. package/Meshes/Node/nodeGeometry.js +14 -1
  103. package/Meshes/Node/nodeGeometry.js.map +1 -1
  104. package/Meshes/Node/nodeGeometryBlock.d.ts +4 -0
  105. package/Meshes/Node/nodeGeometryBlock.js +6 -0
  106. package/Meshes/Node/nodeGeometryBlock.js.map +1 -1
  107. package/Meshes/Node/nodeGeometryBuildState.js +12 -0
  108. package/Meshes/Node/nodeGeometryBuildState.js.map +1 -1
  109. package/Meshes/csg.d.ts +1 -0
  110. package/Meshes/csg.js +1 -0
  111. package/Meshes/csg.js.map +1 -1
  112. package/Meshes/csg2.d.ts +126 -0
  113. package/Meshes/csg2.js +350 -0
  114. package/Meshes/csg2.js.map +1 -0
  115. package/Meshes/index.d.ts +2 -0
  116. package/Meshes/index.js +2 -0
  117. package/Meshes/index.js.map +1 -1
  118. package/Meshes/lattice.d.ts +18 -1
  119. package/Meshes/lattice.js +34 -6
  120. package/Meshes/lattice.js.map +1 -1
  121. package/Meshes/lattice.material.d.ts +82 -0
  122. package/Meshes/lattice.material.js +259 -0
  123. package/Meshes/lattice.material.js.map +1 -0
  124. package/Meshes/mesh.js +3 -1
  125. package/Meshes/mesh.js.map +1 -1
  126. package/Meshes/mesh.vertexData.d.ts +66 -1
  127. package/Meshes/mesh.vertexData.js.map +1 -1
  128. package/Misc/dumpTools.js +1 -0
  129. package/Misc/dumpTools.js.map +1 -1
  130. package/Misc/screenshotTools.js +0 -3
  131. package/Misc/screenshotTools.js.map +1 -1
  132. package/Misc/tools.d.ts +2 -1
  133. package/Misc/tools.internals.d.ts +13 -0
  134. package/Misc/tools.internals.js +48 -0
  135. package/Misc/tools.internals.js.map +1 -0
  136. package/Misc/tools.js +13 -4
  137. package/Misc/tools.js.map +1 -1
  138. package/Morph/morphTarget.js +1 -0
  139. package/Morph/morphTarget.js.map +1 -1
  140. package/Shaders/ShadersInclude/gaussianSplatting.d.ts +5 -0
  141. package/Shaders/ShadersInclude/gaussianSplatting.js +33 -0
  142. package/Shaders/ShadersInclude/gaussianSplatting.js.map +1 -0
  143. package/Shaders/ShadersInclude/gaussianSplattingFragmentDeclaration.d.ts +7 -0
  144. package/Shaders/ShadersInclude/gaussianSplattingFragmentDeclaration.js +19 -0
  145. package/Shaders/ShadersInclude/gaussianSplattingFragmentDeclaration.js.map +1 -0
  146. package/Shaders/ShadersInclude/gaussianSplattingUboDeclaration.js +1 -1
  147. package/Shaders/ShadersInclude/gaussianSplattingUboDeclaration.js.map +1 -1
  148. package/Shaders/ShadersInclude/gaussianSplattingVertexDeclaration.js +1 -2
  149. package/Shaders/ShadersInclude/gaussianSplattingVertexDeclaration.js.map +1 -1
  150. package/Shaders/gaussianSplatting.fragment.d.ts +1 -2
  151. package/Shaders/gaussianSplatting.fragment.js +5 -10
  152. package/Shaders/gaussianSplatting.fragment.js.map +1 -1
  153. package/Shaders/gaussianSplatting.vertex.d.ts +1 -0
  154. package/Shaders/gaussianSplatting.vertex.js +4 -21
  155. package/Shaders/gaussianSplatting.vertex.js.map +1 -1
  156. package/ShadersWGSL/default.fragment.js +1 -1
  157. package/ShadersWGSL/default.fragment.js.map +1 -1
  158. package/ShadersWGSL/pbr.fragment.js +1 -1
  159. package/ShadersWGSL/pbr.fragment.js.map +1 -1
  160. package/Sprites/spriteManager.d.ts +10 -1
  161. package/Sprites/spriteManager.js +3 -2
  162. package/Sprites/spriteManager.js.map +1 -1
  163. package/Sprites/spritePackedManager.d.ts +6 -1
  164. package/Sprites/spritePackedManager.js +6 -2
  165. package/Sprites/spritePackedManager.js.map +1 -1
  166. package/Sprites/spriteRenderer.d.ts +16 -3
  167. package/Sprites/spriteRenderer.js +5 -3
  168. package/Sprites/spriteRenderer.js.map +1 -1
  169. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"lattice.js","sourceRoot":"","sources":["../../../../dev/core/src/Meshes/lattice.ts"],"names":[],"mappings":"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","sourcesContent":["import { Vector3 } from \"core/Maths/math.vector\";\r\nimport type { Mesh } from \"./mesh\";\r\nimport type { FloatArray } from \"core/types\";\r\nimport { VertexBuffer } from \"./buffer\";\r\nimport { Clamp } from \"core/Maths/math.scalar.functions\";\r\n\r\n/**\r\n * Interface used to define options for creating a lattice\r\n */\r\nexport interface ILatticeOptions {\r\n /** resolution on x axis */\r\n resolutionX: number;\r\n /** resolution on y axis */\r\n resolutionY: number;\r\n /** resolution on z axis */\r\n resolutionZ: number;\r\n /** the lattice position in object space */\r\n position: Vector3;\r\n /** size of the lattice along each axis in object space */\r\n size: Vector3;\r\n /** Optional mesh to adapt the size to */\r\n autoAdaptToMesh?: Mesh;\r\n}\r\n\r\n/**\r\n * Class used to represent a lattice\r\n * #MDVD75#18 - Moving lattice bounds\r\n * #MDVD75#23 - Twist\r\n */\r\nexport class Lattice {\r\n private _resolutionX: number;\r\n private _resolutionY: number;\r\n private _resolutionZ: number;\r\n private _position: Vector3;\r\n private _size: Vector3;\r\n\r\n private _data: Vector3[][][];\r\n\r\n // Cache\r\n private _min = new Vector3(-0.5, -0.5, -0.5);\r\n private _max = new Vector3(0.5, 0.5, 0.5);\r\n private _localPos = new Vector3();\r\n private _tmpVector = new Vector3();\r\n private _lerpVector0 = new Vector3();\r\n private _lerpVector1 = new Vector3();\r\n private _lerpVector2 = new Vector3();\r\n private _lerpVector3 = new Vector3();\r\n private _lerpVector4 = new Vector3();\r\n private _lerpVector5 = new Vector3();\r\n\r\n /**\r\n * @returns the string \"Lattice\"\r\n */\r\n public getClassName(): string {\r\n return \"Lattice\";\r\n }\r\n\r\n /**\r\n * Gets the resolution on x axis\r\n */\r\n public get resolutionX(): number {\r\n return this._resolutionX;\r\n }\r\n\r\n /**\r\n * Gets the resolution on y axis\r\n */\r\n public get resolutionY(): number {\r\n return this._resolutionY;\r\n }\r\n\r\n /**\r\n * Gets the resolution on z axis\r\n */\r\n public get resolutionZ(): number {\r\n return this._resolutionZ;\r\n }\r\n\r\n /**\r\n * Gets the size of the lattice along each axis in object space\r\n * Updating the size requires you to call update afterwards\r\n */\r\n public get size(): Vector3 {\r\n return this._size;\r\n }\r\n\r\n /**\r\n * Gets the lattice position in object space\r\n */\r\n public get position(): Vector3 {\r\n return this._position;\r\n }\r\n\r\n /**\r\n * Gets the data of the lattice\r\n */\r\n public get data(): Vector3[][][] {\r\n return this._data;\r\n }\r\n\r\n /**\r\n * Creates a new Lattice\r\n * @param options options for creating\r\n */\r\n public constructor(options: Partial<ILatticeOptions>) {\r\n const localOptions: ILatticeOptions = {\r\n resolutionX: 3,\r\n resolutionY: 3,\r\n resolutionZ: 3,\r\n position: Vector3.Zero(),\r\n size: Vector3.One(),\r\n ...options,\r\n };\r\n\r\n this._resolutionX = localOptions.resolutionX;\r\n this._resolutionY = localOptions.resolutionY;\r\n this._resolutionZ = localOptions.resolutionZ;\r\n this._position = localOptions.position;\r\n this._size = localOptions.autoAdaptToMesh ? localOptions.autoAdaptToMesh.getBoundingInfo().boundingBox.extendSize.scale(2) : localOptions.size;\r\n\r\n // Allocate data\r\n this._allocateData();\r\n this.update();\r\n }\r\n\r\n private _allocateData() {\r\n this._data = new Array<Array<Array<Vector3>>>(this.resolutionX);\r\n for (let i = 0; i < this.resolutionX; i++) {\r\n this._data[i] = new Array<Array<Vector3>>(this.resolutionY);\r\n for (let j = 0; j < this.resolutionY; j++) {\r\n this._data[i][j] = new Array<Vector3>(this.resolutionZ);\r\n for (let k = 0; k < this.resolutionZ; k++) {\r\n this._data[i][j][k] = Vector3.Zero();\r\n }\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Update of the lattice data\r\n */\r\n public update() {\r\n for (let i = 0; i < this.resolutionX; i++) {\r\n for (let j = 0; j < this.resolutionY; j++) {\r\n for (let k = 0; k < this.resolutionZ; k++) {\r\n const x = -this.size.x / 2 + this.size.x * (i / (this.resolutionX - 1));\r\n const y = -this.size.y / 2 + this.size.y * (j / (this.resolutionY - 1));\r\n const z = -this.size.z / 2 + this.size.z * (k / (this.resolutionZ - 1));\r\n\r\n this._data[i][j][k].set(x, y, z);\r\n }\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Apply the lattice to a mesh\r\n * @param mesh mesh to deform\r\n */\r\n public deformMesh(mesh: Mesh) {\r\n const positions = mesh.getVerticesData(VertexBuffer.PositionKind);\r\n\r\n if (!positions) {\r\n return;\r\n }\r\n\r\n // Apply the lattice\r\n this.deform(positions);\r\n\r\n // Update back the mesh\r\n mesh.setVerticesData(VertexBuffer.PositionKind, positions, true);\r\n }\r\n\r\n /**\r\n * Apply the lattice to a set of points\r\n * @param positions vertex data to deform\r\n * @param target optional target array to store the result (operation will be done in place in not defined)\r\n */\r\n public deform(positions: FloatArray, target?: FloatArray) {\r\n const nx = this._resolutionX;\r\n const ny = this._resolutionY;\r\n const nz = this._resolutionZ;\r\n\r\n // Calculate the size of each cell in the lattice\r\n const cellSize = new Vector3(this.size.x / (nx - 1), this.size.y / (ny - 1), this.size.z / (nz - 1));\r\n\r\n // Calculate the lattice bounds\r\n this._min.set(this.position.x - this.size.x / 2, this.position.y - this.size.y / 2, this.position.z - this.size.z / 2);\r\n this._min.addToRef(this._size, this._max);\r\n\r\n const min = this._min;\r\n const max = this._max;\r\n\r\n // Loop over each vertex\r\n for (let i = 0; i < positions.length; i += 3) {\r\n const vertex = this._tmpVector.fromArray(positions, i);\r\n\r\n // Check we are inside\r\n if (vertex.x < min.x || vertex.x > max.x || vertex.y < min.y || vertex.y > max.y || vertex.z < min.z || vertex.z > max.z) {\r\n if (target) {\r\n vertex.toArray(target, i);\r\n }\r\n continue;\r\n }\r\n\r\n // Map vertex position to lattice local coordinates\r\n const localPos = this._localPos.set((vertex.x - min.x) / cellSize.x, (vertex.y - min.y) / cellSize.y, (vertex.z - min.z) / cellSize.z);\r\n\r\n // Get integer lattice indices\r\n const i0 = Math.floor(localPos.x);\r\n const j0 = Math.floor(localPos.y);\r\n const k0 = Math.floor(localPos.z);\r\n\r\n const i1 = Math.min(i0 + 1, nx - 1);\r\n const j1 = Math.min(j0 + 1, ny - 1);\r\n const k1 = Math.min(k0 + 1, nz - 1);\r\n\r\n // Compute interpolation weights\r\n const tx = localPos.x - i0;\r\n const ty = localPos.y - j0;\r\n const tz = localPos.z - k0;\r\n\r\n // Ensure indices are within bounds\r\n const ii0 = Clamp(i0, 0, nx - 1);\r\n const jj0 = Clamp(j0, 0, ny - 1);\r\n const kk0 = Clamp(k0, 0, nz - 1);\r\n const ii1 = Clamp(i1, 0, nx - 1);\r\n const jj1 = Clamp(j1, 0, ny - 1);\r\n const kk1 = Clamp(k1, 0, nz - 1);\r\n\r\n // Get lattice control points\r\n const p000 = this._data[ii0][jj0][kk0];\r\n const p100 = this._data[ii1][jj0][kk0];\r\n const p010 = this._data[ii0][jj1][kk0];\r\n const p110 = this._data[ii1][jj1][kk0];\r\n const p001 = this._data[ii0][jj0][kk1];\r\n const p101 = this._data[ii1][jj0][kk1];\r\n const p011 = this._data[ii0][jj1][kk1];\r\n const p111 = this._data[ii1][jj1][kk1];\r\n\r\n // Trilinear interpolation\r\n const p00 = Vector3.LerpToRef(p000, p100, tx, this._lerpVector0);\r\n const p01 = Vector3.LerpToRef(p001, p101, tx, this._lerpVector1);\r\n const p10 = Vector3.LerpToRef(p010, p110, tx, this._lerpVector2);\r\n const p11 = Vector3.LerpToRef(p011, p111, tx, this._lerpVector3);\r\n\r\n const p0 = Vector3.LerpToRef(p00, p10, ty, this._lerpVector4);\r\n const p1 = Vector3.LerpToRef(p01, p11, ty, this._lerpVector5);\r\n\r\n const deformedPos = Vector3.LerpToRef(p0, p1, tz, this._lerpVector0);\r\n deformedPos.addInPlace(this.position);\r\n\r\n // Apply deformation to the vertex\r\n deformedPos.toArray(target || positions, i);\r\n }\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"lattice.js","sourceRoot":"","sources":["../../../../dev/core/src/Meshes/lattice.ts"],"names":[],"mappings":"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","sourcesContent":["import { Vector3 } from \"core/Maths/math.vector\";\r\nimport type { Mesh } from \"./mesh\";\r\nimport type { FloatArray } from \"core/types\";\r\nimport { VertexBuffer } from \"./buffer\";\r\nimport { Clamp } from \"core/Maths/math.scalar.functions\";\r\n\r\n/**\r\n * Interface used to define options for creating a lattice\r\n */\r\nexport interface ILatticeOptions {\r\n /** resolution on x axis */\r\n resolutionX: number;\r\n /** resolution on y axis */\r\n resolutionY: number;\r\n /** resolution on z axis */\r\n resolutionZ: number;\r\n /** the lattice position in object space */\r\n position: Vector3;\r\n /** size of the lattice along each axis in object space */\r\n size: Vector3;\r\n /** Optional mesh to adapt the size to */\r\n autoAdaptToMesh?: Mesh;\r\n}\r\n\r\n/**\r\n * Class used to represent a lattice\r\n * #MDVD75#18 - Moving lattice bounds\r\n * #MDVD75#23 - Twist\r\n */\r\nexport class Lattice {\r\n private _resolutionX: number;\r\n private _resolutionY: number;\r\n private _resolutionZ: number;\r\n private _position: Vector3;\r\n private _size: Vector3;\r\n private _cellSize = new Vector3();\r\n\r\n private _data: Vector3[][][];\r\n\r\n // Cache\r\n private _min = new Vector3(-0.5, -0.5, -0.5);\r\n private _max = new Vector3(0.5, 0.5, 0.5);\r\n private _localPos = new Vector3();\r\n private _tmpVector = new Vector3();\r\n private _lerpVector0 = new Vector3();\r\n private _lerpVector1 = new Vector3();\r\n private _lerpVector2 = new Vector3();\r\n private _lerpVector3 = new Vector3();\r\n private _lerpVector4 = new Vector3();\r\n private _lerpVector5 = new Vector3();\r\n\r\n /**\r\n * @returns the string \"Lattice\"\r\n */\r\n public getClassName(): string {\r\n return \"Lattice\";\r\n }\r\n\r\n /**\r\n * Gets the resolution on x axis\r\n */\r\n public get resolutionX(): number {\r\n return this._resolutionX;\r\n }\r\n\r\n /**\r\n * Gets the resolution on y axis\r\n */\r\n public get resolutionY(): number {\r\n return this._resolutionY;\r\n }\r\n\r\n /**\r\n * Gets the resolution on z axis\r\n */\r\n public get resolutionZ(): number {\r\n return this._resolutionZ;\r\n }\r\n\r\n /**\r\n * Gets the size of the lattice along each axis in object space\r\n * Updating the size requires you to call update afterwards\r\n */\r\n public get size(): Vector3 {\r\n return this._size;\r\n }\r\n\r\n /**\r\n * Gets the lattice position in object space\r\n */\r\n public get position(): Vector3 {\r\n return this._position;\r\n }\r\n\r\n /**\r\n * Gets the data of the lattice\r\n */\r\n public get data(): Vector3[][][] {\r\n return this._data;\r\n }\r\n\r\n /**\r\n * Gets the size of each cell in the lattice\r\n */\r\n public get cellSize(): Vector3 {\r\n return this._cellSize;\r\n }\r\n\r\n /**\r\n * Gets the min bounds of the lattice\r\n */\r\n public get min(): Vector3 {\r\n return this._min;\r\n }\r\n\r\n /**\r\n * Gets the max bounds of the lattice\r\n */\r\n public get max(): Vector3 {\r\n return this._max;\r\n }\r\n\r\n /**\r\n * Creates a new Lattice\r\n * @param options options for creating\r\n */\r\n public constructor(options?: Partial<ILatticeOptions>) {\r\n const localOptions: ILatticeOptions = {\r\n resolutionX: 3,\r\n resolutionY: 3,\r\n resolutionZ: 3,\r\n position: Vector3.Zero(),\r\n size: Vector3.One(),\r\n ...options,\r\n };\r\n\r\n this._resolutionX = localOptions.resolutionX;\r\n this._resolutionY = localOptions.resolutionY;\r\n this._resolutionZ = localOptions.resolutionZ;\r\n this._position = localOptions.position;\r\n this._size = localOptions.autoAdaptToMesh ? localOptions.autoAdaptToMesh.getBoundingInfo().boundingBox.extendSize.scale(2) : localOptions.size;\r\n\r\n // Allocate data\r\n this._allocateData();\r\n this.update();\r\n }\r\n\r\n private _allocateData() {\r\n this._data = new Array<Array<Array<Vector3>>>(this.resolutionX);\r\n for (let i = 0; i < this.resolutionX; i++) {\r\n this._data[i] = new Array<Array<Vector3>>(this.resolutionY);\r\n for (let j = 0; j < this.resolutionY; j++) {\r\n this._data[i][j] = new Array<Vector3>(this.resolutionZ);\r\n for (let k = 0; k < this.resolutionZ; k++) {\r\n this._data[i][j][k] = Vector3.Zero();\r\n }\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Update of the lattice data\r\n */\r\n public update() {\r\n for (let i = 0; i < this.resolutionX; i++) {\r\n for (let j = 0; j < this.resolutionY; j++) {\r\n for (let k = 0; k < this.resolutionZ; k++) {\r\n const x = -this.size.x / 2 + this.size.x * (i / (this.resolutionX - 1));\r\n const y = -this.size.y / 2 + this.size.y * (j / (this.resolutionY - 1));\r\n const z = -this.size.z / 2 + this.size.z * (k / (this.resolutionZ - 1));\r\n\r\n this._data[i][j][k].set(x, y, z);\r\n }\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Apply the lattice to a mesh\r\n * @param mesh mesh to deform\r\n */\r\n public deformMesh(mesh: Mesh) {\r\n const positions = mesh.getVerticesData(VertexBuffer.PositionKind);\r\n\r\n if (!positions) {\r\n return;\r\n }\r\n\r\n // Apply the lattice\r\n this.deform(positions);\r\n\r\n // Update back the mesh\r\n mesh.setVerticesData(VertexBuffer.PositionKind, positions, true);\r\n }\r\n\r\n /**\r\n * Update the lattice internals (like min, max and cell size)\r\n */\r\n public updateInternals() {\r\n const nx = this._resolutionX;\r\n const ny = this._resolutionY;\r\n const nz = this._resolutionZ;\r\n\r\n // Calculate the size of each cell in the lattice\r\n this._cellSize.set(this.size.x / (nx - 1), this.size.y / (ny - 1), this.size.z / (nz - 1));\r\n\r\n // Calculate the lattice bounds\r\n this._min.set(this.position.x - this.size.x / 2, this.position.y - this.size.y / 2, this.position.z - this.size.z / 2);\r\n this._min.addToRef(this._size, this._max);\r\n }\r\n\r\n /**\r\n * Apply the lattice to a set of points\r\n * @param positions vertex data to deform\r\n * @param target optional target array to store the result (operation will be done in place in not defined)\r\n */\r\n public deform(positions: FloatArray, target?: FloatArray) {\r\n const nx = this._resolutionX;\r\n const ny = this._resolutionY;\r\n const nz = this._resolutionZ;\r\n\r\n this.updateInternals();\r\n\r\n const min = this._min;\r\n const max = this._max;\r\n\r\n // Loop over each vertex\r\n for (let i = 0; i < positions.length; i += 3) {\r\n const vertex = this._tmpVector.fromArray(positions, i);\r\n\r\n // Check we are inside\r\n if (vertex.x < min.x || vertex.x > max.x || vertex.y < min.y || vertex.y > max.y || vertex.z < min.z || vertex.z > max.z) {\r\n if (target) {\r\n vertex.toArray(target, i);\r\n }\r\n continue;\r\n }\r\n\r\n // Map vertex position to lattice local coordinates\r\n const localPos = this._localPos.set((vertex.x - min.x) / this._cellSize.x, (vertex.y - min.y) / this._cellSize.y, (vertex.z - min.z) / this._cellSize.z);\r\n\r\n // Get integer lattice indices\r\n const i0 = Math.floor(localPos.x);\r\n const j0 = Math.floor(localPos.y);\r\n const k0 = Math.floor(localPos.z);\r\n\r\n const i1 = Math.min(i0 + 1, nx - 1);\r\n const j1 = Math.min(j0 + 1, ny - 1);\r\n const k1 = Math.min(k0 + 1, nz - 1);\r\n\r\n // Compute interpolation weights\r\n const tx = localPos.x - i0;\r\n const ty = localPos.y - j0;\r\n const tz = localPos.z - k0;\r\n\r\n // Ensure indices are within bounds\r\n const ii0 = Clamp(i0, 0, nx - 1);\r\n const jj0 = Clamp(j0, 0, ny - 1);\r\n const kk0 = Clamp(k0, 0, nz - 1);\r\n const ii1 = Clamp(i1, 0, nx - 1);\r\n const jj1 = Clamp(j1, 0, ny - 1);\r\n const kk1 = Clamp(k1, 0, nz - 1);\r\n\r\n // Get lattice control points\r\n const p000 = this._data[ii0][jj0][kk0];\r\n const p100 = this._data[ii1][jj0][kk0];\r\n const p010 = this._data[ii0][jj1][kk0];\r\n const p110 = this._data[ii1][jj1][kk0];\r\n const p001 = this._data[ii0][jj0][kk1];\r\n const p101 = this._data[ii1][jj0][kk1];\r\n const p011 = this._data[ii0][jj1][kk1];\r\n const p111 = this._data[ii1][jj1][kk1];\r\n\r\n // Trilinear interpolation\r\n const p00 = Vector3.LerpToRef(p000, p100, tx, this._lerpVector0);\r\n const p01 = Vector3.LerpToRef(p001, p101, tx, this._lerpVector1);\r\n const p10 = Vector3.LerpToRef(p010, p110, tx, this._lerpVector2);\r\n const p11 = Vector3.LerpToRef(p011, p111, tx, this._lerpVector3);\r\n\r\n const p0 = Vector3.LerpToRef(p00, p10, ty, this._lerpVector4);\r\n const p1 = Vector3.LerpToRef(p01, p11, ty, this._lerpVector5);\r\n\r\n const deformedPos = Vector3.LerpToRef(p0, p1, tz, this._lerpVector0);\r\n deformedPos.addInPlace(this.position);\r\n\r\n // Apply deformation to the vertex\r\n deformedPos.toArray(target || positions, i);\r\n }\r\n }\r\n}\r\n"]}
@@ -0,0 +1,82 @@
1
+ import type { Material } from "../Materials/material.js";
2
+ import { MaterialPluginBase } from "../Materials/materialPluginBase.js";
3
+ import type { Lattice } from "./lattice";
4
+ import { ShaderLanguage } from "../Materials/shaderLanguage.js";
5
+ import type { UniformBuffer } from "../Materials/uniformBuffer.js";
6
+ /**
7
+ * Material plugin to add hardware accelerated lattice support
8
+ * #HBZD72#5 - webgl2
9
+ * #HBZD72#6 - webgpu
10
+ */
11
+ export declare class LatticePluginMaterial extends MaterialPluginBase {
12
+ private _lattice;
13
+ private _latticeDataTexture;
14
+ private _latticeData;
15
+ private _code;
16
+ /**
17
+ * Create a new LatticePluginMaterial
18
+ * @param lattice defines the lattice this plugin is associated with
19
+ * @param material defines the material this plugin is associated with
20
+ */
21
+ constructor(lattice: Lattice, material: Material);
22
+ /**
23
+ * Get the class name of the plugin
24
+ * @returns the string "LatticePluginMaterial"
25
+ */
26
+ getClassName(): string;
27
+ /**
28
+ * Defines if the plugin supports the specified shader language
29
+ * @param shaderLanguage defines the shader language to check
30
+ * @returns true if supported, false otherwise
31
+ */
32
+ isCompatible(shaderLanguage: ShaderLanguage): boolean;
33
+ /**
34
+ * Must be called when the lattice data was updated
35
+ */
36
+ refreshData(): void;
37
+ /**
38
+ * Gets the description of the uniforms to add to the ubo (if engine supports ubos) or to inject directly in the vertex/fragment shaders (if engine does not support ubos)
39
+ * @param shaderLanguage The shader language to use.
40
+ * @returns the description of the uniforms
41
+ */
42
+ getUniforms(shaderLanguage: ShaderLanguage): {
43
+ ubo: {
44
+ name: string;
45
+ size: number;
46
+ type: string;
47
+ }[];
48
+ vertex?: undefined;
49
+ } | {
50
+ ubo: {
51
+ name: string;
52
+ size: number;
53
+ type: string;
54
+ }[];
55
+ vertex: string;
56
+ };
57
+ /**
58
+ * Binds the material data.
59
+ * @param uniformBuffer defines the Uniform buffer to fill in.
60
+ */
61
+ bindForSubMesh(uniformBuffer: UniformBuffer): void;
62
+ /**
63
+ * Gets the samplers used by the plugin.
64
+ * @param samplers list that the sampler names should be added to.
65
+ */
66
+ getSamplers(samplers: string[]): void;
67
+ private _prepareCode;
68
+ /**
69
+ * Returns a list of custom shader code fragments to customize the shader.
70
+ * @param shaderType "vertex" or "fragment"
71
+ * @param shaderLanguage The shader language to use.
72
+ * @returns null if no code to be added, or a list of pointName =\> code.
73
+ */
74
+ getCustomCode(shaderType: string, shaderLanguage?: ShaderLanguage): {
75
+ CUSTOM_VERTEX_DEFINITIONS: string;
76
+ CUSTOM_VERTEX_UPDATE_POSITION: string;
77
+ } | null;
78
+ /**
79
+ * Disposes the resources of the material.
80
+ */
81
+ dispose(): void;
82
+ }
@@ -0,0 +1,259 @@
1
+ import { RawTexture3D } from "../Materials/Textures/rawTexture3D.js";
2
+ import { MaterialPluginBase } from "../Materials/materialPluginBase.js";
3
+
4
+ /**
5
+ * Material plugin to add hardware accelerated lattice support
6
+ * #HBZD72#5 - webgl2
7
+ * #HBZD72#6 - webgpu
8
+ */
9
+ export class LatticePluginMaterial extends MaterialPluginBase {
10
+ /**
11
+ * Create a new LatticePluginMaterial
12
+ * @param lattice defines the lattice this plugin is associated with
13
+ * @param material defines the material this plugin is associated with
14
+ */
15
+ constructor(lattice, material) {
16
+ super(material, "Lattice", 200);
17
+ this._lattice = lattice;
18
+ this.refreshData();
19
+ // let's enable it by default
20
+ this._enable(true);
21
+ }
22
+ /**
23
+ * Get the class name of the plugin
24
+ * @returns the string "LatticePluginMaterial"
25
+ */
26
+ getClassName() {
27
+ return "LatticePluginMaterial";
28
+ }
29
+ /**
30
+ * Defines if the plugin supports the specified shader language
31
+ * @param shaderLanguage defines the shader language to check
32
+ * @returns true if supported, false otherwise
33
+ */
34
+ isCompatible(shaderLanguage) {
35
+ switch (shaderLanguage) {
36
+ case 0 /* ShaderLanguage.GLSL */:
37
+ case 1 /* ShaderLanguage.WGSL */:
38
+ return true;
39
+ default:
40
+ return false;
41
+ }
42
+ }
43
+ /**
44
+ * Must be called when the lattice data was updated
45
+ */
46
+ refreshData() {
47
+ const length = this._lattice.resolutionX * this._lattice.resolutionY * this._lattice.resolutionZ * 4;
48
+ if (!this._latticeData || this._latticeData.length !== length) {
49
+ this._latticeData = new Float32Array(length);
50
+ }
51
+ for (let i = 0; i < this._lattice.resolutionX; i++) {
52
+ for (let j = 0; j < this._lattice.resolutionY; j++) {
53
+ for (let k = 0; k < this._lattice.resolutionZ; k++) {
54
+ const control = this._lattice.data[i][j][k];
55
+ const index = i + this._lattice.resolutionX * (j + this._lattice.resolutionY * k);
56
+ control.toArray(this._latticeData, index * 4);
57
+ }
58
+ }
59
+ }
60
+ if (!this._latticeDataTexture ||
61
+ this._latticeDataTexture.width !== this._lattice.resolutionX ||
62
+ this._latticeDataTexture.height !== this._lattice.resolutionY ||
63
+ this._latticeDataTexture.depth !== this._lattice.resolutionZ) {
64
+ if (this._latticeDataTexture) {
65
+ this._latticeDataTexture.dispose();
66
+ }
67
+ this._latticeDataTexture = new RawTexture3D(this._latticeData, this._lattice.resolutionX, this._lattice.resolutionY, this._lattice.resolutionZ, 5, this._material.getScene(), false, false, 1, 1);
68
+ }
69
+ else {
70
+ this._latticeDataTexture.update(this._latticeData);
71
+ }
72
+ }
73
+ /**
74
+ * Gets the description of the uniforms to add to the ubo (if engine supports ubos) or to inject directly in the vertex/fragment shaders (if engine does not support ubos)
75
+ * @param shaderLanguage The shader language to use.
76
+ * @returns the description of the uniforms
77
+ */
78
+ getUniforms(shaderLanguage) {
79
+ if (shaderLanguage === 1 /* ShaderLanguage.WGSL */) {
80
+ // For webgpu we only define the UBO with the correct type and size.
81
+ return {
82
+ ubo: [
83
+ { name: "lattice_cellSize", size: 3, type: "vec3" },
84
+ { name: "lattice_min", size: 3, type: "vec3" },
85
+ { name: "lattice_max", size: 3, type: "vec3" },
86
+ { name: "lattice_resolution", size: 3, type: "vec3" },
87
+ { name: "lattice_position", size: 3, type: "vec3" },
88
+ ],
89
+ };
90
+ }
91
+ return {
92
+ // first, define the UBO with the correct type and size.
93
+ ubo: [
94
+ { name: "lattice_cellSize", size: 3, type: "vec3" },
95
+ { name: "lattice_min", size: 3, type: "vec3" },
96
+ { name: "lattice_max", size: 3, type: "vec3" },
97
+ { name: "lattice_resolution", size: 3, type: "vec3" },
98
+ { name: "lattice_position", size: 3, type: "vec3" },
99
+ ],
100
+ // now, on the vertex shader, add the uniform itself in case uniform buffers are not supported by the engine
101
+ vertex: `
102
+ uniform vec3 lattice_cellSize;
103
+ uniform vec3 lattice_min;
104
+ uniform vec3 lattice_max;
105
+ uniform vec3 lattice_resolution;
106
+ uniform vec3 lattice_position;
107
+ `,
108
+ };
109
+ }
110
+ /**
111
+ * Binds the material data.
112
+ * @param uniformBuffer defines the Uniform buffer to fill in.
113
+ */
114
+ bindForSubMesh(uniformBuffer) {
115
+ this._lattice.updateInternals();
116
+ uniformBuffer.updateVector3("lattice_cellSize", this._lattice.cellSize);
117
+ uniformBuffer.updateVector3("lattice_min", this._lattice.min);
118
+ uniformBuffer.updateVector3("lattice_max", this._lattice.max);
119
+ uniformBuffer.updateFloat3("lattice_resolution", this._lattice.resolutionX, this._lattice.resolutionY, this._lattice.resolutionZ);
120
+ uniformBuffer.updateVector3("lattice_position", this._lattice.position);
121
+ uniformBuffer.setTexture("latticeData", this._latticeDataTexture);
122
+ }
123
+ /**
124
+ * Gets the samplers used by the plugin.
125
+ * @param samplers list that the sampler names should be added to.
126
+ */
127
+ getSamplers(samplers) {
128
+ samplers.push("latticeData");
129
+ }
130
+ _prepareCode(shaderLanguage = 0 /* ShaderLanguage.GLSL */) {
131
+ if (this._code) {
132
+ return this._code;
133
+ }
134
+ let code = `
135
+ if (positionUpdated.x >= lattice_min.x && positionUpdated.x <= lattice_max.x &&
136
+ positionUpdated.y >= lattice_min.y && positionUpdated.y <= lattice_max.y &&
137
+ positionUpdated.z >= lattice_min.z && positionUpdated.z <= lattice_max.z) {
138
+
139
+ // Map vertex position to lattice local coordinates
140
+ vec3d localPos = vec3c((positionUpdated.x - lattice_min.x) / lattice_cellSize.x, (positionUpdated.y - lattice_min.y) / lattice_cellSize.y, (positionUpdated.z - lattice_min.z) / lattice_cellSize.z);
141
+
142
+ // Get integer lattice indices
143
+ intd i0 = intc(floor(localPos.x));
144
+ intd j0 = intc(floor(localPos.y));
145
+ intd k0 = intc(floor(localPos.z));
146
+
147
+ intd resX = intc(lattice_resolution.x) - 1;
148
+ intd resY = intc(lattice_resolution.y) - 1;
149
+ intd resZ = intc(lattice_resolution.z) - 1;
150
+
151
+ intd i1 = min(i0 + 1, resX);
152
+ intd j1 = min(j0 + 1, resY);
153
+ intd k1 = min(k0 + 1, resZ);
154
+
155
+ // Compute interpolation weights
156
+ floatd tx = localPos.x - floatc(i0);
157
+ floatd ty = localPos.y - floatc(j0);
158
+ floatd tz = localPos.z - floatc(k0);
159
+
160
+ // Ensure indices are within bounds
161
+ intd ii0 = clamp(i0, 0, resX);
162
+ intd jj0 = clamp(j0, 0, resY);
163
+ intd kk0 = clamp(k0, 0, resZ);
164
+ intd ii1 = clamp(i1, 0, resX);
165
+ intd jj1 = clamp(j1, 0, resY);
166
+ intd kk1 = clamp(k1, 0, resZ);
167
+
168
+ // Get lattice control points
169
+ vec3d p000 = texelFetch(latticeData, ivec3c(ii0, jj0, kk0), 0).rgb;
170
+ vec3d p100 = texelFetch(latticeData, ivec3c(ii1, jj0, kk0), 0).rgb;
171
+ vec3d p010 = texelFetch(latticeData, ivec3c(ii0, jj1, kk0), 0).rgb;
172
+ vec3d p110 = texelFetch(latticeData, ivec3c(ii1, jj1, kk0), 0).rgb;
173
+ vec3d p001 = texelFetch(latticeData, ivec3c(ii0, jj0, kk1), 0).rgb;
174
+ vec3d p101 = texelFetch(latticeData, ivec3c(ii1, jj0, kk1), 0).rgb;
175
+ vec3d p011 = texelFetch(latticeData, ivec3c(ii0, jj1, kk1), 0).rgb;
176
+ vec3d p111 = texelFetch(latticeData, ivec3c(ii1, jj1, kk1), 0).rgb;
177
+
178
+ // Trilinear interpolation
179
+ vec3d p00 = mix(p000, p100, tx);
180
+ vec3d p01 = mix(p001, p101, tx);
181
+ vec3d p10 = mix(p010, p110, tx);
182
+ vec3d p11 = mix(p011, p111, tx);
183
+
184
+ vec3d p0 = mix(p00, p10, ty);
185
+ vec3d p1 = mix(p01, p11, ty);
186
+
187
+ vec3d deformedPos = mix(p0, p1, tz);
188
+ positionUpdated = deformedPos + lattice_position;
189
+ };
190
+ `;
191
+ if (shaderLanguage === 1 /* ShaderLanguage.WGSL */) {
192
+ code =
193
+ `
194
+ let lattice_min = uniforms.lattice_min;
195
+ let lattice_max = uniforms.lattice_max;
196
+ let lattice_resolution = uniforms.lattice_resolution;
197
+ let lattice_position = uniforms.lattice_position;
198
+ let lattice_cellSize = uniforms.lattice_cellSize;
199
+ ` + code;
200
+ code = code.replace(/ivec3c/g, "vec3i");
201
+ code = code.replace(/vec3d/g, "var");
202
+ code = code.replace(/vec3c/g, "vec3f");
203
+ code = code.replace(/intd/g, "var");
204
+ code = code.replace(/intc/g, "i32");
205
+ code = code.replace(/floatd/g, "var");
206
+ code = code.replace(/floatc/g, "f32");
207
+ code = code.replace(/texelFetch/g, "textureLoad");
208
+ }
209
+ else {
210
+ code = code.replace(/ivec3c/g, "ivec3");
211
+ code = code.replace(/vec3d/g, "vec3");
212
+ code = code.replace(/vec3c/g, "vec3");
213
+ code = code.replace(/intd/g, "int");
214
+ code = code.replace(/intc/g, "int");
215
+ code = code.replace(/floatd/g, "float");
216
+ code = code.replace(/floatc/g, "float");
217
+ }
218
+ this._code = code;
219
+ return this._code;
220
+ }
221
+ /**
222
+ * Returns a list of custom shader code fragments to customize the shader.
223
+ * @param shaderType "vertex" or "fragment"
224
+ * @param shaderLanguage The shader language to use.
225
+ * @returns null if no code to be added, or a list of pointName =\> code.
226
+ */
227
+ getCustomCode(shaderType, shaderLanguage = 0 /* ShaderLanguage.GLSL */) {
228
+ if (shaderType === "vertex") {
229
+ // we're adding this specific code at the end of the main() function
230
+ if (shaderLanguage === 1 /* ShaderLanguage.WGSL */) {
231
+ return {
232
+ CUSTOM_VERTEX_DEFINITIONS: `
233
+ var latticeData: texture_3d<f32>;
234
+ `,
235
+ CUSTOM_VERTEX_UPDATE_POSITION: this._prepareCode(shaderLanguage),
236
+ };
237
+ }
238
+ return {
239
+ CUSTOM_VERTEX_DEFINITIONS: `
240
+ precision highp sampler3D;
241
+ uniform sampler3D latticeData;
242
+ `,
243
+ CUSTOM_VERTEX_UPDATE_POSITION: this._prepareCode(shaderLanguage),
244
+ };
245
+ }
246
+ // for other shader types we're not doing anything, return null
247
+ return null;
248
+ }
249
+ /**
250
+ * Disposes the resources of the material.
251
+ */
252
+ dispose() {
253
+ if (this._latticeDataTexture) {
254
+ this._latticeDataTexture.dispose();
255
+ this._latticeDataTexture = null;
256
+ }
257
+ }
258
+ }
259
+ //# sourceMappingURL=lattice.material.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lattice.material.js","sourceRoot":"","sources":["../../../../dev/core/src/Meshes/lattice.material.ts"],"names":[],"mappings":"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","sourcesContent":["import { RawTexture3D } from \"core/Materials/Textures/rawTexture3D\";\r\nimport type { Material } from \"core/Materials/material\";\r\nimport { MaterialPluginBase } from \"core/Materials/materialPluginBase\";\r\nimport type { Lattice } from \"./lattice\";\r\nimport type { Nullable } from \"core/types\";\r\nimport { Constants } from \"core/Engines/constants\";\r\nimport { ShaderLanguage } from \"core/Materials/shaderLanguage\";\r\nimport type { UniformBuffer } from \"core/Materials/uniformBuffer\";\r\n\r\n/**\r\n * Material plugin to add hardware accelerated lattice support\r\n * #HBZD72#5 - webgl2\r\n * #HBZD72#6 - webgpu\r\n */\r\nexport class LatticePluginMaterial extends MaterialPluginBase {\r\n private _lattice: Lattice;\r\n private _latticeDataTexture: Nullable<RawTexture3D>;\r\n private _latticeData: Float32Array;\r\n private _code: string;\r\n\r\n /**\r\n * Create a new LatticePluginMaterial\r\n * @param lattice defines the lattice this plugin is associated with\r\n * @param material defines the material this plugin is associated with\r\n */\r\n constructor(lattice: Lattice, material: Material) {\r\n super(material, \"Lattice\", 200);\r\n\r\n this._lattice = lattice;\r\n\r\n this.refreshData();\r\n\r\n // let's enable it by default\r\n this._enable(true);\r\n }\r\n\r\n /**\r\n * Get the class name of the plugin\r\n * @returns the string \"LatticePluginMaterial\"\r\n */\r\n public override getClassName() {\r\n return \"LatticePluginMaterial\";\r\n }\r\n\r\n /**\r\n * Defines if the plugin supports the specified shader language\r\n * @param shaderLanguage defines the shader language to check\r\n * @returns true if supported, false otherwise\r\n */\r\n public override isCompatible(shaderLanguage: ShaderLanguage) {\r\n switch (shaderLanguage) {\r\n case ShaderLanguage.GLSL:\r\n case ShaderLanguage.WGSL:\r\n return true;\r\n default:\r\n return false;\r\n }\r\n }\r\n\r\n /**\r\n * Must be called when the lattice data was updated\r\n */\r\n public refreshData() {\r\n const length = this._lattice.resolutionX * this._lattice.resolutionY * this._lattice.resolutionZ * 4;\r\n if (!this._latticeData || this._latticeData.length !== length) {\r\n this._latticeData = new Float32Array(length);\r\n }\r\n\r\n for (let i = 0; i < this._lattice.resolutionX; i++) {\r\n for (let j = 0; j < this._lattice.resolutionY; j++) {\r\n for (let k = 0; k < this._lattice.resolutionZ; k++) {\r\n const control = this._lattice.data[i][j][k];\r\n const index = i + this._lattice.resolutionX * (j + this._lattice.resolutionY * k);\r\n control.toArray(this._latticeData, index * 4);\r\n }\r\n }\r\n }\r\n\r\n if (\r\n !this._latticeDataTexture ||\r\n this._latticeDataTexture.width !== this._lattice.resolutionX ||\r\n this._latticeDataTexture.height !== this._lattice.resolutionY ||\r\n this._latticeDataTexture.depth !== this._lattice.resolutionZ\r\n ) {\r\n if (this._latticeDataTexture) {\r\n this._latticeDataTexture.dispose();\r\n }\r\n\r\n this._latticeDataTexture = new RawTexture3D(\r\n this._latticeData,\r\n this._lattice.resolutionX,\r\n this._lattice.resolutionY,\r\n this._lattice.resolutionZ,\r\n Constants.TEXTUREFORMAT_RGBA,\r\n this._material.getScene(),\r\n false,\r\n false,\r\n Constants.TEXTURE_NEAREST_SAMPLINGMODE,\r\n Constants.TEXTURETYPE_FLOAT\r\n );\r\n } else {\r\n this._latticeDataTexture.update(this._latticeData);\r\n }\r\n }\r\n\r\n /**\r\n * Gets the description of the uniforms to add to the ubo (if engine supports ubos) or to inject directly in the vertex/fragment shaders (if engine does not support ubos)\r\n * @param shaderLanguage The shader language to use.\r\n * @returns the description of the uniforms\r\n */\r\n public override getUniforms(shaderLanguage: ShaderLanguage) {\r\n if (shaderLanguage === ShaderLanguage.WGSL) {\r\n // For webgpu we only define the UBO with the correct type and size.\r\n return {\r\n ubo: [\r\n { name: \"lattice_cellSize\", size: 3, type: \"vec3\" },\r\n { name: \"lattice_min\", size: 3, type: \"vec3\" },\r\n { name: \"lattice_max\", size: 3, type: \"vec3\" },\r\n { name: \"lattice_resolution\", size: 3, type: \"vec3\" },\r\n { name: \"lattice_position\", size: 3, type: \"vec3\" },\r\n ],\r\n };\r\n }\r\n return {\r\n // first, define the UBO with the correct type and size.\r\n ubo: [\r\n { name: \"lattice_cellSize\", size: 3, type: \"vec3\" },\r\n { name: \"lattice_min\", size: 3, type: \"vec3\" },\r\n { name: \"lattice_max\", size: 3, type: \"vec3\" },\r\n { name: \"lattice_resolution\", size: 3, type: \"vec3\" },\r\n { name: \"lattice_position\", size: 3, type: \"vec3\" },\r\n ],\r\n // now, on the vertex shader, add the uniform itself in case uniform buffers are not supported by the engine\r\n vertex: `\r\n uniform vec3 lattice_cellSize;\r\n uniform vec3 lattice_min;\r\n uniform vec3 lattice_max;\r\n uniform vec3 lattice_resolution;\r\n uniform vec3 lattice_position;\r\n `,\r\n };\r\n }\r\n\r\n /**\r\n * Binds the material data.\r\n * @param uniformBuffer defines the Uniform buffer to fill in.\r\n */\r\n public override bindForSubMesh(uniformBuffer: UniformBuffer) {\r\n this._lattice.updateInternals();\r\n\r\n uniformBuffer.updateVector3(\"lattice_cellSize\", this._lattice.cellSize);\r\n uniformBuffer.updateVector3(\"lattice_min\", this._lattice.min);\r\n uniformBuffer.updateVector3(\"lattice_max\", this._lattice.max);\r\n uniformBuffer.updateFloat3(\"lattice_resolution\", this._lattice.resolutionX, this._lattice.resolutionY, this._lattice.resolutionZ);\r\n uniformBuffer.updateVector3(\"lattice_position\", this._lattice.position);\r\n\r\n uniformBuffer.setTexture(\"latticeData\", this._latticeDataTexture);\r\n }\r\n\r\n /**\r\n * Gets the samplers used by the plugin.\r\n * @param samplers list that the sampler names should be added to.\r\n */\r\n public override getSamplers(samplers: string[]): void {\r\n samplers.push(\"latticeData\");\r\n }\r\n\r\n private _prepareCode(shaderLanguage = ShaderLanguage.GLSL) {\r\n if (this._code) {\r\n return this._code;\r\n }\r\n\r\n let code = `\r\n if (positionUpdated.x >= lattice_min.x && positionUpdated.x <= lattice_max.x && \r\n positionUpdated.y >= lattice_min.y && positionUpdated.y <= lattice_max.y && \r\n positionUpdated.z >= lattice_min.z && positionUpdated.z <= lattice_max.z) {\r\n\r\n // Map vertex position to lattice local coordinates\r\n vec3d localPos = vec3c((positionUpdated.x - lattice_min.x) / lattice_cellSize.x, (positionUpdated.y - lattice_min.y) / lattice_cellSize.y, (positionUpdated.z - lattice_min.z) / lattice_cellSize.z);\r\n\r\n // Get integer lattice indices\r\n intd i0 = intc(floor(localPos.x));\r\n intd j0 = intc(floor(localPos.y));\r\n intd k0 = intc(floor(localPos.z));\r\n\r\n intd resX = intc(lattice_resolution.x) - 1;\r\n intd resY = intc(lattice_resolution.y) - 1;\r\n intd resZ = intc(lattice_resolution.z) - 1;\r\n\r\n intd i1 = min(i0 + 1, resX);\r\n intd j1 = min(j0 + 1, resY);\r\n intd k1 = min(k0 + 1, resZ);\r\n\r\n // Compute interpolation weights\r\n floatd tx = localPos.x - floatc(i0);\r\n floatd ty = localPos.y - floatc(j0);\r\n floatd tz = localPos.z - floatc(k0);\r\n\r\n // Ensure indices are within bounds\r\n intd ii0 = clamp(i0, 0, resX);\r\n intd jj0 = clamp(j0, 0, resY);\r\n intd kk0 = clamp(k0, 0, resZ);\r\n intd ii1 = clamp(i1, 0, resX);\r\n intd jj1 = clamp(j1, 0, resY);\r\n intd kk1 = clamp(k1, 0, resZ);\r\n\r\n // Get lattice control points\r\n vec3d p000 = texelFetch(latticeData, ivec3c(ii0, jj0, kk0), 0).rgb;\r\n vec3d p100 = texelFetch(latticeData, ivec3c(ii1, jj0, kk0), 0).rgb;\r\n vec3d p010 = texelFetch(latticeData, ivec3c(ii0, jj1, kk0), 0).rgb;\r\n vec3d p110 = texelFetch(latticeData, ivec3c(ii1, jj1, kk0), 0).rgb;\r\n vec3d p001 = texelFetch(latticeData, ivec3c(ii0, jj0, kk1), 0).rgb;\r\n vec3d p101 = texelFetch(latticeData, ivec3c(ii1, jj0, kk1), 0).rgb;\r\n vec3d p011 = texelFetch(latticeData, ivec3c(ii0, jj1, kk1), 0).rgb;\r\n vec3d p111 = texelFetch(latticeData, ivec3c(ii1, jj1, kk1), 0).rgb;\r\n\r\n // Trilinear interpolation\r\n vec3d p00 = mix(p000, p100, tx);\r\n vec3d p01 = mix(p001, p101, tx);\r\n vec3d p10 = mix(p010, p110, tx);\r\n vec3d p11 = mix(p011, p111, tx);\r\n\r\n vec3d p0 = mix(p00, p10, ty);\r\n vec3d p1 = mix(p01, p11, ty);\r\n\r\n vec3d deformedPos = mix(p0, p1, tz);\r\n positionUpdated = deformedPos + lattice_position;\r\n };\r\n `;\r\n\r\n if (shaderLanguage === ShaderLanguage.WGSL) {\r\n code =\r\n `\r\n let lattice_min = uniforms.lattice_min;\r\n let lattice_max = uniforms.lattice_max;\r\n let lattice_resolution = uniforms.lattice_resolution;\r\n let lattice_position = uniforms.lattice_position;\r\n let lattice_cellSize = uniforms.lattice_cellSize;\r\n ` + code;\r\n\r\n code = code.replace(/ivec3c/g, \"vec3i\");\r\n code = code.replace(/vec3d/g, \"var\");\r\n code = code.replace(/vec3c/g, \"vec3f\");\r\n code = code.replace(/intd/g, \"var\");\r\n code = code.replace(/intc/g, \"i32\");\r\n code = code.replace(/floatd/g, \"var\");\r\n code = code.replace(/floatc/g, \"f32\");\r\n code = code.replace(/texelFetch/g, \"textureLoad\");\r\n } else {\r\n code = code.replace(/ivec3c/g, \"ivec3\");\r\n code = code.replace(/vec3d/g, \"vec3\");\r\n code = code.replace(/vec3c/g, \"vec3\");\r\n code = code.replace(/intd/g, \"int\");\r\n code = code.replace(/intc/g, \"int\");\r\n code = code.replace(/floatd/g, \"float\");\r\n code = code.replace(/floatc/g, \"float\");\r\n }\r\n this._code = code;\r\n\r\n return this._code;\r\n }\r\n\r\n /**\r\n * Returns a list of custom shader code fragments to customize the shader.\r\n * @param shaderType \"vertex\" or \"fragment\"\r\n * @param shaderLanguage The shader language to use.\r\n * @returns null if no code to be added, or a list of pointName =\\> code.\r\n */\r\n public override getCustomCode(shaderType: string, shaderLanguage = ShaderLanguage.GLSL) {\r\n if (shaderType === \"vertex\") {\r\n // we're adding this specific code at the end of the main() function\r\n if (shaderLanguage === ShaderLanguage.WGSL) {\r\n return {\r\n CUSTOM_VERTEX_DEFINITIONS: `\r\n var latticeData: texture_3d<f32>;\r\n `,\r\n CUSTOM_VERTEX_UPDATE_POSITION: this._prepareCode(shaderLanguage),\r\n };\r\n }\r\n\r\n return {\r\n CUSTOM_VERTEX_DEFINITIONS: `\r\n precision highp sampler3D;\r\n uniform sampler3D latticeData;\r\n `,\r\n CUSTOM_VERTEX_UPDATE_POSITION: this._prepareCode(shaderLanguage),\r\n };\r\n }\r\n // for other shader types we're not doing anything, return null\r\n return null;\r\n }\r\n\r\n /**\r\n * Disposes the resources of the material.\r\n */\r\n public override dispose(): void {\r\n if (this._latticeDataTexture) {\r\n this._latticeDataTexture.dispose();\r\n this._latticeDataTexture = null;\r\n }\r\n }\r\n}\r\n"]}
package/Meshes/mesh.js CHANGED
@@ -3010,7 +3010,9 @@ export class Mesh extends AbstractMesh {
3010
3010
  * @returns a new InstancedMesh
3011
3011
  */
3012
3012
  createInstance(name) {
3013
- return Mesh._instancedMeshFactory(name, this);
3013
+ const instance = Mesh._instancedMeshFactory(name, this);
3014
+ instance.parent = this.parent;
3015
+ return instance;
3014
3016
  }
3015
3017
  /**
3016
3018
  * Synchronises all the mesh instance submeshes to the current mesh submeshes, if any.