protected override void CalculateTransforms(float distance) { ProfilerShort.Begin("MyCharacter.CalculateTransforms"); base.CalculateTransforms(distance); if (m_headBoneIndex >= 0 && AnimationController.CharacterBones != null && (IsInFirstPersonView || ForceFirstPersonCamera) && ControllerInfo.IsLocallyControlled() && !IsBot) { Vector3 headHorizontalTranslation = AnimationController.CharacterBones[m_headBoneIndex].AbsoluteTransform.Translation; headHorizontalTranslation.Y = 0; MyCharacterBone.TranslateAllBones(AnimationController.CharacterBones, -headHorizontalTranslation); } VRageRender.MyRenderProxy.GetRenderProfiler().StartProfilingBlock("Calculate Hand IK"); if (this == MySession.Static.ControlledEntity) { // (OM) Note: only controlled character can get it's aimed point from camera, otherwise all character's will aim the same direction // set the aimed point explicitly using AimedPoint property m_aimedPoint = GetAimedPointFromCamera(); } VRageRender.MyRenderProxy.GetRenderProfiler().StartNextBlock("Update anim IK"); AnimationController.UpdateInverseKinematics(); // since we already have absolute transforms VRageRender.MyRenderProxy.GetRenderProfiler().StartNextBlock("UpdateLeftHandItemPosition"); if (m_leftHandItem != null) { UpdateLeftHandItemPosition(); } if (m_currentWeapon != null && WeaponPosition != null && m_handItemDefinition != null) { WeaponPosition.Update(); //mainly IK and some zoom + ironsight stuff if (m_handItemDefinition.SimulateLeftHand && m_leftHandIKStartBone != -1 && m_leftHandIKEndBone != -1) { MatrixD leftHand = (MatrixD)m_handItemDefinition.LeftHand * ((MyEntity)m_currentWeapon).WorldMatrix; CalculateHandIK(m_leftHandIKStartBone, m_leftForearmBone, m_leftHandIKEndBone, ref leftHand); } if (m_handItemDefinition.SimulateRightHand && m_rightHandIKStartBone != -1 && m_rightHandIKEndBone != -1 && IsSitting == false) { MatrixD rightHand = (MatrixD)m_handItemDefinition.RightHand * ((MyEntity)m_currentWeapon).WorldMatrix; CalculateHandIK(m_rightHandIKStartBone, m_rightForearmBone, m_rightHandIKEndBone, ref rightHand); } } MyRenderProxy.GetRenderProfiler().StartNextBlock("UpdateTransformations"); AnimationController.UpdateTransformations(); MyRenderProxy.GetRenderProfiler().EndProfilingBlock(); ProfilerShort.End(); }
protected override void CalculateTransforms(float distance) { ProfilerShort.Begin("MyCharacter.CalculateTransforms"); base.CalculateTransforms(distance); if (m_headBoneIndex >= 0 && AnimationController.CharacterBones != null && (IsInFirstPersonView || ForceFirstPersonCamera) && ControllerInfo.IsLocallyControlled() && !IsBot) { Vector3 headHorizontalTranslation = AnimationController.CharacterBones[m_headBoneIndex].AbsoluteTransform.Translation; headHorizontalTranslation.Y = 0; MyCharacterBone.TranslateAllBones(AnimationController.CharacterBones, -headHorizontalTranslation); } VRageRender.MyRenderProxy.GetRenderProfiler().StartProfilingBlock("Calculate Hand IK"); if (this == MySession.Static.ControlledEntity) { // (OM) Note: only controlled character can get it's aimed point from camera, otherwise all character's will aim the same direction // set the aimed point explicitly using AimedPoint property m_aimedPoint = GetAimedPointFromCamera(); } VRageRender.MyRenderProxy.GetRenderProfiler().StartNextBlock("Update anim IK"); AnimationController.UpdateInverseKinematics(); // since we already have absolute transforms VRageRender.MyRenderProxy.GetRenderProfiler().StartNextBlock("UpdateLeftHandItemPosition"); if (m_leftHandItem != null) { UpdateLeftHandItemPosition(); } if (m_currentWeapon != null && WeaponPosition != null) { if (!MyPerGameSettings.CheckUseAnimationInsteadOfIK(m_currentWeapon)) { WeaponPosition.Update(); //mainly IK and some zoom + ironsight stuff if (m_handItemDefinition.SimulateLeftHand && m_leftHandIKStartBone != -1 && m_leftHandIKEndBone != -1 && (!UseAnimationForWeapon)) { MatrixD leftHand = (MatrixD)m_handItemDefinition.LeftHand * ((MyEntity)m_currentWeapon).WorldMatrix; CalculateHandIK(m_leftHandIKStartBone, m_leftForearmBone, m_leftHandIKEndBone, ref leftHand); } if (m_handItemDefinition.SimulateRightHand && m_rightHandIKStartBone != -1 && m_rightHandIKEndBone != -1 && (!UseAnimationForWeapon) && IsSitting == false) { MatrixD rightHand = (MatrixD)m_handItemDefinition.RightHand * ((MyEntity)m_currentWeapon).WorldMatrix; CalculateHandIK(m_rightHandIKStartBone, m_rightForearmBone, m_rightHandIKEndBone, ref rightHand); } } else { GetHeadMatrix(true); // CH: REMOVE ME! I'M A TERRIBLE HACK! Debug.Assert(m_rightHandItemBone != -1, "Invalid bone for weapon."); if (m_rightHandItemBone != -1) { //use animation for right hand item MyCharacterBone boneRightHand = AnimationController.CharacterBones[m_rightHandItemBone]; ((MyEntity)m_currentWeapon).PositionComp.WorldMatrix = boneRightHand.AbsoluteTransform * PositionComp.WorldMatrix; if (MyDebugDrawSettings.ENABLE_DEBUG_DRAW) { MyRenderProxy.DebugDrawAxis(((MyEntity)m_currentWeapon).PositionComp.WorldMatrix, 0.5f, false); } } } } else { if (WeaponPosition != null) { WeaponPosition.UpdateIkTransitions(); } GetHeadMatrix(true); // CH: REMOVE ME! I'M A TERRIBLE HACK! } VRageRender.MyRenderProxy.GetRenderProfiler().StartNextBlock("ComputeBoneTransform"); var characterBones = AnimationController.CharacterBones; if (characterBones == null) { return; } for (int i = 0; i < characterBones.Length; i++) { MyCharacterBone bone = characterBones[i]; bone.ComputeBoneTransform(); BoneRelativeTransforms[i] = bone.RelativeTransform; } VRageRender.MyRenderProxy.GetRenderProfiler().EndProfilingBlock(); ProfilerShort.End(); }