/// <summary> /// Soon to be decommissioned /// </summary> /// <param name="cAgent"></param> public void CopyFrom(ChildAgentDataUpdate cAgent, UUID sid) { AgentID = new UUID(cAgent.AgentID); SessionID = sid; // next: ??? Size = new Vector3(); Size.Z = cAgent.AVHeight; Center = cAgent.cameraPosition; Far = cAgent.drawdistance; Position = cAgent.Position; RegionHandle = cAgent.regionHandle; Throttles = cAgent.throttles; Velocity = cAgent.Velocity; }
/// <summary> /// Soon to be decommissioned /// </summary> /// <param name="cAgent"></param> public void CopyFrom(ChildAgentDataUpdate cAgent) { AgentID = new UUID(cAgent.AgentID); // next: ??? Size = new Vector3(); Size.Z = cAgent.AVHeight; Center = cAgent.cameraPosition; Far = cAgent.drawdistance; Position = cAgent.Position; RegionHandle = cAgent.regionHandle; Throttles = cAgent.throttles; Velocity = cAgent.Velocity; }
/// <summary> /// This checks for a significant movement and sends a coarselocationchange update /// </summary> protected void CheckForSignificantMovement() { if (Util.GetDistanceTo(AbsolutePosition, posLastSignificantMove) > SIGNIFICANT_MOVEMENT) { posLastSignificantMove = AbsolutePosition; m_scene.EventManager.TriggerSignificantClientMovement(this); } // Minimum Draw distance is 64 meters, the Radius of the draw distance sphere is 32m if (Util.GetDistanceTo(AbsolutePosition, m_lastChildAgentUpdatePosition) >= Scene.ChildReprioritizationDistance || Util.GetDistanceTo(CameraPosition, m_lastChildAgentUpdateCamPosition) >= Scene.ChildReprioritizationDistance) { m_lastChildAgentUpdatePosition = AbsolutePosition; m_lastChildAgentUpdateCamPosition = CameraPosition; ChildAgentDataUpdate cadu = new ChildAgentDataUpdate(); cadu.ActiveGroupID = UUID.Zero.Guid; cadu.AgentID = UUID.Guid; cadu.alwaysrun = SetAlwaysRun; cadu.AVHeight = Appearance.AvatarHeight; cadu.cameraPosition = CameraPosition; cadu.drawdistance = DrawDistance; cadu.GroupAccess = 0; cadu.Position = AbsolutePosition; cadu.regionHandle = RegionHandle; // Throttles float multiplier = 1; int childRegions = KnownRegionCount; if (childRegions != 0) multiplier = 1f / childRegions; // Minimum throttle for a child region is 1/4 of the root region throttle if (multiplier <= 0.25f) multiplier = 0.25f; cadu.throttles = ControllingClient.GetThrottlesPacked(multiplier); cadu.Velocity = Velocity; AgentPosition agentpos = new AgentPosition(); agentpos.CopyFrom(cadu); // Let's get this out of the update loop Util.FireAndForget(delegate { m_scene.SendOutChildAgentUpdates(agentpos, this); }); } }
/// <summary> /// Inform the scene that we've got an update about a child agent that we have /// </summary> /// <param name="cAgentData"></param> /// <returns></returns> protected bool ChildAgentUpdate(ChildAgentDataUpdate cAgentData) { handlerChildAgentUpdate = OnChildAgentUpdate; if (handlerChildAgentUpdate != null) handlerChildAgentUpdate(cAgentData); return true; }
/// <summary> /// This checks for a significant movement and sends a courselocationchange update /// </summary> protected void CheckForSignificantMovement() { if (Util.GetDistanceTo(AbsolutePosition, posLastSignificantMove) > 0.5) { posLastSignificantMove = AbsolutePosition; m_scene.EventManager.TriggerSignificantClientMovement(m_controllingClient); m_scene.NotifyMyCoarseLocationChange(); } // Minimum Draw distance is 64 meters, the Radius of the draw distance sphere is 32m if (Util.GetDistanceTo(AbsolutePosition, m_lastChildAgentUpdatePosition) >= Scene.ChildReprioritizationDistance || Util.GetDistanceTo(CameraPosition, m_lastChildAgentUpdateCamPosition) >= Scene.ChildReprioritizationDistance) { ChildAgentDataUpdate cadu = new ChildAgentDataUpdate(); cadu.ActiveGroupID = UUID.Zero.Guid; cadu.AgentID = UUID.Guid; cadu.alwaysrun = m_setAlwaysRun; cadu.AVHeight = m_avHeight; sLLVector3 tempCameraCenter = new sLLVector3(new Vector3(m_CameraCenter.X, m_CameraCenter.Y, m_CameraCenter.Z)); cadu.cameraPosition = tempCameraCenter; cadu.drawdistance = m_DrawDistance; if (m_scene.Permissions.IsGod(new UUID(cadu.AgentID))) cadu.godlevel = m_godlevel; cadu.GroupAccess = 0; cadu.Position = new sLLVector3(AbsolutePosition); cadu.regionHandle = m_rootRegionHandle; float multiplier = 1; int innacurateNeighbors = m_scene.GetInaccurateNeighborCount(); if (innacurateNeighbors != 0) { multiplier = 1f / (float)innacurateNeighbors; } if (multiplier <= 0f) { multiplier = 0.25f; } //m_log.Info("[NeighborThrottle]: " + m_scene.GetInaccurateNeighborCount().ToString() + " - m: " + multiplier.ToString()); cadu.throttles = ControllingClient.GetThrottlesPacked(multiplier); cadu.Velocity = new sLLVector3(Velocity); AgentPosition agentpos = new AgentPosition(); agentpos.CopyFrom(cadu); m_scene.SendOutChildAgentUpdates(agentpos, this); m_lastChildAgentUpdatePosition = AbsolutePosition; m_lastChildAgentUpdateCamPosition = CameraPosition; } }
/// <summary> /// This checks for a significant movement and sends a courselocationchange update /// </summary> protected void CheckForSignificantMovement() { // Movement updates for agents in neighboring regions are sent directly to clients. // This value only affects how often agent positions are sent to neighbor regions // for things such as distance-based update prioritization const float SIGNIFICANT_MOVEMENT = 2.0f; if (Util.GetDistanceTo(AbsolutePosition, posLastSignificantMove) > SIGNIFICANT_MOVEMENT) { posLastSignificantMove = AbsolutePosition; m_scene.EventManager.TriggerSignificantClientMovement(m_controllingClient); m_scene.NotifyMyCoarseLocationChange(); } // Minimum Draw distance is 64 meters, the Radius of the draw distance sphere is 32m if (Util.GetDistanceTo(AbsolutePosition, m_lastChildAgentUpdatePosition) >= Scene.ChildReprioritizationDistance || Util.GetDistanceTo(CameraPosition, m_lastChildAgentUpdateCamPosition) >= Scene.ChildReprioritizationDistance) { m_lastChildAgentUpdatePosition = AbsolutePosition; m_lastChildAgentUpdateCamPosition = CameraPosition; ChildAgentDataUpdate cadu = new ChildAgentDataUpdate(); cadu.ActiveGroupID = UUID.Zero.Guid; cadu.AgentID = UUID.Guid; cadu.alwaysrun = m_setAlwaysRun; cadu.AVHeight = m_avHeight; Vector3 tempCameraCenter = m_CameraCenter; cadu.cameraPosition = tempCameraCenter; cadu.drawdistance = m_DrawDistance; cadu.GroupAccess = 0; cadu.Position = AbsolutePosition; cadu.regionHandle = m_rootRegionHandle; float multiplier = 1; int innacurateNeighbors = m_scene.GetInaccurateNeighborCount(); if (innacurateNeighbors != 0) { multiplier = 1f / (float)innacurateNeighbors; } if (multiplier <= 0f) { multiplier = 0.25f; } //m_log.Info("[NeighborThrottle]: " + m_scene.GetInaccurateNeighborCount().ToString() + " - m: " + multiplier.ToString()); cadu.throttles = ControllingClient.GetThrottlesPacked(multiplier); cadu.Velocity = Velocity; AgentPosition agentpos = new AgentPosition(); agentpos.CopyFrom(cadu); m_scene.SendOutChildAgentUpdates(agentpos, this); } }
public void SendChildAgentUpdate() { Vector3 pos = AbsolutePosition; m_LastChildAgentUpdatePosition.X = pos.X; m_LastChildAgentUpdatePosition.Y = pos.Y; m_LastChildAgentUpdatePosition.Z = pos.Z; ChildAgentDataUpdate cadu = new ChildAgentDataUpdate(); cadu.ActiveGroupID = UUID.Zero.Guid; cadu.AgentID = UUID.Guid; cadu.alwaysrun = m_setAlwaysRun; cadu.AVHeight = m_avHeight; sLLVector3 tempCameraCenter = new sLLVector3(new Vector3(m_CameraCenter.X, m_CameraCenter.Y, m_CameraCenter.Z)); cadu.cameraPosition = tempCameraCenter; cadu.drawdistance = m_DrawDistance; if (!this.IsBot) // bots don't need IsGod checks if (m_scene.Permissions.IsGod(new UUID(cadu.AgentID))) cadu.godlevel = m_godlevel; cadu.GroupAccess = 0; cadu.Position = new sLLVector3(pos); cadu.regionHandle = m_scene.RegionInfo.RegionHandle; float multiplier = CalculateNeighborBandwidthMultiplier(); //m_log.Info("[NeighborThrottle]: " + m_scene.GetInaccurateNeighborCount().ToString() + " - m: " + multiplier.ToString()); cadu.throttles = ControllingClient.GetThrottlesPacked(multiplier); cadu.Velocity = new sLLVector3(Velocity); AgentPosition agentpos = new AgentPosition(); agentpos.CopyFrom(cadu); m_scene.SendOutChildAgentUpdates(agentpos, this); }
public virtual bool TriggerChildAgentUpdate(ChildAgentDataUpdate cAgentData) { handlerChildAgentUpdate = OnChildAgentUpdate; if (handlerChildAgentUpdate != null) { handlerChildAgentUpdate(cAgentData); return true; } return false; }
public void AgentPositionTest01() { UUID AgentId1 = UUID.Random(); UUID SessionId1 = UUID.Random(); uint CircuitCode1 = uint.MinValue; Vector3 Size1 = Vector3.UnitZ; Vector3 Position1 = Vector3.UnitX; Vector3 LeftAxis1 = Vector3.UnitY; Vector3 UpAxis1 = Vector3.UnitZ; Vector3 AtAxis1 = Vector3.UnitX; ulong RegionHandle1 = ulong.MinValue; byte[] Throttles1 = new byte[] {0, 1, 0}; Vector3 Velocity1 = Vector3.Zero; float Far1 = 256; bool ChangedGrid1 = false; Vector3 Center1 = Vector3.Zero; AgentPosition position1 = new AgentPosition(); position1.AgentID = AgentId1; position1.SessionID = SessionId1; position1.CircuitCode = CircuitCode1; position1.Size = Size1; position1.Position = Position1; position1.LeftAxis = LeftAxis1; position1.UpAxis = UpAxis1; position1.AtAxis = AtAxis1; position1.RegionHandle = RegionHandle1; position1.Throttles = Throttles1; position1.Velocity = Velocity1; position1.Far = Far1; position1.ChangedGrid = ChangedGrid1; position1.Center = Center1; ChildAgentDataUpdate cadu = new ChildAgentDataUpdate(); cadu.AgentID = AgentId1.Guid; cadu.ActiveGroupID = UUID.Zero.Guid; cadu.throttles = Throttles1; cadu.drawdistance = Far1; cadu.Position = Position1; cadu.Velocity = Velocity1; cadu.regionHandle = RegionHandle1; cadu.cameraPosition = Center1; cadu.AVHeight = Size1.Z; AgentPosition position2 = new AgentPosition(); position2.CopyFrom(cadu); Assert.IsTrue( position2.AgentID == position1.AgentID && position2.Size == position1.Size && position2.Position == position1.Position && position2.Velocity == position1.Velocity && position2.Center == position1.Center && position2.RegionHandle == position1.RegionHandle && position2.Far == position1.Far ,"Copy From ChildAgentDataUpdate failed"); position2 = new AgentPosition(); Assert.IsFalse(position2.AgentID == position1.AgentID, "Test Error, position2 should be a blank uninitialized AgentPosition"); position2.Unpack(position1.Pack(), null); Assert.IsTrue(position2.AgentID == position1.AgentID, "Agent ID didn't unpack the same way it packed"); Assert.IsTrue(position2.Position == position1.Position, "Position didn't unpack the same way it packed"); Assert.IsTrue(position2.Velocity == position1.Velocity, "Velocity didn't unpack the same way it packed"); Assert.IsTrue(position2.SessionID == position1.SessionID, "SessionID didn't unpack the same way it packed"); Assert.IsTrue(position2.CircuitCode == position1.CircuitCode, "CircuitCode didn't unpack the same way it packed"); Assert.IsTrue(position2.LeftAxis == position1.LeftAxis, "LeftAxis didn't unpack the same way it packed"); Assert.IsTrue(position2.UpAxis == position1.UpAxis, "UpAxis didn't unpack the same way it packed"); Assert.IsTrue(position2.AtAxis == position1.AtAxis, "AtAxis didn't unpack the same way it packed"); Assert.IsTrue(position2.RegionHandle == position1.RegionHandle, "RegionHandle didn't unpack the same way it packed"); Assert.IsTrue(position2.ChangedGrid == position1.ChangedGrid, "ChangedGrid didn't unpack the same way it packed"); Assert.IsTrue(position2.Center == position1.Center, "Center didn't unpack the same way it packed"); Assert.IsTrue(position2.Size == position1.Size, "Size didn't unpack the same way it packed"); }
public void ChildAgentDataUpdate01() { // code coverage ChildAgentDataUpdate cadu = new ChildAgentDataUpdate(); Assert.IsFalse(cadu.alwaysrun, "Default is false"); }
/// <summary> /// This checks for a significant movement and sends a courselocationchange update /// </summary> protected void CheckForSignificantMovement() { // Movement updates for agents in neighboring regions are sent directly to clients. // This value only affects how often agent positions are sent to neighbor regions // for things such as distance-based update prioritization const float SIGNIFICANT_MOVEMENT = 2.0f; if (Util.GetDistanceTo(AbsolutePosition, posLastSignificantMove) > SIGNIFICANT_MOVEMENT) { posLastSignificantMove = AbsolutePosition; m_scene.EventManager.TriggerSignificantClientMovement(m_controllingClient); } // Minimum Draw distance is 64 meters, the Radius of the draw distance sphere is 32m if (Util.GetDistanceTo(AbsolutePosition, m_lastChildAgentUpdatePosition) >= Scene.ChildReprioritizationDistance || Util.GetDistanceTo(CameraPosition, m_lastChildAgentUpdateCamPosition) >= Scene.ChildReprioritizationDistance) { m_lastChildAgentUpdatePosition = AbsolutePosition; m_lastChildAgentUpdateCamPosition = CameraPosition; ChildAgentDataUpdate cadu = new ChildAgentDataUpdate(); cadu.ActiveGroupID = UUID.Zero.Guid; cadu.AgentID = UUID.Guid; cadu.alwaysrun = m_setAlwaysRun; cadu.AVHeight = m_appearance.AvatarHeight; Vector3 tempCameraCenter = m_CameraCenter; cadu.cameraPosition = tempCameraCenter; cadu.drawdistance = m_DrawDistance; cadu.GroupAccess = 0; cadu.Position = AbsolutePosition; cadu.regionHandle = m_rootRegionHandle; // Throttles float multiplier = 1; int childRegions = m_knownChildRegions.Count; if (childRegions != 0) multiplier = 1f / childRegions; // Minimum throttle for a child region is 1/4 of the root region throttle if (multiplier <= 0.25f) multiplier = 0.25f; cadu.throttles = ControllingClient.GetThrottlesPacked(multiplier); cadu.Velocity = Velocity; AgentPosition agentpos = new AgentPosition(); agentpos.CopyFrom(cadu); m_scene.SendOutChildAgentUpdates(agentpos, this); } }