Jelajahi Sumber

Merge pull request #3807 from bghgary/skeleton-fix

Fix bug with loading skeletons in glTF loader
David Catuhe 7 tahun lalu
induk
melakukan
712ed98425

TEMPAT SAMPAH
Playground/scenes/Alien/Alien.bin


File diff ditekan karena terlalu besar
+ 1562 - 0
Playground/scenes/Alien/Alien.gltf


TEMPAT SAMPAH
Playground/scenes/Alien/Alien_baseColor.png


TEMPAT SAMPAH
Playground/scenes/Alien/Alien_normal.png


TEMPAT SAMPAH
Playground/scenes/Alien/Alien_occlusionRoughnessMetallic.png


+ 3 - 2
loaders/src/glTF/2.0/babylon.glTFLoader.ts

@@ -706,8 +706,9 @@ module BABYLON.GLTF2 {
             };
 
             if (skin._loaded) {
-                assignSkeleton();
-                return skin._loaded;
+                return skin._loaded.then(() => {
+                    assignSkeleton();
+                });
             }
 
             // TODO: split into two parts so that bones are created before inverseBindMatricesData is loaded (for compiling materials).

+ 23 - 0
tests/unit/babylon/src/Loading/babylon.sceneLoader.tests.ts

@@ -181,6 +181,29 @@ describe('Babylon Scene Loader', function () {
             return Promise.all([promise, deferred.promise, scene.whenReadyAsync()]);
         });
 
+        it('Load Alien', () => {
+            const scene = new BABYLON.Scene(subject);
+            return BABYLON.SceneLoader.ImportMeshAsync(null, "/Playground/scenes/Alien/", "Alien.gltf", scene).then(result => {
+                expect(result.skeletons.length, "skeletons.length").to.equal(scene.skeletons.length);
+
+                const mapping = {
+                    "AlienHead_0": "skeleton0",
+                    "Collar_0": "skeleton1",
+                    "LeftEye_0": "skeleton2",
+                    "RightEye_0": "skeleton3",
+                    "CollarClasp_0": "skeleton1",
+                    "Shirt_0": "skeleton1",
+                    "ShirtPlate_0": "skeleton1",
+                    "Teeth_0": "skeleton1",
+                };
+
+                for (const meshName in mapping) {
+                    const skeletonName = mapping[meshName];
+                    expect(scene.getMeshByName(meshName).skeleton.name, `skeleton name of mesh '${meshName}'`).to.equal(skeletonName);
+                }
+            });
+        });
+
         // TODO: test material instancing
         // TODO: test ImportMesh with specific node name
         // TODO: test KHR_materials_pbrSpecularGlossiness