@onerjs/core 8.54.1 → 8.54.3

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 (238) hide show
  1. package/Animations/animatable.core.js.map +1 -1
  2. package/AudioV2/abstractAudio/abstractSoundSource.d.ts +26 -0
  3. package/AudioV2/abstractAudio/abstractSoundSource.js.map +1 -1
  4. package/AudioV2/webAudio/webAudioEngine.js +2 -0
  5. package/AudioV2/webAudio/webAudioEngine.js.map +1 -1
  6. package/AudioV2/webAudio/webAudioSoundSource.d.ts +16 -0
  7. package/AudioV2/webAudio/webAudioSoundSource.js +43 -1
  8. package/AudioV2/webAudio/webAudioSoundSource.js.map +1 -1
  9. package/Bones/skeleton.functions.js +1 -1
  10. package/Bones/skeleton.functions.js.map +1 -1
  11. package/Cameras/inputMapper.js.map +1 -1
  12. package/Collisions/gpuPicker.js +7 -6
  13. package/Collisions/gpuPicker.js.map +1 -1
  14. package/Debug/physicsViewer.pure.js +1 -1
  15. package/Debug/physicsViewer.pure.js.map +1 -1
  16. package/Engines/Extensions/engine.alphaToCoverage.d.ts +6 -0
  17. package/Engines/Extensions/engine.alphaToCoverage.js +9 -0
  18. package/Engines/Extensions/engine.alphaToCoverage.js.map +1 -0
  19. package/Engines/Extensions/engine.alphaToCoverage.pure.d.ts +6 -0
  20. package/Engines/Extensions/engine.alphaToCoverage.pure.js +54 -0
  21. package/Engines/Extensions/engine.alphaToCoverage.pure.js.map +1 -0
  22. package/Engines/Extensions/engine.alphaToCoverage.types.d.ts +21 -0
  23. package/Engines/Extensions/engine.alphaToCoverage.types.js +2 -0
  24. package/Engines/Extensions/engine.alphaToCoverage.types.js.map +1 -0
  25. package/Engines/Extensions/engine.texture2DArrayImageSource.d.ts +6 -0
  26. package/Engines/Extensions/engine.texture2DArrayImageSource.js +9 -0
  27. package/Engines/Extensions/engine.texture2DArrayImageSource.js.map +1 -0
  28. package/Engines/Extensions/engine.texture2DArrayImageSource.pure.d.ts +7 -0
  29. package/Engines/Extensions/engine.texture2DArrayImageSource.pure.js +40 -0
  30. package/Engines/Extensions/engine.texture2DArrayImageSource.pure.js.map +1 -0
  31. package/Engines/Extensions/engine.texture2DArrayImageSource.types.d.ts +21 -0
  32. package/Engines/Extensions/engine.texture2DArrayImageSource.types.js +2 -0
  33. package/Engines/Extensions/engine.texture2DArrayImageSource.types.js.map +1 -0
  34. package/Engines/Extensions/index.d.ts +1 -0
  35. package/Engines/Extensions/index.js +1 -0
  36. package/Engines/Extensions/index.js.map +1 -1
  37. package/Engines/Extensions/pure.d.ts +2 -0
  38. package/Engines/Extensions/pure.js +2 -0
  39. package/Engines/Extensions/pure.js.map +1 -1
  40. package/Engines/Native/nativeHelpers.js +6 -4
  41. package/Engines/Native/nativeHelpers.js.map +1 -1
  42. package/Engines/Native/nativeInterfaces.d.ts +1 -0
  43. package/Engines/Native/nativeInterfaces.js.map +1 -1
  44. package/Engines/WebGPU/Extensions/engine.alphaToCoverage.d.ts +6 -0
  45. package/Engines/WebGPU/Extensions/engine.alphaToCoverage.js +9 -0
  46. package/Engines/WebGPU/Extensions/engine.alphaToCoverage.js.map +1 -0
  47. package/Engines/WebGPU/Extensions/engine.alphaToCoverage.pure.d.ts +6 -0
  48. package/Engines/WebGPU/Extensions/engine.alphaToCoverage.pure.js +34 -0
  49. package/Engines/WebGPU/Extensions/engine.alphaToCoverage.pure.js.map +1 -0
  50. package/Engines/WebGPU/Extensions/engine.alphaToCoverage.types.d.ts +16 -0
  51. package/Engines/WebGPU/Extensions/engine.alphaToCoverage.types.js +2 -0
  52. package/Engines/WebGPU/Extensions/engine.alphaToCoverage.types.js.map +1 -0
  53. package/Engines/WebGPU/Extensions/engine.texture2DArrayImageSource.d.ts +6 -0
  54. package/Engines/WebGPU/Extensions/engine.texture2DArrayImageSource.js +9 -0
  55. package/Engines/WebGPU/Extensions/engine.texture2DArrayImageSource.js.map +1 -0
  56. package/Engines/WebGPU/Extensions/engine.texture2DArrayImageSource.pure.d.ts +7 -0
  57. package/Engines/WebGPU/Extensions/engine.texture2DArrayImageSource.pure.js +23 -0
  58. package/Engines/WebGPU/Extensions/engine.texture2DArrayImageSource.pure.js.map +1 -0
  59. package/Engines/WebGPU/Extensions/index.d.ts +1 -0
  60. package/Engines/WebGPU/Extensions/index.js +1 -0
  61. package/Engines/WebGPU/Extensions/index.js.map +1 -1
  62. package/Engines/WebGPU/Extensions/pure.d.ts +2 -0
  63. package/Engines/WebGPU/Extensions/pure.js +2 -0
  64. package/Engines/WebGPU/Extensions/pure.js.map +1 -1
  65. package/Engines/WebGPU/webgpuCacheRenderPipeline.js +0 -1
  66. package/Engines/WebGPU/webgpuCacheRenderPipeline.js.map +1 -1
  67. package/Engines/abstractEngine.pure.d.ts +0 -15
  68. package/Engines/abstractEngine.pure.js +2 -23
  69. package/Engines/abstractEngine.pure.js.map +1 -1
  70. package/Engines/constants.d.ts +4 -0
  71. package/Engines/constants.js +4 -0
  72. package/Engines/constants.js.map +1 -1
  73. package/Engines/engine.d.ts +32 -2
  74. package/Engines/engine.js +1 -0
  75. package/Engines/engine.js.map +1 -1
  76. package/Engines/engine.pure.js +1 -1
  77. package/Engines/engine.pure.js.map +1 -1
  78. package/Engines/thinEngine.pure.d.ts +0 -11
  79. package/Engines/thinEngine.pure.js +0 -19
  80. package/Engines/thinEngine.pure.js.map +1 -1
  81. package/Engines/thinNativeEngine.pure.js +4 -4
  82. package/Engines/thinNativeEngine.pure.js.map +1 -1
  83. package/Engines/webgpuEngine.d.ts +2 -0
  84. package/Engines/webgpuEngine.js +2 -0
  85. package/Engines/webgpuEngine.js.map +1 -1
  86. package/Engines/webgpuEngine.pure.d.ts +0 -5
  87. package/Engines/webgpuEngine.pure.js +1 -10
  88. package/Engines/webgpuEngine.pure.js.map +1 -1
  89. package/FrameGraph/Node/Types/nodeRenderGraphTypes.js.map +1 -1
  90. package/Lights/Clustered/clusteredLightContainer.pure.js +6 -0
  91. package/Lights/Clustered/clusteredLightContainer.pure.js.map +1 -1
  92. package/Loading/Plugins/babylonFileLoader.d.ts +10 -0
  93. package/Loading/Plugins/babylonFileLoader.js +18 -0
  94. package/Loading/Plugins/babylonFileLoader.js.map +1 -1
  95. package/Loading/Plugins/babylonFileLoader.pure.js +10 -2
  96. package/Loading/Plugins/babylonFileLoader.pure.js.map +1 -1
  97. package/Loading/loadingScreen.pure.js +2 -0
  98. package/Loading/loadingScreen.pure.js.map +1 -1
  99. package/Materials/Node/Blocks/Fragment/ambientOcclusionBlock.pure.js.map +1 -1
  100. package/Materials/Node/Blocks/GaussianSplatting/gaussianSplattingBlock.pure.js +2 -1
  101. package/Materials/Node/Blocks/GaussianSplatting/gaussianSplattingBlock.pure.js.map +1 -1
  102. package/Materials/Node/nodeMaterial.pure.d.ts +13 -5
  103. package/Materials/Node/nodeMaterial.pure.js +20 -2
  104. package/Materials/Node/nodeMaterial.pure.js.map +1 -1
  105. package/Materials/Textures/index.d.ts +1 -0
  106. package/Materials/Textures/index.js +1 -0
  107. package/Materials/Textures/index.js.map +1 -1
  108. package/Materials/Textures/ktx2decoderTypes.d.ts +14 -3
  109. package/Materials/Textures/ktx2decoderTypes.js +2 -0
  110. package/Materials/Textures/ktx2decoderTypes.js.map +1 -1
  111. package/Materials/Textures/pure.d.ts +1 -0
  112. package/Materials/Textures/pure.js +1 -0
  113. package/Materials/Textures/pure.js.map +1 -1
  114. package/Materials/Textures/rawTexture2DArray.functions.d.ts +95 -0
  115. package/Materials/Textures/rawTexture2DArray.functions.js +201 -0
  116. package/Materials/Textures/rawTexture2DArray.functions.js.map +1 -0
  117. package/Materials/Textures/renderTargetTexture.pure.js +7 -0
  118. package/Materials/Textures/renderTargetTexture.pure.js.map +1 -1
  119. package/Materials/material.pure.d.ts +1 -0
  120. package/Materials/material.pure.js +1 -0
  121. package/Materials/material.pure.js.map +1 -1
  122. package/Meshes/Builders/pure.d.ts +2 -2
  123. package/Meshes/Builders/pure.js +2 -2
  124. package/Meshes/Builders/pure.js.map +1 -1
  125. package/Meshes/Builders/textBuilder.js.map +1 -1
  126. package/Meshes/Builders/tiledBoxBuilder.d.ts +1 -83
  127. package/Meshes/Builders/tiledBoxBuilder.js +3 -215
  128. package/Meshes/Builders/tiledBoxBuilder.js.map +1 -1
  129. package/Meshes/Builders/tiledBoxBuilder.pure.d.ts +89 -0
  130. package/Meshes/Builders/tiledBoxBuilder.pure.js +229 -0
  131. package/Meshes/Builders/tiledBoxBuilder.pure.js.map +1 -0
  132. package/Meshes/Builders/tiledPlaneBuilder.d.ts +1 -79
  133. package/Meshes/Builders/tiledPlaneBuilder.js +3 -429
  134. package/Meshes/Builders/tiledPlaneBuilder.js.map +1 -1
  135. package/Meshes/Builders/tiledPlaneBuilder.pure.d.ts +85 -0
  136. package/Meshes/Builders/tiledPlaneBuilder.pure.js +442 -0
  137. package/Meshes/Builders/tiledPlaneBuilder.pure.js.map +1 -0
  138. package/Meshes/GaussianSplatting/gaussianSplattingMesh.pure.d.ts +13 -0
  139. package/Meshes/GaussianSplatting/gaussianSplattingMesh.pure.js +15 -0
  140. package/Meshes/GaussianSplatting/gaussianSplattingMesh.pure.js.map +1 -1
  141. package/Meshes/GaussianSplatting/gaussianSplattingMeshBase.pure.js +29 -9
  142. package/Meshes/GaussianSplatting/gaussianSplattingMeshBase.pure.js.map +1 -1
  143. package/Meshes/Node/Blocks/bevelBlock.pure.js.map +1 -1
  144. package/Meshes/meshBuilder.d.ts +21 -57
  145. package/Meshes/meshBuilder.js +21 -58
  146. package/Meshes/meshBuilder.js.map +1 -1
  147. package/Meshes/meshBuilder.pure.d.ts +58 -0
  148. package/Meshes/meshBuilder.pure.js +60 -0
  149. package/Meshes/meshBuilder.pure.js.map +1 -0
  150. package/Meshes/pure.d.ts +1 -1
  151. package/Meshes/pure.js +1 -1
  152. package/Meshes/pure.js.map +1 -1
  153. package/Misc/greasedLineTools.js.map +1 -1
  154. package/Misc/khronosTextureContainer2.d.ts +10 -0
  155. package/Misc/khronosTextureContainer2.js +23 -12
  156. package/Misc/khronosTextureContainer2.js.map +1 -1
  157. package/Misc/perfCounter.d.ts +2 -0
  158. package/Misc/perfCounter.js +17 -2
  159. package/Misc/perfCounter.js.map +1 -1
  160. package/Misc/rgbdTextureTools.js +1 -1
  161. package/Misc/rgbdTextureTools.js.map +1 -1
  162. package/Misc/snapshotRenderingHelper.js +2 -1
  163. package/Misc/snapshotRenderingHelper.js.map +1 -1
  164. package/Misc/tools.pure.js +1 -1
  165. package/Misc/tools.pure.js.map +1 -1
  166. package/Navigation/Plugins/recastJSPlugin.js +1 -1
  167. package/Navigation/Plugins/recastJSPlugin.js.map +1 -1
  168. package/Physics/v2/Plugins/havokPlugin.js +15 -0
  169. package/Physics/v2/Plugins/havokPlugin.js.map +1 -1
  170. package/Physics/v2/characterController.d.ts +17 -0
  171. package/Physics/v2/characterController.js +40 -0
  172. package/Physics/v2/characterController.js.map +1 -1
  173. package/PostProcesses/RenderPipeline/Pipelines/lensRenderingPipeline.pure.js.map +1 -1
  174. package/PostProcesses/RenderPipeline/Pipelines/ssaoRenderingPipeline.pure.js.map +1 -1
  175. package/PostProcesses/thinSSAO2PostProcess.js.map +1 -1
  176. package/PostProcesses/volumetricLightScatteringPostProcess.d.ts +3 -0
  177. package/PostProcesses/volumetricLightScatteringPostProcess.js +3 -0
  178. package/PostProcesses/volumetricLightScatteringPostProcess.js.map +1 -1
  179. package/PostProcesses/volumetricLightScatteringPostProcess.pure.d.ts +1 -0
  180. package/PostProcesses/volumetricLightScatteringPostProcess.pure.js +25 -6
  181. package/PostProcesses/volumetricLightScatteringPostProcess.pure.js.map +1 -1
  182. package/Rendering/IBLShadows/iblShadowsAccumulationPass.d.ts +3 -1
  183. package/Rendering/IBLShadows/iblShadowsAccumulationPass.js +25 -4
  184. package/Rendering/IBLShadows/iblShadowsAccumulationPass.js.map +1 -1
  185. package/Rendering/IBLShadows/iblShadowsRenderPipeline.pure.js +6 -5
  186. package/Rendering/IBLShadows/iblShadowsRenderPipeline.pure.js.map +1 -1
  187. package/Rendering/IBLShadows/iblShadowsSpatialBlurPass.d.ts +3 -1
  188. package/Rendering/IBLShadows/iblShadowsSpatialBlurPass.js +16 -4
  189. package/Rendering/IBLShadows/iblShadowsSpatialBlurPass.js.map +1 -1
  190. package/Rendering/IBLShadows/iblShadowsVoxelRenderer.pure.js +6 -5
  191. package/Rendering/IBLShadows/iblShadowsVoxelRenderer.pure.js.map +1 -1
  192. package/Rendering/IBLShadows/iblShadowsVoxelTracingPass.d.ts +3 -1
  193. package/Rendering/IBLShadows/iblShadowsVoxelTracingPass.js +16 -4
  194. package/Rendering/IBLShadows/iblShadowsVoxelTracingPass.js.map +1 -1
  195. package/Rendering/depthRenderer.d.ts +2 -0
  196. package/Rendering/depthRenderer.js +2 -0
  197. package/Rendering/depthRenderer.js.map +1 -1
  198. package/Rendering/depthRenderer.pure.js +3 -2
  199. package/Rendering/depthRenderer.pure.js.map +1 -1
  200. package/Rendering/fluidRenderer/fluidRenderer.pure.js +6 -0
  201. package/Rendering/fluidRenderer/fluidRenderer.pure.js.map +1 -1
  202. package/Rendering/geometryBufferRenderer.pure.js +5 -5
  203. package/Rendering/geometryBufferRenderer.pure.js.map +1 -1
  204. package/Shaders/ShadersInclude/openpbrDielectricReflectance.js +6 -6
  205. package/Shaders/ShadersInclude/openpbrDielectricReflectance.js.map +1 -1
  206. package/ShadersWGSL/ShadersInclude/depthPrePass.js +2 -0
  207. package/ShadersWGSL/ShadersInclude/depthPrePass.js.map +1 -1
  208. package/ShadersWGSL/ShadersInclude/openpbrDielectricReflectance.js +7 -8
  209. package/ShadersWGSL/ShadersInclude/openpbrDielectricReflectance.js.map +1 -1
  210. package/ShadersWGSL/default.fragment.js +3 -0
  211. package/ShadersWGSL/default.fragment.js.map +1 -1
  212. package/ShadersWGSL/openpbr.fragment.js +3 -0
  213. package/ShadersWGSL/openpbr.fragment.js.map +1 -1
  214. package/ShadersWGSL/pbr.fragment.js +3 -0
  215. package/ShadersWGSL/pbr.fragment.js.map +1 -1
  216. package/ShadersWGSL/volumetricLightScattering.fragment.d.ts +5 -0
  217. package/ShadersWGSL/volumetricLightScattering.fragment.js +20 -0
  218. package/ShadersWGSL/volumetricLightScattering.fragment.js.map +1 -0
  219. package/ShadersWGSL/volumetricLightScatteringPass.fragment.d.ts +5 -0
  220. package/ShadersWGSL/volumetricLightScatteringPass.fragment.js +24 -0
  221. package/ShadersWGSL/volumetricLightScatteringPass.fragment.js.map +1 -0
  222. package/ShadersWGSL/volumetricLightScatteringPass.vertex.d.ts +5 -0
  223. package/ShadersWGSL/volumetricLightScatteringPass.vertex.js +67 -0
  224. package/ShadersWGSL/volumetricLightScatteringPass.vertex.js.map +1 -0
  225. package/SmartAssets/smartAssetManager.pure.js +9 -1
  226. package/SmartAssets/smartAssetManager.pure.js.map +1 -1
  227. package/States/alphaCullingState.d.ts +0 -9
  228. package/States/alphaCullingState.js +4 -31
  229. package/States/alphaCullingState.js.map +1 -1
  230. package/XR/features/WebXRBodyTracking.pure.d.ts +0 -28
  231. package/XR/features/WebXRBodyTracking.pure.js.map +1 -1
  232. package/XR/features/WebXRLayers.pure.js +4 -4
  233. package/XR/features/WebXRLayers.pure.js.map +1 -1
  234. package/node.d.ts +18 -1
  235. package/node.js +52 -1
  236. package/node.js.map +1 -1
  237. package/package.json +1 -1
  238. package/types.js.map +1 -1
