@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.
- package/glTF/2.0/Extensions/EXT_mesh_gpu_instancing.d.ts +6 -7
- package/glTF/2.0/Extensions/EXT_mesh_gpu_instancing.js +18 -12
- package/glTF/2.0/Extensions/EXT_mesh_gpu_instancing.js.map +1 -1
- package/glTF/2.0/Extensions/KHR_lights_punctual.d.ts +5 -6
- package/glTF/2.0/Extensions/KHR_lights_punctual.js +99 -109
- package/glTF/2.0/Extensions/KHR_lights_punctual.js.map +1 -1
- package/glTF/2.0/Extensions/KHR_materials_anisotropy.d.ts +2 -2
- package/glTF/2.0/Extensions/KHR_materials_anisotropy.js +6 -6
- package/glTF/2.0/Extensions/KHR_materials_anisotropy.js.map +1 -1
- package/glTF/2.0/Extensions/KHR_materials_clearcoat.d.ts +2 -2
- package/glTF/2.0/Extensions/KHR_materials_clearcoat.js +9 -9
- package/glTF/2.0/Extensions/KHR_materials_clearcoat.js.map +1 -1
- package/glTF/2.0/Extensions/KHR_materials_diffuse_transmission.d.ts +2 -2
- package/glTF/2.0/Extensions/KHR_materials_diffuse_transmission.js +7 -7
- package/glTF/2.0/Extensions/KHR_materials_diffuse_transmission.js.map +1 -1
- package/glTF/2.0/Extensions/KHR_materials_dispersion.js +2 -2
- package/glTF/2.0/Extensions/KHR_materials_dispersion.js.map +1 -1
- package/glTF/2.0/Extensions/KHR_materials_emissive_strength.js +2 -2
- package/glTF/2.0/Extensions/KHR_materials_emissive_strength.js.map +1 -1
- package/glTF/2.0/Extensions/KHR_materials_ior.js +2 -2
- package/glTF/2.0/Extensions/KHR_materials_ior.js.map +1 -1
- package/glTF/2.0/Extensions/KHR_materials_iridescence.d.ts +2 -2
- package/glTF/2.0/Extensions/KHR_materials_iridescence.js +7 -7
- package/glTF/2.0/Extensions/KHR_materials_iridescence.js.map +1 -1
- package/glTF/2.0/Extensions/KHR_materials_sheen.d.ts +2 -2
- package/glTF/2.0/Extensions/KHR_materials_sheen.js +8 -8
- package/glTF/2.0/Extensions/KHR_materials_sheen.js.map +1 -1
- package/glTF/2.0/Extensions/KHR_materials_specular.d.ts +2 -2
- package/glTF/2.0/Extensions/KHR_materials_specular.js +7 -7
- package/glTF/2.0/Extensions/KHR_materials_specular.js.map +1 -1
- package/glTF/2.0/Extensions/KHR_materials_transmission.d.ts +2 -2
- package/glTF/2.0/Extensions/KHR_materials_transmission.js +6 -6
- package/glTF/2.0/Extensions/KHR_materials_transmission.js.map +1 -1
- package/glTF/2.0/Extensions/KHR_materials_unlit.js +2 -2
- package/glTF/2.0/Extensions/KHR_materials_unlit.js.map +1 -1
- package/glTF/2.0/Extensions/KHR_materials_volume.d.ts +2 -2
- package/glTF/2.0/Extensions/KHR_materials_volume.js +6 -6
- package/glTF/2.0/Extensions/KHR_materials_volume.js.map +1 -1
- package/glTF/2.0/Extensions/KHR_texture_transform.js +2 -2
- package/glTF/2.0/Extensions/KHR_texture_transform.js.map +1 -1
- package/glTF/2.0/Extensions/index.d.ts +9 -9
- package/glTF/2.0/Extensions/index.js +9 -9
- package/glTF/2.0/Extensions/index.js.map +1 -1
- package/glTF/2.0/dataWriter.d.ts +18 -0
- package/glTF/2.0/dataWriter.js +65 -0
- package/glTF/2.0/dataWriter.js.map +1 -0
- package/glTF/2.0/glTFAnimation.d.ts +4 -10
- package/glTF/2.0/glTFAnimation.js +87 -19
- package/glTF/2.0/glTFAnimation.js.map +1 -1
- package/glTF/2.0/glTFData.d.ts +5 -3
- package/glTF/2.0/glTFData.js +35 -36
- package/glTF/2.0/glTFData.js.map +1 -1
- package/glTF/2.0/glTFExporter.d.ts +62 -363
- package/glTF/2.0/glTFExporter.js +867 -1579
- package/glTF/2.0/glTFExporter.js.map +1 -1
- package/glTF/2.0/glTFExporterExtension.d.ts +8 -9
- package/glTF/2.0/glTFExporterExtension.js.map +1 -1
- package/glTF/2.0/glTFMaterialExporter.d.ts +26 -126
- package/glTF/2.0/glTFMaterialExporter.js +276 -438
- package/glTF/2.0/glTFMaterialExporter.js.map +1 -1
- package/glTF/2.0/glTFMorphTargetsUtilities.d.ts +14 -0
- package/glTF/2.0/glTFMorphTargetsUtilities.js +105 -0
- package/glTF/2.0/glTFMorphTargetsUtilities.js.map +1 -0
- package/glTF/2.0/glTFSerializer.d.ts +10 -13
- package/glTF/2.0/glTFSerializer.js +25 -44
- package/glTF/2.0/glTFSerializer.js.map +1 -1
- package/glTF/2.0/glTFUtilities.d.ts +75 -43
- package/glTF/2.0/glTFUtilities.js +350 -103
- package/glTF/2.0/glTFUtilities.js.map +1 -1
- package/package.json +3 -3
@@ -1,113 +1,360 @@
|
|
1
|
-
|
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
|
-
*
|
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
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
}
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
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
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
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
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
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
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
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.
|
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.
|
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.
|
24
|
+
"babylonjs-gltf2interface": "^7.37.2"
|
25
25
|
},
|
26
26
|
"peerDependencies": {
|
27
27
|
"@babylonjs/core": "^7.0.0",
|