@babylonjs/core 5.0.0-alpha.57 → 5.0.0-alpha.58

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 (237) hide show
  1. package/Cameras/Inputs/BaseCameraPointersInput.d.ts +0 -1
  2. package/Cameras/Inputs/BaseCameraPointersInput.js +5 -5
  3. package/Cameras/Inputs/BaseCameraPointersInput.js.map +1 -1
  4. package/Cameras/Inputs/freeCameraMouseInput.d.ts +0 -1
  5. package/Cameras/Inputs/freeCameraMouseInput.js +27 -28
  6. package/Cameras/Inputs/freeCameraMouseInput.js.map +1 -1
  7. package/Cameras/camera.d.ts +4 -0
  8. package/Cameras/camera.js +2 -0
  9. package/Cameras/camera.js.map +1 -1
  10. package/Culling/boundingBox.d.ts +7 -1
  11. package/Culling/boundingBox.js +4 -0
  12. package/Culling/boundingBox.js.map +1 -1
  13. package/DeviceInput/Helpers/eventFactory.js +1 -2
  14. package/DeviceInput/Helpers/eventFactory.js.map +1 -1
  15. package/DeviceInput/Implementations/webDeviceInputSystem.d.ts +1 -0
  16. package/DeviceInput/Implementations/webDeviceInputSystem.js +5 -12
  17. package/DeviceInput/Implementations/webDeviceInputSystem.js.map +1 -1
  18. package/DeviceInput/InputDevices/deviceEnums.d.ts +1 -3
  19. package/DeviceInput/InputDevices/deviceEnums.js +0 -2
  20. package/DeviceInput/InputDevices/deviceEnums.js.map +1 -1
  21. package/Engines/IDrawContext.d.ts +3 -0
  22. package/Engines/IDrawContext.js.map +1 -1
  23. package/Engines/WebGPU/Extensions/engine.alpha.js +1 -1
  24. package/Engines/WebGPU/Extensions/engine.alpha.js.map +1 -1
  25. package/Engines/WebGPU/Extensions/engine.storageBuffer.js +1 -1
  26. package/Engines/WebGPU/Extensions/engine.storageBuffer.js.map +1 -1
  27. package/Engines/WebGPU/Extensions/engine.uniformBuffer.js +1 -1
  28. package/Engines/WebGPU/Extensions/engine.uniformBuffer.js.map +1 -1
  29. package/Engines/WebGPU/webgpuBufferManager.d.ts +1 -0
  30. package/Engines/WebGPU/webgpuBufferManager.js +3 -0
  31. package/Engines/WebGPU/webgpuBufferManager.js.map +1 -1
  32. package/Engines/WebGPU/webgpuCacheBindGroups.d.ts +3 -2
  33. package/Engines/WebGPU/webgpuCacheBindGroups.js +15 -14
  34. package/Engines/WebGPU/webgpuCacheBindGroups.js.map +1 -1
  35. package/Engines/WebGPU/webgpuCacheRenderPipelineTree.d.ts +2 -0
  36. package/Engines/WebGPU/webgpuCacheRenderPipelineTree.js +17 -0
  37. package/Engines/WebGPU/webgpuCacheRenderPipelineTree.js.map +1 -1
  38. package/Engines/WebGPU/webgpuDrawContext.d.ts +21 -2
  39. package/Engines/WebGPU/webgpuDrawContext.js +67 -1
  40. package/Engines/WebGPU/webgpuDrawContext.js.map +1 -1
  41. package/Engines/WebGPU/webgpuMaterialContext.d.ts +0 -6
  42. package/Engines/WebGPU/webgpuMaterialContext.js +0 -6
  43. package/Engines/WebGPU/webgpuMaterialContext.js.map +1 -1
  44. package/Engines/WebGPU/webgpuShaderProcessor.d.ts +1 -0
  45. package/Engines/WebGPU/webgpuShaderProcessor.js +2 -1
  46. package/Engines/WebGPU/webgpuShaderProcessor.js.map +1 -1
  47. package/Engines/WebGPU/webgpuTextureHelper.js +1 -1
  48. package/Engines/WebGPU/webgpuTextureHelper.js.map +1 -1
  49. package/Engines/constants.d.ts +1 -7
  50. package/Engines/constants.js +1 -7
  51. package/Engines/constants.js.map +1 -1
  52. package/Engines/engine.d.ts +37 -2
  53. package/Engines/engine.js +68 -0
  54. package/Engines/engine.js.map +1 -1
  55. package/Engines/engineFeatures.d.ts +2 -0
  56. package/Engines/engineFeatures.js.map +1 -1
  57. package/Engines/nativeEngine.js +1 -0
  58. package/Engines/nativeEngine.js.map +1 -1
  59. package/Engines/nullEngine.js +1 -0
  60. package/Engines/nullEngine.js.map +1 -1
  61. package/Engines/thinEngine.d.ts +4 -0
  62. package/Engines/thinEngine.js +3 -2
  63. package/Engines/thinEngine.js.map +1 -1
  64. package/Engines/webgpuEngine.d.ts +14 -6
  65. package/Engines/webgpuEngine.js +107 -57
  66. package/Engines/webgpuEngine.js.map +1 -1
  67. package/Inputs/scene.inputManager.js +2 -3
  68. package/Inputs/scene.inputManager.js.map +1 -1
  69. package/Layers/effectLayer.d.ts +0 -2
  70. package/Layers/effectLayer.js +12 -11
  71. package/Layers/effectLayer.js.map +1 -1
  72. package/Layers/effectLayerSceneComponent.js +5 -0
  73. package/Layers/effectLayerSceneComponent.js.map +1 -1
  74. package/Layers/glowLayer.js +2 -0
  75. package/Layers/glowLayer.js.map +1 -1
  76. package/Layers/highlightLayer.js +2 -0
  77. package/Layers/highlightLayer.js.map +1 -1
  78. package/LensFlares/lensFlare.d.ts +3 -0
  79. package/LensFlares/lensFlare.js +5 -0
  80. package/LensFlares/lensFlare.js.map +1 -1
  81. package/LensFlares/lensFlareSystem.d.ts +2 -1
  82. package/LensFlares/lensFlareSystem.js +15 -12
  83. package/LensFlares/lensFlareSystem.js.map +1 -1
  84. package/Lights/Shadows/cascadedShadowGenerator.d.ts +0 -2
  85. package/Lights/Shadows/cascadedShadowGenerator.js +3 -12
  86. package/Lights/Shadows/cascadedShadowGenerator.js.map +1 -1
  87. package/Lights/Shadows/shadowGenerator.d.ts +0 -3
  88. package/Lights/Shadows/shadowGenerator.js +8 -14
  89. package/Lights/Shadows/shadowGenerator.js.map +1 -1
  90. package/Lights/light.js +3 -0
  91. package/Lights/light.js.map +1 -1
  92. package/Loading/Plugins/babylonFileLoader.js +3 -0
  93. package/Loading/Plugins/babylonFileLoader.js.map +1 -1
  94. package/Materials/Background/backgroundMaterial.js +8 -11
  95. package/Materials/Background/backgroundMaterial.js.map +1 -1
  96. package/Materials/Node/Blocks/PBR/reflectionBlock.js +1 -1
  97. package/Materials/Node/Blocks/PBR/reflectionBlock.js.map +1 -1
  98. package/Materials/Node/Blocks/cloudBlock.d.ts +4 -0
  99. package/Materials/Node/Blocks/cloudBlock.js +27 -8
  100. package/Materials/Node/Blocks/cloudBlock.js.map +1 -1
  101. package/Materials/Node/Blocks/colorMergerBlock.d.ts +21 -0
  102. package/Materials/Node/Blocks/colorMergerBlock.js +48 -4
  103. package/Materials/Node/Blocks/colorMergerBlock.js.map +1 -1
  104. package/Materials/Node/Blocks/vectorMergerBlock.d.ts +25 -0
  105. package/Materials/Node/Blocks/vectorMergerBlock.js +93 -23
  106. package/Materials/Node/Blocks/vectorMergerBlock.js.map +1 -1
  107. package/Materials/Node/nodeMaterial.js +4 -4
  108. package/Materials/Node/nodeMaterial.js.map +1 -1
  109. package/Materials/PBR/pbrBaseMaterial.js +8 -4
  110. package/Materials/PBR/pbrBaseMaterial.js.map +1 -1
  111. package/Materials/PBR/pbrClearCoatConfiguration.js +1 -1
  112. package/Materials/PBR/pbrClearCoatConfiguration.js.map +1 -1
  113. package/Materials/PBR/pbrSheenConfiguration.js +1 -1
  114. package/Materials/PBR/pbrSheenConfiguration.js.map +1 -1
  115. package/Materials/PBR/pbrSubSurfaceConfiguration.js +1 -1
  116. package/Materials/PBR/pbrSubSurfaceConfiguration.js.map +1 -1
  117. package/Materials/Textures/baseTexture.d.ts +2 -0
  118. package/Materials/Textures/baseTexture.js +2 -0
  119. package/Materials/Textures/baseTexture.js.map +1 -1
  120. package/Materials/Textures/renderTargetTexture.d.ts +27 -0
  121. package/Materials/Textures/renderTargetTexture.js +127 -14
  122. package/Materials/Textures/renderTargetTexture.js.map +1 -1
  123. package/Materials/Textures/texture.js +11 -4
  124. package/Materials/Textures/texture.js.map +1 -1
  125. package/Materials/drawWrapper.d.ts +2 -1
  126. package/Materials/drawWrapper.js +10 -1
  127. package/Materials/drawWrapper.js.map +1 -1
  128. package/Materials/material.d.ts +3 -1
  129. package/Materials/material.detailMapConfiguration.d.ts +1 -1
  130. package/Materials/material.detailMapConfiguration.js +2 -2
  131. package/Materials/material.detailMapConfiguration.js.map +1 -1
  132. package/Materials/material.js +18 -9
  133. package/Materials/material.js.map +1 -1
  134. package/Materials/pushMaterial.js +1 -1
  135. package/Materials/pushMaterial.js.map +1 -1
  136. package/Materials/shaderMaterial.d.ts +0 -1
  137. package/Materials/shaderMaterial.js +3 -4
  138. package/Materials/shaderMaterial.js.map +1 -1
  139. package/Materials/shadowDepthWrapper.d.ts +4 -4
  140. package/Materials/shadowDepthWrapper.js +16 -15
  141. package/Materials/shadowDepthWrapper.js.map +1 -1
  142. package/Materials/standardMaterial.js +8 -4
  143. package/Materials/standardMaterial.js.map +1 -1
  144. package/Materials/uniformBuffer.d.ts +10 -2
  145. package/Materials/uniformBuffer.js +17 -11
  146. package/Materials/uniformBuffer.js.map +1 -1
  147. package/Meshes/abstractMesh.d.ts +13 -0
  148. package/Meshes/abstractMesh.js +22 -2
  149. package/Meshes/abstractMesh.js.map +1 -1
  150. package/Meshes/linesMesh.js +1 -1
  151. package/Meshes/linesMesh.js.map +1 -1
  152. package/Meshes/mesh.js +15 -0
  153. package/Meshes/mesh.js.map +1 -1
  154. package/Meshes/subMesh.d.ts +10 -9
  155. package/Meshes/subMesh.js +44 -43
  156. package/Meshes/subMesh.js.map +1 -1
  157. package/Misc/environmentTextureTools.js +1 -0
  158. package/Misc/environmentTextureTools.js.map +1 -1
  159. package/Misc/rgbdTextureTools.js +1 -0
  160. package/Misc/rgbdTextureTools.js.map +1 -1
  161. package/Misc/sceneSerializer.js +17 -17
  162. package/Misc/sceneSerializer.js.map +1 -1
  163. package/Misc/textureTools.js +2 -0
  164. package/Misc/textureTools.js.map +1 -1
  165. package/Particles/gpuParticleSystem.d.ts +5 -1
  166. package/Particles/gpuParticleSystem.js +31 -5
  167. package/Particles/gpuParticleSystem.js.map +1 -1
  168. package/Particles/particleSystem.d.ts +5 -1
  169. package/Particles/particleSystem.js +35 -5
  170. package/Particles/particleSystem.js.map +1 -1
  171. package/PostProcesses/RenderPipeline/Pipelines/lensRenderingPipeline.js +2 -0
  172. package/PostProcesses/RenderPipeline/Pipelines/lensRenderingPipeline.js.map +1 -1
  173. package/PostProcesses/RenderPipeline/Pipelines/ssaoRenderingPipeline.js +1 -0
  174. package/PostProcesses/RenderPipeline/Pipelines/ssaoRenderingPipeline.js.map +1 -1
  175. package/PostProcesses/RenderPipeline/Pipelines/standardRenderingPipeline.js +1 -0
  176. package/PostProcesses/RenderPipeline/Pipelines/standardRenderingPipeline.js.map +1 -1
  177. package/PostProcesses/bloomMergePostProcess.js +1 -0
  178. package/PostProcesses/bloomMergePostProcess.js.map +1 -1
  179. package/PostProcesses/depthOfFieldBlurPostProcess.js +1 -0
  180. package/PostProcesses/depthOfFieldBlurPostProcess.js.map +1 -1
  181. package/PostProcesses/depthOfFieldMergePostProcess.js +1 -0
  182. package/PostProcesses/depthOfFieldMergePostProcess.js.map +1 -1
  183. package/PostProcesses/extractHighlightsPostProcess.js +1 -0
  184. package/PostProcesses/extractHighlightsPostProcess.js.map +1 -1
  185. package/PostProcesses/postProcess.d.ts +6 -0
  186. package/PostProcesses/postProcess.js +9 -1
  187. package/PostProcesses/postProcess.js.map +1 -1
  188. package/PostProcesses/screenSpaceReflectionPostProcess.js +1 -1
  189. package/PostProcesses/screenSpaceReflectionPostProcess.js.map +1 -1
  190. package/PostProcesses/tonemapPostProcess.d.ts +2 -1
  191. package/PostProcesses/tonemapPostProcess.js +3 -2
  192. package/PostProcesses/tonemapPostProcess.js.map +1 -1
  193. package/Rendering/boundingBoxRenderer.d.ts +5 -3
  194. package/Rendering/boundingBoxRenderer.js +46 -14
  195. package/Rendering/boundingBoxRenderer.js.map +1 -1
  196. package/Rendering/depthRenderer.d.ts +9 -2
  197. package/Rendering/depthRenderer.js +77 -43
  198. package/Rendering/depthRenderer.js.map +1 -1
  199. package/Rendering/depthRendererSceneComponent.js +0 -1
  200. package/Rendering/depthRendererSceneComponent.js.map +1 -1
  201. package/Rendering/edgesRenderer.d.ts +2 -0
  202. package/Rendering/edgesRenderer.js +11 -0
  203. package/Rendering/edgesRenderer.js.map +1 -1
  204. package/Rendering/geometryBufferRenderer.js +1 -1
  205. package/Rendering/geometryBufferRenderer.js.map +1 -1
  206. package/Rendering/outlineRenderer.d.ts +5 -4
  207. package/Rendering/outlineRenderer.js +24 -19
  208. package/Rendering/outlineRenderer.js.map +1 -1
  209. package/Rendering/prePassRenderer.js +2 -1
  210. package/Rendering/prePassRenderer.js.map +1 -1
  211. package/Shaders/ShadersInclude/boundingBoxRendererFragmentDeclaration.d.ts +5 -0
  212. package/Shaders/ShadersInclude/boundingBoxRendererFragmentDeclaration.js +7 -0
  213. package/Shaders/ShadersInclude/boundingBoxRendererFragmentDeclaration.js.map +1 -0
  214. package/Shaders/ShadersInclude/boundingBoxRendererUboDeclaration.d.ts +5 -0
  215. package/Shaders/ShadersInclude/boundingBoxRendererUboDeclaration.js +7 -0
  216. package/Shaders/ShadersInclude/boundingBoxRendererUboDeclaration.js.map +1 -0
  217. package/Shaders/ShadersInclude/boundingBoxRendererVertexDeclaration.d.ts +5 -0
  218. package/Shaders/ShadersInclude/boundingBoxRendererVertexDeclaration.js +7 -0
  219. package/Shaders/ShadersInclude/boundingBoxRendererVertexDeclaration.js.map +1 -0
  220. package/Shaders/boundingBoxRenderer.fragment.d.ts +7 -0
  221. package/Shaders/boundingBoxRenderer.fragment.js +9 -0
  222. package/Shaders/boundingBoxRenderer.fragment.js.map +1 -0
  223. package/Shaders/boundingBoxRenderer.vertex.d.ts +7 -0
  224. package/Shaders/boundingBoxRenderer.vertex.js +9 -0
  225. package/Shaders/boundingBoxRenderer.vertex.js.map +1 -0
  226. package/Sprites/spriteManager.d.ts +3 -1
  227. package/Sprites/spriteManager.js +16 -5
  228. package/Sprites/spriteManager.js.map +1 -1
  229. package/Sprites/spriteRenderer.d.ts +1 -0
  230. package/Sprites/spriteRenderer.js +14 -0
  231. package/Sprites/spriteRenderer.js.map +1 -1
  232. package/XR/features/WebXRWalkingLocomotion.js +28 -13
  233. package/XR/features/WebXRWalkingLocomotion.js.map +1 -1
  234. package/package.json +16 -1
  235. package/scene.d.ts +18 -4
  236. package/scene.js +99 -34
  237. package/scene.js.map +1 -1
