/// <summary>
        /// Sets the bones pose to ragdoll pose
        /// </summary>
        private void SimulateRagdoll()
        {
            //if (MyFakes.ENABLE_RAGDOLL_DEBUG) Debug.WriteLine("RagdollComponent.SimulateRagdoll");
            if (!MyPerGameSettings.EnableRagdollModels)
            {
                return;
            }
            if (Character.Physics == null || RagdollMapper == null)
            {
                return;
            }

            if (Character.Physics.Ragdoll == null || !Character.Physics.Ragdoll.InWorld || !RagdollMapper.IsActive)
            {
                return;
            }

            VRageRender.MyRenderProxy.GetRenderProfiler().StartProfilingBlock("Update Bones To Ragdoll");

            try
            {
                RagdollMapper.UpdateRagdollAfterSimulation();

                if (!Character.IsCameraNear && !MyFakes.ENABLE_PERMANENT_SIMULATIONS_COMPUTATION)
                {
                    return;
                }

                RagdollMapper.UpdateCharacterPose(Character.IsDead ? 1.0f : 0.1f, Character.IsDead ? 1.0f : 0.0f);

                RagdollMapper.DebugDraw(Character.WorldMatrix);
            }
            finally
            {
                VRageRender.MyRenderProxy.GetRenderProfiler().EndProfilingBlock();
            }

            // save bone changes
            VRageRender.MyRenderProxy.GetRenderProfiler().StartProfilingBlock("Save bones and pos update");

            var characterBones = Character.AnimationController.CharacterBones;

            for (int i = 0; i < characterBones.Length; i++)
            {
                MyCharacterBone bone = characterBones[i];
                Character.BoneRelativeTransforms[i] = bone.ComputeBoneTransform();
            }

            VRageRender.MyRenderProxy.GetRenderProfiler().EndProfilingBlock();
        }
Ejemplo n.º 2
0
 private void UpdateCharacterBones()
 {
     if (((this.RagdollMapper != null) && (this.RagdollMapper.Ragdoll != null)) && this.RagdollMapper.Ragdoll.InWorld)
     {
         this.RagdollMapper.UpdateCharacterPose(1f, 0f);
         this.RagdollMapper.DebugDraw(base.Character.WorldMatrix);
         MyCharacterBone[] characterBones = base.Character.AnimationController.CharacterBones;
         for (int i = 0; i < characterBones.Length; i++)
         {
             MyCharacterBone bone = characterBones[i];
             bone.ComputeBoneTransform();
             base.Character.BoneRelativeTransforms[i] = bone.RelativeTransform;
         }
     }
 }
