/// <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");
            }
        }
Esempio n. 2
0
 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);
         }
     }
 }
Esempio n. 3
0
        /// <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!");
            }
        }
Esempio n. 4
0
        /// <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());
            }
        }