public void Bind(AnimatedModel m) { this.model = m; this.sprintAnimation = m["Sprint"]; this.runAnimation = m["Run"]; this.fallAnimation = m["Fall"]; m["Idle"].GetChannel(m.GetBoneIndex("ORG-spine")).Filter = delegate(Matrix spine) { float x; if (this.idleRotationBlend < 1.0f) { x = (this.Rotation - this.idleRotation.ClosestAngle(this.Rotation)) * Math.Max(0.0f, 1.0f - this.idleRotationBlend); } else if (this.idling) { x = this.Rotation - this.idleRotation.ClosestAngle(this.Rotation); } else { x = 0.0f; } return(spine * Matrix.CreateRotationY(x)); }; int headIndex = m.GetBoneIndex("ORG-head"); Matrix headBindPose = m.GetWorldBindTransform(headIndex) * Matrix.CreateTranslation(0, 0.1f, 0.25f); Func <SkinnedModel.Clip, Func <Matrix, Matrix> > cancelHeadBob = delegate(SkinnedModel.Clip clip) { int bone = headIndex; List <SkinnedModel.Channel> channels = new List <SkinnedModel.Channel>(); channels.Add(new SkinnedModel.Channel { BoneIndex = bone }); while (true) { int parent = m.SkeletonHierarchy[bone]; if (parent == -1) { break; } else { channels.Add(clip.GetChannel(parent) ?? new SkinnedModel.Channel { BoneIndex = bone }); } bone = parent; } return(delegate(Matrix x) { if (main.MinimizeCameraMovement) { Matrix world = Matrix.Identity; for (int i = 0; i < channels.Count; i++) { SkinnedModel.Channel channel = channels[i]; if (channel.Count == 0) { world = world * m.BindPose[channel.BoneIndex]; } else { world = world * channel.CurrentMatrix; } } return headBindPose * Matrix.Invert(world); } else { return x; } }); }; int cameraIndex = m.GetBoneIndex("Camera"); Func <SkinnedModel.Clip, Func <Matrix, Matrix> > cancelRotation = delegate(SkinnedModel.Clip clip) { int bone = cameraIndex; List <SkinnedModel.Channel> channels = new List <SkinnedModel.Channel>(); channels.Add(new SkinnedModel.Channel { BoneIndex = bone }); while (true) { int parent = m.SkeletonHierarchy[bone]; if (parent == -1) { break; } else { channels.Add(clip.GetChannel(parent) ?? new SkinnedModel.Channel { BoneIndex = bone }); } bone = parent; } return(delegate(Matrix x) { if ( #if VR this.main.VR || #endif this.main.MinimizeCameraMovement) { Matrix world = Matrix.Identity; for (int i = 0; i < channels.Count; i++) { SkinnedModel.Channel channel = channels[i]; if (channel.Count == 0) { world = world * m.BindPose[channel.BoneIndex]; } else { world = world * channel.CurrentMatrix; } } Matrix rot = Matrix.Invert(world) * Matrix.CreateRotationX((float)Math.PI * 0.5f); rot.Translation = x.Translation; return rot; } else { return x; } }); }; m["Run"].GetChannel(headIndex).Filter = cancelHeadBob(m["Run"]); m["RunLeft"].GetChannel(headIndex).Filter = cancelHeadBob(m["RunLeft"]); m["RunRight"].GetChannel(headIndex).Filter = cancelHeadBob(m["RunRight"]); m["RunLeftForward"].GetChannel(headIndex).Filter = cancelHeadBob(m["RunLeftForward"]); m["RunRightForward"].GetChannel(headIndex).Filter = cancelHeadBob(m["RunRightForward"]); m["Sprint"].GetChannel(headIndex).Filter = cancelHeadBob(m["Sprint"]); m["Slide"].GetChannel(cameraIndex).Filter = cancelRotation(m["Slide"]); m["WallRunLeft"].GetChannel(cameraIndex).Filter = cancelRotation(m["WallRunLeft"]); m["WallRunRight"].GetChannel(cameraIndex).Filter = cancelRotation(m["WallRunRight"]); m["TopOut"].GetChannel(cameraIndex).Filter = cancelRotation(m["TopOut"]); m["Land"].GetChannel(cameraIndex).Filter = cancelRotation(m["Land"]); m["LandHard"].GetChannel(cameraIndex).Filter = cancelRotation(m["LandHard"]); m["Idle"].GetChannel(m.GetBoneIndex("ORG-hips")).Filter = delegate(Matrix hips) { float x; if (this.idleRotationBlend < 1.0f) { x = (this.idleRotation.ClosestAngle(this.Rotation) - this.Rotation) * Math.Max(0.0f, 1.0f - this.idleRotationBlend); } else if (this.idling) { x = this.idleRotation.ClosestAngle(this.Rotation) - this.Rotation; } else { x = 0.0f; } return(hips * Matrix.CreateRotationZ(x)); }; this.relativeHeadBone = m.GetRelativeBoneTransform("ORG-head"); m["Swim"].Speed = 2.0f; m["SwimForward"].Speed = 2.0f; m["TurnLeft"].Speed = 2.0f; m["TurnRight"].Speed = 2.0f; m["WallRunStraight"].GetChannel(m.GetBoneIndex("ORG-hips")).Filter = delegate(Matrix hips) { hips.Translation += new Vector3(0, 1, 0); return(hips); }; }