@luma.gl/gltf 9.2.6 → 9.3.0-alpha.11

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 (96) hide show
  1. package/dist/dist.dev.js +4064 -1967
  2. package/dist/dist.min.js +117 -46
  3. package/dist/gltf/animations/animations.d.ts +57 -5
  4. package/dist/gltf/animations/animations.d.ts.map +1 -1
  5. package/dist/gltf/animations/interpolate.d.ts +6 -3
  6. package/dist/gltf/animations/interpolate.d.ts.map +1 -1
  7. package/dist/gltf/animations/interpolate.js +47 -51
  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 +168 -43
  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 +37 -0
  18. package/dist/gltf/gltf-animator.d.ts.map +1 -1
  19. package/dist/gltf/gltf-animator.js +112 -17
  20. package/dist/gltf/gltf-animator.js.map +1 -1
  21. package/dist/gltf/gltf-extension-support.d.ts +13 -0
  22. package/dist/gltf/gltf-extension-support.d.ts.map +1 -0
  23. package/dist/gltf/gltf-extension-support.js +178 -0
  24. package/dist/gltf/gltf-extension-support.js.map +1 -0
  25. package/dist/index.cjs +1806 -298
  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 +373 -27
  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 +120 -67
  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 +602 -53
  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/pbr/texture-transform.d.ts +24 -0
  54. package/dist/pbr/texture-transform.d.ts.map +1 -0
  55. package/dist/pbr/texture-transform.js +98 -0
  56. package/dist/pbr/texture-transform.js.map +1 -0
  57. package/dist/webgl-to-webgpu/convert-webgl-attribute.d.ts +12 -1
  58. package/dist/webgl-to-webgpu/convert-webgl-attribute.d.ts.map +1 -1
  59. package/dist/webgl-to-webgpu/convert-webgl-attribute.js +3 -0
  60. package/dist/webgl-to-webgpu/convert-webgl-attribute.js.map +1 -1
  61. package/dist/webgl-to-webgpu/convert-webgl-sampler.d.ts +11 -5
  62. package/dist/webgl-to-webgpu/convert-webgl-sampler.d.ts.map +1 -1
  63. package/dist/webgl-to-webgpu/convert-webgl-sampler.js +16 -12
  64. package/dist/webgl-to-webgpu/convert-webgl-sampler.js.map +1 -1
  65. package/dist/webgl-to-webgpu/convert-webgl-topology.d.ts +2 -9
  66. package/dist/webgl-to-webgpu/convert-webgl-topology.d.ts.map +1 -1
  67. package/dist/webgl-to-webgpu/convert-webgl-topology.js +3 -15
  68. package/dist/webgl-to-webgpu/convert-webgl-topology.js.map +1 -1
  69. package/dist/webgl-to-webgpu/gltf-webgl-constants.d.ts +27 -0
  70. package/dist/webgl-to-webgpu/gltf-webgl-constants.d.ts.map +1 -0
  71. package/dist/webgl-to-webgpu/gltf-webgl-constants.js +34 -0
  72. package/dist/webgl-to-webgpu/gltf-webgl-constants.js.map +1 -0
  73. package/package.json +8 -9
  74. package/src/gltf/animations/animations.ts +88 -6
  75. package/src/gltf/animations/interpolate.ts +84 -96
  76. package/src/gltf/create-gltf-model.ts +233 -48
  77. package/src/gltf/create-scenegraph-from-gltf.ts +134 -11
  78. package/src/gltf/gltf-animator.ts +198 -20
  79. package/src/gltf/gltf-extension-support.ts +226 -0
  80. package/src/index.ts +11 -2
  81. package/src/parsers/parse-gltf-animations.ts +533 -32
  82. package/src/parsers/parse-gltf-lights.ts +218 -0
  83. package/src/parsers/parse-gltf.ts +189 -96
  84. package/src/parsers/parse-pbr-material.ts +974 -79
  85. package/src/pbr/pbr-environment.ts +44 -21
  86. package/src/pbr/pbr-material.ts +18 -3
  87. package/src/pbr/texture-transform.ts +263 -0
  88. package/src/webgl-to-webgpu/convert-webgl-attribute.ts +12 -1
  89. package/src/webgl-to-webgpu/convert-webgl-sampler.ts +38 -29
  90. package/src/webgl-to-webgpu/convert-webgl-topology.ts +3 -15
  91. package/src/webgl-to-webgpu/gltf-webgl-constants.ts +35 -0
  92. package/dist/utils/deep-copy.d.ts +0 -3
  93. package/dist/utils/deep-copy.d.ts.map +0 -1
  94. package/dist/utils/deep-copy.js +0 -21
  95. package/dist/utils/deep-copy.js.map +0 -1
  96. package/src/utils/deep-copy.ts +0 -22
