Skip to content

Commit f8b1e38

Browse files
authored
Update KHR_materials_variants to latest spec (#8739)
1 parent e35a854 commit f8b1e38

File tree

2 files changed

+29
-10
lines changed

2 files changed

+29
-10
lines changed

dist/preview release/glTF2Interface/babylon.glTF2Interface.d.ts

+12-5
Original file line numberDiff line numberDiff line change
@@ -1061,14 +1061,21 @@ declare module BABYLON.GLTF2 {
10611061
*/
10621062

10631063
/** @hidden */
1064-
interface IKHRMaterialVariants_Mapping {
1065-
variants: string[];
1066-
material: number;
1064+
interface IKHRMaterialVariants_Mapping extends IProperty {
1065+
mapping: Array<{
1066+
variants: number[];
1067+
material: number;
1068+
}>;
10671069
}
10681070

10691071
/** @hidden */
1070-
interface IKHRMaterialVariants {
1071-
mapping: IKHRMaterialVariants_Mapping[];
1072+
interface IKHRMaterialVariants_Variant extends IProperty {
1073+
name: string;
1074+
}
1075+
1076+
/** @hidden */
1077+
interface IKHRMaterialVariants_Variants extends IChildRootProperty {
1078+
variants: Array<IKHRMaterialVariants_Variant>;
10721079
}
10731080

10741081
/**

loaders/src/glTF/2.0/Extensions/KHR_materials_variants.ts

+17-5
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ import { Material } from 'babylonjs/Materials/material';
66
import { Mesh } from 'babylonjs/Meshes/mesh';
77
import { AbstractMesh } from 'babylonjs/Meshes/abstractMesh';
88
import { INode, IMeshPrimitive, IMesh } from '../glTFLoaderInterfaces';
9-
import { IKHRMaterialVariants } from 'babylonjs-gltf2interface';
9+
import { IKHRMaterialVariants_Mapping, IKHRMaterialVariants_Variant, IKHRMaterialVariants_Variants } from 'babylonjs-gltf2interface';
1010

1111
const NAME = "KHR_materials_variants";
1212

@@ -37,6 +37,8 @@ export class KHR_materials_variants implements IGLTFLoaderExtension {
3737

3838
private _loader: GLTFLoader;
3939

40+
private _variants?: Array<IKHRMaterialVariants_Variant>;
41+
4042
/** @hidden */
4143
constructor(loader: GLTFLoader) {
4244
this._loader = loader;
@@ -163,9 +165,18 @@ export class KHR_materials_variants implements IGLTFLoaderExtension {
163165
return rootMesh?.metadata?.gltf?.[NAME] || null;
164166
}
165167

168+
/** @hidden */
169+
public onLoading(): void {
170+
const extensions = this._loader.gltf.extensions;
171+
if (extensions && extensions[this.name]) {
172+
const extension = extensions[this.name] as IKHRMaterialVariants_Variants;
173+
this._variants = extension.variants;
174+
}
175+
}
176+
166177
/** @hidden */
167178
public _loadMeshPrimitiveAsync(context: string, name: string, node: INode, mesh: IMesh, primitive: IMeshPrimitive, assign: (babylonMesh: AbstractMesh) => void): Nullable<Promise<AbstractMesh>> {
168-
return GLTFLoader.LoadExtensionAsync<IKHRMaterialVariants, AbstractMesh>(context, primitive, this.name, (extensionContext, extension) => {
179+
return GLTFLoader.LoadExtensionAsync<IKHRMaterialVariants_Mapping, AbstractMesh>(context, primitive, this.name, (extensionContext, extension) => {
169180
const promises = new Array<Promise<any>>();
170181
promises.push(this._loader._loadMeshPrimitiveAsync(context, name, node, mesh, primitive, (babylonMesh) => {
171182
assign(babylonMesh);
@@ -184,11 +195,12 @@ export class KHR_materials_variants implements IGLTFLoaderExtension {
184195
// For each mapping, look at the variants and make a new entry for them.
185196
const variants = extensionMetadata.variants;
186197
for (const mapping of extension.mapping) {
187-
for (const variant of mapping.variants) {
198+
for (const variantIndex of mapping.variants) {
199+
const variant = ArrayItem.Get(`${extensionContext}/mapping/${variantIndex}`, this._variants, variantIndex);
188200
const material = ArrayItem.Get(`#/materials/`, this._loader.gltf.materials, mapping.material);
189201
promises.push(this._loader._loadMaterialAsync(`#/materials/${mapping.material}`, material, babylonMesh, babylonDrawMode, (babylonMaterial) => {
190-
variants[variant] = variants[variant] || [];
191-
variants[variant].push({
202+
variants[variant.name] = variants[variant.name] || [];
203+
variants[variant.name].push({
192204
mesh: babylonMesh,
193205
material: babylonMaterial
194206
});

0 commit comments

Comments
 (0)