Beispiel #1
0
        protected override bool OnLoad(Animation model, File source)
        {
            int memoryUse = Unsafe.SizeOf <Animation>();

            // Check ID
            if (source.ReadFileID() != "UANI")
            {
                //   Log.Error(source.Name + " is not a valid animation file");
                return(false);
            }

            // Read name and length
            model.AnimationName = source.ReadCString();
            model.NameHash      = model.AnimationName.GetHashCode();
            model.Length        = source.Read <float>();
            model.Tracks.Clear();

            int tracks = source.Read <int>();

            memoryUse += tracks * Unsafe.SizeOf <AnimationTrack>();

            // Read tracks
            for (int i = 0; i < tracks; ++i)
            {
                AnimationTrack newTrack = model.CreateTrack(source.ReadCString());
                newTrack.channelMask_ = source.Read <byte>();

                int keyFrames = source.Read <int>();
                newTrack.keyFrames_ = new FastList <AnimationKeyFrame>(keyFrames);
                memoryUse          += keyFrames * Unsafe.SizeOf <AnimationKeyFrame>();

                // Read keyframes of the track
                for (int j = 0; j < keyFrames; ++j)
                {
                    AnimationKeyFrame newKeyFrame = new AnimationKeyFrame();
                    newKeyFrame.time_ = source.Read <float>();
                    if ((newTrack.channelMask_ & Animation.CHANNEL_POSITION) != 0)
                    {
                        newKeyFrame.position_ = source.Read <vec3>();
                    }
                    if ((newTrack.channelMask_ & Animation.CHANNEL_ROTATION) != 0)
                    {
                        Quat r = source.Read <Quat>();
                        newKeyFrame.rotation_ = new quat(r.W, r.X, r.Y, r.Z);// source.Read<quat>();
                    }

                    if ((newTrack.channelMask_ & Animation.CHANNEL_SCALE) != 0)
                    {
                        newKeyFrame.scale_ = source.Read <vec3>();
                    }
                    newTrack.AddKeyFrame(ref newKeyFrame);
                }
            }

            model.MemoryUse = memoryUse;
            return(true);
        }
Beispiel #2
0
        public void AddKeyFrame(ref AnimationKeyFrame keyFrame)
        {
            bool needSort = keyFrames_.Count > 0 ? keyFrames_[keyFrames_.Count - 1].time_ > keyFrame.time_ : false;

            keyFrames_.Add(keyFrame);
            if (needSort)
            {
                keyFrames_.Sort(CompareKeyFrames);
            }
        }
Beispiel #3
0
 public void SetKeyFrame(int index, ref AnimationKeyFrame keyFrame)
 {
     if (index < keyFrames_.Count)
     {
         keyFrames_[index] = keyFrame;
         keyFrames_.Sort(CompareKeyFrames);
     }
     else if (index == keyFrames_.Count)
     {
         AddKeyFrame(ref keyFrame);
     }
 }
Beispiel #4
0
 public void InsertKeyFrame(int index, ref AnimationKeyFrame keyFrame)
 {
     keyFrames_.Insert(index, keyFrame);
     keyFrames_.Sort(CompareKeyFrames);
 }
Beispiel #5
0
 static int CompareKeyFrames(AnimationKeyFrame lhs, AnimationKeyFrame rhs)
 {
     return(Math.Sign(lhs.time_ - rhs.time_));
 }