@@ -1 +1 @@
1
- {"version":3,"file":"create-scenegraph-from-gltf.js","sourceRoot":"","sources":["../../src/gltf/create-scenegraph-from-gltf.ts"],"names":[],"mappings":"AAAA,UAAU;AACV,+BAA+B;AAC/B,oCAAoC;AAKpC,OAAO,EAAC,SAAS,EAAwB,iCAA8B;AACvE,OAAO,EAAC,YAAY,EAAC,2BAAwB;AAC7C,OAAO,EAAC,mBAAmB,EAAC,4CAAyC;AACrE,OAAO,EAAC,QAAQ,EAAC,8BAA2B;AAE5C,MAAM,UAAU,yBAAyB,CACvC,MAAc,EACd,IAAuB,EACvB,OAA0B;IAK1B,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC;IACtB,MAAM,MAAM,GAAG,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;IAChD,kEAAkE;IAClE,MAAM,UAAU,GAAG,mBAAmB,CAAC,IAAI,CAAC,CAAC;IAC7C,MAAM,QAAQ,GAAG,IAAI,YAAY,CAAC,EAAC,UAAU,EAAC,CAAC,CAAC;IAChD,OAAO,EAAC,MAAM,EAAE,QAAQ,EAAC,CAAC;AAC5B,CAAC"}
1
+ {"version":3,"file":"create-scenegraph-from-gltf.js","sourceRoot":"","sources":["../../src/gltf/create-scenegraph-from-gltf.ts"],"names":[],"mappings":"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"}
@@ -1,27 +1,64 @@
1
+ import { GroupNode, Material } from '@luma.gl/engine';
1
2
  import { GLTFAnimation } from "./animations/animations.js";
3
+ import { type PBRTextureTransform, type PBRTextureTransformSlot } from "../pbr/texture-transform.js";
4
+ /** Construction props for a single glTF animation controller. */
2
5
  type GLTFSingleAnimatorProps = {
6
+ /** Animation data to evaluate. */
3
7
  animation: GLTFAnimation;
8
+ /** Mapping from glTF node ids to scenegraph nodes. */
9
+ gltfNodeIdToNodeMap: Map<string, GroupNode>;
10
+ /** Materials aligned with the source glTF materials array. */
11
+ materials?: Material[];
12
+ /** Start time in seconds. */
4
13
  startTime?: number;
14
+ /** Whether playback is active. */
5
15
  playing?: boolean;
16
+ /** Playback speed multiplier. */
6
17
  speed?: number;
7
18
  };
19
+ /** Evaluates one glTF animation against the generated scenegraph. */
8
20
  declare class GLTFSingleAnimator {
21
+ /** Animation definition being played. */
9
22
  animation: GLTFAnimation;
23
+ /** Target scenegraph lookup table. */
24
+ gltfNodeIdToNodeMap: Map<string, GroupNode>;
25
+ /** Materials aligned with the source glTF materials array. */
26
+ materials: Material[];
27
+ /** Playback start time in seconds. */
10
28
  startTime: number;
29
+ /** Whether playback is currently enabled. */
11
30
  playing: boolean;
31
+ /** Playback speed multiplier. */
12
32
  speed: number;
33
+ /** Mutable runtime texture-transform state for animated material slots. */
34
+ materialTextureTransformState: Map<Material<Partial<Record<string, Record<string, unknown>>>, {
35
+ [x: string]: import("@luma.gl/engine").DynamicTexture | import("@luma.gl/core").Binding;
36
+ }>, Partial<Record<PBRTextureTransformSlot, PBRTextureTransform>>>;
37
+ /** Creates a single-animation controller. */
13
38
  constructor(props: GLTFSingleAnimatorProps);
39
+ /** Advances the animation to the supplied wall-clock time in milliseconds. */
14
40
  setTime(timeMs: number): void;
15
41
  }
