From 76165fe054c1a4892f73965875bdb2811f15bc8f Mon Sep 17 00:00:00 2001 From: UbitUmarov Date: Wed, 13 Apr 2022 17:22:18 +0100 Subject: [PATCH] changes on converting agent movement flags to physics target velocity. --- .../Region/Framework/Scenes/ScenePresence.cs | 275 +++++++----------- 1 file changed, 110 insertions(+), 165 deletions(-) diff --git a/OpenSim/Region/Framework/Scenes/ScenePresence.cs b/OpenSim/Region/Framework/Scenes/ScenePresence.cs index 5177ccdaa7..5b4348c263 100644 --- a/OpenSim/Region/Framework/Scenes/ScenePresence.cs +++ b/OpenSim/Region/Framework/Scenes/ScenePresence.cs @@ -162,8 +162,6 @@ namespace OpenSim.Region.Framework.Scenes /// private readonly object m_completeMovementLock = new object(); -// private static readonly byte[] DEFAULT_TEXTURE = AvatarAppearance.GetDefaultTexture().GetBytes(); - private static readonly Array DIR_CONTROL_FLAGS = Enum.GetValues(typeof(Dir_ControlFlags)); private static readonly Vector3 HEAD_ADJUSTMENT = new Vector3(0f, 0f, 0.3f); /// @@ -175,7 +173,7 @@ namespace OpenSim.Region.Framework.Scenes /// issue #1716 /// public static readonly Vector3 SIT_TARGET_ADJUSTMENT = new Vector3(0.0f, 0.0f, 0.4f); - public bool LegacySitOffsets = true; + public readonly bool LegacySitOffsets = true; /// /// Movement updates for agents in neighboring regions are sent directly to clients. @@ -183,11 +181,11 @@ namespace OpenSim.Region.Framework.Scenes /// for things such as distance-based update prioritization /// this are the square of real distances /// - public static readonly float MOVEMENT = .25f; - public static readonly float SIGNIFICANT_MOVEMENT = 16.0f; - public static readonly float CHILDUPDATES_MOVEMENT = 100.0f; - public static readonly float CHILDAGENTSCHECK_MOVEMENT = 1024f; // 32m - public static readonly float CHILDUPDATES_TIME = 2000f; // min time between child updates (ms) + public const float MOVEMENT = .25f; + public const float SIGNIFICANT_MOVEMENT = 16.0f; + public const float CHILDUPDATES_MOVEMENT = 100.0f; + public const float CHILDAGENTSCHECK_MOVEMENT = 1024f; // 32m + public const float CHILDUPDATES_TIME = 2000f; // min time between child updates (ms) private UUID m_previusParcelUUID = UUID.Zero; private UUID m_currentParcelUUID = UUID.Zero; @@ -388,7 +386,44 @@ namespace OpenSim.Region.Framework.Scenes private float m_healRate = 1f; private float m_healRatePerFrame = 0.05f; - private readonly Vector3[] Dir_Vectors = new Vector3[12]; + private static readonly Vector3[] Dir_Vectors = new Vector3[6] { + new Vector3(1.0f, 0, 0), //FORWARD + new Vector3(-1.0f,0,0), //BACK + new Vector3(0, 1.0f,0), //LEFT + new Vector3(0,-1.0f,0), //RIGHT + new Vector3(0,0, 1.0f), //UP + new Vector3(0,0,-1.0f) //DOWN + }; + + private enum Dir_ControlFlags : uint + { + DIR_CONTROL_FLAG_FORWARD = AgentManager.ControlFlags.AGENT_CONTROL_AT_POS, + DIR_CONTROL_FLAG_BACK = AgentManager.ControlFlags.AGENT_CONTROL_AT_NEG, + DIR_CONTROL_FLAG_LEFT = AgentManager.ControlFlags.AGENT_CONTROL_LEFT_POS, + DIR_CONTROL_FLAG_RIGHT = AgentManager.ControlFlags.AGENT_CONTROL_LEFT_NEG, + DIR_CONTROL_FLAG_UP = AgentManager.ControlFlags.AGENT_CONTROL_UP_POS, + DIR_CONTROL_FLAG_DOWN = AgentManager.ControlFlags.AGENT_CONTROL_UP_NEG, + DIR_CONTROL_FLAG_FORWARD_NUDGE = AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_AT_POS, + DIR_CONTROL_FLAG_BACKWARD_NUDGE = AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_AT_NEG, + DIR_CONTROL_FLAG_LEFT_NUDGE = AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_LEFT_POS, + DIR_CONTROL_FLAG_RIGHT_NUDGE = AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_LEFT_NEG, + DIR_CONTROL_FLAG_UP_NUDGE = AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_UP_POS, + DIR_CONTROL_FLAG_DOWN_NUDGE = AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_UP_NEG + } + + const uint CONTROL_FLAG_NORM_MASK = (uint)(AgentManager.ControlFlags.AGENT_CONTROL_AT_POS | + AgentManager.ControlFlags.AGENT_CONTROL_AT_NEG | + AgentManager.ControlFlags.AGENT_CONTROL_LEFT_POS | + AgentManager.ControlFlags.AGENT_CONTROL_LEFT_NEG | + AgentManager.ControlFlags.AGENT_CONTROL_UP_POS | + AgentManager.ControlFlags.AGENT_CONTROL_UP_NEG); + + const uint CONTROL_FLAG_NUDGE_MASK = (uint)(AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_AT_POS | + AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_AT_NEG | + AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_LEFT_POS | + AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_LEFT_NEG | + AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_UP_POS | + AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_UP_NEG); protected int m_reprioritizationLastTime; protected bool m_reprioritizationBusy; @@ -459,25 +494,6 @@ namespace OpenSim.Region.Framework.Scenes } private List m_InTransitScriptStates = new List(); - /// - /// Implemented Control Flags - /// - private enum Dir_ControlFlags:uint - { - DIR_CONTROL_FLAG_FORWARD = AgentManager.ControlFlags.AGENT_CONTROL_AT_POS, - DIR_CONTROL_FLAG_BACK = AgentManager.ControlFlags.AGENT_CONTROL_AT_NEG, - DIR_CONTROL_FLAG_LEFT = AgentManager.ControlFlags.AGENT_CONTROL_LEFT_POS, - DIR_CONTROL_FLAG_RIGHT = AgentManager.ControlFlags.AGENT_CONTROL_LEFT_NEG, - DIR_CONTROL_FLAG_UP = AgentManager.ControlFlags.AGENT_CONTROL_UP_POS, - DIR_CONTROL_FLAG_DOWN = AgentManager.ControlFlags.AGENT_CONTROL_UP_NEG, - DIR_CONTROL_FLAG_FORWARD_NUDGE = AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_AT_POS, - DIR_CONTROL_FLAG_BACKWARD_NUDGE = AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_AT_NEG, - DIR_CONTROL_FLAG_LEFT_NUDGE = AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_LEFT_POS, - DIR_CONTROL_FLAG_RIGHT_NUDGE = AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_LEFT_NEG, - DIR_CONTROL_FLAG_UP_NUDGE = AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_UP_POS, - DIR_CONTROL_FLAG_DOWN_NUDGE = AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_UP_NEG - } - /// /// Position at which a significant movement was made /// @@ -1050,15 +1066,9 @@ namespace OpenSim.Region.Framework.Scenes public bool IsInLocalTransit {get; set; } - /// - /// Modifier for agent movement if we get an AGENT_CONTROL_STOP whilst walking or running - /// - /// - /// AGENT_CONTRL_STOP comes about if user holds down space key on viewers. - /// - private const float AgentControlStopSlowVel = 0.2f; // velocities - public const float AgentControlNudgeVel = 1.0f; // setting this diferent from normal as no effect currently + private const float AgentControlStopSlowVel = 0.2f; + public const float AgentControlNudgeVel = 0.5f; public const float AgentControlNormalVel = 1.0f; // old normal speed was tuned to match sl normal plus Fast modifiers @@ -1154,7 +1164,6 @@ namespace OpenSim.Region.Framework.Scenes AdjustKnownSeeds(); RegisterToClientEvents(); - SetDirectionVectors(); Appearance = appearance; @@ -1305,22 +1314,7 @@ namespace OpenSim.Region.Framework.Scenes // ControllingClient.OnAgentFOV += HandleAgentFOV; } - - private void SetDirectionVectors() - { - Dir_Vectors[0] = new Vector3(AgentControlNormalVel,0,0); //FORWARD - Dir_Vectors[1] = new Vector3(-AgentControlNormalVel,0,0);; //BACK - Dir_Vectors[2] = new Vector3(0,AgentControlNormalVel,0); //LEFT - Dir_Vectors[3] = new Vector3(0,-AgentControlNormalVel,0); //RIGHT - Dir_Vectors[4] = new Vector3(0,0,AgentControlNormalVel); //UP - Dir_Vectors[5] = new Vector3(0,0,-AgentControlNormalVel); //DOWN - Dir_Vectors[6] = new Vector3(AgentControlNudgeVel, 0f, 0f); //FORWARD_NUDGE - Dir_Vectors[7] = new Vector3(-AgentControlNudgeVel, 0f, 0f); //BACK_NUDGE - Dir_Vectors[8] = new Vector3(0f, AgentControlNudgeVel, 0f); //LEFT_NUDGE - Dir_Vectors[9] = new Vector3(0f, -AgentControlNudgeVel, 0f); //RIGHT_NUDGE - Dir_Vectors[10] = new Vector3(0f, 0f, AgentControlNudgeVel); //UP_Nudge - Dir_Vectors[11] = new Vector3(0f, 0f, -AgentControlNudgeVel); //DOWN_Nudge - } + #endregion #region Status Methods @@ -2231,7 +2225,6 @@ namespace OpenSim.Region.Framework.Scenes m_log.DebugFormat( "[SCENE PRESENCE]: Aborting CompleteMovement call for {0} in {1} as they are already root", Name, Scene.Name); - return; } @@ -2733,6 +2726,7 @@ namespace OpenSim.Region.Framework.Scenes int i = 0; bool DCFlagKeyPressed = false; Vector3 agent_control_v3 = Vector3.Zero; + float agent_velocity = AgentControlNormalVel; bool newFlying = false; @@ -2756,63 +2750,35 @@ namespace OpenSim.Region.Framework.Scenes if (ParentID == 0) { bool bAllowUpdateMoveToPosition = false; + uint currflags = (uint)flags & (CONTROL_FLAG_NUDGE_MASK | CONTROL_FLAG_NORM_MASK); + uint oldflags = MovementFlag & (CONTROL_FLAG_NUDGE_MASK | CONTROL_FLAG_NORM_MASK); + MovementFlag &= ~(CONTROL_FLAG_NUDGE_MASK | CONTROL_FLAG_NORM_MASK); - Vector3[] dirVectors; - - // use camera up angle when in mouselook and not flying or when holding the left mouse button down and not flying - // this prevents 'jumping' in inappropriate situations. -// if (!Flying && (m_mouseLook || m_leftButtonDown)) -// dirVectors = GetWalkDirectionVectors(); -// else - dirVectors = Dir_Vectors; - - // A DIR_CONTROL_FLAG occurs when the user is trying to move in a particular direction. - foreach (Dir_ControlFlags DCF in DIR_CONTROL_FLAGS) + if (currflags != 0) { - if (((uint)flags & (uint)DCF) != 0) - { - DCFlagKeyPressed = true; + DCFlagKeyPressed = true; + update_movementflag = (currflags ^ oldflags) != 0; + MovementFlag |= currflags; - try - { + if((currflags & CONTROL_FLAG_NUDGE_MASK) != 0) + { + currflags >>= 19; + agent_velocity = AgentControlNudgeVel; + } + + uint mask = 1; + for (i= 0; i < 6; ++i, mask <<= 1) + { + if((currflags & mask) != 0) agent_control_v3 += Dir_Vectors[i]; - //m_log.DebugFormat("[Motion]: {0}, {1}",i, dirVectors[i]); - } - catch (IndexOutOfRangeException) - { - // Why did I get this? - } - - if (((MovementFlag & (uint)DCF) == 0)) - { - //m_log.DebugFormat("[SCENE PRESENCE]: Updating MovementFlag for {0} with {1}", Name, DCF); - MovementFlag |= (uint)DCF; - update_movementflag = true; - } } + } + else + { + if(oldflags == 0) + bAllowUpdateMoveToPosition = true; else - { - if ((MovementFlag & (uint)DCF) != 0) - { - //m_log.DebugFormat("[SCENE PRESENCE]: Updating MovementFlag for {0} with lack of {1}", Name, DCF); - MovementFlag &= (uint)~DCF; - update_movementflag = true; - - /* - if ((DCF == Dir_ControlFlags.DIR_CONTROL_FLAG_FORWARD_NUDGE || DCF == Dir_ControlFlags.DIR_CONTROL_FLAG_BACKWARD_NUDGE) - && ((MovementFlag & (byte)nudgehack) == nudgehack)) - { - m_log.Debug("Removed Hack flag"); - } - */ - } - else - { - bAllowUpdateMoveToPosition = true; - } - } - - i++; + update_movementflag = true; } // Detect AGENT_CONTROL_STOP state changes @@ -2848,29 +2814,28 @@ namespace OpenSim.Region.Framework.Scenes if (Flying && !ForceFly) { // Need to stop in mid air if user holds down AGENT_CONTROL_STOP - // if (AgentControlStopActive) - // { - // agent_control_v3 = Vector3.Zero; - // } - // else + //if (AgentControlStopActive) + //{ + // agent_control_v3 = Vector3.Zero; + //} + //else { // Landing detection code - // Are the landing controls requirements filled? - bool controlland = (((flags & AgentManager.ControlFlags.AGENT_CONTROL_UP_NEG) != 0) || - ((flags & AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_UP_NEG) != 0)); + //bool controlland = (flags & (AgentManager.ControlFlags.AGENT_CONTROL_UP_NEG | AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_UP_NEG)) != 0; //m_log.Debug("[CONTROL]: " +flags); // Applies a satisfying roll effect to the avatar when flying. - if ((flags & AgentManager.ControlFlags.AGENT_CONTROL_TURN_LEFT) != 0 && (flags & AgentManager.ControlFlags.AGENT_CONTROL_YAW_POS) != 0) + const AgentManager.ControlFlags flagsLeft = AgentManager.ControlFlags.AGENT_CONTROL_TURN_LEFT | AgentManager.ControlFlags.AGENT_CONTROL_YAW_POS; + const AgentManager.ControlFlags flagsRight = AgentManager.ControlFlags.AGENT_CONTROL_TURN_RIGHT | AgentManager.ControlFlags.AGENT_CONTROL_YAW_NEG; + if ((flags & flagsLeft) == flagsLeft) { ApplyFlyingRoll( FLY_ROLL_RADIANS_PER_UPDATE, (flags & AgentManager.ControlFlags.AGENT_CONTROL_UP_POS) != 0, (flags & AgentManager.ControlFlags.AGENT_CONTROL_UP_NEG) != 0); } - else if ((flags & AgentManager.ControlFlags.AGENT_CONTROL_TURN_RIGHT) != 0 && - (flags & AgentManager.ControlFlags.AGENT_CONTROL_YAW_NEG) != 0) + else if ((flags & flagsRight) == flagsRight) { ApplyFlyingRoll( -FLY_ROLL_RADIANS_PER_UPDATE, @@ -2884,14 +2849,14 @@ namespace OpenSim.Region.Framework.Scenes } /* - if (Flying && IsColliding && controlland) - { - // nesting this check because LengthSquared() is expensive and we don't - // want to do it every step when flying. - if ((Velocity.LengthSquared() <= LAND_VELOCITYMAG_MAX)) - StopFlying(); - } - */ + if (Flying && IsColliding && controlland) + { + // nesting this check because LengthSquared() is expensive and we don't + // want to do it every step when flying. + if ((Velocity.LengthSquared() <= LAND_VELOCITYMAG_MAX)) + StopFlying(); + } + */ } } else if (IsColliding && agent_control_v3.Z < 0f) @@ -2927,13 +2892,13 @@ namespace OpenSim.Region.Framework.Scenes (Animator.currentControlState != ScenePresenceAnimator.motionControlStates.flying && Animator.currentControlState != ScenePresenceAnimator.motionControlStates.onsurface) ) - AddNewMovement(agent_control_v3); + AddNewMovement(agent_control_v3, agent_velocity); else { if (MovementFlag != 0) - AddNewMovement(agent_control_v3); + AddNewMovement(agent_control_v3, agent_velocity); else - m_delayedStop = Util.GetTimeStampMS() + 200.0; + m_delayedStop = Util.GetTimeStampMS() + 100.0; } } } @@ -3103,53 +3068,33 @@ namespace OpenSim.Region.Framework.Scenes // based on the above avatar coordinate system, classify the movement into // one of left/right/back/forward. - const uint noMovFlagsMask = (uint)(~(Dir_ControlFlags.DIR_CONTROL_FLAG_BACK | - Dir_ControlFlags.DIR_CONTROL_FLAG_FORWARD | Dir_ControlFlags.DIR_CONTROL_FLAG_LEFT | - Dir_ControlFlags.DIR_CONTROL_FLAG_RIGHT | Dir_ControlFlags.DIR_CONTROL_FLAG_UP | - Dir_ControlFlags.DIR_CONTROL_FLAG_DOWN)); - - MovementFlag &= noMovFlagsMask; - uint tmpAgentControlFlags = (uint)m_AgentControlFlags; - tmpAgentControlFlags &= noMovFlagsMask; - + uint tmpAgentControlFlags = 0; if (LocalVectorToTarget3D.X < 0) //MoveBack - { - MovementFlag |= (uint)Dir_ControlFlags.DIR_CONTROL_FLAG_BACK; - tmpAgentControlFlags |= (uint)Dir_ControlFlags.DIR_CONTROL_FLAG_BACK; - updated = true; - } + tmpAgentControlFlags = (uint)Dir_ControlFlags.DIR_CONTROL_FLAG_BACK; else if (LocalVectorToTarget3D.X > 0) //Move Forward - { - MovementFlag |= (uint)Dir_ControlFlags.DIR_CONTROL_FLAG_FORWARD; - tmpAgentControlFlags |= (uint)Dir_ControlFlags.DIR_CONTROL_FLAG_FORWARD; - updated = true; - } + tmpAgentControlFlags = (uint)Dir_ControlFlags.DIR_CONTROL_FLAG_FORWARD; if (LocalVectorToTarget3D.Y > 0) //MoveLeft - { - MovementFlag |= (uint)Dir_ControlFlags.DIR_CONTROL_FLAG_LEFT; tmpAgentControlFlags |= (uint)Dir_ControlFlags.DIR_CONTROL_FLAG_LEFT; - updated = true; - } else if (LocalVectorToTarget3D.Y < 0) //MoveRight - { - MovementFlag |= (uint)Dir_ControlFlags.DIR_CONTROL_FLAG_RIGHT; tmpAgentControlFlags |= (uint)Dir_ControlFlags.DIR_CONTROL_FLAG_RIGHT; - updated = true; - } - if (LocalVectorToTarget3D.Z > 0) //Up - updated = true; - - else if (LocalVectorToTarget3D.Z < 0) //Down - updated = true; - -// m_log.DebugFormat( -// "[SCENE PRESENCE]: HandleMoveToTargetUpdate adding {0} to move vector {1} for {2}", -// LocalVectorToTarget3D, agent_control_v3, Name); + updated = LocalVectorToTarget3D.Z != 0; + updated |= tmpAgentControlFlags != 0; - m_AgentControlFlags = (AgentManager.ControlFlags) tmpAgentControlFlags; - if(updated) + //m_log.DebugFormat( + // "[SCENE PRESENCE]: HandleMoveToTargetUpdate adding {0} to move vector {1} for {2}", + // LocalVectorToTarget3D, agent_control_v3, Name); + + const uint noMovFlagsMask = (uint)(~CONTROL_FLAG_NORM_MASK); + + MovementFlag &= noMovFlagsMask; + MovementFlag |= tmpAgentControlFlags; + + m_AgentControlFlags &= unchecked((AgentManager.ControlFlags)noMovFlagsMask); + m_AgentControlFlags |= (AgentManager.ControlFlags)tmpAgentControlFlags; + + if (updated) agent_control_v3 += LocalVectorToTarget3D; } catch (Exception e)