Пример #1
0
        public void SetSecondaryAnimation(SkinnedModelAnimation animation, GameTime gameTime) // = null
        {
            /*PreviousAnimation = animation;
             * PreviousBoneAnimationInstances.Clear();
             * PreviousBoneAnimationInstances.AddRange(BoneAnimationInstances);*/
            if (animation != null)
            {
                SecondaryAnimation = animation;

                SecondaryBoneAnimationInstances.Clear();
                foreach (var boneAnimation in animation.BoneAnimations)
                {
                    BoneAnimationInstance boneAnimationInstance = new BoneAnimationInstance();
                    boneAnimationInstance.BoneAnimation       = boneAnimation;
                    boneAnimationInstance.Updated             = false;
                    boneAnimationInstance.AdditionalTransform = Matrix.Identity;
                    //boneAnimationInstance.PreviousBoneAnimationInstance = PreviousBoneAnimationInstances.FirstOrDefault(ni => ni.BoneAnimation.Name == boneAnimation.Name);
                    SecondaryBoneAnimationInstances.Add(boneAnimationInstance);
                }

                foreach (var boneAnimationInstance in SecondaryBoneAnimationInstances)
                {
                    boneAnimationInstance.Parent = SecondaryBoneAnimationInstances.FirstOrDefault(ni => ni.BoneAnimation == boneAnimationInstance.BoneAnimation.Parent);
                }

                foreach (var meshInstance in MeshInstances)
                {
                    //meshInstance.BoneInstances.Clear();
                    for (int i = 0; i < meshInstance.BoneInstances.Count; i++)//foreach (var boneInstance in meshInstance.BoneInstances)
                    {
                        var boneInstance = meshInstance.BoneInstances[i];
                        var bone         = meshInstance.Mesh.Bones[i];
                        boneInstance.SecondaryBoneAnimationInstance = SecondaryBoneAnimationInstances.FirstOrDefault(ni => ni.BoneAnimation.Name == bone.Name);
                        meshInstance.BoneInstances[i] = boneInstance;
                    }
                }
            }
            else
            {
                SecondaryBoneAnimationInstances.Clear();

                foreach (var boneAnimationInstance in SecondaryBoneAnimationInstances)
                {
                    boneAnimationInstance.Parent = SecondaryBoneAnimationInstances.FirstOrDefault(ni => ni.BoneAnimation == boneAnimationInstance.BoneAnimation.Parent);
                }

                foreach (var meshInstance in MeshInstances)
                {
                    //meshInstance.BoneInstances.Clear();
                    for (int i = 0; i < meshInstance.BoneInstances.Count; i++)//foreach (var boneInstance in meshInstance.BoneInstances)
                    {
                        var boneInstance = meshInstance.BoneInstances[i];
                        boneInstance.SecondaryBoneAnimationInstance = null;
                        meshInstance.BoneInstances[i] = boneInstance;
                    }
                }
            }
        }
Пример #2
0
        public void SetAnimation(SkinnedModelAnimation animation, GameTime gameTime) // = null
        {
            if (gameTime != null)
            {
                TimeAnimationChanged = gameTime.TotalGameTime;
                //Debug.Print(TimeAnimationChanged.ToString());
            }

            PreviousAnimation = animation;
            PreviousBoneAnimationInstances.Clear();
            PreviousBoneAnimationInstances.AddRange(BoneAnimationInstances);

            Animation = animation;

            BoneAnimationInstances.Clear();
            foreach (var boneAnimation in animation.BoneAnimations)
            {
                BoneAnimationInstance boneAnimationInstance = new BoneAnimationInstance();
                boneAnimationInstance.BoneAnimation                 = boneAnimation;
                boneAnimationInstance.Updated                       = false;
                boneAnimationInstance.AdditionalTransform           = Matrix.Identity;
                boneAnimationInstance.PreviousBoneAnimationInstance = PreviousBoneAnimationInstances.FirstOrDefault(ni => ni.BoneAnimation.Name == boneAnimation.Name);
                BoneAnimationInstances.Add(boneAnimationInstance);
            }

            foreach (var boneAnimationInstance in BoneAnimationInstances)
            {
                boneAnimationInstance.Parent = BoneAnimationInstances.FirstOrDefault(ni => ni.BoneAnimation == boneAnimationInstance.BoneAnimation.Parent);
            }

            foreach (var meshInstance in MeshInstances)
            {
                meshInstance.BoneInstances.Clear();
                foreach (var bone in meshInstance.Mesh.Bones)
                {
                    var boneInstance = new BoneInstance();
                    boneInstance.Bone = bone;
                    boneInstance.BoneAnimationInstance = BoneAnimationInstances.FirstOrDefault(ni => ni.BoneAnimation.Name == bone.Name);
                    meshInstance.BoneInstances.Add(boneInstance);
                }
            }
        }