42
+ /** Construction props for {@link GLTFAnimator}. */
16
43
  export type GLTFAnimatorProps = {
44
+ /** Parsed animations from the source glTF. */
17
45
  animations: GLTFAnimation[];
46
+ /** Mapping from glTF node ids to scenegraph nodes. */
47
+ gltfNodeIdToNodeMap: Map<string, GroupNode>;
48
+ /** Materials aligned with the source glTF materials array. */
49
+ materials?: Material[];
18
50
  };
51
+ /** Coordinates playback of every animation found in a glTF scene. */
19
52
  export declare class GLTFAnimator {
53
+ /** Individual animation controllers. */
20
54
  animations: GLTFSingleAnimator[];
55
+ /** Creates an animator for the supplied glTF scenegraph. */
21
56
  constructor(props: GLTFAnimatorProps);
22
57
  /** @deprecated Use .setTime(). Will be removed (deck.gl is using this) */
23
58
  animate(time: number): void;
59
+ /** Advances every animation to the supplied wall-clock time in milliseconds. */
24
60
  setTime(time: number): void;
61
+ /** Returns the per-animation controllers managed by this animator. */
25
62
  getAnimations(): GLTFSingleAnimator[];
26
63
  }
27
64
  export {};
@@ -1 +1 @@
1
- {"version":3,"file":"gltf-animator.d.ts","sourceRoot":"","sources":["../../src/gltf/gltf-animator.ts"],"names":[],"mappings":"AAQA,OAAO,EAAC,aAAa,EAAC,mCAAgC;AAGtD,KAAK,uBAAuB,GAAG;IAC7B,SAAS,EAAE,aAAa,CAAC;IACzB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,cAAM,kBAAkB;IACtB,SAAS,EAAE,aAAa,CAAC;IACzB,SAAS,EAAE,MAAM,CAAK;IACtB,OAAO,EAAE,OAAO,CAAQ;IACxB,KAAK,EAAE,MAAM,CAAK;gBAEN,KAAK,EAAE,uBAAuB;IAM1C,OAAO,CAAC,MAAM,EAAE,MAAM;CAavB;AAED,MAAM,MAAM,iBAAiB,GAAG;IAC9B,UAAU,EAAE,aAAa,EAAE,CAAC;CAC7B,CAAC;AAEF,qBAAa,YAAY;IACvB,UAAU,EAAE,kBAAkB,EAAE,CAAC;gBAErB,KAAK,EAAE,iBAAiB;IASpC,0EAA0E;IAC1E,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAK3B,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAI3B,aAAa;CAGd"}
1
+ {"version":3,"file":"gltf-animator.d.ts","sourceRoot":"","sources":["../../src/gltf/gltf-animator.ts"],"names":[],"mappings":"AAKA,OAAO,EAAC,SAAS,EAAE,QAAQ,EAAC,MAAM,iBAAiB,CAAC;AACpD,OAAO,EACL,aAAa,EAId,mCAAgC;AAEjC,OAAO,EAGL,KAAK,mBAAmB,EACxB,KAAK,uBAAuB,EAC7B,oCAAiC;AAElC,iEAAiE;AACjE,KAAK,uBAAuB,GAAG;IAC7B,kCAAkC;IAClC,SAAS,EAAE,aAAa,CAAC;IACzB,sDAAsD;IACtD,mBAAmB,EAAE,GAAG,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IAC5C,8DAA8D;IAC9D,SAAS,CAAC,EAAE,QAAQ,EAAE,CAAC;IACvB,6BAA6B;IAC7B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,kCAAkC;IAClC,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,iCAAiC;IACjC,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,qEAAqE;AACrE,cAAM,kBAAkB;IACtB,yCAAyC;IACzC,SAAS,EAAE,aAAa,CAAC;IACzB,sCAAsC;IACtC,mBAAmB,EAAE,GAAG,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IAC5C,8DAA8D;IAC9D,SAAS,EAAE,QAAQ,EAAE,CAAC;IACtB,sCAAsC;IACtC,SAAS,EAAE,MAAM,CAAK;IACtB,6CAA6C;IAC7C,OAAO,EAAE,OAAO,CAAQ;IACxB,iCAAiC;IACjC,KAAK,EAAE,MAAM,CAAK;IAClB,2EAA2E;IAC3E,6BAA6B;;uEAGzB;IAEJ,6CAA6C;gBACjC,KAAK,EAAE,uBAAuB;IAiB1C,8EAA8E;IAC9E,OAAO,CAAC,MAAM,EAAE,MAAM;CA0CvB;AAED,mDAAmD;AACnD,MAAM,MAAM,iBAAiB,GAAG;IAC9B,8CAA8C;IAC9C,UAAU,EAAE,aAAa,EAAE,CAAC;IAC5B,sDAAsD;IACtD,mBAAmB,EAAE,GAAG,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IAC5C,8DAA8D;IAC9D,SAAS,CAAC,EAAE,QAAQ,EAAE,CAAC;CACxB,CAAC;AAEF,qEAAqE;AACrE,qBAAa,YAAY;IACvB,wCAAwC;IACxC,UAAU,EAAE,kBAAkB,EAAE,CAAC;IAEjC,4DAA4D;gBAChD,KAAK,EAAE,iBAAiB;IAWpC,0EAA0E;IAC1E,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAK3B,gFAAgF;IAChF,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAI3B,sEAAsE;IACtE,aAAa;CAGd"}
@@ -2,36 +2,80 @@
2
2
  // SPDX-License-Identifier: MIT
