@luma.gl/gltf 9.1.0-alpha.9 → 9.1.0-beta.11
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/dist.dev.js +68 -596
- package/dist/dist.min.js +5 -457
- package/dist/gltf/create-gltf-model.d.ts.map +1 -1
- package/dist/gltf/create-gltf-model.js +12 -6
- package/dist/gltf/create-gltf-model.js.map +1 -0
- package/dist/gltf/create-gltf-objects.js +1 -0
- package/dist/gltf/create-gltf-objects.js.map +1 -0
- package/dist/gltf/gl-utils.d.ts.map +1 -1
- package/dist/gltf/gl-utils.js +2 -0
- package/dist/gltf/gl-utils.js.map +1 -0
- package/dist/gltf/gltf-animator.js +1 -0
- package/dist/gltf/gltf-animator.js.map +1 -0
- package/dist/gltf/gltf-instantiator.d.ts.map +1 -1
- package/dist/gltf/gltf-instantiator.js +26 -2
- package/dist/gltf/gltf-instantiator.js.map +1 -0
- package/dist/index.cjs +50 -27
- package/dist/index.cjs.map +3 -3
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -0
- package/dist/pbr/parse-pbr-material.d.ts +4 -3
- package/dist/pbr/parse-pbr-material.d.ts.map +1 -1
- package/dist/pbr/parse-pbr-material.js +42 -40
- package/dist/pbr/parse-pbr-material.js.map +1 -0
- package/dist/pbr/pbr-environment.js +1 -0
- package/dist/pbr/pbr-environment.js.map +1 -0
- package/package.json +6 -6
- package/src/gltf/create-gltf-model.ts +13 -6
- package/src/gltf/gl-utils.ts +1 -0
- package/src/gltf/gltf-instantiator.ts +29 -2
- package/src/pbr/parse-pbr-material.ts +51 -43
|
@@ -1,5 +1,6 @@
|
|
|
1
|
-
import type { Device, Texture,
|
|
1
|
+
import type { Device, Texture, Parameters } from '@luma.gl/core';
|
|
2
2
|
import { PBREnvironment } from "./pbr-environment.js";
|
|
3
|
+
import { PBRMaterialBindings, PBRMaterialUniforms, PBRProjectionProps } from '@luma.gl/shadertools';
|
|
3
4
|
export type ParsePBRMaterialOptions = {
|
|
4
5
|
/** Debug PBR shader */
|
|
5
6
|
pbrDebug?: boolean;
|
|
@@ -12,8 +13,8 @@ export type ParsePBRMaterialOptions = {
|
|
|
12
13
|
};
|
|
13
14
|
export type ParsedPBRMaterial = {
|
|
14
15
|
readonly defines: Record<string, number | boolean>;
|
|
15
|
-
readonly bindings:
|
|
16
|
-
readonly uniforms:
|
|
16
|
+
readonly bindings: Partial<PBRMaterialBindings>;
|
|
17
|
+
readonly uniforms: Partial<PBRProjectionProps & PBRMaterialUniforms>;
|
|
17
18
|
readonly parameters: Parameters;
|
|
18
19
|
readonly glParameters: Record<string, any>;
|
|
19
20
|
/** List of all generated textures, makes it easy to destroy them later */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"parse-pbr-material.d.ts","sourceRoot":"","sources":["../../src/pbr/parse-pbr-material.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,MAAM,EAAE,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"parse-pbr-material.d.ts","sourceRoot":"","sources":["../../src/pbr/parse-pbr-material.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,MAAM,EAAE,OAAO,EAAE,UAAU,EAAC,MAAM,eAAe,CAAC;AAE/D,OAAO,EAAC,cAAc,EAAC,6BAA0B;AACjD,OAAO,EAAC,mBAAmB,EAAE,mBAAmB,EAAE,kBAAkB,EAAC,MAAM,sBAAsB,CAAC;AAIlG,MAAM,MAAM,uBAAuB,GAAG;IACpC,uBAAuB;IACvB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,oBAAoB;IACpB,MAAM,CAAC,EAAE,GAAG,CAAC;IACb,mBAAmB;IACnB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,iEAAiE;IACjE,6BAA6B,CAAC,EAAE,cAAc,CAAC;CAChD,CAAC;AAEF,MAAM,MAAM,iBAAiB,GAAG;IAC9B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC;IACnD,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,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC3C,0EAA0E;IAC1E,QAAQ,CAAC,iBAAiB,EAAE,OAAO,EAAE,CAAC;CACvC,CAAC;AAiBF;;GAEG;AACH,wBAAgB,gBAAgB,CAC9B,MAAM,EAAE,MAAM,EACd,QAAQ,KAAA,EACR,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAC/B,OAAO,EAAE,uBAAuB,GAC/B,iBAAiB,CAmDnB"}
|
|
@@ -2,6 +2,7 @@ import { log } from '@luma.gl/core';
|
|
|
2
2
|
// NOTE: Modules other than `@luma.gl/webgl` should not import `GL` from
|
|
3
3
|
// `@luma.gl/constants`. Locally we use `GLEnum` instead of `GL` to avoid
|
|
4
4
|
// conflicts with the `babel-plugin-inline-webgl-constants` plugin.
|
|
5
|
+
// eslint-disable-next-line no-shadow
|
|
5
6
|
var GLEnum;
|
|
6
7
|
(function (GLEnum) {
|
|
7
8
|
GLEnum[GLEnum["FUNC_ADD"] = 32774] = "FUNC_ADD";
|
|
@@ -26,8 +27,8 @@ export function parsePBRMaterial(device, material, attributes, options) {
|
|
|
26
27
|
bindings: {},
|
|
27
28
|
uniforms: {
|
|
28
29
|
// TODO: find better values?
|
|
29
|
-
|
|
30
|
-
|
|
30
|
+
camera: [0, 0, 0], // Model should override
|
|
31
|
+
metallicRoughnessValues: [1, 1] // Default is 1 and 1
|
|
31
32
|
},
|
|
32
33
|
parameters: {},
|
|
33
34
|
glParameters: {},
|
|
@@ -37,18 +38,18 @@ export function parsePBRMaterial(device, material, attributes, options) {
|
|
|
37
38
|
parsedMaterial.defines.USE_TEX_LOD = 1;
|
|
38
39
|
const { imageBasedLightingEnvironment } = options;
|
|
39
40
|
if (imageBasedLightingEnvironment) {
|
|
40
|
-
parsedMaterial.bindings.
|
|
41
|
+
parsedMaterial.bindings.pbr_diffuseEnvSampler =
|
|
41
42
|
imageBasedLightingEnvironment.diffuseEnvSampler.texture;
|
|
42
|
-
parsedMaterial.bindings.
|
|
43
|
+
parsedMaterial.bindings.pbr_specularEnvSampler =
|
|
43
44
|
imageBasedLightingEnvironment.specularEnvSampler.texture;
|
|
44
|
-
parsedMaterial.bindings.
|
|
45
|
-
parsedMaterial.uniforms.
|
|
45
|
+
parsedMaterial.bindings.pbr_BrdfLUT = imageBasedLightingEnvironment.brdfLutTexture.texture;
|
|
46
|
+
parsedMaterial.uniforms.scaleIBLAmbient = [1, 1];
|
|
46
47
|
}
|
|
47
48
|
if (options?.pbrDebug) {
|
|
48
49
|
parsedMaterial.defines.PBR_DEBUG = 1;
|
|
49
50
|
// Override final color for reference app visualization of various parameters in the lighting equation.
|
|
50
|
-
parsedMaterial.uniforms.
|
|
51
|
-
parsedMaterial.uniforms.
|
|
51
|
+
parsedMaterial.uniforms.scaleDiffBaseMR = [0, 0, 0, 0];
|
|
52
|
+
parsedMaterial.uniforms.scaleFGDSpec = [0, 0, 0, 0];
|
|
52
53
|
}
|
|
53
54
|
if (attributes.NORMAL)
|
|
54
55
|
parsedMaterial.defines.HAS_NORMALS = 1;
|
|
@@ -67,29 +68,29 @@ export function parsePBRMaterial(device, material, attributes, options) {
|
|
|
67
68
|
}
|
|
68
69
|
/** Parse GLTF material record */
|
|
69
70
|
function parseMaterial(device, material, parsedMaterial) {
|
|
70
|
-
parsedMaterial.uniforms.
|
|
71
|
+
parsedMaterial.uniforms.unlit = Boolean(material.unlit);
|
|
71
72
|
if (material.pbrMetallicRoughness) {
|
|
72
73
|
parsePbrMetallicRoughness(device, material.pbrMetallicRoughness, parsedMaterial);
|
|
73
74
|
}
|
|
74
75
|
if (material.normalTexture) {
|
|
75
|
-
addTexture(device, material.normalTexture, '
|
|
76
|
+
addTexture(device, material.normalTexture, 'pbr_normalSampler', 'HAS_NORMALMAP', parsedMaterial);
|
|
76
77
|
const { scale = 1 } = material.normalTexture;
|
|
77
|
-
parsedMaterial.uniforms.
|
|
78
|
+
parsedMaterial.uniforms.normalScale = scale;
|
|
78
79
|
}
|
|
79
80
|
if (material.occlusionTexture) {
|
|
80
|
-
addTexture(device, material.occlusionTexture, '
|
|
81
|
+
addTexture(device, material.occlusionTexture, 'pbr_occlusionSampler', 'HAS_OCCLUSIONMAP', parsedMaterial);
|
|
81
82
|
const { strength = 1 } = material.occlusionTexture;
|
|
82
|
-
parsedMaterial.uniforms.
|
|
83
|
+
parsedMaterial.uniforms.occlusionStrength = strength;
|
|
83
84
|
}
|
|
84
85
|
if (material.emissiveTexture) {
|
|
85
|
-
addTexture(device, material.emissiveTexture, '
|
|
86
|
-
parsedMaterial.uniforms.
|
|
86
|
+
addTexture(device, material.emissiveTexture, 'pbr_emissiveSampler', 'HAS_EMISSIVEMAP', parsedMaterial);
|
|
87
|
+
parsedMaterial.uniforms.emissiveFactor = material.emissiveFactor || [0, 0, 0];
|
|
87
88
|
}
|
|
88
89
|
switch (material.alphaMode) {
|
|
89
90
|
case 'MASK':
|
|
90
91
|
const { alphaCutoff = 0.5 } = material;
|
|
91
92
|
parsedMaterial.defines.ALPHA_CUTOFF = 1;
|
|
92
|
-
parsedMaterial.uniforms.
|
|
93
|
+
parsedMaterial.uniforms.alphaCutoff = alphaCutoff;
|
|
93
94
|
break;
|
|
94
95
|
case 'BLEND':
|
|
95
96
|
log.warn('glTF BLEND alphaMode might not work well because it requires mesh sorting')();
|
|
@@ -115,14 +116,14 @@ function parseMaterial(device, material, parsedMaterial) {
|
|
|
115
116
|
/** Parse GLTF material sub record */
|
|
116
117
|
function parsePbrMetallicRoughness(device, pbrMetallicRoughness, parsedMaterial) {
|
|
117
118
|
if (pbrMetallicRoughness.baseColorTexture) {
|
|
118
|
-
addTexture(device, pbrMetallicRoughness.baseColorTexture, '
|
|
119
|
+
addTexture(device, pbrMetallicRoughness.baseColorTexture, 'pbr_baseColorSampler', 'HAS_BASECOLORMAP', parsedMaterial);
|
|
119
120
|
}
|
|
120
|
-
parsedMaterial.uniforms.
|
|
121
|
+
parsedMaterial.uniforms.baseColorFactor = pbrMetallicRoughness.baseColorFactor || [1, 1, 1, 1];
|
|
121
122
|
if (pbrMetallicRoughness.metallicRoughnessTexture) {
|
|
122
|
-
addTexture(device, pbrMetallicRoughness.metallicRoughnessTexture, '
|
|
123
|
+
addTexture(device, pbrMetallicRoughness.metallicRoughnessTexture, 'pbr_metallicRoughnessSampler', 'HAS_METALROUGHNESSMAP', parsedMaterial);
|
|
123
124
|
}
|
|
124
125
|
const { metallicFactor = 1, roughnessFactor = 1 } = pbrMetallicRoughness;
|
|
125
|
-
parsedMaterial.uniforms.
|
|
126
|
+
parsedMaterial.uniforms.metallicRoughnessValues = [metallicFactor, roughnessFactor];
|
|
126
127
|
}
|
|
127
128
|
/** Create a texture from a glTF texture/sampler/image combo and add it to bindings */
|
|
128
129
|
function addTexture(device, gltfTexture, uniformName, define = null, parsedMaterial) {
|
|
@@ -188,9 +189,9 @@ export class PBRMaterialParser {
|
|
|
188
189
|
|
|
189
190
|
this.uniforms = {
|
|
190
191
|
// TODO: find better values?
|
|
191
|
-
|
|
192
|
+
camera: [0, 0, 0], // Model should override
|
|
192
193
|
|
|
193
|
-
|
|
194
|
+
metallicRoughnessValues: [1, 1] // Default is 1 and 1
|
|
194
195
|
};
|
|
195
196
|
|
|
196
197
|
this.bindings = {};
|
|
@@ -199,17 +200,17 @@ export class PBRMaterialParser {
|
|
|
199
200
|
this.generatedTextures = [];
|
|
200
201
|
|
|
201
202
|
if (imageBasedLightingEnvironment) {
|
|
202
|
-
this.bindings.
|
|
203
|
-
this.bindings.
|
|
204
|
-
this.bindings.
|
|
205
|
-
this.uniforms.
|
|
203
|
+
this.bindings.pbr_diffuseEnvSampler = imageBasedLightingEnvironment.getDiffuseEnvSampler();
|
|
204
|
+
this.bindings.pbr_specularEnvSampler = imageBasedLightingEnvironment.getSpecularEnvSampler();
|
|
205
|
+
this.bindings.pbr_BrdfLUT = imageBasedLightingEnvironment.getBrdfTexture();
|
|
206
|
+
this.uniforms.scaleIBLAmbient = [1, 1];
|
|
206
207
|
}
|
|
207
208
|
|
|
208
209
|
if (pbrDebug) {
|
|
209
210
|
// Override final color for reference app visualization
|
|
210
211
|
// of various parameters in the lighting equation.
|
|
211
|
-
this.uniforms.
|
|
212
|
-
this.uniforms.
|
|
212
|
+
this.uniforms.scaleDiffBaseMR = [0, 0, 0, 0];
|
|
213
|
+
this.uniforms.scaleFGDSpec = [0, 0, 0, 0];
|
|
213
214
|
}
|
|
214
215
|
|
|
215
216
|
this.defineIfPresent(attributes.NORMAL, 'HAS_NORMALS');
|
|
@@ -241,31 +242,31 @@ export class PBRMaterialParser {
|
|
|
241
242
|
|
|
242
243
|
/** Parse GLTF material record *
|
|
243
244
|
parseMaterial(material) {
|
|
244
|
-
this.uniforms.
|
|
245
|
+
this.uniforms.unlit = Boolean(material.unlit);
|
|
245
246
|
|
|
246
247
|
if (material.pbrMetallicRoughness) {
|
|
247
248
|
this.parsePbrMetallicRoughness(material.pbrMetallicRoughness);
|
|
248
249
|
}
|
|
249
250
|
if (material.normalTexture) {
|
|
250
|
-
this.addTexture(material.normalTexture, '
|
|
251
|
+
this.addTexture(material.normalTexture, 'pbr_normalSampler', 'HAS_NORMALMAP');
|
|
251
252
|
|
|
252
253
|
const {scale = 1} = material.normalTexture;
|
|
253
|
-
this.uniforms.
|
|
254
|
+
this.uniforms.normalScale = scale;
|
|
254
255
|
}
|
|
255
256
|
if (material.occlusionTexture) {
|
|
256
|
-
this.addTexture(material.occlusionTexture, '
|
|
257
|
+
this.addTexture(material.occlusionTexture, 'pbr_occlusionSampler', 'HAS_OCCLUSIONMAP');
|
|
257
258
|
|
|
258
259
|
const {strength = 1} = material.occlusionTexture;
|
|
259
|
-
this.uniforms.
|
|
260
|
+
this.uniforms.occlusionStrength = strength;
|
|
260
261
|
}
|
|
261
262
|
if (material.emissiveTexture) {
|
|
262
|
-
this.addTexture(material.emissiveTexture, '
|
|
263
|
-
this.uniforms.
|
|
263
|
+
this.addTexture(material.emissiveTexture, 'pbr_emissiveSampler', 'HAS_EMISSIVEMAP');
|
|
264
|
+
this.uniforms.emissiveFactor = material.emissiveFactor || [0, 0, 0];
|
|
264
265
|
}
|
|
265
266
|
if (material.alphaMode === 'MASK') {
|
|
266
267
|
const {alphaCutoff = 0.5} = material;
|
|
267
268
|
this.defines.ALPHA_CUTOFF = 1;
|
|
268
|
-
this.uniforms.
|
|
269
|
+
this.uniforms.alphaCutoff = alphaCutoff;
|
|
269
270
|
} else if (material.alphaMode === 'BLEND') {
|
|
270
271
|
log.warn('BLEND alphaMode might not work well because it requires mesh sorting')();
|
|
271
272
|
Object.assign(this.parameters, {
|
|
@@ -281,21 +282,21 @@ export class PBRMaterialParser {
|
|
|
281
282
|
if (pbrMetallicRoughness.baseColorTexture) {
|
|
282
283
|
this.addTexture(
|
|
283
284
|
pbrMetallicRoughness.baseColorTexture,
|
|
284
|
-
'
|
|
285
|
+
'pbr_baseColorSampler',
|
|
285
286
|
'HAS_BASECOLORMAP'
|
|
286
287
|
);
|
|
287
288
|
}
|
|
288
|
-
this.uniforms.
|
|
289
|
+
this.uniforms.baseColorFactor = pbrMetallicRoughness.baseColorFactor || [1, 1, 1, 1];
|
|
289
290
|
|
|
290
291
|
if (pbrMetallicRoughness.metallicRoughnessTexture) {
|
|
291
292
|
this.addTexture(
|
|
292
293
|
pbrMetallicRoughness.metallicRoughnessTexture,
|
|
293
|
-
'
|
|
294
|
+
'pbr_metallicRoughnessSampler',
|
|
294
295
|
'HAS_METALROUGHNESSMAP'
|
|
295
296
|
);
|
|
296
297
|
}
|
|
297
298
|
const {metallicFactor = 1, roughnessFactor = 1} = pbrMetallicRoughness;
|
|
298
|
-
this.uniforms.
|
|
299
|
+
this.uniforms.metallicRoughnessValues = [metallicFactor, roughnessFactor];
|
|
299
300
|
}
|
|
300
301
|
|
|
301
302
|
/** Create a texture from a glTF texture/sampler/image combo and add it to bindings *
|
|
@@ -332,3 +333,4 @@ export class PBRMaterialParser {
|
|
|
332
333
|
}
|
|
333
334
|
}
|
|
334
335
|
*/
|
|
336
|
+
//# sourceMappingURL=parse-pbr-material.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parse-pbr-material.js","sourceRoot":"","sources":["../../src/pbr/parse-pbr-material.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pbr-environment.js","sourceRoot":"","sources":["../../src/pbr/pbr-environment.ts"],"names":[],"mappings":"AAAA,uBAAuB;AAGvB,OAAO,EAAC,YAAY,EAAC,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAC,gBAAgB,EAAC,MAAM,sBAAsB,CAAC;AAgBtD,yCAAyC;AACzC,MAAM,UAAU,kBAAkB,CAAC,MAAc,EAAE,KAA0B;IAC3E,MAAM,cAAc,GAAG,IAAI,YAAY,CAAC,MAAM,EAAE;QAC9C,EAAE,EAAE,SAAS;QACb,OAAO,EAAE;YACP,KAAK,EAAE,eAAe;YACtB,KAAK,EAAE,eAAe;YACtB,SAAS,EAAE,QAAQ;YACnB,SAAS,EAAE,QAAQ;SACJ;QACjB,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,KAAK,EAAE,eAAe;YACtB,KAAK,EAAE,eAAe;YACtB,SAAS,EAAE,QAAQ;YACnB,SAAS,EAAE,QAAQ;SACJ;KAClB,CAAC,CAAC;IAEH,MAAM,kBAAkB,GAAG,QAAQ,CAAC,MAAM,EAAE;QAC1C,EAAE,EAAE,oBAAoB;QACxB,iBAAiB,EAAE,CAAC,GAAW,EAAE,EAAE;YACjC,MAAM,UAAU,GAAG,EAAE,CAAC;YACtB,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,KAAK,EAAE,eAAe;YACtB,KAAK,EAAE,eAAe;YACtB,SAAS,EAAE,QAAQ,EAAE,oDAAoD;YACzE,SAAS,EAAE,QAAQ;SACJ;KAClB,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,SAAS,QAAQ,CACf,MAAc,EACd,EACE,EAAE,EACF,iBAAiB,EACjB,OAAO,EAKR;IAED,MAAM,IAAI,GAAG,EAAE,CAAC;IAChB,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE;QACnB,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,GAAG,iBAAiB,CAAC,IAAI,CAAC,CAAC;IAC/C,CAAC,CAAC,CAAC;IACH,OAAO,IAAI,YAAY,CAAC,MAAM,EAAE;QAC9B,EAAE;QACF,SAAS,EAAE,MAAM;QACjB,OAAO,EAAE,KAAK;QACd,OAAO;QACP,mBAAmB;QACnB,IAAI;KACL,CAAC,CAAC;AACL,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@luma.gl/gltf",
|
|
3
|
-
"version": "9.1.0-
|
|
3
|
+
"version": "9.1.0-beta.11",
|
|
4
4
|
"description": "glTF support for luma.gl",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"license": "MIT",
|
|
@@ -40,14 +40,14 @@
|
|
|
40
40
|
"prepublishOnly": "npm run build-minified-bundle && npm run build-dev-bundle"
|
|
41
41
|
},
|
|
42
42
|
"peerDependencies": {
|
|
43
|
-
"@luma.gl/core": "^9.
|
|
44
|
-
"@luma.gl/engine": "^9.
|
|
43
|
+
"@luma.gl/core": "^9.1.0-beta.1",
|
|
44
|
+
"@luma.gl/engine": "^9.1.0-beta.1",
|
|
45
|
+
"@luma.gl/shadertools": "^9.1.0-beta.1"
|
|
45
46
|
},
|
|
46
47
|
"dependencies": {
|
|
47
48
|
"@loaders.gl/core": "^4.2.0",
|
|
48
49
|
"@loaders.gl/textures": "^4.2.0",
|
|
49
|
-
"@
|
|
50
|
-
"@math.gl/core": "^4.0.0"
|
|
50
|
+
"@math.gl/core": "^4.1.0"
|
|
51
51
|
},
|
|
52
|
-
"gitHead": "
|
|
52
|
+
"gitHead": "aab3748ab83360e6ee611f9b4a2d805e5f17fb01"
|
|
53
53
|
}
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
// Copyright (c) vis.gl contributors
|
|
4
4
|
|
|
5
5
|
import {Device, RenderPipelineParameters, log} from '@luma.gl/core';
|
|
6
|
-
import {
|
|
6
|
+
import {pbrMaterial, ShaderModule} from '@luma.gl/shadertools';
|
|
7
7
|
import {Geometry, Model, ModelNode, ModelProps} from '@luma.gl/engine';
|
|
8
8
|
import {ParsePBRMaterialOptions, parsePBRMaterial} from '../pbr/parse-pbr-material';
|
|
9
9
|
|
|
@@ -94,7 +94,7 @@ const vs = /* glsl */ `\
|
|
|
94
94
|
#endif
|
|
95
95
|
|
|
96
96
|
pbr_setPositionNormalTangentUV(positions, _NORMAL, _TANGENT, _TEXCOORD_0);
|
|
97
|
-
gl_Position =
|
|
97
|
+
gl_Position = pbrProjection.modelViewProjectionMatrix * positions;
|
|
98
98
|
}
|
|
99
99
|
`;
|
|
100
100
|
|
|
@@ -145,15 +145,22 @@ export function createGLTFModel(device: Device, options: CreateGLTFModelOptions)
|
|
|
145
145
|
geometry,
|
|
146
146
|
topology: geometry.topology,
|
|
147
147
|
vertexCount,
|
|
148
|
-
modules: [
|
|
148
|
+
modules: [pbrMaterial as unknown as ShaderModule],
|
|
149
149
|
...modelOptions,
|
|
150
150
|
|
|
151
|
-
bindings: {...parsedMaterial.bindings, ...modelOptions.bindings},
|
|
152
151
|
defines: {...parsedMaterial.defines, ...modelOptions.defines},
|
|
153
|
-
parameters: {...parameters, ...parsedMaterial.parameters, ...modelOptions.parameters}
|
|
154
|
-
uniforms: {...parsedMaterial.uniforms, ...modelOptions.uniforms}
|
|
152
|
+
parameters: {...parameters, ...parsedMaterial.parameters, ...modelOptions.parameters}
|
|
155
153
|
};
|
|
156
154
|
|
|
157
155
|
const model = new Model(device, modelProps);
|
|
156
|
+
|
|
157
|
+
const {camera, ...pbrMaterialProps} = {
|
|
158
|
+
...parsedMaterial.uniforms,
|
|
159
|
+
...modelOptions.uniforms,
|
|
160
|
+
...parsedMaterial.bindings,
|
|
161
|
+
...modelOptions.bindings
|
|
162
|
+
};
|
|
163
|
+
|
|
164
|
+
model.shaderInputs.setProps({pbrMaterial: pbrMaterialProps, pbrProjection: {camera}});
|
|
158
165
|
return new ModelNode({managedResources, model});
|
|
159
166
|
}
|
package/src/gltf/gl-utils.ts
CHANGED
|
@@ -7,6 +7,7 @@ import {PrimitiveTopology} from '@luma.gl/core';
|
|
|
7
7
|
// NOTE: Modules other than `@luma.gl/webgl` should not import `GL` from
|
|
8
8
|
// `@luma.gl/constants`. Locally we use `GLEnum` instead of `GL` to avoid
|
|
9
9
|
// conflicts with the `babel-plugin-inline-webgl-constants` plugin.
|
|
10
|
+
// eslint-disable-next-line no-shadow
|
|
10
11
|
export enum GLEnum {
|
|
11
12
|
POINTS = 0x0,
|
|
12
13
|
LINES = 0x1,
|
|
@@ -42,8 +42,8 @@ export class GLTFInstantiator {
|
|
|
42
42
|
}
|
|
43
43
|
|
|
44
44
|
instantiate(gltf: any): GroupNode[] {
|
|
45
|
-
this.gltf = gltf;
|
|
46
|
-
const scenes = (gltf.scenes || []).map(scene => this.createScene(scene));
|
|
45
|
+
this.gltf = deepCopy(gltf);
|
|
46
|
+
const scenes = (this.gltf.scenes || []).map(scene => this.createScene(scene));
|
|
47
47
|
return scenes;
|
|
48
48
|
}
|
|
49
49
|
|
|
@@ -101,6 +101,10 @@ export class GLTFInstantiator {
|
|
|
101
101
|
gltfNode._node = node;
|
|
102
102
|
}
|
|
103
103
|
|
|
104
|
+
// Copy _node so that gltf-animator can access
|
|
105
|
+
const topLevelNode = this.gltf.nodes.find(node => node.id === gltfNode.id);
|
|
106
|
+
topLevelNode._node = gltfNode._node;
|
|
107
|
+
|
|
104
108
|
return gltfNode._node;
|
|
105
109
|
}
|
|
106
110
|
|
|
@@ -204,3 +208,26 @@ export class GLTFInstantiator {
|
|
|
204
208
|
return false;
|
|
205
209
|
}
|
|
206
210
|
}
|
|
211
|
+
|
|
212
|
+
/** Deeply copies a JS data structure */
|
|
213
|
+
function deepCopy(object: any): any {
|
|
214
|
+
// don't copy binary data
|
|
215
|
+
if (
|
|
216
|
+
ArrayBuffer.isView(object) ||
|
|
217
|
+
object instanceof ArrayBuffer ||
|
|
218
|
+
object instanceof ImageBitmap
|
|
219
|
+
) {
|
|
220
|
+
return object;
|
|
221
|
+
}
|
|
222
|
+
if (Array.isArray(object)) {
|
|
223
|
+
return object.map(deepCopy);
|
|
224
|
+
}
|
|
225
|
+
if (object && typeof object === 'object') {
|
|
226
|
+
const result = {};
|
|
227
|
+
for (const key in object) {
|
|
228
|
+
result[key] = deepCopy(object[key]);
|
|
229
|
+
}
|
|
230
|
+
return result;
|
|
231
|
+
}
|
|
232
|
+
return object;
|
|
233
|
+
}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
|
-
import type {Device, Texture,
|
|
1
|
+
import type {Device, Texture, Parameters} from '@luma.gl/core';
|
|
2
2
|
import {log} from '@luma.gl/core';
|
|
3
3
|
import {PBREnvironment} from './pbr-environment';
|
|
4
|
+
import {PBRMaterialBindings, PBRMaterialUniforms, PBRProjectionProps} from '@luma.gl/shadertools';
|
|
4
5
|
|
|
5
6
|
/* eslint-disable camelcase */
|
|
6
7
|
|
|
@@ -17,8 +18,8 @@ export type ParsePBRMaterialOptions = {
|
|
|
17
18
|
|
|
18
19
|
export type ParsedPBRMaterial = {
|
|
19
20
|
readonly defines: Record<string, number | boolean>;
|
|
20
|
-
readonly bindings:
|
|
21
|
-
readonly uniforms:
|
|
21
|
+
readonly bindings: Partial<PBRMaterialBindings>;
|
|
22
|
+
readonly uniforms: Partial<PBRProjectionProps & PBRMaterialUniforms>;
|
|
22
23
|
readonly parameters: Parameters;
|
|
23
24
|
readonly glParameters: Record<string, any>;
|
|
24
25
|
/** List of all generated textures, makes it easy to destroy them later */
|
|
@@ -28,6 +29,7 @@ export type ParsedPBRMaterial = {
|
|
|
28
29
|
// NOTE: Modules other than `@luma.gl/webgl` should not import `GL` from
|
|
29
30
|
// `@luma.gl/constants`. Locally we use `GLEnum` instead of `GL` to avoid
|
|
30
31
|
// conflicts with the `babel-plugin-inline-webgl-constants` plugin.
|
|
32
|
+
// eslint-disable-next-line no-shadow
|
|
31
33
|
enum GLEnum {
|
|
32
34
|
FUNC_ADD = 0x8006,
|
|
33
35
|
ONE = 1,
|
|
@@ -57,9 +59,9 @@ export function parsePBRMaterial(
|
|
|
57
59
|
bindings: {},
|
|
58
60
|
uniforms: {
|
|
59
61
|
// TODO: find better values?
|
|
60
|
-
|
|
62
|
+
camera: [0, 0, 0], // Model should override
|
|
61
63
|
|
|
62
|
-
|
|
64
|
+
metallicRoughnessValues: [1, 1] // Default is 1 and 1
|
|
63
65
|
},
|
|
64
66
|
parameters: {},
|
|
65
67
|
glParameters: {},
|
|
@@ -71,19 +73,19 @@ export function parsePBRMaterial(
|
|
|
71
73
|
|
|
72
74
|
const {imageBasedLightingEnvironment} = options;
|
|
73
75
|
if (imageBasedLightingEnvironment) {
|
|
74
|
-
parsedMaterial.bindings.
|
|
76
|
+
parsedMaterial.bindings.pbr_diffuseEnvSampler =
|
|
75
77
|
imageBasedLightingEnvironment.diffuseEnvSampler.texture;
|
|
76
|
-
parsedMaterial.bindings.
|
|
78
|
+
parsedMaterial.bindings.pbr_specularEnvSampler =
|
|
77
79
|
imageBasedLightingEnvironment.specularEnvSampler.texture;
|
|
78
|
-
parsedMaterial.bindings.
|
|
79
|
-
parsedMaterial.uniforms.
|
|
80
|
+
parsedMaterial.bindings.pbr_BrdfLUT = imageBasedLightingEnvironment.brdfLutTexture.texture;
|
|
81
|
+
parsedMaterial.uniforms.scaleIBLAmbient = [1, 1];
|
|
80
82
|
}
|
|
81
83
|
|
|
82
84
|
if (options?.pbrDebug) {
|
|
83
85
|
parsedMaterial.defines.PBR_DEBUG = 1;
|
|
84
86
|
// Override final color for reference app visualization of various parameters in the lighting equation.
|
|
85
|
-
parsedMaterial.uniforms.
|
|
86
|
-
parsedMaterial.uniforms.
|
|
87
|
+
parsedMaterial.uniforms.scaleDiffBaseMR = [0, 0, 0, 0];
|
|
88
|
+
parsedMaterial.uniforms.scaleFGDSpec = [0, 0, 0, 0];
|
|
87
89
|
}
|
|
88
90
|
|
|
89
91
|
if (attributes.NORMAL) parsedMaterial.defines.HAS_NORMALS = 1;
|
|
@@ -102,45 +104,51 @@ export function parsePBRMaterial(
|
|
|
102
104
|
|
|
103
105
|
/** Parse GLTF material record */
|
|
104
106
|
function parseMaterial(device: Device, material, parsedMaterial: ParsedPBRMaterial): void {
|
|
105
|
-
parsedMaterial.uniforms.
|
|
107
|
+
parsedMaterial.uniforms.unlit = Boolean(material.unlit);
|
|
106
108
|
|
|
107
109
|
if (material.pbrMetallicRoughness) {
|
|
108
110
|
parsePbrMetallicRoughness(device, material.pbrMetallicRoughness, parsedMaterial);
|
|
109
111
|
}
|
|
110
112
|
if (material.normalTexture) {
|
|
111
|
-
addTexture(
|
|
113
|
+
addTexture(
|
|
114
|
+
device,
|
|
115
|
+
material.normalTexture,
|
|
116
|
+
'pbr_normalSampler',
|
|
117
|
+
'HAS_NORMALMAP',
|
|
118
|
+
parsedMaterial
|
|
119
|
+
);
|
|
112
120
|
|
|
113
121
|
const {scale = 1} = material.normalTexture;
|
|
114
|
-
parsedMaterial.uniforms.
|
|
122
|
+
parsedMaterial.uniforms.normalScale = scale;
|
|
115
123
|
}
|
|
116
124
|
if (material.occlusionTexture) {
|
|
117
125
|
addTexture(
|
|
118
126
|
device,
|
|
119
127
|
material.occlusionTexture,
|
|
120
|
-
'
|
|
128
|
+
'pbr_occlusionSampler',
|
|
121
129
|
'HAS_OCCLUSIONMAP',
|
|
122
130
|
parsedMaterial
|
|
123
131
|
);
|
|
124
132
|
|
|
125
133
|
const {strength = 1} = material.occlusionTexture;
|
|
126
|
-
parsedMaterial.uniforms.
|
|
134
|
+
parsedMaterial.uniforms.occlusionStrength = strength;
|
|
127
135
|
}
|
|
128
136
|
if (material.emissiveTexture) {
|
|
129
137
|
addTexture(
|
|
130
138
|
device,
|
|
131
139
|
material.emissiveTexture,
|
|
132
|
-
'
|
|
140
|
+
'pbr_emissiveSampler',
|
|
133
141
|
'HAS_EMISSIVEMAP',
|
|
134
142
|
parsedMaterial
|
|
135
143
|
);
|
|
136
|
-
parsedMaterial.uniforms.
|
|
144
|
+
parsedMaterial.uniforms.emissiveFactor = material.emissiveFactor || [0, 0, 0];
|
|
137
145
|
}
|
|
138
146
|
|
|
139
147
|
switch (material.alphaMode) {
|
|
140
148
|
case 'MASK':
|
|
141
149
|
const {alphaCutoff = 0.5} = material;
|
|
142
150
|
parsedMaterial.defines.ALPHA_CUTOFF = 1;
|
|
143
|
-
parsedMaterial.uniforms.
|
|
151
|
+
parsedMaterial.uniforms.alphaCutoff = alphaCutoff;
|
|
144
152
|
break;
|
|
145
153
|
case 'BLEND':
|
|
146
154
|
log.warn('glTF BLEND alphaMode might not work well because it requires mesh sorting')();
|
|
@@ -178,24 +186,24 @@ function parsePbrMetallicRoughness(
|
|
|
178
186
|
addTexture(
|
|
179
187
|
device,
|
|
180
188
|
pbrMetallicRoughness.baseColorTexture,
|
|
181
|
-
'
|
|
189
|
+
'pbr_baseColorSampler',
|
|
182
190
|
'HAS_BASECOLORMAP',
|
|
183
191
|
parsedMaterial
|
|
184
192
|
);
|
|
185
193
|
}
|
|
186
|
-
parsedMaterial.uniforms.
|
|
194
|
+
parsedMaterial.uniforms.baseColorFactor = pbrMetallicRoughness.baseColorFactor || [1, 1, 1, 1];
|
|
187
195
|
|
|
188
196
|
if (pbrMetallicRoughness.metallicRoughnessTexture) {
|
|
189
197
|
addTexture(
|
|
190
198
|
device,
|
|
191
199
|
pbrMetallicRoughness.metallicRoughnessTexture,
|
|
192
|
-
'
|
|
200
|
+
'pbr_metallicRoughnessSampler',
|
|
193
201
|
'HAS_METALROUGHNESSMAP',
|
|
194
202
|
parsedMaterial
|
|
195
203
|
);
|
|
196
204
|
}
|
|
197
205
|
const {metallicFactor = 1, roughnessFactor = 1} = pbrMetallicRoughness;
|
|
198
|
-
parsedMaterial.uniforms.
|
|
206
|
+
parsedMaterial.uniforms.metallicRoughnessValues = [metallicFactor, roughnessFactor];
|
|
199
207
|
}
|
|
200
208
|
|
|
201
209
|
/** Create a texture from a glTF texture/sampler/image combo and add it to bindings */
|
|
@@ -270,9 +278,9 @@ export class PBRMaterialParser {
|
|
|
270
278
|
|
|
271
279
|
this.uniforms = {
|
|
272
280
|
// TODO: find better values?
|
|
273
|
-
|
|
281
|
+
camera: [0, 0, 0], // Model should override
|
|
274
282
|
|
|
275
|
-
|
|
283
|
+
metallicRoughnessValues: [1, 1] // Default is 1 and 1
|
|
276
284
|
};
|
|
277
285
|
|
|
278
286
|
this.bindings = {};
|
|
@@ -281,17 +289,17 @@ export class PBRMaterialParser {
|
|
|
281
289
|
this.generatedTextures = [];
|
|
282
290
|
|
|
283
291
|
if (imageBasedLightingEnvironment) {
|
|
284
|
-
this.bindings.
|
|
285
|
-
this.bindings.
|
|
286
|
-
this.bindings.
|
|
287
|
-
this.uniforms.
|
|
292
|
+
this.bindings.pbr_diffuseEnvSampler = imageBasedLightingEnvironment.getDiffuseEnvSampler();
|
|
293
|
+
this.bindings.pbr_specularEnvSampler = imageBasedLightingEnvironment.getSpecularEnvSampler();
|
|
294
|
+
this.bindings.pbr_BrdfLUT = imageBasedLightingEnvironment.getBrdfTexture();
|
|
295
|
+
this.uniforms.scaleIBLAmbient = [1, 1];
|
|
288
296
|
}
|
|
289
297
|
|
|
290
298
|
if (pbrDebug) {
|
|
291
299
|
// Override final color for reference app visualization
|
|
292
300
|
// of various parameters in the lighting equation.
|
|
293
|
-
this.uniforms.
|
|
294
|
-
this.uniforms.
|
|
301
|
+
this.uniforms.scaleDiffBaseMR = [0, 0, 0, 0];
|
|
302
|
+
this.uniforms.scaleFGDSpec = [0, 0, 0, 0];
|
|
295
303
|
}
|
|
296
304
|
|
|
297
305
|
this.defineIfPresent(attributes.NORMAL, 'HAS_NORMALS');
|
|
@@ -323,31 +331,31 @@ export class PBRMaterialParser {
|
|
|
323
331
|
|
|
324
332
|
/** Parse GLTF material record *
|
|
325
333
|
parseMaterial(material) {
|
|
326
|
-
this.uniforms.
|
|
334
|
+
this.uniforms.unlit = Boolean(material.unlit);
|
|
327
335
|
|
|
328
336
|
if (material.pbrMetallicRoughness) {
|
|
329
337
|
this.parsePbrMetallicRoughness(material.pbrMetallicRoughness);
|
|
330
338
|
}
|
|
331
339
|
if (material.normalTexture) {
|
|
332
|
-
this.addTexture(material.normalTexture, '
|
|
340
|
+
this.addTexture(material.normalTexture, 'pbr_normalSampler', 'HAS_NORMALMAP');
|
|
333
341
|
|
|
334
342
|
const {scale = 1} = material.normalTexture;
|
|
335
|
-
this.uniforms.
|
|
343
|
+
this.uniforms.normalScale = scale;
|
|
336
344
|
}
|
|
337
345
|
if (material.occlusionTexture) {
|
|
338
|
-
this.addTexture(material.occlusionTexture, '
|
|
346
|
+
this.addTexture(material.occlusionTexture, 'pbr_occlusionSampler', 'HAS_OCCLUSIONMAP');
|
|
339
347
|
|
|
340
348
|
const {strength = 1} = material.occlusionTexture;
|
|
341
|
-
this.uniforms.
|
|
349
|
+
this.uniforms.occlusionStrength = strength;
|
|
342
350
|
}
|
|
343
351
|
if (material.emissiveTexture) {
|
|
344
|
-
this.addTexture(material.emissiveTexture, '
|
|
345
|
-
this.uniforms.
|
|
352
|
+
this.addTexture(material.emissiveTexture, 'pbr_emissiveSampler', 'HAS_EMISSIVEMAP');
|
|
353
|
+
this.uniforms.emissiveFactor = material.emissiveFactor || [0, 0, 0];
|
|
346
354
|
}
|
|
347
355
|
if (material.alphaMode === 'MASK') {
|
|
348
356
|
const {alphaCutoff = 0.5} = material;
|
|
349
357
|
this.defines.ALPHA_CUTOFF = 1;
|
|
350
|
-
this.uniforms.
|
|
358
|
+
this.uniforms.alphaCutoff = alphaCutoff;
|
|
351
359
|
} else if (material.alphaMode === 'BLEND') {
|
|
352
360
|
log.warn('BLEND alphaMode might not work well because it requires mesh sorting')();
|
|
353
361
|
Object.assign(this.parameters, {
|
|
@@ -363,21 +371,21 @@ export class PBRMaterialParser {
|
|
|
363
371
|
if (pbrMetallicRoughness.baseColorTexture) {
|
|
364
372
|
this.addTexture(
|
|
365
373
|
pbrMetallicRoughness.baseColorTexture,
|
|
366
|
-
'
|
|
374
|
+
'pbr_baseColorSampler',
|
|
367
375
|
'HAS_BASECOLORMAP'
|
|
368
376
|
);
|
|
369
377
|
}
|
|
370
|
-
this.uniforms.
|
|
378
|
+
this.uniforms.baseColorFactor = pbrMetallicRoughness.baseColorFactor || [1, 1, 1, 1];
|
|
371
379
|
|
|
372
380
|
if (pbrMetallicRoughness.metallicRoughnessTexture) {
|
|
373
381
|
this.addTexture(
|
|
374
382
|
pbrMetallicRoughness.metallicRoughnessTexture,
|
|
375
|
-
'
|
|
383
|
+
'pbr_metallicRoughnessSampler',
|
|
376
384
|
'HAS_METALROUGHNESSMAP'
|
|
377
385
|
);
|
|
378
386
|
}
|
|
379
387
|
const {metallicFactor = 1, roughnessFactor = 1} = pbrMetallicRoughness;
|
|
380
|
-
this.uniforms.
|
|
388
|
+
this.uniforms.metallicRoughnessValues = [metallicFactor, roughnessFactor];
|
|
381
389
|
}
|
|
382
390
|
|
|
383
391
|
/** Create a texture from a glTF texture/sampler/image combo and add it to bindings *
|