public void DrawMesh(Matrix world, Avatar binding) { this.Sprites.Add(new _3DSprite { Effect = _3DSpriteEffect.CHARACTER, Geometry = binding, World = world, ObjectID = ObjectID }); }
public void DrawMesh(Matrix world, Avatar binding, short objID, ushort room, Color color) { this.Sprites.Add(new _3DSprite { Effect = _3DSpriteEffect.CHARACTER, Geometry = binding, World = world, ObjectID = objID, Room = room, Color = color }); }
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... }
/// <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; }
/// <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> /// <param name="weight">The amount to apply this animation to the skeleton.</param> /// <returns>Status of animation.</returns> public static AnimationStatus RenderFrame(Avatar avatar, Animation animation, int frame, float fraction, float weight) { bool completed = (frame < 0 || frame > animation.NumFrames); frame = Math.Max(Math.Min(frame, animation.NumFrames), 0); 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) { Vector3 trans; if (fraction >= 0) { var trans1 = animation.Translations[motion.FirstTranslationIndex + motionFrame]; var trans2 = (frame + 1 >= motion.FrameCount) ? trans1 : animation.Translations[motion.FirstTranslationIndex + motionFrame+1]; trans = Vector3.Lerp(trans1, trans2, fraction); } else { trans = animation.Translations[motion.FirstTranslationIndex + motionFrame]; } if (weight == 1) bone.Translation = trans; else bone.Translation = Vector3.Lerp(bone.Translation, trans, weight); } if (motion.HasRotation) { Quaternion quat; if (fraction >= 0) { var quat1 = animation.Rotations[motion.FirstRotationIndex + motionFrame]; var quat2 = (frame + 1 >= motion.FrameCount) ? quat1 : animation.Rotations[motion.FirstRotationIndex + motionFrame + 1]; quat = Quaternion.Slerp(quat1, quat2, fraction); } else { quat = animation.Rotations[motion.FirstRotationIndex + motionFrame]; } if (weight == 1) bone.Rotation = quat; else bone.Rotation = Quaternion.Slerp(bone.Rotation, quat, weight); } } if (completed || frame+1 > animation.NumFrames) return AnimationStatus.COMPLETED; return AnimationStatus.IN_PROGRESS; }
/// <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> /// <param name="weight">The amount to apply this animation to the skeleton.</param> /// <returns>Status of animation.</returns> public static AnimationStatus RenderFrame(Avatar avatar, Animation animation, int frame, float fraction, float weight) { bool completed = (frame <0 || frame> animation.NumFrames); frame = Math.Max(Math.Min(frame, animation.NumFrames), 0); 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) { Vector3 trans; if (fraction >= 0) { var trans1 = animation.Translations[motion.FirstTranslationIndex + motionFrame]; var trans2 = (frame + 1 >= motion.FrameCount) ? trans1 : animation.Translations[motion.FirstTranslationIndex + motionFrame + 1]; trans = Vector3.Lerp(trans1, trans2, fraction); } else { trans = animation.Translations[motion.FirstTranslationIndex + motionFrame]; } if (weight == 1) { bone.Translation = trans; } else { bone.Translation = Vector3.Lerp(bone.Translation, trans, weight); } } if (motion.HasRotation) { Quaternion quat; if (fraction >= 0) { var quat1 = animation.Rotations[motion.FirstRotationIndex + motionFrame]; var quat2 = (frame + 1 >= motion.FrameCount) ? quat1 : animation.Rotations[motion.FirstRotationIndex + motionFrame + 1]; quat = Quaternion.Slerp(quat1, quat2, fraction); } else { quat = animation.Rotations[motion.FirstRotationIndex + motionFrame]; } if (weight == 1) { bone.Rotation = quat; } else { bone.Rotation = Quaternion.Slerp(bone.Rotation, quat, weight); } } } if (completed || frame + 1 > animation.NumFrames) { return(AnimationStatus.COMPLETED); } return(AnimationStatus.IN_PROGRESS); }