@@ -29,12 +29,9 @@ export declare class SubMesh implements ICullable {
29
29
  indexStart: number;
30
30
  /** indices count */
31
31
  indexCount: number;
32
+ private _engine;
32
33
  /** @hidden */
33
- readonly _materialDefines: Nullable<MaterialDefines>;
34
- /** @hidden */
35
- readonly _materialEffect: Nullable<Effect>;
36
- private _drawWrappers;
37
- private _mainDrawWrapper;
34
+ _drawWrappers: Array<DrawWrapper>;
38
35
  private _mainDrawWrapperOverride;
39
36
  /**
40
37
  * Gets material defines used by the effect associated to the sub mesh
@@ -45,9 +42,9 @@ export declare class SubMesh implements ICullable {
45
42
  */
46
43
  set materialDefines(defines: Nullable<MaterialDefines>);
47
44
  /** @hidden */
48
- _getDrawWrapper(name: string, createIfNotExisting?: boolean): DrawWrapper | undefined;
45
+ _getDrawWrapper(passId?: number, createIfNotExisting?: boolean): DrawWrapper | undefined;
49
46
  /** @hidden */
50
- _removeEffect(name: string): void;
47
+ _removeDrawWrapper(passId: number, disposeWrapper?: boolean): void;
51
48
  /**
52
49
  * Gets associated (main) effect (possibly the effect override if defined)
53
50
  */
@@ -63,9 +60,13 @@ export declare class SubMesh implements ICullable {
63
60
  * @param effect defines the effect to associate with
64
61
  * @param defines defines the set of defines used to compile this effect
65
62
  * @param materialContext material context associated to the effect
66
- * @param resetMaterialContext true to reset the material context (if defined)
63
+ * @param resetContext true to reset the draw context
64
+ */
65
+ setEffect(effect: Nullable<Effect>, defines?: Nullable<string | MaterialDefines>, materialContext?: IMaterialContext, resetContext?: boolean): void;
66
+ /**
67
+ * Resets the draw wrappers cache
67
68
  */
68
- setEffect(effect: Nullable<Effect>, defines?: Nullable<string | MaterialDefines>, materialContext?: IMaterialContext, resetMaterialContext?: boolean): void;
69
+ resetDrawCache(): void;
69
70
  /** @hidden */
70
71
  _linesIndexCount: number;
71
72
  private _mesh;
package/Meshes/subMesh.js CHANGED
@@ -37,10 +37,6 @@ var SubMesh = /** @class */ (function () {
37
37
  this.verticesCount = verticesCount;
38
38
  this.indexStart = indexStart;
39
39
  this.indexCount = indexCount;
40
- /** @hidden */
41
- this._materialDefines = null; // fast access to _mainDrawWrapper.defines
42
- /** @hidden */
43
- this._materialEffect = null; // fast access to _mainDrawWrapper.effect
44
40
  this._mainDrawWrapperOverride = null;
45
41
  /** @hidden */
46
42
  this._linesIndexCount = 0;
@@ -61,9 +57,8 @@ var SubMesh = /** @class */ (function () {
61
57
  if (addToMesh) {
62
58
  mesh.subMeshes.push(this);
63
59
  }
64
- this._drawWrappers = {};
65
- this._mainDrawWrapper = new DrawWrapper(this._mesh.getScene().getEngine(), false);
66
- this._drawWrappers["bjs_mainpass"] = this._mainDrawWrapper;
60
+ this._engine = this._mesh.getScene().getEngine();
61
+ this.resetDrawCache();
67
62
  this._trianglePlanes = [];
68
63
  this._id = mesh.subMeshes.length - 1;
69
64
  if (createBoundingBox) {
@@ -76,42 +71,46 @@ var SubMesh = /** @class */ (function () {
76
71
  * Gets material defines used by the effect associated to the sub mesh
77
72
  */
78
73
  get: function () {
79
- return this._mainDrawWrapperOverride ? this._mainDrawWrapperOverride.defines : this._mainDrawWrapper.defines;
74
+ var _a;
75
+ return this._mainDrawWrapperOverride ? this._mainDrawWrapperOverride.defines : (_a = this._getDrawWrapper()) === null || _a === void 0 ? void 0 : _a.defines;
80
76
  },
81
77
  /**
82
78
  * Sets material defines used by the effect associated to the sub mesh
83
79
  */
84
80
  set: function (defines) {
85
81
  var _a;
86
- var drawWrapper = (_a = this._mainDrawWrapperOverride) !== null && _a !== void 0 ? _a : this._mainDrawWrapper;
82
+ var drawWrapper = (_a = this._mainDrawWrapperOverride) !== null && _a !== void 0 ? _a : this._getDrawWrapper(undefined, true);
87
83
  drawWrapper.defines = defines;
88
- this._materialDefines = defines;
89
84
  },
90
85
  enumerable: false,
91
86
  configurable: true
92
87
  });
93
88
  /** @hidden */
94
- SubMesh.prototype._getDrawWrapper = function (name, createIfNotExisting) {
89
+ SubMesh.prototype._getDrawWrapper = function (passId, createIfNotExisting) {
95
90
  if (createIfNotExisting === void 0) { createIfNotExisting = false; }
96
- if (name === "bjs_mainpass") {
97
- return this._mainDrawWrapper;
98
- }
99
- var customEffect = this._drawWrappers[name];
100
- if (!customEffect && createIfNotExisting) {
101
- this._drawWrappers[name] = customEffect = new DrawWrapper(this._mesh.getScene().getEngine());
91
+ passId = passId !== null && passId !== void 0 ? passId : this._engine.currentRenderPassId;
92
+ var drawWrapper = this._drawWrappers[passId];
93
+ if (!drawWrapper && createIfNotExisting) {
94
+ this._drawWrappers[passId] = drawWrapper = new DrawWrapper(this._mesh.getScene().getEngine());
102
95
  }
103
- return customEffect;
96
+ return drawWrapper;
104
97
  };
105
98
  /** @hidden */
106
- SubMesh.prototype._removeEffect = function (name) {
107
- delete this._drawWrappers[name];
99
+ SubMesh.prototype._removeDrawWrapper = function (passId, disposeWrapper) {
100
+ var _a;
101
+ if (disposeWrapper === void 0) { disposeWrapper = true; }
102
+ if (disposeWrapper) {
103
+ (_a = this._drawWrappers[passId]) === null || _a === void 0 ? void 0 : _a.dispose();
104
+ }
105
+ this._drawWrappers[passId] = undefined;
108
106
  };
109
107
  Object.defineProperty(SubMesh.prototype, "effect", {
110
108
  /**
111
109
  * Gets associated (main) effect (possibly the effect override if defined)
112
110
  */
113
111
  get: function () {
114
- return this._mainDrawWrapperOverride ? this._mainDrawWrapperOverride.effect : this._mainDrawWrapper.effect;
112
+ var _a, _b;
113
+ return this._mainDrawWrapperOverride ? this._mainDrawWrapperOverride.effect : ((_b = (_a = this._getDrawWrapper()) === null || _a === void 0 ? void 0 : _a.effect) !== null && _b !== void 0 ? _b : null);
115
114
  },
116
115
  enumerable: false,
117
116
  configurable: true
@@ -120,7 +119,7 @@ var SubMesh = /** @class */ (function () {
120
119
  /** @hidden */
121
120
  get: function () {
122
121
  var _a;
123
- return (_a = this._mainDrawWrapperOverride) !== null && _a !== void 0 ? _a : this._mainDrawWrapper;
122
+ return (_a = this._mainDrawWrapperOverride) !== null && _a !== void 0 ? _a : this._getDrawWrapper(undefined, true);
124
123
  },
125
124
  enumerable: false,
126
125
  configurable: true
@@ -135,40 +134,40 @@ var SubMesh = /** @class */ (function () {
135
134
  });
136
135
  /** @hidden */
137
136
  SubMesh.prototype._setMainDrawWrapperOverride = function (wrapper) {
138
- var _a;
139
137
  this._mainDrawWrapperOverride = wrapper;
140
- var drawWrapper = (_a = this._mainDrawWrapperOverride) !== null && _a !== void 0 ? _a : this._mainDrawWrapper;
141
- this._materialEffect = drawWrapper.effect;
142
- this._materialDefines = drawWrapper.defines;
143
138
  };
144
139
  /**
145
140
  * Sets associated effect (effect used to render this submesh)
146
141
  * @param effect defines the effect to associate with
147
142
  * @param defines defines the set of defines used to compile this effect
148
143
  * @param materialContext material context associated to the effect
149
- * @param resetMaterialContext true to reset the material context (if defined)
144
+ * @param resetContext true to reset the draw context
150
145
  */
151
- SubMesh.prototype.setEffect = function (effect, defines, materialContext, resetMaterialContext) {
152
- var _a;
146
+ SubMesh.prototype.setEffect = function (effect, defines, materialContext, resetContext) {
153
147
  if (defines === void 0) { defines = null; }
154
- if (resetMaterialContext === void 0) { resetMaterialContext = true; }
155
- var drawWrapper = (_a = this._mainDrawWrapperOverride) !== null && _a !== void 0 ? _a : this._mainDrawWrapper;
156
- drawWrapper.setEffect(effect, defines);
148
+ if (resetContext === void 0) { resetContext = true; }
149
+ var drawWrapper = this._drawWrapper;
150
+ drawWrapper.setEffect(effect, defines, resetContext);
157
151
  if (materialContext !== undefined) {
158
152
  drawWrapper.materialContext = materialContext;
159
- if (resetMaterialContext) {
160
- materialContext.reset();
161
- }
162
- }
163
- if (effect !== this._materialEffect) {
164
- this._materialEffect = effect;
165
- this._materialDefines = defines;
166
153
  }
167
- else if (!effect) {
168
- this._materialDefines = null;
154
+ if (!effect) {
155
+ drawWrapper.defines = null;
169
156
  drawWrapper.materialContext = undefined;
170
157
  }
171
158
  };
159
+ /**
160
+ * Resets the draw wrappers cache
161
+ */
162
+ SubMesh.prototype.resetDrawCache = function () {
163
+ if (this._drawWrappers) {
164
+ for (var _i = 0, _a = this._drawWrappers; _i < _a.length; _i++) {
165
+ var drawWrapper = _a[_i];
166
+ drawWrapper === null || drawWrapper === void 0 ? void 0 : drawWrapper.dispose();
167
+ }
168
+ }
169
+ this._drawWrappers = [];
170
+ };
172
171
  /**
173
172
  * Add a new submesh to a mesh
174
173
  * @param materialIndex defines the material index to use
@@ -249,7 +248,8 @@ var SubMesh = /** @class */ (function () {
249
248
  * @returns null or the current material
250
249
  */
251
250
  SubMesh.prototype.getMaterial = function () {
252
- var rootMaterial = this._renderingMesh.material;
251
+ var _a;
252
+ var rootMaterial = (_a = this._renderingMesh.getMaterialForRenderPass(this._engine.currentRenderPassId)) !== null && _a !== void 0 ? _a : this._renderingMesh.material;
253
253
  if (rootMaterial === null || rootMaterial === undefined) {
254
254
  return this._mesh.getScene().defaultMaterial;
255
255
  }
@@ -257,7 +257,7 @@ var SubMesh = /** @class */ (function () {
257
257
  var effectiveMaterial = rootMaterial.getSubMaterial(this.materialIndex);
258
258
  if (this._currentMaterial !== effectiveMaterial) {
259
259
  this._currentMaterial = effectiveMaterial;
260
- this._mainDrawWrapper.defines = null;
260
+ this.resetDrawCache();
261
261
  }
262
262
  return effectiveMaterial;
263
263
  }
@@ -575,6 +575,7 @@ var SubMesh = /** @class */ (function () {
575
575
  // Remove from mesh
576
576
  var index = this._mesh.subMeshes.indexOf(this);
577
577
  this._mesh.subMeshes.splice(index, 1);
578
+ this.resetDrawCache();
578
579
  };
579
580
  /**
580
581
  * Gets the class name
@@ -1 +1 @@
1
- {"version":3,"file":"subMesh.js","sourceRoot":"","sources":["../../../sourceES6/core/Meshes/subMesh.ts"],"names":[],"mappings":"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","sourcesContent":["import { Nullable, IndicesArray, DeepImmutable, FloatArray } from \"../types\";\r\nimport { Matrix, Vector3 } from \"../Maths/math.vector\";\r\nimport { Engine } from \"../Engines/engine\";\r\nimport { VertexBuffer } from \"../Buffers/buffer\";\r\nimport { IntersectionInfo } from \"../Collisions/intersectionInfo\";\r\nimport { ICullable, BoundingInfo } from \"../Culling/boundingInfo\";\r\nimport { Effect } from \"../Materials/effect\";\r\n\r\nimport { DataBuffer } from \"../Buffers/dataBuffer\";\r\nimport { extractMinAndMaxIndexed } from \"../Maths/math.functions\";\r\nimport { Plane } from \"../Maths/math.plane\";\r\nimport { DrawWrapper } from \"../Materials/drawWrapper\";\r\nimport { IMaterialContext } from \"../Engines/IMaterialContext\";\r\n\r\ndeclare type Collider = import(\"../Collisions/collider\").Collider;\r\ndeclare type Material = import(\"../Materials/material\").Material;\r\ndeclare type MaterialDefines = import(\"../Materials/materialDefines\").MaterialDefines;\r\ndeclare type MultiMaterial = import(\"../Materials/multiMaterial\").MultiMaterial;\r\ndeclare type AbstractMesh = import(\"./abstractMesh\").AbstractMesh;\r\ndeclare type Mesh = import(\"./mesh\").Mesh;\r\ndeclare type Ray = import(\"../Culling/ray\").Ray;\r\ndeclare type TrianglePickingPredicate = import(\"../Culling/ray\").TrianglePickingPredicate;\r\n\r\n/**\r\n * Defines a subdivision inside a mesh\r\n */\r\nexport class SubMesh implements ICullable {\r\n /** @hidden */\r\n public readonly _materialDefines: Nullable<MaterialDefines> = null; // fast access to _mainDrawWrapper.defines\r\n /** @hidden */\r\n public readonly _materialEffect: Nullable<Effect> = null; // fast access to _mainDrawWrapper.effect\r\n\r\n private _drawWrappers: { [name: string]: DrawWrapper };\r\n private _mainDrawWrapper: DrawWrapper; // same thing than _drawWrappers[undefined] but faster access\r\n private _mainDrawWrapperOverride: Nullable<DrawWrapper> = null;\r\n\r\n /**\r\n * Gets material defines used by the effect associated to the sub mesh\r\n */\r\n public get materialDefines(): Nullable<MaterialDefines> {\r\n return this._mainDrawWrapperOverride ? (this._mainDrawWrapperOverride.defines as MaterialDefines) : (this._mainDrawWrapper.defines as MaterialDefines);\r\n }\r\n\r\n /**\r\n * Sets material defines used by the effect associated to the sub mesh\r\n */\r\n public set materialDefines(defines: Nullable<MaterialDefines>) {\r\n const drawWrapper = this._mainDrawWrapperOverride ?? this._mainDrawWrapper;\r\n drawWrapper.defines = defines;\r\n (this._materialDefines as any) = defines;\r\n }\r\n\r\n /** @hidden */\r\n public _getDrawWrapper(name: string, createIfNotExisting = false): DrawWrapper | undefined {\r\n if (name === `bjs_mainpass`) {\r\n return this._mainDrawWrapper;\r\n }\r\n let customEffect = this._drawWrappers[name];\r\n if (!customEffect && createIfNotExisting) {\r\n this._drawWrappers[name] = customEffect = new DrawWrapper(this._mesh.getScene().getEngine());\r\n }\r\n return customEffect;\r\n }\r\n\r\n /** @hidden */\r\n public _removeEffect(name: string) {\r\n delete this._drawWrappers[name];\r\n }\r\n\r\n /**\r\n * Gets associated (main) effect (possibly the effect override if defined)\r\n */\r\n public get effect(): Nullable<Effect> {\r\n return this._mainDrawWrapperOverride ? this._mainDrawWrapperOverride.effect : this._mainDrawWrapper.effect;\r\n }\r\n\r\n /** @hidden */\r\n public get _drawWrapper(): DrawWrapper {\r\n return this._mainDrawWrapperOverride ?? this._mainDrawWrapper;\r\n }\r\n\r\n /** @hidden */\r\n public get _drawWrapperOverride(): Nullable<DrawWrapper> {\r\n return this._mainDrawWrapperOverride;\r\n }\r\n\r\n /** @hidden */\r\n public _setMainDrawWrapperOverride(wrapper: Nullable<DrawWrapper>): void {\r\n this._mainDrawWrapperOverride = wrapper;\r\n const drawWrapper = this._mainDrawWrapperOverride ?? this._mainDrawWrapper;\r\n (this._materialEffect as any) = drawWrapper.effect;\r\n (this._materialDefines as any) = drawWrapper.defines;\r\n }\r\n\r\n /**\r\n * Sets associated effect (effect used to render this submesh)\r\n * @param effect defines the effect to associate with\r\n * @param defines defines the set of defines used to compile this effect\r\n * @param materialContext material context associated to the effect\r\n * @param resetMaterialContext true to reset the material context (if defined)\r\n */\r\n public setEffect(effect: Nullable<Effect>, defines: Nullable<string | MaterialDefines> = null, materialContext?: IMaterialContext, resetMaterialContext = true) {\r\n const drawWrapper = this._mainDrawWrapperOverride ?? this._mainDrawWrapper;\r\n drawWrapper.setEffect(effect, defines);\r\n if (materialContext !== undefined) {\r\n drawWrapper.materialContext = materialContext;\r\n if (resetMaterialContext) {\r\n materialContext.reset();\r\n }\r\n }\r\n if (effect !== this._materialEffect) {\r\n (this._materialEffect as any) = effect;\r\n (this._materialDefines as any) = defines;\r\n } else if (!effect) {\r\n (this._materialDefines as any) = null;\r\n drawWrapper.materialContext = undefined;\r\n }\r\n }\r\n\r\n /** @hidden */\r\n public _linesIndexCount: number = 0;\r\n private _mesh: AbstractMesh;\r\n private _renderingMesh: Mesh;\r\n private _boundingInfo: BoundingInfo;\r\n private _linesIndexBuffer: Nullable<DataBuffer> = null;\r\n /** @hidden */\r\n public _lastColliderWorldVertices: Nullable<Vector3[]> = null;\r\n /** @hidden */\r\n public _trianglePlanes: Plane[];\r\n /** @hidden */\r\n public _lastColliderTransformMatrix: Nullable<Matrix> = null;\r\n\r\n /** @hidden */\r\n public _renderId = 0;\r\n /** @hidden */\r\n public _alphaIndex: number = 0;\r\n /** @hidden */\r\n public _distanceToCamera: number = 0;\r\n /** @hidden */\r\n public _id: number;\r\n\r\n private _currentMaterial: Nullable<Material> = null;\r\n\r\n /**\r\n * Add a new submesh to a mesh\r\n * @param materialIndex defines the material index to use\r\n * @param verticesStart defines vertex index start\r\n * @param verticesCount defines vertices count\r\n * @param indexStart defines index start\r\n * @param indexCount defines indices count\r\n * @param mesh defines the parent mesh\r\n * @param renderingMesh defines an optional rendering mesh\r\n * @param createBoundingBox defines if bounding box should be created for this submesh\r\n * @returns the new submesh\r\n */\r\n public static AddToMesh(\r\n materialIndex: number,\r\n verticesStart: number,\r\n verticesCount: number,\r\n indexStart: number,\r\n indexCount: number,\r\n mesh: AbstractMesh,\r\n renderingMesh?: Mesh,\r\n createBoundingBox: boolean = true\r\n ): SubMesh {\r\n return new SubMesh(materialIndex, verticesStart, verticesCount, indexStart, indexCount, mesh, renderingMesh, createBoundingBox);\r\n }\r\n\r\n /**\r\n * Creates a new submesh\r\n * @param materialIndex defines the material index to use\r\n * @param verticesStart defines vertex index start\r\n * @param verticesCount defines vertices count\r\n * @param indexStart defines index start\r\n * @param indexCount defines indices count\r\n * @param mesh defines the parent mesh\r\n * @param renderingMesh defines an optional rendering mesh\r\n * @param createBoundingBox defines if bounding box should be created for this submesh\r\n * @param addToMesh defines a boolean indicating that the submesh must be added to the mesh.subMeshes array (true by default)\r\n */\r\n constructor(\r\n /** the material index to use */\r\n public materialIndex: number,\r\n /** vertex index start */\r\n public verticesStart: number,\r\n /** vertices count */\r\n public verticesCount: number,\r\n /** index start */\r\n public indexStart: number,\r\n /** indices count */\r\n public indexCount: number,\r\n mesh: AbstractMesh,\r\n renderingMesh?: Mesh,\r\n createBoundingBox: boolean = true,\r\n addToMesh = true\r\n ) {\r\n this._mesh = mesh;\r\n this._renderingMesh = renderingMesh || <Mesh>mesh;\r\n if (addToMesh) {\r\n mesh.subMeshes.push(this);\r\n }\r\n\r\n this._drawWrappers = {};\r\n this._mainDrawWrapper = new DrawWrapper(this._mesh.getScene().getEngine(), false);\r\n this._drawWrappers[`bjs_mainpass`] = this._mainDrawWrapper;\r\n this._trianglePlanes = [];\r\n\r\n this._id = mesh.subMeshes.length - 1;\r\n\r\n if (createBoundingBox) {\r\n this.refreshBoundingInfo();\r\n mesh.computeWorldMatrix(true);\r\n }\r\n }\r\n\r\n /**\r\n * Returns true if this submesh covers the entire parent mesh\r\n * @ignorenaming\r\n */\r\n public get IsGlobal(): boolean {\r\n return this.verticesStart === 0 && this.verticesCount === this._mesh.getTotalVertices();\r\n }\r\n\r\n /**\r\n * Returns the submesh BoundingInfo object\r\n * @returns current bounding info (or mesh's one if the submesh is global)\r\n */\r\n public getBoundingInfo(): BoundingInfo {\r\n if (this.IsGlobal) {\r\n return this._mesh.getBoundingInfo();\r\n }\r\n\r\n return this._boundingInfo;\r\n }\r\n\r\n /**\r\n * Sets the submesh BoundingInfo\r\n * @param boundingInfo defines the new bounding info to use\r\n * @returns the SubMesh\r\n */\r\n public setBoundingInfo(boundingInfo: BoundingInfo): SubMesh {\r\n this._boundingInfo = boundingInfo;\r\n return this;\r\n }\r\n\r\n /**\r\n * Returns the mesh of the current submesh\r\n * @return the parent mesh\r\n */\r\n public getMesh(): AbstractMesh {\r\n return this._mesh;\r\n }\r\n\r\n /**\r\n * Returns the rendering mesh of the submesh\r\n * @returns the rendering mesh (could be different from parent mesh)\r\n */\r\n public getRenderingMesh(): Mesh {\r\n return this._renderingMesh;\r\n }\r\n\r\n /**\r\n * Returns the replacement mesh of the submesh\r\n * @returns the replacement mesh (could be different from parent mesh)\r\n */\r\n public getReplacementMesh(): Nullable<AbstractMesh> {\r\n return this._mesh._internalAbstractMeshDataInfo._actAsRegularMesh ? this._mesh : null;\r\n }\r\n\r\n /**\r\n * Returns the effective mesh of the submesh\r\n * @returns the effective mesh (could be different from parent mesh)\r\n */\r\n public getEffectiveMesh(): AbstractMesh {\r\n const replacementMesh = this._mesh._internalAbstractMeshDataInfo._actAsRegularMesh ? this._mesh : null;\r\n\r\n return replacementMesh ? replacementMesh : this._renderingMesh;\r\n }\r\n\r\n /**\r\n * Returns the submesh material\r\n * @returns null or the current material\r\n */\r\n public getMaterial(): Nullable<Material> {\r\n var rootMaterial = this._renderingMesh.material;\r\n\r\n if (rootMaterial === null || rootMaterial === undefined) {\r\n return this._mesh.getScene().defaultMaterial;\r\n } else if (this._IsMultiMaterial(rootMaterial)) {\r\n var effectiveMaterial = rootMaterial.getSubMaterial(this.materialIndex);\r\n\r\n if (this._currentMaterial !== effectiveMaterial) {\r\n this._currentMaterial = effectiveMaterial;\r\n this._mainDrawWrapper.defines = null;\r\n }\r\n\r\n return effectiveMaterial;\r\n }\r\n\r\n return rootMaterial;\r\n }\r\n\r\n private _IsMultiMaterial(material: Material): material is MultiMaterial {\r\n return (material as MultiMaterial).getSubMaterial !== undefined;\r\n }\r\n\r\n // Methods\r\n\r\n /**\r\n * Sets a new updated BoundingInfo object to the submesh\r\n * @param data defines an optional position array to use to determine the bounding info\r\n * @returns the SubMesh\r\n */\r\n public refreshBoundingInfo(data: Nullable<FloatArray> = null): SubMesh {\r\n this._lastColliderWorldVertices = null;\r\n\r\n if (this.IsGlobal || !this._renderingMesh || !this._renderingMesh.geometry) {\r\n return this;\r\n }\r\n\r\n if (!data) {\r\n data = this._renderingMesh.getVerticesData(VertexBuffer.PositionKind);\r\n }\r\n\r\n if (!data) {\r\n this._boundingInfo = this._mesh.getBoundingInfo();\r\n return this;\r\n }\r\n\r\n var indices = <IndicesArray>this._renderingMesh.getIndices();\r\n var extend: { minimum: Vector3; maximum: Vector3 };\r\n\r\n //is this the only submesh?\r\n if (this.indexStart === 0 && this.indexCount === indices.length) {\r\n let boundingInfo = this._renderingMesh.getBoundingInfo();\r\n\r\n //the rendering mesh's bounding info can be used, it is the standard submesh for all indices.\r\n extend = { minimum: boundingInfo.minimum.clone(), maximum: boundingInfo.maximum.clone() };\r\n } else {\r\n extend = extractMinAndMaxIndexed(data, indices, this.indexStart, this.indexCount, this._renderingMesh.geometry.boundingBias);\r\n }\r\n\r\n if (this._boundingInfo) {\r\n this._boundingInfo.reConstruct(extend.minimum, extend.maximum);\r\n } else {\r\n this._boundingInfo = new BoundingInfo(extend.minimum, extend.maximum);\r\n }\r\n return this;\r\n }\r\n\r\n /** @hidden */\r\n public _checkCollision(collider: Collider): boolean {\r\n let boundingInfo = this.getBoundingInfo();\r\n\r\n return boundingInfo._checkCollision(collider);\r\n }\r\n\r\n /**\r\n * Updates the submesh BoundingInfo\r\n * @param world defines the world matrix to use to update the bounding info\r\n * @returns the submesh\r\n */\r\n public updateBoundingInfo(world: DeepImmutable<Matrix>): SubMesh {\r\n let boundingInfo = this.getBoundingInfo();\r\n\r\n if (!boundingInfo) {\r\n this.refreshBoundingInfo();\r\n boundingInfo = this.getBoundingInfo();\r\n }\r\n if (boundingInfo) {\r\n (<BoundingInfo>boundingInfo).update(world);\r\n }\r\n return this;\r\n }\r\n\r\n /**\r\n * True is the submesh bounding box intersects the frustum defined by the passed array of planes.\r\n * @param frustumPlanes defines the frustum planes\r\n * @returns true if the submesh is intersecting with the frustum\r\n */\r\n public isInFrustum(frustumPlanes: Plane[]): boolean {\r\n let boundingInfo = this.getBoundingInfo();\r\n\r\n if (!boundingInfo) {\r\n return false;\r\n }\r\n return boundingInfo.isInFrustum(frustumPlanes, this._mesh.cullingStrategy);\r\n }\r\n\r\n /**\r\n * True is the submesh bounding box is completely inside the frustum defined by the passed array of planes\r\n * @param frustumPlanes defines the frustum planes\r\n * @returns true if the submesh is inside the frustum\r\n */\r\n public isCompletelyInFrustum(frustumPlanes: Plane[]): boolean {\r\n let boundingInfo = this.getBoundingInfo();\r\n\r\n if (!boundingInfo) {\r\n return false;\r\n }\r\n return boundingInfo.isCompletelyInFrustum(frustumPlanes);\r\n }\r\n\r\n /**\r\n * Renders the submesh\r\n * @param enableAlphaMode defines if alpha needs to be used\r\n * @returns the submesh\r\n */\r\n public render(enableAlphaMode: boolean): SubMesh {\r\n this._renderingMesh.render(this, enableAlphaMode, this._mesh._internalAbstractMeshDataInfo._actAsRegularMesh ? this._mesh : undefined);\r\n return this;\r\n }\r\n\r\n /**\r\n * @hidden\r\n */\r\n public _getLinesIndexBuffer(indices: IndicesArray, engine: Engine): DataBuffer {\r\n if (!this._linesIndexBuffer) {\r\n var linesIndices = [];\r\n\r\n for (var index = this.indexStart; index < this.indexStart + this.indexCount; index += 3) {\r\n linesIndices.push(indices[index], indices[index + 1], indices[index + 1], indices[index + 2], indices[index + 2], indices[index]);\r\n }\r\n\r\n this._linesIndexBuffer = engine.createIndexBuffer(linesIndices);\r\n this._linesIndexCount = linesIndices.length;\r\n }\r\n return this._linesIndexBuffer;\r\n }\r\n\r\n /**\r\n * Checks if the submesh intersects with a ray\r\n * @param ray defines the ray to test\r\n * @returns true is the passed ray intersects the submesh bounding box\r\n */\r\n public canIntersects(ray: Ray): boolean {\r\n let boundingInfo = this.getBoundingInfo();\r\n\r\n if (!boundingInfo) {\r\n return false;\r\n }\r\n return ray.intersectsBox(boundingInfo.boundingBox);\r\n }\r\n\r\n /**\r\n * Intersects current submesh with a ray\r\n * @param ray defines the ray to test\r\n * @param positions defines mesh's positions array\r\n * @param indices defines mesh's indices array\r\n * @param fastCheck defines if the first intersection will be used (and not the closest)\r\n * @param trianglePredicate defines an optional predicate used to select faces when a mesh intersection is detected\r\n * @returns intersection info or null if no intersection\r\n */\r\n public intersects(ray: Ray, positions: Vector3[], indices: IndicesArray, fastCheck?: boolean, trianglePredicate?: TrianglePickingPredicate): Nullable<IntersectionInfo> {\r\n const material = this.getMaterial();\r\n if (!material) {\r\n return null;\r\n }\r\n let step = 3;\r\n let checkStopper = false;\r\n\r\n switch (material.fillMode) {\r\n case 3:\r\n case 4:\r\n case 5:\r\n case 6:\r\n case 8:\r\n return null;\r\n case 7:\r\n step = 1;\r\n checkStopper = true;\r\n break;\r\n default:\r\n break;\r\n }\r\n\r\n // LineMesh first as it's also a Mesh...\r\n if (this._mesh.getClassName() === \"InstancedLinesMesh\" || this._mesh.getClassName() === \"LinesMesh\") {\r\n // Check if mesh is unindexed\r\n if (!indices.length) {\r\n return this._intersectUnIndexedLines(ray, positions, indices, (this._mesh as any).intersectionThreshold, fastCheck);\r\n }\r\n return this._intersectLines(ray, positions, indices, (this._mesh as any).intersectionThreshold, fastCheck);\r\n } else {\r\n // Check if mesh is unindexed\r\n if (!indices.length && this._mesh._unIndexed) {\r\n return this._intersectUnIndexedTriangles(ray, positions, indices, fastCheck, trianglePredicate);\r\n }\r\n\r\n return this._intersectTriangles(ray, positions, indices, step, checkStopper, fastCheck, trianglePredicate);\r\n }\r\n }\r\n\r\n /** @hidden */\r\n private _intersectLines(ray: Ray, positions: Vector3[], indices: IndicesArray, intersectionThreshold: number, fastCheck?: boolean): Nullable<IntersectionInfo> {\r\n var intersectInfo: Nullable<IntersectionInfo> = null;\r\n\r\n // Line test\r\n for (var index = this.indexStart; index < this.indexStart + this.indexCount; index += 2) {\r\n var p0 = positions[indices[index]];\r\n var p1 = positions[indices[index + 1]];\r\n\r\n var length = ray.intersectionSegment(p0, p1, intersectionThreshold);\r\n if (length < 0) {\r\n continue;\r\n }\r\n\r\n if (fastCheck || !intersectInfo || length < intersectInfo.distance) {\r\n intersectInfo = new IntersectionInfo(null, null, length);\r\n intersectInfo.faceId = index / 2;\r\n if (fastCheck) {\r\n break;\r\n }\r\n }\r\n }\r\n return intersectInfo;\r\n }\r\n\r\n /** @hidden */\r\n private _intersectUnIndexedLines(ray: Ray, positions: Vector3[], indices: IndicesArray, intersectionThreshold: number, fastCheck?: boolean): Nullable<IntersectionInfo> {\r\n var intersectInfo: Nullable<IntersectionInfo> = null;\r\n\r\n // Line test\r\n for (var index = this.verticesStart; index < this.verticesStart + this.verticesCount; index += 2) {\r\n var p0 = positions[index];\r\n var p1 = positions[index + 1];\r\n\r\n var length = ray.intersectionSegment(p0, p1, intersectionThreshold);\r\n if (length < 0) {\r\n continue;\r\n }\r\n\r\n if (fastCheck || !intersectInfo || length < intersectInfo.distance) {\r\n intersectInfo = new IntersectionInfo(null, null, length);\r\n intersectInfo.faceId = index / 2;\r\n if (fastCheck) {\r\n break;\r\n }\r\n }\r\n }\r\n\r\n return intersectInfo;\r\n }\r\n\r\n /** @hidden */\r\n private _intersectTriangles(\r\n ray: Ray,\r\n positions: Vector3[],\r\n indices: IndicesArray,\r\n step: number,\r\n checkStopper: boolean,\r\n fastCheck?: boolean,\r\n trianglePredicate?: TrianglePickingPredicate\r\n ): Nullable<IntersectionInfo> {\r\n var intersectInfo: Nullable<IntersectionInfo> = null;\r\n\r\n // Triangles test\r\n let faceId = -1;\r\n for (var index = this.indexStart; index < this.indexStart + this.indexCount - (3 - step); index += step) {\r\n faceId++;\r\n const indexA = indices[index];\r\n const indexB = indices[index + 1];\r\n const indexC = indices[index + 2];\r\n\r\n if (checkStopper && indexC === 0xffffffff) {\r\n index += 2;\r\n continue;\r\n }\r\n\r\n var p0 = positions[indexA];\r\n var p1 = positions[indexB];\r\n var p2 = positions[indexC];\r\n\r\n // stay defensive and don't check against undefined positions.\r\n if (!p0 || !p1 || !p2) {\r\n continue;\r\n }\r\n\r\n if (trianglePredicate && !trianglePredicate(p0, p1, p2, ray)) {\r\n continue;\r\n }\r\n\r\n var currentIntersectInfo = ray.intersectsTriangle(p0, p1, p2);\r\n\r\n if (currentIntersectInfo) {\r\n if (currentIntersectInfo.distance < 0) {\r\n continue;\r\n }\r\n\r\n if (fastCheck || !intersectInfo || currentIntersectInfo.distance < intersectInfo.distance) {\r\n intersectInfo = currentIntersectInfo;\r\n intersectInfo.faceId = faceId;\r\n\r\n if (fastCheck) {\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n return intersectInfo;\r\n }\r\n\r\n /** @hidden */\r\n private _intersectUnIndexedTriangles(\r\n ray: Ray,\r\n positions: Vector3[],\r\n indices: IndicesArray,\r\n fastCheck?: boolean,\r\n trianglePredicate?: TrianglePickingPredicate\r\n ): Nullable<IntersectionInfo> {\r\n var intersectInfo: Nullable<IntersectionInfo> = null;\r\n // Triangles test\r\n for (var index = this.verticesStart; index < this.verticesStart + this.verticesCount; index += 3) {\r\n var p0 = positions[index];\r\n var p1 = positions[index + 1];\r\n var p2 = positions[index + 2];\r\n\r\n if (trianglePredicate && !trianglePredicate(p0, p1, p2, ray)) {\r\n continue;\r\n }\r\n\r\n var currentIntersectInfo = ray.intersectsTriangle(p0, p1, p2);\r\n\r\n if (currentIntersectInfo) {\r\n if (currentIntersectInfo.distance < 0) {\r\n continue;\r\n }\r\n\r\n if (fastCheck || !intersectInfo || currentIntersectInfo.distance < intersectInfo.distance) {\r\n intersectInfo = currentIntersectInfo;\r\n intersectInfo.faceId = index / 3;\r\n\r\n if (fastCheck) {\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n return intersectInfo;\r\n }\r\n\r\n /** @hidden */\r\n public _rebuild(): void {\r\n if (this._linesIndexBuffer) {\r\n this._linesIndexBuffer = null;\r\n }\r\n }\r\n\r\n // Clone\r\n /**\r\n * Creates a new submesh from the passed mesh\r\n * @param newMesh defines the new hosting mesh\r\n * @param newRenderingMesh defines an optional rendering mesh\r\n * @returns the new submesh\r\n */\r\n public clone(newMesh: AbstractMesh, newRenderingMesh?: Mesh): SubMesh {\r\n var result = new SubMesh(this.materialIndex, this.verticesStart, this.verticesCount, this.indexStart, this.indexCount, newMesh, newRenderingMesh, false);\r\n\r\n if (!this.IsGlobal) {\r\n let boundingInfo = this.getBoundingInfo();\r\n\r\n if (!boundingInfo) {\r\n return result;\r\n }\r\n\r\n result._boundingInfo = new BoundingInfo(boundingInfo.minimum, boundingInfo.maximum);\r\n }\r\n\r\n return result;\r\n }\r\n\r\n // Dispose\r\n\r\n /**\r\n * Release associated resources\r\n */\r\n public dispose(): void {\r\n if (this._linesIndexBuffer) {\r\n this._mesh.getScene().getEngine()._releaseBuffer(this._linesIndexBuffer);\r\n this._linesIndexBuffer = null;\r\n }\r\n\r\n // Remove from mesh\r\n var index = this._mesh.subMeshes.indexOf(this);\r\n this._mesh.subMeshes.splice(index, 1);\r\n }\r\n\r\n /**\r\n * Gets the class name\r\n * @returns the string \"SubMesh\".\r\n */\r\n public getClassName(): string {\r\n return \"SubMesh\";\r\n }\r\n\r\n // Statics\r\n /**\r\n * Creates a new submesh from indices data\r\n * @param materialIndex the index of the main mesh material\r\n * @param startIndex the index where to start the copy in the mesh indices array\r\n * @param indexCount the number of indices to copy then from the startIndex\r\n * @param mesh the main mesh to create the submesh from\r\n * @param renderingMesh the optional rendering mesh\r\n * @param createBoundingBox defines if bounding box should be created for this submesh\r\n * @returns a new submesh\r\n */\r\n public static CreateFromIndices(materialIndex: number, startIndex: number, indexCount: number, mesh: AbstractMesh, renderingMesh?: Mesh, createBoundingBox: boolean = true): SubMesh {\r\n var minVertexIndex = Number.MAX_VALUE;\r\n var maxVertexIndex = -Number.MAX_VALUE;\r\n\r\n const whatWillRender = renderingMesh || mesh;\r\n var indices = whatWillRender!.getIndices()!;\r\n\r\n for (var index = startIndex; index < startIndex + indexCount; index++) {\r\n var vertexIndex = indices[index];\r\n\r\n if (vertexIndex < minVertexIndex) {\r\n minVertexIndex = vertexIndex;\r\n }\r\n if (vertexIndex > maxVertexIndex) {\r\n maxVertexIndex = vertexIndex;\r\n }\r\n }\r\n\r\n return new SubMesh(materialIndex, minVertexIndex, maxVertexIndex - minVertexIndex + 1, startIndex, indexCount, mesh, renderingMesh, createBoundingBox);\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"subMesh.js","sourceRoot":"","sources":["../../../sourceES6/core/Meshes/subMesh.ts"],"names":[],"mappings":"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","sourcesContent":["import { Nullable, IndicesArray, DeepImmutable, FloatArray } from \"../types\";\r\nimport { Matrix, Vector3 } from \"../Maths/math.vector\";\r\nimport { Engine } from \"../Engines/engine\";\r\nimport { VertexBuffer } from \"../Buffers/buffer\";\r\nimport { IntersectionInfo } from \"../Collisions/intersectionInfo\";\r\nimport { ICullable, BoundingInfo } from \"../Culling/boundingInfo\";\r\nimport { Effect } from \"../Materials/effect\";\r\n\r\nimport { DataBuffer } from \"../Buffers/dataBuffer\";\r\nimport { extractMinAndMaxIndexed } from \"../Maths/math.functions\";\r\nimport { Plane } from \"../Maths/math.plane\";\r\nimport { DrawWrapper } from \"../Materials/drawWrapper\";\r\nimport { IMaterialContext } from \"../Engines/IMaterialContext\";\r\n\r\ndeclare type Collider = import(\"../Collisions/collider\").Collider;\r\ndeclare type Material = import(\"../Materials/material\").Material;\r\ndeclare type MaterialDefines = import(\"../Materials/materialDefines\").MaterialDefines;\r\ndeclare type MultiMaterial = import(\"../Materials/multiMaterial\").MultiMaterial;\r\ndeclare type AbstractMesh = import(\"./abstractMesh\").AbstractMesh;\r\ndeclare type Mesh = import(\"./mesh\").Mesh;\r\ndeclare type Ray = import(\"../Culling/ray\").Ray;\r\ndeclare type TrianglePickingPredicate = import(\"../Culling/ray\").TrianglePickingPredicate;\r\n\r\n/**\r\n * Defines a subdivision inside a mesh\r\n */\r\nexport class SubMesh implements ICullable {\r\n private _engine: Engine;\r\n /** @hidden */\r\n public _drawWrappers: Array<DrawWrapper>; // index in this array = pass id\r\n private _mainDrawWrapperOverride: Nullable<DrawWrapper> = null;\r\n\r\n /**\r\n * Gets material defines used by the effect associated to the sub mesh\r\n */\r\n public get materialDefines(): Nullable<MaterialDefines> {\r\n return this._mainDrawWrapperOverride ? (this._mainDrawWrapperOverride.defines as MaterialDefines) : this._getDrawWrapper()?.defines as Nullable<MaterialDefines>;\r\n }\r\n\r\n /**\r\n * Sets material defines used by the effect associated to the sub mesh\r\n */\r\n public set materialDefines(defines: Nullable<MaterialDefines>) {\r\n const drawWrapper = this._mainDrawWrapperOverride ?? this._getDrawWrapper(undefined, true)!;\r\n drawWrapper.defines = defines;\r\n }\r\n\r\n /** @hidden */\r\n public _getDrawWrapper(passId?: number, createIfNotExisting = false): DrawWrapper | undefined {\r\n passId = passId ?? this._engine.currentRenderPassId;\r\n let drawWrapper = this._drawWrappers[passId];\r\n if (!drawWrapper && createIfNotExisting) {\r\n this._drawWrappers[passId] = drawWrapper = new DrawWrapper(this._mesh.getScene().getEngine());\r\n }\r\n return drawWrapper;\r\n }\r\n\r\n /** @hidden */\r\n public _removeDrawWrapper(passId: number, disposeWrapper = true) {\r\n if (disposeWrapper) {\r\n this._drawWrappers[passId]?.dispose();\r\n }\r\n this._drawWrappers[passId] = undefined as any;\r\n }\r\n\r\n /**\r\n * Gets associated (main) effect (possibly the effect override if defined)\r\n */\r\n public get effect(): Nullable<Effect> {\r\n return this._mainDrawWrapperOverride ? this._mainDrawWrapperOverride.effect : (this._getDrawWrapper()?.effect ?? null);\r\n }\r\n\r\n /** @hidden */\r\n public get _drawWrapper(): DrawWrapper {\r\n return this._mainDrawWrapperOverride ?? this._getDrawWrapper(undefined, true)!;\r\n }\r\n\r\n /** @hidden */\r\n public get _drawWrapperOverride(): Nullable<DrawWrapper> {\r\n return this._mainDrawWrapperOverride;\r\n }\r\n\r\n /** @hidden */\r\n public _setMainDrawWrapperOverride(wrapper: Nullable<DrawWrapper>): void {\r\n this._mainDrawWrapperOverride = wrapper;\r\n }\r\n\r\n /**\r\n * Sets associated effect (effect used to render this submesh)\r\n * @param effect defines the effect to associate with\r\n * @param defines defines the set of defines used to compile this effect\r\n * @param materialContext material context associated to the effect\r\n * @param resetContext true to reset the draw context\r\n */\r\n public setEffect(effect: Nullable<Effect>, defines: Nullable<string | MaterialDefines> = null, materialContext?: IMaterialContext, resetContext = true) {\r\n const drawWrapper = this._drawWrapper;\r\n drawWrapper.setEffect(effect, defines, resetContext);\r\n if (materialContext !== undefined) {\r\n drawWrapper.materialContext = materialContext;\r\n }\r\n if (!effect) {\r\n drawWrapper.defines = null;\r\n drawWrapper.materialContext = undefined;\r\n }\r\n }\r\n\r\n /**\r\n * Resets the draw wrappers cache\r\n */\r\n public resetDrawCache(): void {\r\n if (this._drawWrappers) {\r\n for (const drawWrapper of this._drawWrappers) {\r\n drawWrapper?.dispose();\r\n }\r\n }\r\n this._drawWrappers = [];\r\n }\r\n\r\n /** @hidden */\r\n public _linesIndexCount: number = 0;\r\n private _mesh: AbstractMesh;\r\n private _renderingMesh: Mesh;\r\n private _boundingInfo: BoundingInfo;\r\n private _linesIndexBuffer: Nullable<DataBuffer> = null;\r\n /** @hidden */\r\n public _lastColliderWorldVertices: Nullable<Vector3[]> = null;\r\n /** @hidden */\r\n public _trianglePlanes: Plane[];\r\n /** @hidden */\r\n public _lastColliderTransformMatrix: Nullable<Matrix> = null;\r\n\r\n /** @hidden */\r\n public _renderId = 0;\r\n /** @hidden */\r\n public _alphaIndex: number = 0;\r\n /** @hidden */\r\n public _distanceToCamera: number = 0;\r\n /** @hidden */\r\n public _id: number;\r\n\r\n private _currentMaterial: Nullable<Material> = null;\r\n\r\n /**\r\n * Add a new submesh to a mesh\r\n * @param materialIndex defines the material index to use\r\n * @param verticesStart defines vertex index start\r\n * @param verticesCount defines vertices count\r\n * @param indexStart defines index start\r\n * @param indexCount defines indices count\r\n * @param mesh defines the parent mesh\r\n * @param renderingMesh defines an optional rendering mesh\r\n * @param createBoundingBox defines if bounding box should be created for this submesh\r\n * @returns the new submesh\r\n */\r\n public static AddToMesh(\r\n materialIndex: number,\r\n verticesStart: number,\r\n verticesCount: number,\r\n indexStart: number,\r\n indexCount: number,\r\n mesh: AbstractMesh,\r\n renderingMesh?: Mesh,\r\n createBoundingBox: boolean = true\r\n ): SubMesh {\r\n return new SubMesh(materialIndex, verticesStart, verticesCount, indexStart, indexCount, mesh, renderingMesh, createBoundingBox);\r\n }\r\n\r\n /**\r\n * Creates a new submesh\r\n * @param materialIndex defines the material index to use\r\n * @param verticesStart defines vertex index start\r\n * @param verticesCount defines vertices count\r\n * @param indexStart defines index start\r\n * @param indexCount defines indices count\r\n * @param mesh defines the parent mesh\r\n * @param renderingMesh defines an optional rendering mesh\r\n * @param createBoundingBox defines if bounding box should be created for this submesh\r\n * @param addToMesh defines a boolean indicating that the submesh must be added to the mesh.subMeshes array (true by default)\r\n */\r\n constructor(\r\n /** the material index to use */\r\n public materialIndex: number,\r\n /** vertex index start */\r\n public verticesStart: number,\r\n /** vertices count */\r\n public verticesCount: number,\r\n /** index start */\r\n public indexStart: number,\r\n /** indices count */\r\n public indexCount: number,\r\n mesh: AbstractMesh,\r\n renderingMesh?: Mesh,\r\n createBoundingBox: boolean = true,\r\n addToMesh = true\r\n ) {\r\n this._mesh = mesh;\r\n this._renderingMesh = renderingMesh || <Mesh>mesh;\r\n if (addToMesh) {\r\n mesh.subMeshes.push(this);\r\n }\r\n\r\n this._engine = this._mesh.getScene().getEngine();\r\n this.resetDrawCache();\r\n this._trianglePlanes = [];\r\n\r\n this._id = mesh.subMeshes.length - 1;\r\n\r\n if (createBoundingBox) {\r\n this.refreshBoundingInfo();\r\n mesh.computeWorldMatrix(true);\r\n }\r\n }\r\n\r\n /**\r\n * Returns true if this submesh covers the entire parent mesh\r\n * @ignorenaming\r\n */\r\n public get IsGlobal(): boolean {\r\n return this.verticesStart === 0 && this.verticesCount === this._mesh.getTotalVertices();\r\n }\r\n\r\n /**\r\n * Returns the submesh BoundingInfo object\r\n * @returns current bounding info (or mesh's one if the submesh is global)\r\n */\r\n public getBoundingInfo(): BoundingInfo {\r\n if (this.IsGlobal) {\r\n return this._mesh.getBoundingInfo();\r\n }\r\n\r\n return this._boundingInfo;\r\n }\r\n\r\n /**\r\n * Sets the submesh BoundingInfo\r\n * @param boundingInfo defines the new bounding info to use\r\n * @returns the SubMesh\r\n */\r\n public setBoundingInfo(boundingInfo: BoundingInfo): SubMesh {\r\n this._boundingInfo = boundingInfo;\r\n return this;\r\n }\r\n\r\n /**\r\n * Returns the mesh of the current submesh\r\n * @return the parent mesh\r\n */\r\n public getMesh(): AbstractMesh {\r\n return this._mesh;\r\n }\r\n\r\n /**\r\n * Returns the rendering mesh of the submesh\r\n * @returns the rendering mesh (could be different from parent mesh)\r\n */\r\n public getRenderingMesh(): Mesh {\r\n return this._renderingMesh;\r\n }\r\n\r\n /**\r\n * Returns the replacement mesh of the submesh\r\n * @returns the replacement mesh (could be different from parent mesh)\r\n */\r\n public getReplacementMesh(): Nullable<AbstractMesh> {\r\n return this._mesh._internalAbstractMeshDataInfo._actAsRegularMesh ? this._mesh : null;\r\n }\r\n\r\n /**\r\n * Returns the effective mesh of the submesh\r\n * @returns the effective mesh (could be different from parent mesh)\r\n */\r\n public getEffectiveMesh(): AbstractMesh {\r\n const replacementMesh = this._mesh._internalAbstractMeshDataInfo._actAsRegularMesh ? this._mesh : null;\r\n\r\n return replacementMesh ? replacementMesh : this._renderingMesh;\r\n }\r\n\r\n /**\r\n * Returns the submesh material\r\n * @returns null or the current material\r\n */\r\n public getMaterial(): Nullable<Material> {\r\n var rootMaterial = this._renderingMesh.getMaterialForRenderPass(this._engine.currentRenderPassId) ?? this._renderingMesh.material;\r\n\r\n if (rootMaterial === null || rootMaterial === undefined) {\r\n return this._mesh.getScene().defaultMaterial;\r\n } else if (this._IsMultiMaterial(rootMaterial)) {\r\n var effectiveMaterial = rootMaterial.getSubMaterial(this.materialIndex);\r\n\r\n if (this._currentMaterial !== effectiveMaterial) {\r\n this._currentMaterial = effectiveMaterial;\r\n this.resetDrawCache();\r\n }\r\n\r\n return effectiveMaterial;\r\n }\r\n\r\n return rootMaterial;\r\n }\r\n\r\n private _IsMultiMaterial(material: Material): material is MultiMaterial {\r\n return (material as MultiMaterial).getSubMaterial !== undefined;\r\n }\r\n\r\n // Methods\r\n\r\n /**\r\n * Sets a new updated BoundingInfo object to the submesh\r\n * @param data defines an optional position array to use to determine the bounding info\r\n * @returns the SubMesh\r\n */\r\n public refreshBoundingInfo(data: Nullable<FloatArray> = null): SubMesh {\r\n this._lastColliderWorldVertices = null;\r\n\r\n if (this.IsGlobal || !this._renderingMesh || !this._renderingMesh.geometry) {\r\n return this;\r\n }\r\n\r\n if (!data) {\r\n data = this._renderingMesh.getVerticesData(VertexBuffer.PositionKind);\r\n }\r\n\r\n if (!data) {\r\n this._boundingInfo = this._mesh.getBoundingInfo();\r\n return this;\r\n }\r\n\r\n var indices = <IndicesArray>this._renderingMesh.getIndices();\r\n var extend: { minimum: Vector3; maximum: Vector3 };\r\n\r\n //is this the only submesh?\r\n if (this.indexStart === 0 && this.indexCount === indices.length) {\r\n let boundingInfo = this._renderingMesh.getBoundingInfo();\r\n\r\n //the rendering mesh's bounding info can be used, it is the standard submesh for all indices.\r\n extend = { minimum: boundingInfo.minimum.clone(), maximum: boundingInfo.maximum.clone() };\r\n } else {\r\n extend = extractMinAndMaxIndexed(data, indices, this.indexStart, this.indexCount, this._renderingMesh.geometry.boundingBias);\r\n }\r\n\r\n if (this._boundingInfo) {\r\n this._boundingInfo.reConstruct(extend.minimum, extend.maximum);\r\n } else {\r\n this._boundingInfo = new BoundingInfo(extend.minimum, extend.maximum);\r\n }\r\n return this;\r\n }\r\n\r\n /** @hidden */\r\n public _checkCollision(collider: Collider): boolean {\r\n let boundingInfo = this.getBoundingInfo();\r\n\r\n return boundingInfo._checkCollision(collider);\r\n }\r\n\r\n /**\r\n * Updates the submesh BoundingInfo\r\n * @param world defines the world matrix to use to update the bounding info\r\n * @returns the submesh\r\n */\r\n public updateBoundingInfo(world: DeepImmutable<Matrix>): SubMesh {\r\n let boundingInfo = this.getBoundingInfo();\r\n\r\n if (!boundingInfo) {\r\n this.refreshBoundingInfo();\r\n boundingInfo = this.getBoundingInfo();\r\n }\r\n if (boundingInfo) {\r\n (<BoundingInfo>boundingInfo).update(world);\r\n }\r\n return this;\r\n }\r\n\r\n /**\r\n * True is the submesh bounding box intersects the frustum defined by the passed array of planes.\r\n * @param frustumPlanes defines the frustum planes\r\n * @returns true if the submesh is intersecting with the frustum\r\n */\r\n public isInFrustum(frustumPlanes: Plane[]): boolean {\r\n let boundingInfo = this.getBoundingInfo();\r\n\r\n if (!boundingInfo) {\r\n return false;\r\n }\r\n return boundingInfo.isInFrustum(frustumPlanes, this._mesh.cullingStrategy);\r\n }\r\n\r\n /**\r\n * True is the submesh bounding box is completely inside the frustum defined by the passed array of planes\r\n * @param frustumPlanes defines the frustum planes\r\n * @returns true if the submesh is inside the frustum\r\n */\r\n public isCompletelyInFrustum(frustumPlanes: Plane[]): boolean {\r\n let boundingInfo = this.getBoundingInfo();\r\n\r\n if (!boundingInfo) {\r\n return false;\r\n }\r\n return boundingInfo.isCompletelyInFrustum(frustumPlanes);\r\n }\r\n\r\n /**\r\n * Renders the submesh\r\n * @param enableAlphaMode defines if alpha needs to be used\r\n * @returns the submesh\r\n */\r\n public render(enableAlphaMode: boolean): SubMesh {\r\n this._renderingMesh.render(this, enableAlphaMode, this._mesh._internalAbstractMeshDataInfo._actAsRegularMesh ? this._mesh : undefined);\r\n return this;\r\n }\r\n\r\n /**\r\n * @hidden\r\n */\r\n public _getLinesIndexBuffer(indices: IndicesArray, engine: Engine): DataBuffer {\r\n if (!this._linesIndexBuffer) {\r\n var linesIndices = [];\r\n\r\n for (var index = this.indexStart; index < this.indexStart + this.indexCount; index += 3) {\r\n linesIndices.push(indices[index], indices[index + 1], indices[index + 1], indices[index + 2], indices[index + 2], indices[index]);\r\n }\r\n\r\n this._linesIndexBuffer = engine.createIndexBuffer(linesIndices);\r\n this._linesIndexCount = linesIndices.length;\r\n }\r\n return this._linesIndexBuffer;\r\n }\r\n\r\n /**\r\n * Checks if the submesh intersects with a ray\r\n * @param ray defines the ray to test\r\n * @returns true is the passed ray intersects the submesh bounding box\r\n */\r\n public canIntersects(ray: Ray): boolean {\r\n let boundingInfo = this.getBoundingInfo();\r\n\r\n if (!boundingInfo) {\r\n return false;\r\n }\r\n return ray.intersectsBox(boundingInfo.boundingBox);\r\n }\r\n\r\n /**\r\n * Intersects current submesh with a ray\r\n * @param ray defines the ray to test\r\n * @param positions defines mesh's positions array\r\n * @param indices defines mesh's indices array\r\n * @param fastCheck defines if the first intersection will be used (and not the closest)\r\n * @param trianglePredicate defines an optional predicate used to select faces when a mesh intersection is detected\r\n * @returns intersection info or null if no intersection\r\n */\r\n public intersects(ray: Ray, positions: Vector3[], indices: IndicesArray, fastCheck?: boolean, trianglePredicate?: TrianglePickingPredicate): Nullable<IntersectionInfo> {\r\n const material = this.getMaterial();\r\n if (!material) {\r\n return null;\r\n }\r\n let step = 3;\r\n let checkStopper = false;\r\n\r\n switch (material.fillMode) {\r\n case 3:\r\n case 4:\r\n case 5:\r\n case 6:\r\n case 8:\r\n return null;\r\n case 7:\r\n step = 1;\r\n checkStopper = true;\r\n break;\r\n default:\r\n break;\r\n }\r\n\r\n // LineMesh first as it's also a Mesh...\r\n if (this._mesh.getClassName() === \"InstancedLinesMesh\" || this._mesh.getClassName() === \"LinesMesh\") {\r\n // Check if mesh is unindexed\r\n if (!indices.length) {\r\n return this._intersectUnIndexedLines(ray, positions, indices, (this._mesh as any).intersectionThreshold, fastCheck);\r\n }\r\n return this._intersectLines(ray, positions, indices, (this._mesh as any).intersectionThreshold, fastCheck);\r\n } else {\r\n // Check if mesh is unindexed\r\n if (!indices.length && this._mesh._unIndexed) {\r\n return this._intersectUnIndexedTriangles(ray, positions, indices, fastCheck, trianglePredicate);\r\n }\r\n\r\n return this._intersectTriangles(ray, positions, indices, step, checkStopper, fastCheck, trianglePredicate);\r\n }\r\n }\r\n\r\n /** @hidden */\r\n private _intersectLines(ray: Ray, positions: Vector3[], indices: IndicesArray, intersectionThreshold: number, fastCheck?: boolean): Nullable<IntersectionInfo> {\r\n var intersectInfo: Nullable<IntersectionInfo> = null;\r\n\r\n // Line test\r\n for (var index = this.indexStart; index < this.indexStart + this.indexCount; index += 2) {\r\n var p0 = positions[indices[index]];\r\n var p1 = positions[indices[index + 1]];\r\n\r\n var length = ray.intersectionSegment(p0, p1, intersectionThreshold);\r\n if (length < 0) {\r\n continue;\r\n }\r\n\r\n if (fastCheck || !intersectInfo || length < intersectInfo.distance) {\r\n intersectInfo = new IntersectionInfo(null, null, length);\r\n intersectInfo.faceId = index / 2;\r\n if (fastCheck) {\r\n break;\r\n }\r\n }\r\n }\r\n return intersectInfo;\r\n }\r\n\r\n /** @hidden */\r\n private _intersectUnIndexedLines(ray: Ray, positions: Vector3[], indices: IndicesArray, intersectionThreshold: number, fastCheck?: boolean): Nullable<IntersectionInfo> {\r\n var intersectInfo: Nullable<IntersectionInfo> = null;\r\n\r\n // Line test\r\n for (var index = this.verticesStart; index < this.verticesStart + this.verticesCount; index += 2) {\r\n var p0 = positions[index];\r\n var p1 = positions[index + 1];\r\n\r\n var length = ray.intersectionSegment(p0, p1, intersectionThreshold);\r\n if (length < 0) {\r\n continue;\r\n }\r\n\r\n if (fastCheck || !intersectInfo || length < intersectInfo.distance) {\r\n intersectInfo = new IntersectionInfo(null, null, length);\r\n intersectInfo.faceId = index / 2;\r\n if (fastCheck) {\r\n break;\r\n }\r\n }\r\n }\r\n\r\n return intersectInfo;\r\n }\r\n\r\n /** @hidden */\r\n private _intersectTriangles(\r\n ray: Ray,\r\n positions: Vector3[],\r\n indices: IndicesArray,\r\n step: number,\r\n checkStopper: boolean,\r\n fastCheck?: boolean,\r\n trianglePredicate?: TrianglePickingPredicate\r\n ): Nullable<IntersectionInfo> {\r\n var intersectInfo: Nullable<IntersectionInfo> = null;\r\n\r\n // Triangles test\r\n let faceId = -1;\r\n for (var index = this.indexStart; index < this.indexStart + this.indexCount - (3 - step); index += step) {\r\n faceId++;\r\n const indexA = indices[index];\r\n const indexB = indices[index + 1];\r\n const indexC = indices[index + 2];\r\n\r\n if (checkStopper && indexC === 0xffffffff) {\r\n index += 2;\r\n continue;\r\n }\r\n\r\n var p0 = positions[indexA];\r\n var p1 = positions[indexB];\r\n var p2 = positions[indexC];\r\n\r\n // stay defensive and don't check against undefined positions.\r\n if (!p0 || !p1 || !p2) {\r\n continue;\r\n }\r\n\r\n if (trianglePredicate && !trianglePredicate(p0, p1, p2, ray)) {\r\n continue;\r\n }\r\n\r\n var currentIntersectInfo = ray.intersectsTriangle(p0, p1, p2);\r\n\r\n if (currentIntersectInfo) {\r\n if (currentIntersectInfo.distance < 0) {\r\n continue;\r\n }\r\n\r\n if (fastCheck || !intersectInfo || currentIntersectInfo.distance < intersectInfo.distance) {\r\n intersectInfo = currentIntersectInfo;\r\n intersectInfo.faceId = faceId;\r\n\r\n if (fastCheck) {\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n return intersectInfo;\r\n }\r\n\r\n /** @hidden */\r\n private _intersectUnIndexedTriangles(\r\n ray: Ray,\r\n positions: Vector3[],\r\n indices: IndicesArray,\r\n fastCheck?: boolean,\r\n trianglePredicate?: TrianglePickingPredicate\r\n ): Nullable<IntersectionInfo> {\r\n var intersectInfo: Nullable<IntersectionInfo> = null;\r\n // Triangles test\r\n for (var index = this.verticesStart; index < this.verticesStart + this.verticesCount; index += 3) {\r\n var p0 = positions[index];\r\n var p1 = positions[index + 1];\r\n var p2 = positions[index + 2];\r\n\r\n if (trianglePredicate && !trianglePredicate(p0, p1, p2, ray)) {\r\n continue;\r\n }\r\n\r\n var currentIntersectInfo = ray.intersectsTriangle(p0, p1, p2);\r\n\r\n if (currentIntersectInfo) {\r\n if (currentIntersectInfo.distance < 0) {\r\n continue;\r\n }\r\n\r\n if (fastCheck || !intersectInfo || currentIntersectInfo.distance < intersectInfo.distance) {\r\n intersectInfo = currentIntersectInfo;\r\n intersectInfo.faceId = index / 3;\r\n\r\n if (fastCheck) {\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n return intersectInfo;\r\n }\r\n\r\n /** @hidden */\r\n public _rebuild(): void {\r\n if (this._linesIndexBuffer) {\r\n this._linesIndexBuffer = null;\r\n }\r\n }\r\n\r\n // Clone\r\n /**\r\n * Creates a new submesh from the passed mesh\r\n * @param newMesh defines the new hosting mesh\r\n * @param newRenderingMesh defines an optional rendering mesh\r\n * @returns the new submesh\r\n */\r\n public clone(newMesh: AbstractMesh, newRenderingMesh?: Mesh): SubMesh {\r\n var result = new SubMesh(this.materialIndex, this.verticesStart, this.verticesCount, this.indexStart, this.indexCount, newMesh, newRenderingMesh, false);\r\n\r\n if (!this.IsGlobal) {\r\n let boundingInfo = this.getBoundingInfo();\r\n\r\n if (!boundingInfo) {\r\n return result;\r\n }\r\n\r\n result._boundingInfo = new BoundingInfo(boundingInfo.minimum, boundingInfo.maximum);\r\n }\r\n\r\n return result;\r\n }\r\n\r\n // Dispose\r\n\r\n /**\r\n * Release associated resources\r\n */\r\n public dispose(): void {\r\n if (this._linesIndexBuffer) {\r\n this._mesh.getScene().getEngine()._releaseBuffer(this._linesIndexBuffer);\r\n this._linesIndexBuffer = null;\r\n }\r\n\r\n // Remove from mesh\r\n var index = this._mesh.subMeshes.indexOf(this);\r\n this._mesh.subMeshes.splice(index, 1);\r\n\r\n this.resetDrawCache();\r\n }\r\n\r\n /**\r\n * Gets the class name\r\n * @returns the string \"SubMesh\".\r\n */\r\n public getClassName(): string {\r\n return \"SubMesh\";\r\n }\r\n\r\n // Statics\r\n /**\r\n * Creates a new submesh from indices data\r\n * @param materialIndex the index of the main mesh material\r\n * @param startIndex the index where to start the copy in the mesh indices array\r\n * @param indexCount the number of indices to copy then from the startIndex\r\n * @param mesh the main mesh to create the submesh from\r\n * @param renderingMesh the optional rendering mesh\r\n * @param createBoundingBox defines if bounding box should be created for this submesh\r\n * @returns a new submesh\r\n */\r\n public static CreateFromIndices(materialIndex: number, startIndex: number, indexCount: number, mesh: AbstractMesh, renderingMesh?: Mesh, createBoundingBox: boolean = true): SubMesh {\r\n var minVertexIndex = Number.MAX_VALUE;\r\n var maxVertexIndex = -Number.MAX_VALUE;\r\n\r\n const whatWillRender = renderingMesh || mesh;\r\n var indices = whatWillRender!.getIndices()!;\r\n\r\n for (var index = startIndex; index < startIndex + indexCount; index++) {\r\n var vertexIndex = indices[index];\r\n\r\n if (vertexIndex < minVertexIndex) {\r\n minVertexIndex = vertexIndex;\r\n }\r\n if (vertexIndex > maxVertexIndex) {\r\n maxVertexIndex = vertexIndex;\r\n }\r\n }\r\n\r\n return new SubMesh(materialIndex, minVertexIndex, maxVertexIndex - minVertexIndex + 1, startIndex, indexCount, mesh, renderingMesh, createBoundingBox);\r\n }\r\n}\r\n"]}
@@ -280,6 +280,7 @@ function _OnImageReadyAsync(image, engine, expandTexture, rgbdPostProcess, url,
280
280
  }, image);
281
281
  rgbdPostProcess.getEffect().executeWhenCompiled(function () {
282
282
  // Uncompress the data to a RTT
283
+ rgbdPostProcess.externalTextureSamplerBinding = true;
283
284
  rgbdPostProcess.onApply = function (effect) {
284
285
  effect._bindTexture("textureSampler", tempTexture_1);
285
286
  effect.setFloat2("scale", 1, engine._features.needsInvertingBitmap && (image instanceof ImageBitmap) ? -1 : 1);