Kaynağa Gözat

Add support for STEP interpolation

Gary Hsu 7 yıl önce
ebeveyn
işleme
2cfa5cc651

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

@@ -1045,8 +1045,16 @@ module BABYLON.GLTF2 {
 
                 sampler.interpolation = sampler.interpolation || "LINEAR";
 
-                let getNextKey: (frameIndex: number) => any;
+                let getNextKey: (frameIndex: number) => IAnimationKey;
                 switch (sampler.interpolation) {
+                    case "STEP": {
+                        getNextKey = frameIndex => ({
+                            frame: inputData[frameIndex],
+                            value: getNextOutputValue(),
+                            interpolation: AnimationKeyInterpolation.STEP
+                        });
+                        break;
+                    }
                     case "LINEAR": {
                         getNextKey = frameIndex => ({
                             frame: inputData[frameIndex],
@@ -1068,7 +1076,7 @@ module BABYLON.GLTF2 {
                     }
                 };
 
-                let keys: Array<any>;
+                let keys: Array<IAnimationKey>;
                 if (inputData.length === 1) {
                     let key = getNextKey(0);
                     keys = [

+ 20 - 5
src/Animations/babylon.animation.ts

@@ -81,10 +81,25 @@
         }
     }
 
+    export interface IAnimationKey {
+        frame: number;
+        value: any;
+        inTangent?: any;
+        outTangent?: any;
+        interpolation?: AnimationKeyInterpolation;
+    }
+
+    export enum AnimationKeyInterpolation {
+        /**
+         * Do not interpolate between keys and use the start key value only. Tangents are ignored.
+         */
+        STEP = 1
+    }
+
     export class Animation {
         public static AllowMatricesInterpolation = false;
 
-        private _keys: Array<{ frame: number, value: any, inTangent?: any, outTangent?: any }>;
+        private _keys: Array<IAnimationKey>;
         private _easingFunction: IEasingFunction;
 
         public _runtimeAnimations = new Array<RuntimeAnimation>();
@@ -122,7 +137,7 @@
 
             var animation = new Animation(name, targetProperty, framePerSecond, dataType, loopMode);
 
-            var keys: Array<{ frame: number, value: any }> = [{ frame: 0, value: from }, { frame: totalFrame, value: to }];
+            var keys: Array<IAnimationKey> = [{ frame: 0, value: from }, { frame: totalFrame, value: to }];
             animation.setKeys(keys);
 
             if (easingFunction !== undefined) {
@@ -370,7 +385,7 @@
         }
 
 
-        public getKeys(): Array<{ frame: number, value: any, inTangent?: any, outTangent?: any }> {
+        public getKeys(): Array<IAnimationKey> {
             return this._keys;
         }
 
@@ -461,7 +476,7 @@
             return clone;
         }
 
-        public setKeys(values: Array<{ frame: number, value: any }>): void {
+        public setKeys(values: Array<IAnimationKey>): void {
             this._keys = values.slice(0);
         }
 
@@ -573,7 +588,7 @@
             var animation = new Animation(parsedAnimation.name, parsedAnimation.property, parsedAnimation.framePerSecond, parsedAnimation.dataType, parsedAnimation.loopBehavior);
 
             var dataType = parsedAnimation.dataType;
-            var keys: Array<{ frame: number, value: any, inTangent: any, outTangent: any }> = [];
+            var keys: Array<IAnimationKey> = [];
             var data;
             var index: number;
 

+ 4 - 0
src/Animations/babylon.runtimeAnimation.ts

@@ -75,6 +75,10 @@
 
                     var startKey = keys[key];
                     var startValue = this._getKeyValue(startKey.value);
+                    if (startKey.interpolation === AnimationKeyInterpolation.STEP) {
+                        return startValue;
+                    }
+
                     var endValue = this._getKeyValue(endKey.value);
 
                     var useTangent = startKey.outTangent !== undefined && endKey.inTangent !== undefined;