@luma.gl/gltf 9.2.6 → 9.3.0-alpha.10
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/dist/dist.dev.js +1362 -313
- package/dist/dist.min.js +98 -46
- package/dist/gltf/animations/animations.d.ts +16 -4
- package/dist/gltf/animations/animations.d.ts.map +1 -1
- package/dist/gltf/animations/interpolate.d.ts +4 -3
- package/dist/gltf/animations/interpolate.d.ts.map +1 -1
- package/dist/gltf/animations/interpolate.js +27 -36
- package/dist/gltf/animations/interpolate.js.map +1 -1
- package/dist/gltf/create-gltf-model.d.ts +15 -1
- package/dist/gltf/create-gltf-model.d.ts.map +1 -1
- package/dist/gltf/create-gltf-model.js +154 -48
- package/dist/gltf/create-gltf-model.js.map +1 -1
- package/dist/gltf/create-scenegraph-from-gltf.d.ts +39 -2
- package/dist/gltf/create-scenegraph-from-gltf.d.ts.map +1 -1
- package/dist/gltf/create-scenegraph-from-gltf.js +76 -6
- package/dist/gltf/create-scenegraph-from-gltf.js.map +1 -1
- package/dist/gltf/gltf-animator.d.ts +26 -0
- package/dist/gltf/gltf-animator.d.ts.map +1 -1
- package/dist/gltf/gltf-animator.js +22 -19
- package/dist/gltf/gltf-animator.js.map +1 -1
- package/dist/gltf/gltf-extension-support.d.ts +10 -0
- package/dist/gltf/gltf-extension-support.d.ts.map +1 -0
- package/dist/gltf/gltf-extension-support.js +173 -0
- package/dist/gltf/gltf-extension-support.js.map +1 -0
- package/dist/index.cjs +1302 -276
- package/dist/index.cjs.map +4 -4
- package/dist/index.d.ts +3 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/parsers/parse-gltf-animations.d.ts +1 -0
- package/dist/parsers/parse-gltf-animations.d.ts.map +1 -1
- package/dist/parsers/parse-gltf-animations.js +73 -28
- package/dist/parsers/parse-gltf-animations.js.map +1 -1
- package/dist/parsers/parse-gltf-lights.d.ts +5 -0
- package/dist/parsers/parse-gltf-lights.d.ts.map +1 -0
- package/dist/parsers/parse-gltf-lights.js +163 -0
- package/dist/parsers/parse-gltf-lights.js.map +1 -0
- package/dist/parsers/parse-gltf.d.ts +19 -2
- package/dist/parsers/parse-gltf.d.ts.map +1 -1
- package/dist/parsers/parse-gltf.js +101 -61
- package/dist/parsers/parse-gltf.js.map +1 -1
- package/dist/parsers/parse-pbr-material.d.ts +115 -2
- package/dist/parsers/parse-pbr-material.d.ts.map +1 -1
- package/dist/parsers/parse-pbr-material.js +570 -54
- package/dist/parsers/parse-pbr-material.js.map +1 -1
- package/dist/pbr/pbr-environment.d.ts +10 -4
- package/dist/pbr/pbr-environment.d.ts.map +1 -1
- package/dist/pbr/pbr-environment.js +18 -15
- package/dist/pbr/pbr-environment.js.map +1 -1
- package/dist/pbr/pbr-material.d.ts +13 -3
- package/dist/pbr/pbr-material.d.ts.map +1 -1
- package/dist/webgl-to-webgpu/convert-webgl-attribute.d.ts +12 -1
- package/dist/webgl-to-webgpu/convert-webgl-attribute.d.ts.map +1 -1
- package/dist/webgl-to-webgpu/convert-webgl-attribute.js +3 -0
- package/dist/webgl-to-webgpu/convert-webgl-attribute.js.map +1 -1
- package/dist/webgl-to-webgpu/convert-webgl-sampler.d.ts +11 -5
- package/dist/webgl-to-webgpu/convert-webgl-sampler.d.ts.map +1 -1
- package/dist/webgl-to-webgpu/convert-webgl-sampler.js +16 -12
- package/dist/webgl-to-webgpu/convert-webgl-sampler.js.map +1 -1
- package/dist/webgl-to-webgpu/convert-webgl-topology.d.ts +2 -9
- package/dist/webgl-to-webgpu/convert-webgl-topology.d.ts.map +1 -1
- package/dist/webgl-to-webgpu/convert-webgl-topology.js +2 -14
- package/dist/webgl-to-webgpu/convert-webgl-topology.js.map +1 -1
- package/dist/webgl-to-webgpu/gltf-webgl-constants.d.ts +27 -0
- package/dist/webgl-to-webgpu/gltf-webgl-constants.d.ts.map +1 -0
- package/dist/webgl-to-webgpu/gltf-webgl-constants.js +34 -0
- package/dist/webgl-to-webgpu/gltf-webgl-constants.js.map +1 -0
- package/package.json +8 -9
- package/src/gltf/animations/animations.ts +17 -5
- package/src/gltf/animations/interpolate.ts +49 -68
- package/src/gltf/create-gltf-model.ts +214 -48
- package/src/gltf/create-scenegraph-from-gltf.ts +134 -11
- package/src/gltf/gltf-animator.ts +34 -25
- package/src/gltf/gltf-extension-support.ts +214 -0
- package/src/index.ts +11 -2
- package/src/parsers/parse-gltf-animations.ts +94 -33
- package/src/parsers/parse-gltf-lights.ts +218 -0
- package/src/parsers/parse-gltf.ts +170 -90
- package/src/parsers/parse-pbr-material.ts +870 -80
- package/src/pbr/pbr-environment.ts +44 -21
- package/src/pbr/pbr-material.ts +18 -3
- package/src/webgl-to-webgpu/convert-webgl-attribute.ts +12 -1
- package/src/webgl-to-webgpu/convert-webgl-sampler.ts +38 -29
- package/src/webgl-to-webgpu/convert-webgl-topology.ts +2 -14
- package/src/webgl-to-webgpu/gltf-webgl-constants.ts +35 -0
- package/dist/utils/deep-copy.d.ts +0 -3
- package/dist/utils/deep-copy.d.ts.map +0 -1
- package/dist/utils/deep-copy.js +0 -21
- package/dist/utils/deep-copy.js.map +0 -1
- package/src/utils/deep-copy.ts +0 -22
|
@@ -1,40 +1,85 @@
|
|
|
1
1
|
// luma.gl
|
|
2
2
|
// SPDX-License-Identifier: MIT
|
|
3
3
|
// Copyright (c) vis.gl contributors
|
|
4
|
+
import { log } from '@luma.gl/core';
|
|
4
5
|
import { accessorToTypedArray } from "..//webgl-to-webgpu/convert-webgl-attribute.js";
|
|
6
|
+
/** Parses glTF animation records into the runtime animation model used by `GLTFAnimator`. */
|
|
5
7
|
export function parseGLTFAnimations(gltf) {
|
|
6
8
|
const gltfAnimations = gltf.animations || [];
|
|
7
|
-
|
|
9
|
+
const accessorCache1D = new Map();
|
|
10
|
+
const accessorCache2D = new Map();
|
|
11
|
+
return gltfAnimations.flatMap((animation, index) => {
|
|
8
12
|
const name = animation.name || `Animation-${index}`;
|
|
9
|
-
const
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
13
|
+
const samplerCache = new Map();
|
|
14
|
+
const channels = animation.channels.flatMap(({ sampler, target }) => {
|
|
15
|
+
const path = getSupportedAnimationPath(target.path);
|
|
16
|
+
if (!path) {
|
|
17
|
+
return [];
|
|
18
|
+
}
|
|
19
|
+
const targetNode = gltf.nodes[target.node ?? 0];
|
|
20
|
+
if (!targetNode) {
|
|
21
|
+
throw new Error(`Cannot find animation target ${target.node}`);
|
|
22
|
+
}
|
|
23
|
+
let parsedSampler = samplerCache.get(sampler);
|
|
24
|
+
if (!parsedSampler) {
|
|
25
|
+
const gltfSampler = animation.samplers[sampler];
|
|
26
|
+
if (!gltfSampler) {
|
|
27
|
+
throw new Error(`Cannot find animation sampler ${sampler}`);
|
|
28
|
+
}
|
|
29
|
+
const { input, interpolation = 'LINEAR', output } = gltfSampler;
|
|
30
|
+
parsedSampler = {
|
|
31
|
+
input: accessorToJsArray1D(gltf.accessors[input], accessorCache1D),
|
|
32
|
+
interpolation,
|
|
33
|
+
output: accessorToJsArray2D(gltf.accessors[output], accessorCache2D)
|
|
34
|
+
};
|
|
35
|
+
samplerCache.set(sampler, parsedSampler);
|
|
36
|
+
}
|
|
37
|
+
return {
|
|
38
|
+
sampler: parsedSampler,
|
|
39
|
+
targetNodeId: targetNode.id,
|
|
40
|
+
path
|
|
41
|
+
};
|
|
42
|
+
});
|
|
43
|
+
return channels.length ? [{ name, channels }] : [];
|
|
20
44
|
});
|
|
21
45
|
}
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
46
|
+
function getSupportedAnimationPath(path) {
|
|
47
|
+
if (path === 'pointer') {
|
|
48
|
+
log.warn('KHR_animation_pointer channels are not supported and will be skipped')();
|
|
49
|
+
return null;
|
|
50
|
+
}
|
|
51
|
+
return path;
|
|
52
|
+
}
|
|
53
|
+
/** Converts a scalar accessor into a cached JavaScript number array. */
|
|
54
|
+
function accessorToJsArray1D(accessor, accessorCache) {
|
|
55
|
+
if (accessorCache.has(accessor)) {
|
|
56
|
+
return accessorCache.get(accessor);
|
|
57
|
+
}
|
|
58
|
+
const { typedArray: array, components } = accessorToTypedArray(accessor);
|
|
59
|
+
assert(components === 1, 'accessorToJsArray1D must have exactly 1 component');
|
|
60
|
+
const result = Array.from(array);
|
|
61
|
+
accessorCache.set(accessor, result);
|
|
62
|
+
return result;
|
|
63
|
+
}
|
|
64
|
+
/** Converts a scalar, vector, or matrix accessor into a cached JavaScript array-of-arrays. */
|
|
65
|
+
function accessorToJsArray2D(accessor, accessorCache) {
|
|
66
|
+
if (accessorCache.has(accessor)) {
|
|
67
|
+
return accessorCache.get(accessor);
|
|
68
|
+
}
|
|
69
|
+
const { typedArray: array, components } = accessorToTypedArray(accessor);
|
|
70
|
+
assert(components >= 1, 'accessorToJsArray2D must have at least 1 component');
|
|
71
|
+
const result = [];
|
|
72
|
+
// Slice array
|
|
73
|
+
for (let i = 0; i < array.length; i += components) {
|
|
74
|
+
result.push(Array.from(array.slice(i, i + components)));
|
|
75
|
+
}
|
|
76
|
+
accessorCache.set(accessor, result);
|
|
77
|
+
return result;
|
|
78
|
+
}
|
|
79
|
+
/** Throws when the supplied condition is false. */
|
|
80
|
+
function assert(condition, message) {
|
|
81
|
+
if (!condition) {
|
|
82
|
+
throw new Error(message);
|
|
37
83
|
}
|
|
38
|
-
return accessor._animation;
|
|
39
84
|
}
|
|
40
85
|
//# sourceMappingURL=parse-gltf-animations.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"parse-gltf-animations.js","sourceRoot":"","sources":["../../src/parsers/parse-gltf-animations.ts"],"names":[],"mappings":"AAAA,UAAU;AACV,+BAA+B;AAC/B,oCAAoC;
|
|
1
|
+
{"version":3,"file":"parse-gltf-animations.js","sourceRoot":"","sources":["../../src/parsers/parse-gltf-animations.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { GLTFPostprocessed } from '@loaders.gl/gltf';
|
|
2
|
+
import type { Light } from '@luma.gl/shadertools';
|
|
3
|
+
/** Parse KHR_lights_punctual extension into luma.gl light definitions */
|
|
4
|
+
export declare function parseGLTFLights(gltf: GLTFPostprocessed): Light[];
|
|
5
|
+
//# sourceMappingURL=parse-gltf-lights.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parse-gltf-lights.d.ts","sourceRoot":"","sources":["../../src/parsers/parse-gltf-lights.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAwB,iBAAiB,EAAC,MAAM,kBAAkB,CAAC;AAC/E,OAAO,KAAK,EAAmB,KAAK,EAAwB,MAAM,sBAAsB,CAAC;AAIzF,yEAAyE;AACzE,wBAAgB,eAAe,CAAC,IAAI,EAAE,iBAAiB,GAAG,KAAK,EAAE,CAmDhE"}
|
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
import { Matrix4 } from '@math.gl/core';
|
|
2
|
+
const GLTF_COLOR_FACTOR = 255;
|
|
3
|
+
/** Parse KHR_lights_punctual extension into luma.gl light definitions */
|
|
4
|
+
export function parseGLTFLights(gltf) {
|
|
5
|
+
const lightDefs =
|
|
6
|
+
// `postProcessGLTF()` moves KHR_lights_punctual into `gltf.lights`.
|
|
7
|
+
gltf.lights ||
|
|
8
|
+
gltf.extensions?.['KHR_lights_punctual']?.['lights'];
|
|
9
|
+
if (!lightDefs || !Array.isArray(lightDefs) || lightDefs.length === 0) {
|
|
10
|
+
return [];
|
|
11
|
+
}
|
|
12
|
+
const lights = [];
|
|
13
|
+
const parentNodeById = createParentNodeMap(gltf.nodes || []);
|
|
14
|
+
const worldMatrixByNodeId = new Map();
|
|
15
|
+
for (const node of gltf.nodes || []) {
|
|
16
|
+
const lightIndex = node.light ??
|
|
17
|
+
node.extensions?.KHR_lights_punctual?.light;
|
|
18
|
+
if (typeof lightIndex !== 'number') {
|
|
19
|
+
// eslint-disable-next-line no-continue
|
|
20
|
+
continue;
|
|
21
|
+
}
|
|
22
|
+
const gltfLight = lightDefs[lightIndex];
|
|
23
|
+
if (!gltfLight) {
|
|
24
|
+
// eslint-disable-next-line no-continue
|
|
25
|
+
continue;
|
|
26
|
+
}
|
|
27
|
+
const color = normalizeGLTFLightColor((gltfLight.color || [1, 1, 1]));
|
|
28
|
+
const intensity = gltfLight.intensity ?? 1;
|
|
29
|
+
const range = gltfLight.range;
|
|
30
|
+
const worldMatrix = getNodeWorldMatrix(node, parentNodeById, worldMatrixByNodeId);
|
|
31
|
+
switch (gltfLight.type) {
|
|
32
|
+
case 'directional':
|
|
33
|
+
lights.push(parseDirectionalLight(worldMatrix, color, intensity));
|
|
34
|
+
break;
|
|
35
|
+
case 'point':
|
|
36
|
+
lights.push(parsePointLight(worldMatrix, color, intensity, range));
|
|
37
|
+
break;
|
|
38
|
+
case 'spot':
|
|
39
|
+
lights.push(parseSpotLight(worldMatrix, color, intensity, range, gltfLight.spot));
|
|
40
|
+
break;
|
|
41
|
+
default:
|
|
42
|
+
// Unsupported light type
|
|
43
|
+
break;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
return lights;
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Converts glTF colors from the 0-1 spec range to luma.gl's 0-255 light convention.
|
|
50
|
+
*/
|
|
51
|
+
function normalizeGLTFLightColor(color) {
|
|
52
|
+
return color.map(component => component * GLTF_COLOR_FACTOR);
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Converts a glTF punctual light attached to a node into a point light.
|
|
56
|
+
*/
|
|
57
|
+
function parsePointLight(worldMatrix, color, intensity, range) {
|
|
58
|
+
const position = getLightPosition(worldMatrix);
|
|
59
|
+
let attenuation = [1, 0, 0];
|
|
60
|
+
if (range !== undefined && range > 0) {
|
|
61
|
+
attenuation = [1, 0, 1 / (range * range)];
|
|
62
|
+
}
|
|
63
|
+
return {
|
|
64
|
+
type: 'point',
|
|
65
|
+
position,
|
|
66
|
+
color,
|
|
67
|
+
intensity,
|
|
68
|
+
attenuation
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Converts a glTF punctual light attached to a node into a directional light.
|
|
73
|
+
*/
|
|
74
|
+
function parseDirectionalLight(worldMatrix, color, intensity) {
|
|
75
|
+
const direction = getLightDirection(worldMatrix);
|
|
76
|
+
return {
|
|
77
|
+
type: 'directional',
|
|
78
|
+
direction,
|
|
79
|
+
color,
|
|
80
|
+
intensity
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Converts a glTF punctual light attached to a node into a spot light.
|
|
85
|
+
*/
|
|
86
|
+
function parseSpotLight(worldMatrix, color, intensity, range, spot = {}) {
|
|
87
|
+
const position = getLightPosition(worldMatrix);
|
|
88
|
+
const direction = getLightDirection(worldMatrix);
|
|
89
|
+
let attenuation = [1, 0, 0];
|
|
90
|
+
if (range !== undefined && range > 0) {
|
|
91
|
+
attenuation = [1, 0, 1 / (range * range)];
|
|
92
|
+
}
|
|
93
|
+
return {
|
|
94
|
+
type: 'spot',
|
|
95
|
+
position,
|
|
96
|
+
direction,
|
|
97
|
+
color,
|
|
98
|
+
intensity,
|
|
99
|
+
attenuation,
|
|
100
|
+
innerConeAngle: spot.innerConeAngle ?? 0,
|
|
101
|
+
outerConeAngle: spot.outerConeAngle ?? Math.PI / 4
|
|
102
|
+
};
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* Builds a parent lookup so punctual lights can be resolved in world space.
|
|
106
|
+
*/
|
|
107
|
+
function createParentNodeMap(nodes) {
|
|
108
|
+
const parentNodeById = new Map();
|
|
109
|
+
for (const node of nodes) {
|
|
110
|
+
for (const childNode of node.children || []) {
|
|
111
|
+
parentNodeById.set(childNode.id, node);
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
return parentNodeById;
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* Resolves a glTF node's world matrix from its local transform and parent chain.
|
|
118
|
+
*/
|
|
119
|
+
function getNodeWorldMatrix(node, parentNodeById, worldMatrixByNodeId) {
|
|
120
|
+
const cachedWorldMatrix = worldMatrixByNodeId.get(node.id);
|
|
121
|
+
if (cachedWorldMatrix) {
|
|
122
|
+
return cachedWorldMatrix;
|
|
123
|
+
}
|
|
124
|
+
const localMatrix = getNodeLocalMatrix(node);
|
|
125
|
+
const parentNode = parentNodeById.get(node.id);
|
|
126
|
+
const worldMatrix = parentNode
|
|
127
|
+
? new Matrix4(getNodeWorldMatrix(parentNode, parentNodeById, worldMatrixByNodeId)).multiplyRight(localMatrix)
|
|
128
|
+
: localMatrix;
|
|
129
|
+
worldMatrixByNodeId.set(node.id, worldMatrix);
|
|
130
|
+
return worldMatrix;
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* Resolves a glTF node's local matrix from its matrix or TRS components.
|
|
134
|
+
*/
|
|
135
|
+
function getNodeLocalMatrix(node) {
|
|
136
|
+
if (node.matrix) {
|
|
137
|
+
return new Matrix4(node.matrix);
|
|
138
|
+
}
|
|
139
|
+
const matrix = new Matrix4();
|
|
140
|
+
if (node.translation) {
|
|
141
|
+
matrix.translate(node.translation);
|
|
142
|
+
}
|
|
143
|
+
if (node.rotation) {
|
|
144
|
+
matrix.multiplyRight(new Matrix4().fromQuaternion(node.rotation));
|
|
145
|
+
}
|
|
146
|
+
if (node.scale) {
|
|
147
|
+
matrix.scale(node.scale);
|
|
148
|
+
}
|
|
149
|
+
return matrix;
|
|
150
|
+
}
|
|
151
|
+
/**
|
|
152
|
+
* Resolves the world-space position of a glTF light node.
|
|
153
|
+
*/
|
|
154
|
+
function getLightPosition(worldMatrix) {
|
|
155
|
+
return worldMatrix.transformAsPoint([0, 0, 0]);
|
|
156
|
+
}
|
|
157
|
+
/**
|
|
158
|
+
* Resolves the world-space forward direction of a glTF light node.
|
|
159
|
+
*/
|
|
160
|
+
function getLightDirection(worldMatrix) {
|
|
161
|
+
return worldMatrix.transformDirection([0, 0, -1]);
|
|
162
|
+
}
|
|
163
|
+
//# sourceMappingURL=parse-gltf-lights.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parse-gltf-lights.js","sourceRoot":"","sources":["../../src/parsers/parse-gltf-lights.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,17 +1,34 @@
|
|
|
1
1
|
import { Device } from '@luma.gl/core';
|
|
2
|
-
import { GroupNode, type ModelProps } from '@luma.gl/engine';
|
|
2
|
+
import { GroupNode, Material, type ModelProps } from '@luma.gl/engine';
|
|
3
3
|
import { type GLTFPostprocessed } from '@loaders.gl/gltf';
|
|
4
4
|
import { type PBREnvironment } from "../pbr/pbr-environment.js";
|
|
5
|
+
/** Options that influence how a post-processed glTF is turned into a luma.gl scenegraph. */
|
|
5
6
|
export type ParseGLTFOptions = {
|
|
7
|
+
/** Additional model props applied to each generated primitive model. */
|
|
6
8
|
modelOptions?: Partial<ModelProps>;
|
|
9
|
+
/** Enables shader-level PBR debug output. */
|
|
7
10
|
pbrDebug?: boolean;
|
|
11
|
+
/** Optional image-based lighting environment. */
|
|
8
12
|
imageBasedLightingEnvironment?: PBREnvironment;
|
|
13
|
+
/** Enables punctual light extraction. */
|
|
9
14
|
lights?: boolean;
|
|
15
|
+
/** Enables tangent usage when available. */
|
|
10
16
|
useTangents?: boolean;
|
|
11
17
|
};
|
|
12
18
|
/**
|
|
13
19
|
* GLTF instantiator for luma.gl
|
|
14
20
|
* Walks the parsed and resolved glTF structure and builds a luma.gl scenegraph
|
|
15
21
|
*/
|
|
16
|
-
export declare function parseGLTF(device: Device, gltf: GLTFPostprocessed,
|
|
22
|
+
export declare function parseGLTF(device: Device, gltf: GLTFPostprocessed, options?: ParseGLTFOptions): {
|
|
23
|
+
/** Scene roots generated from `gltf.scenes`. */
|
|
24
|
+
scenes: GroupNode[];
|
|
25
|
+
/** Materials aligned with the source `gltf.materials` array. */
|
|
26
|
+
materials: Material[];
|
|
27
|
+
/** Map from glTF mesh ids to generated mesh group nodes. */
|
|
28
|
+
gltfMeshIdToNodeMap: Map<string, GroupNode>;
|
|
29
|
+
/** Map from glTF node indices to generated scenegraph nodes. */
|
|
30
|
+
gltfNodeIndexToNodeMap: Map<number, GroupNode>;
|
|
31
|
+
/** Map from glTF node ids to generated scenegraph nodes. */
|
|
32
|
+
gltfNodeIdToNodeMap: Map<string, GroupNode>;
|
|
33
|
+
};
|
|
17
34
|
//# sourceMappingURL=parse-gltf.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"parse-gltf.d.ts","sourceRoot":"","sources":["../../src/parsers/parse-gltf.ts"],"names":[],"mappings":"AAIA,OAAO,EAAC,MAAM,EAAyB,MAAM,eAAe,CAAC;AAC7D,OAAO,
|
|
1
|
+
{"version":3,"file":"parse-gltf.d.ts","sourceRoot":"","sources":["../../src/parsers/parse-gltf.ts"],"names":[],"mappings":"AAIA,OAAO,EAAC,MAAM,EAAyB,MAAM,eAAe,CAAC;AAC7D,OAAO,EAGL,SAAS,EACT,QAAQ,EAGR,KAAK,UAAU,EAChB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAIL,KAAK,iBAAiB,EACvB,MAAM,kBAAkB,CAAC;AAG1B,OAAO,EAAC,KAAK,cAAc,EAAC,kCAA+B;AAM3D,4FAA4F;AAC5F,MAAM,MAAM,gBAAgB,GAAG;IAC7B,wEAAwE;IACxE,YAAY,CAAC,EAAE,OAAO,CAAC,UAAU,CAAC,CAAC;IACnC,6CAA6C;IAC7C,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,iDAAiD;IACjD,6BAA6B,CAAC,EAAE,cAAc,CAAC;IAC/C,yCAAyC;IACzC,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,4CAA4C;IAC5C,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB,CAAC;AAUF;;;GAGG;AACH,wBAAgB,SAAS,CACvB,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,iBAAiB,EACvB,OAAO,GAAE,gBAAqB,GAC7B;IACD,gDAAgD;IAChD,MAAM,EAAE,SAAS,EAAE,CAAC;IACpB,gEAAgE;IAChE,SAAS,EAAE,QAAQ,EAAE,CAAC;IACtB,4DAA4D;IAC5D,mBAAmB,EAAE,GAAG,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IAC5C,gEAAgE;IAChE,sBAAsB,EAAE,GAAG,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IAC/C,4DAA4D;IAC5D,mBAAmB,EAAE,GAAG,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;CAC7C,CAgFA"}
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
// luma.gl
|
|
2
2
|
// SPDX-License-Identifier: MIT
|
|
3
3
|
// Copyright (c) vis.gl contributors
|
|
4
|
-
import { Geometry, GroupNode } from '@luma.gl/engine';
|
|
5
|
-
import {
|
|
4
|
+
import { Geometry, GroupNode, MaterialFactory } from '@luma.gl/engine';
|
|
5
|
+
import { pbrMaterial } from '@luma.gl/shadertools';
|
|
6
6
|
import { convertGLDrawModeToTopology } from "../webgl-to-webgpu/convert-webgl-topology.js";
|
|
7
|
-
import { createGLTFModel } from "../gltf/create-gltf-model.js";
|
|
7
|
+
import { createGLTFMaterial, createGLTFModel } from "../gltf/create-gltf-model.js";
|
|
8
8
|
import { parsePBRMaterial } from "./parse-pbr-material.js";
|
|
9
9
|
const defaultOptions = {
|
|
10
10
|
modelOptions: {},
|
|
@@ -17,79 +17,114 @@ const defaultOptions = {
|
|
|
17
17
|
* GLTF instantiator for luma.gl
|
|
18
18
|
* Walks the parsed and resolved glTF structure and builds a luma.gl scenegraph
|
|
19
19
|
*/
|
|
20
|
-
export function parseGLTF(device, gltf,
|
|
21
|
-
const
|
|
22
|
-
const
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
20
|
+
export function parseGLTF(device, gltf, options = {}) {
|
|
21
|
+
const combinedOptions = { ...defaultOptions, ...options };
|
|
22
|
+
const materialFactory = new MaterialFactory(device, { modules: [pbrMaterial] });
|
|
23
|
+
const materials = (gltf.materials || []).map((gltfMaterial, materialIndex) => createGLTFMaterial(device, {
|
|
24
|
+
id: getGLTFMaterialId(gltfMaterial, materialIndex),
|
|
25
|
+
parsedPPBRMaterial: parsePBRMaterial(device, gltfMaterial, {}, {
|
|
26
|
+
...combinedOptions,
|
|
27
|
+
gltf,
|
|
28
|
+
validateAttributes: false
|
|
29
|
+
}),
|
|
30
|
+
materialFactory
|
|
31
|
+
}));
|
|
32
|
+
const gltfMaterialIdToMaterialMap = new Map();
|
|
33
|
+
(gltf.materials || []).forEach((gltfMaterial, materialIndex) => {
|
|
34
|
+
gltfMaterialIdToMaterialMap.set(gltfMaterial.id, materials[materialIndex]);
|
|
31
35
|
});
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
36
|
+
const gltfMeshIdToNodeMap = new Map();
|
|
37
|
+
gltf.meshes.forEach((gltfMesh, idx) => {
|
|
38
|
+
const newMesh = createNodeForGLTFMesh(device, gltfMesh, gltf, gltfMaterialIdToMaterialMap, combinedOptions);
|
|
39
|
+
gltfMeshIdToNodeMap.set(gltfMesh.id, newMesh);
|
|
40
|
+
});
|
|
41
|
+
const gltfNodeIndexToNodeMap = new Map();
|
|
42
|
+
const gltfNodeIdToNodeMap = new Map();
|
|
43
|
+
// Step 1/2: Generate a GroupNode for each gltf node. (1:1 mapping).
|
|
44
|
+
gltf.nodes.forEach((gltfNode, idx) => {
|
|
45
|
+
const newNode = createNodeForGLTFNode(device, gltfNode, combinedOptions);
|
|
46
|
+
gltfNodeIndexToNodeMap.set(idx, newNode);
|
|
47
|
+
gltfNodeIdToNodeMap.set(gltfNode.id, newNode);
|
|
48
|
+
});
|
|
49
|
+
// Step 2/2: Go though each gltf node and attach the children.
|
|
50
|
+
// This guarantees that each gltf node will have exactly one luma GroupNode.
|
|
51
|
+
gltf.nodes.forEach((gltfNode, idx) => {
|
|
52
|
+
gltfNodeIndexToNodeMap.get(idx).add((gltfNode.children ?? []).map(({ id }) => {
|
|
53
|
+
const child = gltfNodeIdToNodeMap.get(id);
|
|
54
|
+
if (!child)
|
|
55
|
+
throw new Error(`Cannot find child ${id} of node ${idx}`);
|
|
56
|
+
return child;
|
|
57
|
+
}));
|
|
58
|
+
// Nodes can have children nodes and one optional child mesh at the same time.
|
|
39
59
|
if (gltfNode.mesh) {
|
|
40
|
-
|
|
60
|
+
const mesh = gltfMeshIdToNodeMap.get(gltfNode.mesh.id);
|
|
61
|
+
if (!mesh) {
|
|
62
|
+
throw new Error(`Cannot find mesh child ${gltfNode.mesh.id} of node ${idx}`);
|
|
63
|
+
}
|
|
64
|
+
gltfNodeIndexToNodeMap.get(idx).add(mesh);
|
|
41
65
|
}
|
|
42
|
-
|
|
43
|
-
|
|
66
|
+
});
|
|
67
|
+
const scenes = gltf.scenes.map(gltfScene => {
|
|
68
|
+
const children = (gltfScene.nodes || []).map(({ id }) => {
|
|
69
|
+
const child = gltfNodeIdToNodeMap.get(id);
|
|
70
|
+
if (!child)
|
|
71
|
+
throw new Error(`Cannot find child ${id} of scene ${gltfScene.name || gltfScene.id}`);
|
|
72
|
+
return child;
|
|
73
|
+
});
|
|
74
|
+
return new GroupNode({
|
|
75
|
+
id: gltfScene.name || gltfScene.id,
|
|
44
76
|
children
|
|
45
77
|
});
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
}
|
|
49
|
-
else {
|
|
50
|
-
node.matrix.identity();
|
|
51
|
-
if (gltfNode.translation) {
|
|
52
|
-
node.matrix.translate(gltfNode.translation);
|
|
53
|
-
}
|
|
54
|
-
if (gltfNode.rotation) {
|
|
55
|
-
const rotationMatrix = new Matrix4().fromQuaternion(gltfNode.rotation);
|
|
56
|
-
node.matrix.multiplyRight(rotationMatrix);
|
|
57
|
-
}
|
|
58
|
-
if (gltfNode.scale) {
|
|
59
|
-
node.matrix.scale(gltfNode.scale);
|
|
60
|
-
}
|
|
61
|
-
}
|
|
62
|
-
gltfNode._node = node;
|
|
63
|
-
}
|
|
64
|
-
// Copy _node so that gltf-animator can access
|
|
65
|
-
const topLevelNode = gltfNodes.find(node => node.id === gltfNode.id);
|
|
66
|
-
topLevelNode._node = gltfNode._node;
|
|
67
|
-
return gltfNode._node;
|
|
78
|
+
});
|
|
79
|
+
return { scenes, materials, gltfMeshIdToNodeMap, gltfNodeIdToNodeMap, gltfNodeIndexToNodeMap };
|
|
68
80
|
}
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
+
/** Creates a `GroupNode` for one glTF node transform. */
|
|
82
|
+
function createNodeForGLTFNode(device, gltfNode, options) {
|
|
83
|
+
return new GroupNode({
|
|
84
|
+
id: gltfNode.name || gltfNode.id,
|
|
85
|
+
children: [],
|
|
86
|
+
matrix: gltfNode.matrix,
|
|
87
|
+
position: gltfNode.translation,
|
|
88
|
+
rotation: gltfNode.rotation,
|
|
89
|
+
scale: gltfNode.scale
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
/** Creates a mesh group node containing one model node per glTF primitive. */
|
|
93
|
+
function createNodeForGLTFMesh(device, gltfMesh, gltf, gltfMaterialIdToMaterialMap, options) {
|
|
94
|
+
const gltfPrimitives = gltfMesh.primitives || [];
|
|
95
|
+
const primitives = gltfPrimitives.map((gltfPrimitive, i) => createNodeForGLTFPrimitive({
|
|
96
|
+
device,
|
|
97
|
+
gltfPrimitive,
|
|
98
|
+
primitiveIndex: i,
|
|
99
|
+
gltfMesh,
|
|
100
|
+
gltf,
|
|
101
|
+
gltfMaterialIdToMaterialMap,
|
|
102
|
+
options
|
|
103
|
+
}));
|
|
104
|
+
const mesh = new GroupNode({
|
|
105
|
+
id: gltfMesh.name || gltfMesh.id,
|
|
106
|
+
children: primitives
|
|
107
|
+
});
|
|
108
|
+
return mesh;
|
|
81
109
|
}
|
|
82
|
-
|
|
83
|
-
|
|
110
|
+
/** Creates a renderable model node for one glTF primitive. */
|
|
111
|
+
function createNodeForGLTFPrimitive({ device, gltfPrimitive, primitiveIndex, gltfMesh, gltf, gltfMaterialIdToMaterialMap, options }) {
|
|
112
|
+
const id = gltfPrimitive.name || `${gltfMesh.name || gltfMesh.id}-primitive-${primitiveIndex}`;
|
|
84
113
|
const topology = convertGLDrawModeToTopology(gltfPrimitive.mode || 4);
|
|
85
114
|
const vertexCount = gltfPrimitive.indices
|
|
86
115
|
? gltfPrimitive.indices.count
|
|
87
116
|
: getVertexCount(gltfPrimitive.attributes);
|
|
88
117
|
const geometry = createGeometry(id, gltfPrimitive, topology);
|
|
89
|
-
const parsedPPBRMaterial = parsePBRMaterial(device, gltfPrimitive.material, geometry.attributes,
|
|
118
|
+
const parsedPPBRMaterial = parsePBRMaterial(device, gltfPrimitive.material, geometry.attributes, {
|
|
119
|
+
...options,
|
|
120
|
+
gltf
|
|
121
|
+
});
|
|
90
122
|
const modelNode = createGLTFModel(device, {
|
|
91
123
|
id,
|
|
92
124
|
geometry: createGeometry(id, gltfPrimitive, topology),
|
|
125
|
+
material: gltfPrimitive.material
|
|
126
|
+
? gltfMaterialIdToMaterialMap.get(gltfPrimitive.material.id) || null
|
|
127
|
+
: null,
|
|
93
128
|
parsedPPBRMaterial,
|
|
94
129
|
modelOptions: options.modelOptions,
|
|
95
130
|
vertexCount
|
|
@@ -99,9 +134,11 @@ function createPrimitive(device, gltfPrimitive, i, gltfMesh, options) {
|
|
|
99
134
|
// modelNode.material = gltfPrimitive.material;
|
|
100
135
|
return modelNode;
|
|
101
136
|
}
|
|
137
|
+
/** Computes the vertex count for a primitive without indices. */
|
|
102
138
|
function getVertexCount(attributes) {
|
|
103
139
|
throw new Error('getVertexCount not implemented');
|
|
104
140
|
}
|
|
141
|
+
/** Converts glTF primitive attributes and indices into a luma.gl `Geometry`. */
|
|
105
142
|
function createGeometry(id, gltfPrimitive, topology) {
|
|
106
143
|
const attributes = {};
|
|
107
144
|
for (const [attributeName, attribute] of Object.entries(gltfPrimitive.attributes)) {
|
|
@@ -115,4 +152,7 @@ function createGeometry(id, gltfPrimitive, topology) {
|
|
|
115
152
|
attributes
|
|
116
153
|
});
|
|
117
154
|
}
|
|
155
|
+
function getGLTFMaterialId(gltfMaterial, materialIndex) {
|
|
156
|
+
return gltfMaterial.name || gltfMaterial.id || `material-${materialIndex}`;
|
|
157
|
+
}
|
|
118
158
|
//# sourceMappingURL=parse-gltf.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"parse-gltf.js","sourceRoot":"","sources":["../../src/parsers/parse-gltf.ts"],"names":[],"mappings":"AAAA,UAAU;AACV,+BAA+B;AAC/B,oCAAoC;AAGpC,OAAO,
|
|
1
|
+
{"version":3,"file":"parse-gltf.js","sourceRoot":"","sources":["../../src/parsers/parse-gltf.ts"],"names":[],"mappings":"AAAA,UAAU;AACV,+BAA+B;AAC/B,oCAAoC;AAGpC,OAAO,EACL,QAAQ,EAER,SAAS,EAET,eAAe,EAGhB,MAAM,iBAAiB,CAAC;AAOzB,OAAO,EAAC,WAAW,EAAC,MAAM,sBAAsB,CAAC;AAGjD,OAAO,EAAC,2BAA2B,EAAC,qDAAkD;AACtF,OAAO,EAAC,kBAAkB,EAAE,eAAe,EAAC,qCAAkC;AAE9E,OAAO,EAAC,gBAAgB,EAAC,gCAA6B;AAgBtD,MAAM,cAAc,GAA+B;IACjD,YAAY,EAAE,EAAE;IAChB,QAAQ,EAAE,KAAK;IACf,6BAA6B,EAAE,SAAU;IACzC,MAAM,EAAE,IAAI;IACZ,WAAW,EAAE,KAAK;CACnB,CAAC;AAEF;;;GAGG;AACH,MAAM,UAAU,SAAS,CACvB,MAAc,EACd,IAAuB,EACvB,UAA4B,EAAE;IAa9B,MAAM,eAAe,GAAG,EAAC,GAAG,cAAc,EAAE,GAAG,OAAO,EAAC,CAAC;IACxD,MAAM,eAAe,GAAG,IAAI,eAAe,CAAC,MAAM,EAAE,EAAC,OAAO,EAAE,CAAC,WAAW,CAAC,EAAC,CAAC,CAAC;IAC9E,MAAM,SAAS,GAAG,CAAC,IAAI,CAAC,SAAS,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,YAAY,EAAE,aAAa,EAAE,EAAE,CAC3E,kBAAkB,CAAC,MAAM,EAAE;QACzB,EAAE,EAAE,iBAAiB,CAAC,YAAY,EAAE,aAAa,CAAC;QAClD,kBAAkB,EAAE,gBAAgB,CAClC,MAAM,EACN,YAAmB,EACnB,EAAE,EACF;YACE,GAAG,eAAe;YAClB,IAAI;YACJ,kBAAkB,EAAE,KAAK;SAC1B,CACF;QACD,eAAe;KAChB,CAAC,CACH,CAAC;IACF,MAAM,2BAA2B,GAAG,IAAI,GAAG,EAAoB,CAAC;IAChE,CAAC,IAAI,CAAC,SAAS,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,YAAY,EAAE,aAAa,EAAE,EAAE;QAC7D,2BAA2B,CAAC,GAAG,CAAC,YAAY,CAAC,EAAE,EAAE,SAAS,CAAC,aAAa,CAAC,CAAC,CAAC;IAC7E,CAAC,CAAC,CAAC;IAEH,MAAM,mBAAmB,GAAG,IAAI,GAAG,EAAqB,CAAC;IACzD,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,QAAQ,EAAE,GAAG,EAAE,EAAE;QACpC,MAAM,OAAO,GAAG,qBAAqB,CACnC,MAAM,EACN,QAAQ,EACR,IAAI,EACJ,2BAA2B,EAC3B,eAAe,CAChB,CAAC;QACF,mBAAmB,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC;IAChD,CAAC,CAAC,CAAC;IAEH,MAAM,sBAAsB,GAAG,IAAI,GAAG,EAAqB,CAAC;IAC5D,MAAM,mBAAmB,GAAG,IAAI,GAAG,EAAqB,CAAC;IACzD,oEAAoE;IACpE,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,QAAQ,EAAE,GAAG,EAAE,EAAE;QACnC,MAAM,OAAO,GAAG,qBAAqB,CAAC,MAAM,EAAE,QAAQ,EAAE,eAAe,CAAC,CAAC;QACzE,sBAAsB,CAAC,GAAG,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;QACzC,mBAAmB,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC;IAChD,CAAC,CAAC,CAAC;IAEH,8DAA8D;IAC9D,4EAA4E;IAC5E,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,QAAQ,EAAE,GAAG,EAAE,EAAE;QACnC,sBAAsB,CAAC,GAAG,CAAC,GAAG,CAAE,CAAC,GAAG,CAClC,CAAC,QAAQ,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,EAAC,EAAE,EAAC,EAAE,EAAE;YACrC,MAAM,KAAK,GAAG,mBAAmB,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAC1C,IAAI,CAAC,KAAK;gBAAE,MAAM,IAAI,KAAK,CAAC,qBAAqB,EAAE,YAAY,GAAG,EAAE,CAAC,CAAC;YACtE,OAAO,KAAK,CAAC;QACf,CAAC,CAAC,CACH,CAAC;QAEF,8EAA8E;QAC9E,IAAI,QAAQ,CAAC,IAAI,EAAE,CAAC;YAClB,MAAM,IAAI,GAAG,mBAAmB,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACvD,IAAI,CAAC,IAAI,EAAE,CAAC;gBACV,MAAM,IAAI,KAAK,CAAC,0BAA0B,QAAQ,CAAC,IAAI,CAAC,EAAE,YAAY,GAAG,EAAE,CAAC,CAAC;YAC/E,CAAC;YACD,sBAAsB,CAAC,GAAG,CAAC,GAAG,CAAE,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAC7C,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE;QACzC,MAAM,QAAQ,GAAG,CAAC,SAAS,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,EAAC,EAAE,EAAC,EAAE,EAAE;YACpD,MAAM,KAAK,GAAG,mBAAmB,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAC1C,IAAI,CAAC,KAAK;gBACR,MAAM,IAAI,KAAK,CAAC,qBAAqB,EAAE,aAAa,SAAS,CAAC,IAAI,IAAI,SAAS,CAAC,EAAE,EAAE,CAAC,CAAC;YACxF,OAAO,KAAK,CAAC;QACf,CAAC,CAAC,CAAC;QACH,OAAO,IAAI,SAAS,CAAC;YACnB,EAAE,EAAE,SAAS,CAAC,IAAI,IAAI,SAAS,CAAC,EAAE;YAClC,QAAQ;SACT,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,OAAO,EAAC,MAAM,EAAE,SAAS,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,sBAAsB,EAAC,CAAC;AAC/F,CAAC;AAED,yDAAyD;AACzD,SAAS,qBAAqB,CAC5B,MAAc,EACd,QAA+B,EAC/B,OAAmC;IAEnC,OAAO,IAAI,SAAS,CAAC;QACnB,EAAE,EAAE,QAAQ,CAAC,IAAI,IAAI,QAAQ,CAAC,EAAE;QAChC,QAAQ,EAAE,EAAE;QACZ,MAAM,EAAE,QAAQ,CAAC,MAAM;QACvB,QAAQ,EAAE,QAAQ,CAAC,WAAW;QAC9B,QAAQ,EAAE,QAAQ,CAAC,QAAQ;QAC3B,KAAK,EAAE,QAAQ,CAAC,KAAK;KACtB,CAAC,CAAC;AACL,CAAC;AAED,8EAA8E;AAC9E,SAAS,qBAAqB,CAC5B,MAAc,EACd,QAA+B,EAC/B,IAAuB,EACvB,2BAAkD,EAClD,OAAmC;IAEnC,MAAM,cAAc,GAAG,QAAQ,CAAC,UAAU,IAAI,EAAE,CAAC;IACjD,MAAM,UAAU,GAAG,cAAc,CAAC,GAAG,CAAC,CAAC,aAAa,EAAE,CAAC,EAAE,EAAE,CACzD,0BAA0B,CAAC;QACzB,MAAM;QACN,aAAa;QACb,cAAc,EAAE,CAAC;QACjB,QAAQ;QACR,IAAI;QACJ,2BAA2B;QAC3B,OAAO;KACR,CAAC,CACH,CAAC;IACF,MAAM,IAAI,GAAG,IAAI,SAAS,CAAC;QACzB,EAAE,EAAE,QAAQ,CAAC,IAAI,IAAI,QAAQ,CAAC,EAAE;QAChC,QAAQ,EAAE,UAAU;KACrB,CAAC,CAAC;IAEH,OAAO,IAAI,CAAC;AACd,CAAC;AAaD,8DAA8D;AAC9D,SAAS,0BAA0B,CAAC,EAClC,MAAM,EACN,aAAa,EACb,cAAc,EACd,QAAQ,EACR,IAAI,EACJ,2BAA2B,EAC3B,OAAO,EAC2B;IAClC,MAAM,EAAE,GAAG,aAAa,CAAC,IAAI,IAAI,GAAG,QAAQ,CAAC,IAAI,IAAI,QAAQ,CAAC,EAAE,cAAc,cAAc,EAAE,CAAC;IAC/F,MAAM,QAAQ,GAAG,2BAA2B,CAAC,aAAa,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC;IACtE,MAAM,WAAW,GAAG,aAAa,CAAC,OAAO;QACvC,CAAC,CAAC,aAAa,CAAC,OAAO,CAAC,KAAK;QAC7B,CAAC,CAAC,cAAc,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC;IAE7C,MAAM,QAAQ,GAAG,cAAc,CAAC,EAAE,EAAE,aAAa,EAAE,QAAQ,CAAC,CAAC;IAE7D,MAAM,kBAAkB,GAAG,gBAAgB,CAAC,MAAM,EAAE,aAAa,CAAC,QAAQ,EAAE,QAAQ,CAAC,UAAU,EAAE;QAC/F,GAAG,OAAO;QACV,IAAI;KACL,CAAC,CAAC;IAEH,MAAM,SAAS,GAAG,eAAe,CAAC,MAAM,EAAE;QACxC,EAAE;QACF,QAAQ,EAAE,cAAc,CAAC,EAAE,EAAE,aAAa,EAAE,QAAQ,CAAC;QACrD,QAAQ,EAAE,aAAa,CAAC,QAAQ;YAC9B,CAAC,CAAC,2BAA2B,CAAC,GAAG,CAAC,aAAa,CAAC,QAAQ,CAAC,EAAE,CAAC,IAAI,IAAI;YACpE,CAAC,CAAC,IAAI;QACR,kBAAkB;QAClB,YAAY,EAAE,OAAO,CAAC,YAAY;QAClC,WAAW;KACZ,CAAC,CAAC;IAEH,SAAS,CAAC,MAAM,GAAG,CAAC,aAAa,CAAC,UAAU,CAAC,QAAQ,CAAC,GAAG,EAAE,aAAa,CAAC,UAAU,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;IAClG,oEAAoE;IACpE,gDAAgD;IAEhD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,iEAAiE;AACjE,SAAS,cAAc,CAAC,UAAe;IACrC,MAAM,IAAI,KAAK,CAAC,gCAAgC,CAAC,CAAC;AACpD,CAAC;AAED,gFAAgF;AAChF,SAAS,cAAc,CAAC,EAAU,EAAE,aAAkB,EAAE,QAA2B;IACjF,MAAM,UAAU,GAAsC,EAAE,CAAC;IACzD,KAAK,MAAM,CAAC,aAAa,EAAE,SAAS,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,aAAa,CAAC,UAAU,CAAC,EAAE,CAAC;QAClF,MAAM,EAAC,UAAU,EAAE,IAAI,EAAE,KAAK,EAAC,GAAG,SAA8B,CAAC;QAEjE,UAAU,CAAC,aAAa,CAAC,GAAG,EAAC,IAAI,EAAE,IAAI,IAAI,UAAU,EAAE,KAAK,EAAC,CAAC;IAChE,CAAC;IAED,OAAO,IAAI,QAAQ,CAAC;QAClB,EAAE;QACF,QAAQ;QACR,OAAO,EAAE,aAAa,CAAC,OAAO,CAAC,KAAK;QACpC,UAAU;KACX,CAAC,CAAC;AACL,CAAC;AAED,SAAS,iBAAiB,CAAC,YAAuC,EAAE,aAAqB;IACvF,OAAO,YAAY,CAAC,IAAI,IAAI,YAAY,CAAC,EAAE,IAAI,YAAY,aAAa,EAAE,CAAC;AAC7E,CAAC"}
|