@babylonjs/serializers 7.37.0 → 7.37.2

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 (70) hide show
  1. package/glTF/2.0/Extensions/EXT_mesh_gpu_instancing.d.ts +6 -7
  2. package/glTF/2.0/Extensions/EXT_mesh_gpu_instancing.js +18 -12
  3. package/glTF/2.0/Extensions/EXT_mesh_gpu_instancing.js.map +1 -1
  4. package/glTF/2.0/Extensions/KHR_lights_punctual.d.ts +5 -6
  5. package/glTF/2.0/Extensions/KHR_lights_punctual.js +99 -109
  6. package/glTF/2.0/Extensions/KHR_lights_punctual.js.map +1 -1
  7. package/glTF/2.0/Extensions/KHR_materials_anisotropy.d.ts +2 -2
  8. package/glTF/2.0/Extensions/KHR_materials_anisotropy.js +6 -6
  9. package/glTF/2.0/Extensions/KHR_materials_anisotropy.js.map +1 -1
  10. package/glTF/2.0/Extensions/KHR_materials_clearcoat.d.ts +2 -2
  11. package/glTF/2.0/Extensions/KHR_materials_clearcoat.js +9 -9
  12. package/glTF/2.0/Extensions/KHR_materials_clearcoat.js.map +1 -1
  13. package/glTF/2.0/Extensions/KHR_materials_diffuse_transmission.d.ts +2 -2
  14. package/glTF/2.0/Extensions/KHR_materials_diffuse_transmission.js +7 -7
  15. package/glTF/2.0/Extensions/KHR_materials_diffuse_transmission.js.map +1 -1
  16. package/glTF/2.0/Extensions/KHR_materials_dispersion.js +2 -2
  17. package/glTF/2.0/Extensions/KHR_materials_dispersion.js.map +1 -1
  18. package/glTF/2.0/Extensions/KHR_materials_emissive_strength.js +2 -2
  19. package/glTF/2.0/Extensions/KHR_materials_emissive_strength.js.map +1 -1
  20. package/glTF/2.0/Extensions/KHR_materials_ior.js +2 -2
  21. package/glTF/2.0/Extensions/KHR_materials_ior.js.map +1 -1
  22. package/glTF/2.0/Extensions/KHR_materials_iridescence.d.ts +2 -2
  23. package/glTF/2.0/Extensions/KHR_materials_iridescence.js +7 -7
  24. package/glTF/2.0/Extensions/KHR_materials_iridescence.js.map +1 -1
  25. package/glTF/2.0/Extensions/KHR_materials_sheen.d.ts +2 -2
  26. package/glTF/2.0/Extensions/KHR_materials_sheen.js +8 -8
  27. package/glTF/2.0/Extensions/KHR_materials_sheen.js.map +1 -1
  28. package/glTF/2.0/Extensions/KHR_materials_specular.d.ts +2 -2
  29. package/glTF/2.0/Extensions/KHR_materials_specular.js +7 -7
  30. package/glTF/2.0/Extensions/KHR_materials_specular.js.map +1 -1
  31. package/glTF/2.0/Extensions/KHR_materials_transmission.d.ts +2 -2
  32. package/glTF/2.0/Extensions/KHR_materials_transmission.js +6 -6
  33. package/glTF/2.0/Extensions/KHR_materials_transmission.js.map +1 -1
  34. package/glTF/2.0/Extensions/KHR_materials_unlit.js +2 -2
  35. package/glTF/2.0/Extensions/KHR_materials_unlit.js.map +1 -1
  36. package/glTF/2.0/Extensions/KHR_materials_volume.d.ts +2 -2
  37. package/glTF/2.0/Extensions/KHR_materials_volume.js +6 -6
  38. package/glTF/2.0/Extensions/KHR_materials_volume.js.map +1 -1
  39. package/glTF/2.0/Extensions/KHR_texture_transform.js +2 -2
  40. package/glTF/2.0/Extensions/KHR_texture_transform.js.map +1 -1
  41. package/glTF/2.0/Extensions/index.d.ts +9 -9
  42. package/glTF/2.0/Extensions/index.js +9 -9
  43. package/glTF/2.0/Extensions/index.js.map +1 -1
  44. package/glTF/2.0/dataWriter.d.ts +18 -0
  45. package/glTF/2.0/dataWriter.js +65 -0
  46. package/glTF/2.0/dataWriter.js.map +1 -0
  47. package/glTF/2.0/glTFAnimation.d.ts +4 -10
  48. package/glTF/2.0/glTFAnimation.js +87 -19
  49. package/glTF/2.0/glTFAnimation.js.map +1 -1
  50. package/glTF/2.0/glTFData.d.ts +5 -3
  51. package/glTF/2.0/glTFData.js +35 -36
  52. package/glTF/2.0/glTFData.js.map +1 -1
  53. package/glTF/2.0/glTFExporter.d.ts +62 -363
  54. package/glTF/2.0/glTFExporter.js +867 -1579
  55. package/glTF/2.0/glTFExporter.js.map +1 -1
  56. package/glTF/2.0/glTFExporterExtension.d.ts +8 -9
  57. package/glTF/2.0/glTFExporterExtension.js.map +1 -1
  58. package/glTF/2.0/glTFMaterialExporter.d.ts +26 -126
  59. package/glTF/2.0/glTFMaterialExporter.js +276 -438
  60. package/glTF/2.0/glTFMaterialExporter.js.map +1 -1
  61. package/glTF/2.0/glTFMorphTargetsUtilities.d.ts +14 -0
  62. package/glTF/2.0/glTFMorphTargetsUtilities.js +105 -0
  63. package/glTF/2.0/glTFMorphTargetsUtilities.js.map +1 -0
  64. package/glTF/2.0/glTFSerializer.d.ts +10 -13
  65. package/glTF/2.0/glTFSerializer.js +25 -44
  66. package/glTF/2.0/glTFSerializer.js.map +1 -1
  67. package/glTF/2.0/glTFUtilities.d.ts +75 -43
  68. package/glTF/2.0/glTFUtilities.js +350 -103
  69. package/glTF/2.0/glTFUtilities.js.map +1 -1
  70. package/package.json +3 -3