3
3
  // Copyright (c) vis.gl contributors
4
4
  import { log } from '@luma.gl/core';
5
- import { Matrix4 } from '@math.gl/core';
6
- import { interpolate } from "./animations/interpolate.js";
5
+ import { evaluateSampler, interpolate } from "./animations/interpolate.js";
6
+ import { getTextureTransformDeltaMatrix, getTextureTransformSlotDefinition } from "../pbr/texture-transform.js";
7
+ /** Evaluates one glTF animation against the generated scenegraph. */
7
8
  class GLTFSingleAnimator {
9
+ /** Animation definition being played. */
8
10
  animation;
11
+ /** Target scenegraph lookup table. */
12
+ gltfNodeIdToNodeMap;
13
+ /** Materials aligned with the source glTF materials array. */
14
+ materials;
15
+ /** Playback start time in seconds. */
9
16
  startTime = 0;
17
+ /** Whether playback is currently enabled. */
10
18
  playing = true;
19
+ /** Playback speed multiplier. */
11
20
  speed = 1;
21
+ /** Mutable runtime texture-transform state for animated material slots. */
22
+ materialTextureTransformState = new Map();
23
+ /** Creates a single-animation controller. */
12
24
  constructor(props) {
13
25
  this.animation = props.animation;
26
+ this.gltfNodeIdToNodeMap = props.gltfNodeIdToNodeMap;
27
+ this.materials = props.materials || [];
14
28
  this.animation.name ||= 'unnamed';
15
29
  Object.assign(this, props);
30
+ if (this.animation.channels.some(channel => channel.type !== 'node') &&
31
+ !this.materials.length) {
32
+ throw new Error(`Animation ${this.animation.name} targets materials, but GLTFAnimator was created without a materials array`);
33
+ }
16
34
  }
35
+ /** Advances the animation to the supplied wall-clock time in milliseconds. */
17
36
  setTime(timeMs) {
18
37
  if (!this.playing) {
19
38
  return;
20
39
  }
21
40
  const absTime = timeMs / 1000;
22
41
  const time = (absTime - this.startTime) * this.speed;
23
- this.animation.channels.forEach(({ sampler, target, path }) => {
24
- interpolate(time, sampler, target, path);
25
- applyTranslationRotationScale(target, target._node);
42
+ this.animation.channels.forEach(channel => {
43
+ if (channel.type === 'node') {
44
+ const { sampler, targetNodeId, path } = channel;
45
+ const targetNode = this.gltfNodeIdToNodeMap.get(targetNodeId);
46
+ if (!targetNode) {
47
+ throw new Error(`Cannot find animation target node ${targetNodeId}`);
48
+ }
49
+ interpolate(time, sampler, targetNode, path);
50
+ return;
51
+ }
52
+ const material = this.materials[channel.targetMaterialIndex];
53
+ if (!material) {
54
+ throw new Error(`Cannot find animation target material ${channel.targetMaterialIndex} for ${channel.pointer}`);
55
+ }
56
+ const value = evaluateSampler(time, channel.sampler);
57
+ if (value) {
58
+ if (channel.type === 'material') {
59
+ applyMaterialAnimationValue(material, channel, value);
60
+ }
61
+ else {
62
+ applyTextureTransformAnimationValue(material, channel, value, this.materialTextureTransformState);
63
+ }
64
+ }
26
65
  });
27
66
  }
28
67
  }
68
+ /** Coordinates playback of every animation found in a glTF scene. */
29
69
  export class GLTFAnimator {
70
+ /** Individual animation controllers. */
30
71
  animations;
72
+ /** Creates an animator for the supplied glTF scenegraph. */
31
73
  constructor(props) {
32
74
  this.animations = props.animations.map((animation, index) => {
33
75
  const name = animation.name || `Animation-${index}`;
34
76
  return new GLTFSingleAnimator({
77
+ gltfNodeIdToNodeMap: props.gltfNodeIdToNodeMap,
78
+ materials: props.materials,
35
79
  animation: { name, channels: animation.channels }
36
80
  });
37
81
  });
@@ -41,26 +85,77 @@ export class GLTFAnimator {
41
85
  log.warn('GLTFAnimator#animate is deprecated. Use GLTFAnimator#setTime instead')();
42
86
  this.setTime(time);
43
87
  }
88
+ /** Advances every animation to the supplied wall-clock time in milliseconds. */
44
89
  setTime(time) {
45
90
  this.animations.forEach(animation => animation.setTime(time));
46
91
  }
92
+ /** Returns the per-animation controllers managed by this animator. */
47
93
  getAnimations() {
48
94
  return this.animations;
49
95
  }
50
96
  }
51
- // TODO: share with GLTFInstantiator
52
- const scratchMatrix = new Matrix4();
53
- function applyTranslationRotationScale(gltfNode, node) {
54
- node.matrix.identity();
55
- if (gltfNode.translation) {
56
- node.matrix.translate(gltfNode.translation);
57
- }
58
- if (gltfNode.rotation) {
59
- const rotationMatrix = scratchMatrix.fromQuaternion(gltfNode.rotation);
60
- node.matrix.multiplyRight(rotationMatrix);
97
+ function applyMaterialAnimationValue(material, channel, value) {
98
+ const pbrMaterial = channel.component !== undefined
99
+ ? {
100
+ [channel.property]: updateMaterialArrayComponent(getCurrentMaterialValue(material, channel.property), channel.component, value[0])
101
+ }
102
+ : {
103
+ [channel.property]: value.length === 1 ? value[0] : value
104
+ };
105
+ material.setProps({ pbrMaterial });
106
+ }
107
+ function getCurrentMaterialValue(material, property) {
108
+ const uniformValues = material.shaderInputs.getUniformValues();
109
+ const currentValue = uniformValues['pbrMaterial']?.[property];
110
+ return Array.isArray(currentValue) ? [...currentValue] : [];
111
+ }
112
+ function updateMaterialArrayComponent(currentValue, component, nextValue) {
113
+ const updatedValue = [...currentValue];
114
+ updatedValue[component] = nextValue;
115
+ return updatedValue;
116
+ }
117
+ function applyTextureTransformAnimationValue(material, channel, value, materialTextureTransformState) {
118
+ const slotDefinition = getTextureTransformSlotDefinition(channel.textureSlot);
119
+ const currentTransform = getCurrentTextureTransform(materialTextureTransformState, material, channel);
120
+ switch (channel.path) {
121
+ case 'offset':
122
+ if (channel.component !== undefined) {
123
+ currentTransform.offset[channel.component] = value[0];
124
+ }
125
+ else {
126
+ currentTransform.offset = [value[0], value[1]];
127
+ }
128
+ break;
129
+ case 'rotation':
130
+ currentTransform.rotation = value[0];
131
+ break;
132
+ case 'scale':
133
+ if (channel.component !== undefined) {
134
+ currentTransform.scale[channel.component] = value[0];
135
+ }
136
+ else {
137
+ currentTransform.scale = [value[0], value[1]];
138
+ }
139
+ break;
61
140
  }
62
- if (gltfNode.scale) {
63
- node.matrix.scale(gltfNode.scale);
141
+ material.setProps({
142
+ pbrMaterial: {
143
+ [slotDefinition.uvTransformUniform]: getTextureTransformDeltaMatrix(channel.baseTransform, currentTransform)
144
+ }
145
+ });
146
+ }
147
+ function getCurrentTextureTransform(materialTextureTransformState, material, channel) {
148
+ const materialState = materialTextureTransformState.get(material) || {};
149
+ let textureTransformState = materialState[channel.textureSlot];
150
+ if (!textureTransformState) {
151
+ textureTransformState = {
152
+ offset: [...channel.baseTransform.offset],
153
+ rotation: channel.baseTransform.rotation,
154
+ scale: [...channel.baseTransform.scale]
155
+ };
156
+ materialState[channel.textureSlot] = textureTransformState;
157
+ materialTextureTransformState.set(material, materialState);
64
158
  }
159
+ return textureTransformState;
65
160
  }
66
161
  //# sourceMappingURL=gltf-animator.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"gltf-animator.js","sourceRoot":"","sources":["../../src/gltf/gltf-animator.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"gltf-animator.js","sourceRoot":"","sources":["../../src/gltf/gltf-animator.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ import type { GLTFPostprocessed } from '@loaders.gl/gltf';
2
+ export type GLTFExtensionSupportLevel = 'built-in' | 'parsed-and-wired' | 'loader-only' | 'none';
3
+ export type GLTFExtensionSupport = {
4
+ extensionName: string;
5
+ supported: boolean;
6
+ supportLevel: GLTFExtensionSupportLevel;
7
+ comment: string;
8
+ };
9
+ type GLTFExtensionSupportDefinition = Omit<GLTFExtensionSupport, 'extensionName' | 'supported'>;
10
+ export declare function getGLTFExtensionSupport(gltf: GLTFPostprocessed): Map<string, GLTFExtensionSupport>;
11
+ export declare function getRegisteredGLTFExtensionSupport(extensionName: string): GLTFExtensionSupportDefinition | null;
12
+ export {};
13
+ //# sourceMappingURL=gltf-extension-support.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gltf-extension-support.d.ts","sourceRoot":"","sources":["../../src/gltf/gltf-extension-support.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAC,iBAAiB,EAAC,MAAM,kBAAkB,CAAC;AAExD,MAAM,MAAM,yBAAyB,GAAG,UAAU,GAAG,kBAAkB,GAAG,aAAa,GAAG,MAAM,CAAC;AAEjG,MAAM,MAAM,oBAAoB,GAAG;IACjC,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,OAAO,CAAC;IACnB,YAAY,EAAE,yBAAyB,CAAC;IACxC,OAAO,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF,KAAK,8BAA8B,GAAG,IAAI,CAAC,oBAAoB,EAAE,eAAe,GAAG,WAAW,CAAC,CAAC;AAkJhG,wBAAgB,uBAAuB,CACrC,IAAI,EAAE,iBAAiB,GACtB,GAAG,CAAC,MAAM,EAAE,oBAAoB,CAAC,CAsBnC;AAED,wBAAgB,iCAAiC,CAC/C,aAAa,EAAE,MAAM,GACpB,8BAA8B,GAAG,IAAI,CAEvC"}
@@ -0,0 +1,178 @@
1
+ // luma.gl
2
+ // SPDX-License-Identifier: MIT
3
+ // Copyright (c) vis.gl contributors
4
+ const UNKNOWN_EXTENSION_SUPPORT = {
5
+ supportLevel: 'none',
6
+ comment: 'Not currently listed in the luma.gl glTF extension support registry.'
7
+ };
8
+ const GLTF_EXTENSION_SUPPORT_REGISTRY = {
9
+ KHR_draco_mesh_compression: {
10
+ supportLevel: 'built-in',
11
+ comment: 'Decoded by loaders.gl before luma.gl builds the scenegraph.'
12
+ },
13
+ EXT_meshopt_compression: {
14
+ supportLevel: 'built-in',
15
+ comment: 'Meshopt-compressed primitives are decoded during load.'
16
+ },
17
+ KHR_mesh_quantization: {
18
+ supportLevel: 'built-in',
19
+ comment: 'Quantized accessors are unpacked before geometry creation.'
20
+ },
21
+ KHR_lights_punctual: {
22
+ supportLevel: 'built-in',
23
+ comment: 'Parsed into luma.gl Light objects.'
24
+ },
25
+ KHR_materials_unlit: {
26
+ supportLevel: 'built-in',
27
+ comment: 'Unlit materials bypass the default lighting path.'
28
+ },
29
+ KHR_materials_emissive_strength: {
30
+ supportLevel: 'built-in',
31
+ comment: 'Applied by the stock PBR shader.'
32
+ },
33
+ KHR_texture_basisu: {
34
+ supportLevel: 'built-in',
35
+ comment: 'BasisU / KTX2 textures pass through when the device supports them.'
36
+ },
37
+ KHR_texture_transform: {
38
+ supportLevel: 'built-in',
39
+ comment: 'UV transforms are applied during load.'
40
+ },
41
+ EXT_texture_webp: {
42
+ supportLevel: 'loader-only',
43
+ comment: 'Texture source is resolved during load; final support depends on browser and device decode support.'
44
+ },
45
+ EXT_texture_avif: {
46
+ supportLevel: 'loader-only',
47
+ comment: 'Texture source is resolved during load; final support depends on browser and device decode support.'
48
+ },
49
+ KHR_materials_specular: {
50
+ supportLevel: 'built-in',
51
+ comment: 'The stock shader now applies specular factors and textures to the dielectric F0 term.'
52
+ },
53
+ KHR_materials_ior: {
54
+ supportLevel: 'built-in',
55
+ comment: 'The stock shader now drives dielectric reflectance from the glTF IOR value.'
56
+ },
57
+ KHR_materials_transmission: {
58
+ supportLevel: 'built-in',
59
+ comment: 'The stock shader now applies transmission to the base layer and exposes transparency through alpha, without a scene-color refraction buffer.'
60
+ },
61
+ KHR_materials_volume: {
62
+ supportLevel: 'built-in',
63
+ comment: 'Thickness and attenuation now tint transmitted light in the stock shader.'
64
+ },
65
+ KHR_materials_clearcoat: {
66
+ supportLevel: 'built-in',
67
+ comment: 'The stock shader now adds a secondary clearcoat specular lobe.'
68
+ },
69
+ KHR_materials_sheen: {
70
+ supportLevel: 'built-in',
71
+ comment: 'The stock shader now adds a sheen lobe for cloth-like materials.'
72
+ },
73
+ KHR_materials_iridescence: {
74
+ supportLevel: 'built-in',
75
+ comment: 'The stock shader now tints specular response with a view-dependent thin-film iridescence approximation.'
76
+ },
77
+ KHR_materials_anisotropy: {
78
+ supportLevel: 'built-in',
79
+ comment: 'The stock shader now shapes highlights and IBL response with an anisotropy-direction approximation.'
80
+ },
81
+ KHR_materials_pbrSpecularGlossiness: {
82
+ supportLevel: 'loader-only',
83
+ comment: 'Extension data can be loaded, but it is not translated into the default metallic-roughness material path.'
84
+ },
85
+ KHR_materials_variants: {
86
+ supportLevel: 'loader-only',
87
+ comment: 'Variant metadata can be loaded, but applications must choose and apply variants.'
88
+ },
89
+ EXT_mesh_gpu_instancing: {
90
+ supportLevel: 'none',
91
+ comment: 'GPU instancing data is not yet converted into luma.gl instanced draw setup.'
92
+ },
93
+ KHR_node_visibility: {
94
+ supportLevel: 'none',
95
+ comment: 'Node-visibility animations and toggles are not mapped onto runtime scenegraph state.'
96
+ },
97
+ KHR_animation_pointer: {
98
+ supportLevel: 'parsed-and-wired',
99
+ comment: 'Selected node TRS, material factor, and KHR_texture_transform offset/rotation/scale pointers are wired to runtime updates; unsupported targets are skipped.'
100
+ },
101
+ KHR_materials_diffuse_transmission: {
102
+ supportLevel: 'none',
103
+ comment: 'Diffuse-transmission shading is not implemented in the stock PBR shader.'
104
+ },
105
+ KHR_materials_dispersion: {
106
+ supportLevel: 'none',
107
+ comment: 'Chromatic dispersion is not implemented in the stock PBR shader.'
108
+ },
109
+ KHR_materials_volume_scatter: {
110
+ supportLevel: 'none',
111
+ comment: 'Volume scattering is not implemented in the stock PBR shader.'
112
+ },
113
+ KHR_xmp: {
114
+ supportLevel: 'none',
115
+ comment: 'Metadata payloads remain in the loaded glTF, but luma.gl does not interpret them.'
116
+ },
117
+ KHR_xmp_json_ld: {
118
+ supportLevel: 'none',
119
+ comment: 'Metadata is preserved in the glTF, but luma.gl does not interpret it.'
120
+ },
121
+ EXT_lights_image_based: {
122
+ supportLevel: 'none',
123
+ comment: 'Use loadPBREnvironment() or custom environment setup instead.'
124
+ },
125
+ EXT_texture_video: {
126
+ supportLevel: 'none',
127
+ comment: 'Video textures are not created automatically by the stock pipeline.'
128
+ },
129
+ MSFT_lod: {
130
+ supportLevel: 'none',
131
+ comment: 'Level-of-detail switching is not implemented in the stock scenegraph loader.'
132
+ }
133
+ };
134
+ export function getGLTFExtensionSupport(gltf) {
135
+ const extensionNames = Array.from(collectGLTFExtensionNames(gltf)).sort();
136
+ const extensionSupportEntries = extensionNames.map(extensionName => {
137
+ const extensionSupportDefinition = GLTF_EXTENSION_SUPPORT_REGISTRY[extensionName] || UNKNOWN_EXTENSION_SUPPORT;
138
+ return [
139
+ extensionName,
140
+ {
141
+ extensionName,
142
+ supported: extensionSupportDefinition.supportLevel === 'built-in' ||
143
+ extensionSupportDefinition.supportLevel === 'parsed-and-wired',
144
+ supportLevel: extensionSupportDefinition.supportLevel,
145
+ comment: extensionSupportDefinition.comment
146
+ }
147
+ ];
148
+ });
149
+ return new Map(extensionSupportEntries);
150
+ }
151
+ export function getRegisteredGLTFExtensionSupport(extensionName) {
152
+ return GLTF_EXTENSION_SUPPORT_REGISTRY[extensionName] || null;
153
+ }
154
+ function collectGLTFExtensionNames(gltf) {
155
+ const gltfWithRemovedExtensions = gltf;
156
+ const extensionNames = new Set();
157
+ addExtensionNames(extensionNames, gltf.extensionsUsed);
158
+ addExtensionNames(extensionNames, gltf.extensionsRequired);
159
+ addExtensionNames(extensionNames, gltfWithRemovedExtensions.extensionsRemoved);
160
+ addExtensionNames(extensionNames, Object.keys(gltf.extensions || {}));
161
+ if (gltfWithRemovedExtensions.lights?.length ||
162
+ (gltf.nodes || []).some(node => 'light' in node)) {
163
+ extensionNames.add('KHR_lights_punctual');
164
+ }
165
+ if ((gltf.materials || []).some(material => {
166
+ const gltfMaterial = material;
167
+ return gltfMaterial.unlit || gltfMaterial.extensions?.KHR_materials_unlit;
168
+ })) {
169
+ extensionNames.add('KHR_materials_unlit');
170
+ }
171
+ return extensionNames;
172
+ }
173
+ function addExtensionNames(extensionNames, newExtensionNames = []) {
174
+ for (const extensionName of newExtensionNames) {
175
+ extensionNames.add(extensionName);
176
+ }
177
+ }
178
+ //# sourceMappingURL=gltf-extension-support.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gltf-extension-support.js","sourceRoot":"","sources":["../../src/gltf/gltf-extension-support.ts"],"names":[],"mappings":"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"}