From 16814dd8f18b51f5dd8841ae341847e117bb83b3 Mon Sep 17 00:00:00 2001 From: Kitto Flora Date: Thu, 2 Sep 2010 21:51:19 +0000 Subject: [PATCH] Fixes to JUMP system. --- .../Scenes/Animation/ScenePresenceAnimator.cs | 151 ++++++++++++++---- .../Region/Framework/Scenes/ScenePresence.cs | 66 +++++--- .../Physics/ChOdePlugin/ODECharacter.cs | 7 +- 3 files changed, 168 insertions(+), 56 deletions(-) diff --git a/OpenSim/Region/Framework/Scenes/Animation/ScenePresenceAnimator.cs b/OpenSim/Region/Framework/Scenes/Animation/ScenePresenceAnimator.cs index b847d8737a..99d9564ed2 100644 --- a/OpenSim/Region/Framework/Scenes/Animation/ScenePresenceAnimator.cs +++ b/OpenSim/Region/Framework/Scenes/Animation/ScenePresenceAnimator.cs @@ -58,7 +58,10 @@ namespace OpenSim.Region.Framework.Scenes.Animation private int m_animTickFall; // private int m_animTickJump; public int m_animTickJump; // ScenePresence has to see this to control +Z force - + public bool m_jumping = false; // Add for jumping + public float m_jumpVelocity = 0f; // Add for jumping + private int m_landing = 0; // Add for jumping + /// /// The scene presence that this animator applies to /// @@ -141,9 +144,11 @@ namespace OpenSim.Region.Framework.Scenes.Animation /// public string GetMovementAnimation() { +//Console.WriteLine("GMA-------"); //## const float FALL_DELAY = 0.33f; - const float PREJUMP_DELAY = 0.25f; - +//rm for jumping const float PREJUMP_DELAY = 0.25f; + const float PREJUMP_DELAY = 200f; // mS add for jumping + const float JUMP_PERIOD = 800f; // mS add for jumping #region Inputs AgentManager.ControlFlags controlFlags = (AgentManager.ControlFlags)m_scenePresence.AgentControlFlags; @@ -177,8 +182,7 @@ namespace OpenSim.Region.Framework.Scenes.Animation // Is the avatar trying to move? // bool moving = (move != Vector3.Zero); - bool jumping = m_animTickJump != 0; - +// rm for jumping bool jumping = m_animTickJump != 0; #endregion Inputs #region Flying @@ -187,6 +191,9 @@ namespace OpenSim.Region.Framework.Scenes.Animation { m_animTickFall = 0; m_animTickJump = 0; + m_jumping = false; //add for jumping flag + m_jumpVelocity = 0f; //add for jumping flag + actor.Selected = false; //add for jumping flag if (move.X != 0f || move.Y != 0f) { @@ -213,8 +220,10 @@ namespace OpenSim.Region.Framework.Scenes.Animation #region Falling/Floating/Landing - if (actor == null || !actor.IsColliding) +// rm for jumping if (actor == null || !actor.IsColliding) + if ((actor == null || !actor.IsColliding) && !m_jumping) // add for jumping { +//Console.WriteLine("FFL"); //## float fallElapsed = (float)(Environment.TickCount - m_animTickFall) / 1000f; float fallVelocity = (actor != null) ? actor.Velocity.Z : 0.0f; @@ -223,7 +232,8 @@ namespace OpenSim.Region.Framework.Scenes.Animation // Just started falling m_animTickFall = Environment.TickCount; } - else if (!jumping && fallElapsed > FALL_DELAY) +// else if (!jumping && fallElapsed > FALL_DELAY) + else if (!m_jumping && fallElapsed > FALL_DELAY) // add for jumping { // Falling long enough to trigger the animation return "FALLDOWN"; @@ -234,6 +244,67 @@ namespace OpenSim.Region.Framework.Scenes.Animation #endregion Falling/Floating/Landing + + #region Jumping // section added for jumping... + + Vector3 vj = Vector3.Zero; + int jumptime; + jumptime = Environment.TickCount - m_animTickJump; + + + if ((move.Z > 0f) && (!m_jumping)) + { +//Console.WriteLine("PJ {0}", jumptime); //## + // Start jumping, prejump + m_animTickFall = 0; + m_jumping = true; + actor.Selected = true; // borrowed for jmping flag + m_animTickJump = Environment.TickCount; + vj.Z = 0.35f; +m_jumpVelocity = 0.35f; + vj += actor.Velocity; +// #@ actor.Velocity = vj; + return "PREJUMP"; + } + + if(m_jumping) + { + if ( (jumptime > (JUMP_PERIOD * 1.5f)) && actor.IsColliding) + { +//Console.WriteLine("LA {0}", jumptime); //## + // end jumping + m_jumping = false; + actor.Selected = false; // borrowed for jumping flag +m_jumpVelocity = 0f; + m_animTickFall = Environment.TickCount; + return "LAND"; + } + else if (jumptime > JUMP_PERIOD) + { +//Console.WriteLine("JD {0}", jumptime); //## + // jump down + vj = actor.Velocity; + vj.Z = 0f; +m_jumpVelocity = 0f; +// #@ actor.Velocity = vj; + return "JUMP"; + } + else if (jumptime > PREJUMP_DELAY) + { +//Console.WriteLine("JU {0}", jumptime); //## + // jump up + m_jumping = true; + vj.Z = 10f; +m_jumpVelocity = 10f; + vj.X = actor.Velocity.X; + vj.Y = actor.Velocity.Y; +// #@ actor.Velocity = vj; + return "JUMP"; + } + } + + #endregion Jumping // end added section + #region Ground Movement if (m_movementAnimation == "FALLDOWN") @@ -245,11 +316,26 @@ namespace OpenSim.Region.Framework.Scenes.Animation } else if (m_movementAnimation == "LAND") { - float landElapsed = (float)(Environment.TickCount - m_animTickFall) / 1000f; - if ((m_animTickFall != 0) && (landElapsed <= FALL_DELAY)) +// rm jumping float landElapsed = (float)(Environment.TickCount - m_animTickFall) / 1000f; + int landElapsed = Environment.TickCount - m_animTickFall; // add for jumping +// rm jumping if ((m_animTickFall != 0) && (landElapsed <= FALL_DELAY)) +/* Try change ## + if ((m_animTickFall != 0) && (landElapsed <= 500)) // add for jumping return "LAND"; + */ + // NB if this is set too long a weird anim reset from some place prevents STAND from being sent to client + if ((m_animTickFall != 0) && (landElapsed <= 300)) // add for jumping + { +//Console.WriteLine("LAND"); //## + return "LAND"; + } + else + { +//Console.WriteLine("STAND"); //## + return "STAND"; + } } - +/* This section removed, replaced by jumping section m_animTickFall = 0; if (move.Z > 0f) @@ -279,27 +365,28 @@ namespace OpenSim.Region.Framework.Scenes.Animation { // Not jumping m_animTickJump = 0; - - if (move.X != 0f || move.Y != 0f) - { - // Walking / crouchwalking / running - if (move.Z < 0f) - return "CROUCHWALK"; - else if (m_scenePresence.SetAlwaysRun) - return "RUN"; - else - return "WALK"; - } + */ + // next section moved outside paren. and realigned for jumping + if (move.X != 0f || move.Y != 0f) + { + // Walking / crouchwalking / running + if (move.Z < 0f) + return "CROUCHWALK"; + else if (m_scenePresence.SetAlwaysRun) + return "RUN"; else - { - // Not walking - if (move.Z < 0f) - return "CROUCH"; - else - return "STAND"; - } + return "WALK"; } - +// rm for jumping else + else if (!m_jumping) // add for jumping + { + // Not walking + if (move.Z < 0f) + return "CROUCH"; + else + return "STAND"; + } + // end section realign for jumping #endregion Ground Movement return m_movementAnimation; @@ -311,15 +398,15 @@ namespace OpenSim.Region.Framework.Scenes.Animation public void UpdateMovementAnimations() { m_movementAnimation = GetMovementAnimation(); - if (m_movementAnimation == "PREJUMP" && !m_scenePresence.Scene.m_usePreJump) +/* if (m_movementAnimation == "PREJUMP" && !m_scenePresence.Scene.m_usePreJump) { // This was the previous behavior before PREJUMP TrySetMovementAnimation("JUMP"); } else - { + { removed for jumping */ TrySetMovementAnimation(m_movementAnimation); - } +// rm for jumping } } public UUID[] GetAnimationArray() diff --git a/OpenSim/Region/Framework/Scenes/ScenePresence.cs b/OpenSim/Region/Framework/Scenes/ScenePresence.cs index cd80eb0ce7..f682ee5948 100644 --- a/OpenSim/Region/Framework/Scenes/ScenePresence.cs +++ b/OpenSim/Region/Framework/Scenes/ScenePresence.cs @@ -1471,6 +1471,9 @@ namespace OpenSim.Region.Framework.Scenes if (actor.Flying != oldflying) update_movementflag = true; + if (m_animator.m_jumping) // add for jumping + update_movementflag = true; + if (q != m_bodyRot) { m_bodyRot = q; @@ -2580,6 +2583,7 @@ namespace OpenSim.Region.Framework.Scenes // m_log.Info("[AGENT]: Stop FLying"); //} } + /* This jumping section removed to SPA else if (!actor.Flying && actor.IsColliding) { if (direc.Z > 2.0f) @@ -2592,12 +2596,12 @@ namespace OpenSim.Region.Framework.Scenes { direc.Z *= 0.1f; // prejump } - /* Animations are controlled via GetMovementAnimation() in ScenePresenceAnimator.cs + / * Animations are controlled via GetMovementAnimation() in ScenePresenceAnimator.cs Animator.TrySetMovementAnimation("PREJUMP"); Animator.TrySetMovementAnimation("JUMP"); - */ + * / } - } + } */ } // TODO: Add the force instead of only setting it to support multiple forces per frame? @@ -3543,28 +3547,46 @@ namespace OpenSim.Region.Framework.Scenes /// public override void UpdateMovement() { - if (m_forceToApply.HasValue) - { + if (Animator!=null) // add for jumping + { // add for jumping + // if (!m_animator.m_jumping) // add for jumping + // { // add for jumping - Vector3 force = m_forceToApply.Value; - m_updateflag = true; - Velocity = force; + if (m_forceToApply.HasValue) // this section realigned + { - m_forceToApply = null; - } - else - { - if (m_isNudging) - { - Vector3 force = Vector3.Zero; + Vector3 force = m_forceToApply.Value; + m_updateflag = true; +if (m_animator.m_jumping) force.Z = m_animator.m_jumpVelocity; // add for jumping + Velocity = force; +//Console.WriteLine("UM1 {0}", Velocity); + m_forceToApply = null; + } + else + { + if (m_isNudging) + { + Vector3 force = Vector3.Zero; - m_updateflag = true; - Velocity = force; - m_isNudging = false; - m_updateCount = UPDATE_COUNT; //KF: Update anims to pickup "STAND" - } - } - } + m_updateflag = true; +if (m_animator.m_jumping) force.Z = m_animator.m_jumpVelocity; // add for jumping + Velocity = force; +//Console.WriteLine("UM2 {0}", Velocity); + m_isNudging = false; + m_updateCount = UPDATE_COUNT; //KF: Update anims to pickup "STAND" + } + else // add for jumping + { // add for jumping + Vector3 force = Vector3.Zero; // add for jumping +if (m_animator.m_jumping) force.Z = m_animator.m_jumpVelocity; // add for jumping +//Console.WriteLine("UM3 {0}", Velocity); + Velocity = force; // add for jumping + } + + } + // } // end realign + } // add for jumping + } // add for jumping /// /// Adds a physical representation of the avatar to the Physics plugin diff --git a/OpenSim/Region/Physics/ChOdePlugin/ODECharacter.cs b/OpenSim/Region/Physics/ChOdePlugin/ODECharacter.cs index 61c16b8734..0c79aa6297 100644 --- a/OpenSim/Region/Physics/ChOdePlugin/ODECharacter.cs +++ b/OpenSim/Region/Physics/ChOdePlugin/ODECharacter.cs @@ -90,6 +90,7 @@ namespace OpenSim.Region.Physics.OdePlugin public float walkDivisor = 1.3f; public float runDivisor = 0.8f; private bool flying = false; + private bool jumping = false; // add for jumping private bool m_iscolliding = false; private bool m_iscollidingGround = false; private bool m_wascolliding = false; @@ -229,7 +230,8 @@ namespace OpenSim.Region.Physics.OdePlugin public override bool Selected { - set { return; } +// set { return; } + set { jumping = value; } // add for jumping flag } public override float Buoyancy @@ -1018,7 +1020,8 @@ namespace OpenSim.Region.Physics.OdePlugin { // close, jump to lateral destination d.BodySetPosition(Body, _zeroPosition.X, _zeroPosition.Y, pos.Z); } - if (flying) +// if (flying) + if (flying || jumping) // add for jumping { vec.Z = (_target_velocity.Z - vel.Z) * (PID_D) + (_zeroPosition.Z - pos.Z) * PID_P; }