@@ -1,113 +1,360 @@
1
- import { Vector3 } from "@babylonjs/core/Maths/math.vector.js";
1
+ /* eslint-disable jsdoc/require-jsdoc */
2
+ import { Quaternion, TmpVectors, Matrix, Vector3 } from "@babylonjs/core/Maths/math.vector.js";
3
+ import { VertexBuffer } from "@babylonjs/core/Buffers/buffer.js";
4
+ import { Material } from "@babylonjs/core/Materials/material.js";
5
+ import { TransformNode } from "@babylonjs/core/Meshes/transformNode.js";
6
+ import { Mesh } from "@babylonjs/core/Meshes/mesh.js";
7
+ import { InstancedMesh } from "@babylonjs/core/Meshes/instancedMesh.js";
8
+ import { EnumerateFloatValues } from "@babylonjs/core/Buffers/bufferUtils.js";
9
+ // Matrix that converts handedness on the X-axis.
10
+ const convertHandednessMatrix = Matrix.Compose(new Vector3(-1, 1, 1), Quaternion.Identity(), Vector3.Zero());
11
+ // 180 degrees rotation in Y.
12
+ const rotation180Y = new Quaternion(0, 1, 0, 0);
13
+ // Default values for comparison.
14
+ const epsilon = 1e-6;
15
+ const defaultTranslation = Vector3.Zero();
16
+ const defaultScale = Vector3.One();
2
17
  /**
3
- * @internal
18
+ * Creates a buffer view based on the supplied arguments
19
+ * @param bufferIndex index value of the specified buffer
20
+ * @param byteOffset byte offset value
21
+ * @param byteLength byte length of the bufferView
22
+ * @param byteStride byte distance between conequential elements
23
+ * @returns bufferView for glTF
4
24
  */
