@onerjs/core 8.54.2 → 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.
- package/Animations/animatable.core.js.map +1 -1
- package/AudioV2/abstractAudio/abstractSoundSource.d.ts +26 -0
- package/AudioV2/abstractAudio/abstractSoundSource.js.map +1 -1
- package/AudioV2/webAudio/webAudioEngine.js +2 -0
- package/AudioV2/webAudio/webAudioEngine.js.map +1 -1
- package/AudioV2/webAudio/webAudioSoundSource.d.ts +16 -0
- package/AudioV2/webAudio/webAudioSoundSource.js +43 -1
- package/AudioV2/webAudio/webAudioSoundSource.js.map +1 -1
- package/Bones/skeleton.functions.js +1 -1
- package/Bones/skeleton.functions.js.map +1 -1
- package/Cameras/inputMapper.js.map +1 -1
- package/Debug/physicsViewer.pure.js +1 -1
- package/Debug/physicsViewer.pure.js.map +1 -1
- package/Engines/Extensions/engine.alphaToCoverage.d.ts +6 -0
- package/Engines/Extensions/engine.alphaToCoverage.js +9 -0
- package/Engines/Extensions/engine.alphaToCoverage.js.map +1 -0
- package/Engines/Extensions/engine.alphaToCoverage.pure.d.ts +6 -0
- package/Engines/Extensions/engine.alphaToCoverage.pure.js +54 -0
- package/Engines/Extensions/engine.alphaToCoverage.pure.js.map +1 -0
- package/Engines/Extensions/engine.alphaToCoverage.types.d.ts +21 -0
- package/Engines/Extensions/engine.alphaToCoverage.types.js +2 -0
- package/Engines/Extensions/engine.alphaToCoverage.types.js.map +1 -0
- package/Engines/Extensions/index.d.ts +1 -0
- package/Engines/Extensions/index.js +1 -0
- package/Engines/Extensions/index.js.map +1 -1
- package/Engines/Extensions/pure.d.ts +1 -0
- package/Engines/Extensions/pure.js +1 -0
- package/Engines/Extensions/pure.js.map +1 -1
- package/Engines/Native/nativeHelpers.js +6 -4
- package/Engines/Native/nativeHelpers.js.map +1 -1
- package/Engines/Native/nativeInterfaces.d.ts +1 -0
- package/Engines/Native/nativeInterfaces.js.map +1 -1
- package/Engines/WebGPU/Extensions/engine.alphaToCoverage.d.ts +6 -0
- package/Engines/WebGPU/Extensions/engine.alphaToCoverage.js +9 -0
- package/Engines/WebGPU/Extensions/engine.alphaToCoverage.js.map +1 -0
- package/Engines/WebGPU/Extensions/engine.alphaToCoverage.pure.d.ts +6 -0
- package/Engines/WebGPU/Extensions/engine.alphaToCoverage.pure.js +34 -0
- package/Engines/WebGPU/Extensions/engine.alphaToCoverage.pure.js.map +1 -0
- package/Engines/WebGPU/Extensions/engine.alphaToCoverage.types.d.ts +16 -0
- package/Engines/WebGPU/Extensions/engine.alphaToCoverage.types.js +2 -0
- package/Engines/WebGPU/Extensions/engine.alphaToCoverage.types.js.map +1 -0
- package/Engines/WebGPU/Extensions/index.d.ts +1 -0
- package/Engines/WebGPU/Extensions/index.js +1 -0
- package/Engines/WebGPU/Extensions/index.js.map +1 -1
- package/Engines/WebGPU/Extensions/pure.d.ts +1 -0
- package/Engines/WebGPU/Extensions/pure.js +1 -0
- package/Engines/WebGPU/Extensions/pure.js.map +1 -1
- package/Engines/WebGPU/webgpuCacheRenderPipeline.js +0 -1
- package/Engines/WebGPU/webgpuCacheRenderPipeline.js.map +1 -1
- package/Engines/abstractEngine.pure.d.ts +0 -15
- package/Engines/abstractEngine.pure.js +2 -23
- package/Engines/abstractEngine.pure.js.map +1 -1
- package/Engines/constants.d.ts +4 -0
- package/Engines/constants.js +4 -0
- package/Engines/constants.js.map +1 -1
- package/Engines/engine.d.ts +2 -2
- package/Engines/engine.js +1 -0
- package/Engines/engine.js.map +1 -1
- package/Engines/engine.pure.js +1 -1
- package/Engines/engine.pure.js.map +1 -1
- package/Engines/thinEngine.pure.d.ts +0 -11
- package/Engines/thinEngine.pure.js +0 -19
- package/Engines/thinEngine.pure.js.map +1 -1
- package/Engines/webgpuEngine.d.ts +2 -0
- package/Engines/webgpuEngine.js +2 -0
- package/Engines/webgpuEngine.js.map +1 -1
- package/Engines/webgpuEngine.pure.d.ts +0 -5
- package/Engines/webgpuEngine.pure.js +1 -10
- package/Engines/webgpuEngine.pure.js.map +1 -1
- package/FrameGraph/Node/Types/nodeRenderGraphTypes.js.map +1 -1
- package/Loading/loadingScreen.pure.js +2 -0
- package/Loading/loadingScreen.pure.js.map +1 -1
- package/Materials/Node/Blocks/Fragment/ambientOcclusionBlock.pure.js.map +1 -1
- package/Materials/Textures/ktx2decoderTypes.d.ts +14 -3
- package/Materials/Textures/ktx2decoderTypes.js +2 -0
- package/Materials/Textures/ktx2decoderTypes.js.map +1 -1
- package/Materials/Textures/rawTexture2DArray.functions.d.ts +29 -0
- package/Materials/Textures/rawTexture2DArray.functions.js +71 -0
- package/Materials/Textures/rawTexture2DArray.functions.js.map +1 -1
- package/Materials/material.pure.d.ts +1 -0
- package/Materials/material.pure.js +1 -0
- package/Materials/material.pure.js.map +1 -1
- package/Meshes/Builders/pure.d.ts +2 -2
- package/Meshes/Builders/pure.js +2 -2
- package/Meshes/Builders/pure.js.map +1 -1
- package/Meshes/Builders/textBuilder.js.map +1 -1
- package/Meshes/Builders/tiledBoxBuilder.d.ts +1 -83
- package/Meshes/Builders/tiledBoxBuilder.js +3 -215
- package/Meshes/Builders/tiledBoxBuilder.js.map +1 -1
- package/Meshes/Builders/tiledBoxBuilder.pure.d.ts +89 -0
- package/Meshes/Builders/tiledBoxBuilder.pure.js +229 -0
- package/Meshes/Builders/tiledBoxBuilder.pure.js.map +1 -0
- package/Meshes/Builders/tiledPlaneBuilder.d.ts +1 -79
- package/Meshes/Builders/tiledPlaneBuilder.js +3 -429
- package/Meshes/Builders/tiledPlaneBuilder.js.map +1 -1
- package/Meshes/Builders/tiledPlaneBuilder.pure.d.ts +85 -0
- package/Meshes/Builders/tiledPlaneBuilder.pure.js +442 -0
- package/Meshes/Builders/tiledPlaneBuilder.pure.js.map +1 -0
- package/Meshes/GaussianSplatting/gaussianSplattingMeshBase.pure.js +29 -9
- package/Meshes/GaussianSplatting/gaussianSplattingMeshBase.pure.js.map +1 -1
- package/Meshes/Node/Blocks/bevelBlock.pure.js.map +1 -1
- package/Meshes/meshBuilder.d.ts +21 -57
- package/Meshes/meshBuilder.js +21 -58
- package/Meshes/meshBuilder.js.map +1 -1
- package/Meshes/meshBuilder.pure.d.ts +58 -0
- package/Meshes/meshBuilder.pure.js +60 -0
- package/Meshes/meshBuilder.pure.js.map +1 -0
- package/Meshes/pure.d.ts +1 -1
- package/Meshes/pure.js +1 -1
- package/Meshes/pure.js.map +1 -1
- package/Misc/greasedLineTools.js.map +1 -1
- package/Misc/khronosTextureContainer2.d.ts +10 -0
- package/Misc/khronosTextureContainer2.js +23 -12
- package/Misc/khronosTextureContainer2.js.map +1 -1
- package/Misc/perfCounter.d.ts +2 -0
- package/Misc/perfCounter.js +17 -2
- package/Misc/perfCounter.js.map +1 -1
- package/Misc/rgbdTextureTools.js +1 -1
- package/Misc/rgbdTextureTools.js.map +1 -1
- package/Misc/tools.pure.js +1 -1
- package/Misc/tools.pure.js.map +1 -1
- package/Navigation/Plugins/recastJSPlugin.js +1 -1
- package/Navigation/Plugins/recastJSPlugin.js.map +1 -1
- package/PostProcesses/RenderPipeline/Pipelines/lensRenderingPipeline.pure.js.map +1 -1
- package/PostProcesses/RenderPipeline/Pipelines/ssaoRenderingPipeline.pure.js.map +1 -1
- package/PostProcesses/thinSSAO2PostProcess.js.map +1 -1
- package/PostProcesses/volumetricLightScatteringPostProcess.d.ts +3 -0
- package/PostProcesses/volumetricLightScatteringPostProcess.js +3 -0
- package/PostProcesses/volumetricLightScatteringPostProcess.js.map +1 -1
- package/PostProcesses/volumetricLightScatteringPostProcess.pure.d.ts +1 -0
- package/PostProcesses/volumetricLightScatteringPostProcess.pure.js +25 -6
- package/PostProcesses/volumetricLightScatteringPostProcess.pure.js.map +1 -1
- package/Shaders/ShadersInclude/openpbrDielectricReflectance.js +6 -6
- package/Shaders/ShadersInclude/openpbrDielectricReflectance.js.map +1 -1
- package/ShadersWGSL/ShadersInclude/depthPrePass.js +2 -0
- package/ShadersWGSL/ShadersInclude/depthPrePass.js.map +1 -1
- package/ShadersWGSL/ShadersInclude/openpbrDielectricReflectance.js +7 -8
- package/ShadersWGSL/ShadersInclude/openpbrDielectricReflectance.js.map +1 -1
- package/ShadersWGSL/default.fragment.js +3 -0
- package/ShadersWGSL/default.fragment.js.map +1 -1
- package/ShadersWGSL/openpbr.fragment.js +3 -0
- package/ShadersWGSL/openpbr.fragment.js.map +1 -1
- package/ShadersWGSL/pbr.fragment.js +3 -0
- package/ShadersWGSL/pbr.fragment.js.map +1 -1
- package/ShadersWGSL/volumetricLightScattering.fragment.d.ts +5 -0
- package/ShadersWGSL/volumetricLightScattering.fragment.js +20 -0
- package/ShadersWGSL/volumetricLightScattering.fragment.js.map +1 -0
- package/ShadersWGSL/volumetricLightScatteringPass.fragment.d.ts +5 -0
- package/ShadersWGSL/volumetricLightScatteringPass.fragment.js +24 -0
- package/ShadersWGSL/volumetricLightScatteringPass.fragment.js.map +1 -0
- package/ShadersWGSL/volumetricLightScatteringPass.vertex.d.ts +5 -0
- package/ShadersWGSL/volumetricLightScatteringPass.vertex.js +67 -0
- package/ShadersWGSL/volumetricLightScatteringPass.vertex.js.map +1 -0
- package/SmartAssets/smartAssetManager.pure.js +9 -1
- package/SmartAssets/smartAssetManager.pure.js.map +1 -1
- package/States/alphaCullingState.d.ts +0 -9
- package/States/alphaCullingState.js +4 -31
- package/States/alphaCullingState.js.map +1 -1
- package/XR/features/WebXRLayers.pure.js +4 -4
- package/XR/features/WebXRLayers.pure.js.map +1 -1
- package/node.d.ts +18 -1
- package/node.js +52 -1
- package/node.js.map +1 -1
- package/package.json +1 -1
- 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"]}
|
|
@@ -1044,7 +1044,11 @@ export class GaussianSplattingMeshBase extends Mesh {
|
|
|
1044
1044
|
}
|
|
1045
1045
|
return a.frameIdLastUpdate - b.frameIdLastUpdate;
|
|
1046
1046
|
});
|
|
1047
|
-
|
|
1047
|
+
// The native sort writes into _splatPositions/_splatIndex: both must be allocated (they still are
|
|
1048
|
+
// null before any splat data has been committed) or the native binding throws on the conversion.
|
|
1049
|
+
const hasNativeSort = !!Native?.sortSplats && !!this._splatPositions && !!this._splatIndex;
|
|
1050
|
+
// When depth sort is disabled, no sort function must run: fall through to the no-sort path below.
|
|
1051
|
+
const hasSortFunction = !this._disableDepthSort && (this._worker || hasNativeSort);
|
|
1048
1052
|
if ((forced || outdated) && hasSortFunction && (this._scene.activeCameras?.length || this._scene.activeCamera) && this._canPostToWorker) {
|
|
1049
1053
|
const worldMatrix = this.computeWorldMatrix(true);
|
|
1050
1054
|
// view infos sorted by least recent updated frame id
|
|
@@ -1098,14 +1102,16 @@ export class GaussianSplattingMeshBase extends Mesh {
|
|
|
1098
1102
|
});
|
|
1099
1103
|
}
|
|
1100
1104
|
else if (this._disableDepthSort) {
|
|
1101
|
-
|
|
1102
|
-
|
|
1103
|
-
cameraViewInfos.
|
|
1104
|
-
|
|
1105
|
-
|
|
1106
|
-
|
|
1105
|
+
if (this._splatIndex) {
|
|
1106
|
+
activeViewInfos.forEach((cameraViewInfos) => {
|
|
1107
|
+
if (!cameraViewInfos.splatIndexBufferSet) {
|
|
1108
|
+
cameraViewInfos.mesh.thinInstanceSetBuffer("splatIndex", this._splatIndex, 16, false);
|
|
1109
|
+
cameraViewInfos.splatIndexBufferSet = true;
|
|
1110
|
+
}
|
|
1111
|
+
});
|
|
1112
|
+
this._readyToDisplay = true;
|
|
1113
|
+
}
|
|
1107
1114
|
this._canPostToWorker = true;
|
|
1108
|
-
this._readyToDisplay = true;
|
|
1109
1115
|
}
|
|
1110
1116
|
}
|
|
1111
1117
|
/**
|
|
@@ -2161,6 +2167,18 @@ export class GaussianSplattingMeshBase extends Mesh {
|
|
|
2161
2167
|
this._postToWorker(true);
|
|
2162
2168
|
}
|
|
2163
2169
|
else {
|
|
2170
|
+
// Full rebuild: the texture size changed (or this is a size-changing reload), so the existing
|
|
2171
|
+
// GPU textures cannot be reused. Dispose them before recreating to avoid leaking the old ones.
|
|
2172
|
+
this._covariancesATexture?.dispose();
|
|
2173
|
+
this._covariancesBTexture?.dispose();
|
|
2174
|
+
this._centersTexture?.dispose();
|
|
2175
|
+
this._colorsTexture?.dispose();
|
|
2176
|
+
if (this._shTextures) {
|
|
2177
|
+
for (const shTexture of this._shTextures) {
|
|
2178
|
+
shTexture.dispose();
|
|
2179
|
+
}
|
|
2180
|
+
this._shTextures = null;
|
|
2181
|
+
}
|
|
2164
2182
|
this._textureSize = textureSize;
|
|
2165
2183
|
this._covariancesATexture = createTextureFromDataF16(covA, textureSize.x, textureSize.y, 5);
|
|
2166
2184
|
this._covariancesBTexture = createTextureFromDataF16(covB, textureSize.x, textureSize.y, this._useRGBACovariants ? 5 : 7);
|
|
@@ -2550,10 +2568,12 @@ export class GaussianSplattingMeshBase extends Mesh {
|
|
|
2550
2568
|
if (!this._vertexCount) {
|
|
2551
2569
|
return;
|
|
2552
2570
|
}
|
|
2571
|
+
// The identity index buffer must exist even when no sort worker is needed: every render path
|
|
2572
|
+
// (including the Native one) reads it, and a null buffer breaks the Native bindings.
|
|
2573
|
+
this._updateSplatIndexBuffer(this._vertexCount);
|
|
2553
2574
|
if (this._disableDepthSort) {
|
|
2554
2575
|
return;
|
|
2555
2576
|
}
|
|
2556
|
-
this._updateSplatIndexBuffer(this._vertexCount);
|
|
2557
2577
|
// no worker in native
|
|
2558
2578
|
if (IsNative) {
|
|
2559
2579
|
return;
|