@@ -0,0 +1,442 @@
1
+ /** This file must only contain pure code and pure imports */
2
+ import { Mesh } from "../mesh.pure.js";
3
+ import { VertexData } from "../mesh.vertexData.js";
4
+ /**
5
+ * Creates the VertexData for a tiled plane
6
+ * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/creation/set/tiled_plane
7
+ * @param options an object used to set the following optional parameters for the tiled plane, required but can be empty
8
+ * * pattern a limited pattern arrangement depending on the number
9
+ * * size of the box
10
+ * * width of the box, overwrites size
11
+ * * height of the box, overwrites size
12
+ * * tileSize sets the width, height and depth of the tile to the value of size, optional default 1
13
+ * * tileWidth sets the width (x direction) of the tile, overwrites the width set by size, optional, default size
14
+ * * tileHeight sets the height (y direction) of the tile, overwrites the height set by size, optional, default size
15
+ * * sideOrientation optional and takes the values : Mesh.FRONTSIDE (default), Mesh.BACKSIDE or Mesh.DOUBLESIDE
16
+ * * alignHorizontal places whole tiles aligned to the center, left or right of a row
17
+ * * alignVertical places whole tiles aligned to the center, left or right of a column
18
+ * * frontUvs only usable when you create a double-sided mesh, used to choose what parts of the texture image to crop and apply on the front side, optional, default vector4 (0, 0, 1, 1)
19
+ * * backUVs only usable when you create a double-sided mesh, used to choose what parts of the texture image to crop and apply on the back side, optional, default vector4 (0, 0, 1, 1)
20
+ * @returns the VertexData of the tiled plane
21
+ */
22
+ export function CreateTiledPlaneVertexData(options) {
23
+ const flipTile = options.pattern || Mesh.NO_FLIP;
24
+ const tileWidth = options.tileWidth || options.tileSize || 1;
25
+ const tileHeight = options.tileHeight || options.tileSize || 1;
26
+ const alignH = options.alignHorizontal || 0;
27
+ const alignV = options.alignVertical || 0;
28
+ const width = options.width || options.size || 1;
29
+ const tilesX = Math.floor(width / tileWidth);
30
+ let offsetX = width - tilesX * tileWidth;
31
+ const height = options.height || options.size || 1;
32
+ const tilesY = Math.floor(height / tileHeight);
33
+ let offsetY = height - tilesY * tileHeight;
34
+ const halfWidth = (tileWidth * tilesX) / 2;
35
+ const halfHeight = (tileHeight * tilesY) / 2;
36
+ let adjustX = 0;
37
+ let adjustY = 0;
38
+ let startX = 0;
39
+ let startY = 0;
40
+ let endX = 0;
41
+ let endY = 0;
42
+ //Part Tiles
43
+ if (offsetX > 0 || offsetY > 0) {
44
+ startX = -halfWidth;
45
+ startY = -halfHeight;
46
+ endX = halfWidth;
47
+ endY = halfHeight;
48
+ switch (alignH) {
49
+ case Mesh.CENTER:
50
+ offsetX /= 2;
51
+ startX -= offsetX;
52
+ endX += offsetX;
53
+ break;
54
+ case Mesh.LEFT:
55
+ endX += offsetX;
56
+ adjustX = -offsetX / 2;
57
+ break;
58
+ case Mesh.RIGHT:
59
+ startX -= offsetX;
60
+ adjustX = offsetX / 2;
61
+ break;
62
+ }
63
+ switch (alignV) {
64
+ case Mesh.CENTER:
65
+ offsetY /= 2;
66
+ startY -= offsetY;
67
+ endY += offsetY;
68
+ break;
69
+ case Mesh.BOTTOM:
70
+ endY += offsetY;
71
+ adjustY = -offsetY / 2;
72
+ break;
73
+ case Mesh.TOP:
74
+ startY -= offsetY;
75
+ adjustY = offsetY / 2;
76
+ break;
77
+ }
78
+ }
79
+ const positions = [];
80
+ const normals = [];
81
+ const uvBase = [];
82
+ uvBase[0] = [0, 0, 1, 0, 1, 1, 0, 1];
83
+ uvBase[1] = [0, 0, 1, 0, 1, 1, 0, 1];
84
+ if (flipTile === Mesh.ROTATE_TILE || flipTile === Mesh.ROTATE_ROW) {
85
+ uvBase[1] = [1, 1, 0, 1, 0, 0, 1, 0];
86
+ }
87
+ if (flipTile === Mesh.FLIP_TILE || flipTile === Mesh.FLIP_ROW) {
88
+ uvBase[1] = [1, 0, 0, 0, 0, 1, 1, 1];
89
+ }
90
+ if (flipTile === Mesh.FLIP_N_ROTATE_TILE || flipTile === Mesh.FLIP_N_ROTATE_ROW) {
91
+ uvBase[1] = [0, 1, 1, 1, 1, 0, 0, 0];
92
+ }
93
+ let uvs = [];
94
+ const colors = [];
95
+ const indices = [];
96
+ let index = 0;
97
+ for (let y = 0; y < tilesY; y++) {
98
+ for (let x = 0; x < tilesX; x++) {
99
+ positions.push(-halfWidth + x * tileWidth + adjustX, -halfHeight + y * tileHeight + adjustY, 0);
100
+ positions.push(-halfWidth + (x + 1) * tileWidth + adjustX, -halfHeight + y * tileHeight + adjustY, 0);
101
+ positions.push(-halfWidth + (x + 1) * tileWidth + adjustX, -halfHeight + (y + 1) * tileHeight + adjustY, 0);
102
+ positions.push(-halfWidth + x * tileWidth + adjustX, -halfHeight + (y + 1) * tileHeight + adjustY, 0);
103
+ indices.push(index, index + 1, index + 3, index + 1, index + 2, index + 3);
104
+ if (flipTile === Mesh.FLIP_TILE || flipTile === Mesh.ROTATE_TILE || flipTile === Mesh.FLIP_N_ROTATE_TILE) {
105
+ uvs = uvs.concat(uvBase[((x % 2) + (y % 2)) % 2]);
106
+ }
107
+ else if (flipTile === Mesh.FLIP_ROW || flipTile === Mesh.ROTATE_ROW || flipTile === Mesh.FLIP_N_ROTATE_ROW) {
108
+ uvs = uvs.concat(uvBase[y % 2]);
109
+ }
110
+ else {
111
+ uvs = uvs.concat(uvBase[0]);
112
+ }
113
+ colors.push(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1);
114
+ normals.push(0, 0, -1, 0, 0, -1, 0, 0, -1, 0, 0, -1);
115
+ index += 4;
116
+ }
117
+ }
118
+ //Part Tiles
119
+ if (offsetX > 0 || offsetY > 0) {
120
+ const partialBottomRow = offsetY > 0 && (alignV === Mesh.CENTER || alignV === Mesh.TOP);
121
+ const partialTopRow = offsetY > 0 && (alignV === Mesh.CENTER || alignV === Mesh.BOTTOM);
122
+ const partialLeftCol = offsetX > 0 && (alignH === Mesh.CENTER || alignH === Mesh.RIGHT);
123
+ const partialRightCol = offsetX > 0 && (alignH === Mesh.CENTER || alignH === Mesh.LEFT);
124
+ let uvPart;
125
+ let a, b, c, d;
126
+ //corners
127
+ if (partialBottomRow && partialLeftCol) {
128
+ //bottom left corner
129
+ positions.push(startX + adjustX, startY + adjustY, 0);
130
+ positions.push(-halfWidth + adjustX, startY + adjustY, 0);
131
+ positions.push(-halfWidth + adjustX, startY + offsetY + adjustY, 0);
132
+ positions.push(startX + adjustX, startY + offsetY + adjustY, 0);
133
+ indices.push(index, index + 1, index + 3, index + 1, index + 2, index + 3);
134
+ index += 4;
135
+ a = 1 - offsetX / tileWidth;
136
+ b = 1 - offsetY / tileHeight;
137
+ c = 1;
138
+ d = 1;
139
+ uvPart = [a, b, c, b, c, d, a, d];
140
+ if (flipTile === Mesh.ROTATE_ROW) {
141
+ uvPart = [1 - a, 1 - b, 1 - c, 1 - b, 1 - c, 1 - d, 1 - a, 1 - d];
142
+ }
143
+ if (flipTile === Mesh.FLIP_ROW) {
144
+ uvPart = [1 - a, b, 1 - c, b, 1 - c, d, 1 - a, d];
145
+ }
146
+ if (flipTile === Mesh.FLIP_N_ROTATE_ROW) {
147
+ uvPart = [a, 1 - b, c, 1 - b, c, 1 - d, a, 1 - d];
148
+ }
149
+ uvs = uvs.concat(uvPart);
150
+ colors.push(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1);
151
+ normals.push(0, 0, -1, 0, 0, -1, 0, 0, -1, 0, 0, -1);
152
+ }
153
+ if (partialBottomRow && partialRightCol) {
154
+ //bottom right corner
155
+ positions.push(halfWidth + adjustX, startY + adjustY, 0);
156
+ positions.push(endX + adjustX, startY + adjustY, 0);
157
+ positions.push(endX + adjustX, startY + offsetY + adjustY, 0);
158
+ positions.push(halfWidth + adjustX, startY + offsetY + adjustY, 0);
159
+ indices.push(index, index + 1, index + 3, index + 1, index + 2, index + 3);
160
+ index += 4;
161
+ a = 0;
162
+ b = 1 - offsetY / tileHeight;
163
+ c = offsetX / tileWidth;
164
+ d = 1;
165
+ uvPart = [a, b, c, b, c, d, a, d];
166
+ if (flipTile === Mesh.ROTATE_ROW || (flipTile === Mesh.ROTATE_TILE && tilesX % 2 === 0)) {
167
+ uvPart = [1 - a, 1 - b, 1 - c, 1 - b, 1 - c, 1 - d, 1 - a, 1 - d];
168
+ }
169
+ if (flipTile === Mesh.FLIP_ROW || (flipTile === Mesh.FLIP_TILE && tilesX % 2 === 0)) {
170
+ uvPart = [1 - a, b, 1 - c, b, 1 - c, d, 1 - a, d];
171
+ }
172
+ if (flipTile === Mesh.FLIP_N_ROTATE_ROW || (flipTile === Mesh.FLIP_N_ROTATE_TILE && tilesX % 2 === 0)) {
173
+ uvPart = [a, 1 - b, c, 1 - b, c, 1 - d, a, 1 - d];
174
+ }
175
+ uvs = uvs.concat(uvPart);
176
+ colors.push(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1);
177
+ normals.push(0, 0, -1, 0, 0, -1, 0, 0, -1, 0, 0, -1);
178
+ }
179
+ if (partialTopRow && partialLeftCol) {
180
+ //top left corner
181
+ positions.push(startX + adjustX, halfHeight + adjustY, 0);
182
+ positions.push(-halfWidth + adjustX, halfHeight + adjustY, 0);
183
+ positions.push(-halfWidth + adjustX, endY + adjustY, 0);
184
+ positions.push(startX + adjustX, endY + adjustY, 0);
185
+ indices.push(index, index + 1, index + 3, index + 1, index + 2, index + 3);
186
+ index += 4;
187
+ a = 1 - offsetX / tileWidth;
188
+ b = 0;
189
+ c = 1;
190
+ d = offsetY / tileHeight;
191
+ uvPart = [a, b, c, b, c, d, a, d];
192
+ if ((flipTile === Mesh.ROTATE_ROW && tilesY % 2 === 1) || (flipTile === Mesh.ROTATE_TILE && tilesY % 1 === 0)) {
193
+ uvPart = [1 - a, 1 - b, 1 - c, 1 - b, 1 - c, 1 - d, 1 - a, 1 - d];
194
+ }
195
+ if ((flipTile === Mesh.FLIP_ROW && tilesY % 2 === 1) || (flipTile === Mesh.FLIP_TILE && tilesY % 2 === 0)) {
196
+ uvPart = [1 - a, b, 1 - c, b, 1 - c, d, 1 - a, d];
197
+ }
198
+ if ((flipTile === Mesh.FLIP_N_ROTATE_ROW && tilesY % 2 === 1) || (flipTile === Mesh.FLIP_N_ROTATE_TILE && tilesY % 2 === 0)) {
199
+ uvPart = [a, 1 - b, c, 1 - b, c, 1 - d, a, 1 - d];
200
+ }
201
+ uvs = uvs.concat(uvPart);
202
+ colors.push(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1);
203
+ normals.push(0, 0, -1, 0, 0, -1, 0, 0, -1, 0, 0, -1);
204
+ }
205
+ if (partialTopRow && partialRightCol) {
206
+ //top right corner
207
+ positions.push(halfWidth + adjustX, halfHeight + adjustY, 0);
208
+ positions.push(endX + adjustX, halfHeight + adjustY, 0);
209
+ positions.push(endX + adjustX, endY + adjustY, 0);
210
+ positions.push(halfWidth + adjustX, endY + adjustY, 0);
211
+ indices.push(index, index + 1, index + 3, index + 1, index + 2, index + 3);
212
+ index += 4;
213
+ a = 0;
214
+ b = 0;
215
+ c = offsetX / tileWidth;
216
+ d = offsetY / tileHeight;
217
+ uvPart = [a, b, c, b, c, d, a, d];
218
+ if ((flipTile === Mesh.ROTATE_ROW && tilesY % 2 === 1) || (flipTile === Mesh.ROTATE_TILE && (tilesY + tilesX) % 2 === 1)) {
219
+ uvPart = [1 - a, 1 - b, 1 - c, 1 - b, 1 - c, 1 - d, 1 - a, 1 - d];
220
+ }
221
+ if ((flipTile === Mesh.FLIP_ROW && tilesY % 2 === 1) || (flipTile === Mesh.FLIP_TILE && (tilesY + tilesX) % 2 === 1)) {
222
+ uvPart = [1 - a, b, 1 - c, b, 1 - c, d, 1 - a, d];
223
+ }
224
+ if ((flipTile === Mesh.FLIP_N_ROTATE_ROW && tilesY % 2 === 1) || (flipTile === Mesh.FLIP_N_ROTATE_TILE && (tilesY + tilesX) % 2 === 1)) {
225
+ uvPart = [a, 1 - b, c, 1 - b, c, 1 - d, a, 1 - d];
226
+ }
227
+ uvs = uvs.concat(uvPart);
228
+ colors.push(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1);
229
+ normals.push(0, 0, -1, 0, 0, -1, 0, 0, -1, 0, 0, -1);
230
+ }
231
+ //part rows
232
+ if (partialBottomRow) {
233
+ const uvBaseBR = [];
234
+ a = 0;
235
+ b = 1 - offsetY / tileHeight;
236
+ c = 1;
237
+ d = 1;
238
+ uvBaseBR[0] = [a, b, c, b, c, d, a, d];
239
+ uvBaseBR[1] = [a, b, c, b, c, d, a, d];
240
+ if (flipTile === Mesh.ROTATE_TILE || flipTile === Mesh.ROTATE_ROW) {
241
+ uvBaseBR[1] = [1 - a, 1 - b, 1 - c, 1 - b, 1 - c, 1 - d, 1 - a, 1 - d];
242
+ }
243
+ if (flipTile === Mesh.FLIP_TILE || flipTile === Mesh.FLIP_ROW) {
244
+ uvBaseBR[1] = [1 - a, b, 1 - c, b, 1 - c, d, 1 - a, d];
245
+ }
246
+ if (flipTile === Mesh.FLIP_N_ROTATE_TILE || flipTile === Mesh.FLIP_N_ROTATE_ROW) {
247
+ uvBaseBR[1] = [a, 1 - b, c, 1 - b, c, 1 - d, a, 1 - d];
248
+ }
249
+ for (let x = 0; x < tilesX; x++) {
250
+ positions.push(-halfWidth + x * tileWidth + adjustX, startY + adjustY, 0);
251
+ positions.push(-halfWidth + (x + 1) * tileWidth + adjustX, startY + adjustY, 0);
252
+ positions.push(-halfWidth + (x + 1) * tileWidth + adjustX, startY + offsetY + adjustY, 0);
253
+ positions.push(-halfWidth + x * tileWidth + adjustX, startY + offsetY + adjustY, 0);
254
+ indices.push(index, index + 1, index + 3, index + 1, index + 2, index + 3);
255
+ index += 4;
256
+ if (flipTile === Mesh.FLIP_TILE || flipTile === Mesh.ROTATE_TILE || flipTile === Mesh.FLIP_N_ROTATE_TILE) {
257
+ uvs = uvs.concat(uvBaseBR[(x + 1) % 2]);
258
+ }
259
+ else if (flipTile === Mesh.FLIP_ROW || flipTile === Mesh.ROTATE_ROW || flipTile === Mesh.FLIP_N_ROTATE_ROW) {
260
+ uvs = uvs.concat(uvBaseBR[1]);
261
+ }
262
+ else {
263
+ uvs = uvs.concat(uvBaseBR[0]);
264
+ }
265
+ colors.push(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1);
266
+ normals.push(0, 0, -1, 0, 0, -1, 0, 0, -1, 0, 0, -1);
267
+ }
268
+ }
269
+ if (partialTopRow) {
270
+ const uvBaseTR = [];
271
+ a = 0;
272
+ b = 0;
273
+ c = 1;
274
+ d = offsetY / tileHeight;
275
+ uvBaseTR[0] = [a, b, c, b, c, d, a, d];
276
+ uvBaseTR[1] = [a, b, c, b, c, d, a, d];
277
+ if (flipTile === Mesh.ROTATE_TILE || flipTile === Mesh.ROTATE_ROW) {
278
+ uvBaseTR[1] = [1 - a, 1 - b, 1 - c, 1 - b, 1 - c, 1 - d, 1 - a, 1 - d];
279
+ }
280
+ if (flipTile === Mesh.FLIP_TILE || flipTile === Mesh.FLIP_ROW) {
281
+ uvBaseTR[1] = [1 - a, b, 1 - c, b, 1 - c, d, 1 - a, d];
282
+ }
283
+ if (flipTile === Mesh.FLIP_N_ROTATE_TILE || flipTile === Mesh.FLIP_N_ROTATE_ROW) {
284
+ uvBaseTR[1] = [a, 1 - b, c, 1 - b, c, 1 - d, a, 1 - d];
285
+ }
286
+ for (let x = 0; x < tilesX; x++) {
287
+ positions.push(-halfWidth + x * tileWidth + adjustX, endY - offsetY + adjustY, 0);
288
+ positions.push(-halfWidth + (x + 1) * tileWidth + adjustX, endY - offsetY + adjustY, 0);
289
+ positions.push(-halfWidth + (x + 1) * tileWidth + adjustX, endY + adjustY, 0);
290
+ positions.push(-halfWidth + x * tileWidth + adjustX, endY + adjustY, 0);
291
+ indices.push(index, index + 1, index + 3, index + 1, index + 2, index + 3);
292
+ index += 4;
293
+ if (flipTile === Mesh.FLIP_TILE || flipTile === Mesh.ROTATE_TILE || flipTile === Mesh.FLIP_N_ROTATE_TILE) {
294
+ uvs = uvs.concat(uvBaseTR[(x + tilesY) % 2]);
295
+ }
296
+ else if (flipTile === Mesh.FLIP_ROW || flipTile === Mesh.ROTATE_ROW || flipTile === Mesh.FLIP_N_ROTATE_ROW) {
297
+ uvs = uvs.concat(uvBaseTR[tilesY % 2]);
298
+ }
299
+ else {
300
+ uvs = uvs.concat(uvBaseTR[0]);
301
+ }
302
+ colors.push(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1);
303
+ normals.push(0, 0, -1, 0, 0, -1, 0, 0, -1, 0, 0, -1);
304
+ }
305
+ }
306
+ if (partialLeftCol) {
307
+ const uvBaseLC = [];
308
+ a = 1 - offsetX / tileWidth;
309
+ b = 0;
310
+ c = 1;
311
+ d = 1;
312
+ uvBaseLC[0] = [a, b, c, b, c, d, a, d];
313
+ uvBaseLC[1] = [a, b, c, b, c, d, a, d];
314
+ if (flipTile === Mesh.ROTATE_TILE || flipTile === Mesh.ROTATE_ROW) {
315
+ uvBaseLC[1] = [1 - a, 1 - b, 1 - c, 1 - b, 1 - c, 1 - d, 1 - a, 1 - d];
316
+ }
317
+ if (flipTile === Mesh.FLIP_TILE || flipTile === Mesh.FLIP_ROW) {
318
+ uvBaseLC[1] = [1 - a, b, 1 - c, b, 1 - c, d, 1 - a, d];
319
+ }
320
+ if (flipTile === Mesh.FLIP_N_ROTATE_TILE || flipTile === Mesh.FLIP_N_ROTATE_ROW) {
321
+ uvBaseLC[1] = [a, 1 - b, c, 1 - b, c, 1 - d, a, 1 - d];
322
+ }
323
+ for (let y = 0; y < tilesY; y++) {
324
+ positions.push(startX + adjustX, -halfHeight + y * tileHeight + adjustY, 0);
325
+ positions.push(startX + offsetX + adjustX, -halfHeight + y * tileHeight + adjustY, 0);
326
+ positions.push(startX + offsetX + adjustX, -halfHeight + (y + 1) * tileHeight + adjustY, 0);
327
+ positions.push(startX + adjustX, -halfHeight + (y + 1) * tileHeight + adjustY, 0);
328
+ indices.push(index, index + 1, index + 3, index + 1, index + 2, index + 3);
329
+ index += 4;
330
+ if (flipTile === Mesh.FLIP_TILE || flipTile === Mesh.ROTATE_TILE || flipTile === Mesh.FLIP_N_ROTATE_TILE) {
331
+ uvs = uvs.concat(uvBaseLC[(y + 1) % 2]);
332
+ }
333
+ else if (flipTile === Mesh.FLIP_ROW || flipTile === Mesh.ROTATE_ROW || flipTile === Mesh.FLIP_N_ROTATE_ROW) {
334
+ uvs = uvs.concat(uvBaseLC[y % 2]);
335
+ }
336
+ else {
337
+ uvs = uvs.concat(uvBaseLC[0]);
338
+ }
339
+ colors.push(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1);
340
+ normals.push(0, 0, -1, 0, 0, -1, 0, 0, -1, 0, 0, -1);
341
+ }
342
+ }
343
+ if (partialRightCol) {
344
+ const uvBaseRC = [];
345
+ a = 0;
346
+ b = 0;
347
+ c = offsetX / tileHeight;
348
+ d = 1;
349
+ uvBaseRC[0] = [a, b, c, b, c, d, a, d];
350
+ uvBaseRC[1] = [a, b, c, b, c, d, a, d];
351
+ if (flipTile === Mesh.ROTATE_TILE || flipTile === Mesh.ROTATE_ROW) {
352
+ uvBaseRC[1] = [1 - a, 1 - b, 1 - c, 1 - b, 1 - c, 1 - d, 1 - a, 1 - d];
353
+ }
354
+ if (flipTile === Mesh.FLIP_TILE || flipTile === Mesh.FLIP_ROW) {
355
+ uvBaseRC[1] = [1 - a, b, 1 - c, b, 1 - c, d, 1 - a, d];
356
+ }
357
+ if (flipTile === Mesh.FLIP_N_ROTATE_TILE || flipTile === Mesh.FLIP_N_ROTATE_ROW) {
358
+ uvBaseRC[1] = [a, 1 - b, c, 1 - b, c, 1 - d, a, 1 - d];
359
+ }
360
+ for (let y = 0; y < tilesY; y++) {
361
+ positions.push(endX - offsetX + adjustX, -halfHeight + y * tileHeight + adjustY, 0);
362
+ positions.push(endX + adjustX, -halfHeight + y * tileHeight + adjustY, 0);
363
+ positions.push(endX + adjustX, -halfHeight + (y + 1) * tileHeight + adjustY, 0);
364
+ positions.push(endX - offsetX + adjustX, -halfHeight + (y + 1) * tileHeight + adjustY, 0);
365
+ indices.push(index, index + 1, index + 3, index + 1, index + 2, index + 3);
366
+ index += 4;
367
+ if (flipTile === Mesh.FLIP_TILE || flipTile === Mesh.ROTATE_TILE || flipTile === Mesh.FLIP_N_ROTATE_TILE) {
368
+ uvs = uvs.concat(uvBaseRC[(y + tilesX) % 2]);
369
+ }
370
+ else if (flipTile === Mesh.FLIP_ROW || flipTile === Mesh.ROTATE_ROW || flipTile === Mesh.FLIP_N_ROTATE_ROW) {
371
+ uvs = uvs.concat(uvBaseRC[y % 2]);
372
+ }
373
+ else {
374
+ uvs = uvs.concat(uvBaseRC[0]);
375
+ }
376
+ colors.push(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1);
377
+ normals.push(0, 0, -1, 0, 0, -1, 0, 0, -1, 0, 0, -1);
378
+ }
379
+ }
380
+ }
381
+ const sideOrientation = options.sideOrientation === 0 ? 0 : options.sideOrientation || VertexData.DEFAULTSIDE;
382
+ // sides
383
+ VertexData._ComputeSides(sideOrientation, positions, indices, normals, uvs, options.frontUVs, options.backUVs);
384
+ // Result
385
+ const vertexData = new VertexData();
386
+ vertexData.indices = indices;
387
+ vertexData.positions = positions;
388
+ vertexData.normals = normals;
389
+ vertexData.uvs = uvs;
390
+ const totalColors = sideOrientation === VertexData.DOUBLESIDE ? colors.concat(colors) : colors;
391
+ vertexData.colors = totalColors;
392
+ return vertexData;
393
+ }
394
+ /**
395
+ * Creates a tiled plane mesh
396
+ * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/creation/set/tiled_plane
397
+ * @param name defines the name of the mesh
398
+ * @param options an object used to set the following optional parameters for the tiled plane, required but can be empty
399
+ * * pattern a limited pattern arrangement depending on the number
400
+ * * size of the box
401
+ * * width of the box, overwrites size
402
+ * * height of the box, overwrites size
403
+ * * tileSize sets the width, height and depth of the tile to the value of size, optional default 1
404
+ * * tileWidth sets the width (x direction) of the tile, overwrites the width set by size, optional, default size
405
+ * * tileHeight sets the height (y direction) of the tile, overwrites the height set by size, optional, default size
406
+ * * sideOrientation optional and takes the values : Mesh.FRONTSIDE (default), Mesh.BACKSIDE or Mesh.DOUBLESIDE
407
+ * * alignHorizontal places whole tiles aligned to the center, left or right of a row
408
+ * * alignVertical places whole tiles aligned to the center, left or right of a column
409
+ * * frontUvs only usable when you create a double-sided mesh, used to choose what parts of the texture image to crop and apply on the front side, optional, default vector4 (0, 0, 1, 1)
410
+ * * backUVs only usable when you create a double-sided mesh, used to choose what parts of the texture image to crop and apply on the back side, optional, default vector4 (0, 0, 1, 1)
411
+ * @param scene defines the hosting scene
412
+ * @returns the box mesh
413
+ */
414
+ export function CreateTiledPlane(name, options, scene = null) {
415
+ const plane = new Mesh(name, scene);
416
+ options.sideOrientation = Mesh._GetDefaultSideOrientation(options.sideOrientation);
417
+ plane._originalBuilderSideOrientation = options.sideOrientation;
418
+ const vertexData = CreateTiledPlaneVertexData(options);
419
+ vertexData.applyToMesh(plane, options.updatable);
420
+ return plane;
421
+ }
422
+ /**
423
+ * Class containing static functions to help procedurally build meshes
424
+ * @deprecated use CreateTiledPlane instead
425
+ */
426
+ export const TiledPlaneBuilder = {
427
+ // eslint-disable-next-line @typescript-eslint/naming-convention
428
+ CreateTiledPlane,
429
+ };
430
+ let _Registered = false;
431
+ /**
432
+ * Register side effects for the tiled plane builder.
433
+ * Safe to call multiple times; only the first call has an effect.
434
+ */
435
+ export function RegisterTiledPlaneBuilder() {
436
+ if (_Registered) {
437
+ return;
438
+ }
439
+ _Registered = true;
440
+ VertexData.CreateTiledPlane = CreateTiledPlaneVertexData;
441
+ }
442
+ //# sourceMappingURL=tiledPlaneBuilder.pure.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tiledPlaneBuilder.pure.js","sourceRoot":"","sources":["../../../../../dev/core/src/Meshes/Builders/tiledPlaneBuilder.pure.ts"],"names":[],"mappings":"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","sourcesContent":["/** This file must only contain pure code and pure imports */\r\n\r\nimport { type Nullable } from \"../../types\";\r\nimport { type Scene } from \"../../scene\";\r\nimport { type Vector4 } from \"../../Maths/math.vector\";\r\nimport { Mesh } from \"../mesh.pure\";\r\nimport { VertexData } from \"../mesh.vertexData\";\r\n\r\n/**\r\n * Creates the VertexData for a tiled plane\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/creation/set/tiled_plane\r\n * @param options an object used to set the following optional parameters for the tiled plane, required but can be empty\r\n * * pattern a limited pattern arrangement depending on the number\r\n * * size of the box\r\n * * width of the box, overwrites size\r\n * * height of the box, overwrites size\r\n * * tileSize sets the width, height and depth of the tile to the value of size, optional default 1\r\n * * tileWidth sets the width (x direction) of the tile, overwrites the width set by size, optional, default size\r\n * * tileHeight sets the height (y direction) of the tile, overwrites the height set by size, optional, default size\r\n * * sideOrientation optional and takes the values : Mesh.FRONTSIDE (default), Mesh.BACKSIDE or Mesh.DOUBLESIDE\r\n * * alignHorizontal places whole tiles aligned to the center, left or right of a row\r\n * * alignVertical places whole tiles aligned to the center, left or right of a column\r\n * * frontUvs only usable when you create a double-sided mesh, used to choose what parts of the texture image to crop and apply on the front side, optional, default vector4 (0, 0, 1, 1)\r\n * * backUVs only usable when you create a double-sided mesh, used to choose what parts of the texture image to crop and apply on the back side, optional, default vector4 (0, 0, 1, 1)\r\n * @returns the VertexData of the tiled plane\r\n */\r\nexport function CreateTiledPlaneVertexData(options: {\r\n pattern?: number;\r\n tileSize?: number;\r\n tileWidth?: number;\r\n tileHeight?: number;\r\n size?: number;\r\n width?: number;\r\n height?: number;\r\n alignHorizontal?: number;\r\n alignVertical?: number;\r\n sideOrientation?: number;\r\n frontUVs?: Vector4;\r\n backUVs?: Vector4;\r\n}): VertexData {\r\n const flipTile = options.pattern || Mesh.NO_FLIP;\r\n const tileWidth = options.tileWidth || options.tileSize || 1;\r\n const tileHeight = options.tileHeight || options.tileSize || 1;\r\n const alignH = options.alignHorizontal || 0;\r\n const alignV = options.alignVertical || 0;\r\n\r\n const width = options.width || options.size || 1;\r\n const tilesX = Math.floor(width / tileWidth);\r\n let offsetX = width - tilesX * tileWidth;\r\n\r\n const height = options.height || options.size || 1;\r\n const tilesY = Math.floor(height / tileHeight);\r\n let offsetY = height - tilesY * tileHeight;\r\n\r\n const halfWidth = (tileWidth * tilesX) / 2;\r\n const halfHeight = (tileHeight * tilesY) / 2;\r\n\r\n let adjustX = 0;\r\n let adjustY = 0;\r\n let startX = 0;\r\n let startY = 0;\r\n let endX = 0;\r\n let endY = 0;\r\n\r\n //Part Tiles\r\n if (offsetX > 0 || offsetY > 0) {\r\n startX = -halfWidth;\r\n startY = -halfHeight;\r\n endX = halfWidth;\r\n endY = halfHeight;\r\n\r\n switch (alignH) {\r\n case Mesh.CENTER:\r\n offsetX /= 2;\r\n startX -= offsetX;\r\n endX += offsetX;\r\n break;\r\n case Mesh.LEFT:\r\n endX += offsetX;\r\n adjustX = -offsetX / 2;\r\n break;\r\n case Mesh.RIGHT:\r\n startX -= offsetX;\r\n adjustX = offsetX / 2;\r\n break;\r\n }\r\n\r\n switch (alignV) {\r\n case Mesh.CENTER:\r\n offsetY /= 2;\r\n startY -= offsetY;\r\n endY += offsetY;\r\n break;\r\n case Mesh.BOTTOM:\r\n endY += offsetY;\r\n adjustY = -offsetY / 2;\r\n break;\r\n case Mesh.TOP:\r\n startY -= offsetY;\r\n adjustY = offsetY / 2;\r\n break;\r\n }\r\n }\r\n\r\n const positions = [];\r\n const normals = [];\r\n const uvBase = [];\r\n uvBase[0] = [0, 0, 1, 0, 1, 1, 0, 1];\r\n uvBase[1] = [0, 0, 1, 0, 1, 1, 0, 1];\r\n if (flipTile === Mesh.ROTATE_TILE || flipTile === Mesh.ROTATE_ROW) {\r\n uvBase[1] = [1, 1, 0, 1, 0, 0, 1, 0];\r\n }\r\n if (flipTile === Mesh.FLIP_TILE || flipTile === Mesh.FLIP_ROW) {\r\n uvBase[1] = [1, 0, 0, 0, 0, 1, 1, 1];\r\n }\r\n if (flipTile === Mesh.FLIP_N_ROTATE_TILE || flipTile === Mesh.FLIP_N_ROTATE_ROW) {\r\n uvBase[1] = [0, 1, 1, 1, 1, 0, 0, 0];\r\n }\r\n let uvs: Array<number> = [];\r\n const colors = [];\r\n const indices = [];\r\n let index = 0;\r\n for (let y = 0; y < tilesY; y++) {\r\n for (let x = 0; x < tilesX; x++) {\r\n positions.push(-halfWidth + x * tileWidth + adjustX, -halfHeight + y * tileHeight + adjustY, 0);\r\n positions.push(-halfWidth + (x + 1) * tileWidth + adjustX, -halfHeight + y * tileHeight + adjustY, 0);\r\n positions.push(-halfWidth + (x + 1) * tileWidth + adjustX, -halfHeight + (y + 1) * tileHeight + adjustY, 0);\r\n positions.push(-halfWidth + x * tileWidth + adjustX, -halfHeight + (y + 1) * tileHeight + adjustY, 0);\r\n indices.push(index, index + 1, index + 3, index + 1, index + 2, index + 3);\r\n if (flipTile === Mesh.FLIP_TILE || flipTile === Mesh.ROTATE_TILE || flipTile === Mesh.FLIP_N_ROTATE_TILE) {\r\n uvs = uvs.concat(uvBase[((x % 2) + (y % 2)) % 2]);\r\n } else if (flipTile === Mesh.FLIP_ROW || flipTile === Mesh.ROTATE_ROW || flipTile === Mesh.FLIP_N_ROTATE_ROW) {\r\n uvs = uvs.concat(uvBase[y % 2]);\r\n } else {\r\n uvs = uvs.concat(uvBase[0]);\r\n }\r\n colors.push(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1);\r\n normals.push(0, 0, -1, 0, 0, -1, 0, 0, -1, 0, 0, -1);\r\n index += 4;\r\n }\r\n }\r\n\r\n //Part Tiles\r\n if (offsetX > 0 || offsetY > 0) {\r\n const partialBottomRow: boolean = offsetY > 0 && (alignV === Mesh.CENTER || alignV === Mesh.TOP);\r\n const partialTopRow: boolean = offsetY > 0 && (alignV === Mesh.CENTER || alignV === Mesh.BOTTOM);\r\n const partialLeftCol: boolean = offsetX > 0 && (alignH === Mesh.CENTER || alignH === Mesh.RIGHT);\r\n const partialRightCol: boolean = offsetX > 0 && (alignH === Mesh.CENTER || alignH === Mesh.LEFT);\r\n let uvPart: Array<number>;\r\n let a, b, c, d: number;\r\n\r\n //corners\r\n if (partialBottomRow && partialLeftCol) {\r\n //bottom left corner\r\n positions.push(startX + adjustX, startY + adjustY, 0);\r\n positions.push(-halfWidth + adjustX, startY + adjustY, 0);\r\n positions.push(-halfWidth + adjustX, startY + offsetY + adjustY, 0);\r\n positions.push(startX + adjustX, startY + offsetY + adjustY, 0);\r\n indices.push(index, index + 1, index + 3, index + 1, index + 2, index + 3);\r\n index += 4;\r\n a = 1 - offsetX / tileWidth;\r\n b = 1 - offsetY / tileHeight;\r\n c = 1;\r\n d = 1;\r\n uvPart = [a, b, c, b, c, d, a, d];\r\n if (flipTile === Mesh.ROTATE_ROW) {\r\n uvPart = [1 - a, 1 - b, 1 - c, 1 - b, 1 - c, 1 - d, 1 - a, 1 - d];\r\n }\r\n if (flipTile === Mesh.FLIP_ROW) {\r\n uvPart = [1 - a, b, 1 - c, b, 1 - c, d, 1 - a, d];\r\n }\r\n if (flipTile === Mesh.FLIP_N_ROTATE_ROW) {\r\n uvPart = [a, 1 - b, c, 1 - b, c, 1 - d, a, 1 - d];\r\n }\r\n uvs = uvs.concat(uvPart);\r\n colors.push(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1);\r\n normals.push(0, 0, -1, 0, 0, -1, 0, 0, -1, 0, 0, -1);\r\n }\r\n\r\n if (partialBottomRow && partialRightCol) {\r\n //bottom right corner\r\n positions.push(halfWidth + adjustX, startY + adjustY, 0);\r\n positions.push(endX + adjustX, startY + adjustY, 0);\r\n positions.push(endX + adjustX, startY + offsetY + adjustY, 0);\r\n positions.push(halfWidth + adjustX, startY + offsetY + adjustY, 0);\r\n indices.push(index, index + 1, index + 3, index + 1, index + 2, index + 3);\r\n index += 4;\r\n a = 0;\r\n b = 1 - offsetY / tileHeight;\r\n c = offsetX / tileWidth;\r\n d = 1;\r\n uvPart = [a, b, c, b, c, d, a, d];\r\n if (flipTile === Mesh.ROTATE_ROW || (flipTile === Mesh.ROTATE_TILE && tilesX % 2 === 0)) {\r\n uvPart = [1 - a, 1 - b, 1 - c, 1 - b, 1 - c, 1 - d, 1 - a, 1 - d];\r\n }\r\n if (flipTile === Mesh.FLIP_ROW || (flipTile === Mesh.FLIP_TILE && tilesX % 2 === 0)) {\r\n uvPart = [1 - a, b, 1 - c, b, 1 - c, d, 1 - a, d];\r\n }\r\n if (flipTile === Mesh.FLIP_N_ROTATE_ROW || (flipTile === Mesh.FLIP_N_ROTATE_TILE && tilesX % 2 === 0)) {\r\n uvPart = [a, 1 - b, c, 1 - b, c, 1 - d, a, 1 - d];\r\n }\r\n uvs = uvs.concat(uvPart);\r\n colors.push(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1);\r\n normals.push(0, 0, -1, 0, 0, -1, 0, 0, -1, 0, 0, -1);\r\n }\r\n\r\n if (partialTopRow && partialLeftCol) {\r\n //top left corner\r\n positions.push(startX + adjustX, halfHeight + adjustY, 0);\r\n positions.push(-halfWidth + adjustX, halfHeight + adjustY, 0);\r\n positions.push(-halfWidth + adjustX, endY + adjustY, 0);\r\n positions.push(startX + adjustX, endY + adjustY, 0);\r\n indices.push(index, index + 1, index + 3, index + 1, index + 2, index + 3);\r\n index += 4;\r\n a = 1 - offsetX / tileWidth;\r\n b = 0;\r\n c = 1;\r\n d = offsetY / tileHeight;\r\n uvPart = [a, b, c, b, c, d, a, d];\r\n if ((flipTile === Mesh.ROTATE_ROW && tilesY % 2 === 1) || (flipTile === Mesh.ROTATE_TILE && tilesY % 1 === 0)) {\r\n uvPart = [1 - a, 1 - b, 1 - c, 1 - b, 1 - c, 1 - d, 1 - a, 1 - d];\r\n }\r\n if ((flipTile === Mesh.FLIP_ROW && tilesY % 2 === 1) || (flipTile === Mesh.FLIP_TILE && tilesY % 2 === 0)) {\r\n uvPart = [1 - a, b, 1 - c, b, 1 - c, d, 1 - a, d];\r\n }\r\n if ((flipTile === Mesh.FLIP_N_ROTATE_ROW && tilesY % 2 === 1) || (flipTile === Mesh.FLIP_N_ROTATE_TILE && tilesY % 2 === 0)) {\r\n uvPart = [a, 1 - b, c, 1 - b, c, 1 - d, a, 1 - d];\r\n }\r\n uvs = uvs.concat(uvPart);\r\n colors.push(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1);\r\n normals.push(0, 0, -1, 0, 0, -1, 0, 0, -1, 0, 0, -1);\r\n }\r\n\r\n if (partialTopRow && partialRightCol) {\r\n //top right corner\r\n positions.push(halfWidth + adjustX, halfHeight + adjustY, 0);\r\n positions.push(endX + adjustX, halfHeight + adjustY, 0);\r\n positions.push(endX + adjustX, endY + adjustY, 0);\r\n positions.push(halfWidth + adjustX, endY + adjustY, 0);\r\n indices.push(index, index + 1, index + 3, index + 1, index + 2, index + 3);\r\n index += 4;\r\n a = 0;\r\n b = 0;\r\n c = offsetX / tileWidth;\r\n d = offsetY / tileHeight;\r\n uvPart = [a, b, c, b, c, d, a, d];\r\n if ((flipTile === Mesh.ROTATE_ROW && tilesY % 2 === 1) || (flipTile === Mesh.ROTATE_TILE && (tilesY + tilesX) % 2 === 1)) {\r\n uvPart = [1 - a, 1 - b, 1 - c, 1 - b, 1 - c, 1 - d, 1 - a, 1 - d];\r\n }\r\n if ((flipTile === Mesh.FLIP_ROW && tilesY % 2 === 1) || (flipTile === Mesh.FLIP_TILE && (tilesY + tilesX) % 2 === 1)) {\r\n uvPart = [1 - a, b, 1 - c, b, 1 - c, d, 1 - a, d];\r\n }\r\n if ((flipTile === Mesh.FLIP_N_ROTATE_ROW && tilesY % 2 === 1) || (flipTile === Mesh.FLIP_N_ROTATE_TILE && (tilesY + tilesX) % 2 === 1)) {\r\n uvPart = [a, 1 - b, c, 1 - b, c, 1 - d, a, 1 - d];\r\n }\r\n uvs = uvs.concat(uvPart);\r\n colors.push(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1);\r\n normals.push(0, 0, -1, 0, 0, -1, 0, 0, -1, 0, 0, -1);\r\n }\r\n\r\n //part rows\r\n if (partialBottomRow) {\r\n const uvBaseBR = [];\r\n a = 0;\r\n b = 1 - offsetY / tileHeight;\r\n c = 1;\r\n d = 1;\r\n uvBaseBR[0] = [a, b, c, b, c, d, a, d];\r\n uvBaseBR[1] = [a, b, c, b, c, d, a, d];\r\n if (flipTile === Mesh.ROTATE_TILE || flipTile === Mesh.ROTATE_ROW) {\r\n uvBaseBR[1] = [1 - a, 1 - b, 1 - c, 1 - b, 1 - c, 1 - d, 1 - a, 1 - d];\r\n }\r\n if (flipTile === Mesh.FLIP_TILE || flipTile === Mesh.FLIP_ROW) {\r\n uvBaseBR[1] = [1 - a, b, 1 - c, b, 1 - c, d, 1 - a, d];\r\n }\r\n if (flipTile === Mesh.FLIP_N_ROTATE_TILE || flipTile === Mesh.FLIP_N_ROTATE_ROW) {\r\n uvBaseBR[1] = [a, 1 - b, c, 1 - b, c, 1 - d, a, 1 - d];\r\n }\r\n for (let x = 0; x < tilesX; x++) {\r\n positions.push(-halfWidth + x * tileWidth + adjustX, startY + adjustY, 0);\r\n positions.push(-halfWidth + (x + 1) * tileWidth + adjustX, startY + adjustY, 0);\r\n positions.push(-halfWidth + (x + 1) * tileWidth + adjustX, startY + offsetY + adjustY, 0);\r\n positions.push(-halfWidth + x * tileWidth + adjustX, startY + offsetY + adjustY, 0);\r\n indices.push(index, index + 1, index + 3, index + 1, index + 2, index + 3);\r\n index += 4;\r\n if (flipTile === Mesh.FLIP_TILE || flipTile === Mesh.ROTATE_TILE || flipTile === Mesh.FLIP_N_ROTATE_TILE) {\r\n uvs = uvs.concat(uvBaseBR[(x + 1) % 2]);\r\n } else if (flipTile === Mesh.FLIP_ROW || flipTile === Mesh.ROTATE_ROW || flipTile === Mesh.FLIP_N_ROTATE_ROW) {\r\n uvs = uvs.concat(uvBaseBR[1]);\r\n } else {\r\n uvs = uvs.concat(uvBaseBR[0]);\r\n }\r\n colors.push(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1);\r\n normals.push(0, 0, -1, 0, 0, -1, 0, 0, -1, 0, 0, -1);\r\n }\r\n }\r\n\r\n if (partialTopRow) {\r\n const uvBaseTR = [];\r\n a = 0;\r\n b = 0;\r\n c = 1;\r\n d = offsetY / tileHeight;\r\n uvBaseTR[0] = [a, b, c, b, c, d, a, d];\r\n uvBaseTR[1] = [a, b, c, b, c, d, a, d];\r\n if (flipTile === Mesh.ROTATE_TILE || flipTile === Mesh.ROTATE_ROW) {\r\n uvBaseTR[1] = [1 - a, 1 - b, 1 - c, 1 - b, 1 - c, 1 - d, 1 - a, 1 - d];\r\n }\r\n if (flipTile === Mesh.FLIP_TILE || flipTile === Mesh.FLIP_ROW) {\r\n uvBaseTR[1] = [1 - a, b, 1 - c, b, 1 - c, d, 1 - a, d];\r\n }\r\n if (flipTile === Mesh.FLIP_N_ROTATE_TILE || flipTile === Mesh.FLIP_N_ROTATE_ROW) {\r\n uvBaseTR[1] = [a, 1 - b, c, 1 - b, c, 1 - d, a, 1 - d];\r\n }\r\n for (let x = 0; x < tilesX; x++) {\r\n positions.push(-halfWidth + x * tileWidth + adjustX, endY - offsetY + adjustY, 0);\r\n positions.push(-halfWidth + (x + 1) * tileWidth + adjustX, endY - offsetY + adjustY, 0);\r\n positions.push(-halfWidth + (x + 1) * tileWidth + adjustX, endY + adjustY, 0);\r\n positions.push(-halfWidth + x * tileWidth + adjustX, endY + adjustY, 0);\r\n indices.push(index, index + 1, index + 3, index + 1, index + 2, index + 3);\r\n index += 4;\r\n if (flipTile === Mesh.FLIP_TILE || flipTile === Mesh.ROTATE_TILE || flipTile === Mesh.FLIP_N_ROTATE_TILE) {\r\n uvs = uvs.concat(uvBaseTR[(x + tilesY) % 2]);\r\n } else if (flipTile === Mesh.FLIP_ROW || flipTile === Mesh.ROTATE_ROW || flipTile === Mesh.FLIP_N_ROTATE_ROW) {\r\n uvs = uvs.concat(uvBaseTR[tilesY % 2]);\r\n } else {\r\n uvs = uvs.concat(uvBaseTR[0]);\r\n }\r\n colors.push(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1);\r\n normals.push(0, 0, -1, 0, 0, -1, 0, 0, -1, 0, 0, -1);\r\n }\r\n }\r\n\r\n if (partialLeftCol) {\r\n const uvBaseLC = [];\r\n a = 1 - offsetX / tileWidth;\r\n b = 0;\r\n c = 1;\r\n d = 1;\r\n uvBaseLC[0] = [a, b, c, b, c, d, a, d];\r\n uvBaseLC[1] = [a, b, c, b, c, d, a, d];\r\n if (flipTile === Mesh.ROTATE_TILE || flipTile === Mesh.ROTATE_ROW) {\r\n uvBaseLC[1] = [1 - a, 1 - b, 1 - c, 1 - b, 1 - c, 1 - d, 1 - a, 1 - d];\r\n }\r\n if (flipTile === Mesh.FLIP_TILE || flipTile === Mesh.FLIP_ROW) {\r\n uvBaseLC[1] = [1 - a, b, 1 - c, b, 1 - c, d, 1 - a, d];\r\n }\r\n if (flipTile === Mesh.FLIP_N_ROTATE_TILE || flipTile === Mesh.FLIP_N_ROTATE_ROW) {\r\n uvBaseLC[1] = [a, 1 - b, c, 1 - b, c, 1 - d, a, 1 - d];\r\n }\r\n for (let y = 0; y < tilesY; y++) {\r\n positions.push(startX + adjustX, -halfHeight + y * tileHeight + adjustY, 0);\r\n positions.push(startX + offsetX + adjustX, -halfHeight + y * tileHeight + adjustY, 0);\r\n positions.push(startX + offsetX + adjustX, -halfHeight + (y + 1) * tileHeight + adjustY, 0);\r\n positions.push(startX + adjustX, -halfHeight + (y + 1) * tileHeight + adjustY, 0);\r\n indices.push(index, index + 1, index + 3, index + 1, index + 2, index + 3);\r\n index += 4;\r\n if (flipTile === Mesh.FLIP_TILE || flipTile === Mesh.ROTATE_TILE || flipTile === Mesh.FLIP_N_ROTATE_TILE) {\r\n uvs = uvs.concat(uvBaseLC[(y + 1) % 2]);\r\n } else if (flipTile === Mesh.FLIP_ROW || flipTile === Mesh.ROTATE_ROW || flipTile === Mesh.FLIP_N_ROTATE_ROW) {\r\n uvs = uvs.concat(uvBaseLC[y % 2]);\r\n } else {\r\n uvs = uvs.concat(uvBaseLC[0]);\r\n }\r\n colors.push(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1);\r\n normals.push(0, 0, -1, 0, 0, -1, 0, 0, -1, 0, 0, -1);\r\n }\r\n }\r\n\r\n if (partialRightCol) {\r\n const uvBaseRC = [];\r\n a = 0;\r\n b = 0;\r\n c = offsetX / tileHeight;\r\n d = 1;\r\n uvBaseRC[0] = [a, b, c, b, c, d, a, d];\r\n uvBaseRC[1] = [a, b, c, b, c, d, a, d];\r\n if (flipTile === Mesh.ROTATE_TILE || flipTile === Mesh.ROTATE_ROW) {\r\n uvBaseRC[1] = [1 - a, 1 - b, 1 - c, 1 - b, 1 - c, 1 - d, 1 - a, 1 - d];\r\n }\r\n if (flipTile === Mesh.FLIP_TILE || flipTile === Mesh.FLIP_ROW) {\r\n uvBaseRC[1] = [1 - a, b, 1 - c, b, 1 - c, d, 1 - a, d];\r\n }\r\n if (flipTile === Mesh.FLIP_N_ROTATE_TILE || flipTile === Mesh.FLIP_N_ROTATE_ROW) {\r\n uvBaseRC[1] = [a, 1 - b, c, 1 - b, c, 1 - d, a, 1 - d];\r\n }\r\n for (let y = 0; y < tilesY; y++) {\r\n positions.push(endX - offsetX + adjustX, -halfHeight + y * tileHeight + adjustY, 0);\r\n positions.push(endX + adjustX, -halfHeight + y * tileHeight + adjustY, 0);\r\n positions.push(endX + adjustX, -halfHeight + (y + 1) * tileHeight + adjustY, 0);\r\n positions.push(endX - offsetX + adjustX, -halfHeight + (y + 1) * tileHeight + adjustY, 0);\r\n indices.push(index, index + 1, index + 3, index + 1, index + 2, index + 3);\r\n index += 4;\r\n if (flipTile === Mesh.FLIP_TILE || flipTile === Mesh.ROTATE_TILE || flipTile === Mesh.FLIP_N_ROTATE_TILE) {\r\n uvs = uvs.concat(uvBaseRC[(y + tilesX) % 2]);\r\n } else if (flipTile === Mesh.FLIP_ROW || flipTile === Mesh.ROTATE_ROW || flipTile === Mesh.FLIP_N_ROTATE_ROW) {\r\n uvs = uvs.concat(uvBaseRC[y % 2]);\r\n } else {\r\n uvs = uvs.concat(uvBaseRC[0]);\r\n }\r\n colors.push(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1);\r\n normals.push(0, 0, -1, 0, 0, -1, 0, 0, -1, 0, 0, -1);\r\n }\r\n }\r\n }\r\n\r\n const sideOrientation = options.sideOrientation === 0 ? 0 : options.sideOrientation || VertexData.DEFAULTSIDE;\r\n\r\n // sides\r\n VertexData._ComputeSides(sideOrientation, positions, indices, normals, uvs, options.frontUVs, options.backUVs);\r\n\r\n // Result\r\n const vertexData = new VertexData();\r\n\r\n vertexData.indices = indices;\r\n vertexData.positions = positions;\r\n vertexData.normals = normals;\r\n vertexData.uvs = uvs;\r\n\r\n const totalColors = sideOrientation === VertexData.DOUBLESIDE ? colors.concat(colors) : colors;\r\n vertexData.colors = totalColors;\r\n\r\n return vertexData;\r\n}\r\n\r\n/**\r\n * Creates a tiled plane mesh\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/creation/set/tiled_plane\r\n * @param name defines the name of the mesh\r\n * @param options an object used to set the following optional parameters for the tiled plane, required but can be empty\r\n * * pattern a limited pattern arrangement depending on the number\r\n * * size of the box\r\n * * width of the box, overwrites size\r\n * * height of the box, overwrites size\r\n * * tileSize sets the width, height and depth of the tile to the value of size, optional default 1\r\n * * tileWidth sets the width (x direction) of the tile, overwrites the width set by size, optional, default size\r\n * * tileHeight sets the height (y direction) of the tile, overwrites the height set by size, optional, default size\r\n * * sideOrientation optional and takes the values : Mesh.FRONTSIDE (default), Mesh.BACKSIDE or Mesh.DOUBLESIDE\r\n * * alignHorizontal places whole tiles aligned to the center, left or right of a row\r\n * * alignVertical places whole tiles aligned to the center, left or right of a column\r\n * * frontUvs only usable when you create a double-sided mesh, used to choose what parts of the texture image to crop and apply on the front side, optional, default vector4 (0, 0, 1, 1)\r\n * * backUVs only usable when you create a double-sided mesh, used to choose what parts of the texture image to crop and apply on the back side, optional, default vector4 (0, 0, 1, 1)\r\n * @param scene defines the hosting scene\r\n * @returns the box mesh\r\n */\r\nexport function CreateTiledPlane(\r\n name: string,\r\n options: {\r\n pattern?: number;\r\n tileSize?: number;\r\n tileWidth?: number;\r\n tileHeight?: number;\r\n size?: number;\r\n width?: number;\r\n height?: number;\r\n alignHorizontal?: number;\r\n alignVertical?: number;\r\n sideOrientation?: number;\r\n frontUVs?: Vector4;\r\n backUVs?: Vector4;\r\n updatable?: boolean;\r\n },\r\n scene: Nullable<Scene> = null\r\n): Mesh {\r\n const plane = new Mesh(name, scene);\r\n\r\n options.sideOrientation = Mesh._GetDefaultSideOrientation(options.sideOrientation);\r\n plane._originalBuilderSideOrientation = options.sideOrientation;\r\n\r\n const vertexData = CreateTiledPlaneVertexData(options);\r\n\r\n vertexData.applyToMesh(plane, options.updatable);\r\n\r\n return plane;\r\n}\r\n\r\n/**\r\n * Class containing static functions to help procedurally build meshes\r\n * @deprecated use CreateTiledPlane instead\r\n */\r\nexport const TiledPlaneBuilder = {\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n CreateTiledPlane,\r\n};\r\n\r\nlet _Registered = false;\r\n/**\r\n * Register side effects for the tiled plane builder.\r\n * Safe to call multiple times; only the first call has an effect.\r\n */\r\nexport function RegisterTiledPlaneBuilder(): void {\r\n if (_Registered) {\r\n return;\r\n }\r\n _Registered = true;\r\n\r\n VertexData.CreateTiledPlane = CreateTiledPlaneVertexData;\r\n}\r\n"]}
@@ -258,6 +258,19 @@ export declare class GaussianSplattingMesh extends GaussianSplattingMeshBase {
258
258
  */
259
259
  static Parse(parsedMesh: any, scene: Scene): GaussianSplattingMesh;
260
260
  }
