From b9808f831428876ec9ede8ce87a159566b97a850 Mon Sep 17 00:00:00 2001 From: lbsa71 Date: Fri, 21 Sep 2007 04:58:40 +0000 Subject: [PATCH] * First example of moving stuff to a Region layer * Also, changed RegionPresence to 'RegionSubscription' - let's just see where we land with this... --- OpenSim/Region/Environment/Regions/Region.cs | 35 +++++++++++++++++-- .../Environment/Regions/RegionPresence.cs | 14 -------- .../Environment/Regions/RegionSubscription.cs | 19 ++++++++++ ...anager.cs => RegionSubscriptionManager.cs} | 4 +-- OpenSim/Region/Environment/Scenes/Scene.cs | 16 ++++++--- .../Region/Environment/Scenes/SceneBase.cs | 11 ------ .../Environment/Scenes/SceneObjectPart.cs | 9 ----- .../Environment/Scenes/ScenePresence.cs | 34 +++++++----------- 8 files changed, 77 insertions(+), 65 deletions(-) delete mode 100644 OpenSim/Region/Environment/Regions/RegionPresence.cs create mode 100644 OpenSim/Region/Environment/Regions/RegionSubscription.cs rename OpenSim/Region/Environment/Regions/{RegionManager.cs => RegionSubscriptionManager.cs} (71%) diff --git a/OpenSim/Region/Environment/Regions/Region.cs b/OpenSim/Region/Environment/Regions/Region.cs index f7669a9eb7..e95d9dc075 100644 --- a/OpenSim/Region/Environment/Regions/Region.cs +++ b/OpenSim/Region/Environment/Regions/Region.cs @@ -1,15 +1,44 @@ using System.Collections.Generic; using libsecondlife; +using OpenSim.Region.Environment.Scenes; +using OpenSim.Region.Terrain; +using OpenSim.Framework.Interfaces; +using System; namespace OpenSim.Region.Environment.Regions { public class Region { - private Dictionary m_regionPresences; + // This is a temporary (and real ugly) construct to emulate us really having a separate list + // of region subscribers. It should be removed ASAP, like. - public Region() + private readonly Scene m_scene; + private Dictionary m_regionSubscriptions { - m_regionPresences = new Dictionary( ); + get + { + Dictionary subscriptions = new Dictionary( ); + + foreach( ScenePresence presence in m_scene.GetScenePresences() ) + { + subscriptions.Add( presence.UUID, new RegionSubscription( presence.ControllingClient )); + } + + return subscriptions; + } + } + + public Region( Scene scene ) + { + m_scene = scene; // The Scene reference should be removed. + } + + internal void Broadcast( Action whatToDo ) + { + foreach (RegionSubscription subscription in m_regionSubscriptions.Values ) + { + whatToDo(subscription.Client); + } } } } diff --git a/OpenSim/Region/Environment/Regions/RegionPresence.cs b/OpenSim/Region/Environment/Regions/RegionPresence.cs deleted file mode 100644 index 9720bb3078..0000000000 --- a/OpenSim/Region/Environment/Regions/RegionPresence.cs +++ /dev/null @@ -1,14 +0,0 @@ -using OpenSim.Framework.Interfaces; - -namespace OpenSim.Region.Environment.Regions -{ - public class RegionPresence - { - private IClientAPI m_client; - - public RegionPresence(IClientAPI client ) - { - m_client = client; - } - } -} diff --git a/OpenSim/Region/Environment/Regions/RegionSubscription.cs b/OpenSim/Region/Environment/Regions/RegionSubscription.cs new file mode 100644 index 0000000000..13cd0d55f4 --- /dev/null +++ b/OpenSim/Region/Environment/Regions/RegionSubscription.cs @@ -0,0 +1,19 @@ +using OpenSim.Framework.Interfaces; + +namespace OpenSim.Region.Environment.Regions +{ + public class RegionSubscription + { + private readonly IClientAPI m_client; + + public RegionSubscription(IClientAPI client ) + { + m_client = client; + } + + public IClientAPI Client + { + get { return m_client; } + } + } +} diff --git a/OpenSim/Region/Environment/Regions/RegionManager.cs b/OpenSim/Region/Environment/Regions/RegionSubscriptionManager.cs similarity index 71% rename from OpenSim/Region/Environment/Regions/RegionManager.cs rename to OpenSim/Region/Environment/Regions/RegionSubscriptionManager.cs index ab5b97c1c9..97d25911c7 100644 --- a/OpenSim/Region/Environment/Regions/RegionManager.cs +++ b/OpenSim/Region/Environment/Regions/RegionSubscriptionManager.cs @@ -4,11 +4,11 @@ using System.Text; namespace OpenSim.Region.Environment.Regions { - public class RegionManager + public class RegionSubscriptionManager { private Dictionary m_regions; - public RegionManager( ) + public RegionSubscriptionManager( ) { m_regions = new Dictionary( ); } diff --git a/OpenSim/Region/Environment/Scenes/Scene.cs b/OpenSim/Region/Environment/Scenes/Scene.cs index 55d760eb19..62e79411af 100644 --- a/OpenSim/Region/Environment/Scenes/Scene.cs +++ b/OpenSim/Region/Environment/Scenes/Scene.cs @@ -49,6 +49,7 @@ using OpenSim.Region.Environment.Types; using OpenSim.Region.Physics.Manager; using OpenSim.Region.Terrain; using Timer = System.Timers.Timer; +using OpenSim.Region.Environment.Regions; namespace OpenSim.Region.Environment.Scenes { @@ -63,6 +64,8 @@ namespace OpenSim.Region.Environment.Scenes /// publicized so it can be accessed from SceneObjectGroup. protected float timeStep = 0.1f; + private Regions.Region m_region; + private Random Rand = new Random(); private uint _primCount = 702000; private readonly Mutex _primAllocateMutex = new Mutex(false); @@ -159,6 +162,8 @@ namespace OpenSim.Region.Environment.Scenes { updateLock = new Mutex(false); + m_region = new Regions.Region(this); + m_moduleLoader = moduleLoader; authenticateHandler = authen; commsManager = commsMan; @@ -302,7 +307,7 @@ namespace OpenSim.Region.Environment.Scenes float[] terData = Terrain.GetHeights1D(); - ForEachScenePresence(delegate(ScenePresence presence) + Broadcast( delegate( IClientAPI client ) { for (int x = 0; x < 16; x++) { @@ -310,8 +315,7 @@ namespace OpenSim.Region.Environment.Scenes { if (Terrain.Tainted(x * 16, y * 16)) { - SendLayerData(x, y, presence.ControllingClient, - terData); + client.SendLayerData(x, y, terData); } } } @@ -366,6 +370,10 @@ namespace OpenSim.Region.Environment.Scenes updateLock.ReleaseMutex(); } + internal void Broadcast(Action whatToDo) + { + m_region.Broadcast( whatToDo ); + } /// /// /// @@ -396,7 +404,7 @@ namespace OpenSim.Region.Environment.Scenes storageManager.DataStore.StoreTerrain(Terrain.GetHeights2DD()); - ForEachScenePresence(delegate(ScenePresence presence) { SendLayerData(presence.ControllingClient); }); + Broadcast(delegate(IClientAPI client ) { SendLayerData( client ); }); foreach (LLUUID UUID in Entities.Keys) { diff --git a/OpenSim/Region/Environment/Scenes/SceneBase.cs b/OpenSim/Region/Environment/Scenes/SceneBase.cs index 7b2e17f93c..fc81d5f880 100644 --- a/OpenSim/Region/Environment/Scenes/SceneBase.cs +++ b/OpenSim/Region/Environment/Scenes/SceneBase.cs @@ -88,17 +88,6 @@ namespace OpenSim.Region.Environment.Scenes RemoteClient.SendLayerData(Terrain.GetHeights1D()); } - /// - /// Sends a specified patch to a client - /// - /// Patch coordinate (x) 0..16 - /// Patch coordinate (y) 0..16 - /// The client to send to - public virtual void SendLayerData(int px, int py, IClientAPI RemoteClient, float[] terrain) - { - RemoteClient.SendLayerData(px, py, terrain); - } - #endregion #region Add/Remove Agent/Avatar diff --git a/OpenSim/Region/Environment/Scenes/SceneObjectPart.cs b/OpenSim/Region/Environment/Scenes/SceneObjectPart.cs index 468def05aa..406db9b599 100644 --- a/OpenSim/Region/Environment/Scenes/SceneObjectPart.cs +++ b/OpenSim/Region/Environment/Scenes/SceneObjectPart.cs @@ -777,10 +777,6 @@ namespace OpenSim.Region.Environment.Scenes m_parentGroup.SendPartTerseUpdate(remoteClient, this); } - /// - /// - /// - /// public void SendTerseUpdateToClient(IClientAPI remoteClient) { LLVector3 lPos; @@ -789,11 +785,6 @@ namespace OpenSim.Region.Environment.Scenes remoteClient.SendPrimTerseUpdate(m_regionHandle, 64096, LocalID, lPos, mRot); } - /// - /// - /// - /// - /// public void SendTerseUpdateToClient(IClientAPI remoteClient, LLVector3 lPos) { LLQuaternion mRot = RotationOffset; diff --git a/OpenSim/Region/Environment/Scenes/ScenePresence.cs b/OpenSim/Region/Environment/Scenes/ScenePresence.cs index 23e103515b..41e555aad3 100644 --- a/OpenSim/Region/Environment/Scenes/ScenePresence.cs +++ b/OpenSim/Region/Environment/Scenes/ScenePresence.cs @@ -69,8 +69,6 @@ namespace OpenSim.Region.Environment.Scenes private readonly Vector3[] Dir_Vectors = new Vector3[6]; private LLVector3 lastPhysPos = new LLVector3(); - private RegionPresence m_regionPresence; - private enum Dir_ControlFlags { DIR_CONTROL_FLAG_FOWARD = MainAvatar.ControlFlags.AGENT_CONTROL_AT_POS, @@ -216,6 +214,13 @@ namespace OpenSim.Region.Environment.Scenes set { m_isChildAgent = value; } } + private RegionSubscription m_regionSubscription; + + public RegionSubscription RegionSubscription + { + get { return m_regionSubscription; } + } + #endregion #region Constructor(s) @@ -229,7 +234,7 @@ namespace OpenSim.Region.Environment.Scenes /// public ScenePresence(IClientAPI client, Scene world, RegionInfo reginfo) { - m_regionPresence = new RegionPresence( client ); + m_regionSubscription = new RegionSubscription( client ); m_scene = world; m_uuid = client.AgentId; @@ -331,21 +336,6 @@ namespace OpenSim.Region.Environment.Scenes #region Status Methods - /// - /// Not Used, most likely can be deleted - /// - /// - public void ChildStatusChange(bool status) - { - m_isChildAgent = status; - - if (m_isChildAgent == true) - { - Velocity = new LLVector3(0, 0, 0); - AbsolutePosition = new LLVector3(128, 128, 70); - } - } - public void MakeAvatarPhysical(LLVector3 pos, bool isFlying) { newAvatar = true; @@ -425,7 +415,9 @@ namespace OpenSim.Region.Environment.Scenes { look = new LLVector3(0.99f, 0.042f, 0); } + m_controllingClient.MoveAgentIntoRegion(m_regionInfo, AbsolutePosition, look); + if (m_isChildAgent) { m_isChildAgent = false; @@ -434,10 +426,6 @@ namespace OpenSim.Region.Environment.Scenes } } - /// - /// - /// - /// public void HandleAgentUpdate(IClientAPI remoteClient, uint flags, LLQuaternion bodyRotation) { if (m_isChildAgent) @@ -445,6 +433,7 @@ namespace OpenSim.Region.Environment.Scenes Console.WriteLine("DEBUG: HandleAgentUpdate: child agent"); return; } + if(PhysicsActor==null) { Console.WriteLine("DEBUG: HandleAgentUpdate: null PhysicsActor!"); return; @@ -526,6 +515,7 @@ namespace OpenSim.Region.Environment.Scenes Console.WriteLine("DEBUG: AddNewMovement: child agent"); return; } + NewForce newVelocity = new NewForce(); Vector3 direc = rotation*vec; direc.Normalize();