コード例 #1
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);
         }
     }
 }
コード例 #2
0
        private unsafe void UpdateGraphicalWeaponPosition3rd(MyHandItemDefinition handItemDefinition)
        {
            bool jetpackRunning = base.Character.JetpackRunning;
            MyAnimationControllerComponent animationController = base.Character.AnimationController;
            MatrixD xd = base.Character.GetHeadMatrix(false, !jetpackRunning, false, true, true) * base.Character.PositionComp.WorldMatrixInvScaled;

            if (animationController.CharacterBones.IsValidIndex <MyCharacterBone>(base.Character.HeadBoneIndex))
            {
                double *numPtr1 = (double *)ref xd.M42;
                numPtr1[0] += animationController.CharacterBonesSorted[0].Translation.Y;
            }
            MatrixD xd2 = handItemDefinition.ItemLocation3rd;
            MatrixD xd3 = handItemDefinition.ItemWalkingLocation3rd;
            MatrixD xd4 = handItemDefinition.ItemShootLocation3rd;
            MatrixD itemIronsightLocation = handItemDefinition.ItemIronsightLocation;
            MatrixD xd6 = animationController.CharacterBones.IsValidIndex <MyCharacterBone>(base.Character.WeaponBone) ? (this.GetWeaponRelativeMatrix() * animationController.CharacterBones[base.Character.WeaponBone].AbsoluteTransform) : this.GetWeaponRelativeMatrix();

            itemIronsightLocation.Translation = m_weaponIronsightTranslation;
            if (base.Character.CurrentWeapon is MyEngineerToolBase)
            {
                itemIronsightLocation.Translation = m_toolIronsightTranslation;
            }
            Vector4D vectord           = this.UpdateAndGetWeaponVariantWeights(handItemDefinition);
            MatrixD  weaponMatrixLocal = MatrixD.Normalize((MatrixD)((((vectord.X * xd2) + (vectord.Y * xd3)) + (vectord.Z * xd4)) + (vectord.W * itemIronsightLocation)));
            double   num = 0.0;

            if (handItemDefinition.ItemPositioning3rd == MyItemPositioningEnum.TransformFromData)
            {
                num += vectord.X;
            }
            if (handItemDefinition.ItemPositioningWalk3rd == MyItemPositioningEnum.TransformFromData)
            {
                num += vectord.Y;
            }
            if (handItemDefinition.ItemPositioningShoot3rd == MyItemPositioningEnum.TransformFromData)
            {
                num += vectord.Z;
            }
            if (handItemDefinition.ItemPositioningIronsight3rd == MyItemPositioningEnum.TransformFromData)
            {
                num += vectord.W;
            }
            num /= ((vectord.X + vectord.Y) + vectord.Z) + vectord.W;
            double num2 = 0.0;

            if (handItemDefinition.ItemPositioning3rd != MyItemPositioningEnum.TransformFromAnim)
            {
                num2 += vectord.X;
            }
            if (handItemDefinition.ItemPositioningWalk3rd != MyItemPositioningEnum.TransformFromAnim)
            {
                num2 += vectord.Y;
            }
            if (handItemDefinition.ItemPositioningShoot3rd != MyItemPositioningEnum.TransformFromAnim)
            {
                num2 += vectord.Z;
            }
            if (handItemDefinition.ItemPositioningIronsight3rd != MyItemPositioningEnum.TransformFromAnim)
            {
                num2 += vectord.W;
            }
            num2 /= ((vectord.X + vectord.Y) + vectord.Z) + vectord.W;
            this.ApplyWeaponBouncing(handItemDefinition, ref weaponMatrixLocal, (float)(1.0 - (0.95 * vectord.W)), 0f);
            double *numPtr2 = (double *)ref xd.M43;

            numPtr2[0] += (0.5 * weaponMatrixLocal.M43) * Math.Max(0.0, xd.M32);
            double *numPtr3 = (double *)ref xd.M42;

            numPtr3[0] += (0.5 * weaponMatrixLocal.M42) * Math.Max(0.0, xd.M32);
            double *numPtr4 = (double *)ref xd.M42;

            numPtr4[0] -= 0.25 * Math.Max(0.0, xd.M32);
            double *numPtr5 = (double *)ref xd.M43;

            numPtr5[0] -= 0.05 * Math.Min(0.0, xd.M32);
            double *numPtr6 = (double *)ref xd.M41;

            numPtr6[0] -= 0.25 * Math.Max(0.0, xd.M32);
            MatrixD            xd8           = weaponMatrixLocal * xd;
            MyEngineerToolBase currentWeapon = base.Character.CurrentWeapon as MyEngineerToolBase;

            if (currentWeapon != null)
            {
                currentWeapon.SensorDisplacement = (Vector3) - weaponMatrixLocal.Translation;
            }
            double  amount           = (num * this.m_currentAnimationToIkTime) / ((double)this.m_animationToIKDelay);
            MatrixD weaponAnimMatrix = MatrixD.Lerp(xd6, xd8, amount);

            this.UpdateScattering(ref weaponAnimMatrix, handItemDefinition);
            this.ApplyBackkick(ref weaponAnimMatrix);
            MatrixD matrix = weaponAnimMatrix * base.Character.WorldMatrix;

            this.GraphicalPositionWorld = matrix.Translation;
            this.ArmsIkWeight           = (float)num2;
            ((MyEntity)base.Character.CurrentWeapon).WorldMatrix = matrix;
            if (MyDebugDrawSettings.ENABLE_DEBUG_DRAW && MyDebugDrawSettings.DEBUG_DRAW_CHARACTER_TOOLS)
            {
                MyDebugDrawHelper.DrawNamedColoredAxis(xd6 * base.Character.WorldMatrix, 0.25f, "weapon anim " + (100.0 - (100.0 * amount)) + "%", new Color?(Color.Orange));
                MyDebugDrawHelper.DrawNamedColoredAxis(xd8 * base.Character.WorldMatrix, 0.25f, "weapon data " + (100.0 * amount) + "%", new Color?(Color.Magenta));
                MyDebugDrawHelper.DrawNamedColoredAxis(matrix, 0.25f, "weapon final", new Color?(Color.White));
            }
        }