Ejemplo n.º 3
0
        /// <summary>
        /// Sets the bones pose to ragdoll pose
        /// </summary>
        private void SimulateRagdoll()
        {
            if (!MyPerGameSettings.EnableRagdollModels)
            {
                return;
            }
            if (Character.Physics == null || RagdollMapper == null)
            {
                return;
            }

            if (Character.Physics.Ragdoll == null || !Character.Physics.Ragdoll.IsAddedToWorld || !RagdollMapper.IsActive)
            {
                return;
            }

            VRageRender.MyRenderProxy.GetRenderProfiler().StartProfilingBlock("Update Bones To Ragdoll");

            RagdollMapper.UpdateRagdollAfterSimulation();

            if (!Character.IsCameraNear && !MyFakes.ENABLE_PERMANENT_SIMULATIONS_COMPUTATION)
            {
                return;
            }

            RagdollMapper.UpdateCharacterPose(Character.IsDead ? 1.0f : 0.1f, Character.IsDead ? 1.0f : 0.0f);

            RagdollMapper.DebugDraw(Character.WorldMatrix);

            VRageRender.MyRenderProxy.GetRenderProfiler().EndProfilingBlock();

            // save bone changes
            VRageRender.MyRenderProxy.GetRenderProfiler().StartProfilingBlock("Save bones and pos update");

            for (int i = 0; i < Character.Bones.Count; i++)
            {
                MyCharacterBone bone = Character.Bones[i];
                Character.BoneRelativeTransforms[i] = bone.ComputeBoneTransform();
            }

            VRageRender.MyRenderProxy.GetRenderProfiler().EndProfilingBlock();
        }
        private void UpdateCharacterBones()
        {
            // save bone changes
            VRageRender.MyRenderProxy.GetRenderProfiler().StartProfilingBlock("Save bones and pos update");

            if (RagdollMapper != null && RagdollMapper.Ragdoll != null && RagdollMapper.Ragdoll.InWorld)
            {
                RagdollMapper.UpdateCharacterPose(Character.IsDead ? 1.0f : 0.1f, Character.IsDead ? 1.0f : 0.0f);
                RagdollMapper.DebugDraw(Character.WorldMatrix);

                var characterBones = Character.AnimationController.CharacterBones;
                for (int i = 0; i < characterBones.Length; i++)
                {
                    MyCharacterBone bone = characterBones[i];
                    bone.ComputeBoneTransform();
                    Character.BoneRelativeTransforms[i] = bone.RelativeTransform;
                }
            }

            VRageRender.MyRenderProxy.GetRenderProfiler().EndProfilingBlock();
        }
        /// <summary>
        /// Updates feet bones positions, locations and rotation using IK, based on current character state
        /// </summary>
        private void UpdateFeet()
        {
            VRageRender.MyRenderProxy.GetRenderProfiler().StartProfilingBlock("UpdateFeetPlacement standing");

            if (MyDebugDrawSettings.ENABLE_DEBUG_DRAW && MyDebugDrawSettings.DEBUG_DRAW_CHARACTER_IK_SETTINGS)
            {
                MyFeetIKSettings feetDebugSettings;
                CharacterDefinition.FeetIKSettings.TryGetValue(MyDebugDrawSettings.DEBUG_DRAW_CHARACTER_IK_MOVEMENT_STATE, out feetDebugSettings);
                Matrix  leftFootMatrix          = Bones[m_leftAnkleBone].AbsoluteTransform;
                Matrix  rightFootMatrix         = Bones[m_rightAnkleBone].AbsoluteTransform;
                Vector3 upDirection             = WorldMatrix.Up;
                Vector3 leftFootGroundPosition  = new Vector3(leftFootMatrix.Translation.X, 0, leftFootMatrix.Translation.Z);
                Vector3 rightFootGroundPosition = new Vector3(rightFootMatrix.Translation.X, 0, rightFootMatrix.Translation.Z);
                Vector3 fromL = Vector3.Transform(leftFootGroundPosition, WorldMatrix);  // we get this position in the world
                Vector3 fromR = Vector3.Transform(rightFootGroundPosition, WorldMatrix);
                VRageRender.MyRenderProxy.DebugDrawLine3D(fromL, fromL + upDirection * feetDebugSettings.AboveReachableDistance, Color.Yellow, Color.Yellow, false);
                VRageRender.MyRenderProxy.DebugDrawLine3D(fromL, fromL - upDirection * feetDebugSettings.BelowReachableDistance, Color.Red, Color.Red, false);
                VRageRender.MyRenderProxy.DebugDrawLine3D(fromR, fromR + upDirection * feetDebugSettings.AboveReachableDistance, Color.Yellow, Color.Yellow, false);
                VRageRender.MyRenderProxy.DebugDrawLine3D(fromR, fromR - upDirection * feetDebugSettings.BelowReachableDistance, Color.Red, Color.Red, false);
                Matrix leftFoot  = Matrix.CreateScale(feetDebugSettings.FootSize) * WorldMatrix;
                Matrix rightFoot = Matrix.CreateScale(feetDebugSettings.FootSize) * WorldMatrix;
                leftFoot.Translation  = fromL;
                rightFoot.Translation = fromR;
                VRageRender.MyRenderProxy.DebugDrawOBB(leftFoot, Color.White, 1f, false, false);
                VRageRender.MyRenderProxy.DebugDrawOBB(rightFoot, Color.White, 1f, false, false);
            }

            MyFeetIKSettings feetSettings;

            if (CharacterDefinition.FeetIKSettings.TryGetValue(MovementState, out feetSettings))
            {
                // If Feet IK placement is enabled for this character movement state, let's calculate new foot positions
                if (feetSettings.Enabled)
                {
                    UpdateFeetPlacement(WorldMatrix.Up,
                                        feetSettings.BelowReachableDistance,
                                        feetSettings.AboveReachableDistance,
                                        feetSettings.VerticalShiftUpGain,
                                        feetSettings.VerticalShiftDownGain,
                                        feetSettings.FootSize);
                }
            }
            else if (Character.Bones[m_rootBone].Translation != Vector3.Zero)
            {
                // Otherwise remove the applied translation on the root bone
                Character.Bones[m_rootBone].Translation = Character.Bones[m_rootBone].Translation.LengthSquared() > 0.001f ? Character.Bones[m_rootBone].Translation * 0.1f : Vector3.Zero;
                Character.Bones[m_rootBone].ComputeAbsoluteTransform();
            }

            VRageRender.MyRenderProxy.GetRenderProfiler().EndProfilingBlock();

            VRageRender.MyRenderProxy.GetRenderProfiler().StartProfilingBlock("Storing bones transforms");

            // After the feet placement we need to save new bone transformations
            for (int i = 0; i < Bones.Count; i++)
            {
                MyCharacterBone bone = Bones[i];
                Character.BoneRelativeTransforms[i] = bone.ComputeBoneTransform();
            }

            VRageRender.MyRenderProxy.GetRenderProfiler().EndProfilingBlock();
        }