@luma.gl/gltf 9.3.0-alpha.4 → 9.3.0-alpha.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/dist.dev.js +397 -220
- package/dist/dist.min.js +98 -46
- package/dist/gltf/animations/animations.d.ts +16 -4
- package/dist/gltf/animations/animations.d.ts.map +1 -1
- package/dist/gltf/animations/interpolate.d.ts +4 -3
- package/dist/gltf/animations/interpolate.d.ts.map +1 -1
- package/dist/gltf/animations/interpolate.js +27 -36
- package/dist/gltf/animations/interpolate.js.map +1 -1
- package/dist/gltf/create-gltf-model.d.ts +6 -0
- package/dist/gltf/create-gltf-model.d.ts.map +1 -1
- package/dist/gltf/create-gltf-model.js +96 -44
- package/dist/gltf/create-gltf-model.js.map +1 -1
- package/dist/gltf/create-scenegraph-from-gltf.d.ts +15 -1
- package/dist/gltf/create-scenegraph-from-gltf.d.ts.map +1 -1
- package/dist/gltf/create-scenegraph-from-gltf.js +12 -6
- package/dist/gltf/create-scenegraph-from-gltf.js.map +1 -1
- package/dist/gltf/gltf-animator.d.ts +26 -0
- package/dist/gltf/gltf-animator.d.ts.map +1 -1
- package/dist/gltf/gltf-animator.js +22 -19
- package/dist/gltf/gltf-animator.js.map +1 -1
- package/dist/index.cjs +378 -210
- package/dist/index.cjs.map +4 -4
- package/dist/index.d.ts +1 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js.map +1 -1
- package/dist/parsers/parse-gltf-animations.d.ts +1 -0
- package/dist/parsers/parse-gltf-animations.d.ts.map +1 -1
- package/dist/parsers/parse-gltf-animations.js +46 -23
- package/dist/parsers/parse-gltf-animations.js.map +1 -1
- package/dist/parsers/parse-gltf-lights.d.ts.map +1 -1
- package/dist/parsers/parse-gltf-lights.js +40 -12
- package/dist/parsers/parse-gltf-lights.js.map +1 -1
- package/dist/parsers/parse-gltf.d.ts +16 -1
- package/dist/parsers/parse-gltf.d.ts.map +1 -1
- package/dist/parsers/parse-gltf.js +65 -57
- package/dist/parsers/parse-gltf.js.map +1 -1
- package/dist/parsers/parse-pbr-material.d.ts +46 -1
- package/dist/parsers/parse-pbr-material.d.ts.map +1 -1
- package/dist/parsers/parse-pbr-material.js +137 -13
- package/dist/parsers/parse-pbr-material.js.map +1 -1
- package/dist/pbr/pbr-environment.d.ts +6 -0
- package/dist/pbr/pbr-environment.d.ts.map +1 -1
- package/dist/pbr/pbr-environment.js +1 -0
- package/dist/pbr/pbr-environment.js.map +1 -1
- package/dist/pbr/pbr-material.d.ts +5 -0
- package/dist/pbr/pbr-material.d.ts.map +1 -1
- package/dist/webgl-to-webgpu/convert-webgl-attribute.d.ts +12 -1
- package/dist/webgl-to-webgpu/convert-webgl-attribute.d.ts.map +1 -1
- package/dist/webgl-to-webgpu/convert-webgl-attribute.js +3 -0
- package/dist/webgl-to-webgpu/convert-webgl-attribute.js.map +1 -1
- package/dist/webgl-to-webgpu/convert-webgl-sampler.d.ts +6 -0
- package/dist/webgl-to-webgpu/convert-webgl-sampler.d.ts.map +1 -1
- package/dist/webgl-to-webgpu/convert-webgl-sampler.js +4 -0
- package/dist/webgl-to-webgpu/convert-webgl-sampler.js.map +1 -1
- package/dist/webgl-to-webgpu/convert-webgl-topology.d.ts +2 -0
- package/dist/webgl-to-webgpu/convert-webgl-topology.d.ts.map +1 -1
- package/dist/webgl-to-webgpu/convert-webgl-topology.js +2 -0
- package/dist/webgl-to-webgpu/convert-webgl-topology.js.map +1 -1
- package/package.json +5 -5
- package/src/gltf/animations/animations.ts +17 -5
- package/src/gltf/animations/interpolate.ts +49 -68
- package/src/gltf/create-gltf-model.ts +101 -43
- package/src/gltf/create-scenegraph-from-gltf.ts +39 -11
- package/src/gltf/gltf-animator.ts +34 -25
- package/src/index.ts +1 -2
- package/src/parsers/parse-gltf-animations.ts +63 -26
- package/src/parsers/parse-gltf-lights.ts +51 -13
- package/src/parsers/parse-gltf.ts +90 -77
- package/src/parsers/parse-pbr-material.ts +204 -14
- package/src/pbr/pbr-environment.ts +10 -0
- package/src/pbr/pbr-material.ts +5 -0
- package/src/webgl-to-webgpu/convert-webgl-attribute.ts +12 -1
- package/src/webgl-to-webgpu/convert-webgl-sampler.ts +9 -0
- package/src/webgl-to-webgpu/convert-webgl-topology.ts +2 -0
- package/dist/utils/deep-copy.d.ts +0 -3
- package/dist/utils/deep-copy.d.ts.map +0 -1
- package/dist/utils/deep-copy.js +0 -21
- package/dist/utils/deep-copy.js.map +0 -1
- package/src/utils/deep-copy.ts +0 -22
|
@@ -2,16 +2,31 @@ import { Device } from '@luma.gl/core';
|
|
|
2
2
|
import { GroupNode, type ModelProps } from '@luma.gl/engine';
|
|
3
3
|
import { type GLTFPostprocessed } from '@loaders.gl/gltf';
|
|
4
4
|
import { type PBREnvironment } from "../pbr/pbr-environment.js";
|
|
5
|
+
/** Options that influence how a post-processed glTF is turned into a luma.gl scenegraph. */
|
|
5
6
|
export type ParseGLTFOptions = {
|
|
7
|
+
/** Additional model props applied to each generated primitive model. */
|
|
6
8
|
modelOptions?: Partial<ModelProps>;
|
|
9
|
+
/** Enables shader-level PBR debug output. */
|
|
7
10
|
pbrDebug?: boolean;
|
|
11
|
+
/** Optional image-based lighting environment. */
|
|
8
12
|
imageBasedLightingEnvironment?: PBREnvironment;
|
|
13
|
+
/** Enables punctual light extraction. */
|
|
9
14
|
lights?: boolean;
|
|
15
|
+
/** Enables tangent usage when available. */
|
|
10
16
|
useTangents?: boolean;
|
|
11
17
|
};
|
|
12
18
|
/**
|
|
13
19
|
* GLTF instantiator for luma.gl
|
|
14
20
|
* Walks the parsed and resolved glTF structure and builds a luma.gl scenegraph
|
|
15
21
|
*/
|
|
16
|
-
export declare function parseGLTF(device: Device, gltf: GLTFPostprocessed,
|
|
22
|
+
export declare function parseGLTF(device: Device, gltf: GLTFPostprocessed, options?: ParseGLTFOptions): {
|
|
23
|
+
/** Scene roots generated from `gltf.scenes`. */
|
|
24
|
+
scenes: GroupNode[];
|
|
25
|
+
/** Map from glTF mesh ids to generated mesh group nodes. */
|
|
26
|
+
gltfMeshIdToNodeMap: Map<string, GroupNode>;
|
|
27
|
+
/** Map from glTF node indices to generated scenegraph nodes. */
|
|
28
|
+
gltfNodeIndexToNodeMap: Map<number, GroupNode>;
|
|
29
|
+
/** Map from glTF node ids to generated scenegraph nodes. */
|
|
30
|
+
gltfNodeIdToNodeMap: Map<string, GroupNode>;
|
|
31
|
+
};
|
|
17
32
|
//# sourceMappingURL=parse-gltf.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"parse-gltf.d.ts","sourceRoot":"","sources":["../../src/parsers/parse-gltf.ts"],"names":[],"mappings":"AAIA,OAAO,EAAC,MAAM,EAAyB,MAAM,eAAe,CAAC;AAC7D,OAAO,EAA8B,SAAS,EAAa,KAAK,UAAU,EAAC,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"parse-gltf.d.ts","sourceRoot":"","sources":["../../src/parsers/parse-gltf.ts"],"names":[],"mappings":"AAIA,OAAO,EAAC,MAAM,EAAyB,MAAM,eAAe,CAAC;AAC7D,OAAO,EAA8B,SAAS,EAAa,KAAK,UAAU,EAAC,MAAM,iBAAiB,CAAC;AACnG,OAAO,EAGL,KAAK,iBAAiB,EACvB,MAAM,kBAAkB,CAAC;AAE1B,OAAO,EAAC,KAAK,cAAc,EAAC,kCAA+B;AAM3D,4FAA4F;AAC5F,MAAM,MAAM,gBAAgB,GAAG;IAC7B,wEAAwE;IACxE,YAAY,CAAC,EAAE,OAAO,CAAC,UAAU,CAAC,CAAC;IACnC,6CAA6C;IAC7C,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,iDAAiD;IACjD,6BAA6B,CAAC,EAAE,cAAc,CAAC;IAC/C,yCAAyC;IACzC,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,4CAA4C;IAC5C,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB,CAAC;AAUF;;;GAGG;AACH,wBAAgB,SAAS,CACvB,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,iBAAiB,EACvB,OAAO,GAAE,gBAAqB,GAC7B;IACD,gDAAgD;IAChD,MAAM,EAAE,SAAS,EAAE,CAAC;IACpB,4DAA4D;IAC5D,mBAAmB,EAAE,GAAG,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IAC5C,gEAAgE;IAChE,sBAAsB,EAAE,GAAG,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IAC/C,4DAA4D;IAC5D,mBAAmB,EAAE,GAAG,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;CAC7C,CAqDA"}
|
|
@@ -2,7 +2,6 @@
|
|
|
2
2
|
// SPDX-License-Identifier: MIT
|
|
3
3
|
// Copyright (c) vis.gl contributors
|
|
4
4
|
import { Geometry, GroupNode } from '@luma.gl/engine';
|
|
5
|
-
import { Matrix4 } from '@math.gl/core';
|
|
6
5
|
import { convertGLDrawModeToTopology } from "../webgl-to-webgpu/convert-webgl-topology.js";
|
|
7
6
|
import { createGLTFModel } from "../gltf/create-gltf-model.js";
|
|
8
7
|
import { parsePBRMaterial } from "./parse-pbr-material.js";
|
|
@@ -17,69 +16,76 @@ const defaultOptions = {
|
|
|
17
16
|
* GLTF instantiator for luma.gl
|
|
18
17
|
* Walks the parsed and resolved glTF structure and builds a luma.gl scenegraph
|
|
19
18
|
*/
|
|
20
|
-
export function parseGLTF(device, gltf,
|
|
21
|
-
const
|
|
22
|
-
const
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
const gltfSceneNodes = gltfScene.nodes || [];
|
|
27
|
-
const nodes = gltfSceneNodes.map(node => createNode(device, node, gltfNodes, options));
|
|
28
|
-
const sceneNode = new GroupNode({
|
|
29
|
-
id: gltfScene.name || gltfScene.id,
|
|
30
|
-
children: nodes
|
|
19
|
+
export function parseGLTF(device, gltf, options = {}) {
|
|
20
|
+
const combinedOptions = { ...defaultOptions, ...options };
|
|
21
|
+
const gltfMeshIdToNodeMap = new Map();
|
|
22
|
+
gltf.meshes.forEach((gltfMesh, idx) => {
|
|
23
|
+
const newMesh = createNodeForGLTFMesh(device, gltfMesh, combinedOptions);
|
|
24
|
+
gltfMeshIdToNodeMap.set(gltfMesh.id, newMesh);
|
|
31
25
|
});
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
const
|
|
37
|
-
|
|
38
|
-
|
|
26
|
+
const gltfNodeIndexToNodeMap = new Map();
|
|
27
|
+
const gltfNodeIdToNodeMap = new Map();
|
|
28
|
+
// Step 1/2: Generate a GroupNode for each gltf node. (1:1 mapping).
|
|
29
|
+
gltf.nodes.forEach((gltfNode, idx) => {
|
|
30
|
+
const newNode = createNodeForGLTFNode(device, gltfNode, combinedOptions);
|
|
31
|
+
gltfNodeIndexToNodeMap.set(idx, newNode);
|
|
32
|
+
gltfNodeIdToNodeMap.set(gltfNode.id, newNode);
|
|
33
|
+
});
|
|
34
|
+
// Step 2/2: Go though each gltf node and attach the children.
|
|
35
|
+
// This guarantees that each gltf node will have exactly one luma GroupNode.
|
|
36
|
+
gltf.nodes.forEach((gltfNode, idx) => {
|
|
37
|
+
gltfNodeIndexToNodeMap.get(idx).add((gltfNode.children ?? []).map(({ id }) => {
|
|
38
|
+
const child = gltfNodeIdToNodeMap.get(id);
|
|
39
|
+
if (!child)
|
|
40
|
+
throw new Error(`Cannot find child ${id} of node ${idx}`);
|
|
41
|
+
return child;
|
|
42
|
+
}));
|
|
43
|
+
// Nodes can have children nodes and one optional child mesh at the same time.
|
|
39
44
|
if (gltfNode.mesh) {
|
|
40
|
-
|
|
45
|
+
const mesh = gltfMeshIdToNodeMap.get(gltfNode.mesh.id);
|
|
46
|
+
if (!mesh) {
|
|
47
|
+
throw new Error(`Cannot find mesh child ${gltfNode.mesh.id} of node ${idx}`);
|
|
48
|
+
}
|
|
49
|
+
gltfNodeIndexToNodeMap.get(idx).add(mesh);
|
|
41
50
|
}
|
|
42
|
-
|
|
43
|
-
|
|
51
|
+
});
|
|
52
|
+
const scenes = gltf.scenes.map(gltfScene => {
|
|
53
|
+
const children = (gltfScene.nodes || []).map(({ id }) => {
|
|
54
|
+
const child = gltfNodeIdToNodeMap.get(id);
|
|
55
|
+
if (!child)
|
|
56
|
+
throw new Error(`Cannot find child ${id} of scene ${gltfScene.name || gltfScene.id}`);
|
|
57
|
+
return child;
|
|
58
|
+
});
|
|
59
|
+
return new GroupNode({
|
|
60
|
+
id: gltfScene.name || gltfScene.id,
|
|
44
61
|
children
|
|
45
62
|
});
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
}
|
|
49
|
-
else {
|
|
50
|
-
node.matrix.identity();
|
|
51
|
-
if (gltfNode.translation) {
|
|
52
|
-
node.matrix.translate(gltfNode.translation);
|
|
53
|
-
}
|
|
54
|
-
if (gltfNode.rotation) {
|
|
55
|
-
const rotationMatrix = new Matrix4().fromQuaternion(gltfNode.rotation);
|
|
56
|
-
node.matrix.multiplyRight(rotationMatrix);
|
|
57
|
-
}
|
|
58
|
-
if (gltfNode.scale) {
|
|
59
|
-
node.matrix.scale(gltfNode.scale);
|
|
60
|
-
}
|
|
61
|
-
}
|
|
62
|
-
gltfNode._node = node;
|
|
63
|
-
}
|
|
64
|
-
// Copy _node so that gltf-animator can access
|
|
65
|
-
const topLevelNode = gltfNodes.find(node => node.id === gltfNode.id);
|
|
66
|
-
topLevelNode._node = gltfNode._node;
|
|
67
|
-
return gltfNode._node;
|
|
63
|
+
});
|
|
64
|
+
return { scenes, gltfMeshIdToNodeMap, gltfNodeIdToNodeMap, gltfNodeIndexToNodeMap };
|
|
68
65
|
}
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
66
|
+
/** Creates a `GroupNode` for one glTF node transform. */
|
|
67
|
+
function createNodeForGLTFNode(device, gltfNode, options) {
|
|
68
|
+
return new GroupNode({
|
|
69
|
+
id: gltfNode.name || gltfNode.id,
|
|
70
|
+
children: [],
|
|
71
|
+
matrix: gltfNode.matrix,
|
|
72
|
+
position: gltfNode.translation,
|
|
73
|
+
rotation: gltfNode.rotation,
|
|
74
|
+
scale: gltfNode.scale
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
/** Creates a mesh group node containing one model node per glTF primitive. */
|
|
78
|
+
function createNodeForGLTFMesh(device, gltfMesh, options) {
|
|
79
|
+
const gltfPrimitives = gltfMesh.primitives || [];
|
|
80
|
+
const primitives = gltfPrimitives.map((gltfPrimitive, i) => createNodeForGLTFPrimitive(device, gltfPrimitive, i, gltfMesh, options));
|
|
81
|
+
const mesh = new GroupNode({
|
|
82
|
+
id: gltfMesh.name || gltfMesh.id,
|
|
83
|
+
children: primitives
|
|
84
|
+
});
|
|
85
|
+
return mesh;
|
|
81
86
|
}
|
|
82
|
-
|
|
87
|
+
/** Creates a renderable model node for one glTF primitive. */
|
|
88
|
+
function createNodeForGLTFPrimitive(device, gltfPrimitive, i, gltfMesh, options) {
|
|
83
89
|
const id = gltfPrimitive.name || `${gltfMesh.name || gltfMesh.id}-primitive-${i}`;
|
|
84
90
|
const topology = convertGLDrawModeToTopology(gltfPrimitive.mode || 4);
|
|
85
91
|
const vertexCount = gltfPrimitive.indices
|
|
@@ -99,9 +105,11 @@ function createPrimitive(device, gltfPrimitive, i, gltfMesh, options) {
|
|
|
99
105
|
// modelNode.material = gltfPrimitive.material;
|
|
100
106
|
return modelNode;
|
|
101
107
|
}
|
|
108
|
+
/** Computes the vertex count for a primitive without indices. */
|
|
102
109
|
function getVertexCount(attributes) {
|
|
103
110
|
throw new Error('getVertexCount not implemented');
|
|
104
111
|
}
|
|
112
|
+
/** Converts glTF primitive attributes and indices into a luma.gl `Geometry`. */
|
|
105
113
|
function createGeometry(id, gltfPrimitive, topology) {
|
|
106
114
|
const attributes = {};
|
|
107
115
|
for (const [attributeName, attribute] of Object.entries(gltfPrimitive.attributes)) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"parse-gltf.js","sourceRoot":"","sources":["../../src/parsers/parse-gltf.ts"],"names":[],"mappings":"AAAA,UAAU;AACV,+BAA+B;AAC/B,oCAAoC;AAGpC,OAAO,EAAC,QAAQ,EAAqB,SAAS,EAA6B,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"parse-gltf.js","sourceRoot":"","sources":["../../src/parsers/parse-gltf.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import type { Device } from '@luma.gl/core';
|
|
1
|
+
import type { Device, SamplerProps, TextureFormat, TypedArray } from '@luma.gl/core';
|
|
2
|
+
import { Texture } from '@luma.gl/core';
|
|
2
3
|
import { type ParsedPBRMaterial } from "../pbr/pbr-material.js";
|
|
3
4
|
import { type PBREnvironment } from "../pbr/pbr-environment.js";
|
|
4
5
|
type GLTFTexture = {
|
|
@@ -46,5 +47,49 @@ export type ParsePBRMaterialOptions = {
|
|
|
46
47
|
* Parses a GLTF material definition into uniforms and parameters for the PBR shader module
|
|
47
48
|
*/
|
|
48
49
|
export declare function parsePBRMaterial(device: Device, material: GLTFPBRMaterial, attributes: Record<string, any>, options: ParsePBRMaterialOptions): ParsedPBRMaterial;
|
|
50
|
+
/** One mip level as produced by loaders.gl compressed texture parsers */
|
|
51
|
+
export type CompressedMipLevel = {
|
|
52
|
+
data: TypedArray;
|
|
53
|
+
width: number;
|
|
54
|
+
height: number;
|
|
55
|
+
textureFormat?: TextureFormat;
|
|
56
|
+
};
|
|
57
|
+
/**
|
|
58
|
+
* Compressed image from current loaders.gl releases.
|
|
59
|
+
* - `mipmaps` is a boolean (true), NOT an array
|
|
60
|
+
* - `data` is an Array of TextureLevel-like objects
|
|
61
|
+
* - Per-level `textureFormat` is already a luma.gl TextureFormat
|
|
62
|
+
* - Top-level `width`/`height` may be undefined
|
|
63
|
+
*/
|
|
64
|
+
export type CompressedImageDataArray = {
|
|
65
|
+
compressed: true;
|
|
66
|
+
mipmaps?: boolean;
|
|
67
|
+
width?: number;
|
|
68
|
+
height?: number;
|
|
69
|
+
data: CompressedMipLevel[];
|
|
70
|
+
};
|
|
71
|
+
/**
|
|
72
|
+
* Hypothetical future format where `mipmaps` is an actual array.
|
|
73
|
+
* Kept for forward compatibility.
|
|
74
|
+
*/
|
|
75
|
+
export type CompressedImageMipmapArray = {
|
|
76
|
+
compressed: true;
|
|
77
|
+
width?: number;
|
|
78
|
+
height?: number;
|
|
79
|
+
mipmaps: CompressedMipLevel[];
|
|
80
|
+
};
|
|
81
|
+
/** Union of all known loaders.gl compressed image shapes */
|
|
82
|
+
export type CompressedImage = CompressedImageDataArray | CompressedImageMipmapArray;
|
|
83
|
+
/**
|
|
84
|
+
* Create a texture from compressed image data produced by loaders.gl.
|
|
85
|
+
* Handles current loaders.gl compressed image layouts:
|
|
86
|
+
*
|
|
87
|
+
* current: {compressed, mipmaps: true, data: [{data, width, height, textureFormat}, ...]}
|
|
88
|
+
* forward: {compressed, mipmaps: [{data, width, height, textureFormat}, ...]}
|
|
89
|
+
*/
|
|
90
|
+
export declare function createCompressedTexture(device: Device, image: CompressedImage, baseOptions: {
|
|
91
|
+
id: string;
|
|
92
|
+
sampler: SamplerProps;
|
|
93
|
+
}): Texture;
|
|
49
94
|
export {};
|
|
50
95
|
//# sourceMappingURL=parse-pbr-material.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"parse-pbr-material.d.ts","sourceRoot":"","sources":["../../src/parsers/parse-pbr-material.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAC,MAAM,
|
|
1
|
+
{"version":3,"file":"parse-pbr-material.d.ts","sourceRoot":"","sources":["../../src/parsers/parse-pbr-material.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
// luma.gl
|
|
2
2
|
// SPDX-License-Identifier: MIT
|
|
3
3
|
// Copyright (c) vis.gl contributors
|
|
4
|
+
import { Texture, log, textureFormatDecoder } from '@luma.gl/core';
|
|
4
5
|
import { GL } from '@luma.gl/constants';
|
|
5
|
-
import { log } from '@luma.gl/core';
|
|
6
6
|
import { convertSampler } from "../webgl-to-webgpu/convert-webgl-sampler.js";
|
|
7
7
|
/**
|
|
8
8
|
* Parses a GLTF material definition into uniforms and parameters for the PBR shader module
|
|
@@ -47,6 +47,8 @@ export function parsePBRMaterial(device, material, attributes, options) {
|
|
|
47
47
|
parsedMaterial.defines['HAS_TANGENTS'] = true;
|
|
48
48
|
if (attributes['TEXCOORD_0'])
|
|
49
49
|
parsedMaterial.defines['HAS_UV'] = true;
|
|
50
|
+
if (attributes['JOINTS_0'] && attributes['WEIGHTS_0'])
|
|
51
|
+
parsedMaterial.defines['HAS_SKIN'] = true;
|
|
50
52
|
if (attributes['COLOR_0'])
|
|
51
53
|
parsedMaterial.defines['HAS_COLORS'] = true;
|
|
52
54
|
if (options?.imageBasedLightingEnvironment)
|
|
@@ -122,14 +124,6 @@ function parsePbrMetallicRoughness(device, pbrMetallicRoughness, parsedMaterial)
|
|
|
122
124
|
/** Create a texture from a glTF texture/sampler/image combo and add it to bindings */
|
|
123
125
|
function addTexture(device, gltfTexture, uniformName, define, parsedMaterial) {
|
|
124
126
|
const image = gltfTexture.texture.source.image;
|
|
125
|
-
let textureOptions;
|
|
126
|
-
if (image.compressed) {
|
|
127
|
-
textureOptions = image;
|
|
128
|
-
}
|
|
129
|
-
else {
|
|
130
|
-
// Texture2D accepts a promise that returns an image as data (Async Textures)
|
|
131
|
-
textureOptions = { data: image };
|
|
132
|
-
}
|
|
133
127
|
const gltfSampler = {
|
|
134
128
|
wrapS: 10497, // default REPEAT S (U) wrapping mode.
|
|
135
129
|
wrapT: 10497, // default REPEAT T (V) wrapping mode.
|
|
@@ -137,16 +131,146 @@ function addTexture(device, gltfTexture, uniformName, define, parsedMaterial) {
|
|
|
137
131
|
magFilter: 9729, // default LINEAR filtering
|
|
138
132
|
...gltfTexture?.texture?.sampler
|
|
139
133
|
};
|
|
140
|
-
const
|
|
134
|
+
const baseOptions = {
|
|
141
135
|
id: gltfTexture.uniformName || gltfTexture.id,
|
|
142
|
-
sampler: convertSampler(gltfSampler)
|
|
143
|
-
|
|
144
|
-
|
|
136
|
+
sampler: convertSampler(gltfSampler)
|
|
137
|
+
};
|
|
138
|
+
let texture;
|
|
139
|
+
if (image.compressed) {
|
|
140
|
+
texture = createCompressedTexture(device, image, baseOptions);
|
|
141
|
+
}
|
|
142
|
+
else {
|
|
143
|
+
const { width, height } = device.getExternalImageSize(image);
|
|
144
|
+
texture = device.createTexture({
|
|
145
|
+
...baseOptions,
|
|
146
|
+
width,
|
|
147
|
+
height,
|
|
148
|
+
data: image
|
|
149
|
+
});
|
|
150
|
+
}
|
|
145
151
|
parsedMaterial.bindings[uniformName] = texture;
|
|
146
152
|
if (define)
|
|
147
153
|
parsedMaterial.defines[define] = true;
|
|
148
154
|
parsedMaterial.generatedTextures.push(texture);
|
|
149
155
|
}
|
|
156
|
+
function createCompressedTextureFallback(device, baseOptions) {
|
|
157
|
+
return device.createTexture({
|
|
158
|
+
...baseOptions,
|
|
159
|
+
format: 'rgba8unorm',
|
|
160
|
+
width: 1,
|
|
161
|
+
height: 1,
|
|
162
|
+
mipLevels: 1
|
|
163
|
+
});
|
|
164
|
+
}
|
|
165
|
+
function resolveCompressedTextureFormat(level) {
|
|
166
|
+
return level.textureFormat;
|
|
167
|
+
}
|
|
168
|
+
/**
|
|
169
|
+
* Maximum mip levels that can be filled for a compressed texture.
|
|
170
|
+
* texStorage2D allocates level i at (baseW >> i) × (baseH >> i).
|
|
171
|
+
* Compressed formats can't upload data for levels smaller than one block,
|
|
172
|
+
* so we stop before either dimension drops below the block size.
|
|
173
|
+
*/
|
|
174
|
+
function getMaxCompressedMipLevels(baseWidth, baseHeight, format) {
|
|
175
|
+
const { blockWidth = 1, blockHeight = 1 } = textureFormatDecoder.getInfo(format);
|
|
176
|
+
let count = 1;
|
|
177
|
+
for (let i = 1;; i++) {
|
|
178
|
+
const w = Math.max(1, baseWidth >> i);
|
|
179
|
+
const h = Math.max(1, baseHeight >> i);
|
|
180
|
+
if (w < blockWidth || h < blockHeight)
|
|
181
|
+
break;
|
|
182
|
+
count++;
|
|
183
|
+
}
|
|
184
|
+
return count;
|
|
185
|
+
}
|
|
186
|
+
/**
|
|
187
|
+
* Create a texture from compressed image data produced by loaders.gl.
|
|
188
|
+
* Handles current loaders.gl compressed image layouts:
|
|
189
|
+
*
|
|
190
|
+
* current: {compressed, mipmaps: true, data: [{data, width, height, textureFormat}, ...]}
|
|
191
|
+
* forward: {compressed, mipmaps: [{data, width, height, textureFormat}, ...]}
|
|
192
|
+
*/
|
|
193
|
+
export function createCompressedTexture(device, image, baseOptions) {
|
|
194
|
+
// Normalize mip levels from all known loaders.gl formats
|
|
195
|
+
let levels;
|
|
196
|
+
if (Array.isArray(image.data) && image.data[0]?.data) {
|
|
197
|
+
// loaders.gl current format: image.data is Array of mip-level objects
|
|
198
|
+
levels = image.data;
|
|
199
|
+
}
|
|
200
|
+
else if ('mipmaps' in image && Array.isArray(image.mipmaps)) {
|
|
201
|
+
// Hypothetical future format: image.mipmaps is an Array
|
|
202
|
+
levels = image.mipmaps;
|
|
203
|
+
}
|
|
204
|
+
else {
|
|
205
|
+
levels = [];
|
|
206
|
+
}
|
|
207
|
+
if (levels.length === 0 || !levels[0]?.data) {
|
|
208
|
+
log.warn('createCompressedTexture: compressed image has no valid mip levels, creating fallback')();
|
|
209
|
+
return createCompressedTextureFallback(device, baseOptions);
|
|
210
|
+
}
|
|
211
|
+
const baseLevel = levels[0];
|
|
212
|
+
const baseWidth = baseLevel.width ?? image.width ?? 0;
|
|
213
|
+
const baseHeight = baseLevel.height ?? image.height ?? 0;
|
|
214
|
+
if (baseWidth <= 0 || baseHeight <= 0) {
|
|
215
|
+
log.warn('createCompressedTexture: base level has invalid dimensions, creating fallback')();
|
|
216
|
+
return createCompressedTextureFallback(device, baseOptions);
|
|
217
|
+
}
|
|
218
|
+
const format = resolveCompressedTextureFormat(baseLevel);
|
|
219
|
+
if (!format) {
|
|
220
|
+
log.warn('createCompressedTexture: compressed image has no textureFormat, creating fallback')();
|
|
221
|
+
return createCompressedTextureFallback(device, baseOptions);
|
|
222
|
+
}
|
|
223
|
+
// Validate mip levels: truncate chain at first invalid level.
|
|
224
|
+
// Levels must be contiguous, so we stop at the first level that has
|
|
225
|
+
// a format mismatch, missing data, non-positive dimensions, or
|
|
226
|
+
// dimensions that don't match what texStorage2D will allocate.
|
|
227
|
+
//
|
|
228
|
+
// For block-compressed formats (ASTC, BC, ETC2), texStorage2D allocates
|
|
229
|
+
// mip levels down to 1×1 texels, but compressed data can't be smaller
|
|
230
|
+
// than one block (e.g. 4×4 for ASTC-4x4). Cap the chain so we never
|
|
231
|
+
// try to upload data whose block-aligned size exceeds the allocated level.
|
|
232
|
+
const maxMipLevels = getMaxCompressedMipLevels(baseWidth, baseHeight, format);
|
|
233
|
+
const levelLimit = Math.min(levels.length, maxMipLevels);
|
|
234
|
+
let validLevelCount = 1;
|
|
235
|
+
for (let i = 1; i < levelLimit; i++) {
|
|
236
|
+
const level = levels[i];
|
|
237
|
+
if (!level.data || level.width <= 0 || level.height <= 0) {
|
|
238
|
+
log.warn(`createCompressedTexture: mip level ${i} has invalid data/dimensions, truncating`)();
|
|
239
|
+
break;
|
|
240
|
+
}
|
|
241
|
+
const levelFormat = resolveCompressedTextureFormat(level);
|
|
242
|
+
if (levelFormat && levelFormat !== format) {
|
|
243
|
+
log.warn(`createCompressedTexture: mip level ${i} format '${levelFormat}' differs from base '${format}', truncating`)();
|
|
244
|
+
break;
|
|
245
|
+
}
|
|
246
|
+
const expectedW = Math.max(1, baseWidth >> i);
|
|
247
|
+
const expectedH = Math.max(1, baseHeight >> i);
|
|
248
|
+
if (level.width !== expectedW || level.height !== expectedH) {
|
|
249
|
+
log.warn(`createCompressedTexture: mip level ${i} dimensions ${level.width}x${level.height} ` +
|
|
250
|
+
`don't match expected ${expectedW}x${expectedH}, truncating`)();
|
|
251
|
+
break;
|
|
252
|
+
}
|
|
253
|
+
validLevelCount++;
|
|
254
|
+
}
|
|
255
|
+
const texture = device.createTexture({
|
|
256
|
+
...baseOptions,
|
|
257
|
+
format,
|
|
258
|
+
usage: Texture.TEXTURE | Texture.COPY_DST,
|
|
259
|
+
width: baseWidth,
|
|
260
|
+
height: baseHeight,
|
|
261
|
+
mipLevels: validLevelCount,
|
|
262
|
+
data: baseLevel.data
|
|
263
|
+
});
|
|
264
|
+
// Upload additional validated mip levels
|
|
265
|
+
for (let i = 1; i < validLevelCount; i++) {
|
|
266
|
+
texture.writeData(levels[i].data, {
|
|
267
|
+
width: levels[i].width,
|
|
268
|
+
height: levels[i].height,
|
|
269
|
+
mipLevel: i
|
|
270
|
+
});
|
|
271
|
+
}
|
|
272
|
+
return texture;
|
|
273
|
+
}
|
|
150
274
|
/*
|
|
151
275
|
/**
|
|
152
276
|
* Parses a GLTF material definition into uniforms and parameters for the PBR shader module
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"parse-pbr-material.js","sourceRoot":"","sources":["../../src/parsers/parse-pbr-material.ts"],"names":[],"mappings":"AAAA,UAAU;AACV,+BAA+B;AAC/B,oCAAoC;
|
|
1
|
+
{"version":3,"file":"parse-pbr-material.js","sourceRoot":"","sources":["../../src/parsers/parse-pbr-material.ts"],"names":[],"mappings":"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"}
|
|
@@ -4,12 +4,18 @@ import { DynamicTexture } from '@luma.gl/engine';
|
|
|
4
4
|
export type PBREnvironment = {
|
|
5
5
|
/** Bi-directional Reflectance Distribution Function (BRDF) lookup table */
|
|
6
6
|
brdfLutTexture: DynamicTexture;
|
|
7
|
+
/** Diffuse irradiance cubemap. */
|
|
7
8
|
diffuseEnvSampler: DynamicTexture;
|
|
9
|
+
/** Specular reflection cubemap with mip chain. */
|
|
8
10
|
specularEnvSampler: DynamicTexture;
|
|
9
11
|
};
|
|
12
|
+
/** Configuration used to load an image-based lighting environment. */
|
|
10
13
|
export type PBREnvironmentProps = {
|
|
14
|
+
/** URL of the BRDF lookup texture. */
|
|
11
15
|
brdfLutUrl: string;
|
|
16
|
+
/** Callback that returns the URL for a diffuse or specular cubemap face and mip level. */
|
|
12
17
|
getTexUrl: (name: string, dir: number, level: number) => string;
|
|
18
|
+
/** Number of mip levels in the specular environment map. */
|
|
13
19
|
specularMipLevels?: number;
|
|
14
20
|
};
|
|
15
21
|
/** Loads textures for PBR environment */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pbr-environment.d.ts","sourceRoot":"","sources":["../../src/pbr/pbr-environment.ts"],"names":[],"mappings":"AAIA,OAAO,EAAC,MAAM,EAAe,MAAM,eAAe,CAAC;AACnD,OAAO,EAAC,cAAc,EAAC,MAAM,iBAAiB,CAAC;AAG/C,0CAA0C;AAC1C,MAAM,MAAM,cAAc,GAAG;IAC3B,2EAA2E;IAC3E,cAAc,EAAE,cAAc,CAAC;IAC/B,iBAAiB,EAAE,cAAc,CAAC;IAClC,kBAAkB,EAAE,cAAc,CAAC;CACpC,CAAC;AAEF,MAAM,MAAM,mBAAmB,GAAG;IAChC,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,MAAM,CAAC;IAChE,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B,CAAC;AAEF,yCAAyC;AACzC,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,mBAAmB,GAAG,cAAc,CA+C7F"}
|
|
1
|
+
{"version":3,"file":"pbr-environment.d.ts","sourceRoot":"","sources":["../../src/pbr/pbr-environment.ts"],"names":[],"mappings":"AAIA,OAAO,EAAC,MAAM,EAAe,MAAM,eAAe,CAAC;AACnD,OAAO,EAAC,cAAc,EAAC,MAAM,iBAAiB,CAAC;AAG/C,0CAA0C;AAC1C,MAAM,MAAM,cAAc,GAAG;IAC3B,2EAA2E;IAC3E,cAAc,EAAE,cAAc,CAAC;IAC/B,kCAAkC;IAClC,iBAAiB,EAAE,cAAc,CAAC;IAClC,kDAAkD;IAClD,kBAAkB,EAAE,cAAc,CAAC;CACpC,CAAC;AAEF,sEAAsE;AACtE,MAAM,MAAM,mBAAmB,GAAG;IAChC,sCAAsC;IACtC,UAAU,EAAE,MAAM,CAAC;IACnB,0FAA0F;IAC1F,SAAS,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,MAAM,CAAC;IAChE,4DAA4D;IAC5D,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B,CAAC;AAEF,yCAAyC;AACzC,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,mBAAmB,GAAG,cAAc,CA+C7F"}
|
|
@@ -51,6 +51,7 @@ export function loadPBREnvironment(device, props) {
|
|
|
51
51
|
}
|
|
52
52
|
// TODO put somewhere common
|
|
53
53
|
const FACES = [0, 1, 2, 3, 4, 5];
|
|
54
|
+
/** Construction props for an asynchronously loaded cubemap. */
|
|
54
55
|
function makeCube(device, { id, getTextureForFace, sampler }) {
|
|
55
56
|
const data = {};
|
|
56
57
|
FACES.forEach(face => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pbr-environment.js","sourceRoot":"","sources":["../../src/pbr/pbr-environment.ts"],"names":[],"mappings":"AAAA,UAAU;AACV,+BAA+B;AAC/B,oCAAoC;AAGpC,OAAO,EAAC,cAAc,EAAC,MAAM,iBAAiB,CAAC;AAC/C,OAAO,EAAC,gBAAgB,EAAC,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"pbr-environment.js","sourceRoot":"","sources":["../../src/pbr/pbr-environment.ts"],"names":[],"mappings":"AAAA,UAAU;AACV,+BAA+B;AAC/B,oCAAoC;AAGpC,OAAO,EAAC,cAAc,EAAC,MAAM,iBAAiB,CAAC;AAC/C,OAAO,EAAC,gBAAgB,EAAC,MAAM,sBAAsB,CAAC;AAsBtD,yCAAyC;AACzC,MAAM,UAAU,kBAAkB,CAAC,MAAc,EAAE,KAA0B;IAC3E,MAAM,cAAc,GAAG,IAAI,cAAc,CAAC,MAAM,EAAE;QAChD,EAAE,EAAE,SAAS;QACb,OAAO,EAAE;YACP,YAAY,EAAE,eAAe;YAC7B,YAAY,EAAE,eAAe;YAC7B,SAAS,EAAE,QAAQ;YACnB,SAAS,EAAE,QAAQ;SACY;QACjC,2EAA2E;QAC3E,IAAI,EAAE,gBAAgB,CAAC,KAAK,CAAC,UAAU,CAAC;KACzC,CAAC,CAAC;IAEH,MAAM,iBAAiB,GAAG,QAAQ,CAAC,MAAM,EAAE;QACzC,EAAE,EAAE,mBAAmB;QACvB,iBAAiB,EAAE,GAAG,CAAC,EAAE,CAAC,gBAAgB,CAAC,KAAK,CAAC,SAAS,CAAC,SAAS,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC;QAC9E,OAAO,EAAE;YACP,YAAY,EAAE,eAAe;YAC7B,YAAY,EAAE,eAAe;YAC7B,SAAS,EAAE,QAAQ;YACnB,SAAS,EAAE,QAAQ;SACY;KAClC,CAAC,CAAC;IAEH,MAAM,kBAAkB,GAAG,QAAQ,CAAC,MAAM,EAAE;QAC1C,EAAE,EAAE,oBAAoB;QACxB,iBAAiB,EAAE,CAAC,GAAW,EAAE,EAAE;YACjC,MAAM,UAAU,GAAmB,EAAE,CAAC;YACtC,aAAa;YACb,KAAK,IAAI,GAAG,GAAG,CAAC,EAAE,GAAG,IAAI,KAAK,CAAC,iBAAiB,GAAG,CAAC,EAAE,GAAG,EAAE,EAAE,CAAC;gBAC5D,UAAU,CAAC,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC,SAAS,CAAC,UAAU,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC;YAC3E,CAAC;YACD,OAAO,UAAU,CAAC;QACpB,CAAC;QACD,OAAO,EAAE;YACP,YAAY,EAAE,eAAe;YAC7B,YAAY,EAAE,eAAe;YAC7B,SAAS,EAAE,QAAQ,EAAE,oDAAoD;YACzE,SAAS,EAAE,QAAQ;SACY;KAClC,CAAC,CAAC;IAEH,OAAO;QACL,cAAc;QACd,iBAAiB;QACjB,kBAAkB;KACnB,CAAC;AACJ,CAAC;AAED,4BAA4B;AAC5B,MAAM,KAAK,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;AAEjC,+DAA+D;AAC/D,SAAS,QAAQ,CACf,MAAc,EACd,EACE,EAAE,EACF,iBAAiB,EACjB,OAAO,EAQR;IAED,MAAM,IAAI,GAAG,EAAE,CAAC;IAChB,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE;QACnB,kBAAkB;QAClB,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,GAAG,iBAAiB,CAAC,IAAI,CAAC,CAAC;IAC/C,CAAC,CAAC,CAAC;IACH,OAAO,IAAI,cAAc,CAAC,MAAM,EAAE;QAChC,EAAE;QACF,SAAS,EAAE,MAAM;QACjB,OAAO,EAAE,KAAK;QACd,OAAO;QACP,mBAAmB;QACnB,IAAI;KACL,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -1,9 +1,14 @@
|
|
|
1
1
|
import type { Texture, Parameters } from '@luma.gl/core';
|
|
2
2
|
import { PBRMaterialBindings, PBRMaterialUniforms, PBRProjectionProps } from '@luma.gl/shadertools';
|
|
3
|
+
/** Material state extracted from a glTF primitive for consumption by the PBR shader module. */
|
|
3
4
|
export type ParsedPBRMaterial = {
|
|
5
|
+
/** Shader defines inferred from geometry and material features. */
|
|
4
6
|
readonly defines: Record<string, boolean>;
|
|
7
|
+
/** Texture and sampler bindings for the PBR shader module. */
|
|
5
8
|
readonly bindings: Partial<PBRMaterialBindings>;
|
|
9
|
+
/** Uniform values for the projection and PBR shader modules. */
|
|
6
10
|
readonly uniforms: Partial<PBRProjectionProps & PBRMaterialUniforms>;
|
|
11
|
+
/** Render pipeline parameters derived from the glTF material. */
|
|
7
12
|
readonly parameters: Parameters;
|
|
8
13
|
/** @deprecated Use parameters */
|
|
9
14
|
readonly glParameters: Record<string, any>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pbr-material.d.ts","sourceRoot":"","sources":["../../src/pbr/pbr-material.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,OAAO,EAAE,UAAU,EAAC,MAAM,eAAe,CAAC;AACvD,OAAO,EAAC,mBAAmB,EAAE,mBAAmB,EAAE,kBAAkB,EAAC,MAAM,sBAAsB,CAAC;AAElG,MAAM,MAAM,iBAAiB,GAAG;IAC9B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC1C,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,mBAAmB,CAAC,CAAC;IAChD,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,kBAAkB,GAAG,mBAAmB,CAAC,CAAC;IACrE,QAAQ,CAAC,UAAU,EAAE,UAAU,CAAC;IAChC,iCAAiC;IACjC,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC3C,0EAA0E;IAC1E,QAAQ,CAAC,iBAAiB,EAAE,OAAO,EAAE,CAAC;CACvC,CAAC"}
|
|
1
|
+
{"version":3,"file":"pbr-material.d.ts","sourceRoot":"","sources":["../../src/pbr/pbr-material.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,OAAO,EAAE,UAAU,EAAC,MAAM,eAAe,CAAC;AACvD,OAAO,EAAC,mBAAmB,EAAE,mBAAmB,EAAE,kBAAkB,EAAC,MAAM,sBAAsB,CAAC;AAElG,+FAA+F;AAC/F,MAAM,MAAM,iBAAiB,GAAG;IAC9B,mEAAmE;IACnE,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC1C,8DAA8D;IAC9D,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,mBAAmB,CAAC,CAAC;IAChD,gEAAgE;IAChE,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,kBAAkB,GAAG,mBAAmB,CAAC,CAAC;IACrE,iEAAiE;IACjE,QAAQ,CAAC,UAAU,EAAE,UAAU,CAAC;IAChC,iCAAiC;IACjC,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC3C,0EAA0E;IAC1E,QAAQ,CAAC,iBAAiB,EAAE,OAAO,EAAE,CAAC;CACvC,CAAC"}
|
|
@@ -1,20 +1,31 @@
|
|
|
1
1
|
import type { TypedArray } from '@math.gl/types';
|
|
2
|
+
/** Maps glTF accessor type strings to their component counts. */
|
|
2
3
|
export declare const ATTRIBUTE_TYPE_TO_COMPONENTS: Record<string, number>;
|
|
4
|
+
/** Maps glTF accessor component-type enums to typed-array constructors. */
|
|
3
5
|
export declare const ATTRIBUTE_COMPONENT_TYPE_TO_ARRAY: Record<number, any>;
|
|
6
|
+
/** Minimal accessor shape required to materialize a typed array. */
|
|
4
7
|
type GLTFAccessor = {
|
|
8
|
+
/** Numeric component type enum. */
|
|
5
9
|
componentType: number;
|
|
10
|
+
/** Accessor type string such as `VEC3` or `SCALAR`. */
|
|
6
11
|
type: string;
|
|
12
|
+
/** Number of logical elements in the accessor. */
|
|
7
13
|
count: number;
|
|
14
|
+
/** Buffer view carrying the raw bytes. */
|
|
8
15
|
bufferView?: {
|
|
9
16
|
data: {
|
|
10
|
-
buffer:
|
|
17
|
+
buffer: ArrayBufferLike;
|
|
11
18
|
byteOffset?: number;
|
|
12
19
|
};
|
|
13
20
|
};
|
|
21
|
+
/** Byte offset into the buffer view. */
|
|
14
22
|
byteOffset?: number;
|
|
15
23
|
};
|
|
24
|
+
/** Converts a glTF accessor into a typed array plus its component count. */
|
|
16
25
|
export declare function accessorToTypedArray(accessor: GLTFAccessor): {
|
|
26
|
+
/** Typed array view over the accessor data. */
|
|
17
27
|
typedArray: TypedArray;
|
|
28
|
+
/** Number of scalar components per element. */
|
|
18
29
|
components: number;
|
|
19
30
|
};
|
|
20
31
|
export {};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"convert-webgl-attribute.d.ts","sourceRoot":"","sources":["../../src/webgl-to-webgpu/convert-webgl-attribute.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAC,UAAU,EAAC,MAAM,gBAAgB,CAAC;AAE/C,eAAO,MAAM,4BAA4B,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAQ/D,CAAC;AAEF,eAAO,MAAM,iCAAiC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAOjE,CAAC;AAEF,KAAK,YAAY,GAAG;IAClB,aAAa,EAAE,MAAM,CAAC;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,CAAC,EAAE;QAAC,IAAI,EAAE;YAAC,MAAM,EAAE,
|
|
1
|
+
{"version":3,"file":"convert-webgl-attribute.d.ts","sourceRoot":"","sources":["../../src/webgl-to-webgpu/convert-webgl-attribute.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAC,UAAU,EAAC,MAAM,gBAAgB,CAAC;AAE/C,iEAAiE;AACjE,eAAO,MAAM,4BAA4B,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAQ/D,CAAC;AAEF,2EAA2E;AAC3E,eAAO,MAAM,iCAAiC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAOjE,CAAC;AAEF,oEAAoE;AACpE,KAAK,YAAY,GAAG;IAClB,mCAAmC;IACnC,aAAa,EAAE,MAAM,CAAC;IACtB,uDAAuD;IACvD,IAAI,EAAE,MAAM,CAAC;IACb,kDAAkD;IAClD,KAAK,EAAE,MAAM,CAAC;IACd,0CAA0C;IAC1C,UAAU,CAAC,EAAE;QAAC,IAAI,EAAE;YAAC,MAAM,EAAE,eAAe,CAAC;YAAC,UAAU,CAAC,EAAE,MAAM,CAAA;SAAC,CAAA;KAAC,CAAC;IACpE,wCAAwC;IACxC,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB,CAAC;AAEF,4EAA4E;AAC5E,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,YAAY,GAAG;IAC5D,+CAA+C;IAC/C,UAAU,EAAE,UAAU,CAAC;IACvB,+CAA+C;IAC/C,UAAU,EAAE,MAAM,CAAC;CACpB,CASA"}
|