@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.
Files changed (91) hide show
  1. package/dist/dist.dev.js +1362 -313
  2. package/dist/dist.min.js +98 -46
  3. package/dist/gltf/animations/animations.d.ts +16 -4
  4. package/dist/gltf/animations/animations.d.ts.map +1 -1
  5. package/dist/gltf/animations/interpolate.d.ts +4 -3
  6. package/dist/gltf/animations/interpolate.d.ts.map +1 -1
  7. package/dist/gltf/animations/interpolate.js +27 -36
  8. package/dist/gltf/animations/interpolate.js.map +1 -1
  9. package/dist/gltf/create-gltf-model.d.ts +15 -1
  10. package/dist/gltf/create-gltf-model.d.ts.map +1 -1
  11. package/dist/gltf/create-gltf-model.js +154 -48
  12. package/dist/gltf/create-gltf-model.js.map +1 -1
  13. package/dist/gltf/create-scenegraph-from-gltf.d.ts +39 -2
  14. package/dist/gltf/create-scenegraph-from-gltf.d.ts.map +1 -1
  15. package/dist/gltf/create-scenegraph-from-gltf.js +76 -6
  16. package/dist/gltf/create-scenegraph-from-gltf.js.map +1 -1
  17. package/dist/gltf/gltf-animator.d.ts +26 -0
  18. package/dist/gltf/gltf-animator.d.ts.map +1 -1
  19. package/dist/gltf/gltf-animator.js +22 -19
  20. package/dist/gltf/gltf-animator.js.map +1 -1
  21. package/dist/gltf/gltf-extension-support.d.ts +10 -0
  22. package/dist/gltf/gltf-extension-support.d.ts.map +1 -0
  23. package/dist/gltf/gltf-extension-support.js +173 -0
  24. package/dist/gltf/gltf-extension-support.js.map +1 -0
  25. package/dist/index.cjs +1302 -276
  26. package/dist/index.cjs.map +4 -4
  27. package/dist/index.d.ts +3 -2
  28. package/dist/index.d.ts.map +1 -1
  29. package/dist/index.js +2 -0
  30. package/dist/index.js.map +1 -1
  31. package/dist/parsers/parse-gltf-animations.d.ts +1 -0
  32. package/dist/parsers/parse-gltf-animations.d.ts.map +1 -1
  33. package/dist/parsers/parse-gltf-animations.js +73 -28
  34. package/dist/parsers/parse-gltf-animations.js.map +1 -1
  35. package/dist/parsers/parse-gltf-lights.d.ts +5 -0
  36. package/dist/parsers/parse-gltf-lights.d.ts.map +1 -0
  37. package/dist/parsers/parse-gltf-lights.js +163 -0
  38. package/dist/parsers/parse-gltf-lights.js.map +1 -0
  39. package/dist/parsers/parse-gltf.d.ts +19 -2
  40. package/dist/parsers/parse-gltf.d.ts.map +1 -1
  41. package/dist/parsers/parse-gltf.js +101 -61
  42. package/dist/parsers/parse-gltf.js.map +1 -1
  43. package/dist/parsers/parse-pbr-material.d.ts +115 -2
  44. package/dist/parsers/parse-pbr-material.d.ts.map +1 -1
  45. package/dist/parsers/parse-pbr-material.js +570 -54
  46. package/dist/parsers/parse-pbr-material.js.map +1 -1
  47. package/dist/pbr/pbr-environment.d.ts +10 -4
  48. package/dist/pbr/pbr-environment.d.ts.map +1 -1
  49. package/dist/pbr/pbr-environment.js +18 -15
  50. package/dist/pbr/pbr-environment.js.map +1 -1
  51. package/dist/pbr/pbr-material.d.ts +13 -3
  52. package/dist/pbr/pbr-material.d.ts.map +1 -1
  53. package/dist/webgl-to-webgpu/convert-webgl-attribute.d.ts +12 -1
  54. package/dist/webgl-to-webgpu/convert-webgl-attribute.d.ts.map +1 -1
  55. package/dist/webgl-to-webgpu/convert-webgl-attribute.js +3 -0
  56. package/dist/webgl-to-webgpu/convert-webgl-attribute.js.map +1 -1
  57. package/dist/webgl-to-webgpu/convert-webgl-sampler.d.ts +11 -5
  58. package/dist/webgl-to-webgpu/convert-webgl-sampler.d.ts.map +1 -1
  59. package/dist/webgl-to-webgpu/convert-webgl-sampler.js +16 -12
  60. package/dist/webgl-to-webgpu/convert-webgl-sampler.js.map +1 -1
  61. package/dist/webgl-to-webgpu/convert-webgl-topology.d.ts +2 -9
  62. package/dist/webgl-to-webgpu/convert-webgl-topology.d.ts.map +1 -1
  63. package/dist/webgl-to-webgpu/convert-webgl-topology.js +2 -14
  64. package/dist/webgl-to-webgpu/convert-webgl-topology.js.map +1 -1
  65. package/dist/webgl-to-webgpu/gltf-webgl-constants.d.ts +27 -0
  66. package/dist/webgl-to-webgpu/gltf-webgl-constants.d.ts.map +1 -0
  67. package/dist/webgl-to-webgpu/gltf-webgl-constants.js +34 -0
  68. package/dist/webgl-to-webgpu/gltf-webgl-constants.js.map +1 -0
  69. package/package.json +8 -9
  70. package/src/gltf/animations/animations.ts +17 -5
  71. package/src/gltf/animations/interpolate.ts +49 -68
  72. package/src/gltf/create-gltf-model.ts +214 -48
  73. package/src/gltf/create-scenegraph-from-gltf.ts +134 -11
  74. package/src/gltf/gltf-animator.ts +34 -25
  75. package/src/gltf/gltf-extension-support.ts +214 -0
  76. package/src/index.ts +11 -2
  77. package/src/parsers/parse-gltf-animations.ts +94 -33
  78. package/src/parsers/parse-gltf-lights.ts +218 -0
  79. package/src/parsers/parse-gltf.ts +170 -90
  80. package/src/parsers/parse-pbr-material.ts +870 -80
  81. package/src/pbr/pbr-environment.ts +44 -21
  82. package/src/pbr/pbr-material.ts +18 -3
  83. package/src/webgl-to-webgpu/convert-webgl-attribute.ts +12 -1
  84. package/src/webgl-to-webgpu/convert-webgl-sampler.ts +38 -29
  85. package/src/webgl-to-webgpu/convert-webgl-topology.ts +2 -14
  86. package/src/webgl-to-webgpu/gltf-webgl-constants.ts +35 -0
  87. package/dist/utils/deep-copy.d.ts +0 -3
  88. package/dist/utils/deep-copy.d.ts.map +0 -1
  89. package/dist/utils/deep-copy.js +0 -21
  90. package/dist/utils/deep-copy.js.map +0 -1
  91. 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
