@babylonjs/core 7.41.1 → 7.43.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 (170) hide show
  1. package/Animations/animation.js +1 -1
  2. package/Animations/animation.js.map +1 -1
  3. package/Culling/Helper/computeShaderBoundingHelper.js +3 -4
  4. package/Culling/Helper/computeShaderBoundingHelper.js.map +1 -1
  5. package/Culling/Helper/transformFeedbackBoundingHelper.js +27 -64
  6. package/Culling/Helper/transformFeedbackBoundingHelper.js.map +1 -1
  7. package/Engines/Extensions/engine.multiRender.js +3 -2
  8. package/Engines/Extensions/engine.multiRender.js.map +1 -1
  9. package/Engines/WebGPU/webgpuCacheRenderPipeline.d.ts +1 -0
  10. package/Engines/WebGPU/webgpuCacheRenderPipeline.js +5 -0
  11. package/Engines/WebGPU/webgpuCacheRenderPipeline.js.map +1 -1
  12. package/Engines/WebGPU/webgpuTextureManager.js +6 -1
  13. package/Engines/WebGPU/webgpuTextureManager.js.map +1 -1
  14. package/Engines/abstractEngine.js +2 -2
  15. package/Engines/abstractEngine.js.map +1 -1
  16. package/FrameGraph/Node/Blocks/Layers/glowLayerBlock.d.ts +64 -0
  17. package/FrameGraph/Node/Blocks/Layers/glowLayerBlock.js +147 -0
  18. package/FrameGraph/Node/Blocks/Layers/glowLayerBlock.js.map +1 -0
  19. package/FrameGraph/Node/Blocks/Rendering/baseObjectRendererBlock.js +0 -15
  20. package/FrameGraph/Node/Blocks/Rendering/baseObjectRendererBlock.js.map +1 -1
  21. package/FrameGraph/Node/Blocks/Rendering/baseShadowGeneratorBlock.d.ts +4 -0
  22. package/FrameGraph/Node/Blocks/Rendering/baseShadowGeneratorBlock.js +9 -0
  23. package/FrameGraph/Node/Blocks/Rendering/baseShadowGeneratorBlock.js.map +1 -1
  24. package/FrameGraph/Node/Blocks/Rendering/csmShadowGeneratorBlock.d.ts +1 -6
  25. package/FrameGraph/Node/Blocks/Rendering/csmShadowGeneratorBlock.js +0 -13
  26. package/FrameGraph/Node/Blocks/Rendering/csmShadowGeneratorBlock.js.map +1 -1
  27. package/FrameGraph/Node/Blocks/Rendering/shadowGeneratorBlock.js +0 -1
  28. package/FrameGraph/Node/Blocks/Rendering/shadowGeneratorBlock.js.map +1 -1
  29. package/FrameGraph/Node/Blocks/index.d.ts +1 -0
  30. package/FrameGraph/Node/Blocks/index.js +1 -0
  31. package/FrameGraph/Node/Blocks/index.js.map +1 -1
  32. package/FrameGraph/Node/nodeRenderGraphBlock.js +17 -0
  33. package/FrameGraph/Node/nodeRenderGraphBlock.js.map +1 -1
  34. package/FrameGraph/Passes/renderPass.d.ts +0 -8
  35. package/FrameGraph/Passes/renderPass.js +0 -10
  36. package/FrameGraph/Passes/renderPass.js.map +1 -1
  37. package/FrameGraph/Tasks/Layers/glowLayerTask.d.ts +57 -0
  38. package/FrameGraph/Tasks/Layers/glowLayerTask.js +173 -0
  39. package/FrameGraph/Tasks/Layers/glowLayerTask.js.map +1 -0
  40. package/FrameGraph/Tasks/PostProcesses/bloomMergeTask.js +1 -1
  41. package/FrameGraph/Tasks/PostProcesses/bloomMergeTask.js.map +1 -1
  42. package/FrameGraph/Tasks/PostProcesses/bloomTask.js +7 -0
  43. package/FrameGraph/Tasks/PostProcesses/bloomTask.js.map +1 -1
  44. package/FrameGraph/Tasks/PostProcesses/circleOfConfusionTask.js +1 -1
  45. package/FrameGraph/Tasks/PostProcesses/circleOfConfusionTask.js.map +1 -1
  46. package/FrameGraph/Tasks/PostProcesses/depthOfFieldBlurTask.js +1 -1
  47. package/FrameGraph/Tasks/PostProcesses/depthOfFieldBlurTask.js.map +1 -1
  48. package/FrameGraph/Tasks/PostProcesses/depthOfFieldMergeTask.js +5 -5
  49. package/FrameGraph/Tasks/PostProcesses/depthOfFieldMergeTask.js.map +1 -1
  50. package/FrameGraph/Tasks/PostProcesses/depthOfFieldTask.js +12 -4
  51. package/FrameGraph/Tasks/PostProcesses/depthOfFieldTask.js.map +1 -1
  52. package/FrameGraph/Tasks/PostProcesses/postProcessTask.js +1 -1
  53. package/FrameGraph/Tasks/PostProcesses/postProcessTask.js.map +1 -1
  54. package/FrameGraph/Tasks/Rendering/csmShadowGeneratorTask.d.ts +0 -8
  55. package/FrameGraph/Tasks/Rendering/csmShadowGeneratorTask.js +1 -17
  56. package/FrameGraph/Tasks/Rendering/csmShadowGeneratorTask.js.map +1 -1
  57. package/FrameGraph/Tasks/Rendering/geometryRendererTask.js +3 -0
  58. package/FrameGraph/Tasks/Rendering/geometryRendererTask.js.map +1 -1
  59. package/FrameGraph/Tasks/Rendering/objectRendererTask.d.ts +4 -6
  60. package/FrameGraph/Tasks/Rendering/objectRendererTask.js +20 -22
  61. package/FrameGraph/Tasks/Rendering/objectRendererTask.js.map +1 -1
  62. package/FrameGraph/Tasks/Rendering/shadowGeneratorTask.d.ts +7 -1
  63. package/FrameGraph/Tasks/Rendering/shadowGeneratorTask.js +21 -5
  64. package/FrameGraph/Tasks/Rendering/shadowGeneratorTask.js.map +1 -1
  65. package/FrameGraph/Tasks/Rendering/taaObjectRendererTask.js +4 -6
  66. package/FrameGraph/Tasks/Rendering/taaObjectRendererTask.js.map +1 -1
  67. package/FrameGraph/Tasks/Texture/copyToTextureTask.js +1 -1
  68. package/FrameGraph/Tasks/Texture/copyToTextureTask.js.map +1 -1
  69. package/FrameGraph/frameGraph.js +22 -11
  70. package/FrameGraph/frameGraph.js.map +1 -1
  71. package/FrameGraph/frameGraphRenderContext.d.ts +2 -1
  72. package/FrameGraph/frameGraphRenderContext.js +2 -1
  73. package/FrameGraph/frameGraphRenderContext.js.map +1 -1
  74. package/FrameGraph/frameGraphTask.d.ts +11 -1
  75. package/FrameGraph/frameGraphTask.js +8 -0
  76. package/FrameGraph/frameGraphTask.js.map +1 -1
  77. package/FrameGraph/frameGraphTextureManager.d.ts +8 -2
  78. package/FrameGraph/frameGraphTextureManager.js +10 -4
  79. package/FrameGraph/frameGraphTextureManager.js.map +1 -1
  80. package/FrameGraph/index.d.ts +1 -0
  81. package/FrameGraph/index.js +1 -0
  82. package/FrameGraph/index.js.map +1 -1
  83. package/Layers/effectLayer.d.ts +32 -33
  84. package/Layers/effectLayer.js +144 -530
  85. package/Layers/effectLayer.js.map +1 -1
  86. package/Layers/glowLayer.d.ts +14 -41
  87. package/Layers/glowLayer.js +92 -178
  88. package/Layers/glowLayer.js.map +1 -1
  89. package/Layers/highlightLayer.d.ts +0 -1
  90. package/Layers/highlightLayer.js +0 -1
  91. package/Layers/highlightLayer.js.map +1 -1
  92. package/Layers/index.d.ts +2 -0
  93. package/Layers/index.js +2 -0
  94. package/Layers/index.js.map +1 -1
  95. package/Layers/thinEffectLayer.d.ts +230 -0
  96. package/Layers/thinEffectLayer.js +734 -0
  97. package/Layers/thinEffectLayer.js.map +1 -0
  98. package/Layers/thinGlowLayer.d.ts +141 -0
  99. package/Layers/thinGlowLayer.js +292 -0
  100. package/Layers/thinGlowLayer.js.map +1 -0
  101. package/Lights/Shadows/shadowGenerator.js +40 -19
  102. package/Lights/Shadows/shadowGenerator.js.map +1 -1
  103. package/Materials/GreasedLine/greasedLinePluginMaterialShadersGLSL.js +17 -11
  104. package/Materials/GreasedLine/greasedLinePluginMaterialShadersGLSL.js.map +1 -1
  105. package/Materials/GreasedLine/greasedLinePluginMaterialShadersWGSL.js +18 -12
  106. package/Materials/GreasedLine/greasedLinePluginMaterialShadersWGSL.js.map +1 -1
  107. package/Materials/Node/Blocks/Input/inputBlock.js +34 -2
  108. package/Materials/Node/Blocks/Input/inputBlock.js.map +1 -1
  109. package/Materials/Node/Blocks/Vertex/morphTargetsBlock.js +34 -24
  110. package/Materials/Node/Blocks/Vertex/morphTargetsBlock.js.map +1 -1
  111. package/Materials/Node/nodeMaterial.d.ts +10 -0
  112. package/Materials/Node/nodeMaterial.js +12 -0
  113. package/Materials/Node/nodeMaterial.js.map +1 -1
  114. package/Materials/PBR/pbrBaseMaterial.d.ts +5 -0
  115. package/Materials/PBR/pbrBaseMaterial.js +5 -0
  116. package/Materials/PBR/pbrBaseMaterial.js.map +1 -1
  117. package/Materials/Textures/renderTargetTexture.d.ts +12 -0
  118. package/Materials/Textures/renderTargetTexture.js +29 -8
  119. package/Materials/Textures/renderTargetTexture.js.map +1 -1
  120. package/Materials/materialHelper.functions.d.ts +17 -1
  121. package/Materials/materialHelper.functions.js +76 -4
  122. package/Materials/materialHelper.functions.js.map +1 -1
  123. package/Materials/shaderMaterial.d.ts +5 -4
  124. package/Materials/shaderMaterial.js +28 -51
  125. package/Materials/shaderMaterial.js.map +1 -1
  126. package/Materials/standardMaterial.d.ts +5 -0
  127. package/Materials/standardMaterial.js +5 -0
  128. package/Materials/standardMaterial.js.map +1 -1
  129. package/Meshes/Builders/greasedLineBuilder.d.ts +1 -1
  130. package/Meshes/GaussianSplatting/gaussianSplattingMesh.d.ts +5 -0
  131. package/Meshes/GaussianSplatting/gaussianSplattingMesh.js +30 -22
  132. package/Meshes/GaussianSplatting/gaussianSplattingMesh.js.map +1 -1
  133. package/Meshes/GreasedLine/greasedLineBaseMesh.js +1 -0
  134. package/Meshes/GreasedLine/greasedLineBaseMesh.js.map +1 -1
  135. package/Meshes/abstractMesh.d.ts +1 -2
  136. package/Meshes/abstractMesh.js +1 -2
  137. package/Meshes/abstractMesh.js.map +1 -1
  138. package/Meshes/linesMesh.js +2 -2
  139. package/Meshes/linesMesh.js.map +1 -1
  140. package/Meshes/mesh.d.ts +30 -3
  141. package/Meshes/mesh.js +56 -29
  142. package/Meshes/mesh.js.map +1 -1
  143. package/Meshes/subMesh.js +16 -3
  144. package/Meshes/subMesh.js.map +1 -1
  145. package/Misc/fileTools.js +14 -7
  146. package/Misc/fileTools.js.map +1 -1
  147. package/Morph/morphTargetManager.d.ts +20 -0
  148. package/Morph/morphTargetManager.js +31 -1
  149. package/Morph/morphTargetManager.js.map +1 -1
  150. package/PostProcesses/volumetricLightScatteringPostProcess.js +15 -16
  151. package/PostProcesses/volumetricLightScatteringPostProcess.js.map +1 -1
  152. package/Rendering/depthRenderer.js +13 -15
  153. package/Rendering/depthRenderer.js.map +1 -1
  154. package/Rendering/geometryBufferRenderer.js +13 -15
  155. package/Rendering/geometryBufferRenderer.js.map +1 -1
  156. package/Rendering/objectRenderer.d.ts +9 -2
  157. package/Rendering/objectRenderer.js +44 -7
  158. package/Rendering/objectRenderer.js.map +1 -1
  159. package/Rendering/outlineRenderer.js +13 -15
  160. package/Rendering/outlineRenderer.js.map +1 -1
  161. package/Shaders/ShadersInclude/morphTargetsVertex.js +16 -4
  162. package/Shaders/ShadersInclude/morphTargetsVertex.js.map +1 -1
  163. package/ShadersWGSL/ShadersInclude/morphTargetsVertex.js +17 -5
  164. package/ShadersWGSL/ShadersInclude/morphTargetsVertex.js.map +1 -1
  165. package/assetContainer.d.ts +43 -0
  166. package/assetContainer.js +67 -0
  167. package/assetContainer.js.map +1 -1
  168. package/package.json +1 -1
  169. package/scene.js +10 -3
  170. package/scene.js.map +1 -1
