/// <summary> /// This computes the rig transforms from rigid bodies to ragdoll bones. Must be called before any transforms are made on rigid bodies! /// </summary> private void InitRigTransforms() { if (MyFakes.ENABLE_RAGDOLL_DEBUG) { Debug.WriteLine("MyRagdollMapper.InitRigTransforms"); MyLog.Default.WriteLine("MyRagdollMapper.InitRigTransforms"); } m_ragdollRigidBodiesAbsoluteTransforms = new Matrix[Ragdoll.RigidBodies.Count]; m_bodyToBoneRigTransforms = new Matrix[Ragdoll.RigidBodies.Count]; m_boneToBodyRigTransforms = new Matrix[Ragdoll.RigidBodies.Count]; BodiesRigTransfoms = new Matrix[Ragdoll.RigidBodies.Count]; BodiesRigTransfomsInverted = new Matrix[Ragdoll.RigidBodies.Count]; foreach (var bodyIndex in m_rigidBodiesToBonesIndices.Keys) { MyCharacterBone bone = m_bones[m_rigidBodiesToBonesIndices[bodyIndex].First()]; Matrix boneRig = bone.GetAbsoluteRigTransform(); Matrix rigidBodyTransform = Ragdoll.RigTransforms[bodyIndex]; Matrix bodyToBone = boneRig * Matrix.Invert(rigidBodyTransform); Matrix boneToBody = rigidBodyTransform * Matrix.Invert(boneRig); m_bodyToBoneRigTransforms[bodyIndex] = bodyToBone; m_boneToBodyRigTransforms[bodyIndex] = boneToBody; BodiesRigTransfoms[bodyIndex] = rigidBodyTransform; BodiesRigTransfomsInverted[bodyIndex] = Matrix.Invert(rigidBodyTransform); Debug.Assert(m_bodyToBoneRigTransforms[bodyIndex].IsValid(), "Ragdoll body to bone transform is invalid!"); Debug.Assert(m_boneToBodyRigTransforms[bodyIndex].IsValid(), "Ragdoll bone to body transform is invalid!"); Debug.Assert(BodiesRigTransfoms[bodyIndex].IsValid(), "Ragdoll rig transform is invalid!"); Debug.Assert(BodiesRigTransfomsInverted[bodyIndex].IsValid(), "Ragdoll inverted rig transform is invalid!"); } BonesRigTransforms = new Matrix[m_bones.Length]; BonesRigTransformsInverted = new Matrix[m_bones.Length]; for (int i = 0; i < BonesRigTransforms.Length; i++) { BonesRigTransforms[i] = m_bones[i].GetAbsoluteRigTransform(); BonesRigTransformsInverted[i] = Matrix.Invert(m_bones[i].GetAbsoluteRigTransform()); Debug.Assert(BonesRigTransforms[i].IsValid(), "Bone rig transform is invalid!"); Debug.Assert(BonesRigTransformsInverted[i].IsValid(), "Bone inverted rig transform is invalid!"); } if (MyFakes.ENABLE_RAGDOLL_DEBUG) { Debug.WriteLine("MyRagdollMapper.InitRigTransforms - END"); MyLog.Default.WriteLine("MyRagdollMapper.InitRigTransforms - END"); } }
private unsafe void ApplyWeaponBouncing(MyHandItemDefinition handItemDefinition, ref MatrixD weaponMatrixLocal, float fpsBounceMultiplier, float ironsightWeight) { if (base.Character.AnimationController.CharacterBones.IsValidIndex <MyCharacterBone>(base.Character.SpineBoneIndex)) { Vector3 * vectorPtr1; float z; bool flag = base.Character.ControllerInfo.IsLocallyControlled(); bool flag2 = (base.Character.IsInFirstPersonView || base.Character.ForceFirstPersonCamera) & flag; Vector3 translation = base.Character.AnimationController.CharacterBonesSorted[0].Translation; MyCharacterBone bone1 = base.Character.AnimationController.CharacterBones[base.Character.SpineBoneIndex]; Vector3 vector2 = bone1.AbsoluteTransform.Translation - translation; this.m_spineRestPositionX.Add((double)vector2.X); this.m_spineRestPositionY.Add((double)vector2.Y); this.m_spineRestPositionZ.Add((double)vector2.Z); Vector3 position = bone1.GetAbsoluteRigTransform().Translation; Vector3 vector4 = new Vector3((double)position.X, this.m_spineRestPositionY.Get(), (double)position.Z); Vector3 vector5 = (vector2 - vector4) * fpsBounceMultiplier; if (!flag2) { z = 0f; } else { vectorPtr1 = (Vector3 *)ref vector5; z = vector5.Z; } vectorPtr1->Z = z; this.m_sprintStatusWeight += base.Character.IsSprinting ? this.m_sprintStatusGainSpeed : -this.m_sprintStatusGainSpeed; this.m_sprintStatusWeight = MathHelper.Clamp(this.m_sprintStatusWeight, 0f, 1f); if (!flag2) { vector5 *= handItemDefinition.AmplitudeMultiplier3rd; } else { vector5 *= 1f + (Math.Max((float)0f, (float)(handItemDefinition.RunMultiplier - 1f)) * this.m_sprintStatusWeight); float *singlePtr1 = (float *)ref vector5.X; singlePtr1[0] *= handItemDefinition.XAmplitudeScale; float *singlePtr2 = (float *)ref vector5.Y; singlePtr2[0] *= handItemDefinition.YAmplitudeScale; float *singlePtr3 = (float *)ref vector5.Z; singlePtr3[0] *= handItemDefinition.ZAmplitudeScale; } weaponMatrixLocal.Translation += vector5; BoundingBox localAABB = base.Character.PositionComp.LocalAABB; if ((ironsightWeight < 1f) && (weaponMatrixLocal.M43 > (((position.Z + translation.Z) - (localAABB.Max.Z * 0.5)) - (base.Character.HandItemDefinition.RightHand.Translation.Z * 0.75)))) { double num = ((position.Z + translation.Z) - (localAABB.Max.Z * 0.5)) - (base.Character.HandItemDefinition.RightHand.Translation.Z * 0.75); weaponMatrixLocal.M43 = MathHelper.Lerp(num, weaponMatrixLocal.M43, (double)ironsightWeight); } if (MyDebugDrawSettings.ENABLE_DEBUG_DRAW && MyDebugDrawSettings.DEBUG_DRAW_CHARACTER_TOOLS) { MatrixD?cameraViewMatrix = null; MyDebugDrawHelper.DrawNamedPoint(Vector3D.Transform(position, base.Character.WorldMatrix), "spine", new Color?(Color.Gray), cameraViewMatrix); } } }
/// <summary> /// This computes the rig transforms from rigid bodies to ragdoll bones. Must be called before any transforms are made on rigid bodies! /// </summary> private void InitRigTransforms() { m_ragdollRigidBodiesAbsoluteTransforms = new Matrix[Ragdoll.RigidBodies.Count]; m_bodyToBoneRigTransforms = new Matrix[Ragdoll.RigidBodies.Count]; m_boneToBodyRigTransforms = new Matrix[Ragdoll.RigidBodies.Count]; BodiesRigTransfoms = new Matrix[Ragdoll.RigidBodies.Count]; BodiesRigTransfomsInverted = new Matrix[Ragdoll.RigidBodies.Count]; foreach (var bodyIndex in m_rigidBodiesToBonesIndices.Keys) { MyCharacterBone bone = m_bones[m_rigidBodiesToBonesIndices[bodyIndex].First()]; Matrix boneRig = bone.GetAbsoluteRigTransform(); Matrix rigidBodyTransform = Ragdoll.RigidBodies[bodyIndex].GetRigidBodyMatrix(); Matrix bodyToBone = boneRig * Matrix.Invert(rigidBodyTransform); Matrix boneToBody = rigidBodyTransform * Matrix.Invert(boneRig); m_bodyToBoneRigTransforms[bodyIndex] = bodyToBone; m_boneToBodyRigTransforms[bodyIndex] = boneToBody; BodiesRigTransfoms[bodyIndex] = rigidBodyTransform; BodiesRigTransfomsInverted[bodyIndex] = Matrix.Invert(rigidBodyTransform); Debug.Assert(m_bodyToBoneRigTransforms[bodyIndex].IsValid(), "Ragdoll body to bone transform is invalid!"); Debug.Assert(m_boneToBodyRigTransforms[bodyIndex].IsValid(), "Ragdoll bone to body transform is invalid!"); Debug.Assert(BodiesRigTransfoms[bodyIndex].IsValid(), "Ragdoll rig transform is invalid!"); Debug.Assert(BodiesRigTransfomsInverted[bodyIndex].IsValid(), "Ragdoll inverted rig transform is invalid!"); } BonesRigTransforms = new Matrix[m_bones.Count]; BonesRigTransformsInverted = new Matrix[m_bones.Count]; for (int i = 0; i < BonesRigTransforms.Length; i++) { BonesRigTransforms[i] = m_bones[i].GetAbsoluteRigTransform(); BonesRigTransformsInverted[i] = Matrix.Invert(m_bones[i].GetAbsoluteRigTransform()); Debug.Assert(BonesRigTransforms[i].IsValid(), "Bone rig transform is invalid!"); Debug.Assert(BonesRigTransformsInverted[i].IsValid(), "Bone inverted rig transform is invalid!"); } }
/// <summary> /// This computes the rig transforms from rigid bodies to ragdoll bones. Must be called before any transforms are made on rigid bodies! /// </summary> private void InitRigTransforms() { m_bodyToBoneRigTransforms = new Matrix[m_ragdoll.RigidBodies.Count]; m_boneToBodyRigTransforms = new Matrix[m_ragdoll.RigidBodies.Count]; BodiesRigTransfoms = new Matrix[m_ragdoll.RigidBodies.Count]; BodiesRigTransfomsInverted = new Matrix[m_ragdoll.RigidBodies.Count]; foreach (var bodyIndex in m_rigidBodiesToBonesIndices.Keys) { MyCharacterBone bone = m_bones[m_rigidBodiesToBonesIndices[bodyIndex].First()]; Matrix boneRig = bone.GetAbsoluteRigTransform(); Matrix rigidBodyTransform = m_ragdoll.RigidBodies[bodyIndex].GetRigidBodyMatrix(); Matrix bodyToBone = boneRig * Matrix.Invert(rigidBodyTransform); Matrix boneToBody = rigidBodyTransform * Matrix.Invert(boneRig); m_bodyToBoneRigTransforms[bodyIndex] = bodyToBone; m_boneToBodyRigTransforms[bodyIndex] = boneToBody; BodiesRigTransfoms[bodyIndex] = rigidBodyTransform; BodiesRigTransfomsInverted[bodyIndex] = Matrix.Invert(rigidBodyTransform); } BonesRigTransforms = new Matrix[m_bones.Count]; BonesRigTransformsInverted = new Matrix[m_bones.Count]; for (int i = 0; i < BonesRigTransforms.Length; i++) { BonesRigTransforms[i] = m_bones[i].GetAbsoluteRigTransform(); BonesRigTransformsInverted[i] = Matrix.Invert(m_bones[i].GetAbsoluteRigTransform()); } }