瀏覽代碼

fix(assetcontainer): Default targetConverter now converts based on targetProperty

Peter Henry 5 年之前
父節點
當前提交
d7cee069ad
共有 2 個文件被更改,包括 39 次插入1 次删除
  1. 20 1
      src/assetContainer.ts
  2. 19 0
      src/scene.ts

+ 20 - 1
src/assetContainer.ts

@@ -485,7 +485,26 @@ export class AssetContainer extends AbstractScene {
             return;
         }
 
-        let _targetConverter = targetConverter ? targetConverter : (target: any) => { return scene.getBoneByName(target.name) || scene.getNodeByName(target.name); };
+        let _targetConverter = targetConverter ? targetConverter : (target: any) => { 
+            let node = null;
+
+            // Remove _primitive and get change things like "Foot.L" to "FootL"
+            const name = target.name.split(".").join("").split("_")[0]
+
+            switch (target.animations.length ? target.animations[0].targetProperty : "") {
+            case "position":
+            case "rotationQuaternion":
+                node = scene.getTransformNodeByName(name);
+                break;
+            case "influence":
+                node = scene.getMorphTargetByName(name);
+                break;
+            default:
+                node = scene.getNodeByName(name);
+            }
+
+            return node;
+        };
 
         // Copy new node animations
         let nodesInAC = this.getNodes();

+ 19 - 0
src/scene.ts

@@ -3203,6 +3203,25 @@ export class Scene extends AbstractScene implements IAnimatable {
         return null;
     }
 
+
+    /**
+     * Gets a morph target using a given name (if many are found, this function will pick the first one)
+     * @param name defines the name to search for
+     * @return the found morph target or null if not found at all.
+     */
+    public getMorphTargetByName(name: string): Nullable<MorphTarget> {
+        for (let managerIndex = 0; managerIndex < this.morphTargetManagers.length; ++managerIndex) {
+            const morphTargetManager = this.morphTargetManagers[managerIndex];
+            for (let index = 0; index < morphTargetManager.numTargets; ++index) {
+                const target = morphTargetManager.getTarget(index);
+                if (target.name === name) {
+                    return target;
+                }
+            }
+        }
+        return null;
+    }
+
     /**
      * Gets a boolean indicating if the given mesh is active
      * @param mesh defines the mesh to look for