@@ -66,13 +66,13 @@ export class LinesMesh extends Mesh {
66
66
  useClipPlane: null,
67
67
  shaderLanguage: 0 /* ShaderLanguage.GLSL */,
68
68
  };
69
- if (!useVertexAlpha) {
69
+ if (!this.useVertexAlpha) {
70
70
  options.needAlphaBlending = false;
71
71
  }
72
72
  else {
73
73
  options.defines.push("#define VERTEXALPHA");
74
74
  }
75
- if (!useVertexColor) {
75
+ if (!this.useVertexColor) {
76
76
  options.uniforms.push("color");
77
77
  this._color4 = new Color4();
78
78
  }
@@ -1 +1 @@
1
- {"version":3,"file":"linesMesh.js","sourceRoot":"","sources":["../../../../dev/core/src/Meshes/linesMesh.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAErD,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAEjD,OAAO,EAAE,IAAI,EAAE,MAAM,gBAAgB,CAAC;AACtC,OAAO,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AACxD,OAAO,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAEjD,OAAO,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAI7D,IAAI,CAAC,gBAAgB,GAAG,CAAC,UAAe,EAAE,KAAY,EAAQ,EAAE;IAC5D,OAAO,SAAS,CAAC,KAAK,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;AAC9C,CAAC,CAAC;AAEF;;;GAGG;AACH,MAAM,OAAO,SAAU,SAAQ,IAAI;IA0BvB,iBAAiB,CAAC,MAAgB;QACtC,OAAO,MAAM,CAAC,YAAY,EAAE,KAAK,gBAAgB,CAAC;IACtD,CAAC;IAOD;;;;;;;;;;;;OAYG;IACH,YACI,IAAY,EACZ,QAAyB,IAAI,EAC7B,SAAyB,IAAI,EAC7B,SAA8B,IAAI,EAClC,kBAA4B;IAC5B;;OAEG;IACa,cAAwB;IACxC;;OAEG;IACa,cAAwB,EACxC,QAAmB;QAEnB,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,kBAAkB,CAAC,CAAC;QAPvC,mBAAc,GAAd,cAAc,CAAU;QAIxB,mBAAc,GAAd,cAAc,CAAU;QAtD5C;;WAEG;QACI,UAAK,GAAG,IAAI,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QAEnC;;WAEG;QACI,UAAK,GAAG,CAAC,CAAC;QAiBjB,2CAA2C;QACjC,oBAAe,+BAAuB;QAiC5C,IAAI,MAAM,EAAE,CAAC;YACT,IAAI,CAAC,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;YAClC,IAAI,CAAC,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC;YAC1B,IAAI,CAAC,cAAc,GAAG,MAAM,CAAC,cAAc,CAAC;YAC5C,IAAI,CAAC,cAAc,GAAG,MAAM,CAAC,cAAc,CAAC;QAChD,CAAC;QAED,IAAI,CAAC,qBAAqB,GAAG,GAAG,CAAC;QAEjC,MAAM,OAAO,GAAa,EAAE,CAAC;QAC7B,MAAM,OAAO,GAAoC;YAC7C,UAAU,EAAE,CAAC,YAAY,CAAC,YAAY,CAAC;YACvC,QAAQ,EAAE,CAAC,OAAO,EAAE,gBAAgB,CAAC;YACrC,iBAAiB,EAAE,IAAI;YACvB,OAAO,EAAE,OAAO;YAChB,YAAY,EAAE,IAAI;YAClB,cAAc,6BAAqB;SACtC,CAAC;QAEF,IAAI,CAAC,cAAc,EAAE,CAAC;YAClB,OAAO,CAAC,iBAAiB,GAAG,KAAK,CAAC;QACtC,CAAC;aAAM,CAAC;YACJ,OAAO,CAAC,OAAQ,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC;QACjD,CAAC;QAED,IAAI,CAAC,cAAc,EAAE,CAAC;YAClB,OAAO,CAAC,QAAS,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YAChC,IAAI,CAAC,OAAO,GAAG,IAAI,MAAM,EAAE,CAAC;QAChC,CAAC;aAAM,CAAC;YACJ,OAAO,CAAC,OAAQ,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC;YAC7C,OAAO,CAAC,UAAW,CAAC,IAAI,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC;QACrD,CAAC;QAED,IAAI,QAAQ,EAAE,CAAC;YACX,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;QAC7B,CAAC;aAAM,CAAC;YACJ,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC,SAAS,EAAE,CAAC;YAE3C,IAAI,MAAM,CAAC,QAAQ,IAAI,CAAC,SAAS,CAAC,SAAS,EAAE,CAAC;gBAC1C,IAAI,CAAC,eAAe,8BAAsB,CAAC;YAC/C,CAAC;YAED,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC,eAAe,CAAC;YAC9C,OAAO,CAAC,yBAAyB,GAAG,KAAK,IAAI,EAAE;gBAC3C,IAAI,IAAI,CAAC,eAAe,gCAAwB,EAAE,CAAC;oBAC/C,MAAM,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,6BAA6B,CAAC,EAAE,MAAM,CAAC,+BAA+B,CAAC,CAAC,CAAC,CAAC;gBACxG,CAAC;qBAAM,CAAC;oBACJ,MAAM,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,yBAAyB,CAAC,EAAE,MAAM,CAAC,2BAA2B,CAAC,CAAC,CAAC,CAAC;gBAChG,CAAC;YACL,CAAC,CAAC;YAEF,IAAI,CAAC,QAAQ,GAAG,IAAI,cAAc,CAAC,aAAa,EAAE,IAAI,CAAC,QAAQ,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC;YAC5F,IAAI,CAAC,QAAQ,CAAC,cAAc,GAAG,IAAI,CAAC;QACxC,CAAC;IACL,CAAC;IAEe,OAAO;QACnB,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,4BAA4B,IAAI,IAAI,CAAC,gBAAgB,CAAC,EAAE,CAAC;YAClG,OAAO,KAAK,CAAC;QACjB,CAAC;QAED,OAAO,KAAK,CAAC,OAAO,EAAE,CAAC;IAC3B,CAAC;IAED;;OAEG;IACa,YAAY;QACxB,OAAO,WAAW,CAAC;IACvB,CAAC;IAED;;OAEG;IACH,IAAoB,QAAQ;QACxB,OAAO,IAAI,CAAC,aAAa,CAAC;IAC9B,CAAC;IAED;;OAEG;IACH,IAAoB,QAAQ,CAAC,KAAe;QACxC,IAAI,CAAC,aAAa,GAAG,KAAK,CAAC;QAC3B,IAAI,CAAC,aAAa,CAAC,QAAQ,GAAG,QAAQ,CAAC,gBAAgB,CAAC;IAC5D,CAAC;IAED;;OAEG;IACH,IAAoB,eAAe;QAC/B,OAAO,KAAK,CAAC;IACjB,CAAC;IAED,IAAoB,eAAe,CAAC,KAAc;QAC9C,iBAAiB;IACrB,CAAC;IAED;;OAEG;IACa,KAAK,CAAC,QAAiB,EAAE,WAAmB;QACxD,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;YAClB,OAAO,IAAI,CAAC;QAChB,CAAC;QAED,OAAO;QACP,MAAM,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,cAAc,EAAE,CAAC;QAC9E,IAAI,CAAC,IAAI,CAAC,4BAA4B,IAAI,IAAI,CAAC,gBAAgB,EAAE,CAAC;YAC9D,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC;QACnD,CAAC;aAAM,CAAC;YACJ,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,WAAW,EAAE,WAAW,EAAE,IAAI,CAAC,4BAA4B,CAAC,aAAa,EAAE,IAAI,CAAC,4BAA4B,CAAC,kBAAkB,CAAC,CAAC;QAC1J,CAAC;QAED,QAAQ;QACR,IAAI,CAAC,IAAI,CAAC,cAAc,IAAI,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,aAAa,CAAC,EAAE,CAAC;YACrE,MAAM,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC;YAC/B,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;YACtC,IAAI,CAAC,aAAa,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;QACxD,CAAC;QAED,OAAO,IAAI,CAAC;IAChB,CAAC;IAED;;OAEG;IACa,KAAK,CAAC,OAAgB,EAAE,QAAgB,EAAE,cAAuB;QAC7E,IAAI,CAAC,IAAI,CAAC,SAAS,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,gBAAgB,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,UAAU,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,cAAc,EAAE,CAAC,EAAE,CAAC;YAClH,OAAO,IAAI,CAAC;QAChB,CAAC;QAED,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC,SAAS,EAAE,CAAC;QAE3C,aAAa;QAEb,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;YAClB,MAAM,CAAC,cAAc,CAAC,QAAQ,CAAC,gBAAgB,EAAE,OAAO,CAAC,aAAa,EAAE,OAAO,CAAC,aAAa,EAAE,cAAc,CAAC,CAAC;QACnH,CAAC;aAAM,CAAC;YACJ,MAAM,CAAC,gBAAgB,CAAC,QAAQ,CAAC,gBAAgB,EAAE,OAAO,CAAC,UAAU,EAAE,OAAO,CAAC,UAAU,EAAE,cAAc,CAAC,CAAC;QAC/G,CAAC;QACD,OAAO,IAAI,CAAC;IAChB,CAAC;IAED;;;;;OAKG;IACH,6DAA6D;IAC7C,OAAO,CAAC,YAAsB,EAAE,0BAA0B,GAAG,KAAK,EAAE,oBAA8B;QAC9G,IAAI,CAAC,oBAAoB,EAAE,CAAC;YACxB,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,KAAK,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC;QACnD,CAAC;QACD,KAAK,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;IAChC,CAAC;IAED;;;;;;OAMG;IACa,KAAK,CAAC,IAAY,EAAE,YAA4B,IAAI,EAAE,kBAA4B;QAC9F,OAAO,IAAI,SAAS,CAAC,IAAI,EAAE,IAAI,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,kBAAkB,CAAC,CAAC;IACrF,CAAC;IAED;;;;;OAKG;IACa,cAAc,CAAC,IAAY;QACvC,MAAM,QAAQ,GAAG,IAAI,kBAAkB,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QAEpD,IAAI,IAAI,CAAC,gBAAgB,EAAE,CAAC;YACxB,QAAQ,CAAC,gBAAgB,GAAG,EAAE,CAAC;YAE/B,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,gBAAgB,EAAE,CAAC;gBACtC,QAAQ,CAAC,gBAAgB,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC;YAChE,CAAC;QACL,CAAC;QAED,OAAO,QAAQ,CAAC;IACpB,CAAC;IAED;;;OAGG;IACa,SAAS,CAAC,mBAAwB;QAC9C,KAAK,CAAC,SAAS,CAAC,mBAAmB,CAAC,CAAC;QACrC,mBAAmB,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC;QACjD,mBAAmB,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;IAC3C,CAAC;IAED;;;;;OAKG;IACI,MAAM,CAAU,KAAK,CAAC,UAAe,EAAE,KAAY;QACtD,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC,UAAU,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;QAErD,MAAM,CAAC,KAAK,GAAG,MAAM,CAAC,SAAS,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;QAClD,MAAM,CAAC,KAAK,GAAG,UAAU,CAAC,KAAK,CAAC;QAEhC,OAAO,MAAM,CAAC;IAClB,CAAC;;AApRD;;;GAGG;AACW,mBAAS,GAAG,KAAK,AAAR,CAAS;AAmRpC;;GAEG;AACH,MAAM,OAAO,kBAAmB,SAAQ,aAAa;IAQjD,YAAY,IAAY,EAAE,MAAiB;QACvC,KAAK,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QACpB,IAAI,CAAC,qBAAqB,GAAG,MAAM,CAAC,qBAAqB,CAAC;IAC9D,CAAC;IAED;;OAEG;IACa,YAAY;QACxB,OAAO,oBAAoB,CAAC;IAChC,CAAC;CACJ","sourcesContent":["import type { Nullable } from \"../types\";\r\nimport type { Scene } from \"../scene\";\r\nimport { Color3, Color4 } from \"../Maths/math.color\";\r\nimport type { Node } from \"../node\";\r\nimport { VertexBuffer } from \"../Buffers/buffer\";\r\nimport type { SubMesh } from \"../Meshes/subMesh\";\r\nimport { Mesh } from \"../Meshes/mesh\";\r\nimport { InstancedMesh } from \"../Meshes/instancedMesh\";\r\nimport { Material } from \"../Materials/material\";\r\nimport type { IShaderMaterialOptions } from \"../Materials/shaderMaterial\";\r\nimport { ShaderMaterial } from \"../Materials/shaderMaterial\";\r\nimport type { Effect } from \"../Materials/effect\";\r\nimport { ShaderLanguage } from \"core/Materials/shaderLanguage\";\r\n\r\nMesh._LinesMeshParser = (parsedMesh: any, scene: Scene): Mesh => {\r\n return LinesMesh.Parse(parsedMesh, scene);\r\n};\r\n\r\n/**\r\n * Line mesh\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/creation/param\r\n */\r\nexport class LinesMesh extends Mesh {\r\n /**\r\n * Force all the LineMeshes to compile their default color material to glsl even on WebGPU engines.\r\n * False by default. This is mostly meant for backward compatibility.\r\n */\r\n public static ForceGLSL = false;\r\n\r\n /**\r\n * Color of the line (Default: White)\r\n */\r\n public color = new Color3(1, 1, 1);\r\n\r\n /**\r\n * Alpha of the line (Default: 1)\r\n */\r\n public alpha = 1;\r\n\r\n /**\r\n * The intersection Threshold is the margin applied when intersection a segment of the LinesMesh with a Ray.\r\n * This margin is expressed in world space coordinates, so its value may vary.\r\n * Default value is 0.1\r\n */\r\n public intersectionThreshold: number;\r\n\r\n private _lineMaterial: Material;\r\n\r\n private _isShaderMaterial(shader: Material): shader is ShaderMaterial {\r\n return shader.getClassName() === \"ShaderMaterial\";\r\n }\r\n\r\n private _color4: Color4;\r\n\r\n /** Shader language used by the material */\r\n protected _shaderLanguage = ShaderLanguage.GLSL;\r\n\r\n /**\r\n * Creates a new LinesMesh\r\n * @param name defines the name\r\n * @param scene defines the hosting scene\r\n * @param parent defines the parent mesh if any\r\n * @param source defines the optional source LinesMesh used to clone data from\r\n * @param doNotCloneChildren When cloning, skip cloning child meshes of source, default False.\r\n * When false, achieved by calling a clone(), also passing False.\r\n * This will make creation of children, recursive.\r\n * @param useVertexColor defines if this LinesMesh supports vertex color\r\n * @param useVertexAlpha defines if this LinesMesh supports vertex alpha\r\n * @param material material to use to draw the line. If not provided, will create a new one\r\n */\r\n constructor(\r\n name: string,\r\n scene: Nullable<Scene> = null,\r\n parent: Nullable<Node> = null,\r\n source: Nullable<LinesMesh> = null,\r\n doNotCloneChildren?: boolean,\r\n /**\r\n * If vertex color should be applied to the mesh\r\n */\r\n public readonly useVertexColor?: boolean,\r\n /**\r\n * If vertex alpha should be applied to the mesh\r\n */\r\n public readonly useVertexAlpha?: boolean,\r\n material?: Material\r\n ) {\r\n super(name, scene, parent, source, doNotCloneChildren);\r\n\r\n if (source) {\r\n this.color = source.color.clone();\r\n this.alpha = source.alpha;\r\n this.useVertexColor = source.useVertexColor;\r\n this.useVertexAlpha = source.useVertexAlpha;\r\n }\r\n\r\n this.intersectionThreshold = 0.1;\r\n\r\n const defines: string[] = [];\r\n const options: Partial<IShaderMaterialOptions> = {\r\n attributes: [VertexBuffer.PositionKind],\r\n uniforms: [\"world\", \"viewProjection\"],\r\n needAlphaBlending: true,\r\n defines: defines,\r\n useClipPlane: null,\r\n shaderLanguage: ShaderLanguage.GLSL,\r\n };\r\n\r\n if (!useVertexAlpha) {\r\n options.needAlphaBlending = false;\r\n } else {\r\n options.defines!.push(\"#define VERTEXALPHA\");\r\n }\r\n\r\n if (!useVertexColor) {\r\n options.uniforms!.push(\"color\");\r\n this._color4 = new Color4();\r\n } else {\r\n options.defines!.push(\"#define VERTEXCOLOR\");\r\n options.attributes!.push(VertexBuffer.ColorKind);\r\n }\r\n\r\n if (material) {\r\n this.material = material;\r\n } else {\r\n const engine = this.getScene().getEngine();\r\n\r\n if (engine.isWebGPU && !LinesMesh.ForceGLSL) {\r\n this._shaderLanguage = ShaderLanguage.WGSL;\r\n }\r\n\r\n options.shaderLanguage = this._shaderLanguage;\r\n options.extraInitializationsAsync = async () => {\r\n if (this._shaderLanguage === ShaderLanguage.WGSL) {\r\n await Promise.all([import(\"../ShadersWGSL/color.vertex\"), import(\"../ShadersWGSL/color.fragment\")]);\r\n } else {\r\n await Promise.all([import(\"../Shaders/color.vertex\"), import(\"../Shaders/color.fragment\")]);\r\n }\r\n };\r\n\r\n this.material = new ShaderMaterial(\"colorShader\", this.getScene(), \"color\", options, false);\r\n this.material.doNotSerialize = true;\r\n }\r\n }\r\n\r\n public override isReady() {\r\n if (!this._lineMaterial.isReady(this, !!this._userInstancedBuffersStorage || this.hasThinInstances)) {\r\n return false;\r\n }\r\n\r\n return super.isReady();\r\n }\r\n\r\n /**\r\n * @returns the string \"LineMesh\"\r\n */\r\n public override getClassName(): string {\r\n return \"LinesMesh\";\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public override get material(): Material {\r\n return this._lineMaterial;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public override set material(value: Material) {\r\n this._lineMaterial = value;\r\n this._lineMaterial.fillMode = Material.LineListDrawMode;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public override get checkCollisions(): boolean {\r\n return false;\r\n }\r\n\r\n public override set checkCollisions(value: boolean) {\r\n // Just ignore it\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public override _bind(_subMesh: SubMesh, colorEffect: Effect): Mesh {\r\n if (!this._geometry) {\r\n return this;\r\n }\r\n\r\n // VBOs\r\n const indexToBind = this.isUnIndexed ? null : this._geometry.getIndexBuffer();\r\n if (!this._userInstancedBuffersStorage || this.hasThinInstances) {\r\n this._geometry._bind(colorEffect, indexToBind);\r\n } else {\r\n this._geometry._bind(colorEffect, indexToBind, this._userInstancedBuffersStorage.vertexBuffers, this._userInstancedBuffersStorage.vertexArrayObjects);\r\n }\r\n\r\n // Color\r\n if (!this.useVertexColor && this._isShaderMaterial(this._lineMaterial)) {\r\n const { r, g, b } = this.color;\r\n this._color4.set(r, g, b, this.alpha);\r\n this._lineMaterial.setColor4(\"color\", this._color4);\r\n }\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public override _draw(subMesh: SubMesh, fillMode: number, instancesCount?: number): Mesh {\r\n if (!this._geometry || !this._geometry.getVertexBuffers() || (!this._unIndexed && !this._geometry.getIndexBuffer())) {\r\n return this;\r\n }\r\n\r\n const engine = this.getScene().getEngine();\r\n\r\n // Draw order\r\n\r\n if (this._unIndexed) {\r\n engine.drawArraysType(Material.LineListDrawMode, subMesh.verticesStart, subMesh.verticesCount, instancesCount);\r\n } else {\r\n engine.drawElementsType(Material.LineListDrawMode, subMesh.indexStart, subMesh.indexCount, instancesCount);\r\n }\r\n return this;\r\n }\r\n\r\n /**\r\n * Disposes of the line mesh\r\n * @param doNotRecurse If children should be disposed\r\n * @param disposeMaterialAndTextures This parameter is not used by the LineMesh class\r\n * @param doNotDisposeMaterial If the material should not be disposed (default: false, meaning the material is disposed)\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n public override dispose(doNotRecurse?: boolean, disposeMaterialAndTextures = false, doNotDisposeMaterial?: boolean): void {\r\n if (!doNotDisposeMaterial) {\r\n this._lineMaterial.dispose(false, false, true);\r\n }\r\n super.dispose(doNotRecurse);\r\n }\r\n\r\n /**\r\n * Returns a new LineMesh object cloned from the current one.\r\n * @param name defines the cloned mesh name\r\n * @param newParent defines the new mesh parent\r\n * @param doNotCloneChildren if set to true, none of the mesh children are cloned (false by default)\r\n * @returns the new mesh\r\n */\r\n public override clone(name: string, newParent: Nullable<Node> = null, doNotCloneChildren?: boolean): LinesMesh {\r\n return new LinesMesh(name, this.getScene(), newParent, this, doNotCloneChildren);\r\n }\r\n\r\n /**\r\n * Creates a new InstancedLinesMesh object from the mesh model.\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/copies/instances\r\n * @param name defines the name of the new instance\r\n * @returns a new InstancedLinesMesh\r\n */\r\n public override createInstance(name: string): InstancedLinesMesh {\r\n const instance = new InstancedLinesMesh(name, this);\r\n\r\n if (this.instancedBuffers) {\r\n instance.instancedBuffers = {};\r\n\r\n for (const key in this.instancedBuffers) {\r\n instance.instancedBuffers[key] = this.instancedBuffers[key];\r\n }\r\n }\r\n\r\n return instance;\r\n }\r\n\r\n /**\r\n * Serializes this ground mesh\r\n * @param serializationObject object to write serialization to\r\n */\r\n public override serialize(serializationObject: any): void {\r\n super.serialize(serializationObject);\r\n serializationObject.color = this.color.asArray();\r\n serializationObject.alpha = this.alpha;\r\n }\r\n\r\n /**\r\n * Parses a serialized ground mesh\r\n * @param parsedMesh the serialized mesh\r\n * @param scene the scene to create the ground mesh in\r\n * @returns the created ground mesh\r\n */\r\n public static override Parse(parsedMesh: any, scene: Scene): LinesMesh {\r\n const result = new LinesMesh(parsedMesh.name, scene);\r\n\r\n result.color = Color3.FromArray(parsedMesh.color);\r\n result.alpha = parsedMesh.alpha;\r\n\r\n return result;\r\n }\r\n}\r\n\r\n/**\r\n * Creates an instance based on a source LinesMesh\r\n */\r\nexport class InstancedLinesMesh extends InstancedMesh {\r\n /**\r\n * The intersection Threshold is the margin applied when intersection a segment of the LinesMesh with a Ray.\r\n * This margin is expressed in world space coordinates, so its value may vary.\r\n * Initialized with the intersectionThreshold value of the source LinesMesh\r\n */\r\n public intersectionThreshold: number;\r\n\r\n constructor(name: string, source: LinesMesh) {\r\n super(name, source);\r\n this.intersectionThreshold = source.intersectionThreshold;\r\n }\r\n\r\n /**\r\n * @returns the string \"InstancedLinesMesh\".\r\n */\r\n public override getClassName(): string {\r\n return \"InstancedLinesMesh\";\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"linesMesh.js","sourceRoot":"","sources":["../../../../dev/core/src/Meshes/linesMesh.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Nullable } from \"../types\";\r\nimport type { Scene } from \"../scene\";\r\nimport { Color3, Color4 } from \"../Maths/math.color\";\r\nimport type { Node } from \"../node\";\r\nimport { VertexBuffer } from \"../Buffers/buffer\";\r\nimport type { SubMesh } from \"../Meshes/subMesh\";\r\nimport { Mesh } from \"../Meshes/mesh\";\r\nimport { InstancedMesh } from \"../Meshes/instancedMesh\";\r\nimport { Material } from \"../Materials/material\";\r\nimport type { IShaderMaterialOptions } from \"../Materials/shaderMaterial\";\r\nimport { ShaderMaterial } from \"../Materials/shaderMaterial\";\r\nimport type { Effect } from \"../Materials/effect\";\r\nimport { ShaderLanguage } from \"core/Materials/shaderLanguage\";\r\n\r\nMesh._LinesMeshParser = (parsedMesh: any, scene: Scene): Mesh => {\r\n return LinesMesh.Parse(parsedMesh, scene);\r\n};\r\n\r\n/**\r\n * Line mesh\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/creation/param\r\n */\r\nexport class LinesMesh extends Mesh {\r\n /**\r\n * Force all the LineMeshes to compile their default color material to glsl even on WebGPU engines.\r\n * False by default. This is mostly meant for backward compatibility.\r\n */\r\n public static ForceGLSL = false;\r\n\r\n /**\r\n * Color of the line (Default: White)\r\n */\r\n public color = new Color3(1, 1, 1);\r\n\r\n /**\r\n * Alpha of the line (Default: 1)\r\n */\r\n public alpha = 1;\r\n\r\n /**\r\n * The intersection Threshold is the margin applied when intersection a segment of the LinesMesh with a Ray.\r\n * This margin is expressed in world space coordinates, so its value may vary.\r\n * Default value is 0.1\r\n */\r\n public intersectionThreshold: number;\r\n\r\n private _lineMaterial: Material;\r\n\r\n private _isShaderMaterial(shader: Material): shader is ShaderMaterial {\r\n return shader.getClassName() === \"ShaderMaterial\";\r\n }\r\n\r\n private _color4: Color4;\r\n\r\n /** Shader language used by the material */\r\n protected _shaderLanguage = ShaderLanguage.GLSL;\r\n\r\n /**\r\n * Creates a new LinesMesh\r\n * @param name defines the name\r\n * @param scene defines the hosting scene\r\n * @param parent defines the parent mesh if any\r\n * @param source defines the optional source LinesMesh used to clone data from\r\n * @param doNotCloneChildren When cloning, skip cloning child meshes of source, default False.\r\n * When false, achieved by calling a clone(), also passing False.\r\n * This will make creation of children, recursive.\r\n * @param useVertexColor defines if this LinesMesh supports vertex color\r\n * @param useVertexAlpha defines if this LinesMesh supports vertex alpha\r\n * @param material material to use to draw the line. If not provided, will create a new one\r\n */\r\n constructor(\r\n name: string,\r\n scene: Nullable<Scene> = null,\r\n parent: Nullable<Node> = null,\r\n source: Nullable<LinesMesh> = null,\r\n doNotCloneChildren?: boolean,\r\n /**\r\n * If vertex color should be applied to the mesh\r\n */\r\n public readonly useVertexColor?: boolean,\r\n /**\r\n * If vertex alpha should be applied to the mesh\r\n */\r\n public readonly useVertexAlpha?: boolean,\r\n material?: Material\r\n ) {\r\n super(name, scene, parent, source, doNotCloneChildren);\r\n\r\n if (source) {\r\n this.color = source.color.clone();\r\n this.alpha = source.alpha;\r\n this.useVertexColor = source.useVertexColor;\r\n this.useVertexAlpha = source.useVertexAlpha;\r\n }\r\n\r\n this.intersectionThreshold = 0.1;\r\n\r\n const defines: string[] = [];\r\n const options: Partial<IShaderMaterialOptions> = {\r\n attributes: [VertexBuffer.PositionKind],\r\n uniforms: [\"world\", \"viewProjection\"],\r\n needAlphaBlending: true,\r\n defines: defines,\r\n useClipPlane: null,\r\n shaderLanguage: ShaderLanguage.GLSL,\r\n };\r\n\r\n if (!this.useVertexAlpha) {\r\n options.needAlphaBlending = false;\r\n } else {\r\n options.defines!.push(\"#define VERTEXALPHA\");\r\n }\r\n\r\n if (!this.useVertexColor) {\r\n options.uniforms!.push(\"color\");\r\n this._color4 = new Color4();\r\n } else {\r\n options.defines!.push(\"#define VERTEXCOLOR\");\r\n options.attributes!.push(VertexBuffer.ColorKind);\r\n }\r\n\r\n if (material) {\r\n this.material = material;\r\n } else {\r\n const engine = this.getScene().getEngine();\r\n\r\n if (engine.isWebGPU && !LinesMesh.ForceGLSL) {\r\n this._shaderLanguage = ShaderLanguage.WGSL;\r\n }\r\n\r\n options.shaderLanguage = this._shaderLanguage;\r\n options.extraInitializationsAsync = async () => {\r\n if (this._shaderLanguage === ShaderLanguage.WGSL) {\r\n await Promise.all([import(\"../ShadersWGSL/color.vertex\"), import(\"../ShadersWGSL/color.fragment\")]);\r\n } else {\r\n await Promise.all([import(\"../Shaders/color.vertex\"), import(\"../Shaders/color.fragment\")]);\r\n }\r\n };\r\n\r\n this.material = new ShaderMaterial(\"colorShader\", this.getScene(), \"color\", options, false);\r\n this.material.doNotSerialize = true;\r\n }\r\n }\r\n\r\n public override isReady() {\r\n if (!this._lineMaterial.isReady(this, !!this._userInstancedBuffersStorage || this.hasThinInstances)) {\r\n return false;\r\n }\r\n\r\n return super.isReady();\r\n }\r\n\r\n /**\r\n * @returns the string \"LineMesh\"\r\n */\r\n public override getClassName(): string {\r\n return \"LinesMesh\";\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public override get material(): Material {\r\n return this._lineMaterial;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public override set material(value: Material) {\r\n this._lineMaterial = value;\r\n this._lineMaterial.fillMode = Material.LineListDrawMode;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public override get checkCollisions(): boolean {\r\n return false;\r\n }\r\n\r\n public override set checkCollisions(value: boolean) {\r\n // Just ignore it\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public override _bind(_subMesh: SubMesh, colorEffect: Effect): Mesh {\r\n if (!this._geometry) {\r\n return this;\r\n }\r\n\r\n // VBOs\r\n const indexToBind = this.isUnIndexed ? null : this._geometry.getIndexBuffer();\r\n if (!this._userInstancedBuffersStorage || this.hasThinInstances) {\r\n this._geometry._bind(colorEffect, indexToBind);\r\n } else {\r\n this._geometry._bind(colorEffect, indexToBind, this._userInstancedBuffersStorage.vertexBuffers, this._userInstancedBuffersStorage.vertexArrayObjects);\r\n }\r\n\r\n // Color\r\n if (!this.useVertexColor && this._isShaderMaterial(this._lineMaterial)) {\r\n const { r, g, b } = this.color;\r\n this._color4.set(r, g, b, this.alpha);\r\n this._lineMaterial.setColor4(\"color\", this._color4);\r\n }\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public override _draw(subMesh: SubMesh, fillMode: number, instancesCount?: number): Mesh {\r\n if (!this._geometry || !this._geometry.getVertexBuffers() || (!this._unIndexed && !this._geometry.getIndexBuffer())) {\r\n return this;\r\n }\r\n\r\n const engine = this.getScene().getEngine();\r\n\r\n // Draw order\r\n\r\n if (this._unIndexed) {\r\n engine.drawArraysType(Material.LineListDrawMode, subMesh.verticesStart, subMesh.verticesCount, instancesCount);\r\n } else {\r\n engine.drawElementsType(Material.LineListDrawMode, subMesh.indexStart, subMesh.indexCount, instancesCount);\r\n }\r\n return this;\r\n }\r\n\r\n /**\r\n * Disposes of the line mesh\r\n * @param doNotRecurse If children should be disposed\r\n * @param disposeMaterialAndTextures This parameter is not used by the LineMesh class\r\n * @param doNotDisposeMaterial If the material should not be disposed (default: false, meaning the material is disposed)\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n public override dispose(doNotRecurse?: boolean, disposeMaterialAndTextures = false, doNotDisposeMaterial?: boolean): void {\r\n if (!doNotDisposeMaterial) {\r\n this._lineMaterial.dispose(false, false, true);\r\n }\r\n super.dispose(doNotRecurse);\r\n }\r\n\r\n /**\r\n * Returns a new LineMesh object cloned from the current one.\r\n * @param name defines the cloned mesh name\r\n * @param newParent defines the new mesh parent\r\n * @param doNotCloneChildren if set to true, none of the mesh children are cloned (false by default)\r\n * @returns the new mesh\r\n */\r\n public override clone(name: string, newParent: Nullable<Node> = null, doNotCloneChildren?: boolean): LinesMesh {\r\n return new LinesMesh(name, this.getScene(), newParent, this, doNotCloneChildren);\r\n }\r\n\r\n /**\r\n * Creates a new InstancedLinesMesh object from the mesh model.\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/copies/instances\r\n * @param name defines the name of the new instance\r\n * @returns a new InstancedLinesMesh\r\n */\r\n public override createInstance(name: string): InstancedLinesMesh {\r\n const instance = new InstancedLinesMesh(name, this);\r\n\r\n if (this.instancedBuffers) {\r\n instance.instancedBuffers = {};\r\n\r\n for (const key in this.instancedBuffers) {\r\n instance.instancedBuffers[key] = this.instancedBuffers[key];\r\n }\r\n }\r\n\r\n return instance;\r\n }\r\n\r\n /**\r\n * Serializes this ground mesh\r\n * @param serializationObject object to write serialization to\r\n */\r\n public override serialize(serializationObject: any): void {\r\n super.serialize(serializationObject);\r\n serializationObject.color = this.color.asArray();\r\n serializationObject.alpha = this.alpha;\r\n }\r\n\r\n /**\r\n * Parses a serialized ground mesh\r\n * @param parsedMesh the serialized mesh\r\n * @param scene the scene to create the ground mesh in\r\n * @returns the created ground mesh\r\n */\r\n public static override Parse(parsedMesh: any, scene: Scene): LinesMesh {\r\n const result = new LinesMesh(parsedMesh.name, scene);\r\n\r\n result.color = Color3.FromArray(parsedMesh.color);\r\n result.alpha = parsedMesh.alpha;\r\n\r\n return result;\r\n }\r\n}\r\n\r\n/**\r\n * Creates an instance based on a source LinesMesh\r\n */\r\nexport class InstancedLinesMesh extends InstancedMesh {\r\n /**\r\n * The intersection Threshold is the margin applied when intersection a segment of the LinesMesh with a Ray.\r\n * This margin is expressed in world space coordinates, so its value may vary.\r\n * Initialized with the intersectionThreshold value of the source LinesMesh\r\n */\r\n public intersectionThreshold: number;\r\n\r\n constructor(name: string, source: LinesMesh) {\r\n super(name, source);\r\n this.intersectionThreshold = source.intersectionThreshold;\r\n }\r\n\r\n /**\r\n * @returns the string \"InstancedLinesMesh\".\r\n */\r\n public override getClassName(): string {\r\n return \"InstancedLinesMesh\";\r\n }\r\n}\r\n"]}
package/Meshes/mesh.d.ts CHANGED
@@ -91,6 +91,26 @@ declare class _ThinInstanceDataStorage {
91
91
  worldMatrices: Nullable<Matrix[]>;
92
92
  masterMeshPreviousWorldMatrix: Nullable<Matrix>;
93
93
  }
94
+ /**
95
+ * Options used to clone a mesh
96
+ */
97
+ export interface MeshCloneOptions {
98
+ /** The parent of the mesh, if it has one */
99
+ parent?: Nullable<Node>;
100
+ /** Skips cloning child meshes of source (default: false. When false, achieved by calling a clone(), also passing False. This will make creation of children, recursive. */
101
+ doNotCloneChildren?: boolean;
102
+ /** Includes cloning mesh physics impostor (default: true) */
103
+ clonePhysicsImpostor?: boolean;
104
+ /** Includes cloning thin instances (default: false) */
105
+ cloneThinInstances?: boolean;
106
+ }
107
+ /**
108
+ * Options used to create a mesh
109
+ */
110
+ export interface MeshCreationOptions extends MeshCloneOptions {
111
+ /** An optional Mesh from which the new mesh will be cloned from (geometry will be shared) */
112
+ source?: Nullable<Mesh>;
113
+ }
94
114
  /**
95
115
  * Class used to represent renderable models
96
116
  */
@@ -330,7 +350,14 @@ export declare class Mesh extends AbstractMesh implements IGetSetVerticesData {
330
350
  /** Gets or sets a boolean indicating that the update of the instance buffer of the world matrices must be performed in all cases (and notably even in frozen mode) */
331
351
  get forceWorldMatrixInstancedBufferUpdate(): boolean;
332
352
  set forceWorldMatrixInstancedBufferUpdate(value: boolean);
333
- protected _copySource(source: Mesh, doNotCloneChildren?: boolean, clonePhysicsImpostor?: boolean): void;
353
+ protected _copySource(source: Mesh, doNotCloneChildren?: boolean, clonePhysicsImpostor?: boolean, cloneThinInstances?: boolean): void;
354
+ /**
355
+ * Constructor
356
+ * @param name The value used by scene.getMeshByName() to do a lookup.
357
+ * @param scene The scene to add this mesh to.
358
+ * @param options Options used to create the mesh
359
+ */
360
+ constructor(name: string, scene?: Nullable<Scene>, options?: MeshCreationOptions);
334
361
  /**
335
362
  * Constructor
336
363
  * @param name The value used by scene.getMeshByName() to do a lookup.
@@ -857,12 +884,12 @@ export declare class Mesh extends AbstractMesh implements IGetSetVerticesData {
857
884
  * Returns a new Mesh object generated from the current mesh properties.
858
885
  * This method must not get confused with createInstance()
859
886
  * @param name is a string, the name given to the new mesh
860
- * @param newParent can be any Node object (default `null`)
887
+ * @param newParent can be any Node object (default `null`) or an instance of MeshCloneOptions. If the latter, doNotCloneChildren and clonePhysicsImpostor are unused.
861
888
  * @param doNotCloneChildren allows/denies the recursive cloning of the original mesh children if any (default `false`)
862
889
  * @param clonePhysicsImpostor allows/denies the cloning in the same time of the original mesh `body` used by the physics engine, if any (default `true`)
863
890
  * @returns a new mesh
864
891
  */
865
- clone(name?: string, newParent?: Nullable<Node>, doNotCloneChildren?: boolean, clonePhysicsImpostor?: boolean): Mesh;
892
+ clone(name?: string, newParent?: Nullable<Node> | MeshCloneOptions, doNotCloneChildren?: boolean, clonePhysicsImpostor?: boolean): Mesh;
866
893
  /**
867
894
  * Releases resources associated with this mesh.
868
895
  * @param doNotRecurse Set to true to not recurse into each children (recurse into each children by default)
package/Meshes/mesh.js CHANGED
@@ -83,6 +83,13 @@ class _InternalMeshDataInfo {
83
83
  this._overrideRenderingFillMode = null;
84
84
  }
85
85
  }
86
+ const meshCreationOptions = {
87
+ source: null,
88
+ parent: null,
89
+ doNotCloneChildren: false,
90
+ clonePhysicsImpostor: true,
91
+ cloneThinInstances: false,
92
+ };
86
93
  /**
87
94
  * Class used to represent renderable models
88
95
  */
@@ -296,7 +303,7 @@ export class Mesh extends AbstractMesh {
296
303
  set forceWorldMatrixInstancedBufferUpdate(value) {
297
304
  this._instanceDataStorage.forceMatrixUpdates = value;
298
305
  }
299
- _copySource(source, doNotCloneChildren, clonePhysicsImpostor = true) {
306
+ _copySource(source, doNotCloneChildren, clonePhysicsImpostor = true, cloneThinInstances = false) {
300
307
  const scene = this.getScene();
301
308
  // Geometry
302
309
  if (source._geometry) {
@@ -395,7 +402,14 @@ export class Mesh extends AbstractMesh {
395
402
  const directDescendants = source.getDescendants(true);
396
403
  for (let index = 0; index < directDescendants.length; index++) {
397
404
  const child = directDescendants[index];
398
- if (child.clone) {
405
+ if (child._isMesh) {
406
+ meshCreationOptions.parent = this;
407
+ meshCreationOptions.doNotCloneChildren = doNotCloneChildren;
408
+ meshCreationOptions.clonePhysicsImpostor = clonePhysicsImpostor;
409
+ meshCreationOptions.cloneThinInstances = cloneThinInstances;
410
+ child.clone(this.name + "." + child.name, meshCreationOptions);
411
+ }
412
+ else if (child.clone) {
399
413
  child.clone(this.name + "." + child.name, this);
400
414
  }
401
415
  }
@@ -431,36 +445,28 @@ export class Mesh extends AbstractMesh {
431
445
  // Skeleton
432
446
  this.skeleton = source.skeleton;
433
447
  // Thin instances
434
- if (source._thinInstanceDataStorage.matrixData) {
435
- this.thinInstanceSetBuffer("matrix", new Float32Array(source._thinInstanceDataStorage.matrixData), 16, !source._thinInstanceDataStorage.matrixBuffer.isUpdatable());
436
- this._thinInstanceDataStorage.matrixBufferSize = source._thinInstanceDataStorage.matrixBufferSize;
437
- this._thinInstanceDataStorage.instancesCount = source._thinInstanceDataStorage.instancesCount;
438
- }
439
- else {
440
- this._thinInstanceDataStorage.matrixBufferSize = source._thinInstanceDataStorage.matrixBufferSize;
441
- }
442
- if (source._userThinInstanceBuffersStorage) {
443
- const userThinInstance = source._userThinInstanceBuffersStorage;
444
- for (const kind in userThinInstance.data) {
445
- this.thinInstanceSetBuffer(kind, new Float32Array(userThinInstance.data[kind]), userThinInstance.strides[kind], !userThinInstance.vertexBuffers?.[kind]?.isUpdatable());
446
- this._userThinInstanceBuffersStorage.sizes[kind] = userThinInstance.sizes[kind];
448
+ if (cloneThinInstances) {
449
+ if (source._thinInstanceDataStorage.matrixData) {
450
+ this.thinInstanceSetBuffer("matrix", new Float32Array(source._thinInstanceDataStorage.matrixData), 16, !source._thinInstanceDataStorage.matrixBuffer.isUpdatable());
451
+ this._thinInstanceDataStorage.matrixBufferSize = source._thinInstanceDataStorage.matrixBufferSize;
452
+ this._thinInstanceDataStorage.instancesCount = source._thinInstanceDataStorage.instancesCount;
453
+ }
454
+ else {
455
+ this._thinInstanceDataStorage.matrixBufferSize = source._thinInstanceDataStorage.matrixBufferSize;
456
+ }
457
+ if (source._userThinInstanceBuffersStorage) {
458
+ const userThinInstance = source._userThinInstanceBuffersStorage;
459
+ for (const kind in userThinInstance.data) {
460
+ this.thinInstanceSetBuffer(kind, new Float32Array(userThinInstance.data[kind]), userThinInstance.strides[kind], !userThinInstance.vertexBuffers?.[kind]?.isUpdatable());
461
+ this._userThinInstanceBuffersStorage.sizes[kind] = userThinInstance.sizes[kind];
462
+ }
447
463
  }
448
464
  }
449
465
  this.refreshBoundingInfo(true, true);
450
466
  this.computeWorldMatrix(true);
451
467
  }
452
- /**
453
- * Constructor
454
- * @param name The value used by scene.getMeshByName() to do a lookup.
455
- * @param scene The scene to add this mesh to.
456
- * @param parent The parent of this mesh, if it has one
457
- * @param source An optional Mesh from which geometry is shared, cloned.
458
- * @param doNotCloneChildren When cloning, skip cloning child meshes of source, default False.
459
- * When false, achieved by calling a clone(), also passing False.
460
- * This will make creation of children, recursive.
461
- * @param clonePhysicsImpostor When cloning, include cloning mesh physics impostor, default True.
462
- */
463
- constructor(name, scene = null, parent = null, source = null, doNotCloneChildren, clonePhysicsImpostor = true) {
468
+ /** @internal */
469
+ constructor(name, scene = null, parentOrOptions = null, source = null, doNotCloneChildren, clonePhysicsImpostor = true) {
464
470
  super(name, scene);
465
471
  // Internal data
466
472
  this._internalMeshDataInfo = new _InternalMeshDataInfo();
@@ -516,8 +522,21 @@ export class Mesh extends AbstractMesh {
516
522
  }
517
523
  }
518
524
  };
525
+ let parent = null;
526
+ let cloneThinInstances = false;
527
+ if (parentOrOptions && parentOrOptions._addToSceneRootNodes === undefined) {
528
+ const options = parentOrOptions;
529
+ parent = options.parent ?? null;
530
+ source = options.source ?? null;
531
+ doNotCloneChildren = options.doNotCloneChildren ?? false;
532
+ clonePhysicsImpostor = options.clonePhysicsImpostor ?? true;
533
+ cloneThinInstances = options.cloneThinInstances ?? false;
534
+ }
535
+ else {
536
+ parent = parentOrOptions;
537
+ }
519
538
  if (source) {
520
- this._copySource(source, doNotCloneChildren, clonePhysicsImpostor);
539
+ this._copySource(source, doNotCloneChildren, clonePhysicsImpostor, cloneThinInstances);
521
540
  }
522
541
  // Parent
523
542
  if (parent !== null) {
@@ -2412,12 +2431,20 @@ export class Mesh extends AbstractMesh {
2412
2431
  * Returns a new Mesh object generated from the current mesh properties.
2413
2432
  * This method must not get confused with createInstance()
2414
2433
  * @param name is a string, the name given to the new mesh
2415
- * @param newParent can be any Node object (default `null`)
2434
+ * @param newParent can be any Node object (default `null`) or an instance of MeshCloneOptions. If the latter, doNotCloneChildren and clonePhysicsImpostor are unused.
2416
2435
  * @param doNotCloneChildren allows/denies the recursive cloning of the original mesh children if any (default `false`)
2417
2436
  * @param clonePhysicsImpostor allows/denies the cloning in the same time of the original mesh `body` used by the physics engine, if any (default `true`)
2418
2437
  * @returns a new mesh
2419
2438
  */
2420
2439
  clone(name = "", newParent = null, doNotCloneChildren, clonePhysicsImpostor = true) {
2440
+ if (newParent && newParent._addToSceneRootNodes === undefined) {
2441
+ const cloneOptions = newParent;
2442
+ meshCreationOptions.source = this;
2443
+ meshCreationOptions.doNotCloneChildren = cloneOptions.doNotCloneChildren;
2444
+ meshCreationOptions.clonePhysicsImpostor = cloneOptions.clonePhysicsImpostor;
2445
+ meshCreationOptions.cloneThinInstances = cloneOptions.cloneThinInstances;
2446
+ return new Mesh(name, this.getScene(), meshCreationOptions);
2447
+ }
2421
2448
  return new Mesh(name, this.getScene(), newParent, this, doNotCloneChildren, clonePhysicsImpostor);
2422
2449
  }
2423
2450
  /**