5
- export class _GLTFUtilities {
6
- /**
7
- * Creates a buffer view based on the supplied arguments
8
- * @param bufferIndex index value of the specified buffer
9
- * @param byteOffset byte offset value
10
- * @param byteLength byte length of the bufferView
11
- * @param byteStride byte distance between conequential elements
12
- * @param name name of the buffer view
13
- * @returns bufferView for glTF
14
- */
15
- static _CreateBufferView(bufferIndex, byteOffset, byteLength, byteStride, name) {
16
- const bufferview = { buffer: bufferIndex, byteLength: byteLength };
17
- if (byteOffset) {
18
- bufferview.byteOffset = byteOffset;
19
- }
20
- if (name) {
21
- bufferview.name = name;
22
- }
23
- if (byteStride) {
24
- bufferview.byteStride = byteStride;
25
- }
26
- return bufferview;
27
- }
28
- /**
29
- * Creates an accessor based on the supplied arguments
30
- * @param bufferviewIndex The index of the bufferview referenced by this accessor
31
- * @param name The name of the accessor
32
- * @param type The type of the accessor
33
- * @param componentType The datatype of components in the attribute
34
- * @param count The number of attributes referenced by this accessor
35
- * @param byteOffset The offset relative to the start of the bufferView in bytes
36
- * @param min Minimum value of each component in this attribute
37
- * @param max Maximum value of each component in this attribute
38
- * @returns accessor for glTF
39
- */
40
- static _CreateAccessor(bufferviewIndex, name, type, componentType, count, byteOffset, min, max) {
41
- const accessor = { name: name, bufferView: bufferviewIndex, componentType: componentType, count: count, type: type };
42
- if (min != null) {
43
- accessor.min = min;
44
- }
45
- if (max != null) {
46
- accessor.max = max;
47
- }
48
- if (byteOffset != null) {
49
- accessor.byteOffset = byteOffset;
25
+ export function CreateBufferView(bufferIndex, byteOffset, byteLength, byteStride) {
26
+ const bufferview = { buffer: bufferIndex, byteLength: byteLength };
27
+ if (byteOffset) {
28
+ bufferview.byteOffset = byteOffset;
29
+ }
30
+ if (byteStride) {
31
+ bufferview.byteStride = byteStride;
32
+ }
33
+ return bufferview;
34
+ }
35
+ /**
36
+ * Creates an accessor based on the supplied arguments
37
+ * @param bufferViewIndex The index of the bufferview referenced by this accessor
38
+ * @param type The type of the accessor
39
+ * @param componentType The datatype of components in the attribute
40
+ * @param count The number of attributes referenced by this accessor
41
+ * @param byteOffset The offset relative to the start of the bufferView in bytes
42
+ * @param minMax Minimum and maximum value of each component in this attribute
43
+ * @param normalized Specifies whether integer data values are normalized before usage
44
+ * @returns accessor for glTF
45
+ */
46
+ export function CreateAccessor(bufferViewIndex, type, componentType, count, byteOffset, minMax = null, normalized) {
47
+ const accessor = { bufferView: bufferViewIndex, componentType: componentType, count: count, type: type };
48
+ if (minMax != null) {
49
+ accessor.min = minMax.min;
50
+ accessor.max = minMax.max;
51
+ }
52
+ if (normalized) {
53
+ accessor.normalized = normalized;
54
+ }
55
+ if (byteOffset != null) {
56
+ accessor.byteOffset = byteOffset;
57
+ }
58
+ return accessor;
59
+ }
60
+ export function GetAccessorElementCount(accessorType) {
61
+ switch (accessorType) {
62
+ case "MAT2" /* AccessorType.MAT2 */:
63
+ return 4;
64
+ case "MAT3" /* AccessorType.MAT3 */:
65
+ return 9;
66
+ case "MAT4" /* AccessorType.MAT4 */:
67
+ return 16;
68
+ case "SCALAR" /* AccessorType.SCALAR */:
69
+ return 1;
70
+ case "VEC2" /* AccessorType.VEC2 */:
71
+ return 2;
72
+ case "VEC3" /* AccessorType.VEC3 */:
73
+ return 3;
74
+ case "VEC4" /* AccessorType.VEC4 */:
75
+ return 4;
76
+ }
77
+ }
78
+ export function FloatsNeed16BitInteger(floatArray) {
79
+ return floatArray.some((value) => value >= 256);
80
+ }
81
+ export function IsStandardVertexAttribute(type) {
82
+ switch (type) {
83
+ case VertexBuffer.PositionKind:
84
+ case VertexBuffer.NormalKind:
85
+ case VertexBuffer.TangentKind:
86
+ case VertexBuffer.ColorKind:
87
+ case VertexBuffer.MatricesIndicesKind:
88
+ case VertexBuffer.MatricesIndicesExtraKind:
89
+ case VertexBuffer.MatricesWeightsKind:
90
+ case VertexBuffer.MatricesWeightsExtraKind:
91
+ case VertexBuffer.UVKind:
92
+ case VertexBuffer.UV2Kind:
93
+ case VertexBuffer.UV3Kind:
94
+ case VertexBuffer.UV4Kind:
95
+ case VertexBuffer.UV5Kind:
96
+ case VertexBuffer.UV6Kind:
97
+ return true;
98
+ }
99
+ return false;
100
+ }
101
+ export function GetAccessorType(kind, hasVertexColorAlpha) {
102
+ if (kind == VertexBuffer.ColorKind) {
103
+ return hasVertexColorAlpha ? "VEC4" /* AccessorType.VEC4 */ : "VEC3" /* AccessorType.VEC3 */;
104
+ }
105
+ switch (kind) {
106
+ case VertexBuffer.PositionKind:
107
+ case VertexBuffer.NormalKind:
108
+ return "VEC3" /* AccessorType.VEC3 */;
109
+ case VertexBuffer.TangentKind:
110
+ case VertexBuffer.MatricesIndicesKind:
111
+ case VertexBuffer.MatricesIndicesExtraKind:
112
+ case VertexBuffer.MatricesWeightsKind:
113
+ case VertexBuffer.MatricesWeightsExtraKind:
114
+ return "VEC4" /* AccessorType.VEC4 */;
115
+ case VertexBuffer.UVKind:
116
+ case VertexBuffer.UV2Kind:
117
+ case VertexBuffer.UV3Kind:
118
+ case VertexBuffer.UV4Kind:
119
+ case VertexBuffer.UV5Kind:
120
+ case VertexBuffer.UV6Kind:
121
+ return "VEC2" /* AccessorType.VEC2 */;
122
+ }
123
+ throw new Error(`Unknown kind ${kind}`);
124
+ }
125
+ export function GetAttributeType(kind) {
126
+ switch (kind) {
127
+ case VertexBuffer.PositionKind:
128
+ return "POSITION";
129
+ case VertexBuffer.NormalKind:
130
+ return "NORMAL";
131
+ case VertexBuffer.TangentKind:
132
+ return "TANGENT";
133
+ case VertexBuffer.ColorKind:
134
+ return "COLOR_0";
135
+ case VertexBuffer.UVKind:
136
+ return "TEXCOORD_0";
137
+ case VertexBuffer.UV2Kind:
138
+ return "TEXCOORD_1";
139
+ case VertexBuffer.UV3Kind:
140
+ return "TEXCOORD_2";
141
+ case VertexBuffer.UV4Kind:
142
+ return "TEXCOORD_3";
143
+ case VertexBuffer.UV5Kind:
144
+ return "TEXCOORD_4";
145
+ case VertexBuffer.UV6Kind:
146
+ return "TEXCOORD_5";
147
+ case VertexBuffer.MatricesIndicesKind:
148
+ return "JOINTS_0";
149
+ case VertexBuffer.MatricesIndicesExtraKind:
150
+ return "JOINTS_1";
151
+ case VertexBuffer.MatricesWeightsKind:
152
+ return "WEIGHTS_0";
153
+ case VertexBuffer.MatricesWeightsExtraKind:
154
+ return "WEIGHTS_1";
155
+ }
156
+ throw new Error(`Unknown kind: ${kind}`);
157
+ }
158
+ export function GetPrimitiveMode(fillMode) {
159
+ switch (fillMode) {
160
+ case Material.TriangleFillMode:
161
+ return 4 /* MeshPrimitiveMode.TRIANGLES */;
162
+ case Material.TriangleStripDrawMode:
163
+ return 5 /* MeshPrimitiveMode.TRIANGLE_STRIP */;
164
+ case Material.TriangleFanDrawMode:
165
+ return 6 /* MeshPrimitiveMode.TRIANGLE_FAN */;
166
+ case Material.PointListDrawMode:
167
+ case Material.PointFillMode:
168
+ return 0 /* MeshPrimitiveMode.POINTS */;
169
+ case Material.LineLoopDrawMode:
170
+ return 2 /* MeshPrimitiveMode.LINE_LOOP */;
171
+ case Material.LineListDrawMode:
172
+ return 1 /* MeshPrimitiveMode.LINES */;
173
+ case Material.LineStripDrawMode:
174
+ return 3 /* MeshPrimitiveMode.LINE_STRIP */;
175
+ }
176
+ throw new Error(`Unknown fill mode: ${fillMode}`);
177
+ }
178
+ export function IsTriangleFillMode(fillMode) {
179
+ switch (fillMode) {
180
+ case Material.TriangleFillMode:
181
+ case Material.TriangleStripDrawMode:
182
+ case Material.TriangleFanDrawMode:
183
+ return true;
184
+ }
185
+ return false;
186
+ }
187
+ export function NormalizeTangent(tangent) {
188
+ const length = Math.sqrt(tangent.x * tangent.x + tangent.y * tangent.y + tangent.z * tangent.z);
189
+ if (length > 0) {
190
+ tangent.x /= length;
191
+ tangent.y /= length;
192
+ tangent.z /= length;
193
+ }
194
+ }
195
+ export function ConvertToRightHandedPosition(value) {
196
+ value.x *= -1;
197
+ return value;
198
+ }
199
+ export function ConvertToRightHandedRotation(value) {
200
+ value.x *= -1;
201
+ value.y *= -1;
202
+ return value;
203
+ }
204
+ export function ConvertToRightHandedNode(value) {
205
+ let translation = Vector3.FromArrayToRef(value.translation || [0, 0, 0], 0, TmpVectors.Vector3[0]);
206
+ let rotation = Quaternion.FromArrayToRef(value.rotation || [0, 0, 0, 1], 0, TmpVectors.Quaternion[0]);
207
+ translation = ConvertToRightHandedPosition(translation);
208
+ rotation = ConvertToRightHandedRotation(rotation);
209
+ if (translation.equalsWithEpsilon(defaultTranslation, epsilon)) {
210
+ delete value.translation;
211
+ }
212
+ else {
213
+ value.translation = translation.asArray();
214
+ }
215
+ if (Quaternion.IsIdentity(rotation)) {
216
+ delete value.rotation;
217
+ }
218
+ else {
219
+ value.rotation = rotation.asArray();
220
+ }
221
+ }
222
+ /**
223
+ * Rotation by 180 as glTF has a different convention than Babylon.
224
+ * @param rotation Target camera rotation.
225
+ * @returns Ref to camera rotation.
226
+ */
227
+ export function ConvertCameraRotationToGLTF(rotation) {
228
+ return rotation.multiplyInPlace(rotation180Y);
229
+ }
230
+ export function RotateNode180Y(node) {
231
+ if (node.rotation) {
232
+ const rotation = Quaternion.FromArrayToRef(node.rotation || [0, 0, 0, 1], 0, TmpVectors.Quaternion[1]);
233
+ rotation180Y.multiplyToRef(rotation, rotation);
234
+ node.rotation = rotation.asArray();
235
+ }
236
+ }
237
+ /**
238
+ * Collapses GLTF parent and node into a single node. This is useful for removing nodes that were added by the GLTF importer.
239
+ * @param node Target parent node.
240
+ * @param parentNode Original GLTF node (Light or Camera).
241
+ */
242
+ export function CollapseParentNode(node, parentNode) {
243
+ const parentTranslation = Vector3.FromArrayToRef(parentNode.translation || [0, 0, 0], 0, TmpVectors.Vector3[0]);
244
+ const parentRotation = Quaternion.FromArrayToRef(parentNode.rotation || [0, 0, 0, 1], 0, TmpVectors.Quaternion[0]);
245
+ const parentScale = Vector3.FromArrayToRef(parentNode.scale || [1, 1, 1], 0, TmpVectors.Vector3[1]);
246
+ const parentMatrix = Matrix.ComposeToRef(parentScale, parentRotation, parentTranslation, TmpVectors.Matrix[0]);
247
+ const translation = Vector3.FromArrayToRef(node.translation || [0, 0, 0], 0, TmpVectors.Vector3[2]);
248
+ const rotation = Quaternion.FromArrayToRef(node.rotation || [0, 0, 0, 1], 0, TmpVectors.Quaternion[1]);
249
+ const scale = Vector3.FromArrayToRef(node.scale || [1, 1, 1], 0, TmpVectors.Vector3[1]);
250
+ const matrix = Matrix.ComposeToRef(scale, rotation, translation, TmpVectors.Matrix[1]);
251
+ parentMatrix.multiplyToRef(matrix, matrix);
252
+ matrix.decompose(parentScale, parentRotation, parentTranslation);
253
+ if (parentTranslation.equalsWithEpsilon(defaultTranslation, epsilon)) {
254
+ delete parentNode.translation;
255
+ }
256
+ else {
257
+ parentNode.translation = parentTranslation.asArray();
258
+ }
259
+ if (Quaternion.IsIdentity(parentRotation)) {
260
+ delete parentNode.rotation;
261
+ }
262
+ else {
263
+ parentNode.rotation = parentRotation.asArray();
264
+ }
265
+ if (parentScale.equalsWithEpsilon(defaultScale, epsilon)) {
266
+ delete parentNode.scale;
267
+ }
268
+ else {
269
+ parentNode.scale = parentScale.asArray();
270
+ }
271
+ }
272
+ /**
273
+ * Sometimes the GLTF Importer can add extra transform nodes (for lights and cameras). This checks if a parent node was added by the GLTF Importer. If so, it should be removed during serialization.
274
+ * @param babylonNode Original GLTF node (Light or Camera).
275
+ * @param parentBabylonNode Target parent node.
276
+ * @returns True if the parent node was added by the GLTF importer.
277
+ */
278
+ export function IsParentAddedByImporter(babylonNode, parentBabylonNode) {
279
+ return parentBabylonNode instanceof TransformNode && parentBabylonNode.getChildren().length == 1 && babylonNode.getChildren().length == 0;
280
+ }
281
+ export function IsNoopNode(node, useRightHandedSystem) {
282
+ if (!(node instanceof TransformNode)) {
283
+ return false;
284
+ }
285
+ // Transform
286
+ if (useRightHandedSystem) {
287
+ const matrix = node.getWorldMatrix();
288
+ if (!matrix.isIdentity()) {
289
+ return false;
50
290
  }
51
- return accessor;
52
- }
53
- /**
54
- * Calculates the minimum and maximum values of an array of position floats
55
- * @param positions Positions array of a mesh
56
- * @param vertexStart Starting vertex offset to calculate min and max values
57
- * @param vertexCount Number of vertices to check for min and max values
58
- * @returns min number array and max number array
59
- */
60
- static _CalculateMinMaxPositions(positions, vertexStart, vertexCount) {
61
- const min = [Infinity, Infinity, Infinity];
62
- const max = [-Infinity, -Infinity, -Infinity];
63
- const positionStrideSize = 3;
64
- let indexOffset;
65
- let position;
66
- let vector;
67
- if (vertexCount) {
68
- for (let i = vertexStart, length = vertexStart + vertexCount; i < length; ++i) {
69
- indexOffset = positionStrideSize * i;
70
- position = Vector3.FromArray(positions, indexOffset);
71
- vector = position.asArray();
72
- for (let j = 0; j < positionStrideSize; ++j) {
73
- const num = vector[j];
74
- if (num < min[j]) {
75
- min[j] = num;
76
- }
77
- if (num > max[j]) {
78
- max[j] = num;
79
- }
80
- ++indexOffset;
81
- }
82
- }
291
+ }
292
+ else {
293
+ const matrix = node.getWorldMatrix().multiplyToRef(convertHandednessMatrix, TmpVectors.Matrix[0]);
294
+ if (!matrix.isIdentity()) {
295
+ return false;
83
296
  }
84
- return { min, max };
85
- }
86
- static _NormalizeTangentFromRef(tangent) {
87
- const length = Math.sqrt(tangent.x * tangent.x + tangent.y * tangent.y + tangent.z * tangent.z);
88
- if (length > 0) {
89
- tangent.x /= length;
90
- tangent.y /= length;
91
- tangent.z /= length;
297
+ }
298
+ // Geometry
299
+ if ((node instanceof Mesh && node.geometry) || (node instanceof InstancedMesh && node.sourceMesh.geometry)) {
300
+ return false;
301
+ }
302
+ return true;
303
+ }
304
+ export function AreIndices32Bits(indices, count) {
305
+ if (indices) {
306
+ if (indices instanceof Array) {
307
+ return indices.some((value) => value >= 65536);
92
308
  }
309
+ return indices.BYTES_PER_ELEMENT === 4;
310
+ }
311
+ return count >= 65536;
312
+ }
313
+ export function IndicesArrayToUint8Array(indices, start, count, is32Bits) {
314
+ if (indices instanceof Array) {
315
+ const subarray = indices.slice(start, start + count);
316
+ indices = is32Bits ? new Uint32Array(subarray) : new Uint16Array(subarray);
317
+ return new Uint8Array(indices.buffer, indices.byteOffset, indices.byteLength);
93
318
  }
94
- static _GetDataAccessorElementCount(accessorType) {
95
- switch (accessorType) {
96
- case "MAT2" /* AccessorType.MAT2 */:
97
- return 4;
98
- case "MAT3" /* AccessorType.MAT3 */:
99
- return 9;
100
- case "MAT4" /* AccessorType.MAT4 */:
101
- return 16;
102
- case "SCALAR" /* AccessorType.SCALAR */:
103
- return 1;
104
- case "VEC2" /* AccessorType.VEC2 */:
105
- return 2;
106
- case "VEC3" /* AccessorType.VEC3 */:
107
- return 3;
108
- case "VEC4" /* AccessorType.VEC4 */:
109
- return 4;
319
+ return ArrayBuffer.isView(indices) ? new Uint8Array(indices.buffer, indices.byteOffset, indices.byteLength) : new Uint8Array(indices);
320
+ }
321
+ export function DataArrayToUint8Array(data) {
322
+ if (data instanceof Array) {
323
+ const floatData = new Float32Array(data);
324
+ return new Uint8Array(floatData.buffer, floatData.byteOffset, floatData.byteLength);
325
+ }
326
+ return ArrayBuffer.isView(data) ? new Uint8Array(data.buffer, data.byteOffset, data.byteLength) : new Uint8Array(data);
327
+ }
328
+ export function GetMinMax(data, vertexBuffer, start, count) {
329
+ const { byteOffset, byteStride, type, normalized } = vertexBuffer;
330
+ const size = vertexBuffer.getSize();
331
+ const min = new Array(size).fill(Infinity);
332
+ const max = new Array(size).fill(-Infinity);
333
+ EnumerateFloatValues(data, byteOffset + start * byteStride, byteStride, size, type, count * size, normalized, (values) => {
334
+ for (let i = 0; i < size; i++) {
335
+ min[i] = Math.min(min[i], values[i]);
336
+ max[i] = Math.max(max[i], values[i]);
337
+ }
338
+ });
339
+ return { min, max };
340
+ }
341
+ /**
342
+ * Removes, in-place, object properties which have the same value as the default value.
343
+ * Useful for avoiding unnecessary properties in the glTF JSON.
344
+ * @param object the object to omit default values from
345
+ * @param defaultValues a partial object with default values
346
+ * @returns object with default values omitted
347
+ */
348
+ export function OmitDefaultValues(object, defaultValues) {
349
+ for (const [key, value] of Object.entries(object)) {
350
+ const defaultValue = defaultValues[key];
351
+ if ((Array.isArray(value) && Array.isArray(defaultValue) && AreArraysEqual(value, defaultValue)) || value === defaultValue) {
352
+ delete object[key];
110
353
  }
111
354
  }
355
+ return object;
356
+ }
357
+ function AreArraysEqual(array1, array2) {
358
+ return array1.length === array2.length && array1.every((val, i) => val === array2[i]);
112
359
  }
113
360
  //# sourceMappingURL=glTFUtilities.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"glTFUtilities.js","sourceRoot":"","sources":["../../../../../dev/serializers/src/glTF/2.0/glTFUtilities.ts"],"names":[],"mappings":"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","sourcesContent":["import type { IBufferView, AccessorComponentType, IAccessor } from \"babylonjs-gltf2interface\";\r\nimport { AccessorType } from \"babylonjs-gltf2interface\";\r\n\r\nimport type { FloatArray, Nullable } from \"core/types\";\r\nimport type { Vector4 } from \"core/Maths/math.vector\";\r\nimport { Vector3 } from \"core/Maths/math.vector\";\r\n\r\n/**\r\n * @internal\r\n */\r\nexport class _GLTFUtilities {\r\n /**\r\n * Creates a buffer view based on the supplied arguments\r\n * @param bufferIndex index value of the specified buffer\r\n * @param byteOffset byte offset value\r\n * @param byteLength byte length of the bufferView\r\n * @param byteStride byte distance between conequential elements\r\n * @param name name of the buffer view\r\n * @returns bufferView for glTF\r\n */\r\n public static _CreateBufferView(bufferIndex: number, byteOffset: number, byteLength: number, byteStride?: number, name?: string): IBufferView {\r\n const bufferview: IBufferView = { buffer: bufferIndex, byteLength: byteLength };\r\n if (byteOffset) {\r\n bufferview.byteOffset = byteOffset;\r\n }\r\n if (name) {\r\n bufferview.name = name;\r\n }\r\n if (byteStride) {\r\n bufferview.byteStride = byteStride;\r\n }\r\n\r\n return bufferview;\r\n }\r\n\r\n /**\r\n * Creates an accessor based on the supplied arguments\r\n * @param bufferviewIndex The index of the bufferview referenced by this accessor\r\n * @param name The name of the accessor\r\n * @param type The type of the accessor\r\n * @param componentType The datatype of components in the attribute\r\n * @param count The number of attributes referenced by this accessor\r\n * @param byteOffset The offset relative to the start of the bufferView in bytes\r\n * @param min Minimum value of each component in this attribute\r\n * @param max Maximum value of each component in this attribute\r\n * @returns accessor for glTF\r\n */\r\n public static _CreateAccessor(\r\n bufferviewIndex: number,\r\n name: string,\r\n type: AccessorType,\r\n componentType: AccessorComponentType,\r\n count: number,\r\n byteOffset: Nullable<number>,\r\n min: Nullable<number[]>,\r\n max: Nullable<number[]>\r\n ): IAccessor {\r\n const accessor: IAccessor = { name: name, bufferView: bufferviewIndex, componentType: componentType, count: count, type: type };\r\n\r\n if (min != null) {\r\n accessor.min = min;\r\n }\r\n if (max != null) {\r\n accessor.max = max;\r\n }\r\n if (byteOffset != null) {\r\n accessor.byteOffset = byteOffset;\r\n }\r\n\r\n return accessor;\r\n }\r\n\r\n /**\r\n * Calculates the minimum and maximum values of an array of position floats\r\n * @param positions Positions array of a mesh\r\n * @param vertexStart Starting vertex offset to calculate min and max values\r\n * @param vertexCount Number of vertices to check for min and max values\r\n * @returns min number array and max number array\r\n */\r\n public static _CalculateMinMaxPositions(positions: FloatArray, vertexStart: number, vertexCount: number): { min: number[]; max: number[] } {\r\n const min = [Infinity, Infinity, Infinity];\r\n const max = [-Infinity, -Infinity, -Infinity];\r\n const positionStrideSize = 3;\r\n let indexOffset: number;\r\n let position: Vector3;\r\n let vector: number[];\r\n\r\n if (vertexCount) {\r\n for (let i = vertexStart, length = vertexStart + vertexCount; i < length; ++i) {\r\n indexOffset = positionStrideSize * i;\r\n\r\n position = Vector3.FromArray(positions, indexOffset);\r\n vector = position.asArray();\r\n\r\n for (let j = 0; j < positionStrideSize; ++j) {\r\n const num = vector[j];\r\n if (num < min[j]) {\r\n min[j] = num;\r\n }\r\n if (num > max[j]) {\r\n max[j] = num;\r\n }\r\n ++indexOffset;\r\n }\r\n }\r\n }\r\n return { min, max };\r\n }\r\n\r\n public static _NormalizeTangentFromRef(tangent: Vector4 | Vector3) {\r\n const length = Math.sqrt(tangent.x * tangent.x + tangent.y * tangent.y + tangent.z * tangent.z);\r\n if (length > 0) {\r\n tangent.x /= length;\r\n tangent.y /= length;\r\n tangent.z /= length;\r\n }\r\n }\r\n\r\n public static _GetDataAccessorElementCount(accessorType: AccessorType) {\r\n switch (accessorType) {\r\n case AccessorType.MAT2:\r\n return 4;\r\n case AccessorType.MAT3:\r\n return 9;\r\n case AccessorType.MAT4:\r\n return 16;\r\n case AccessorType.SCALAR:\r\n return 1;\r\n case AccessorType.VEC2:\r\n return 2;\r\n case AccessorType.VEC3:\r\n return 3;\r\n case AccessorType.VEC4:\r\n return 4;\r\n }\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"glTFUtilities.js","sourceRoot":"","sources":["../../../../../dev/serializers/src/glTF/2.0/glTFUtilities.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable jsdoc/require-jsdoc */\r\n\r\nimport type { IBufferView, AccessorComponentType, IAccessor, INode } from \"babylonjs-gltf2interface\";\r\nimport { AccessorType, MeshPrimitiveMode } from \"babylonjs-gltf2interface\";\r\n\r\nimport type { FloatArray, DataArray, IndicesArray, Nullable } from \"core/types\";\r\nimport type { Vector4 } from \"core/Maths/math.vector\";\r\nimport { Quaternion, TmpVectors, Matrix, Vector3 } from \"core/Maths/math.vector\";\r\nimport { VertexBuffer } from \"core/Buffers/buffer\";\r\nimport { Material } from \"core/Materials/material\";\r\nimport { TransformNode } from \"core/Meshes/transformNode\";\r\nimport { Mesh } from \"core/Meshes/mesh\";\r\nimport { InstancedMesh } from \"core/Meshes/instancedMesh\";\r\nimport { EnumerateFloatValues } from \"core/Buffers/bufferUtils\";\r\nimport type { Node } from \"core/node\";\r\n\r\n// Matrix that converts handedness on the X-axis.\r\nconst convertHandednessMatrix = Matrix.Compose(new Vector3(-1, 1, 1), Quaternion.Identity(), Vector3.Zero());\r\n\r\n// 180 degrees rotation in Y.\r\nconst rotation180Y = new Quaternion(0, 1, 0, 0);\r\n\r\n// Default values for comparison.\r\nconst epsilon = 1e-6;\r\nconst defaultTranslation = Vector3.Zero();\r\nconst defaultScale = Vector3.One();\r\n\r\n/**\r\n * Creates a buffer view based on the supplied arguments\r\n * @param bufferIndex index value of the specified buffer\r\n * @param byteOffset byte offset value\r\n * @param byteLength byte length of the bufferView\r\n * @param byteStride byte distance between conequential elements\r\n * @returns bufferView for glTF\r\n */\r\nexport function CreateBufferView(bufferIndex: number, byteOffset: number, byteLength: number, byteStride?: number): IBufferView {\r\n const bufferview: IBufferView = { buffer: bufferIndex, byteLength: byteLength };\r\n\r\n if (byteOffset) {\r\n bufferview.byteOffset = byteOffset;\r\n }\r\n\r\n if (byteStride) {\r\n bufferview.byteStride = byteStride;\r\n }\r\n\r\n return bufferview;\r\n}\r\n\r\n/**\r\n * Creates an accessor based on the supplied arguments\r\n * @param bufferViewIndex The index of the bufferview referenced by this accessor\r\n * @param type The type of the accessor\r\n * @param componentType The datatype of components in the attribute\r\n * @param count The number of attributes referenced by this accessor\r\n * @param byteOffset The offset relative to the start of the bufferView in bytes\r\n * @param minMax Minimum and maximum value of each component in this attribute\r\n * @param normalized Specifies whether integer data values are normalized before usage\r\n * @returns accessor for glTF\r\n */\r\nexport function CreateAccessor(\r\n bufferViewIndex: number,\r\n type: AccessorType,\r\n componentType: AccessorComponentType,\r\n count: number,\r\n byteOffset: Nullable<number>,\r\n minMax: Nullable<{ min: number[]; max: number[] }> = null,\r\n normalized?: boolean\r\n): IAccessor {\r\n const accessor: IAccessor = { bufferView: bufferViewIndex, componentType: componentType, count: count, type: type };\r\n\r\n if (minMax != null) {\r\n accessor.min = minMax.min;\r\n accessor.max = minMax.max;\r\n }\r\n\r\n if (normalized) {\r\n accessor.normalized = normalized;\r\n }\r\n\r\n if (byteOffset != null) {\r\n accessor.byteOffset = byteOffset;\r\n }\r\n\r\n return accessor;\r\n}\r\n\r\nexport function GetAccessorElementCount(accessorType: AccessorType): number {\r\n switch (accessorType) {\r\n case AccessorType.MAT2:\r\n return 4;\r\n case AccessorType.MAT3:\r\n return 9;\r\n case AccessorType.MAT4:\r\n return 16;\r\n case AccessorType.SCALAR:\r\n return 1;\r\n case AccessorType.VEC2:\r\n return 2;\r\n case AccessorType.VEC3:\r\n return 3;\r\n case AccessorType.VEC4:\r\n return 4;\r\n }\r\n}\r\n\r\nexport function FloatsNeed16BitInteger(floatArray: FloatArray): boolean {\r\n return floatArray.some((value) => value >= 256);\r\n}\r\n\r\nexport function IsStandardVertexAttribute(type: string): boolean {\r\n switch (type) {\r\n case VertexBuffer.PositionKind:\r\n case VertexBuffer.NormalKind:\r\n case VertexBuffer.TangentKind:\r\n case VertexBuffer.ColorKind:\r\n case VertexBuffer.MatricesIndicesKind:\r\n case VertexBuffer.MatricesIndicesExtraKind:\r\n case VertexBuffer.MatricesWeightsKind:\r\n case VertexBuffer.MatricesWeightsExtraKind:\r\n case VertexBuffer.UVKind:\r\n case VertexBuffer.UV2Kind:\r\n case VertexBuffer.UV3Kind:\r\n case VertexBuffer.UV4Kind:\r\n case VertexBuffer.UV5Kind:\r\n case VertexBuffer.UV6Kind:\r\n return true;\r\n }\r\n return false;\r\n}\r\n\r\nexport function GetAccessorType(kind: string, hasVertexColorAlpha: boolean): AccessorType {\r\n if (kind == VertexBuffer.ColorKind) {\r\n return hasVertexColorAlpha ? AccessorType.VEC4 : AccessorType.VEC3;\r\n }\r\n\r\n switch (kind) {\r\n case VertexBuffer.PositionKind:\r\n case VertexBuffer.NormalKind:\r\n return AccessorType.VEC3;\r\n case VertexBuffer.TangentKind:\r\n case VertexBuffer.MatricesIndicesKind:\r\n case VertexBuffer.MatricesIndicesExtraKind:\r\n case VertexBuffer.MatricesWeightsKind:\r\n case VertexBuffer.MatricesWeightsExtraKind:\r\n return AccessorType.VEC4;\r\n case VertexBuffer.UVKind:\r\n case VertexBuffer.UV2Kind:\r\n case VertexBuffer.UV3Kind:\r\n case VertexBuffer.UV4Kind:\r\n case VertexBuffer.UV5Kind:\r\n case VertexBuffer.UV6Kind:\r\n return AccessorType.VEC2;\r\n }\r\n\r\n throw new Error(`Unknown kind ${kind}`);\r\n}\r\n\r\nexport function GetAttributeType(kind: string): string {\r\n switch (kind) {\r\n case VertexBuffer.PositionKind:\r\n return \"POSITION\";\r\n case VertexBuffer.NormalKind:\r\n return \"NORMAL\";\r\n case VertexBuffer.TangentKind:\r\n return \"TANGENT\";\r\n case VertexBuffer.ColorKind:\r\n return \"COLOR_0\";\r\n case VertexBuffer.UVKind:\r\n return \"TEXCOORD_0\";\r\n case VertexBuffer.UV2Kind:\r\n return \"TEXCOORD_1\";\r\n case VertexBuffer.UV3Kind:\r\n return \"TEXCOORD_2\";\r\n case VertexBuffer.UV4Kind:\r\n return \"TEXCOORD_3\";\r\n case VertexBuffer.UV5Kind:\r\n return \"TEXCOORD_4\";\r\n case VertexBuffer.UV6Kind:\r\n return \"TEXCOORD_5\";\r\n case VertexBuffer.MatricesIndicesKind:\r\n return \"JOINTS_0\";\r\n case VertexBuffer.MatricesIndicesExtraKind:\r\n return \"JOINTS_1\";\r\n case VertexBuffer.MatricesWeightsKind:\r\n return \"WEIGHTS_0\";\r\n case VertexBuffer.MatricesWeightsExtraKind:\r\n return \"WEIGHTS_1\";\r\n }\r\n\r\n throw new Error(`Unknown kind: ${kind}`);\r\n}\r\n\r\nexport function GetPrimitiveMode(fillMode: number): MeshPrimitiveMode {\r\n switch (fillMode) {\r\n case Material.TriangleFillMode:\r\n return MeshPrimitiveMode.TRIANGLES;\r\n case Material.TriangleStripDrawMode:\r\n return MeshPrimitiveMode.TRIANGLE_STRIP;\r\n case Material.TriangleFanDrawMode:\r\n return MeshPrimitiveMode.TRIANGLE_FAN;\r\n case Material.PointListDrawMode:\r\n case Material.PointFillMode:\r\n return MeshPrimitiveMode.POINTS;\r\n case Material.LineLoopDrawMode:\r\n return MeshPrimitiveMode.LINE_LOOP;\r\n case Material.LineListDrawMode:\r\n return MeshPrimitiveMode.LINES;\r\n case Material.LineStripDrawMode:\r\n return MeshPrimitiveMode.LINE_STRIP;\r\n }\r\n\r\n throw new Error(`Unknown fill mode: ${fillMode}`);\r\n}\r\n\r\nexport function IsTriangleFillMode(fillMode: number): boolean {\r\n switch (fillMode) {\r\n case Material.TriangleFillMode:\r\n case Material.TriangleStripDrawMode:\r\n case Material.TriangleFanDrawMode:\r\n return true;\r\n }\r\n\r\n return false;\r\n}\r\n\r\nexport function NormalizeTangent(tangent: Vector4 | Vector3) {\r\n const length = Math.sqrt(tangent.x * tangent.x + tangent.y * tangent.y + tangent.z * tangent.z);\r\n if (length > 0) {\r\n tangent.x /= length;\r\n tangent.y /= length;\r\n tangent.z /= length;\r\n }\r\n}\r\n\r\nexport function ConvertToRightHandedPosition(value: Vector3): Vector3 {\r\n value.x *= -1;\r\n return value;\r\n}\r\n\r\nexport function ConvertToRightHandedRotation(value: Quaternion): Quaternion {\r\n value.x *= -1;\r\n value.y *= -1;\r\n return value;\r\n}\r\n\r\nexport function ConvertToRightHandedNode(value: INode) {\r\n let translation = Vector3.FromArrayToRef(value.translation || [0, 0, 0], 0, TmpVectors.Vector3[0]);\r\n let rotation = Quaternion.FromArrayToRef(value.rotation || [0, 0, 0, 1], 0, TmpVectors.Quaternion[0]);\r\n\r\n translation = ConvertToRightHandedPosition(translation);\r\n rotation = ConvertToRightHandedRotation(rotation);\r\n\r\n if (translation.equalsWithEpsilon(defaultTranslation, epsilon)) {\r\n delete value.translation;\r\n } else {\r\n value.translation = translation.asArray();\r\n }\r\n\r\n if (Quaternion.IsIdentity(rotation)) {\r\n delete value.rotation;\r\n } else {\r\n value.rotation = rotation.asArray();\r\n }\r\n}\r\n\r\n/**\r\n * Rotation by 180 as glTF has a different convention than Babylon.\r\n * @param rotation Target camera rotation.\r\n * @returns Ref to camera rotation.\r\n */\r\nexport function ConvertCameraRotationToGLTF(rotation: Quaternion): Quaternion {\r\n return rotation.multiplyInPlace(rotation180Y);\r\n}\r\n\r\nexport function RotateNode180Y(node: INode) {\r\n if (node.rotation) {\r\n const rotation = Quaternion.FromArrayToRef(node.rotation || [0, 0, 0, 1], 0, TmpVectors.Quaternion[1]);\r\n rotation180Y.multiplyToRef(rotation, rotation);\r\n node.rotation = rotation.asArray();\r\n }\r\n}\r\n\r\n/**\r\n * Collapses GLTF parent and node into a single node. This is useful for removing nodes that were added by the GLTF importer.\r\n * @param node Target parent node.\r\n * @param parentNode Original GLTF node (Light or Camera).\r\n */\r\nexport function CollapseParentNode(node: INode, parentNode: INode) {\r\n const parentTranslation = Vector3.FromArrayToRef(parentNode.translation || [0, 0, 0], 0, TmpVectors.Vector3[0]);\r\n const parentRotation = Quaternion.FromArrayToRef(parentNode.rotation || [0, 0, 0, 1], 0, TmpVectors.Quaternion[0]);\r\n const parentScale = Vector3.FromArrayToRef(parentNode.scale || [1, 1, 1], 0, TmpVectors.Vector3[1]);\r\n const parentMatrix = Matrix.ComposeToRef(parentScale, parentRotation, parentTranslation, TmpVectors.Matrix[0]);\r\n\r\n const translation = Vector3.FromArrayToRef(node.translation || [0, 0, 0], 0, TmpVectors.Vector3[2]);\r\n const rotation = Quaternion.FromArrayToRef(node.rotation || [0, 0, 0, 1], 0, TmpVectors.Quaternion[1]);\r\n const scale = Vector3.FromArrayToRef(node.scale || [1, 1, 1], 0, TmpVectors.Vector3[1]);\r\n const matrix = Matrix.ComposeToRef(scale, rotation, translation, TmpVectors.Matrix[1]);\r\n\r\n parentMatrix.multiplyToRef(matrix, matrix);\r\n matrix.decompose(parentScale, parentRotation, parentTranslation);\r\n\r\n if (parentTranslation.equalsWithEpsilon(defaultTranslation, epsilon)) {\r\n delete parentNode.translation;\r\n } else {\r\n parentNode.translation = parentTranslation.asArray();\r\n }\r\n\r\n if (Quaternion.IsIdentity(parentRotation)) {\r\n delete parentNode.rotation;\r\n } else {\r\n parentNode.rotation = parentRotation.asArray();\r\n }\r\n\r\n if (parentScale.equalsWithEpsilon(defaultScale, epsilon)) {\r\n delete parentNode.scale;\r\n } else {\r\n parentNode.scale = parentScale.asArray();\r\n }\r\n}\r\n\r\n/**\r\n * Sometimes the GLTF Importer can add extra transform nodes (for lights and cameras). This checks if a parent node was added by the GLTF Importer. If so, it should be removed during serialization.\r\n * @param babylonNode Original GLTF node (Light or Camera).\r\n * @param parentBabylonNode Target parent node.\r\n * @returns True if the parent node was added by the GLTF importer.\r\n */\r\nexport function IsParentAddedByImporter(babylonNode: Node, parentBabylonNode: Node): boolean {\r\n return parentBabylonNode instanceof TransformNode && parentBabylonNode.getChildren().length == 1 && babylonNode.getChildren().length == 0;\r\n}\r\n\r\nexport function IsNoopNode(node: Node, useRightHandedSystem: boolean): boolean {\r\n if (!(node instanceof TransformNode)) {\r\n return false;\r\n }\r\n\r\n // Transform\r\n if (useRightHandedSystem) {\r\n const matrix = node.getWorldMatrix();\r\n if (!matrix.isIdentity()) {\r\n return false;\r\n }\r\n } else {\r\n const matrix = node.getWorldMatrix().multiplyToRef(convertHandednessMatrix, TmpVectors.Matrix[0]);\r\n if (!matrix.isIdentity()) {\r\n return false;\r\n }\r\n }\r\n\r\n // Geometry\r\n if ((node instanceof Mesh && node.geometry) || (node instanceof InstancedMesh && node.sourceMesh.geometry)) {\r\n return false;\r\n }\r\n\r\n return true;\r\n}\r\n\r\nexport function AreIndices32Bits(indices: Nullable<IndicesArray>, count: number): boolean {\r\n if (indices) {\r\n if (indices instanceof Array) {\r\n return indices.some((value) => value >= 65536);\r\n }\r\n\r\n return indices.BYTES_PER_ELEMENT === 4;\r\n }\r\n\r\n return count >= 65536;\r\n}\r\n\r\nexport function IndicesArrayToUint8Array(indices: IndicesArray, start: number, count: number, is32Bits: boolean): Uint8Array {\r\n if (indices instanceof Array) {\r\n const subarray = indices.slice(start, start + count);\r\n indices = is32Bits ? new Uint32Array(subarray) : new Uint16Array(subarray);\r\n return new Uint8Array(indices.buffer, indices.byteOffset, indices.byteLength);\r\n }\r\n\r\n return ArrayBuffer.isView(indices) ? new Uint8Array(indices.buffer, indices.byteOffset, indices.byteLength) : new Uint8Array(indices);\r\n}\r\n\r\nexport function DataArrayToUint8Array(data: DataArray): Uint8Array {\r\n if (data instanceof Array) {\r\n const floatData = new Float32Array(data);\r\n return new Uint8Array(floatData.buffer, floatData.byteOffset, floatData.byteLength);\r\n }\r\n\r\n return ArrayBuffer.isView(data) ? new Uint8Array(data.buffer, data.byteOffset, data.byteLength) : new Uint8Array(data);\r\n}\r\n\r\nexport function GetMinMax(data: DataArray, vertexBuffer: VertexBuffer, start: number, count: number): { min: number[]; max: number[] } {\r\n const { byteOffset, byteStride, type, normalized } = vertexBuffer;\r\n const size = vertexBuffer.getSize();\r\n const min = new Array<number>(size).fill(Infinity);\r\n const max = new Array<number>(size).fill(-Infinity);\r\n EnumerateFloatValues(data, byteOffset + start * byteStride, byteStride, size, type, count * size, normalized, (values) => {\r\n for (let i = 0; i < size; i++) {\r\n min[i] = Math.min(min[i], values[i]);\r\n max[i] = Math.max(max[i], values[i]);\r\n }\r\n });\r\n\r\n return { min, max };\r\n}\r\n\r\n/**\r\n * Removes, in-place, object properties which have the same value as the default value.\r\n * Useful for avoiding unnecessary properties in the glTF JSON.\r\n * @param object the object to omit default values from\r\n * @param defaultValues a partial object with default values\r\n * @returns object with default values omitted\r\n */\r\nexport function OmitDefaultValues<T extends Object>(object: T, defaultValues: Partial<T>): T {\r\n for (const [key, value] of Object.entries(object)) {\r\n const defaultValue = defaultValues[key as keyof T];\r\n if ((Array.isArray(value) && Array.isArray(defaultValue) && AreArraysEqual(value, defaultValue)) || value === defaultValue) {\r\n delete object[key as keyof T];\r\n }\r\n }\r\n return object;\r\n}\r\n\r\nfunction AreArraysEqual(array1: unknown[], array2: unknown[]): boolean {\r\n return array1.length === array2.length && array1.every((val, i) => val === array2[i]);\r\n}\r\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@babylonjs/serializers",
3
- "version": "7.37.0",
3
+ "version": "7.37.2",
4
4
  "main": "index.js",
5
5
  "module": "index.js",
6
6
  "types": "index.d.ts",
@@ -18,10 +18,10 @@
18
18
  "postcompile": "build-tools -c add-js-to-es6"
19
19
  },
20
20
  "devDependencies": {
21
- "@babylonjs/core": "^7.37.0",
21
+ "@babylonjs/core": "^7.37.2",
22
22
  "@dev/build-tools": "^1.0.0",
23
23
  "@lts/serializers": "^1.0.0",
24
- "babylonjs-gltf2interface": "^7.37.0"
24
+ "babylonjs-gltf2interface": "^7.37.2"
25
25
  },
26
26
  "peerDependencies": {
27
27
  "@babylonjs/core": "^7.0.0",