261
+ /**
262
+ * True when `className` (from `AbstractMesh.getClassName()`) identifies a Gaussian Splatting mesh whose
263
+ * `position.z` vertex attribute encodes a splat index rather than world-space Z: `"GaussianSplattingMesh"`
264
+ * (also returned by {@link GaussianSplattingCompoundMesh}, which deliberately does not override
265
+ * `getClassName()`) and `"GaussianSplattingStream"` (which does override it, to remain distinguishable for
266
+ * other purposes). Rendering-pipeline code that must treat any Gaussian Splatting mesh differently from an
267
+ * ordinary mesh (geometry buffer, depth pre-pass, GPU picking, IBL voxelization, snapshot rendering, ...)
268
+ * should use this instead of a literal string comparison, so a future splat mesh subclass only needs to be
269
+ * added here once.
270
+ * @param className the mesh class name to test, e.g. from `AbstractMesh.getClassName()`
271
+ * @returns true if the class name identifies a Gaussian Splatting mesh
272
+ */
273
+ export declare function IsGaussianSplattingClassName(className: string): boolean;
261
274
  /**
262
275
  * Register side effects for gaussianSplattingMesh.
263
276
  * Safe to call multiple times; only the first call has an effect.
@@ -1181,6 +1181,21 @@ export class GaussianSplattingMesh extends GaussianSplattingMeshBase {
1181
1181
  return GaussianSplattingMesh._ParseInternal(parsedMesh, scene, GaussianSplattingMesh);
1182
1182
  }
1183
1183
  }
1184
+ /**
1185
+ * True when `className` (from `AbstractMesh.getClassName()`) identifies a Gaussian Splatting mesh whose
1186
+ * `position.z` vertex attribute encodes a splat index rather than world-space Z: `"GaussianSplattingMesh"`
1187
+ * (also returned by {@link GaussianSplattingCompoundMesh}, which deliberately does not override
1188
+ * `getClassName()`) and `"GaussianSplattingStream"` (which does override it, to remain distinguishable for
1189
+ * other purposes). Rendering-pipeline code that must treat any Gaussian Splatting mesh differently from an
1190
+ * ordinary mesh (geometry buffer, depth pre-pass, GPU picking, IBL voxelization, snapshot rendering, ...)
1191
+ * should use this instead of a literal string comparison, so a future splat mesh subclass only needs to be
1192
+ * added here once.
1193
+ * @param className the mesh class name to test, e.g. from `AbstractMesh.getClassName()`
1194
+ * @returns true if the class name identifies a Gaussian Splatting mesh
1195
+ */
1196
+ export function IsGaussianSplattingClassName(className) {
1197
+ return className === "GaussianSplattingMesh" || className === "GaussianSplattingStream";
1198
+ }
1184
1199
  let _Registered = false;
1185
1200
  /**
1186
1201
  * Register side effects for gaussianSplattingMesh.