@luma.gl/gltf 9.0.0-alpha.54 → 9.0.0-beta.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 (38) hide show
  1. package/dist/dist.dev.js +3643 -15000
  2. package/dist/dist.min.js +393 -0
  3. package/dist/gltf/create-gltf-model.d.ts +1 -1
  4. package/dist/gltf/create-gltf-model.d.ts.map +1 -1
  5. package/dist/gltf/create-gltf-model.js +34 -51
  6. package/dist/gltf/create-gltf-objects.d.ts +2 -2
  7. package/dist/gltf/create-gltf-objects.d.ts.map +1 -1
  8. package/dist/gltf/create-gltf-objects.js +4 -8
  9. package/dist/gltf/gltf-animator.d.ts.map +1 -1
  10. package/dist/gltf/gltf-animator.js +167 -202
  11. package/dist/gltf/gltf-instantiator.d.ts +3 -4
  12. package/dist/gltf/gltf-instantiator.d.ts.map +1 -1
  13. package/dist/gltf/gltf-instantiator.js +170 -161
  14. package/dist/index.cjs +62 -63
  15. package/dist/index.cjs.map +7 -0
  16. package/dist/index.d.ts +6 -6
  17. package/dist/index.d.ts.map +1 -1
  18. package/dist/index.js +2 -1
  19. package/dist/pbr/parse-pbr-material.d.ts +1 -1
  20. package/dist/pbr/parse-pbr-material.d.ts.map +1 -1
  21. package/dist/pbr/parse-pbr-material.js +320 -135
  22. package/dist/pbr/pbr-environment.d.ts.map +1 -1
  23. package/dist/pbr/pbr-environment.js +56 -59
  24. package/dist.min.js +4 -1215
  25. package/package.json +14 -15
  26. package/src/gltf/create-gltf-model.ts +4 -4
  27. package/src/gltf/gltf-animator.ts +3 -3
  28. package/src/gltf/gltf-instantiator.ts +45 -30
  29. package/src/index.ts +0 -1
  30. package/src/pbr/parse-pbr-material.ts +15 -12
  31. package/src/pbr/pbr-environment.ts +18 -11
  32. package/dist/gltf/create-gltf-model.js.map +0 -1
  33. package/dist/gltf/create-gltf-objects.js.map +0 -1
  34. package/dist/gltf/gltf-animator.js.map +0 -1
  35. package/dist/gltf/gltf-instantiator.js.map +0 -1
  36. package/dist/index.js.map +0 -1
  37. package/dist/pbr/parse-pbr-material.js.map +0 -1
  38. package/dist/pbr/pbr-environment.js.map +0 -1
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@luma.gl/gltf",
3
- "version": "9.0.0-alpha.54",
3
+ "version": "9.0.0-beta.10",
4
4
  "description": "glTF support for luma.gl",
5
5
  "type": "module",
6
6
  "license": "MIT",
@@ -22,9 +22,9 @@
22
22
  "module": "dist/index.js",
23
23
  "exports": {
24
24
  ".": {
25
+ "types": "./dist/index.d.ts",
25
26
  "import": "./dist/index.js",
26
- "require": "./dist/index.cjs",
27
- "types": "./dist/index.d.ts"
27
+ "require": "./dist/index.cjs"
28
28
  }
29
29
  },
30
30
  "files": [
@@ -35,19 +35,18 @@
35
35
  ],
36
36
  "sideEffects": false,
37
37
  "scripts": {
38
- "build-bundle": "ocular-bundle ./src/index.ts",
39
- "pre-build": "npm run build-bundle && npm run build-bundle -- --env=dev"
38
+ "build-minified-bundle": "ocular-bundle ./bundle.ts --output=dist/dist.min.js",
39
+ "build-dev-bundle": "ocular-bundle ./bundle.ts --output=dist/dist.dev.js --env=dev",
40
+ "prepublishOnly": "npm run build-minified-bundle && npm run build-dev-bundle"
40
41
  },
41
- "dependencies": {
42
- "@luma.gl/core": "9.0.0-alpha.54",
43
- "@luma.gl/engine": "9.0.0-alpha.54",
44
- "@luma.gl/webgl": "9.0.0-alpha.54",
45
- "@math.gl/core": "4.0.0"
42
+ "peerDependencies": {
43
+ "@luma.gl/core": "^9.0.0-beta",
44
+ "@luma.gl/engine": "^9.0.0-beta"
46
45
  },
47
- "devDependencies": {
48
- "@loaders.gl/gltf": "^4.0.4",
49
- "@loaders.gl/math": "^4.0.4",
50
- "@luma.gl/test-utils": "9.0.0-alpha.54"
46
+ "dependencies": {
47
+ "@loaders.gl/textures": "^4.1.0",
48
+ "@luma.gl/shadertools": "9.0.0-beta.10",
49
+ "@math.gl/core": "^4.0.0"
51
50
  },
52
- "gitHead": "6028eb651303eadbc8f25e86d135d28f118fa3cf"
51
+ "gitHead": "1b36500a878e1b365425826750320dde7d6929bb"
53
52
  }
@@ -93,7 +93,7 @@ export function createGLTFModel(device: Device, options: CreateGLTFModelOptions)
93
93
  depthCompare: 'less',
94
94
  depthFormat: 'depth24plus',
95
95
  cullMode: 'back'
96
- }
96
+ };
97
97
 
98
98
  const modelProps: ModelProps = {
99
99
  id,
@@ -109,12 +109,12 @@ export function createGLTFModel(device: Device, options: CreateGLTFModelOptions)
109
109
  defines: {...parsedMaterial.defines, ...modelOptions.defines},
110
110
  parameters: {...parameters, ...parsedMaterial.parameters, ...modelOptions.parameters},
111
111
  uniforms: {...parsedMaterial.uniforms, ...modelOptions.uniforms}
112
- }
112
+ };
113
113
 
114
114
  const model = new Model(device, modelProps);
115
- return new ModelNode({ managedResources, model});
115
+ return new ModelNode({managedResources, model});
116
116
  }
117
117
 
118
118
  function addVersionToShader(device: Device, source: string): string {
119
- return device.info.type === 'webgl2' ? `#version 300 es\n${source}` : source;
119
+ return `#version 300 es\n${source}`;
120
120
  }
@@ -27,7 +27,7 @@ type GLTFAnimationProps = {
27
27
  playing?: boolean;
28
28
  speed?: number;
29
29
  channels?: any;
30
- }
30
+ };
31
31
 