- return gltfAnimations.map((animation, index) => {
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 samplers = animation.samplers.map(({ input, interpolation = 'LINEAR', output }) => ({
10
- input: accessorToJsArray(gltf.accessors[input]),
11
- interpolation,
12
- output: accessorToJsArray(gltf.accessors[output])
13
- }));
14
- const channels = animation.channels.map(({ sampler, target }) => ({
15
- sampler: samplers[sampler],
16
- target: gltf.nodes[target.node ?? 0],
17
- path: target.path
18
- }));
19
- return { name, channels };
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
- function accessorToJsArray(accessor) {
24
- if (!accessor._animation) {
25
- const { typedArray: array, components } = accessorToTypedArray(accessor);
26
- if (components === 1) {
27
- accessor._animation = Array.from(array);
28
- }
29
- else {
30
- // Slice array
31
- const slicedArray = [];
32
- for (let i = 0; i < array.length; i += components) {
33
- slicedArray.push(Array.from(array.slice(i, i + components)));
34
- }
35
- accessor._animation = slicedArray;
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;AASpC,OAAO,EAAC,oBAAoB,EAAC,uDAAoD;AAEjF,MAAM,UAAU,mBAAmB,CAAC,IAAuB;IACzD,MAAM,cAAc,GAAG,IAAI,CAAC,UAAU,IAAI,EAAE,CAAC;IAC7C,OAAO,cAAc,CAAC,GAAG,CAAC,CAAC,SAAS,EAAE,KAAK,EAAE,EAAE;QAC7C,MAAM,IAAI,GAAG,SAAS,CAAC,IAAI,IAAI,aAAa,KAAK,EAAE,CAAC;QACpD,MAAM,QAAQ,GAA2B,SAAS,CAAC,QAAQ,CAAC,GAAG,CAC7D,CAAC,EAAC,KAAK,EAAE,aAAa,GAAG,QAAQ,EAAE,MAAM,EAAC,EAAE,EAAE,CAAC,CAAC;YAC9C,KAAK,EAAE,iBAAiB,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAa;YAC3D,aAAa;YACb,MAAM,EAAE,iBAAiB,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;SAClD,CAAC,CACH,CAAC;QACF,MAAM,QAAQ,GAA2B,SAAS,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,EAAC,OAAO,EAAE,MAAM,EAAC,EAAE,EAAE,CAAC,CAAC;YACtF,OAAO,EAAE,QAAQ,CAAC,OAAO,CAAC;YAC1B,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC,CAAC;YACpC,IAAI,EAAE,MAAM,CAAC,IAAoC;SAClD,CAAC,CAAC,CAAC;QACJ,OAAO,EAAC,IAAI,EAAE,QAAQ,EAAC,CAAC;IAC1B,CAAC,CAAC,CAAC;AACL,CAAC;AAED,EAAE;AAEF,SAAS,iBAAiB,CACxB,QAA0E;IAE1E,IAAI,CAAC,QAAQ,CAAC,UAAU,EAAE,CAAC;QACzB,MAAM,EAAC,UAAU,EAAE,KAAK,EAAE,UAAU,EAAC,GAAG,oBAAoB,CAAC,QAAQ,CAAC,CAAC;QAEvE,IAAI,UAAU,KAAK,CAAC,EAAE,CAAC;YACrB,QAAQ,CAAC,UAAU,GAAG,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC1C,CAAC;aAAM,CAAC;YACN,cAAc;YACd,MAAM,WAAW,GAAe,EAAE,CAAC;YACnC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,IAAI,UAAU,EAAE,CAAC;gBAClD,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC;YAC/D,CAAC;YACD,QAAQ,CAAC,UAAU,GAAG,WAAW,CAAC;QACpC,CAAC;IACH,CAAC;IAED,OAAO,QAAQ,CAAC,UAAU,CAAC;AAC7B,CAAC"}
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, options_?: ParseGLTFOptions): GroupNode[];
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,EAA8B,SAAS,EAAa,KAAK,UAAU,EAAC,MAAM,iBAAiB,CAAC;AAEnG,OAAO,EAGL,KAAK,iBAAiB,EACvB,MAAM,kBAAkB,CAAC;AAG1B,OAAO,EAAC,KAAK,cAAc,EAAC,kCAA+B;AAM3D,MAAM,MAAM,gBAAgB,GAAG;IAC7B,YAAY,CAAC,EAAE,OAAO,CAAC,UAAU,CAAC,CAAC;IACnC,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,6BAA6B,CAAC,EAAE,cAAc,CAAC;IAC/C,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB,CAAC;AAUF;;;GAGG;AACH,wBAAgB,SAAS,CACvB,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,iBAAiB,EACvB,QAAQ,GAAE,gBAAqB,GAC9B,SAAS,EAAE,CAMb"}
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 { Matrix4 } from '@math.gl/core';
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, options_ = {}) {
21
- const options = { ...defaultOptions, ...options_ };
22
- const sceneNodes = gltf.scenes.map(gltfScene => createScene(device, gltfScene, gltf.nodes, options));
23
- return sceneNodes;
24
- }
25
- function createScene(device, gltfScene, gltfNodes, options) {
26
- const gltfSceneNodes = gltfScene.nodes || [];
27
- const nodes = gltfSceneNodes.map(node => createNode(device, node, gltfNodes, options));
28
- const sceneNode = new GroupNode({
29
- id: gltfScene.name || gltfScene.id,
30
- children: nodes
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
- return sceneNode;
33
- }
34
- function createNode(device, gltfNode, gltfNodes, options) {
35
- if (!gltfNode._node) {
36
- const gltfChildren = gltfNode.children || [];
37
- const children = gltfChildren.map(child => createNode(device, child, gltfNodes, options));
38
- // Node can have children nodes and meshes at the same time
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
- children.push(createMesh(device, gltfNode.mesh, options));
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
- const node = new GroupNode({
43
- id: gltfNode.name || gltfNode.id,
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
- if (gltfNode.matrix) {
47
- node.setMatrix(gltfNode.matrix);
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
- function createMesh(device, gltfMesh, options) {
70
- // TODO: avoid changing the gltf
71
- if (!gltfMesh._mesh) {
72
- const gltfPrimitives = gltfMesh.primitives || [];
73
- const primitives = gltfPrimitives.map((gltfPrimitive, i) => createPrimitive(device, gltfPrimitive, i, gltfMesh, options));
74
- const mesh = new GroupNode({
75
- id: gltfMesh.name || gltfMesh.id,
76
- children: primitives
77
- });
78
- gltfMesh._mesh = mesh;
79
- }
80
- return gltfMesh._mesh;
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
- function createPrimitive(device, gltfPrimitive, i, gltfMesh, options) {
83
- const id = gltfPrimitive.name || `${gltfMesh.name || gltfMesh.id}-primitive-${i}`;
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, options);
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":"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"}
1
+ {"version":3,"file":"parse-gltf.js","sourceRoot":"","sources":["../../src/parsers/parse-gltf.ts"],"names":[],"mappings":"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"}