@@ -6,7 +6,7 @@ import { Material } from 'babylonjs/Materials/material';
6
6
import { Mesh } from 'babylonjs/Meshes/mesh' ;
7
7
import { AbstractMesh } from 'babylonjs/Meshes/abstractMesh' ;
8
8
import { INode , IMeshPrimitive , IMesh } from '../glTFLoaderInterfaces' ;
9
- import { IKHRMaterialVariants } from 'babylonjs-gltf2interface' ;
9
+ import { IKHRMaterialVariants_Mapping , IKHRMaterialVariants_Variant , IKHRMaterialVariants_Variants } from 'babylonjs-gltf2interface' ;
10
10
11
11
const NAME = "KHR_materials_variants" ;
12
12
@@ -37,6 +37,8 @@ export class KHR_materials_variants implements IGLTFLoaderExtension {
37
37
38
38
private _loader : GLTFLoader ;
39
39
40
+ private _variants ?: Array < IKHRMaterialVariants_Variant > ;
41
+
40
42
/** @hidden */
41
43
constructor ( loader : GLTFLoader ) {
42
44
this . _loader = loader ;
@@ -163,9 +165,18 @@ export class KHR_materials_variants implements IGLTFLoaderExtension {
163
165
return rootMesh ?. metadata ?. gltf ?. [ NAME ] || null ;
164
166
}
165
167
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
+
166
177
/** @hidden */
167
178
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 ) => {
169
180
const promises = new Array < Promise < any > > ( ) ;
170
181
promises . push ( this . _loader . _loadMeshPrimitiveAsync ( context , name , node , mesh , primitive , ( babylonMesh ) => {
171
182
assign ( babylonMesh ) ;
@@ -184,11 +195,12 @@ export class KHR_materials_variants implements IGLTFLoaderExtension {
184
195
// For each mapping, look at the variants and make a new entry for them.
185
196
const variants = extensionMetadata . variants ;
186
197
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 ) ;
188
200
const material = ArrayItem . Get ( `#/materials/` , this . _loader . gltf . materials , mapping . material ) ;
189
201
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 ( {
192
204
mesh : babylonMesh ,
193
205
material : babylonMaterial
194
206
} ) ;
0 commit comments