32
32
  class GLTFAnimation {
33
33
  name: string;
@@ -81,7 +81,7 @@ export class GLTFAnimator {
81
81
  }
82
82
 
83
83
  setTime(time: number): void {
84
- this.animations.forEach((animation) => animation.animate(time));
84
+ this.animations.forEach(animation => animation.animate(time));
85
85
  }
86
86
 
87
87
  getAnimations() {
@@ -173,7 +173,7 @@ function interpolate(time, {input, interpolation, output}, target, path) {
173
173
  const maxTime = input[input.length - 1];
174
174
  const animationTime = time % maxTime;
175
175
 
176
- const nextIndex = input.findIndex((t) => t >= animationTime);
176
+ const nextIndex = input.findIndex(t => t >= animationTime);
177
177
  const previousIndex = Math.max(0, nextIndex - 1);
178
178
 
179
179
  if (!Array.isArray(target[path])) {
@@ -1,7 +1,5 @@
1
1
  import {Device, Buffer, PrimitiveTopology} from '@luma.gl/core';
2
- import {Geometry, GroupNode, ModelNode, ModelProps} from '@luma.gl/engine';
3
- import {GeometryAttribute} from '@luma.gl/engine/geometry/geometry';
4
- import {WebGLDevice} from '@luma.gl/webgl';
2
+ import {Geometry, GeometryAttribute, GroupNode, ModelNode, ModelProps} from '@luma.gl/engine';
5
3
  import {Matrix4} from '@math.gl/core';
6
4
 
7
5
  import {GLTFAnimator} from './gltf-animator';
@@ -9,12 +7,12 @@ import {createGLTFModel} from './create-gltf-model';
9
7
  import type {PBREnvironment} from '../pbr/pbr-environment';
10
8
 
11
9
  export type GLTFInstantiatorOptions = {
12
- modelOptions?: Partial<ModelProps>,
13
- pbrDebug?: boolean,
14
- imageBasedLightingEnvironment?: PBREnvironment,
15
- lights?: boolean,
16
- useTangents?: boolean
17
- }
10
+ modelOptions?: Partial<ModelProps>;
11
+ pbrDebug?: boolean;
12
+ imageBasedLightingEnvironment?: PBREnvironment;
13
+ lights?: boolean;
14
+ useTangents?: boolean;
15
+ };
18
16
 
19
17
  const DEFAULT_OPTIONS: GLTFInstantiatorOptions = {
20
18
  modelOptions: {},
@@ -29,19 +27,18 @@ const DEFAULT_OPTIONS: GLTFInstantiatorOptions = {
29
27
  * Walks the parsed and resolved glTF structure and builds a luma.gl scenegraph
30
28
  */
31
29
  export class GLTFInstantiator {
32
- // TODO - replace with Device
33
- device: WebGLDevice;
30
+ device: Device;
34
31
  options: GLTFInstantiatorOptions;
35
32
  gltf: any;
36
33
 
37
34
  constructor(device: Device, options: GLTFInstantiatorOptions = {}) {
38
- this.device = WebGLDevice.attach(device);
35
+ this.device = device;
39
36
  this.options = {...DEFAULT_OPTIONS, ...options};
40
37
  }
41
38
 
42
39
  instantiate(gltf: any): GroupNode[] {
43
40
  this.gltf = gltf;
44
- const scenes = (gltf.scenes || []).map((scene) => this.createScene(scene));
41
+ const scenes = (gltf.scenes || []).map(scene => this.createScene(scene));
45
42
  return scenes;
46
43
  }
47
44
 
@@ -55,7 +52,7 @@ export class GLTFInstantiator {
55
52
 
56
53
  createScene(gltfScene: any): GroupNode {
57
54
  const gltfNodes = gltfScene.nodes || [];
58
- const nodes = gltfNodes.map((node) => this.createNode(node));
55
+ const nodes = gltfNodes.map(node => this.createNode(node));
59
56
  const scene = new GroupNode({
60
57
  id: gltfScene.name || gltfScene.id,
61
58
  children: nodes
@@ -66,7 +63,7 @@ export class GLTFInstantiator {
66
63
  createNode(gltfNode) {
67
64
  if (!gltfNode._node) {
68
65
  const gltfChildren = gltfNode.children || [];
69
- const children = gltfChildren.map((child) => this.createNode(child));
66
+ const children = gltfChildren.map(child => this.createNode(child));
70
67
 
71
68
  // Node can have children nodes and meshes at the same time
72
69
  if (gltfNode.mesh) {
@@ -128,14 +125,17 @@ export class GLTFInstantiator {
128
125
 
129
126
  const modelNode = createGLTFModel(this.device, {
130
127
  id,
131
- geometry: this.createGeometry(id, gltfPrimitive, topology),
128
+ geometry: this.createGeometry(id, gltfPrimitive, topology),
132
129
  material: gltfPrimitive.material,
133
130
  materialOptions: this.options,
134
131
  modelOptions: this.options.modelOptions,
135
132
  vertexCount
136
133
  });
137
134
 
138
- modelNode.bounds = [gltfPrimitive.attributes.POSITION.min, gltfPrimitive.attributes.POSITION.max];
135
+ modelNode.bounds = [
136
+ gltfPrimitive.attributes.POSITION.min,
137
+ gltfPrimitive.attributes.POSITION.max
138
+ ];
139
139
  // TODO this holds on to all the CPU side texture and attribute data
140
140
  // modelNode.material = gltfPrimitive.material;
141
141
 
@@ -147,12 +147,12 @@ export class GLTFInstantiator {
147
147
  }
148
148
 
149
149
  createGeometry(id: string, gltfPrimitive: any, topology: PrimitiveTopology): Geometry {
150
- const attributes = {}
150
+ const attributes = {};
151
151
  for (const [attributeName, attribute] of Object.entries(gltfPrimitive.attributes)) {
152
152
  const {components, size, value} = attribute as GeometryAttribute;
153
153
 
154
154
  attributes[attributeName] = {size: size ?? components, value};
155
- };
155
+ }
156
156
 
157
157
  return new Geometry({
158
158
  id,
@@ -177,7 +177,7 @@ export class GLTFInstantiator {
177
177
  bufferView.lumaBuffers[usage] = this.device.createBuffer({
178
178
  id: `from-${bufferView.id}`,
179
179
  // Draco decoded files have attribute.value
180
- data: bufferView.data || attribute.value,
180
+ data: bufferView.data || attribute.value
181
181
  });
182
182
  }
183
183
 
@@ -214,16 +214,31 @@ enum GLEnum {
214
214
  }
215
215
 
216
216
  export function convertGLDrawModeToTopology(
217
- drawMode: GLEnum.POINTS | GLEnum.LINES | GLEnum.LINE_STRIP | GLEnum.LINE_LOOP | GLEnum.TRIANGLES | GLEnum.TRIANGLE_STRIP | GLEnum.TRIANGLE_FAN,
218
- ): PrimitiveTopology {
217
+ drawMode:
218
+ | GLEnum.POINTS
219
+ | GLEnum.LINES
220
+ | GLEnum.LINE_STRIP
221
+ | GLEnum.LINE_LOOP
222
+ | GLEnum.TRIANGLES
223
+ | GLEnum.TRIANGLE_STRIP
224
+ | GLEnum.TRIANGLE_FAN
225
+ ): PrimitiveTopology {
219
226
  switch (drawMode) {
220
- case GLEnum.POINTS: return 'point-list';
221
- case GLEnum.LINES: return 'line-list';
222
- case GLEnum.LINE_STRIP: return 'line-strip';
223
- case GLEnum.LINE_LOOP: return 'line-loop-webgl';
224
- case GLEnum.TRIANGLES: return 'triangle-list';
225
- case GLEnum.TRIANGLE_STRIP: return 'triangle-strip';
226
- case GLEnum.TRIANGLE_FAN: return 'triangle-fan-webgl';
227
- default: throw new Error(drawMode);
227
+ case GLEnum.POINTS:
228
+ return 'point-list';
229
+ case GLEnum.LINES:
230
+ return 'line-list';
231
+ case GLEnum.LINE_STRIP:
232
+ return 'line-strip';
233
+ case GLEnum.LINE_LOOP:
234
+ return 'line-loop-webgl';
235
+ case GLEnum.TRIANGLES:
236
+ return 'triangle-list';
237
+ case GLEnum.TRIANGLE_STRIP:
238
+ return 'triangle-strip';
239
+ case GLEnum.TRIANGLE_FAN:
240
+ return 'triangle-fan-webgl';
241
+ default:
242
+ throw new Error(drawMode);
228
243
  }
229
244
  }
package/src/index.ts CHANGED
@@ -8,4 +8,3 @@ export {loadPBREnvironment} from './pbr/pbr-environment';
8
8
  // glTF Scenegraph Instantiator
9
9
  export {createScenegraphsFromGLTF} from './gltf/create-gltf-objects';
10
10
  export {GLTFAnimator} from './gltf/gltf-animator';
11
-
@@ -36,7 +36,7 @@ enum GLEnum {
36
36
  TEXTURE_MIN_FILTER = 0x2801,
37
37
  LINEAR = 0x2601,
38
38
  LINEAR_MIPMAP_NEAREST = 0x2701,
39
- UNPACK_FLIP_Y_WEBGL = 0x9240,
39
+ UNPACK_FLIP_Y_WEBGL = 0x9240
40
40
  }
41
41
 
42
42
  /**
@@ -62,20 +62,17 @@ export function parsePBRMaterial(
62
62
  u_MetallicRoughnessValues: [1, 1] // Default is 1 and 1
63
63
  },
64
64
  parameters: {},
65
- glParameters: {},
65
+ glParameters: {},
66
66
  generatedTextures: []
67
67
  };
68
68
 
69
- if (device.features.has('glsl-texture-lod')) {
70
- parsedMaterial.defines.USE_TEX_LOD = 1;
71
- }
69
+ // TODO - always available
70
+ parsedMaterial.defines.USE_TEX_LOD = 1;
72
71
 
73
72
  const {imageBasedLightingEnvironment} = options;
74
73
  if (imageBasedLightingEnvironment) {
75
- parsedMaterial.bindings.u_DiffuseEnvSampler =
76
- imageBasedLightingEnvironment.diffuseEnvSampler;
77
- parsedMaterial.bindings.u_SpecularEnvSampler =
78
- imageBasedLightingEnvironment.specularEnvSampler;
74
+ parsedMaterial.bindings.u_DiffuseEnvSampler = imageBasedLightingEnvironment.diffuseEnvSampler;
75
+ parsedMaterial.bindings.u_SpecularEnvSampler = imageBasedLightingEnvironment.specularEnvSampler;
79
76
  parsedMaterial.bindings.u_brdfLUT = imageBasedLightingEnvironment.brdfLutTexture;
80
77
  parsedMaterial.uniforms.u_ScaleIBLAmbient = [1, 1];
81
78
  }
@@ -150,7 +147,7 @@ function parseMaterial(device: Device, material, parsedMaterial: ParsedPBRMateri
150
147
  parsedMaterial.parameters.blendColorOperation = 'add';
151
148
  parsedMaterial.parameters.blendColorSrcFactor = 'src-alpha';
152
149
  parsedMaterial.parameters.blendColorDstFactor = 'one-minus-src-alpha';
153
-
150
+
154
151
  parsedMaterial.parameters.blendAlphaOperation = 'add';
155
152
  parsedMaterial.parameters.blendAlphaSrcFactor = 'one';
156
153
  parsedMaterial.parameters.blendAlphaDstFactor = 'one-minus-src-alpha';
@@ -158,7 +155,12 @@ function parseMaterial(device: Device, material, parsedMaterial: ParsedPBRMateri
158
155
  // GL parameters
159
156
  parsedMaterial.glParameters.blend = true;
160
157
  parsedMaterial.glParameters.blendEquation = GLEnum.FUNC_ADD;
161
- parsedMaterial.glParameters.blendFunc = [GLEnum.SRC_ALPHA, GLEnum.ONE_MINUS_SRC_ALPHA, GLEnum.ONE, GLEnum.ONE_MINUS_SRC_ALPHA];
158
+ parsedMaterial.glParameters.blendFunc = [
159
+ GLEnum.SRC_ALPHA,
160
+ GLEnum.ONE_MINUS_SRC_ALPHA,
161
+ GLEnum.ONE,
162
+ GLEnum.ONE_MINUS_SRC_ALPHA
163
+ ];
162
164
 
163
165
  break;
164
166
  }
@@ -210,7 +212,8 @@ function addTexture(
210
212
  if (image.compressed) {
211
213
  textureOptions = image;
212
214
  specialTextureParameters = {
213
- [GLEnum.TEXTURE_MIN_FILTER]: image.data.length > 1 ? GLEnum.LINEAR_MIPMAP_NEAREST : GLEnum.LINEAR
215
+ [GLEnum.TEXTURE_MIN_FILTER]:
216
+ image.data.length > 1 ? GLEnum.LINEAR_MIPMAP_NEAREST : GLEnum.LINEAR
214
217
  };
215
218
  } else {
216
219
  // Texture2D accepts a promise that returns an image as data (Async Textures)
@@ -15,7 +15,7 @@ export type PBREnvironmentProps = {
15
15
  brdfLutUrl: string;
16
16
  getTexUrl: (name: string, dir: number, level: number) => string;
17
17
  specularMipLevels?: number;
18
- }
18
+ };
19
19
 
20
20
  /** Loads textures for PBR environment */
21
21
  export function loadPBREnvironment(device: Device, props: PBREnvironmentProps): PBREnvironment {
@@ -33,13 +33,13 @@ export function loadPBREnvironment(device: Device, props: PBREnvironmentProps):
33
33
 
34
34
  const diffuseEnvSampler = makeCube(device, {
35
35
  id: 'DiffuseEnvSampler',
36
- getTextureForFace: (dir) => loadImageTexture(props.getTexUrl('diffuse', dir, 0)),
36
+ getTextureForFace: dir => loadImageTexture(props.getTexUrl('diffuse', dir, 0)),
37
37
  sampler: {
38
38
  wrapS: 'clamp-to-edge',
39
39
  wrapT: 'clamp-to-edge',
40
40
  minFilter: 'linear',
41
41
  maxFilter: 'linear'
42
- } as SamplerProps,
42
+ } as SamplerProps
43
43
  });
44
44
 
45
45
  const specularEnvSampler = makeCube(device, {
@@ -56,26 +56,33 @@ export function loadPBREnvironment(device: Device, props: PBREnvironmentProps):
56
56
  wrapT: 'clamp-to-edge',
57
57
  minFilter: 'linear', // [GL.TEXTURE_MIN_FILTER]: GL.LINEAR_MIPMAP_LINEAR,
58
58
  maxFilter: 'linear'
59
- } as SamplerProps,
59
+ } as SamplerProps
60
60
  });
61
61
 
62
62
  return {
63
63
  brdfLutTexture,
64
64
  diffuseEnvSampler,
65
65
  specularEnvSampler
66
- }
66
+ };
67
67
  }
68
68
 
69
69
  // TODO put somewhere common
70
70
  const FACES = [0, 1, 2, 3, 4, 5];
71
71
 
72
- function makeCube(device: Device, {id, getTextureForFace, sampler}: {
73
- id: string,
74
- getTextureForFace: (dir: number) => Promise<any> | Promise<any>[],
75
- sampler: SamplerProps
76
- }): TextureCube {
72
+ function makeCube(
73
+ device: Device,
74
+ {
75
+ id,
76
+ getTextureForFace,
77
+ sampler
78
+ }: {
79
+ id: string;
80
+ getTextureForFace: (dir: number) => Promise<any> | Promise<any>[];
81
+ sampler: SamplerProps;
82
+ }
83
+ ): TextureCube {
77
84
  const data = {};
78
- FACES.forEach((face) => {
85
+ FACES.forEach(face => {
79
86
  data[String(face)] = getTextureForFace(face);
80
87
  });
81
88
  return device.createTexture({
@@ -1 +0,0 @@
1
- {"version":3,"file":"create-gltf-model.js","names":["log","pbr","Model","ModelNode","parsePBRMaterial","vs","fs","createGLTFModel","device","options","id","geometry","material","vertexCount","materialOptions","modelOptions","parsedMaterial","attributes","info","defines","managedResources","parameters","depthWriteEnabled","depthCompare","depthFormat","cullMode","modelProps","topology","modules","addVersionToShader","bindings","uniforms","model","source","type"],"sources":["../../src/gltf/create-gltf-model.ts"],"sourcesContent":["import {Device, RenderPipelineParameters, log} from '@luma.gl/core';\nimport {pbr} from '@luma.gl/shadertools';\nimport {Geometry, Model, ModelNode, ModelProps} from '@luma.gl/engine';\nimport {ParsePBRMaterialOptions, parsePBRMaterial} from '../pbr/parse-pbr-material';\n\n// TODO rename attributes to POSITION/NORMAL etc\n// See gpu-geometry.ts: getAttributeBuffersFromGeometry()\nconst vs = `\n#pragma vscode_glsllint_stage: vert\n#if (__VERSION__ < 300)\n #define _attr attribute\n#else\n #define _attr in\n#endif\n\n // _attr vec4 POSITION;\n _attr vec4 positions;\n\n #ifdef HAS_NORMALS\n // _attr vec4 NORMAL;\n _attr vec4 normals;\n #endif\n\n #ifdef HAS_TANGENTS\n _attr vec4 TANGENT;\n #endif\n\n #ifdef HAS_UV\n // _attr vec2 TEXCOORD_0;\n _attr vec2 texCoords;\n #endif\n\n void main(void) {\n vec4 _NORMAL = vec4(0.);\n vec4 _TANGENT = vec4(0.);\n vec2 _TEXCOORD_0 = vec2(0.);\n\n #ifdef HAS_NORMALS\n _NORMAL = normals;\n #endif\n\n #ifdef HAS_TANGENTS\n _TANGENT = TANGENT;\n #endif\n\n #ifdef HAS_UV\n _TEXCOORD_0 = texCoords;\n #endif\n\n pbr_setPositionNormalTangentUV(positions, _NORMAL, _TANGENT, _TEXCOORD_0);\n gl_Position = u_MVPMatrix * positions;\n }\n`;\n\nconst fs = `\n#pragma vscode_glsllint_stage: frag\n#if (__VERSION__ < 300)\n #define fragmentColor gl_FragColor\n#else\n out vec4 fragmentColor;\n#endif\n\n void main(void) {\n vec3 pos = pbr_vPosition;\n fragmentColor = pbr_filterColor(vec4(1.0));\n }\n`;\n\nexport type CreateGLTFModelOptions = {\n id?: string;\n vertexCount?: number;\n geometry: Geometry;\n material: any;\n materialOptions: ParsePBRMaterialOptions;\n modelOptions?: Partial<ModelProps>;\n};\n\nexport function createGLTFModel(device: Device, options: CreateGLTFModelOptions): ModelNode {\n const {id, geometry, material, vertexCount, materialOptions, modelOptions} = options;\n\n const parsedMaterial = parsePBRMaterial(device, material, geometry.attributes, materialOptions);\n log.info(4, 'createGLTFModel defines: ', parsedMaterial.defines)();\n\n // Calculate managedResources\n // TODO: Implement resource management logic that will\n // not deallocate resources/textures/buffers that are shared\n const managedResources = [];\n // managedResources.push(...parsedMaterial.generatedTextures);\n // managedResources.push(...Object.values(attributes).map((attribute) => attribute.buffer));\n\n const parameters: RenderPipelineParameters = {\n depthWriteEnabled: true,\n depthCompare: 'less',\n depthFormat: 'depth24plus',\n cullMode: 'back'\n }\n\n const modelProps: ModelProps = {\n id,\n geometry,\n topology: geometry.topology,\n vertexCount,\n modules: [pbr],\n vs: addVersionToShader(device, vs),\n fs: addVersionToShader(device, fs),\n ...modelOptions,\n\n bindings: {...parsedMaterial.bindings, ...modelOptions.bindings},\n defines: {...parsedMaterial.defines, ...modelOptions.defines},\n parameters: {...parameters, ...parsedMaterial.parameters, ...modelOptions.parameters},\n uniforms: {...parsedMaterial.uniforms, ...modelOptions.uniforms}\n }\n\n const model = new Model(device, modelProps);\n return new ModelNode({ managedResources, model});\n}\n\nfunction addVersionToShader(device: Device, source: string): string {\n return device.info.type === 'webgl2' ? `#version 300 es\\n${source}` : source;\n}\n"],"mappings":"AAAA,SAA0CA,GAAG,QAAO,eAAe;AACnE,SAAQC,GAAG,QAAO,sBAAsB;AACxC,SAAkBC,KAAK,EAAEC,SAAS,QAAmB,iBAAiB;AAAC,SACtCC,gBAAgB;AAIjD,MAAMC,EAAE,GAAI;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;AAED,MAAMC,EAAE,GAAI;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;AAWD,OAAO,SAASC,eAAeA,CAACC,MAAc,EAAEC,OAA+B,EAAa;EAC1F,MAAM;IAACC,EAAE;IAAEC,QAAQ;IAAEC,QAAQ;IAAEC,WAAW;IAAEC,eAAe;IAAEC;EAAY,CAAC,GAAGN,OAAO;EAEpF,MAAMO,cAAc,GAAGZ,gBAAgB,CAACI,MAAM,EAAEI,QAAQ,EAAED,QAAQ,CAACM,UAAU,EAAEH,eAAe,CAAC;EAC/Fd,GAAG,CAACkB,IAAI,CAAC,CAAC,EAAE,2BAA2B,EAAEF,cAAc,CAACG,OAAO,CAAC,CAAC,CAAC;EAKlE,MAAMC,gBAAgB,GAAG,EAAE;EAI3B,MAAMC,UAAoC,GAAG;IAC3CC,iBAAiB,EAAE,IAAI;IACvBC,YAAY,EAAE,MAAM;IACpBC,WAAW,EAAE,aAAa;IAC1BC,QAAQ,EAAE;EACZ,CAAC;EAED,MAAMC,UAAsB,GAAG;IAC7BhB,EAAE;IACFC,QAAQ;IACRgB,QAAQ,EAAEhB,QAAQ,CAACgB,QAAQ;IAC3Bd,WAAW;IACXe,OAAO,EAAE,CAAC3B,GAAG,CAAC;IACdI,EAAE,EAAEwB,kBAAkB,CAACrB,MAAM,EAAEH,EAAE,CAAC;IAClCC,EAAE,EAAEuB,kBAAkB,CAACrB,MAAM,EAAEF,EAAE,CAAC;IAClC,GAAGS,YAAY;IAEfe,QAAQ,EAAE;MAAC,GAAGd,cAAc,CAACc,QAAQ;MAAE,GAAGf,YAAY,CAACe;IAAQ,CAAC;IAChEX,OAAO,EAAE;MAAC,GAAGH,cAAc,CAACG,OAAO;MAAE,GAAGJ,YAAY,CAACI;IAAO,CAAC;IAC7DE,UAAU,EAAE;MAAC,GAAGA,UAAU;MAAE,GAAGL,cAAc,CAACK,UAAU;MAAE,GAAGN,YAAY,CAACM;IAAU,CAAC;IACrFU,QAAQ,EAAE;MAAC,GAAGf,cAAc,CAACe,QAAQ;MAAE,GAAGhB,YAAY,CAACgB;IAAQ;EACjE,CAAC;EAED,MAAMC,KAAK,GAAG,IAAI9B,KAAK,CAACM,MAAM,EAAEkB,UAAU,CAAC;EAC3C,OAAO,IAAIvB,SAAS,CAAC;IAAEiB,gBAAgB;IAAEY;EAAK,CAAC,CAAC;AAClD;AAEA,SAASH,kBAAkBA,CAACrB,MAAc,EAAEyB,MAAc,EAAU;EAClE,OAAOzB,MAAM,CAACU,IAAI,CAACgB,IAAI,KAAK,QAAQ,GAAI,oBAAmBD,MAAO,EAAC,GAAGA,MAAM;AAC9E"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"create-gltf-objects.js","names":["GLTFInstantiator","createScenegraphsFromGLTF","device","gltf","options","instantiator","scenes","instantiate","animator","createAnimator"],"sources":["../../src/gltf/create-gltf-objects.ts"],"sourcesContent":["import {Device} from '@luma.gl/core';\nimport {GroupNode} from '@luma.gl/engine';\nimport {GLTFInstantiator, GLTFInstantiatorOptions} from './gltf-instantiator';\nimport {GLTFAnimator} from './gltf-animator';\n\nexport function createScenegraphsFromGLTF(\n device: Device,\n gltf: any,\n options?: GLTFInstantiatorOptions\n): {\n scenes: GroupNode[];\n animator: GLTFAnimator;\n} {\n const instantiator = new GLTFInstantiator(device, options);\n const scenes = instantiator.instantiate(gltf);\n const animator = instantiator.createAnimator();\n return {scenes, animator};\n}\n"],"mappings":"SAEQA,gBAAgB;AAGxB,OAAO,SAASC,yBAAyBA,CACvCC,MAAc,EACdC,IAAS,EACTC,OAAiC,EAIjC;EACA,MAAMC,YAAY,GAAG,IAAIL,gBAAgB,CAACE,MAAM,EAAEE,OAAO,CAAC;EAC1D,MAAME,MAAM,GAAGD,YAAY,CAACE,WAAW,CAACJ,IAAI,CAAC;EAC7C,MAAMK,QAAQ,GAAGH,YAAY,CAACI,cAAc,CAAC,CAAC;EAC9C,OAAO;IAACH,MAAM;IAAEE;EAAQ,CAAC;AAC3B"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"gltf-animator.js","names":["assert","log","Matrix4","Quaternion","ATTRIBUTE_TYPE_TO_COMPONENTS","SCALAR","VEC2","VEC3","VEC4","MAT2","MAT3","MAT4","ATTRIBUTE_COMPONENT_TYPE_TO_ARRAY","Int8Array","Uint8Array","Int16Array","Uint16Array","Uint32Array","Float32Array","GLTFAnimation","constructor","props","name","startTime","playing","speed","channels","Object","assign","animate","timeMs","absTime","time","forEach","_ref","sampler","target","path","interpolate","applyTranslationRotationScale","_node","GLTFAnimator","gltf","animations","map","animation","index","samplers","_ref2","input","interpolation","output","accessorToJsArray","accessors","_ref3","nodes","node","setTime","getAnimations","accessor","_animation","ArrayType","componentType","components","type","length","count","buffer","byteOffset","bufferView","data","array","Array","from","slicedArray","i","push","slice","helperMatrix","gltfNode","matrix","identity","translation","translate","rotation","rotationMatrix","fromQuaternion","multiplyRight","scale","quaternion","linearInterpolate","start","stop","ratio","slerp","cubicsplineInterpolate","_ref4","p0","outTangent0","inTangent1","p1","tDiff","t","m0","m1","Math","pow","stepInterpolate","value","_ref5","maxTime","animationTime","nextIndex","findIndex","previousIndex","max","isArray","warn","previousTime","nextTime"],"sources":["../../src/gltf/gltf-animator.ts"],"sourcesContent":["import {assert, log} from '@luma.gl/core';\nimport {Matrix4, Quaternion} from '@math.gl/core';\n\n// TODO: import from loaders.gl?\nexport const ATTRIBUTE_TYPE_TO_COMPONENTS = {\n SCALAR: 1,\n VEC2: 2,\n VEC3: 3,\n VEC4: 4,\n MAT2: 4,\n MAT3: 9,\n MAT4: 16\n};\n\nexport const ATTRIBUTE_COMPONENT_TYPE_TO_ARRAY = {\n 5120: Int8Array,\n 5121: Uint8Array,\n 5122: Int16Array,\n 5123: Uint16Array,\n 5125: Uint32Array,\n 5126: Float32Array\n};\n\ntype GLTFAnimationProps = {\n name: string;\n startTime?: number;\n playing?: boolean;\n speed?: number;\n channels?: any;\n}\n\nclass GLTFAnimation {\n name: string;\n startTime: number = 0;\n playing: boolean = true;\n speed: number = 1;\n channels: any = [];\n\n constructor(props: GLTFAnimationProps) {\n Object.assign(this, props);\n }\n\n animate(timeMs: number) {\n if (!this.playing) {\n return;\n }\n\n const absTime = timeMs / 1000;\n const time = (absTime - this.startTime) * this.speed;\n\n this.channels.forEach(({sampler, target, path}) => {\n interpolate(time, sampler, target, path);\n applyTranslationRotationScale(target, target._node);\n });\n }\n}\n\nexport class GLTFAnimator {\n animations: GLTFAnimation[];\n\n constructor(gltf: any) {\n this.animations = gltf.animations.map((animation, index) => {\n const name = animation.name || `Animation-${index}`;\n const samplers = animation.samplers.map(({input, interpolation = 'LINEAR', output}) => ({\n input: accessorToJsArray(gltf.accessors[input]),\n interpolation,\n output: accessorToJsArray(gltf.accessors[output])\n }));\n const channels = animation.channels.map(({sampler, target}) => ({\n sampler: samplers[sampler],\n target: gltf.nodes[target.node],\n path: target.path\n }));\n return new GLTFAnimation({name, channels});\n });\n }\n\n /** @deprecated Use .setTime(). Will be removed (deck.gl is using this) */\n animate(time: number): void {\n this.setTime(time);\n }\n\n setTime(time: number): void {\n this.animations.forEach((animation) => animation.animate(time));\n }\n\n getAnimations() {\n return this.animations;\n }\n}\n\n//\n\nfunction accessorToJsArray(accessor) {\n if (!accessor._animation) {\n const ArrayType = ATTRIBUTE_COMPONENT_TYPE_TO_ARRAY[accessor.componentType];\n const components = ATTRIBUTE_TYPE_TO_COMPONENTS[accessor.type];\n const length = components * accessor.count;\n const {buffer, byteOffset} = accessor.bufferView.data;\n\n const array = new ArrayType(buffer, byteOffset + (accessor.byteOffset || 0), length);\n\n if (components === 1) {\n accessor._animation = Array.from(array);\n } else {\n // Slice array\n const slicedArray = [];\n for (let i = 0; i < array.length; i += components) {\n slicedArray.push(Array.from(array.slice(i, i + components)));\n }\n accessor._animation = slicedArray;\n }\n }\n\n return accessor._animation;\n}\n\n// TODO: share with GLTFInstantiator\nconst helperMatrix = new Matrix4();\nfunction applyTranslationRotationScale(gltfNode, node) {\n node.matrix.identity();\n\n if (gltfNode.translation) {\n node.matrix.translate(gltfNode.translation);\n }\n\n if (gltfNode.rotation) {\n const rotationMatrix = helperMatrix.fromQuaternion(gltfNode.rotation);\n node.matrix.multiplyRight(rotationMatrix);\n }\n\n if (gltfNode.scale) {\n node.matrix.scale(gltfNode.scale);\n }\n}\n\nconst quaternion = new Quaternion();\nfunction linearInterpolate(target, path, start, stop, ratio) {\n if (path === 'rotation') {\n // SLERP when path is rotation\n quaternion.slerp({start, target: stop, ratio});\n for (let i = 0; i < quaternion.length; i++) {\n target[path][i] = quaternion[i];\n }\n } else {\n // regular interpolation\n for (let i = 0; i < start.length; i++) {\n target[path][i] = ratio * stop[i] + (1 - ratio) * start[i];\n }\n }\n}\n\nfunction cubicsplineInterpolate(target, path, {p0, outTangent0, inTangent1, p1, tDiff, ratio: t}) {\n // TODO: Quaternion might need normalization\n for (let i = 0; i < target[path].length; i++) {\n const m0 = outTangent0[i] * tDiff;\n const m1 = inTangent1[i] * tDiff;\n target[path][i] =\n (2 * Math.pow(t, 3) - 3 * Math.pow(t, 2) + 1) * p0[i] +\n (Math.pow(t, 3) - 2 * Math.pow(t, 2) + t) * m0 +\n (-2 * Math.pow(t, 3) + 3 * Math.pow(t, 2)) * p1[i] +\n (Math.pow(t, 3) - Math.pow(t, 2)) * m1;\n }\n}\n\nfunction stepInterpolate(target, path, value) {\n for (let i = 0; i < value.length; i++) {\n target[path][i] = value[i];\n }\n}\n\nfunction interpolate(time, {input, interpolation, output}, target, path) {\n const maxTime = input[input.length - 1];\n const animationTime = time % maxTime;\n\n const nextIndex = input.findIndex((t) => t >= animationTime);\n const previousIndex = Math.max(0, nextIndex - 1);\n\n if (!Array.isArray(target[path])) {\n switch (path) {\n case 'translation':\n target[path] = [0, 0, 0];\n break;\n\n case 'rotation':\n target[path] = [0, 0, 0, 1];\n break;\n\n case 'scale':\n target[path] = [1, 1, 1];\n break;\n\n default:\n log.warn(`Bad animation path ${path}`)();\n }\n }\n\n assert(target[path].length === output[previousIndex].length);\n const previousTime = input[previousIndex];\n const nextTime = input[nextIndex];\n\n switch (interpolation) {\n case 'STEP':\n stepInterpolate(target, path, output[previousIndex]);\n break;\n\n case 'LINEAR':\n if (nextTime > previousTime) {\n const ratio = (animationTime - previousTime) / (nextTime - previousTime);\n linearInterpolate(target, path, output[previousIndex], output[nextIndex], ratio);\n }\n break;\n\n case 'CUBICSPLINE':\n if (nextTime > previousTime) {\n const ratio = (animationTime - previousTime) / (nextTime - previousTime);\n const tDiff = nextTime - previousTime;\n\n const p0 = output[3 * previousIndex + 1];\n const outTangent0 = output[3 * previousIndex + 2];\n const inTangent1 = output[3 * nextIndex + 0];\n const p1 = output[3 * nextIndex + 1];\n\n cubicsplineInterpolate(target, path, {p0, outTangent0, inTangent1, p1, tDiff, ratio});\n }\n break;\n\n default:\n log.warn(`Interpolation ${interpolation} not supported`)();\n break;\n }\n}\n"],"mappings":"AAAA,SAAQA,MAAM,EAAEC,GAAG,QAAO,eAAe;AACzC,SAAQC,OAAO,EAAEC,UAAU,QAAO,eAAe;AAGjD,OAAO,MAAMC,4BAA4B,GAAG;EAC1CC,MAAM,EAAE,CAAC;EACTC,IAAI,EAAE,CAAC;EACPC,IAAI,EAAE,CAAC;EACPC,IAAI,EAAE,CAAC;EACPC,IAAI,EAAE,CAAC;EACPC,IAAI,EAAE,CAAC;EACPC,IAAI,EAAE;AACR,CAAC;AAED,OAAO,MAAMC,iCAAiC,GAAG;EAC/C,IAAI,EAAEC,SAAS;EACf,IAAI,EAAEC,UAAU;EAChB,IAAI,EAAEC,UAAU;EAChB,IAAI,EAAEC,WAAW;EACjB,IAAI,EAAEC,WAAW;EACjB,IAAI,EAAEC;AACR,CAAC;AAUD,MAAMC,aAAa,CAAC;EAOlBC,WAAWA,CAACC,KAAyB,EAAE;IAAA,KANvCC,IAAI;IAAA,KACJC,SAAS,GAAW,CAAC;IAAA,KACrBC,OAAO,GAAY,IAAI;IAAA,KACvBC,KAAK,GAAW,CAAC;IAAA,KACjBC,QAAQ,GAAQ,EAAE;IAGhBC,MAAM,CAACC,MAAM,CAAC,IAAI,EAAEP,KAAK,CAAC;EAC5B;EAEAQ,OAAOA,CAACC,MAAc,EAAE;IACtB,IAAI,CAAC,IAAI,CAACN,OAAO,EAAE;MACjB;IACF;IAEA,MAAMO,OAAO,GAAGD,MAAM,GAAG,IAAI;IAC7B,MAAME,IAAI,GAAG,CAACD,OAAO,GAAG,IAAI,CAACR,SAAS,IAAI,IAAI,CAACE,KAAK;IAEpD,IAAI,CAACC,QAAQ,CAACO,OAAO,CAACC,IAAA,IAA6B;MAAA,IAA5B;QAACC,OAAO;QAAEC,MAAM;QAAEC;MAAI,CAAC,GAAAH,IAAA;MAC5CI,WAAW,CAACN,IAAI,EAAEG,OAAO,EAAEC,MAAM,EAAEC,IAAI,CAAC;MACxCE,6BAA6B,CAACH,MAAM,EAAEA,MAAM,CAACI,KAAK,CAAC;IACrD,CAAC,CAAC;EACJ;AACF;AAEA,OAAO,MAAMC,YAAY,CAAC;EAGxBrB,WAAWA,CAACsB,IAAS,EAAE;IAAA,KAFvBC,UAAU;IAGR,IAAI,CAACA,UAAU,GAAGD,IAAI,CAACC,UAAU,CAACC,GAAG,CAAC,CAACC,SAAS,EAAEC,KAAK,KAAK;MAC1D,MAAMxB,IAAI,GAAGuB,SAAS,CAACvB,IAAI,IAAK,aAAYwB,KAAM,EAAC;MACnD,MAAMC,QAAQ,GAAGF,SAAS,CAACE,QAAQ,CAACH,GAAG,CAACI,KAAA;QAAA,IAAC;UAACC,KAAK;UAAEC,aAAa,GAAG,QAAQ;UAAEC;QAAM,CAAC,GAAAH,KAAA;QAAA,OAAM;UACtFC,KAAK,EAAEG,iBAAiB,CAACV,IAAI,CAACW,SAAS,CAACJ,KAAK,CAAC,CAAC;UAC/CC,aAAa;UACbC,MAAM,EAAEC,iBAAiB,CAACV,IAAI,CAACW,SAAS,CAACF,MAAM,CAAC;QAClD,CAAC;MAAA,CAAC,CAAC;MACH,MAAMzB,QAAQ,GAAGmB,SAAS,CAACnB,QAAQ,CAACkB,GAAG,CAACU,KAAA;QAAA,IAAC;UAACnB,OAAO;UAAEC;QAAM,CAAC,GAAAkB,KAAA;QAAA,OAAM;UAC9DnB,OAAO,EAAEY,QAAQ,CAACZ,OAAO,CAAC;UAC1BC,MAAM,EAAEM,IAAI,CAACa,KAAK,CAACnB,MAAM,CAACoB,IAAI,CAAC;UAC/BnB,IAAI,EAAED,MAAM,CAACC;QACf,CAAC;MAAA,CAAC,CAAC;MACH,OAAO,IAAIlB,aAAa,CAAC;QAACG,IAAI;QAAEI;MAAQ,CAAC,CAAC;IAC5C,CAAC,CAAC;EACJ;EAGAG,OAAOA,CAACG,IAAY,EAAQ;IAC1B,IAAI,CAACyB,OAAO,CAACzB,IAAI,CAAC;EACpB;EAEAyB,OAAOA,CAACzB,IAAY,EAAQ;IAC1B,IAAI,CAACW,UAAU,CAACV,OAAO,CAAEY,SAAS,IAAKA,SAAS,CAAChB,OAAO,CAACG,IAAI,CAAC,CAAC;EACjE;EAEA0B,aAAaA,CAAA,EAAG;IACd,OAAO,IAAI,CAACf,UAAU;EACxB;AACF;AAIA,SAASS,iBAAiBA,CAACO,QAAQ,EAAE;EACnC,IAAI,CAACA,QAAQ,CAACC,UAAU,EAAE;IACxB,MAAMC,SAAS,GAAGjD,iCAAiC,CAAC+C,QAAQ,CAACG,aAAa,CAAC;IAC3E,MAAMC,UAAU,GAAG3D,4BAA4B,CAACuD,QAAQ,CAACK,IAAI,CAAC;IAC9D,MAAMC,MAAM,GAAGF,UAAU,GAAGJ,QAAQ,CAACO,KAAK;IAC1C,MAAM;MAACC,MAAM;MAAEC;IAAU,CAAC,GAAGT,QAAQ,CAACU,UAAU,CAACC,IAAI;IAErD,MAAMC,KAAK,GAAG,IAAIV,SAAS,CAACM,MAAM,EAAEC,UAAU,IAAIT,QAAQ,CAACS,UAAU,IAAI,CAAC,CAAC,EAAEH,MAAM,CAAC;IAEpF,IAAIF,UAAU,KAAK,CAAC,EAAE;MACpBJ,QAAQ,CAACC,UAAU,GAAGY,KAAK,CAACC,IAAI,CAACF,KAAK,CAAC;IACzC,CAAC,MAAM;MAEL,MAAMG,WAAW,GAAG,EAAE;MACtB,KAAK,IAAIC,CAAC,GAAG,CAAC,EAAEA,CAAC,GAAGJ,KAAK,CAACN,MAAM,EAAEU,CAAC,IAAIZ,UAAU,EAAE;QACjDW,WAAW,CAACE,IAAI,CAACJ,KAAK,CAACC,IAAI,CAACF,KAAK,CAACM,KAAK,CAACF,CAAC,EAAEA,CAAC,GAAGZ,UAAU,CAAC,CAAC,CAAC;MAC9D;MACAJ,QAAQ,CAACC,UAAU,GAAGc,WAAW;IACnC;EACF;EAEA,OAAOf,QAAQ,CAACC,UAAU;AAC5B;AAGA,MAAMkB,YAAY,GAAG,IAAI5E,OAAO,CAAC,CAAC;AAClC,SAASqC,6BAA6BA,CAACwC,QAAQ,EAAEvB,IAAI,EAAE;EACrDA,IAAI,CAACwB,MAAM,CAACC,QAAQ,CAAC,CAAC;EAEtB,IAAIF,QAAQ,CAACG,WAAW,EAAE;IACxB1B,IAAI,CAACwB,MAAM,CAACG,SAAS,CAACJ,QAAQ,CAACG,WAAW,CAAC;EAC7C;EAEA,IAAIH,QAAQ,CAACK,QAAQ,EAAE;IACrB,MAAMC,cAAc,GAAGP,YAAY,CAACQ,cAAc,CAACP,QAAQ,CAACK,QAAQ,CAAC;IACrE5B,IAAI,CAACwB,MAAM,CAACO,aAAa,CAACF,cAAc,CAAC;EAC3C;EAEA,IAAIN,QAAQ,CAACS,KAAK,EAAE;IAClBhC,IAAI,CAACwB,MAAM,CAACQ,KAAK,CAACT,QAAQ,CAACS,KAAK,CAAC;EACnC;AACF;AAEA,MAAMC,UAAU,GAAG,IAAItF,UAAU,CAAC,CAAC;AACnC,SAASuF,iBAAiBA,CAACtD,MAAM,EAAEC,IAAI,EAAEsD,KAAK,EAAEC,IAAI,EAAEC,KAAK,EAAE;EAC3D,IAAIxD,IAAI,KAAK,UAAU,EAAE;IAEvBoD,UAAU,CAACK,KAAK,CAAC;MAACH,KAAK;MAAEvD,MAAM,EAAEwD,IAAI;MAAEC;IAAK,CAAC,CAAC;IAC9C,KAAK,IAAIlB,CAAC,GAAG,CAAC,EAAEA,CAAC,GAAGc,UAAU,CAACxB,MAAM,EAAEU,CAAC,EAAE,EAAE;MAC1CvC,MAAM,CAACC,IAAI,CAAC,CAACsC,CAAC,CAAC,GAAGc,UAAU,CAACd,CAAC,CAAC;IACjC;EACF,CAAC,MAAM;IAEL,KAAK,IAAIA,CAAC,GAAG,CAAC,EAAEA,CAAC,GAAGgB,KAAK,CAAC1B,MAAM,EAAEU,CAAC,EAAE,EAAE;MACrCvC,MAAM,CAACC,IAAI,CAAC,CAACsC,CAAC,CAAC,GAAGkB,KAAK,GAAGD,IAAI,CAACjB,CAAC,CAAC,GAAG,CAAC,CAAC,GAAGkB,KAAK,IAAIF,KAAK,CAAChB,CAAC,CAAC;IAC5D;EACF;AACF;AAEA,SAASoB,sBAAsBA,CAAC3D,MAAM,EAAEC,IAAI,EAAA2D,KAAA,EAAsD;EAAA,IAApD;IAACC,EAAE;IAAEC,WAAW;IAAEC,UAAU;IAAEC,EAAE;IAAEC,KAAK;IAAER,KAAK,EAAES;EAAC,CAAC,GAAAN,KAAA;EAE9F,KAAK,IAAIrB,CAAC,GAAG,CAAC,EAAEA,CAAC,GAAGvC,MAAM,CAACC,IAAI,CAAC,CAAC4B,MAAM,EAAEU,CAAC,EAAE,EAAE;IAC5C,MAAM4B,EAAE,GAAGL,WAAW,CAACvB,CAAC,CAAC,GAAG0B,KAAK;IACjC,MAAMG,EAAE,GAAGL,UAAU,CAACxB,CAAC,CAAC,GAAG0B,KAAK;IAChCjE,MAAM,CAACC,IAAI,CAAC,CAACsC,CAAC,CAAC,GACb,CAAC,CAAC,GAAG8B,IAAI,CAACC,GAAG,CAACJ,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,GAAGG,IAAI,CAACC,GAAG,CAACJ,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,IAAIL,EAAE,CAACtB,CAAC,CAAC,GACrD,CAAC8B,IAAI,CAACC,GAAG,CAACJ,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,GAAGG,IAAI,CAACC,GAAG,CAACJ,CAAC,EAAE,CAAC,CAAC,GAAGA,CAAC,IAAIC,EAAE,GAC9C,CAAC,CAAC,CAAC,GAAGE,IAAI,CAACC,GAAG,CAACJ,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,GAAGG,IAAI,CAACC,GAAG,CAACJ,CAAC,EAAE,CAAC,CAAC,IAAIF,EAAE,CAACzB,CAAC,CAAC,GAClD,CAAC8B,IAAI,CAACC,GAAG,CAACJ,CAAC,EAAE,CAAC,CAAC,GAAGG,IAAI,CAACC,GAAG,CAACJ,CAAC,EAAE,CAAC,CAAC,IAAIE,EAAE;EAC1C;AACF;AAEA,SAASG,eAAeA,CAACvE,MAAM,EAAEC,IAAI,EAAEuE,KAAK,EAAE;EAC5C,KAAK,IAAIjC,CAAC,GAAG,CAAC,EAAEA,CAAC,GAAGiC,KAAK,CAAC3C,MAAM,EAAEU,CAAC,EAAE,EAAE;IACrCvC,MAAM,CAACC,IAAI,CAAC,CAACsC,CAAC,CAAC,GAAGiC,KAAK,CAACjC,CAAC,CAAC;EAC5B;AACF;AAEA,SAASrC,WAAWA,CAACN,IAAI,EAAA6E,KAAA,EAAkCzE,MAAM,EAAEC,IAAI,EAAE;EAAA,IAA9C;IAACY,KAAK;IAAEC,aAAa;IAAEC;EAAM,CAAC,GAAA0D,KAAA;EACvD,MAAMC,OAAO,GAAG7D,KAAK,CAACA,KAAK,CAACgB,MAAM,GAAG,CAAC,CAAC;EACvC,MAAM8C,aAAa,GAAG/E,IAAI,GAAG8E,OAAO;EAEpC,MAAME,SAAS,GAAG/D,KAAK,CAACgE,SAAS,CAAEX,CAAC,IAAKA,CAAC,IAAIS,aAAa,CAAC;EAC5D,MAAMG,aAAa,GAAGT,IAAI,CAACU,GAAG,CAAC,CAAC,EAAEH,SAAS,GAAG,CAAC,CAAC;EAEhD,IAAI,CAACxC,KAAK,CAAC4C,OAAO,CAAChF,MAAM,CAACC,IAAI,CAAC,CAAC,EAAE;IAChC,QAAQA,IAAI;MACV,KAAK,aAAa;QAChBD,MAAM,CAACC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;QACxB;MAEF,KAAK,UAAU;QACbD,MAAM,CAACC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;QAC3B;MAEF,KAAK,OAAO;QACVD,MAAM,CAACC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;QACxB;MAEF;QACEpC,GAAG,CAACoH,IAAI,CAAE,sBAAqBhF,IAAK,EAAC,CAAC,CAAC,CAAC;IAC5C;EACF;EAEArC,MAAM,CAACoC,MAAM,CAACC,IAAI,CAAC,CAAC4B,MAAM,KAAKd,MAAM,CAAC+D,aAAa,CAAC,CAACjD,MAAM,CAAC;EAC5D,MAAMqD,YAAY,GAAGrE,KAAK,CAACiE,aAAa,CAAC;EACzC,MAAMK,QAAQ,GAAGtE,KAAK,CAAC+D,SAAS,CAAC;EAEjC,QAAQ9D,aAAa;IACnB,KAAK,MAAM;MACTyD,eAAe,CAACvE,MAAM,EAAEC,IAAI,EAAEc,MAAM,CAAC+D,aAAa,CAAC,CAAC;MACpD;IAEF,KAAK,QAAQ;MACX,IAAIK,QAAQ,GAAGD,YAAY,EAAE;QAC3B,MAAMzB,KAAK,GAAG,CAACkB,aAAa,GAAGO,YAAY,KAAKC,QAAQ,GAAGD,YAAY,CAAC;QACxE5B,iBAAiB,CAACtD,MAAM,EAAEC,IAAI,EAAEc,MAAM,CAAC+D,aAAa,CAAC,EAAE/D,MAAM,CAAC6D,SAAS,CAAC,EAAEnB,KAAK,CAAC;MAClF;MACA;IAEF,KAAK,aAAa;MAChB,IAAI0B,QAAQ,GAAGD,YAAY,EAAE;QAC3B,MAAMzB,KAAK,GAAG,CAACkB,aAAa,GAAGO,YAAY,KAAKC,QAAQ,GAAGD,YAAY,CAAC;QACxE,MAAMjB,KAAK,GAAGkB,QAAQ,GAAGD,YAAY;QAErC,MAAMrB,EAAE,GAAG9C,MAAM,CAAC,CAAC,GAAG+D,aAAa,GAAG,CAAC,CAAC;QACxC,MAAMhB,WAAW,GAAG/C,MAAM,CAAC,CAAC,GAAG+D,aAAa,GAAG,CAAC,CAAC;QACjD,MAAMf,UAAU,GAAGhD,MAAM,CAAC,CAAC,GAAG6D,SAAS,GAAG,CAAC,CAAC;QAC5C,MAAMZ,EAAE,GAAGjD,MAAM,CAAC,CAAC,GAAG6D,SAAS,GAAG,CAAC,CAAC;QAEpCjB,sBAAsB,CAAC3D,MAAM,EAAEC,IAAI,EAAE;UAAC4D,EAAE;UAAEC,WAAW;UAAEC,UAAU;UAAEC,EAAE;UAAEC,KAAK;UAAER;QAAK,CAAC,CAAC;MACvF;MACA;IAEF;MACE5F,GAAG,CAACoH,IAAI,CAAE,iBAAgBnE,aAAc,gBAAe,CAAC,CAAC,CAAC;MAC1D;EACJ;AACF"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"gltf-instantiator.js","names":["Geometry","GroupNode","WebGLDevice","Matrix4","GLTFAnimator","createGLTFModel","DEFAULT_OPTIONS","modelOptions","pbrDebug","imageBasedLightingEnvironment","lights","useTangents","GLTFInstantiator","constructor","device","options","arguments","length","undefined","gltf","attach","instantiate","scenes","map","scene","createScene","createAnimator","Array","isArray","animations","gltfScene","gltfNodes","nodes","node","createNode","id","name","children","gltfNode","_node","gltfChildren","child","mesh","push","createMesh","matrix","setMatrix","identity","translation","translate","rotation","rotationMatrix","fromQuaternion","multiplyRight","scale","gltfMesh","_mesh","gltfPrimitives","primitives","gltfPrimitive","i","createPrimitive","topology","convertGLDrawModeToTopology","mode","vertexCount","indices","count","getVertexCount","attributes","modelNode","geometry","createGeometry","material","materialOptions","bounds","POSITION","min","max","Error","attributeName","attribute","Object","entries","components","size","value","createBuffer","usage","bufferView","lumaBuffers","data","createSampler","gltfSampler","needsPOT","GLEnum","drawMode","POINTS","LINES","LINE_STRIP","LINE_LOOP","TRIANGLES","TRIANGLE_STRIP","TRIANGLE_FAN"],"sources":["../../src/gltf/gltf-instantiator.ts"],"sourcesContent":["import {Device, Buffer, PrimitiveTopology} from '@luma.gl/core';\nimport {Geometry, GroupNode, ModelNode, ModelProps} from '@luma.gl/engine';\nimport {GeometryAttribute} from '@luma.gl/engine/geometry/geometry';\nimport {WebGLDevice} from '@luma.gl/webgl';\nimport {Matrix4} from '@math.gl/core';\n\nimport {GLTFAnimator} from './gltf-animator';\nimport {createGLTFModel} from './create-gltf-model';\nimport type {PBREnvironment} from '../pbr/pbr-environment';\n\nexport type GLTFInstantiatorOptions = {\n modelOptions?: Partial<ModelProps>,\n pbrDebug?: boolean,\n imageBasedLightingEnvironment?: PBREnvironment,\n lights?: boolean,\n useTangents?: boolean\n}\n\nconst DEFAULT_OPTIONS: GLTFInstantiatorOptions = {\n modelOptions: {},\n pbrDebug: false,\n imageBasedLightingEnvironment: null,\n lights: true,\n useTangents: false\n};\n\n/**\n * GLTF instantiator for luma.gl\n * Walks the parsed and resolved glTF structure and builds a luma.gl scenegraph\n */\nexport class GLTFInstantiator {\n // TODO - replace with Device\n device: WebGLDevice;\n options: GLTFInstantiatorOptions;\n gltf: any;\n\n constructor(device: Device, options: GLTFInstantiatorOptions = {}) {\n this.device = WebGLDevice.attach(device);\n this.options = {...DEFAULT_OPTIONS, ...options};\n }\n\n instantiate(gltf: any): GroupNode[] {\n this.gltf = gltf;\n const scenes = (gltf.scenes || []).map((scene) => this.createScene(scene));\n return scenes;\n }\n\n createAnimator(): GLTFAnimator {\n if (Array.isArray(this.gltf.animations)) {\n return new GLTFAnimator(this.gltf);\n }\n\n return null;\n }\n\n createScene(gltfScene: any): GroupNode {\n const gltfNodes = gltfScene.nodes || [];\n const nodes = gltfNodes.map((node) => this.createNode(node));\n const scene = new GroupNode({\n id: gltfScene.name || gltfScene.id,\n children: nodes\n });\n return scene;\n }\n\n createNode(gltfNode) {\n if (!gltfNode._node) {\n const gltfChildren = gltfNode.children || [];\n const children = gltfChildren.map((child) => this.createNode(child));\n\n // Node can have children nodes and meshes at the same time\n if (gltfNode.mesh) {\n children.push(this.createMesh(gltfNode.mesh));\n }\n\n const node = new GroupNode({\n id: gltfNode.name || gltfNode.id,\n children\n });\n\n if (gltfNode.matrix) {\n node.setMatrix(gltfNode.matrix);\n } else {\n node.matrix.identity();\n\n if (gltfNode.translation) {\n node.matrix.translate(gltfNode.translation);\n }\n\n if (gltfNode.rotation) {\n const rotationMatrix = new Matrix4().fromQuaternion(gltfNode.rotation);\n node.matrix.multiplyRight(rotationMatrix);\n }\n\n if (gltfNode.scale) {\n node.matrix.scale(gltfNode.scale);\n }\n }\n gltfNode._node = node;\n }\n\n return gltfNode._node;\n }\n\n createMesh(gltfMesh): GroupNode {\n // TODO: avoid changing the gltf\n if (!gltfMesh._mesh) {\n const gltfPrimitives = gltfMesh.primitives || [];\n const primitives = gltfPrimitives.map((gltfPrimitive, i) =>\n this.createPrimitive(gltfPrimitive, i, gltfMesh)\n );\n const mesh = new GroupNode({\n id: gltfMesh.name || gltfMesh.id,\n children: primitives\n });\n gltfMesh._mesh = mesh;\n }\n\n return gltfMesh._mesh;\n }\n\n createPrimitive(gltfPrimitive: any, i: number, gltfMesh): ModelNode {\n const id = gltfPrimitive.name || `${gltfMesh.name || gltfMesh.id}-primitive-${i}`;\n const topology = convertGLDrawModeToTopology(gltfPrimitive.mode || 4);\n const vertexCount = gltfPrimitive.indices\n ? gltfPrimitive.indices.count\n : this.getVertexCount(gltfPrimitive.attributes);\n\n const modelNode = createGLTFModel(this.device, {\n id,\n geometry: this.createGeometry(id, gltfPrimitive, topology), \n material: gltfPrimitive.material,\n materialOptions: this.options,\n modelOptions: this.options.modelOptions,\n vertexCount\n });\n\n modelNode.bounds = [gltfPrimitive.attributes.POSITION.min, gltfPrimitive.attributes.POSITION.max];\n // TODO this holds on to all the CPU side texture and attribute data\n // modelNode.material = gltfPrimitive.material;\n\n return modelNode;\n }\n\n getVertexCount(attributes: any) {\n throw new Error('getVertexCount not implemented');\n }\n\n createGeometry(id: string, gltfPrimitive: any, topology: PrimitiveTopology): Geometry {\n const attributes = {}\n for (const [attributeName, attribute] of Object.entries(gltfPrimitive.attributes)) {\n const {components, size, value} = attribute as GeometryAttribute;\n\n attributes[attributeName] = {size: size ?? components, value};\n };\n\n return new Geometry({\n id,\n topology,\n indices: gltfPrimitive.indices.value,\n attributes\n });\n }\n\n createBuffer(attribute, usage: number): Buffer {\n if (!attribute.bufferView) {\n // Draco decoded files do not have a bufferView\n attribute.bufferView = {};\n }\n\n const {bufferView} = attribute;\n if (!bufferView.lumaBuffers) {\n bufferView.lumaBuffers = {};\n }\n\n if (!bufferView.lumaBuffers[usage]) {\n bufferView.lumaBuffers[usage] = this.device.createBuffer({\n id: `from-${bufferView.id}`,\n // Draco decoded files have attribute.value\n data: bufferView.data || attribute.value,\n });\n }\n\n return bufferView.lumaBuffers[usage];\n }\n\n // TODO - create sampler in WebGL2\n createSampler(gltfSampler) {\n return gltfSampler;\n }\n\n // Helper methods (move to GLTFLoader.resolve...?)\n\n needsPOT(): boolean {\n // Has a wrapping mode (either wrapS or wrapT) equal to REPEAT or MIRRORED_REPEAT, or\n // Has a minification filter (minFilter) that uses mipmapping\n // (NEAREST_MIPMAP_NEAREST, NEAREST_MIPMAP_LINEAR,\n // LINEAR_MIPMAP_NEAREST, or LINEAR_MIPMAP_LINEAR).\n return false;\n }\n}\n\n// NOTE: Modules other than `@luma.gl/webgl` should not import `GL` from\n// `@luma.gl/constants`. Locally we use `GLEnum` instead of `GL` to avoid\n// conflicts with the `babel-plugin-inline-webgl-constants` plugin.\nenum GLEnum {\n POINTS = 0x0,\n LINES = 0x1,\n LINE_LOOP = 0x2,\n LINE_STRIP = 0x3,\n TRIANGLES = 0x4,\n TRIANGLE_STRIP = 0x5,\n TRIANGLE_FAN = 0x6\n}\n\nexport function convertGLDrawModeToTopology(\n drawMode: GLEnum.POINTS | GLEnum.LINES | GLEnum.LINE_STRIP | GLEnum.LINE_LOOP | GLEnum.TRIANGLES | GLEnum.TRIANGLE_STRIP | GLEnum.TRIANGLE_FAN,\n): PrimitiveTopology {\n switch (drawMode) {\n case GLEnum.POINTS: return 'point-list';\n case GLEnum.LINES: return 'line-list';\n case GLEnum.LINE_STRIP: return 'line-strip';\n case GLEnum.LINE_LOOP: return 'line-loop-webgl';\n case GLEnum.TRIANGLES: return 'triangle-list';\n case GLEnum.TRIANGLE_STRIP: return 'triangle-strip';\n case GLEnum.TRIANGLE_FAN: return 'triangle-fan-webgl';\n default: throw new Error(drawMode);\n }\n}\n"],"mappings":"AACA,SAAQA,QAAQ,EAAEC,SAAS,QAA8B,iBAAiB;AAE1E,SAAQC,WAAW,QAAO,gBAAgB;AAC1C,SAAQC,OAAO,QAAO,eAAe;AAAC,SAE9BC,YAAY;AAAA,SACZC,eAAe;AAWvB,MAAMC,eAAwC,GAAG;EAC/CC,YAAY,EAAE,CAAC,CAAC;EAChBC,QAAQ,EAAE,KAAK;EACfC,6BAA6B,EAAE,IAAI;EACnCC,MAAM,EAAE,IAAI;EACZC,WAAW,EAAE;AACf,CAAC;AAMD,OAAO,MAAMC,gBAAgB,CAAC;EAM5BC,WAAWA,CAACC,MAAc,EAAyC;IAAA,IAAvCC,OAAgC,GAAAC,SAAA,CAAAC,MAAA,QAAAD,SAAA,QAAAE,SAAA,GAAAF,SAAA,MAAG,CAAC,CAAC;IAAA,KAJjEF,MAAM;IAAA,KACNC,OAAO;IAAA,KACPI,IAAI;IAGF,IAAI,CAACL,MAAM,GAAGZ,WAAW,CAACkB,MAAM,CAACN,MAAM,CAAC;IACxC,IAAI,CAACC,OAAO,GAAG;MAAC,GAAGT,eAAe;MAAE,GAAGS;IAAO,CAAC;EACjD;EAEAM,WAAWA,CAACF,IAAS,EAAe;IAClC,IAAI,CAACA,IAAI,GAAGA,IAAI;IAChB,MAAMG,MAAM,GAAG,CAACH,IAAI,CAACG,MAAM,IAAI,EAAE,EAAEC,GAAG,CAAEC,KAAK,IAAK,IAAI,CAACC,WAAW,CAACD,KAAK,CAAC,CAAC;IAC1E,OAAOF,MAAM;EACf;EAEAI,cAAcA,CAAA,EAAiB;IAC7B,IAAIC,KAAK,CAACC,OAAO,CAAC,IAAI,CAACT,IAAI,CAACU,UAAU,CAAC,EAAE;MACvC,OAAO,IAAIzB,YAAY,CAAC,IAAI,CAACe,IAAI,CAAC;IACpC;IAEA,OAAO,IAAI;EACb;EAEAM,WAAWA,CAACK,SAAc,EAAa;IACrC,MAAMC,SAAS,GAAGD,SAAS,CAACE,KAAK,IAAI,EAAE;IACvC,MAAMA,KAAK,GAAGD,SAAS,CAACR,GAAG,CAAEU,IAAI,IAAK,IAAI,CAACC,UAAU,CAACD,IAAI,CAAC,CAAC;IAC5D,MAAMT,KAAK,GAAG,IAAIvB,SAAS,CAAC;MAC1BkC,EAAE,EAAEL,SAAS,CAACM,IAAI,IAAIN,SAAS,CAACK,EAAE;MAClCE,QAAQ,EAAEL;IACZ,CAAC,CAAC;IACF,OAAOR,KAAK;EACd;EAEAU,UAAUA,CAACI,QAAQ,EAAE;IACnB,IAAI,CAACA,QAAQ,CAACC,KAAK,EAAE;MACnB,MAAMC,YAAY,GAAGF,QAAQ,CAACD,QAAQ,IAAI,EAAE;MAC5C,MAAMA,QAAQ,GAAGG,YAAY,CAACjB,GAAG,CAAEkB,KAAK,IAAK,IAAI,CAACP,UAAU,CAACO,KAAK,CAAC,CAAC;MAGpE,IAAIH,QAAQ,CAACI,IAAI,EAAE;QACjBL,QAAQ,CAACM,IAAI,CAAC,IAAI,CAACC,UAAU,CAACN,QAAQ,CAACI,IAAI,CAAC,CAAC;MAC/C;MAEA,MAAMT,IAAI,GAAG,IAAIhC,SAAS,CAAC;QACzBkC,EAAE,EAAEG,QAAQ,CAACF,IAAI,IAAIE,QAAQ,CAACH,EAAE;QAChCE;MACF,CAAC,CAAC;MAEF,IAAIC,QAAQ,CAACO,MAAM,EAAE;QACnBZ,IAAI,CAACa,SAAS,CAACR,QAAQ,CAACO,MAAM,CAAC;MACjC,CAAC,MAAM;QACLZ,IAAI,CAACY,MAAM,CAACE,QAAQ,CAAC,CAAC;QAEtB,IAAIT,QAAQ,CAACU,WAAW,EAAE;UACxBf,IAAI,CAACY,MAAM,CAACI,SAAS,CAACX,QAAQ,CAACU,WAAW,CAAC;QAC7C;QAEA,IAAIV,QAAQ,CAACY,QAAQ,EAAE;UACrB,MAAMC,cAAc,GAAG,IAAIhD,OAAO,CAAC,CAAC,CAACiD,cAAc,CAACd,QAAQ,CAACY,QAAQ,CAAC;UACtEjB,IAAI,CAACY,MAAM,CAACQ,aAAa,CAACF,cAAc,CAAC;QAC3C;QAEA,IAAIb,QAAQ,CAACgB,KAAK,EAAE;UAClBrB,IAAI,CAACY,MAAM,CAACS,KAAK,CAAChB,QAAQ,CAACgB,KAAK,CAAC;QACnC;MACF;MACAhB,QAAQ,CAACC,KAAK,GAAGN,IAAI;IACvB;IAEA,OAAOK,QAAQ,CAACC,KAAK;EACvB;EAEAK,UAAUA,CAACW,QAAQ,EAAa;IAE9B,IAAI,CAACA,QAAQ,CAACC,KAAK,EAAE;MACnB,MAAMC,cAAc,GAAGF,QAAQ,CAACG,UAAU,IAAI,EAAE;MAChD,MAAMA,UAAU,GAAGD,cAAc,CAAClC,GAAG,CAAC,CAACoC,aAAa,EAAEC,CAAC,KACrD,IAAI,CAACC,eAAe,CAACF,aAAa,EAAEC,CAAC,EAAEL,QAAQ,CACjD,CAAC;MACD,MAAMb,IAAI,GAAG,IAAIzC,SAAS,CAAC;QACzBkC,EAAE,EAAEoB,QAAQ,CAACnB,IAAI,IAAImB,QAAQ,CAACpB,EAAE;QAChCE,QAAQ,EAAEqB;MACZ,CAAC,CAAC;MACFH,QAAQ,CAACC,KAAK,GAAGd,IAAI;IACvB;IAEA,OAAOa,QAAQ,CAACC,KAAK;EACvB;EAEAK,eAAeA,CAACF,aAAkB,EAAEC,CAAS,EAAEL,QAAQ,EAAa;IAClE,MAAMpB,EAAE,GAAGwB,aAAa,CAACvB,IAAI,IAAK,GAAEmB,QAAQ,CAACnB,IAAI,IAAImB,QAAQ,CAACpB,EAAG,cAAayB,CAAE,EAAC;IACjF,MAAME,QAAQ,GAAGC,2BAA2B,CAACJ,aAAa,CAACK,IAAI,IAAI,CAAC,CAAC;IACrE,MAAMC,WAAW,GAAGN,aAAa,CAACO,OAAO,GACrCP,aAAa,CAACO,OAAO,CAACC,KAAK,GAC3B,IAAI,CAACC,cAAc,CAACT,aAAa,CAACU,UAAU,CAAC;IAEjD,MAAMC,SAAS,GAAGjE,eAAe,CAAC,IAAI,CAACS,MAAM,EAAE;MAC7CqB,EAAE;MACFoC,QAAQ,EAAE,IAAI,CAACC,cAAc,CAACrC,EAAE,EAAEwB,aAAa,EAAEG,QAAQ,CAAC;MAC1DW,QAAQ,EAAEd,aAAa,CAACc,QAAQ;MAChCC,eAAe,EAAE,IAAI,CAAC3D,OAAO;MAC7BR,YAAY,EAAE,IAAI,CAACQ,OAAO,CAACR,YAAY;MACvC0D;IACF,CAAC,CAAC;IAEFK,SAAS,CAACK,MAAM,GAAG,CAAChB,aAAa,CAACU,UAAU,CAACO,QAAQ,CAACC,GAAG,EAAElB,aAAa,CAACU,UAAU,CAACO,QAAQ,CAACE,GAAG,CAAC;IAIjG,OAAOR,SAAS;EAClB;EAEAF,cAAcA,CAACC,UAAe,EAAE;IAC9B,MAAM,IAAIU,KAAK,CAAC,gCAAgC,CAAC;EACnD;EAEAP,cAAcA,CAACrC,EAAU,EAAEwB,aAAkB,EAAEG,QAA2B,EAAY;IACpF,MAAMO,UAAU,GAAG,CAAC,CAAC;IACrB,KAAK,MAAM,CAACW,aAAa,EAAEC,SAAS,CAAC,IAAIC,MAAM,CAACC,OAAO,CAACxB,aAAa,CAACU,UAAU,CAAC,EAAE;MACjF,MAAM;QAACe,UAAU;QAAEC,IAAI;QAAEC;MAAK,CAAC,GAAGL,SAA8B;MAEhEZ,UAAU,CAACW,aAAa,CAAC,GAAG;QAACK,IAAI,EAAEA,IAAI,aAAJA,IAAI,cAAJA,IAAI,GAAID,UAAU;QAAEE;MAAK,CAAC;IAC/D;IAAC;IAED,OAAO,IAAItF,QAAQ,CAAC;MAClBmC,EAAE;MACF2B,QAAQ;MACRI,OAAO,EAAEP,aAAa,CAACO,OAAO,CAACoB,KAAK;MACpCjB;IACF,CAAC,CAAC;EACJ;EAEAkB,YAAYA,CAACN,SAAS,EAAEO,KAAa,EAAU;IAC7C,IAAI,CAACP,SAAS,CAACQ,UAAU,EAAE;MAEzBR,SAAS,CAACQ,UAAU,GAAG,CAAC,CAAC;IAC3B;IAEA,MAAM;MAACA;IAAU,CAAC,GAAGR,SAAS;IAC9B,IAAI,CAACQ,UAAU,CAACC,WAAW,EAAE;MAC3BD,UAAU,CAACC,WAAW,GAAG,CAAC,CAAC;IAC7B;IAEA,IAAI,CAACD,UAAU,CAACC,WAAW,CAACF,KAAK,CAAC,EAAE;MAClCC,UAAU,CAACC,WAAW,CAACF,KAAK,CAAC,GAAG,IAAI,CAAC1E,MAAM,CAACyE,YAAY,CAAC;QACvDpD,EAAE,EAAG,QAAOsD,UAAU,CAACtD,EAAG,EAAC;QAE3BwD,IAAI,EAAEF,UAAU,CAACE,IAAI,IAAIV,SAAS,CAACK;MACrC,CAAC,CAAC;IACJ;IAEA,OAAOG,UAAU,CAACC,WAAW,CAACF,KAAK,CAAC;EACtC;EAGAI,aAAaA,CAACC,WAAW,EAAE;IACzB,OAAOA,WAAW;EACpB;EAIAC,QAAQA,CAAA,EAAY;IAKlB,OAAO,KAAK;EACd;AACF;AAAC,IAKIC,MAAM,aAANA,MAAM;EAANA,MAAM,CAANA,MAAM;EAANA,MAAM,CAANA,MAAM;EAANA,MAAM,CAANA,MAAM;EAANA,MAAM,CAANA,MAAM;EAANA,MAAM,CAANA,MAAM;EAANA,MAAM,CAANA,MAAM;EAANA,MAAM,CAANA,MAAM;EAAA,OAANA,MAAM;AAAA,EAANA,MAAM;AAUX,OAAO,SAAShC,2BAA2BA,CACzCiC,QAA8I,EAC1H;EACpB,QAAQA,QAAQ;IACd,KAAKD,MAAM,CAACE,MAAM;MAAE,OAAO,YAAY;IACvC,KAAKF,MAAM,CAACG,KAAK;MAAE,OAAO,WAAW;IACrC,KAAKH,MAAM,CAACI,UAAU;MAAE,OAAO,YAAY;IAC3C,KAAKJ,MAAM,CAACK,SAAS;MAAE,OAAO,iBAAiB;IAC/C,KAAKL,MAAM,CAACM,SAAS;MAAE,OAAO,eAAe;IAC7C,KAAKN,MAAM,CAACO,cAAc;MAAE,OAAO,gBAAgB;IACnD,KAAKP,MAAM,CAACQ,YAAY;MAAE,OAAO,oBAAoB;IACrD;MAAS,MAAM,IAAIxB,KAAK,CAACiB,QAAQ,CAAC;EACpC;AACF"}
package/dist/index.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","names":["parsePBRMaterial","loadPBREnvironment","createScenegraphsFromGLTF","GLTFAnimator"],"sources":["../src/index.ts"],"sourcesContent":["// luma.gl, MIT license\n\nexport type {PBREnvironment} from './pbr/pbr-environment';\nexport type {ParsePBRMaterialOptions, ParsedPBRMaterial} from './pbr/parse-pbr-material';\nexport {parsePBRMaterial} from './pbr/parse-pbr-material';\nexport {loadPBREnvironment} from './pbr/pbr-environment';\n\n// glTF Scenegraph Instantiator\nexport {createScenegraphsFromGLTF} from './gltf/create-gltf-objects';\nexport {GLTFAnimator} from './gltf/gltf-animator';\n\n"],"mappings":"SAIQA,gBAAgB;AAAA,SAChBC,kBAAkB;AAAA,SAGlBC,yBAAyB;AAAA,SACzBC,YAAY"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"parse-pbr-material.js","names":["log","GLEnum","parsePBRMaterial","device","material","attributes","options","parsedMaterial","defines","MANUAL_SRGB","SRGB_FAST_APPROXIMATION","bindings","uniforms","u_Camera","u_MetallicRoughnessValues","parameters","glParameters","generatedTextures","features","has","USE_TEX_LOD","imageBasedLightingEnvironment","u_DiffuseEnvSampler","diffuseEnvSampler","u_SpecularEnvSampler","specularEnvSampler","u_brdfLUT","brdfLutTexture","u_ScaleIBLAmbient","pbrDebug","PBR_DEBUG","u_ScaleDiffBaseMR","u_ScaleFGDSpec","NORMAL","HAS_NORMALS","TANGENT","useTangents","HAS_TANGENTS","TEXCOORD_0","HAS_UV","USE_IBL","lights","USE_LIGHTS","parseMaterial","pbr_uUnlit","Boolean","unlit","pbrMetallicRoughness","parsePbrMetallicRoughness","normalTexture","addTexture","scale","u_NormalScale","occlusionTexture","strength","u_OcclusionStrength","emissiveTexture","u_EmissiveFactor","emissiveFactor","alphaMode","alphaCutoff","ALPHA_CUTOFF","u_AlphaCutoff","warn","blendColorOperation","blendColorSrcFactor","blendColorDstFactor","blendAlphaOperation","blendAlphaSrcFactor","blendAlphaDstFactor","blend","blendEquation","FUNC_ADD","blendFunc","SRC_ALPHA","ONE_MINUS_SRC_ALPHA","ONE","baseColorTexture","u_BaseColorFactor","baseColorFactor","metallicRoughnessTexture","metallicFactor","roughnessFactor","gltfTexture","uniformName","_gltfTexture$texture","define","arguments","length","undefined","texture","sampler","image","source","textureOptions","specialTextureParameters","compressed","TEXTURE_MIN_FILTER","data","LINEAR_MIPMAP_NEAREST","LINEAR","createTexture","id","pixelStore","UNPACK_FLIP_Y_WEBGL","push"],"sources":["../../src/pbr/parse-pbr-material.ts"],"sourcesContent":["import type {Device, Texture, Binding, Parameters} from '@luma.gl/core';\nimport {log} from '@luma.gl/core';\nimport {PBREnvironment} from './pbr-environment';\n\n/* eslint-disable camelcase */\n\nexport type ParsePBRMaterialOptions = {\n /** Debug PBR shader */\n pbrDebug?: boolean;\n /** Enable lights */\n lights?: any;\n /** Use tangents */\n useTangents?: boolean;\n /** provide an image based (texture cube) lighting environment */\n imageBasedLightingEnvironment?: PBREnvironment;\n};\n\nexport type ParsedPBRMaterial = {\n readonly defines: Record<string, number | boolean>;\n readonly bindings: Record<string, Binding>;\n readonly uniforms: Record<string, any>;\n readonly parameters: Parameters;\n readonly glParameters: Record<string, any>;\n /** List of all generated textures, makes it easy to destroy them later */\n readonly generatedTextures: Texture[];\n};\n\n// NOTE: Modules other than `@luma.gl/webgl` should not import `GL` from\n// `@luma.gl/constants`. Locally we use `GLEnum` instead of `GL` to avoid\n// conflicts with the `babel-plugin-inline-webgl-constants` plugin.\nenum GLEnum {\n FUNC_ADD = 0x8006,\n ONE = 1,\n SRC_ALPHA = 0x0302,\n ONE_MINUS_SRC_ALPHA = 0x0303,\n TEXTURE_MIN_FILTER = 0x2801,\n LINEAR = 0x2601,\n LINEAR_MIPMAP_NEAREST = 0x2701,\n UNPACK_FLIP_Y_WEBGL = 0x9240,\n}\n\n/**\n * Parses a GLTF material definition into uniforms and parameters for the PBR shader module\n */\nexport function parsePBRMaterial(\n device: Device,\n material,\n attributes: Record<string, any>,\n options: ParsePBRMaterialOptions\n): ParsedPBRMaterial {\n const parsedMaterial: ParsedPBRMaterial = {\n defines: {\n // TODO: Use EXT_sRGB if available (Standard in WebGL 2.0)\n MANUAL_SRGB: 1,\n SRGB_FAST_APPROXIMATION: 1\n },\n bindings: {},\n uniforms: {\n // TODO: find better values?\n u_Camera: [0, 0, 0], // Model should override\n\n u_MetallicRoughnessValues: [1, 1] // Default is 1 and 1\n },\n parameters: {},\n glParameters: {}, \n generatedTextures: []\n };\n\n if (device.features.has('glsl-texture-lod')) {\n parsedMaterial.defines.USE_TEX_LOD = 1;\n }\n\n const {imageBasedLightingEnvironment} = options;\n if (imageBasedLightingEnvironment) {\n parsedMaterial.bindings.u_DiffuseEnvSampler =\n imageBasedLightingEnvironment.diffuseEnvSampler;\n parsedMaterial.bindings.u_SpecularEnvSampler =\n imageBasedLightingEnvironment.specularEnvSampler;\n parsedMaterial.bindings.u_brdfLUT = imageBasedLightingEnvironment.brdfLutTexture;\n parsedMaterial.uniforms.u_ScaleIBLAmbient = [1, 1];\n }\n\n if (options?.pbrDebug) {\n parsedMaterial.defines.PBR_DEBUG = 1;\n // Override final color for reference app visualization of various parameters in the lighting equation.\n parsedMaterial.uniforms.u_ScaleDiffBaseMR = [0, 0, 0, 0];\n parsedMaterial.uniforms.u_ScaleFGDSpec = [0, 0, 0, 0];\n }\n\n if (attributes.NORMAL) parsedMaterial.defines.HAS_NORMALS = 1;\n if (attributes.TANGENT && options?.useTangents) parsedMaterial.defines.HAS_TANGENTS = 1;\n if (attributes.TEXCOORD_0) parsedMaterial.defines.HAS_UV = 1;\n\n if (options?.imageBasedLightingEnvironment) parsedMaterial.defines.USE_IBL = 1;\n if (options?.lights) parsedMaterial.defines.USE_LIGHTS = 1;\n\n if (material) {\n parseMaterial(device, material, parsedMaterial);\n }\n\n return parsedMaterial;\n}\n\n/** Parse GLTF material record */\nfunction parseMaterial(device: Device, material, parsedMaterial: ParsedPBRMaterial): void {\n parsedMaterial.uniforms.pbr_uUnlit = Boolean(material.unlit);\n\n if (material.pbrMetallicRoughness) {\n parsePbrMetallicRoughness(device, material.pbrMetallicRoughness, parsedMaterial);\n }\n if (material.normalTexture) {\n addTexture(device, material.normalTexture, 'u_NormalSampler', 'HAS_NORMALMAP', parsedMaterial);\n\n const {scale = 1} = material.normalTexture;\n parsedMaterial.uniforms.u_NormalScale = scale;\n }\n if (material.occlusionTexture) {\n addTexture(\n device,\n material.occlusionTexture,\n 'u_OcclusionSampler',\n 'HAS_OCCLUSIONMAP',\n parsedMaterial\n );\n\n const {strength = 1} = material.occlusionTexture;\n parsedMaterial.uniforms.u_OcclusionStrength = strength;\n }\n if (material.emissiveTexture) {\n addTexture(\n device,\n material.emissiveTexture,\n 'u_EmissiveSampler',\n 'HAS_EMISSIVEMAP',\n parsedMaterial\n );\n parsedMaterial.uniforms.u_EmissiveFactor = material.emissiveFactor || [0, 0, 0];\n }\n\n switch (material.alphaMode) {\n case 'MASK':\n const {alphaCutoff = 0.5} = material;\n parsedMaterial.defines.ALPHA_CUTOFF = 1;\n parsedMaterial.uniforms.u_AlphaCutoff = alphaCutoff;\n break;\n case 'BLEND':\n log.warn('glTF BLEND alphaMode might not work well because it requires mesh sorting')();\n\n // WebGPU style parameters\n parsedMaterial.parameters.blendColorOperation = 'add';\n parsedMaterial.parameters.blendColorSrcFactor = 'src-alpha';\n parsedMaterial.parameters.blendColorDstFactor = 'one-minus-src-alpha';\n \n parsedMaterial.parameters.blendAlphaOperation = 'add';\n parsedMaterial.parameters.blendAlphaSrcFactor = 'one';\n parsedMaterial.parameters.blendAlphaDstFactor = 'one-minus-src-alpha';\n\n // GL parameters\n parsedMaterial.glParameters.blend = true;\n parsedMaterial.glParameters.blendEquation = GLEnum.FUNC_ADD;\n parsedMaterial.glParameters.blendFunc = [GLEnum.SRC_ALPHA, GLEnum.ONE_MINUS_SRC_ALPHA, GLEnum.ONE, GLEnum.ONE_MINUS_SRC_ALPHA];\n\n break;\n }\n}\n\n/** Parse GLTF material sub record */\nfunction parsePbrMetallicRoughness(\n device: Device,\n pbrMetallicRoughness,\n parsedMaterial: ParsedPBRMaterial\n): void {\n if (pbrMetallicRoughness.baseColorTexture) {\n addTexture(\n device,\n pbrMetallicRoughness.baseColorTexture,\n 'u_BaseColorSampler',\n 'HAS_BASECOLORMAP',\n parsedMaterial\n );\n }\n parsedMaterial.uniforms.u_BaseColorFactor = pbrMetallicRoughness.baseColorFactor || [1, 1, 1, 1];\n\n if (pbrMetallicRoughness.metallicRoughnessTexture) {\n addTexture(\n device,\n pbrMetallicRoughness.metallicRoughnessTexture,\n 'u_MetallicRoughnessSampler',\n 'HAS_METALROUGHNESSMAP',\n parsedMaterial\n );\n }\n const {metallicFactor = 1, roughnessFactor = 1} = pbrMetallicRoughness;\n parsedMaterial.uniforms.u_MetallicRoughnessValues = [metallicFactor, roughnessFactor];\n}\n\n/** Create a texture from a glTF texture/sampler/image combo and add it to bindings */\nfunction addTexture(\n device: Device,\n gltfTexture,\n uniformName: string,\n define = null,\n parsedMaterial: ParsedPBRMaterial\n): void {\n const parameters = gltfTexture?.texture?.sampler?.parameters || {};\n\n const image = gltfTexture.texture.source.image;\n let textureOptions;\n let specialTextureParameters = {};\n if (image.compressed) {\n textureOptions = image;\n specialTextureParameters = {\n [GLEnum.TEXTURE_MIN_FILTER]: image.data.length > 1 ? GLEnum.LINEAR_MIPMAP_NEAREST : GLEnum.LINEAR\n };\n } else {\n // Texture2D accepts a promise that returns an image as data (Async Textures)\n textureOptions = {data: image};\n }\n\n const texture: Texture = device.createTexture({\n id: gltfTexture.uniformName || gltfTexture.id,\n parameters: {\n ...parameters,\n ...specialTextureParameters\n },\n pixelStore: {\n [GLEnum.UNPACK_FLIP_Y_WEBGL]: false\n },\n ...textureOptions\n });\n parsedMaterial.bindings[uniformName] = texture;\n if (define) parsedMaterial.defines[define] = 1;\n parsedMaterial.generatedTextures.push(texture);\n}\n\n/*\n/**\n * Parses a GLTF material definition into uniforms and parameters for the PBR shader module\n *\nexport class PBRMaterialParser {\n readonly device: Device;\n\n readonly defines: Record<string, number | boolean>;\n readonly bindings: Record<string, Binding>;\n readonly uniforms: Record<string, any>;\n readonly parameters: Record<string, any>;\n\n /** Hold on to generated textures, we destroy them in the destroy method *\n readonly generatedTextures: Texture[];\n\n constructor(device: Device, props: PBRMaterialParserProps) {\n const {attributes, material, pbrDebug, imageBasedLightingEnvironment, lights, useTangents} =\n props;\n this.device = device;\n\n this.defines = {\n // TODO: Use EXT_sRGB if available (Standard in WebGL 2.0)\n MANUAL_SRGB: 1,\n SRGB_FAST_APPROXIMATION: 1\n };\n\n if (this.device.features.has('glsl-texture-lod')) {\n this.defines.USE_TEX_LOD = 1;\n }\n\n this.uniforms = {\n // TODO: find better values?\n u_Camera: [0, 0, 0], // Model should override\n\n u_MetallicRoughnessValues: [1, 1] // Default is 1 and 1\n };\n\n this.bindings = {};\n\n this.parameters = {};\n this.generatedTextures = [];\n\n if (imageBasedLightingEnvironment) {\n this.bindings.u_DiffuseEnvSampler = imageBasedLightingEnvironment.getDiffuseEnvSampler();\n this.bindings.u_SpecularEnvSampler = imageBasedLightingEnvironment.getSpecularEnvSampler();\n this.bindings.u_brdfLUT = imageBasedLightingEnvironment.getBrdfTexture();\n this.uniforms.u_ScaleIBLAmbient = [1, 1];\n }\n\n if (pbrDebug) {\n // Override final color for reference app visualization\n // of various parameters in the lighting equation.\n this.uniforms.u_ScaleDiffBaseMR = [0, 0, 0, 0];\n this.uniforms.u_ScaleFGDSpec = [0, 0, 0, 0];\n }\n\n this.defineIfPresent(attributes.NORMAL, 'HAS_NORMALS');\n this.defineIfPresent(attributes.TANGENT && useTangents, 'HAS_TANGENTS');\n this.defineIfPresent(attributes.TEXCOORD_0, 'HAS_UV');\n\n this.defineIfPresent(imageBasedLightingEnvironment, 'USE_IBL');\n this.defineIfPresent(lights, 'USE_LIGHTS');\n this.defineIfPresent(pbrDebug, 'PBR_DEBUG');\n\n if (material) {\n this.parseMaterial(material);\n }\n }\n\n /**\n * Destroy all generated resources to release memory.\n *\n destroy(): void {\n this.generatedTextures.forEach(texture => texture.destroy());\n }\n\n /** Add a define if the the value is non-nullish *\n defineIfPresent(value: unknown, name: string): void {\n if (value) {\n this.defines[name] = 1;\n }\n }\n\n /** Parse GLTF material record *\n parseMaterial(material) {\n this.uniforms.pbr_uUnlit = Boolean(material.unlit);\n\n if (material.pbrMetallicRoughness) {\n this.parsePbrMetallicRoughness(material.pbrMetallicRoughness);\n }\n if (material.normalTexture) {\n this.addTexture(material.normalTexture, 'u_NormalSampler', 'HAS_NORMALMAP');\n\n const {scale = 1} = material.normalTexture;\n this.uniforms.u_NormalScale = scale;\n }\n if (material.occlusionTexture) {\n this.addTexture(material.occlusionTexture, 'u_OcclusionSampler', 'HAS_OCCLUSIONMAP');\n\n const {strength = 1} = material.occlusionTexture;\n this.uniforms.u_OcclusionStrength = strength;\n }\n if (material.emissiveTexture) {\n this.addTexture(material.emissiveTexture, 'u_EmissiveSampler', 'HAS_EMISSIVEMAP');\n this.uniforms.u_EmissiveFactor = material.emissiveFactor || [0, 0, 0];\n }\n if (material.alphaMode === 'MASK') {\n const {alphaCutoff = 0.5} = material;\n this.defines.ALPHA_CUTOFF = 1;\n this.uniforms.u_AlphaCutoff = alphaCutoff;\n } else if (material.alphaMode === 'BLEND') {\n log.warn('BLEND alphaMode might not work well because it requires mesh sorting')();\n Object.assign(this.parameters, {\n blend: true,\n blendEquation: GL.FUNC_ADD,\n blendFunc: [GL.SRC_ALPHA, GL.ONE_MINUS_SRC_ALPHA, GL.ONE, GL.ONE_MINUS_SRC_ALPHA]\n });\n }\n }\n\n /** Parse GLTF material sub record *\n parsePbrMetallicRoughness(pbrMetallicRoughness) {\n if (pbrMetallicRoughness.baseColorTexture) {\n this.addTexture(\n pbrMetallicRoughness.baseColorTexture,\n 'u_BaseColorSampler',\n 'HAS_BASECOLORMAP'\n );\n }\n this.uniforms.u_BaseColorFactor = pbrMetallicRoughness.baseColorFactor || [1, 1, 1, 1];\n\n if (pbrMetallicRoughness.metallicRoughnessTexture) {\n this.addTexture(\n pbrMetallicRoughness.metallicRoughnessTexture,\n 'u_MetallicRoughnessSampler',\n 'HAS_METALROUGHNESSMAP'\n );\n }\n const {metallicFactor = 1, roughnessFactor = 1} = pbrMetallicRoughness;\n this.uniforms.u_MetallicRoughnessValues = [metallicFactor, roughnessFactor];\n }\n\n /** Create a texture from a glTF texture/sampler/image combo and add it to bindings *\n addTexture(gltfTexture, name, define = null) {\n const parameters = gltfTexture?.texture?.sampler?.parameters || {};\n\n const image = gltfTexture.texture.source.image;\n let textureOptions;\n let specialTextureParameters = {};\n if (image.compressed) {\n textureOptions = image;\n specialTextureParameters = {\n [GL.TEXTURE_MIN_FILTER]: image.data.length > 1 ? GL.LINEAR_MIPMAP_NEAREST : GL.LINEAR\n };\n } else {\n // Texture2D accepts a promise that returns an image as data (Async Textures)\n textureOptions = {data: image};\n }\n\n const texture: Texture = this.device.createTexture({\n id: gltfTexture.name || gltfTexture.id,\n parameters: {\n ...parameters,\n ...specialTextureParameters\n },\n pixelStore: {\n [GL.UNPACK_FLIP_Y_WEBGL]: false\n },\n ...textureOptions\n });\n this.bindings[name] = texture;\n this.defineIfPresent(define, define);\n this.generatedTextures.push(texture);\n }\n}\n*/\n"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"pbr-environment.js","names":["loadImageTexture","loadPBREnvironment","device","props","brdfLutTexture","createTexture","id","sampler","wrapS","wrapT","minFilter","maxFilter","data","brdfLutUrl","diffuseEnvSampler","makeCube","getTextureForFace","dir","getTexUrl","specularEnvSampler","imageArray","lod","specularMipLevels","push","FACES","_ref","forEach","face","String","dimension","mipmaps"],"sources":["../../src/pbr/pbr-environment.ts"],"sourcesContent":["import {Device, SamplerProps, Texture} from '@luma.gl/core';\nimport {loadImageTexture} from '@loaders.gl/textures';\n\ntype TextureCube = Texture;\n\n/** Environment textures for PBR module */\nexport type PBREnvironment = {\n /** Bi-directional Reflectance Distribution Function (BRDF) lookup table */\n brdfLutTexture: Texture;\n diffuseEnvSampler: TextureCube;\n specularEnvSampler: TextureCube;\n};\n\nexport type PBREnvironmentProps = {\n brdfLutUrl: string;\n getTexUrl: (name: string, dir: number, level: number) => string;\n specularMipLevels?: number;\n}\n\n/** Loads textures for PBR environment */\nexport function loadPBREnvironment(device: Device, props: PBREnvironmentProps): PBREnvironment {\n const brdfLutTexture = device.createTexture({\n id: 'brdfLUT',\n sampler: {\n wrapS: 'clamp-to-edge',\n wrapT: 'clamp-to-edge',\n minFilter: 'linear',\n maxFilter: 'linear'\n } as SamplerProps,\n // Texture accepts a promise that returns an image as data (Async Textures)\n data: loadImageTexture(props.brdfLutUrl)\n });\n\n const diffuseEnvSampler = makeCube(device, {\n id: 'DiffuseEnvSampler',\n getTextureForFace: (dir) => loadImageTexture(props.getTexUrl('diffuse', dir, 0)),\n sampler: {\n wrapS: 'clamp-to-edge',\n wrapT: 'clamp-to-edge',\n minFilter: 'linear',\n maxFilter: 'linear'\n } as SamplerProps,\n });\n\n const specularEnvSampler = makeCube(device, {\n id: 'SpecularEnvSampler',\n getTextureForFace: (dir: number) => {\n const imageArray = [];\n for (let lod = 0; lod <= props.specularMipLevels - 1; lod++) {\n imageArray.push(loadImageTexture(props.getTexUrl('specular', dir, lod)));\n }\n return imageArray;\n },\n sampler: {\n wrapS: 'clamp-to-edge',\n wrapT: 'clamp-to-edge',\n minFilter: 'linear', // [GL.TEXTURE_MIN_FILTER]: GL.LINEAR_MIPMAP_LINEAR,\n maxFilter: 'linear'\n } as SamplerProps,\n });\n\n return {\n brdfLutTexture,\n diffuseEnvSampler,\n specularEnvSampler\n }\n}\n\n// TODO put somewhere common\nconst FACES = [0, 1, 2, 3, 4, 5];\n\nfunction makeCube(device: Device, {id, getTextureForFace, sampler}: {\n id: string, \n getTextureForFace: (dir: number) => Promise<any> | Promise<any>[], \n sampler: SamplerProps\n}): TextureCube {\n const data = {};\n FACES.forEach((face) => {\n data[String(face)] = getTextureForFace(face);\n });\n return device.createTexture({\n id,\n dimension: 'cube',\n mipmaps: false,\n sampler,\n data\n });\n}\n"],"mappings":"AACA,SAAQA,gBAAgB,QAAO,sBAAsB;AAmBrD,OAAO,SAASC,kBAAkBA,CAACC,MAAc,EAAEC,KAA0B,EAAkB;EAC7F,MAAMC,cAAc,GAAGF,MAAM,CAACG,aAAa,CAAC;IAC1CC,EAAE,EAAE,SAAS;IACbC,OAAO,EAAE;MACPC,KAAK,EAAE,eAAe;MACtBC,KAAK,EAAE,eAAe;MACtBC,SAAS,EAAE,QAAQ;MACnBC,SAAS,EAAE;IACb,CAAiB;IAEjBC,IAAI,EAAEZ,gBAAgB,CAACG,KAAK,CAACU,UAAU;EACzC,CAAC,CAAC;EAEF,MAAMC,iBAAiB,GAAGC,QAAQ,CAACb,MAAM,EAAE;IACzCI,EAAE,EAAE,mBAAmB;IACvBU,iBAAiB,EAAGC,GAAG,IAAKjB,gBAAgB,CAACG,KAAK,CAACe,SAAS,CAAC,SAAS,EAAED,GAAG,EAAE,CAAC,CAAC,CAAC;IAChFV,OAAO,EAAE;MACPC,KAAK,EAAE,eAAe;MACtBC,KAAK,EAAE,eAAe;MACtBC,SAAS,EAAE,QAAQ;MACnBC,SAAS,EAAE;IACb;EACF,CAAC,CAAC;EAEF,MAAMQ,kBAAkB,GAAGJ,QAAQ,CAACb,MAAM,EAAE;IAC1CI,EAAE,EAAE,oBAAoB;IACxBU,iBAAiB,EAAGC,GAAW,IAAK;MAClC,MAAMG,UAAU,GAAG,EAAE;MACrB,KAAK,IAAIC,GAAG,GAAG,CAAC,EAAEA,GAAG,IAAIlB,KAAK,CAACmB,iBAAiB,GAAG,CAAC,EAAED,GAAG,EAAE,EAAE;QAC3DD,UAAU,CAACG,IAAI,CAACvB,gBAAgB,CAACG,KAAK,CAACe,SAAS,CAAC,UAAU,EAAED,GAAG,EAAEI,GAAG,CAAC,CAAC,CAAC;MAC1E;MACA,OAAOD,UAAU;IACnB,CAAC;IACDb,OAAO,EAAE;MACPC,KAAK,EAAE,eAAe;MACtBC,KAAK,EAAE,eAAe;MACtBC,SAAS,EAAE,QAAQ;MACnBC,SAAS,EAAE;IACb;EACF,CAAC,CAAC;EAEF,OAAO;IACLP,cAAc;IACdU,iBAAiB;IACjBK;EACF,CAAC;AACH;AAGA,MAAMK,KAAK,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;AAEhC,SAAST,QAAQA,CAACb,MAAc,EAAAuB,IAAA,EAIhB;EAAA,IAJkB;IAACnB,EAAE;IAAEU,iBAAiB;IAAET;EAI1D,CAAC,GAAAkB,IAAA;EACC,MAAMb,IAAI,GAAG,CAAC,CAAC;EACfY,KAAK,CAACE,OAAO,CAAEC,IAAI,IAAK;IACtBf,IAAI,CAACgB,MAAM,CAACD,IAAI,CAAC,CAAC,GAAGX,iBAAiB,CAACW,IAAI,CAAC;EAC9C,CAAC,CAAC;EACF,OAAOzB,MAAM,CAACG,aAAa,CAAC;IAC1BC,EAAE;IACFuB,SAAS,EAAE,MAAM;IACjBC,OAAO,EAAE,KAAK;IACdvB,OAAO;IACPK;EACF,CAAC,CAAC;AACJ"}