예제 #1
0
 public void DrawMesh(Matrix world, Avatar binding)
 {
     this.Sprites.Add(new _3DSprite {
         Effect = _3DSpriteEffect.CHARACTER,
         Geometry = binding,
         World = world
     });
 }
예제 #2
0
 public Avatar(Avatar old)
 {
     this.BaseSkeleton = old.BaseSkeleton.Clone();
     this.Skeleton = old.BaseSkeleton.Clone();
     for (int i = 0; i < old.Bindings.Count(); i++)
     {
         AvatarBindingInstance oldb = old.Bindings[i];
         Bindings.Add(new AvatarBindingInstance()
         {
             Mesh = oldb.Mesh,
             Texture = oldb.Texture
         });
     }
     for (int i = 0; i < old.Accessories.Count(); i++)
     {
         this.Accessories.Add(old.Accessories.Keys.ElementAt(i), old.Accessories.Values.ElementAt(i));
     } //just shallow copy the binding and accessory list, as the data inside isn't going to change any time soon...
 }
예제 #3
0
        /// <summary>
        /// Runs an animation.
        /// </summary>
        /// <param name="avatar">The avatar to run animation for.</param>
        /// <param name="animation">The animation to run.</param>
        /// <returns>Handle to the animation run.</returns>
        public AnimationHandle RunAnimation(Avatar avatar, Animation animation)
        {
            var instance = new AnimationHandle(this);
            instance.Animation = animation;
            instance.Avatar = avatar;

            Animations.Add(instance);
            return instance;
        }
예제 #4
0
        /// <summary>
        /// Renders an animation's frame.
        /// </summary>
        /// <param name="avatar">The avatar which the animation is run for.</param>
        /// <param name="animation">The animation.</param>
        /// <param name="frame">Frame number in animation.</param>
        /// <param name="fraction"></param>
        /// <returns>Status of animation.</returns>
        public static AnimationStatus RenderFrame(Avatar avatar, Animation animation, int frame, float fraction)
        {
            if (frame < 0 || frame > animation.NumFrames) return AnimationStatus.COMPLETED;

            var numDone = 0;

            foreach (var motion in animation.Motions)
            {
                var bone = avatar.Skeleton.GetBone(motion.BoneName);
                if (bone == null) continue; //fixes bugs with missing bones.. need to find out what R_FINGERPOLY0 is though.

                var motionFrame = frame;
                if (frame >= motion.FrameCount)
                {
                    numDone++;
                    motionFrame = (int)motion.FrameCount - 1;
                }

                if (motion.HasTranslation)
                {
                    if (fraction >= 0)
                    {
                        var trans1 = animation.Translations[motion.FirstTranslationIndex + motionFrame];
                        var trans2 = (frame + 1 >= motion.FrameCount) ? trans1 : animation.Translations[motion.FirstTranslationIndex + motionFrame+1];
                        bone.Translation = Vector3.Lerp(trans1, trans2, fraction);
                    }
                    else
                    {
                        bone.Translation = animation.Translations[motion.FirstTranslationIndex + motionFrame];
                    }
                }
                if (motion.HasRotation)
                {
                    if (fraction >= 0)
                    {
                        var quat1 = animation.Rotations[motion.FirstRotationIndex + motionFrame];
                        var quat2 = (frame + 1 >= motion.FrameCount) ? quat1 : animation.Rotations[motion.FirstRotationIndex + motionFrame + 1];
                        bone.Rotation = Quaternion.Slerp(quat1, quat2, fraction);
                    }
                    else
                    {
                        bone.Rotation = animation.Rotations[motion.FirstRotationIndex + motionFrame];
                    }
                }
            }

            avatar.ReloadSkeleton();
            return AnimationStatus.IN_PROGRESS;
        }