public void TestCross() { TestHelper.InMethod(); List<Border> testborders = new List<Border>(); Border NorthBorder = new Border(); NorthBorder.BorderLine = new Vector3(0, 256, 256); //<--- NorthBorder.CrossDirection = Cardinals.N; testborders.Add(NorthBorder); Border SouthBorder = new Border(); SouthBorder.BorderLine = new Vector3(0, 256, 0); //---> SouthBorder.CrossDirection = Cardinals.S; testborders.Add(SouthBorder); Border EastBorder = new Border(); EastBorder.BorderLine = new Vector3(0, 256, 256); //<--- EastBorder.CrossDirection = Cardinals.E; testborders.Add(EastBorder); Border WestBorder = new Border(); WestBorder.BorderLine = new Vector3(0, 256, 0); //---> WestBorder.CrossDirection = Cardinals.W; testborders.Add(WestBorder); Vector3 position = new Vector3(200,200,21); foreach (Border b in testborders) { Assert.That(!b.TestCross(position)); } position = new Vector3(200,280,21); Assert.That(NorthBorder.TestCross(position)); // Test automatic border crossing // by setting the border crossing aabb to be the whole region position = new Vector3(25,25,21); // safely within one 256m region // The Z value of the BorderLine is reversed, making all positions within the region // trigger bordercross SouthBorder.BorderLine = new Vector3(0,256,256); // automatic border cross in the region Assert.That(SouthBorder.TestCross(position)); NorthBorder.BorderLine = new Vector3(0, 256, 0); // automatic border cross in the region Assert.That(NorthBorder.TestCross(position)); EastBorder.BorderLine = new Vector3(0, 256, 0); // automatic border cross in the region Assert.That(EastBorder.TestCross(position)); WestBorder.BorderLine = new Vector3(0, 256, 255); // automatic border cross in the region Assert.That(WestBorder.TestCross(position)); }
public Scene(RegionInfo regInfo) : base(regInfo) { PhysicalPrims = true; CollidablePrims = true; BordersLocked = true; Border northBorder = new Border(); northBorder.BorderLine = new Vector3(float.MinValue, float.MaxValue, (int)Constants.RegionSize); //<--- northBorder.CrossDirection = Cardinals.N; NorthBorders.Add(northBorder); Border southBorder = new Border(); southBorder.BorderLine = new Vector3(float.MinValue, float.MaxValue,0); //---> southBorder.CrossDirection = Cardinals.S; SouthBorders.Add(southBorder); Border eastBorder = new Border(); eastBorder.BorderLine = new Vector3(float.MinValue, float.MaxValue, (int)Constants.RegionSize); //<--- eastBorder.CrossDirection = Cardinals.E; EastBorders.Add(eastBorder); Border westBorder = new Border(); westBorder.BorderLine = new Vector3(float.MinValue, float.MaxValue,0); //---> westBorder.CrossDirection = Cardinals.W; WestBorders.Add(westBorder); BordersLocked = false; m_eventManager = new EventManager(); m_permissions = new ScenePermissions(this); }
/// <summary> /// Try and get an Infinite border out of a listT of borders /// </summary> /// <param name="borders"></param> /// <param name="oborder"></param> /// <returns></returns> public static bool TryGetInfiniteBorder(List<Border> borders, out Border oborder) { // Warning! Should be locked before getting here! foreach (Border b in borders) { if (b.BorderLine.X == float.MinValue && b.BorderLine.Y == float.MaxValue) { oborder = b; return true; } } oborder = null; return false; }
// Create a set of infinite borders around the whole aabb of the combined island. private void AdjustLargeRegionBounds() { lock (m_regions) { foreach (RegionConnections rconn in m_regions.Values) { Vector3 offset = Vector3.Zero; rconn.RegionScene.BordersLocked = true; foreach (RegionData rdata in rconn.ConnectedRegions) { if (rdata.Offset.X > offset.X) offset.X = rdata.Offset.X; if (rdata.Offset.Y > offset.Y) offset.Y = rdata.Offset.Y; } lock (rconn.RegionScene.NorthBorders) { Border northBorder = null; // If we don't already have an infinite border, create one. if (!TryGetInfiniteBorder(rconn.RegionScene.NorthBorders, out northBorder)) { northBorder = new Border(); rconn.RegionScene.NorthBorders.Add(northBorder); } northBorder.BorderLine = new Vector3(float.MinValue, float.MaxValue, offset.Y + (int) Constants.RegionSize); //<--- northBorder.CrossDirection = Cardinals.N; } lock (rconn.RegionScene.SouthBorders) { Border southBorder = null; // If we don't already have an infinite border, create one. if (!TryGetInfiniteBorder(rconn.RegionScene.SouthBorders, out southBorder)) { southBorder = new Border(); rconn.RegionScene.SouthBorders.Add(southBorder); } southBorder.BorderLine = new Vector3(float.MinValue, float.MaxValue, 0); //---> southBorder.CrossDirection = Cardinals.S; } lock (rconn.RegionScene.EastBorders) { Border eastBorder = null; // If we don't already have an infinite border, create one. if (!TryGetInfiniteBorder(rconn.RegionScene.EastBorders, out eastBorder)) { eastBorder = new Border(); rconn.RegionScene.EastBorders.Add(eastBorder); } eastBorder.BorderLine = new Vector3(float.MinValue, float.MaxValue, offset.X + (int)Constants.RegionSize); //<--- eastBorder.CrossDirection = Cardinals.E; } lock (rconn.RegionScene.WestBorders) { Border westBorder = null; // If we don't already have an infinite border, create one. if (!TryGetInfiniteBorder(rconn.RegionScene.WestBorders, out westBorder)) { westBorder = new Border(); rconn.RegionScene.WestBorders.Add(westBorder); } westBorder.BorderLine = new Vector3(float.MinValue, float.MaxValue, 0); //---> westBorder.CrossDirection = Cardinals.W; } rconn.RegionScene.BordersLocked = false; } } }
private void RegionLoadedDoWork(Scene scene) { /* // For testing on a single instance if (scene.RegionInfo.RegionLocX == 1004 && scene.RegionInfo.RegionLocY == 1000) return; // */ lock (m_startingScenes) m_startingScenes.Add(scene.RegionInfo.originRegionID, scene); // Give each region a standard set of non-infinite borders Border northBorder = new Border(); northBorder.BorderLine = new Vector3(0, (int)Constants.RegionSize, (int)Constants.RegionSize); //<--- northBorder.CrossDirection = Cardinals.N; scene.NorthBorders[0] = northBorder; Border southBorder = new Border(); southBorder.BorderLine = new Vector3(0, (int)Constants.RegionSize, 0); //---> southBorder.CrossDirection = Cardinals.S; scene.SouthBorders[0] = southBorder; Border eastBorder = new Border(); eastBorder.BorderLine = new Vector3(0, (int)Constants.RegionSize, (int)Constants.RegionSize); //<--- eastBorder.CrossDirection = Cardinals.E; scene.EastBorders[0] = eastBorder; Border westBorder = new Border(); westBorder.BorderLine = new Vector3(0, (int)Constants.RegionSize, 0); //---> westBorder.CrossDirection = Cardinals.W; scene.WestBorders[0] = westBorder; RegionConnections regionConnections = new RegionConnections(); regionConnections.ConnectedRegions = new List<RegionData>(); regionConnections.RegionScene = scene; regionConnections.RegionLandChannel = scene.LandChannel; regionConnections.RegionId = scene.RegionInfo.originRegionID; regionConnections.X = scene.RegionInfo.RegionLocX; regionConnections.Y = scene.RegionInfo.RegionLocY; regionConnections.XEnd = (int)Constants.RegionSize; regionConnections.YEnd = (int)Constants.RegionSize; lock (m_regions) { bool connectedYN = false; foreach (RegionConnections conn in m_regions.Values) { #region commented /* // If we're one region over +x +y //xxy //xxx //xxx if ((((int)conn.X * (int)Constants.RegionSize) + conn.XEnd == (regionConnections.X * (int)Constants.RegionSize)) && (((int)conn.Y * (int)Constants.RegionSize) - conn.YEnd == (regionConnections.Y * (int)Constants.RegionSize))) { Vector3 offset = Vector3.Zero; offset.X = (((regionConnections.X * (int) Constants.RegionSize)) - ((conn.X * (int) Constants.RegionSize))); offset.Y = (((regionConnections.Y * (int) Constants.RegionSize)) - ((conn.Y * (int) Constants.RegionSize))); Vector3 extents = Vector3.Zero; extents.Y = regionConnections.YEnd + conn.YEnd; extents.X = conn.XEnd + conn.XEnd; m_log.DebugFormat("Scene: {0} to the northwest of Scene{1}. Offset: {2}. Extents:{3}", conn.RegionScene.RegionInfo.RegionName, regionConnections.RegionScene.RegionInfo.RegionName, offset, extents); scene.PhysicsScene.Combine(conn.RegionScene.PhysicsScene, offset, extents); connectedYN = true; break; } */ /* //If we're one region over x +y //xxx //xxx //xyx if ((((int)conn.X * (int)Constants.RegionSize) == (regionConnections.X * (int)Constants.RegionSize)) && (((int)conn.Y * (int)Constants.RegionSize) - conn.YEnd == (regionConnections.Y * (int)Constants.RegionSize))) { Vector3 offset = Vector3.Zero; offset.X = (((regionConnections.X * (int)Constants.RegionSize)) - ((conn.X * (int)Constants.RegionSize))); offset.Y = (((regionConnections.Y * (int)Constants.RegionSize)) - ((conn.Y * (int)Constants.RegionSize))); Vector3 extents = Vector3.Zero; extents.Y = regionConnections.YEnd + conn.YEnd; extents.X = conn.XEnd; m_log.DebugFormat("Scene: {0} to the north of Scene{1}. Offset: {2}. Extents:{3}", conn.RegionScene.RegionInfo.RegionName, regionConnections.RegionScene.RegionInfo.RegionName, offset, extents); scene.PhysicsScene.Combine(conn.RegionScene.PhysicsScene, offset, extents); connectedYN = true; break; } */ /* // If we're one region over -x +y //xxx //xxx //yxx if ((((int)conn.X * (int)Constants.RegionSize) - conn.XEnd == (regionConnections.X * (int)Constants.RegionSize)) && (((int)conn.Y * (int)Constants.RegionSize) - conn.YEnd == (regionConnections.Y * (int)Constants.RegionSize))) { Vector3 offset = Vector3.Zero; offset.X = (((regionConnections.X * (int)Constants.RegionSize)) - ((conn.X * (int)Constants.RegionSize))); offset.Y = (((regionConnections.Y * (int)Constants.RegionSize)) - ((conn.Y * (int)Constants.RegionSize))); Vector3 extents = Vector3.Zero; extents.Y = regionConnections.YEnd + conn.YEnd; extents.X = conn.XEnd + conn.XEnd; m_log.DebugFormat("Scene: {0} to the northeast of Scene. Offset: {2}. Extents:{3}", conn.RegionScene.RegionInfo.RegionName, regionConnections.RegionScene.RegionInfo.RegionName, offset, extents); scene.PhysicsScene.Combine(conn.RegionScene.PhysicsScene, offset, extents); connectedYN = true; break; } */ /* // If we're one region over -x y //xxx //yxx //xxx if ((((int)conn.X * (int)Constants.RegionSize) - conn.XEnd == (regionConnections.X * (int)Constants.RegionSize)) && (((int)conn.Y * (int)Constants.RegionSize) == (regionConnections.Y * (int)Constants.RegionSize))) { Vector3 offset = Vector3.Zero; offset.X = (((regionConnections.X * (int)Constants.RegionSize)) - ((conn.X * (int)Constants.RegionSize))); offset.Y = (((regionConnections.Y * (int)Constants.RegionSize)) - ((conn.Y * (int)Constants.RegionSize))); Vector3 extents = Vector3.Zero; extents.Y = regionConnections.YEnd; extents.X = conn.XEnd + conn.XEnd; m_log.DebugFormat("Scene: {0} to the east of Scene{1} Offset: {2}. Extents:{3}", conn.RegionScene.RegionInfo.RegionName, regionConnections.RegionScene.RegionInfo.RegionName, offset, extents); scene.PhysicsScene.Combine(conn.RegionScene.PhysicsScene, offset, extents); connectedYN = true; break; } */ /* // If we're one region over -x -y //yxx //xxx //xxx if ((((int)conn.X * (int)Constants.RegionSize) - conn.XEnd == (regionConnections.X * (int)Constants.RegionSize)) && (((int)conn.Y * (int)Constants.RegionSize) + conn.YEnd == (regionConnections.Y * (int)Constants.RegionSize))) { Vector3 offset = Vector3.Zero; offset.X = (((regionConnections.X * (int)Constants.RegionSize)) - ((conn.X * (int)Constants.RegionSize))); offset.Y = (((regionConnections.Y * (int)Constants.RegionSize)) - ((conn.Y * (int)Constants.RegionSize))); Vector3 extents = Vector3.Zero; extents.Y = regionConnections.YEnd + conn.YEnd; extents.X = conn.XEnd + conn.XEnd; m_log.DebugFormat("Scene: {0} to the northeast of Scene{1} Offset: {2}. Extents:{3}", conn.RegionScene.RegionInfo.RegionName, regionConnections.RegionScene.RegionInfo.RegionName, offset, extents); scene.PhysicsScene.Combine(conn.RegionScene.PhysicsScene, offset, extents); connectedYN = true; break; } */ #endregion // If we're one region over +x y //xxx //xxy //xxx if ((((int)conn.X * (int)Constants.RegionSize) + conn.XEnd >= (regionConnections.X * (int)Constants.RegionSize)) && (((int)conn.Y * (int)Constants.RegionSize) >= (regionConnections.Y * (int)Constants.RegionSize))) { connectedYN = DoWorkForOneRegionOverPlusXY(conn, regionConnections, scene); break; } // If we're one region over x +y //xyx //xxx //xxx if ((((int)conn.X * (int)Constants.RegionSize) >= (regionConnections.X * (int)Constants.RegionSize)) && (((int)conn.Y * (int)Constants.RegionSize) + conn.YEnd >= (regionConnections.Y * (int)Constants.RegionSize))) { connectedYN = DoWorkForOneRegionOverXPlusY(conn, regionConnections, scene); break; } // If we're one region over +x +y //xxy //xxx //xxx if ((((int)conn.X * (int)Constants.RegionSize) + conn.YEnd >= (regionConnections.X * (int)Constants.RegionSize)) && (((int)conn.Y * (int)Constants.RegionSize) + conn.YEnd >= (regionConnections.Y * (int)Constants.RegionSize))) { connectedYN = DoWorkForOneRegionOverPlusXPlusY(conn, regionConnections, scene); break; } } // If !connectYN means that this region is a root region if (!connectedYN) { DoWorkForRootRegion(regionConnections, scene); } } // Set up infinite borders around the entire AABB of the combined ConnectedRegions AdjustLargeRegionBounds(); }
/// <summary> /// Mock constructor for scene group persistency unit tests. /// SceneObjectGroup RegionId property is delegated to Scene. /// </summary> /// <param name="regInfo"></param> public Scene(RegionInfo regInfo) { BordersLocked = true; Border northBorder = new Border(); northBorder.BorderLine = new Vector3(float.MinValue, float.MaxValue, (int)Constants.RegionSize); //<--- northBorder.CrossDirection = Cardinals.N; NorthBorders.Add(northBorder); Border southBorder = new Border(); southBorder.BorderLine = new Vector3(float.MinValue, float.MaxValue, 0); //---> southBorder.CrossDirection = Cardinals.S; SouthBorders.Add(southBorder); Border eastBorder = new Border(); eastBorder.BorderLine = new Vector3(float.MinValue, float.MaxValue, (int)Constants.RegionSize); //<--- eastBorder.CrossDirection = Cardinals.E; EastBorders.Add(eastBorder); Border westBorder = new Border(); westBorder.BorderLine = new Vector3(float.MinValue, float.MaxValue, 0); //---> westBorder.CrossDirection = Cardinals.W; WestBorders.Add(westBorder); BordersLocked = false; m_regInfo = regInfo; m_eventManager = new EventManager(); m_permissions = new ScenePermissions(this); m_lastUpdate = Util.EnvironmentTickCount(); }
public Scene(RegionInfo regInfo, AgentCircuitManager authen, CommunicationsManager commsMan, SceneCommunicationService sceneGridService, StorageManager storeManager, ModuleLoader moduleLoader, bool dumpAssetsToFile, bool physicalPrim, bool SeeIntoRegionFromNeighbor, IConfigSource config, string simulatorVersion) { m_config = config; Random random = new Random(); BordersLocked = true; Border northBorder = new Border(); northBorder.BorderLine = new Vector3(float.MinValue, float.MaxValue, (int)Constants.RegionSize); //<--- northBorder.CrossDirection = Cardinals.N; NorthBorders.Add(northBorder); Border southBorder = new Border(); southBorder.BorderLine = new Vector3(float.MinValue, float.MaxValue, 0); //---> southBorder.CrossDirection = Cardinals.S; SouthBorders.Add(southBorder); Border eastBorder = new Border(); eastBorder.BorderLine = new Vector3(float.MinValue, float.MaxValue, (int)Constants.RegionSize); //<--- eastBorder.CrossDirection = Cardinals.E; EastBorders.Add(eastBorder); Border westBorder = new Border(); westBorder.BorderLine = new Vector3(float.MinValue, float.MaxValue, 0); //---> westBorder.CrossDirection = Cardinals.W; WestBorders.Add(westBorder); BordersLocked = false; m_lastAllocatedLocalId = (uint)(random.NextDouble() * (double)(uint.MaxValue/2))+(uint)(uint.MaxValue/4); m_moduleLoader = moduleLoader; m_authenticateHandler = authen; CommsManager = commsMan; m_sceneGridService = sceneGridService; m_storageManager = storeManager; m_regInfo = regInfo; m_regionHandle = m_regInfo.RegionHandle; m_regionName = m_regInfo.RegionName; m_datastore = m_regInfo.DataStore; m_lastUpdate = Util.EnvironmentTickCount(); m_physicalPrim = physicalPrim; m_seeIntoRegionFromNeighbor = SeeIntoRegionFromNeighbor; m_eventManager = new EventManager(); m_permissions = new ScenePermissions(this); m_asyncSceneObjectDeleter = new AsyncSceneObjectGroupDeleter(this); m_asyncSceneObjectDeleter.Enabled = true; // Load region settings m_regInfo.RegionSettings = m_storageManager.DataStore.LoadRegionSettings(m_regInfo.RegionID); if (m_storageManager.EstateDataStore != null) { m_regInfo.EstateSettings = m_storageManager.EstateDataStore.LoadEstateSettings(m_regInfo.RegionID); } //Bind Storage Manager functions to some land manager functions for this scene EventManager.OnLandObjectAdded += new EventManager.LandObjectAdded(m_storageManager.DataStore.StoreLandObject); EventManager.OnLandObjectRemoved += new EventManager.LandObjectRemoved(m_storageManager.DataStore.RemoveLandObject); m_sceneGraph = new SceneGraph(this, m_regInfo); // If the scene graph has an Unrecoverable error, restart this sim. // Currently the only thing that causes it to happen is two kinds of specific // Physics based crashes. // // Out of memory // Operating system has killed the plugin m_sceneGraph.UnRecoverableError += RestartNow; RegisterDefaultSceneEvents(); DumpAssetsToFile = dumpAssetsToFile; m_scripts_enabled = !RegionInfo.RegionSettings.DisableScripts; m_physics_enabled = !RegionInfo.RegionSettings.DisablePhysics; StatsReporter = new SimStatsReporter(this); StatsReporter.OnSendStatsResult += SendSimStatsPackets; StatsReporter.OnStatsIncorrect += m_sceneGraph.RecalculateStats; StatsReporter.SetObjectCapacity(objectCapacity); // Old /* m_simulatorVersion = simulatorVersion + " (OS " + Util.GetOperatingSystemInformation() + ")" + " ChilTasks:" + m_seeIntoRegionFromNeighbor.ToString() + " PhysPrim:" + m_physicalPrim.ToString(); */ m_simulatorVersion = simulatorVersion + " (" + Util.GetRuntimeInformation() + ")"; try { // Region config overrides global config // IConfig startupConfig = m_config.Configs["Startup"]; // Should we try to run loops synchronously or asynchronously? m_useAsyncWhenPossible = startupConfig.GetBoolean("use_async_when_possible", false); //Animation states m_useFlySlow = startupConfig.GetBoolean("enableflyslow", false); // TODO: Change default to true once the feature is supported m_usePreJump = startupConfig.GetBoolean("enableprejump", false); m_maxNonphys = startupConfig.GetFloat("NonPhysicalPrimMax", m_maxNonphys); if (RegionInfo.NonphysPrimMax > 0) { m_maxNonphys = RegionInfo.NonphysPrimMax; } m_maxPhys = startupConfig.GetFloat("PhysicalPrimMax", m_maxPhys); if (RegionInfo.PhysPrimMax > 0) { m_maxPhys = RegionInfo.PhysPrimMax; } // Here, if clamping is requested in either global or // local config, it will be used // m_clampPrimSize = startupConfig.GetBoolean("ClampPrimSize", m_clampPrimSize); if (RegionInfo.ClampPrimSize) { m_clampPrimSize = true; } m_trustBinaries = startupConfig.GetBoolean("TrustBinaries", m_trustBinaries); m_allowScriptCrossings = startupConfig.GetBoolean("AllowScriptCrossing", m_allowScriptCrossings); m_dontPersistBefore = startupConfig.GetLong("MinimumTimeBeforePersistenceConsidered", DEFAULT_MIN_TIME_FOR_PERSISTENCE); m_dontPersistBefore *= 10000000; m_persistAfter = startupConfig.GetLong("MaximumTimeBeforePersistenceConsidered", DEFAULT_MAX_TIME_FOR_PERSISTENCE); m_persistAfter *= 10000000; m_defaultScriptEngine = startupConfig.GetString("DefaultScriptEngine", "XEngine"); IConfig packetConfig = m_config.Configs["PacketPool"]; if (packetConfig != null) { PacketPool.Instance.RecyclePackets = packetConfig.GetBoolean("RecyclePackets", true); PacketPool.Instance.RecycleDataBlocks = packetConfig.GetBoolean("RecycleDataBlocks", true); } m_strictAccessControl = startupConfig.GetBoolean("StrictAccessControl", m_strictAccessControl); IConfig interest_management_config = m_config.Configs["InterestManagement"]; if (interest_management_config != null) { string update_prioritization_scheme = interest_management_config.GetString("UpdatePrioritizationScheme", "Time").Trim().ToLower(); switch (update_prioritization_scheme) { case "time": m_update_prioritization_scheme = UpdatePrioritizationSchemes.Time; break; case "distance": m_update_prioritization_scheme = UpdatePrioritizationSchemes.Distance; break; case "simpleangulardistance": m_update_prioritization_scheme = UpdatePrioritizationSchemes.SimpleAngularDistance; break; case "frontback": m_update_prioritization_scheme = UpdatePrioritizationSchemes.FrontBack; break; default: m_log.Warn("[SCENE]: UpdatePrioritizationScheme was not recognized, setting to default settomg of Time"); m_update_prioritization_scheme = UpdatePrioritizationSchemes.Time; break; } m_reprioritization_enabled = interest_management_config.GetBoolean("ReprioritizationEnabled", true); m_reprioritization_interval = interest_management_config.GetDouble("ReprioritizationInterval", 5000.0); m_root_reprioritization_distance = interest_management_config.GetDouble("RootReprioritizationDistance", 10.0); m_child_reprioritization_distance = interest_management_config.GetDouble("ChildReprioritizationDistance", 20.0); } m_log.Info("[SCENE]: Using the " + m_update_prioritization_scheme + " prioritization scheme"); #region BinaryStats try { IConfig statConfig = m_config.Configs["Statistics.Binary"]; if (statConfig.Contains("enabled") && statConfig.GetBoolean("enabled")) { if (statConfig.Contains("collect_region_stats")) { if (statConfig.GetBoolean("collect_region_stats")) { // if enabled, add us to the event. If not enabled, I won't get called StatsReporter.OnSendStatsResult += LogSimStats; } } if (statConfig.Contains("region_stats_period_seconds")) { m_statLogPeriod = TimeSpan.FromSeconds(statConfig.GetInt("region_stats_period_seconds")); } if (statConfig.Contains("stats_dir")) { m_statsDir = statConfig.GetString("stats_dir"); } } } catch { // if it doesn't work, we don't collect anything } #endregion BinaryStats } catch { m_log.Warn("[SCENE]: Failed to load StartupConfig"); } }
public void TestCrossSquare512() { TestHelper.InMethod(); List<Border> testborders = new List<Border>(); Border NorthBorder = new Border(); NorthBorder.BorderLine = new Vector3(0, 512, 512); NorthBorder.CrossDirection = Cardinals.N; testborders.Add(NorthBorder); Border SouthBorder = new Border(); SouthBorder.BorderLine = new Vector3(0, 512, 0); SouthBorder.CrossDirection = Cardinals.S; testborders.Add(SouthBorder); Border EastBorder = new Border(); EastBorder.BorderLine = new Vector3(0, 512, 512); EastBorder.CrossDirection = Cardinals.E; testborders.Add(EastBorder); Border WestBorder = new Border(); WestBorder.BorderLine = new Vector3(0, 512, 0); WestBorder.CrossDirection = Cardinals.W; testborders.Add(WestBorder); Vector3 position = new Vector3(450,220,21); foreach (Border b in testborders) { Assert.That(!b.TestCross(position)); } //Trigger east border position = new Vector3(513,220,21); foreach (Border b in testborders) { if (b.CrossDirection == Cardinals.E) Assert.That(b.TestCross(position)); else Assert.That(!b.TestCross(position)); } //Trigger west border position = new Vector3(-1, 220, 21); foreach (Border b in testborders) { if (b.CrossDirection == Cardinals.W) Assert.That(b.TestCross(position)); else Assert.That(!b.TestCross(position)); } //Trigger north border position = new Vector3(220, 513, 21); foreach (Border b in testborders) { if (b.CrossDirection == Cardinals.N) Assert.That(b.TestCross(position)); else Assert.That(!b.TestCross(position)); } //Trigger south border position = new Vector3(220, -1, 21); foreach (Border b in testborders) { if (b.CrossDirection == Cardinals.S) Assert.That(b.TestCross(position)); else Assert.That(!b.TestCross(position)); } }
public void TestCrossOdd512x512w256hole() { TestHelper.InMethod(); List<Border> testborders = new List<Border>(); // 512____ // | | // 256__| |___ // | | // |______| // 0 | 512 // 256 // Compound North border since the hole is at the top Border NorthBorder1 = new Border(); NorthBorder1.BorderLine = new Vector3(0, 256, 512); NorthBorder1.CrossDirection = Cardinals.N; testborders.Add(NorthBorder1); Border NorthBorder2 = new Border(); NorthBorder2.BorderLine = new Vector3(256, 512, 256); NorthBorder2.CrossDirection = Cardinals.N; testborders.Add(NorthBorder2); Border SouthBorder = new Border(); SouthBorder.BorderLine = new Vector3(0, 512, 0); SouthBorder.CrossDirection = Cardinals.S; testborders.Add(SouthBorder); //Compound East border Border EastBorder1 = new Border(); EastBorder1.BorderLine = new Vector3(0, 256, 512); EastBorder1.CrossDirection = Cardinals.E; testborders.Add(EastBorder1); Border EastBorder2 = new Border(); EastBorder2.BorderLine = new Vector3(257, 512, 256); EastBorder2.CrossDirection = Cardinals.E; testborders.Add(EastBorder2); Border WestBorder = new Border(); WestBorder.BorderLine = new Vector3(0, 512, 0); WestBorder.CrossDirection = Cardinals.W; testborders.Add(WestBorder); Vector3 position = new Vector3(450, 220, 21); foreach (Border b in testborders) { Assert.That(!b.TestCross(position)); } position = new Vector3(220, 450, 21); foreach (Border b in testborders) { Assert.That(!b.TestCross(position)); } bool result = false; int bordersTriggered = 0; position = new Vector3(450, 450, 21); foreach (Border b in testborders) { if (b.TestCross(position)) { bordersTriggered++; result = true; } } Assert.That(result); Assert.That(bordersTriggered == 2); }
public Scene(RegionInfo regInfo, AgentCircuitManager authen, SceneCommunicationService sceneGridService, ISimulationDataService simDataService, IEstateDataService estateDataService, ModuleLoader moduleLoader, bool dumpAssetsToFile, bool physicalPrim, bool SeeIntoRegionFromNeighbor, IConfigSource config, string simulatorVersion) { m_config = config; Random random = new Random(); BordersLocked = true; Border northBorder = new Border(); northBorder.BorderLine = new Vector3(float.MinValue, float.MaxValue, (int)Constants.RegionSize); //<--- northBorder.CrossDirection = Cardinals.N; NorthBorders.Add(northBorder); Border southBorder = new Border(); southBorder.BorderLine = new Vector3(float.MinValue, float.MaxValue, 0); //---> southBorder.CrossDirection = Cardinals.S; SouthBorders.Add(southBorder); Border eastBorder = new Border(); eastBorder.BorderLine = new Vector3(float.MinValue, float.MaxValue, (int)Constants.RegionSize); //<--- eastBorder.CrossDirection = Cardinals.E; EastBorders.Add(eastBorder); Border westBorder = new Border(); westBorder.BorderLine = new Vector3(float.MinValue, float.MaxValue, 0); //---> westBorder.CrossDirection = Cardinals.W; WestBorders.Add(westBorder); BordersLocked = false; m_lastAllocatedLocalId = (uint)(random.NextDouble() * (double)(uint.MaxValue/2))+(uint)(uint.MaxValue/4); m_moduleLoader = moduleLoader; m_authenticateHandler = authen; m_sceneGridService = sceneGridService; m_SimulationDataService = simDataService; m_EstateDataService = estateDataService; m_regInfo = regInfo; m_regionHandle = m_regInfo.RegionHandle; m_regionName = m_regInfo.RegionName; m_datastore = m_regInfo.DataStore; m_lastUpdate = Util.EnvironmentTickCount(); m_physicalPrim = physicalPrim; m_seeIntoRegionFromNeighbor = SeeIntoRegionFromNeighbor; m_eventManager = new EventManager(); m_permissions = new ScenePermissions(this); m_asyncSceneObjectDeleter = new AsyncSceneObjectGroupDeleter(this); m_asyncSceneObjectDeleter.Enabled = true; #region Region Settings // Load region settings m_regInfo.RegionSettings = simDataService.LoadRegionSettings(m_regInfo.RegionID); if (estateDataService != null) m_regInfo.EstateSettings = estateDataService.LoadEstateSettings(m_regInfo.RegionID, false); #endregion Region Settings MainConsole.Instance.Commands.AddCommand("region", false, "reload estate", "reload estate", "Reload the estate data", HandleReloadEstate); //Bind Storage Manager functions to some land manager functions for this scene EventManager.OnLandObjectAdded += new EventManager.LandObjectAdded(simDataService.StoreLandObject); EventManager.OnLandObjectRemoved += new EventManager.LandObjectRemoved(simDataService.RemoveLandObject); m_sceneGraph = new SceneGraph(this, m_regInfo); // If the scene graph has an Unrecoverable error, restart this sim. // Currently the only thing that causes it to happen is two kinds of specific // Physics based crashes. // // Out of memory // Operating system has killed the plugin m_sceneGraph.UnRecoverableError += RestartNow; RegisterDefaultSceneEvents(); DumpAssetsToFile = dumpAssetsToFile; m_scripts_enabled = !RegionInfo.RegionSettings.DisableScripts; m_physics_enabled = !RegionInfo.RegionSettings.DisablePhysics; StatsReporter = new SimStatsReporter(this); StatsReporter.OnSendStatsResult += SendSimStatsPackets; StatsReporter.OnStatsIncorrect += m_sceneGraph.RecalculateStats; // Old /* m_simulatorVersion = simulatorVersion + " (OS " + Util.GetOperatingSystemInformation() + ")" + " ChilTasks:" + m_seeIntoRegionFromNeighbor.ToString() + " PhysPrim:" + m_physicalPrim.ToString(); */ m_simulatorVersion = simulatorVersion + " (" + Util.GetRuntimeInformation() + ")"; #region Region Config try { // Region config overrides global config // IConfig startupConfig = m_config.Configs["Startup"]; //Animation states m_useFlySlow = startupConfig.GetBoolean("enableflyslow", false); // TODO: Change default to true once the feature is supported m_usePreJump = startupConfig.GetBoolean("enableprejump", false); m_maxNonphys = startupConfig.GetFloat("NonPhysicalPrimMax", m_maxNonphys); if (RegionInfo.NonphysPrimMax > 0) { m_maxNonphys = RegionInfo.NonphysPrimMax; } m_maxPhys = startupConfig.GetFloat("PhysicalPrimMax", m_maxPhys); if (RegionInfo.PhysPrimMax > 0) { m_maxPhys = RegionInfo.PhysPrimMax; } // Here, if clamping is requested in either global or // local config, it will be used // m_clampPrimSize = startupConfig.GetBoolean("ClampPrimSize", m_clampPrimSize); if (RegionInfo.ClampPrimSize) { m_clampPrimSize = true; } m_trustBinaries = startupConfig.GetBoolean("TrustBinaries", m_trustBinaries); m_allowScriptCrossings = startupConfig.GetBoolean("AllowScriptCrossing", m_allowScriptCrossings); m_dontPersistBefore = startupConfig.GetLong("MinimumTimeBeforePersistenceConsidered", DEFAULT_MIN_TIME_FOR_PERSISTENCE); m_dontPersistBefore *= 10000000; m_persistAfter = startupConfig.GetLong("MaximumTimeBeforePersistenceConsidered", DEFAULT_MAX_TIME_FOR_PERSISTENCE); m_persistAfter *= 10000000; m_defaultScriptEngine = startupConfig.GetString("DefaultScriptEngine", "XEngine"); IConfig packetConfig = m_config.Configs["PacketPool"]; if (packetConfig != null) { PacketPool.Instance.RecyclePackets = packetConfig.GetBoolean("RecyclePackets", true); PacketPool.Instance.RecycleDataBlocks = packetConfig.GetBoolean("RecycleDataBlocks", true); } m_strictAccessControl = startupConfig.GetBoolean("StrictAccessControl", m_strictAccessControl); m_generateMaptiles = startupConfig.GetBoolean("GenerateMaptiles", true); if (m_generateMaptiles) { int maptileRefresh = startupConfig.GetInt("MaptileRefresh", 0); if (maptileRefresh != 0) { m_mapGenerationTimer.Interval = maptileRefresh * 1000; m_mapGenerationTimer.Elapsed += RegenerateMaptile; m_mapGenerationTimer.AutoReset = true; m_mapGenerationTimer.Start(); } } else { string tile = startupConfig.GetString("MaptileStaticUUID", UUID.Zero.ToString()); UUID tileID; if (UUID.TryParse(tile, out tileID)) { RegionInfo.RegionSettings.TerrainImageID = tileID; } } Random rnd = new Random(); GenerationSeed = startupConfig.GetLong("TerragenSeed", (long)rnd.Next()); } catch { m_log.Warn("[SCENE]: Failed to load StartupConfig"); } #endregion Region Config #region Interest Management if (m_config != null) { IConfig interestConfig = m_config.Configs["InterestManagement"]; if (interestConfig != null) { string update_prioritization_scheme = interestConfig.GetString("UpdatePrioritizationScheme", "Time").Trim().ToLower(); try { m_priorityScheme = (UpdatePrioritizationSchemes)Enum.Parse(typeof(UpdatePrioritizationSchemes), update_prioritization_scheme, true); } catch (Exception) { m_log.Warn("[PRIORITIZER]: UpdatePrioritizationScheme was not recognized, setting to default prioritizer Time"); m_priorityScheme = UpdatePrioritizationSchemes.Time; } m_reprioritizationEnabled = interestConfig.GetBoolean("ReprioritizationEnabled", true); m_reprioritizationInterval = interestConfig.GetDouble("ReprioritizationInterval", 5000.0); m_rootReprioritizationDistance = interestConfig.GetDouble("RootReprioritizationDistance", 10.0); m_childReprioritizationDistance = interestConfig.GetDouble("ChildReprioritizationDistance", 20.0); } } m_log.Info("[SCENE]: Using the " + m_priorityScheme + " prioritization scheme"); #endregion Interest Management }
public Scene(RegionInfo regInfo, AgentCircuitManager authen, SceneCommunicationService sceneGridService, IConfigSource config, string simulatorVersion, ISimulationDataService simDataService, IStatsCollector stats) { //THIS NEEDS RESET TO FIX RESTARTS shuttingdown = false; m_stats = stats; m_config = config; Random random = new Random(); m_lastAllocatedLocalId = (uint)(random.NextDouble() * (double)(uint.MaxValue / 2)) + (uint)(uint.MaxValue / 4); m_authenticateHandler = authen; m_sceneGridService = sceneGridService; m_regInfo = regInfo; m_lastUpdate = Util.EnvironmentTickCount(); BordersLocked = true; Border northBorder = new Border(); northBorder.BorderLine = new Vector3(float.MinValue, float.MaxValue, (int)Constants.RegionSize); //<--- northBorder.CrossDirection = Cardinals.N; NorthBorders.Add(northBorder); Border southBorder = new Border(); southBorder.BorderLine = new Vector3(float.MinValue, float.MaxValue, 0); //---> southBorder.CrossDirection = Cardinals.S; SouthBorders.Add(southBorder); Border eastBorder = new Border(); eastBorder.BorderLine = new Vector3(float.MinValue, float.MaxValue, (int)Constants.RegionSize); //<--- eastBorder.CrossDirection = Cardinals.E; EastBorders.Add(eastBorder); Border westBorder = new Border(); westBorder.BorderLine = new Vector3(float.MinValue, float.MaxValue, 0); //---> westBorder.CrossDirection = Cardinals.W; WestBorders.Add(westBorder); BordersLocked = false; AuroraEventManager = new AuroraEventManager(); m_eventManager = new EventManager(); m_permissions = new ScenePermissions(this); m_asyncSceneObjectDeleter = new AsyncSceneObjectGroupDeleter(this); m_asyncSceneObjectDeleter.Enabled = true; m_SimulationDataService = simDataService; // Load region settings m_regInfo.RegionSettings = m_SimulationDataService.LoadRegionSettings(m_regInfo.RegionID); FindEstateInfo(); //Bind Storage Manager functions to some land manager functions for this scene IParcelServiceConnector conn = DataManager.RequestPlugin<IParcelServiceConnector>(); if(conn != null) { EventManager.OnLandObjectAdded += new EventManager.LandObjectAdded(conn.StoreLandObject); EventManager.OnLandObjectRemoved += new EventManager.LandObjectRemoved(conn.RemoveLandObject); } else { EventManager.OnLandObjectAdded += new EventManager.LandObjectAdded(SimulationDataService.StoreLandObject); EventManager.OnLandObjectRemoved += new EventManager.LandObjectRemoved(SimulationDataService.RemoveLandObject); } m_sceneGraph = new SceneGraph(this, m_regInfo); StatsReporter = new SimStatsReporter(this); StatsReporter.OnSendStatsResult += SendSimStatsPackets; StatsReporter.OnStatsIncorrect += m_sceneGraph.RecalculateStats; m_simulatorVersion = simulatorVersion + " (" + Util.GetRuntimeInformation() + ")"; #region Region Config try { DirectionsToBlockChildAgents = new bool[3,3]; DirectionsToBlockChildAgents.Initialize(); IConfig aurorastartupConfig = m_config.Configs["AuroraStartup"]; if (aurorastartupConfig != null) { RunScriptsInAttachments = aurorastartupConfig.GetBoolean("AllowRunningOfScriptsInAttachments", false); m_UseSelectionParticles = aurorastartupConfig.GetBoolean("UseSelectionParticles", true); EnableFakeRaycasting = aurorastartupConfig.GetBoolean("EnableFakeRaycasting", false); MaxLowValue = aurorastartupConfig.GetFloat("MaxLowValue", -1000); Util.RegionViewSize = aurorastartupConfig.GetInt("RegionSightSize", 1); Util.CloseLocalRegions = aurorastartupConfig.GetBoolean("CloseLocalAgents", true); m_DefaultObjectName = aurorastartupConfig.GetString("DefaultObjectName", m_DefaultObjectName); CheckForObjectCulling = aurorastartupConfig.GetBoolean("CheckForObjectCulling", CheckForObjectCulling); SetObjectCapacity(aurorastartupConfig.GetInt("ObjectCapacity", ObjectCapacity)); } IConfig regionConfig = m_config.Configs[this.RegionInfo.RegionName]; if (regionConfig != null) { #region Block Child Agents config // [{0,2}, {1, 2}, {2,2}] // [{0,1}, {1, 1}, {2,1}] 1,1 is the current region // [{0,0}, {1, 0}, {2,0}] //SouthWest DirectionsToBlockChildAgents[0, 0] = regionConfig.GetBoolean("BlockChildAgentsSouthWest", false); //South DirectionsToBlockChildAgents[1, 0] = regionConfig.GetBoolean("BlockChildAgentsSouth", false); //SouthEast DirectionsToBlockChildAgents[2, 0] = regionConfig.GetBoolean("BlockChildAgentsSouthEast", false); //West DirectionsToBlockChildAgents[0, 1] = regionConfig.GetBoolean("BlockChildAgentsWest", false); //East DirectionsToBlockChildAgents[2, 1] = regionConfig.GetBoolean("BlockChildAgentsEast", false); //NorthWest DirectionsToBlockChildAgents[0, 2] = regionConfig.GetBoolean("BlockChildAgentsNorthWest", false); //North DirectionsToBlockChildAgents[1, 2] = regionConfig.GetBoolean("BlockChildAgentsNorth", false); //NorthEast DirectionsToBlockChildAgents[2, 2] = regionConfig.GetBoolean("BlockChildAgentsNorthEast", false); #endregion } // Region config overrides global config // IConfig startupConfig = m_config.Configs["Startup"]; //Animation states IConfig animationConfig = m_config.Configs["Animations"]; if (animationConfig != null) { m_UseNewStyleMovement = animationConfig.GetBoolean("enableNewMovement", m_UseNewStyleMovement); m_usePreJump = animationConfig.GetBoolean("enableprejump", m_usePreJump); m_useSplatAnimation = animationConfig.GetBoolean("enableSplatAnimation", m_useSplatAnimation); } m_seeIntoRegionFromNeighbor = RegionInfo.SeeIntoThisSimFromNeighbor; m_trustBinaries = RegionInfo.TrustBinariesFromForeignSims; m_allowScriptCrossings = RegionInfo.AllowScriptCrossing; IConfig persistanceConfig = m_config.Configs["Persistance"]; if (persistanceConfig != null) { m_dontPersistBefore = persistanceConfig.GetLong("MinimumTimeBeforePersistenceConsidered", DEFAULT_MIN_TIME_FOR_PERSISTENCE); m_dontPersistBefore *= 10000000; m_persistAfter = persistanceConfig.GetLong("MaximumTimeBeforePersistenceConsidered", DEFAULT_MAX_TIME_FOR_PERSISTENCE); m_persistAfter *= 10000000; } else { m_dontPersistBefore = DEFAULT_MIN_TIME_FOR_PERSISTENCE; m_dontPersistBefore *= 10000000; m_persistAfter = DEFAULT_MAX_TIME_FOR_PERSISTENCE; m_persistAfter *= 10000000; } IConfig scriptEngineConfig = m_config.Configs["ScriptEngines"]; if (scriptEngineConfig != null) m_defaultScriptEngine = scriptEngineConfig.GetString("DefaultScriptEngine", "AuroraDotNetEngine"); IConfig packetConfig = m_config.Configs["PacketPool"]; if (packetConfig != null) { PacketPool.Instance.RecyclePackets = packetConfig.GetBoolean("RecyclePackets", true); PacketPool.Instance.RecycleDataBlocks = packetConfig.GetBoolean("RecycleDataBlocks", true); } m_strictAccessControl = startupConfig.GetBoolean("StrictAccessControl", m_strictAccessControl); } catch { m_log.Warn("[SCENE]: Failed to load StartupConfig"); } #endregion Region Config #region Interest Management if (m_config != null) { IConfig interestConfig = m_config.Configs["InterestManagement"]; if (interestConfig != null) { string update_prioritization_scheme = interestConfig.GetString("UpdatePrioritizationScheme", "Time").Trim().ToLower(); try { m_priorityScheme = (UpdatePrioritizationSchemes)Enum.Parse(typeof(UpdatePrioritizationSchemes), update_prioritization_scheme, true); } catch (Exception) { m_log.Warn("[PRIORITIZER]: UpdatePrioritizationScheme was not recognized, setting to default prioritizer Time"); m_priorityScheme = UpdatePrioritizationSchemes.Time; } m_reprioritizationEnabled = interestConfig.GetBoolean("ReprioritizationEnabled", true); m_reprioritizationInterval = interestConfig.GetDouble("ReprioritizationInterval", 5000.0); m_rootReprioritizationDistance = interestConfig.GetDouble("RootReprioritizationDistance", 10.0); m_childReprioritizationDistance = interestConfig.GetDouble("ChildReprioritizationDistance", 20.0); } } //m_log.Info("[SCENE]: Using the " + m_priorityScheme + " prioritization scheme"); #endregion Interest Management #region Startup Complete config EventManager.OnAddToStartupQueue += AddToStartupQueue; EventManager.OnFinishedStartup += FinishedStartup; EventManager.OnStartupComplete += StartupComplete; AddToStartupQueue("Startup"); #endregion LoadWorldMap(); //Add stats handlers MainServer.Instance.AddStreamHandler(new RegionStatsHandler(RegionInfo)); }
private void RegionLoadedDoWork(Scene scene) { /* // For testing on a single instance if (scene.RegionInfo.RegionLocX == 1004 && scene.RegionInfo.RegionLocY == 1000) return; // */ lock (m_startingScenes) m_startingScenes.Add(scene.RegionInfo.originRegionID, scene); // Give each region a standard set of non-infinite borders Border northBorder = new Border(); northBorder.BorderLine = new Vector3(0, (int)Constants.RegionSize, (int)Constants.RegionSize); //<--- northBorder.CrossDirection = Cardinals.N; scene.NorthBorders[0] = northBorder; Border southBorder = new Border(); southBorder.BorderLine = new Vector3(0, (int)Constants.RegionSize, 0); //---> southBorder.CrossDirection = Cardinals.S; scene.SouthBorders[0] = southBorder; Border eastBorder = new Border(); eastBorder.BorderLine = new Vector3(0, (int)Constants.RegionSize, (int)Constants.RegionSize); //<--- eastBorder.CrossDirection = Cardinals.E; scene.EastBorders[0] = eastBorder; Border westBorder = new Border(); westBorder.BorderLine = new Vector3(0, (int)Constants.RegionSize, 0); //---> westBorder.CrossDirection = Cardinals.W; scene.WestBorders[0] = westBorder; RegionConnections regionConnections = new RegionConnections(); regionConnections.ConnectedRegions = new List<RegionData>(); regionConnections.RegionScene = scene; regionConnections.RegionLandChannel = scene.LandChannel; regionConnections.RegionId = scene.RegionInfo.originRegionID; regionConnections.X = scene.RegionInfo.RegionLocX; regionConnections.Y = scene.RegionInfo.RegionLocY; regionConnections.XEnd = (int)Constants.RegionSize; regionConnections.YEnd = (int)Constants.RegionSize; lock (m_regions) { bool connectedYN = false; foreach (RegionConnections conn in m_regions.Values) { #region commented /* // If we're one region over +x +y //xxy //xxx //xxx if ((((int)conn.X * (int)Constants.RegionSize) + conn.XEnd == (regionConnections.X * (int)Constants.RegionSize)) && (((int)conn.Y * (int)Constants.RegionSize) - conn.YEnd == (regionConnections.Y * (int)Constants.RegionSize))) { Vector3 offset = Vector3.Zero; offset.X = (((regionConnections.X * (int) Constants.RegionSize)) - ((conn.X * (int) Constants.RegionSize))); offset.Y = (((regionConnections.Y * (int) Constants.RegionSize)) - ((conn.Y * (int) Constants.RegionSize))); Vector3 extents = Vector3.Zero; extents.Y = regionConnections.YEnd + conn.YEnd; extents.X = conn.XEnd + conn.XEnd; m_log.DebugFormat("Scene: {0} to the northwest of Scene{1}. Offset: {2}. Extents:{3}", conn.RegionScene.RegionInfo.RegionName, regionConnections.RegionScene.RegionInfo.RegionName, offset, extents); scene.PhysicsScene.Combine(conn.RegionScene.PhysicsScene, offset, extents); connectedYN = true; break; } */ /* //If we're one region over x +y //xxx //xxx //xyx if ((((int)conn.X * (int)Constants.RegionSize) == (regionConnections.X * (int)Constants.RegionSize)) && (((int)conn.Y * (int)Constants.RegionSize) - conn.YEnd == (regionConnections.Y * (int)Constants.RegionSize))) { Vector3 offset = Vector3.Zero; offset.X = (((regionConnections.X * (int)Constants.RegionSize)) - ((conn.X * (int)Constants.RegionSize))); offset.Y = (((regionConnections.Y * (int)Constants.RegionSize)) - ((conn.Y * (int)Constants.RegionSize))); Vector3 extents = Vector3.Zero; extents.Y = regionConnections.YEnd + conn.YEnd; extents.X = conn.XEnd; m_log.DebugFormat("Scene: {0} to the north of Scene{1}. Offset: {2}. Extents:{3}", conn.RegionScene.RegionInfo.RegionName, regionConnections.RegionScene.RegionInfo.RegionName, offset, extents); scene.PhysicsScene.Combine(conn.RegionScene.PhysicsScene, offset, extents); connectedYN = true; break; } */ /* // If we're one region over -x +y //xxx //xxx //yxx if ((((int)conn.X * (int)Constants.RegionSize) - conn.XEnd == (regionConnections.X * (int)Constants.RegionSize)) && (((int)conn.Y * (int)Constants.RegionSize) - conn.YEnd == (regionConnections.Y * (int)Constants.RegionSize))) { Vector3 offset = Vector3.Zero; offset.X = (((regionConnections.X * (int)Constants.RegionSize)) - ((conn.X * (int)Constants.RegionSize))); offset.Y = (((regionConnections.Y * (int)Constants.RegionSize)) - ((conn.Y * (int)Constants.RegionSize))); Vector3 extents = Vector3.Zero; extents.Y = regionConnections.YEnd + conn.YEnd; extents.X = conn.XEnd + conn.XEnd; m_log.DebugFormat("Scene: {0} to the northeast of Scene. Offset: {2}. Extents:{3}", conn.RegionScene.RegionInfo.RegionName, regionConnections.RegionScene.RegionInfo.RegionName, offset, extents); scene.PhysicsScene.Combine(conn.RegionScene.PhysicsScene, offset, extents); connectedYN = true; break; } */ /* // If we're one region over -x y //xxx //yxx //xxx if ((((int)conn.X * (int)Constants.RegionSize) - conn.XEnd == (regionConnections.X * (int)Constants.RegionSize)) && (((int)conn.Y * (int)Constants.RegionSize) == (regionConnections.Y * (int)Constants.RegionSize))) { Vector3 offset = Vector3.Zero; offset.X = (((regionConnections.X * (int)Constants.RegionSize)) - ((conn.X * (int)Constants.RegionSize))); offset.Y = (((regionConnections.Y * (int)Constants.RegionSize)) - ((conn.Y * (int)Constants.RegionSize))); Vector3 extents = Vector3.Zero; extents.Y = regionConnections.YEnd; extents.X = conn.XEnd + conn.XEnd; m_log.DebugFormat("Scene: {0} to the east of Scene{1} Offset: {2}. Extents:{3}", conn.RegionScene.RegionInfo.RegionName, regionConnections.RegionScene.RegionInfo.RegionName, offset, extents); scene.PhysicsScene.Combine(conn.RegionScene.PhysicsScene, offset, extents); connectedYN = true; break; } */ /* // If we're one region over -x -y //yxx //xxx //xxx if ((((int)conn.X * (int)Constants.RegionSize) - conn.XEnd == (regionConnections.X * (int)Constants.RegionSize)) && (((int)conn.Y * (int)Constants.RegionSize) + conn.YEnd == (regionConnections.Y * (int)Constants.RegionSize))) { Vector3 offset = Vector3.Zero; offset.X = (((regionConnections.X * (int)Constants.RegionSize)) - ((conn.X * (int)Constants.RegionSize))); offset.Y = (((regionConnections.Y * (int)Constants.RegionSize)) - ((conn.Y * (int)Constants.RegionSize))); Vector3 extents = Vector3.Zero; extents.Y = regionConnections.YEnd + conn.YEnd; extents.X = conn.XEnd + conn.XEnd; m_log.DebugFormat("Scene: {0} to the northeast of Scene{1} Offset: {2}. Extents:{3}", conn.RegionScene.RegionInfo.RegionName, regionConnections.RegionScene.RegionInfo.RegionName, offset, extents); scene.PhysicsScene.Combine(conn.RegionScene.PhysicsScene, offset, extents); connectedYN = true; break; } */ #endregion // If we're one region over +x y //xxx //xxy //xxx if ((((int)conn.X * (int)Constants.RegionSize) + conn.XEnd >= (regionConnections.X * (int)Constants.RegionSize)) && (((int)conn.Y * (int)Constants.RegionSize) >= (regionConnections.Y * (int)Constants.RegionSize))) { Vector3 offset = Vector3.Zero; offset.X = (((regionConnections.X * (int)Constants.RegionSize)) - ((conn.X * (int)Constants.RegionSize))); offset.Y = (((regionConnections.Y * (int)Constants.RegionSize)) - ((conn.Y * (int)Constants.RegionSize))); Vector3 extents = Vector3.Zero; extents.Y = conn.YEnd; extents.X = conn.XEnd + regionConnections.XEnd; conn.UpdateExtents(extents); m_log.DebugFormat("Scene: {0} to the west of Scene{1} Offset: {2}. Extents:{3}", conn.RegionScene.RegionInfo.RegionName, regionConnections.RegionScene.RegionInfo.RegionName, offset, extents); scene.BordersLocked = true; conn.RegionScene.BordersLocked = true; RegionData ConnectedRegion = new RegionData(); ConnectedRegion.Offset = offset; ConnectedRegion.RegionId = scene.RegionInfo.originRegionID; ConnectedRegion.RegionScene = scene; conn.ConnectedRegions.Add(ConnectedRegion); // Inform root region Physics about the extents of this region conn.RegionScene.PhysicsScene.Combine(null, Vector3.Zero, extents); // Inform Child region that it needs to forward it's terrain to the root region scene.PhysicsScene.Combine(conn.RegionScene.PhysicsScene, offset, Vector3.Zero); // Extend the borders as appropriate lock (conn.RegionScene.EastBorders) conn.RegionScene.EastBorders[0].BorderLine.Z += (int)Constants.RegionSize; lock (conn.RegionScene.NorthBorders) conn.RegionScene.NorthBorders[0].BorderLine.Y += (int)Constants.RegionSize; lock (conn.RegionScene.SouthBorders) conn.RegionScene.SouthBorders[0].BorderLine.Y += (int)Constants.RegionSize; lock (scene.WestBorders) { scene.WestBorders[0].BorderLine.Z = (int)((scene.RegionInfo.RegionLocX - conn.RegionScene.RegionInfo.RegionLocX) * (int)Constants.RegionSize); //auto teleport West // Trigger auto teleport to root region scene.WestBorders[0].TriggerRegionX = conn.RegionScene.RegionInfo.RegionLocX; scene.WestBorders[0].TriggerRegionY = conn.RegionScene.RegionInfo.RegionLocY; } // Reset Terrain.. since terrain loads before we get here, we need to load // it again so it loads in the root region scene.PhysicsScene.SetTerrain(scene.Heightmap.GetFloatsSerialised()); // Unlock borders conn.RegionScene.BordersLocked = false; scene.BordersLocked = false; // Create a client event forwarder and add this region's events to the root region. if (conn.ClientEventForwarder != null) conn.ClientEventForwarder.AddSceneToEventForwarding(scene); connectedYN = true; break; } // If we're one region over x +y //xyx //xxx //xxx if ((((int)conn.X * (int)Constants.RegionSize) >= (regionConnections.X * (int)Constants.RegionSize)) && (((int)conn.Y * (int)Constants.RegionSize) + conn.YEnd >= (regionConnections.Y * (int)Constants.RegionSize))) { Vector3 offset = Vector3.Zero; offset.X = (((regionConnections.X * (int)Constants.RegionSize)) - ((conn.X * (int)Constants.RegionSize))); offset.Y = (((regionConnections.Y * (int)Constants.RegionSize)) - ((conn.Y * (int)Constants.RegionSize))); Vector3 extents = Vector3.Zero; extents.Y = regionConnections.YEnd + conn.YEnd; extents.X = conn.XEnd; conn.UpdateExtents(extents); scene.BordersLocked = true; conn.RegionScene.BordersLocked = true; RegionData ConnectedRegion = new RegionData(); ConnectedRegion.Offset = offset; ConnectedRegion.RegionId = scene.RegionInfo.originRegionID; ConnectedRegion.RegionScene = scene; conn.ConnectedRegions.Add(ConnectedRegion); m_log.DebugFormat("Scene: {0} to the northeast of Scene{1} Offset: {2}. Extents:{3}", conn.RegionScene.RegionInfo.RegionName, regionConnections.RegionScene.RegionInfo.RegionName, offset, extents); conn.RegionScene.PhysicsScene.Combine(null, Vector3.Zero, extents); scene.PhysicsScene.Combine(conn.RegionScene.PhysicsScene, offset, Vector3.Zero); lock (conn.RegionScene.NorthBorders) conn.RegionScene.NorthBorders[0].BorderLine.Z += (int)Constants.RegionSize; lock (conn.RegionScene.EastBorders) conn.RegionScene.EastBorders[0].BorderLine.Y += (int)Constants.RegionSize; lock (conn.RegionScene.WestBorders) conn.RegionScene.WestBorders[0].BorderLine.Y += (int)Constants.RegionSize; lock (scene.SouthBorders) { scene.SouthBorders[0].BorderLine.Z = (int)((scene.RegionInfo.RegionLocY - conn.RegionScene.RegionInfo.RegionLocY) * (int)Constants.RegionSize); //auto teleport south scene.SouthBorders[0].TriggerRegionX = conn.RegionScene.RegionInfo.RegionLocX; scene.SouthBorders[0].TriggerRegionY = conn.RegionScene.RegionInfo.RegionLocY; } // Reset Terrain.. since terrain normally loads first. //conn.RegionScene.PhysicsScene.SetTerrain(conn.RegionScene.Heightmap.GetFloatsSerialised()); scene.PhysicsScene.SetTerrain(scene.Heightmap.GetFloatsSerialised()); //conn.RegionScene.PhysicsScene.SetTerrain(conn.RegionScene.Heightmap.GetFloatsSerialised()); scene.BordersLocked = false; conn.RegionScene.BordersLocked = false; if (conn.ClientEventForwarder != null) conn.ClientEventForwarder.AddSceneToEventForwarding(scene); connectedYN = true; break; } // If we're one region over +x +y //xxy //xxx //xxx if ((((int)conn.X * (int)Constants.RegionSize) + conn.YEnd >= (regionConnections.X * (int)Constants.RegionSize)) && (((int)conn.Y * (int)Constants.RegionSize) + conn.YEnd >= (regionConnections.Y * (int)Constants.RegionSize))) { Vector3 offset = Vector3.Zero; offset.X = (((regionConnections.X * (int)Constants.RegionSize)) - ((conn.X * (int)Constants.RegionSize))); offset.Y = (((regionConnections.Y * (int)Constants.RegionSize)) - ((conn.Y * (int)Constants.RegionSize))); Vector3 extents = Vector3.Zero; extents.Y = regionConnections.YEnd + conn.YEnd; extents.X = regionConnections.XEnd + conn.XEnd; conn.UpdateExtents(extents); scene.BordersLocked = true; conn.RegionScene.BordersLocked = true; RegionData ConnectedRegion = new RegionData(); ConnectedRegion.Offset = offset; ConnectedRegion.RegionId = scene.RegionInfo.originRegionID; ConnectedRegion.RegionScene = scene; conn.ConnectedRegions.Add(ConnectedRegion); m_log.DebugFormat("Scene: {0} to the NorthEast of Scene{1} Offset: {2}. Extents:{3}", conn.RegionScene.RegionInfo.RegionName, regionConnections.RegionScene.RegionInfo.RegionName, offset, extents); conn.RegionScene.PhysicsScene.Combine(null, Vector3.Zero, extents); scene.PhysicsScene.Combine(conn.RegionScene.PhysicsScene, offset, Vector3.Zero); lock (conn.RegionScene.NorthBorders) { if (conn.RegionScene.NorthBorders.Count == 1)// && 2) { //compound border // already locked above conn.RegionScene.NorthBorders[0].BorderLine.Z += (int)Constants.RegionSize; lock (conn.RegionScene.EastBorders) conn.RegionScene.EastBorders[0].BorderLine.Y += (int)Constants.RegionSize; lock (conn.RegionScene.WestBorders) conn.RegionScene.WestBorders[0].BorderLine.Y += (int)Constants.RegionSize; } } lock (scene.SouthBorders) { scene.SouthBorders[0].BorderLine.Z = (int)((scene.RegionInfo.RegionLocY - conn.RegionScene.RegionInfo.RegionLocY) * (int)Constants.RegionSize); //auto teleport south scene.SouthBorders[0].TriggerRegionX = conn.RegionScene.RegionInfo.RegionLocX; scene.SouthBorders[0].TriggerRegionY = conn.RegionScene.RegionInfo.RegionLocY; } lock (conn.RegionScene.EastBorders) { if (conn.RegionScene.EastBorders.Count == 1)// && conn.RegionScene.EastBorders.Count == 2) { conn.RegionScene.EastBorders[0].BorderLine.Z += (int)Constants.RegionSize; lock (conn.RegionScene.NorthBorders) conn.RegionScene.NorthBorders[0].BorderLine.Y += (int)Constants.RegionSize; lock (conn.RegionScene.SouthBorders) conn.RegionScene.SouthBorders[0].BorderLine.Y += (int)Constants.RegionSize; } } lock (scene.WestBorders) { scene.WestBorders[0].BorderLine.Z = (int)((scene.RegionInfo.RegionLocX - conn.RegionScene.RegionInfo.RegionLocX) * (int)Constants.RegionSize); //auto teleport West scene.WestBorders[0].TriggerRegionX = conn.RegionScene.RegionInfo.RegionLocX; scene.WestBorders[0].TriggerRegionY = conn.RegionScene.RegionInfo.RegionLocY; } /* else { conn.RegionScene.NorthBorders[0].BorderLine.Z += (int)Constants.RegionSize; conn.RegionScene.EastBorders[0].BorderLine.Y += (int)Constants.RegionSize; conn.RegionScene.WestBorders[0].BorderLine.Y += (int)Constants.RegionSize; scene.SouthBorders[0].BorderLine.Z += (int)Constants.RegionSize; //auto teleport south } */ // Reset Terrain.. since terrain normally loads first. //conn.RegionScene.PhysicsScene.SetTerrain(conn.RegionScene.Heightmap.GetFloatsSerialised()); scene.PhysicsScene.SetTerrain(scene.Heightmap.GetFloatsSerialised()); //conn.RegionScene.PhysicsScene.SetTerrain(conn.RegionScene.Heightmap.GetFloatsSerialised()); scene.BordersLocked = false; conn.RegionScene.BordersLocked = false; if (conn.ClientEventForwarder != null) conn.ClientEventForwarder.AddSceneToEventForwarding(scene); connectedYN = true; //scene.PhysicsScene.Combine(conn.RegionScene.PhysicsScene, offset,extents); break; } } // If !connectYN means that this region is a root region if (!connectedYN) { RegionData rdata = new RegionData(); rdata.Offset = Vector3.Zero; rdata.RegionId = scene.RegionInfo.originRegionID; rdata.RegionScene = scene; // save it's land channel regionConnections.RegionLandChannel = scene.LandChannel; // Substitue our landchannel RegionCombinerLargeLandChannel lnd = new RegionCombinerLargeLandChannel(rdata, scene.LandChannel, regionConnections.ConnectedRegions); scene.LandChannel = lnd; // Forward the permissions modules of each of the connected regions to the root region lock (m_regions) { foreach (RegionData r in regionConnections.ConnectedRegions) { ForwardPermissionRequests(regionConnections, r.RegionScene); } } // Create the root region's Client Event Forwarder regionConnections.ClientEventForwarder = new RegionCombinerClientEventForwarder(regionConnections); // Sets up the CoarseLocationUpdate forwarder for this root region scene.EventManager.OnNewPresence += SetCourseLocationDelegate; // Adds this root region to a dictionary of regions that are connectable m_regions.Add(scene.RegionInfo.originRegionID, regionConnections); } } // Set up infinite borders around the entire AABB of the combined ConnectedRegions AdjustLargeRegionBounds(); }
public Scene(RegionInfo regInfo, AgentCircuitManager authen, CommunicationsManager commsMan, SceneCommunicationService sceneGridService, StorageManager storeManager, ModuleLoader moduleLoader, bool dumpAssetsToFile, bool physicalPrim, bool SeeIntoRegionFromNeighbor, IConfigSource config, string simulatorVersion) { m_config = config; Random random = new Random(); BordersLocked = true; Border northBorder = new Border(); northBorder.BorderLine = new Vector3(float.MinValue, float.MaxValue, (int)Constants.RegionSize); //<--- northBorder.CrossDirection = Cardinals.N; NorthBorders.Add(northBorder); Border southBorder = new Border(); southBorder.BorderLine = new Vector3(float.MinValue, float.MaxValue, 0); //---> southBorder.CrossDirection = Cardinals.S; SouthBorders.Add(southBorder); Border eastBorder = new Border(); eastBorder.BorderLine = new Vector3(float.MinValue, float.MaxValue, (int)Constants.RegionSize); //<--- eastBorder.CrossDirection = Cardinals.E; EastBorders.Add(eastBorder); Border westBorder = new Border(); westBorder.BorderLine = new Vector3(float.MinValue, float.MaxValue, 0); //---> westBorder.CrossDirection = Cardinals.W; WestBorders.Add(westBorder); BordersLocked = false; m_lastAllocatedLocalId = (uint)(random.NextDouble() * (double)(uint.MaxValue/2))+(uint)(uint.MaxValue/4); m_moduleLoader = moduleLoader; m_authenticateHandler = authen; CommsManager = commsMan; m_sceneGridService = sceneGridService; m_storageManager = storeManager; m_regInfo = regInfo; m_regionHandle = m_regInfo.RegionHandle; m_regionName = m_regInfo.RegionName; m_datastore = m_regInfo.DataStore; m_physicalPrim = physicalPrim; m_seeIntoRegionFromNeighbor = SeeIntoRegionFromNeighbor; m_eventManager = new EventManager(); m_permissions = new ScenePermissions(this); m_asyncSceneObjectDeleter = new AsyncSceneObjectGroupDeleter(this); m_asyncSceneObjectDeleter.Enabled = true; // Load region settings m_regInfo.RegionSettings = m_storageManager.DataStore.LoadRegionSettings(m_regInfo.RegionID); if (m_storageManager.EstateDataStore != null) { m_regInfo.EstateSettings = m_storageManager.EstateDataStore.LoadEstateSettings(m_regInfo.RegionID); } //Bind Storage Manager functions to some land manager functions for this scene EventManager.OnLandObjectAdded += new EventManager.LandObjectAdded(m_storageManager.DataStore.StoreLandObject); EventManager.OnLandObjectRemoved += new EventManager.LandObjectRemoved(m_storageManager.DataStore.RemoveLandObject); m_sceneGraph = new SceneGraph(this, m_regInfo); // If the scene graph has an Unrecoverable error, restart this sim. // Currently the only thing that causes it to happen is two kinds of specific // Physics based crashes. // // Out of memory // Operating system has killed the plugin m_sceneGraph.UnRecoverableError += RestartNow; RegisterDefaultSceneEvents(); DumpAssetsToFile = dumpAssetsToFile; m_scripts_enabled = !RegionInfo.RegionSettings.DisableScripts; m_physics_enabled = !RegionInfo.RegionSettings.DisablePhysics; StatsReporter = new SimStatsReporter(this); StatsReporter.OnSendStatsResult += SendSimStatsPackets; StatsReporter.OnStatsIncorrect += m_sceneGraph.RecalculateStats; StatsReporter.SetObjectCapacity(objectCapacity); m_simulatorVersion = simulatorVersion + " (OS " + Util.GetOperatingSystemInformation() + ")" + " ChilTasks:" + m_seeIntoRegionFromNeighbor.ToString() + " PhysPrim:" + m_physicalPrim.ToString(); try { // Region config overrides global config // IConfig startupConfig = m_config.Configs["Startup"]; //Animation states m_useFlySlow = startupConfig.GetBoolean("enableflyslow", false); // TODO: Change default to true once the feature is supported m_usePreJump = startupConfig.GetBoolean("enableprejump", false); m_maxNonphys = startupConfig.GetFloat("NonPhysicalPrimMax", m_maxNonphys); if (RegionInfo.NonphysPrimMax > 0) { m_maxNonphys = RegionInfo.NonphysPrimMax; } m_maxPhys = startupConfig.GetFloat("PhysicalPrimMax", m_maxPhys); if (RegionInfo.PhysPrimMax > 0) { m_maxPhys = RegionInfo.PhysPrimMax; } // Here, if clamping is requested in either global or // local config, it will be used // m_clampPrimSize = startupConfig.GetBoolean("ClampPrimSize", m_clampPrimSize); if (RegionInfo.ClampPrimSize) { m_clampPrimSize = true; } m_trustBinaries = startupConfig.GetBoolean("TrustBinaries", m_trustBinaries); m_allowScriptCrossings = startupConfig.GetBoolean("AllowScriptCrossing", m_allowScriptCrossings); m_dontPersistBefore = startupConfig.GetLong("MinimumTimeBeforePersistenceConsidered", DEFAULT_MIN_TIME_FOR_PERSISTENCE); m_dontPersistBefore *= 10000000; m_persistAfter = startupConfig.GetLong("MaximumTimeBeforePersistenceConsidered", DEFAULT_MAX_TIME_FOR_PERSISTENCE); m_persistAfter *= 10000000; m_defaultScriptEngine = startupConfig.GetString("DefaultScriptEngine", "DotNetEngine"); m_maxPrimsPerFrame = startupConfig.GetInt("MaxPrimsPerFrame", 200); IConfig packetConfig = m_config.Configs["PacketPool"]; if (packetConfig != null) { PacketPool.Instance.RecyclePackets = packetConfig.GetBoolean("RecyclePackets", true); PacketPool.Instance.RecycleDataBlocks = packetConfig.GetBoolean("RecycleDataBlocks", true); } m_strictAccessControl = startupConfig.GetBoolean("StrictAccessControl", m_strictAccessControl); } catch { m_log.Warn("[SCENE]: Failed to load StartupConfig"); } }
private void RegionLoadedDoWork(Scene scene) { lock (m_startingScenes) m_startingScenes.Add(scene.RegionInfo.originRegionID, scene); // Give each region a standard set of non-infinite borders Border northBorder = new Border(); northBorder.BorderLine = new Vector3(0, (int)Constants.RegionSize, (int)Constants.RegionSize); //<--- northBorder.CrossDirection = Cardinals.N; scene.NorthBorders[0] = northBorder; Border southBorder = new Border(); southBorder.BorderLine = new Vector3(0, (int)Constants.RegionSize, 0); //---> southBorder.CrossDirection = Cardinals.S; scene.SouthBorders[0] = southBorder; Border eastBorder = new Border(); eastBorder.BorderLine = new Vector3(0, (int)Constants.RegionSize, (int)Constants.RegionSize); //<--- eastBorder.CrossDirection = Cardinals.E; scene.EastBorders[0] = eastBorder; Border westBorder = new Border(); westBorder.BorderLine = new Vector3(0, (int)Constants.RegionSize, 0); //---> westBorder.CrossDirection = Cardinals.W; scene.WestBorders[0] = westBorder; RegionConnections regionConnections = new RegionConnections(); regionConnections.ConnectedRegions = new List<RegionData>(); regionConnections.RegionScene = scene; regionConnections.RegionLandChannel = scene.LandChannel; regionConnections.RegionId = scene.RegionInfo.originRegionID; regionConnections.X = scene.RegionInfo.RegionLocX; regionConnections.Y = scene.RegionInfo.RegionLocY; regionConnections.XExtend = (int)Constants.RegionSize; regionConnections.YExtend = (int)Constants.RegionSize; if (m_nRegions == 0) { // this is root region regionConnections.XExtend *= m_numberCombinedRegionsX; regionConnections.YExtend *= m_numberCombinedRegionsY; m_rootScene = scene; m_rootConnection = regionConnections; // save it's land channel regionConnections.RegionLandChannel = scene.LandChannel; scene.RootScene = null; scene.RegionInfo.CombinedRegionHandle = 0; Vector3 extents; extents.X = regionConnections.XExtend; extents.Y = regionConnections.YExtend; extents.Z = 0; scene.RegionInfo.RegionSizeX = (uint)extents.X; scene.RegionInfo.RegionSizeY = (uint)extents.Y; // scene.PhysicsScene.Combine(null, Vector3.Zero, extents); lock (scene.SouthBorders) scene.SouthBorders[0].BorderLine.Y = regionConnections.XExtend; lock (scene.WestBorders) scene.WestBorders[0].BorderLine.Y = regionConnections.YExtend; lock (scene.EastBorders) { scene.EastBorders[0].BorderLine.Z = regionConnections.XExtend; scene.EastBorders[0].BorderLine.Y = regionConnections.YExtend; } lock (scene.NorthBorders) { scene.NorthBorders[0].BorderLine.Z = regionConnections.YExtend; scene.NorthBorders[0].BorderLine.Y = regionConnections.XExtend; } // Substitue our landchannel RegionData rdata = new RegionData(); rdata.Offset = Vector3.Zero; rdata.RegionId = scene.RegionInfo.originRegionID; rdata.RegionScene = scene; RegionCombinerLargeLandChannel lnd = new RegionCombinerLargeLandChannel(rdata, scene.LandChannel, regionConnections.ConnectedRegions); scene.LandChannel = lnd; // Forward the permissions modules of each of the connected regions to the root region // Create the root region's Client Event Forwarder regionConnections.ClientEventForwarder = new RegionCombinerClientEventForwarder(regionConnections); // Sets up the CoarseLocationUpdate forwarder for this root region scene.EventManager.OnNewPresence += SetCourseLocationDelegate; // Adds this root region to a dictionary of regions that are connectable m_regions.Add(scene.RegionInfo.originRegionID, regionConnections); } else if (m_rootScene != null) { scene.RootScene = m_rootScene; scene.RegionInfo.CombinedRegionHandle = m_rootScene.RegionInfo.RegionHandle; Vector3 offset = Vector3.Zero; offset.X = ((int)regionConnections.X - (int)m_rootConnection.X) * Constants.RegionSize; offset.Y = ((int)regionConnections.Y - (int)m_rootConnection.Y) * Constants.RegionSize; RegionData ConnectedRegion = new RegionData(); ConnectedRegion.Offset = offset; ConnectedRegion.RegionId = scene.RegionInfo.originRegionID; ConnectedRegion.RegionScene = scene; m_rootConnection.ConnectedRegions.Add(ConnectedRegion); scene.Physics_Enabled = false; scene.Scripts_Enabled = false; m_rootScene.PhysicsScene.CombineTerrain(scene.Heightmap.GetFloatsSerialised(),offset); scene.EventManager.OnNewPresence += SetCourseLocationDelegate; // Create a client event forwarder and add this region's events to the root region. if (m_rootConnection.ClientEventForwarder != null) m_rootConnection.ClientEventForwarder.AddSceneToEventForwarding(scene); } m_nRegions++; if (m_nRegions == m_nRegionsToLoad) { // final work lock (m_regions) { foreach (RegionData r in regionConnections.ConnectedRegions) { ForwardPermissionRequests(regionConnections, r.RegionScene); } } } AdjustLargeRegionBounds(); return; }
public Scene(RegionInfo regInfo, AgentCircuitManager authen, SceneCommunicationService sceneGridService, StorageManager storeManager, ModuleLoader moduleLoader, bool dumpAssetsToFile, bool physicalPrim, bool SeeIntoRegionFromNeighbor, IConfigSource config, string simulatorVersion) { m_config = config; Random random = new Random(); BordersLocked = true; Border northBorder = new Border(); northBorder.BorderLine = new Vector3(float.MinValue, float.MaxValue, (int)Constants.RegionSize); //<--- northBorder.CrossDirection = Cardinals.N; NorthBorders.Add(northBorder); Border southBorder = new Border(); southBorder.BorderLine = new Vector3(float.MinValue, float.MaxValue, 0); //---> southBorder.CrossDirection = Cardinals.S; SouthBorders.Add(southBorder); Border eastBorder = new Border(); eastBorder.BorderLine = new Vector3(float.MinValue, float.MaxValue, (int)Constants.RegionSize); //<--- eastBorder.CrossDirection = Cardinals.E; EastBorders.Add(eastBorder); Border westBorder = new Border(); westBorder.BorderLine = new Vector3(float.MinValue, float.MaxValue, 0); //---> westBorder.CrossDirection = Cardinals.W; WestBorders.Add(westBorder); BordersLocked = false; m_lastAllocatedLocalId = (uint)(random.NextDouble() * (double)(uint.MaxValue/2))+(uint)(uint.MaxValue/4); m_moduleLoader = moduleLoader; m_authenticateHandler = authen; m_sceneGridService = sceneGridService; m_storageManager = storeManager; m_regInfo = regInfo; m_regionHandle = m_regInfo.RegionHandle; m_regionName = m_regInfo.RegionName; m_datastore = m_regInfo.DataStore; m_lastUpdate = Util.EnvironmentTickCount(); m_physicalPrim = physicalPrim; m_seeIntoRegionFromNeighbor = SeeIntoRegionFromNeighbor; m_eventManager = new EventManager(); m_permissions = new ScenePermissions(this); m_asyncSceneObjectDeleter = new AsyncSceneObjectGroupDeleter(this); m_asyncSceneObjectDeleter.Enabled = true; #region Region Settings // Load region settings m_regInfo.RegionSettings = m_storageManager.DataStore.LoadRegionSettings(m_regInfo.RegionID); if (m_storageManager.EstateDataStore != null) { m_regInfo.EstateSettings = m_storageManager.EstateDataStore.LoadEstateSettings(m_regInfo.RegionID, false); if (m_regInfo.EstateSettings.EstateID == 0) // No record at all { MainConsole.Instance.Output("Your region is not part of an estate."); while (true) { string response = MainConsole.Instance.CmdPrompt("Do you wish to join an existing estate?", "no", new List<string>() {"yes", "no"}); if (response == "no") { // Create a new estate m_regInfo.EstateSettings = m_storageManager.EstateDataStore.LoadEstateSettings(m_regInfo.RegionID, true); m_regInfo.EstateSettings.EstateName = MainConsole.Instance.CmdPrompt("New estate name", m_regInfo.EstateSettings.EstateName); m_regInfo.EstateSettings.Save(); break; } else { response = MainConsole.Instance.CmdPrompt("Estate name to join", "None"); if (response == "None") continue; List<int> estateIDs = m_storageManager.EstateDataStore.GetEstates(response); if (estateIDs.Count < 1) { MainConsole.Instance.Output("The name you have entered matches no known estate. Please try again"); continue; } int estateID = estateIDs[0]; m_regInfo.EstateSettings = m_storageManager.EstateDataStore.LoadEstateSettings(estateID); if (m_storageManager.EstateDataStore.LinkRegion(m_regInfo.RegionID, estateID)) break; MainConsole.Instance.Output("Joining the estate failed. Please try again."); } } } } #endregion Region Settings MainConsole.Instance.Commands.AddCommand("region", false, "reload estate", "reload estate", "Reload the estate data", HandleReloadEstate); //Bind Storage Manager functions to some land manager functions for this scene EventManager.OnLandObjectAdded += new EventManager.LandObjectAdded(m_storageManager.DataStore.StoreLandObject); EventManager.OnLandObjectRemoved += new EventManager.LandObjectRemoved(m_storageManager.DataStore.RemoveLandObject); m_sceneGraph = new SceneGraph(this, m_regInfo); // If the scene graph has an Unrecoverable error, restart this sim. // Currently the only thing that causes it to happen is two kinds of specific // Physics based crashes. // // Out of memory // Operating system has killed the plugin m_sceneGraph.UnRecoverableError += RestartNow; RegisterDefaultSceneEvents(); DumpAssetsToFile = dumpAssetsToFile; m_scripts_enabled = !RegionInfo.RegionSettings.DisableScripts; m_physics_enabled = !RegionInfo.RegionSettings.DisablePhysics; StatsReporter = new SimStatsReporter(this); StatsReporter.OnSendStatsResult += SendSimStatsPackets; StatsReporter.OnStatsIncorrect += m_sceneGraph.RecalculateStats; StatsReporter.SetObjectCapacity(objectCapacity); // Old /* m_simulatorVersion = simulatorVersion + " (OS " + Util.GetOperatingSystemInformation() + ")" + " ChilTasks:" + m_seeIntoRegionFromNeighbor.ToString() + " PhysPrim:" + m_physicalPrim.ToString(); */ m_simulatorVersion = simulatorVersion + " (" + Util.GetRuntimeInformation() + ")"; #region Region Config try { // Region config overrides global config // IConfig startupConfig = m_config.Configs["Startup"]; //Animation states m_useFlySlow = startupConfig.GetBoolean("enableflyslow", false); // TODO: Change default to true once the feature is supported m_usePreJump = startupConfig.GetBoolean("enableprejump", false); m_maxNonphys = startupConfig.GetFloat("NonPhysicalPrimMax", m_maxNonphys); if (RegionInfo.NonphysPrimMax > 0) { m_maxNonphys = RegionInfo.NonphysPrimMax; } m_maxPhys = startupConfig.GetFloat("PhysicalPrimMax", m_maxPhys); if (RegionInfo.PhysPrimMax > 0) { m_maxPhys = RegionInfo.PhysPrimMax; } // Here, if clamping is requested in either global or // local config, it will be used // m_clampPrimSize = startupConfig.GetBoolean("ClampPrimSize", m_clampPrimSize); if (RegionInfo.ClampPrimSize) { m_clampPrimSize = true; } m_trustBinaries = startupConfig.GetBoolean("TrustBinaries", m_trustBinaries); m_allowScriptCrossings = startupConfig.GetBoolean("AllowScriptCrossing", m_allowScriptCrossings); m_dontPersistBefore = startupConfig.GetLong("MinimumTimeBeforePersistenceConsidered", DEFAULT_MIN_TIME_FOR_PERSISTENCE); m_dontPersistBefore *= 10000000; m_persistAfter = startupConfig.GetLong("MaximumTimeBeforePersistenceConsidered", DEFAULT_MAX_TIME_FOR_PERSISTENCE); m_persistAfter *= 10000000; m_defaultScriptEngine = startupConfig.GetString("DefaultScriptEngine", "XEngine"); IConfig packetConfig = m_config.Configs["PacketPool"]; if (packetConfig != null) { PacketPool.Instance.RecyclePackets = packetConfig.GetBoolean("RecyclePackets", true); PacketPool.Instance.RecycleDataBlocks = packetConfig.GetBoolean("RecycleDataBlocks", true); } m_strictAccessControl = startupConfig.GetBoolean("StrictAccessControl", m_strictAccessControl); #region BinaryStats try { IConfig statConfig = m_config.Configs["Statistics.Binary"]; if (statConfig.Contains("enabled") && statConfig.GetBoolean("enabled")) { if (statConfig.Contains("collect_region_stats")) { if (statConfig.GetBoolean("collect_region_stats")) { // if enabled, add us to the event. If not enabled, I won't get called StatsReporter.OnSendStatsResult += LogSimStats; } } if (statConfig.Contains("region_stats_period_seconds")) { m_statLogPeriod = TimeSpan.FromSeconds(statConfig.GetInt("region_stats_period_seconds")); } if (statConfig.Contains("stats_dir")) { m_statsDir = statConfig.GetString("stats_dir"); } } } catch { // if it doesn't work, we don't collect anything } #endregion BinaryStats } catch { m_log.Warn("[SCENE]: Failed to load StartupConfig"); } #endregion Region Config #region Interest Management if (m_config != null) { IConfig interestConfig = m_config.Configs["InterestManagement"]; if (interestConfig != null) { string update_prioritization_scheme = interestConfig.GetString("UpdatePrioritizationScheme", "Time").Trim().ToLower(); try { m_priorityScheme = (UpdatePrioritizationSchemes)Enum.Parse(typeof(UpdatePrioritizationSchemes), update_prioritization_scheme, true); } catch (Exception) { m_log.Warn("[PRIORITIZER]: UpdatePrioritizationScheme was not recognized, setting to default prioritizer Time"); m_priorityScheme = UpdatePrioritizationSchemes.Time; } m_reprioritizationEnabled = interestConfig.GetBoolean("ReprioritizationEnabled", true); m_reprioritizationInterval = interestConfig.GetDouble("ReprioritizationInterval", 5000.0); m_rootReprioritizationDistance = interestConfig.GetDouble("RootReprioritizationDistance", 10.0); m_childReprioritizationDistance = interestConfig.GetDouble("ChildReprioritizationDistance", 20.0); } } m_log.Info("[SCENE]: Using the " + m_priorityScheme + " prioritization scheme"); #endregion Interest Management }
public void RegionLoaded(Scene scene) { if (!enabledYN) return; lock (m_startingScenes) m_startingScenes.Add(scene.RegionInfo.originRegionID, scene); Border northBorder = new Border(); northBorder.BorderLine = new Vector3(0, (int)Constants.RegionSize, (int)Constants.RegionSize); //<--- northBorder.CrossDirection = Cardinals.N; scene.NorthBorders[0] = northBorder; Border southBorder = new Border(); southBorder.BorderLine = new Vector3(0, (int)Constants.RegionSize, 0); //---> southBorder.CrossDirection = Cardinals.S; scene.SouthBorders[0] = southBorder; Border eastBorder = new Border(); eastBorder.BorderLine = new Vector3(0, (int)Constants.RegionSize, (int)Constants.RegionSize); //<--- eastBorder.CrossDirection = Cardinals.E; scene.EastBorders[0] = eastBorder; Border westBorder = new Border(); westBorder.BorderLine = new Vector3(0, (int)Constants.RegionSize, 0); //---> westBorder.CrossDirection = Cardinals.W; scene.WestBorders[0] = westBorder; RegionConnections regionConnections = new RegionConnections(); regionConnections.ConnectedRegions = new List<RegionData>(); regionConnections.RegionScene = scene; regionConnections.RegionLandChannel = scene.LandChannel; regionConnections.RegionId = scene.RegionInfo.originRegionID; regionConnections.X = scene.RegionInfo.RegionLocX; regionConnections.Y = scene.RegionInfo.RegionLocY; regionConnections.XEnd = (int)Constants.RegionSize; regionConnections.YEnd = (int)Constants.RegionSize; lock (m_regions) { bool connectedYN = false; foreach (RegionConnections conn in m_regions.Values) { #region commented /* // If we're one region over +x +y //xxy //xxx //xxx if ((((int)conn.X * (int)Constants.RegionSize) + conn.XEnd == (regionConnections.X * (int)Constants.RegionSize)) && (((int)conn.Y * (int)Constants.RegionSize) - conn.YEnd == (regionConnections.Y * (int)Constants.RegionSize))) { Vector3 offset = Vector3.Zero; offset.X = (((regionConnections.X * (int) Constants.RegionSize)) - ((conn.X * (int) Constants.RegionSize))); offset.Y = (((regionConnections.Y * (int) Constants.RegionSize)) - ((conn.Y * (int) Constants.RegionSize))); Vector3 extents = Vector3.Zero; extents.Y = regionConnections.YEnd + conn.YEnd; extents.X = conn.XEnd + conn.XEnd; m_log.DebugFormat("Scene: {0} to the northwest of Scene{1}. Offset: {2}. Extents:{3}", conn.RegionScene.RegionInfo.RegionName, regionConnections.RegionScene.RegionInfo.RegionName, offset, extents); scene.PhysicsScene.Combine(conn.RegionScene.PhysicsScene, offset, extents); connectedYN = true; break; } */ /* //If we're one region over x +y //xxx //xxx //xyx if ((((int)conn.X * (int)Constants.RegionSize) == (regionConnections.X * (int)Constants.RegionSize)) && (((int)conn.Y * (int)Constants.RegionSize) - conn.YEnd == (regionConnections.Y * (int)Constants.RegionSize))) { Vector3 offset = Vector3.Zero; offset.X = (((regionConnections.X * (int)Constants.RegionSize)) - ((conn.X * (int)Constants.RegionSize))); offset.Y = (((regionConnections.Y * (int)Constants.RegionSize)) - ((conn.Y * (int)Constants.RegionSize))); Vector3 extents = Vector3.Zero; extents.Y = regionConnections.YEnd + conn.YEnd; extents.X = conn.XEnd; m_log.DebugFormat("Scene: {0} to the north of Scene{1}. Offset: {2}. Extents:{3}", conn.RegionScene.RegionInfo.RegionName, regionConnections.RegionScene.RegionInfo.RegionName, offset, extents); scene.PhysicsScene.Combine(conn.RegionScene.PhysicsScene, offset, extents); connectedYN = true; break; } */ /* // If we're one region over -x +y //xxx //xxx //yxx if ((((int)conn.X * (int)Constants.RegionSize) - conn.XEnd == (regionConnections.X * (int)Constants.RegionSize)) && (((int)conn.Y * (int)Constants.RegionSize) - conn.YEnd == (regionConnections.Y * (int)Constants.RegionSize))) { Vector3 offset = Vector3.Zero; offset.X = (((regionConnections.X * (int)Constants.RegionSize)) - ((conn.X * (int)Constants.RegionSize))); offset.Y = (((regionConnections.Y * (int)Constants.RegionSize)) - ((conn.Y * (int)Constants.RegionSize))); Vector3 extents = Vector3.Zero; extents.Y = regionConnections.YEnd + conn.YEnd; extents.X = conn.XEnd + conn.XEnd; m_log.DebugFormat("Scene: {0} to the northeast of Scene. Offset: {2}. Extents:{3}", conn.RegionScene.RegionInfo.RegionName, regionConnections.RegionScene.RegionInfo.RegionName, offset, extents); scene.PhysicsScene.Combine(conn.RegionScene.PhysicsScene, offset, extents); connectedYN = true; break; } */ /* // If we're one region over -x y //xxx //yxx //xxx if ((((int)conn.X * (int)Constants.RegionSize) - conn.XEnd == (regionConnections.X * (int)Constants.RegionSize)) && (((int)conn.Y * (int)Constants.RegionSize) == (regionConnections.Y * (int)Constants.RegionSize))) { Vector3 offset = Vector3.Zero; offset.X = (((regionConnections.X * (int)Constants.RegionSize)) - ((conn.X * (int)Constants.RegionSize))); offset.Y = (((regionConnections.Y * (int)Constants.RegionSize)) - ((conn.Y * (int)Constants.RegionSize))); Vector3 extents = Vector3.Zero; extents.Y = regionConnections.YEnd; extents.X = conn.XEnd + conn.XEnd; m_log.DebugFormat("Scene: {0} to the east of Scene{1} Offset: {2}. Extents:{3}", conn.RegionScene.RegionInfo.RegionName, regionConnections.RegionScene.RegionInfo.RegionName, offset, extents); scene.PhysicsScene.Combine(conn.RegionScene.PhysicsScene, offset, extents); connectedYN = true; break; } */ /* // If we're one region over -x -y //yxx //xxx //xxx if ((((int)conn.X * (int)Constants.RegionSize) - conn.XEnd == (regionConnections.X * (int)Constants.RegionSize)) && (((int)conn.Y * (int)Constants.RegionSize) + conn.YEnd == (regionConnections.Y * (int)Constants.RegionSize))) { Vector3 offset = Vector3.Zero; offset.X = (((regionConnections.X * (int)Constants.RegionSize)) - ((conn.X * (int)Constants.RegionSize))); offset.Y = (((regionConnections.Y * (int)Constants.RegionSize)) - ((conn.Y * (int)Constants.RegionSize))); Vector3 extents = Vector3.Zero; extents.Y = regionConnections.YEnd + conn.YEnd; extents.X = conn.XEnd + conn.XEnd; m_log.DebugFormat("Scene: {0} to the northeast of Scene{1} Offset: {2}. Extents:{3}", conn.RegionScene.RegionInfo.RegionName, regionConnections.RegionScene.RegionInfo.RegionName, offset, extents); scene.PhysicsScene.Combine(conn.RegionScene.PhysicsScene, offset, extents); connectedYN = true; break; } */ #endregion // If we're one region over +x y //xxx //xxy //xxx if ((((int)conn.X * (int)Constants.RegionSize) + conn.XEnd >= (regionConnections.X * (int)Constants.RegionSize)) && (((int)conn.Y * (int)Constants.RegionSize) >= (regionConnections.Y * (int)Constants.RegionSize))) { Vector3 offset = Vector3.Zero; offset.X = (((regionConnections.X * (int)Constants.RegionSize)) - ((conn.X * (int)Constants.RegionSize))); offset.Y = (((regionConnections.Y * (int)Constants.RegionSize)) - ((conn.Y * (int)Constants.RegionSize))); Vector3 extents = Vector3.Zero; extents.Y = conn.YEnd; extents.X = conn.XEnd + regionConnections.XEnd; conn.UpdateExtents(extents); m_log.DebugFormat("Scene: {0} to the west of Scene{1} Offset: {2}. Extents:{3}", conn.RegionScene.RegionInfo.RegionName, regionConnections.RegionScene.RegionInfo.RegionName, offset, extents); scene.BordersLocked = true; conn.RegionScene.BordersLocked = true; RegionData ConnectedRegion = new RegionData(); ConnectedRegion.Offset = offset; ConnectedRegion.RegionId = scene.RegionInfo.originRegionID; ConnectedRegion.RegionScene = scene; conn.ConnectedRegions.Add(ConnectedRegion); conn.RegionScene.PhysicsScene.Combine(null, Vector3.Zero, extents); scene.PhysicsScene.Combine(conn.RegionScene.PhysicsScene, offset, Vector3.Zero); lock (conn.RegionScene.EastBorders) conn.RegionScene.EastBorders[0].BorderLine.Z += (int)Constants.RegionSize; lock (conn.RegionScene.NorthBorders) conn.RegionScene.NorthBorders[0].BorderLine.Y += (int)Constants.RegionSize; lock (conn.RegionScene.SouthBorders) conn.RegionScene.SouthBorders[0].BorderLine.Y += (int)Constants.RegionSize; lock (scene.WestBorders) scene.WestBorders[0].BorderLine.Z += (int)Constants.RegionSize; //auto teleport West // Reset Terrain.. since terrain normally loads first. // scene.PhysicsScene.SetTerrain(scene.Heightmap.GetFloatsSerialised()); //conn.RegionScene.PhysicsScene.SetTerrain(conn.RegionScene.Heightmap.GetFloatsSerialised()); conn.RegionScene.BordersLocked = false; scene.BordersLocked = false; if (conn.ClientEventForwarder != null) conn.ClientEventForwarder.AddSceneToEventForwarding(scene); connectedYN = true; break; } // If we're one region over x +y //xyx //xxx //xxx if ((((int)conn.X * (int)Constants.RegionSize) >= (regionConnections.X * (int)Constants.RegionSize)) && (((int)conn.Y * (int)Constants.RegionSize) + conn.YEnd >= (regionConnections.Y * (int)Constants.RegionSize))) { Vector3 offset = Vector3.Zero; offset.X = (((regionConnections.X * (int)Constants.RegionSize)) - ((conn.X * (int)Constants.RegionSize))); offset.Y = (((regionConnections.Y * (int)Constants.RegionSize)) - ((conn.Y * (int)Constants.RegionSize))); Vector3 extents = Vector3.Zero; extents.Y = regionConnections.YEnd + conn.YEnd; extents.X = conn.XEnd; conn.UpdateExtents(extents); scene.BordersLocked = true; conn.RegionScene.BordersLocked = true; RegionData ConnectedRegion = new RegionData(); ConnectedRegion.Offset = offset; ConnectedRegion.RegionId = scene.RegionInfo.originRegionID; ConnectedRegion.RegionScene = scene; conn.ConnectedRegions.Add(ConnectedRegion); m_log.DebugFormat("Scene: {0} to the northeast of Scene{1} Offset: {2}. Extents:{3}", conn.RegionScene.RegionInfo.RegionName, regionConnections.RegionScene.RegionInfo.RegionName, offset, extents); conn.RegionScene.PhysicsScene.Combine(null, Vector3.Zero, extents); scene.PhysicsScene.Combine(conn.RegionScene.PhysicsScene, offset, Vector3.Zero); lock (conn.RegionScene.NorthBorders) conn.RegionScene.NorthBorders[0].BorderLine.Z += (int)Constants.RegionSize; lock (conn.RegionScene.EastBorders) conn.RegionScene.EastBorders[0].BorderLine.Y += (int)Constants.RegionSize; lock (conn.RegionScene.WestBorders) conn.RegionScene.WestBorders[0].BorderLine.Y += (int)Constants.RegionSize; lock (scene.SouthBorders) scene.SouthBorders[0].BorderLine.Z += (int)Constants.RegionSize; //auto teleport south // Reset Terrain.. since terrain normally loads first. //conn.RegionScene.PhysicsScene.SetTerrain(conn.RegionScene.Heightmap.GetFloatsSerialised()); scene.PhysicsScene.SetTerrain(scene.Heightmap.GetFloatsSerialised()); //conn.RegionScene.PhysicsScene.SetTerrain(conn.RegionScene.Heightmap.GetFloatsSerialised()); scene.BordersLocked = false; conn.RegionScene.BordersLocked = false; if (conn.ClientEventForwarder != null) conn.ClientEventForwarder.AddSceneToEventForwarding(scene); connectedYN = true; break; } // If we're one region over +x +y //xxy //xxx //xxx if ((((int)conn.X * (int)Constants.RegionSize) + conn.YEnd >= (regionConnections.X * (int)Constants.RegionSize)) && (((int)conn.Y * (int)Constants.RegionSize) + conn.YEnd >= (regionConnections.Y * (int)Constants.RegionSize))) { Vector3 offset = Vector3.Zero; offset.X = (((regionConnections.X * (int)Constants.RegionSize)) - ((conn.X * (int)Constants.RegionSize))); offset.Y = (((regionConnections.Y * (int)Constants.RegionSize)) - ((conn.Y * (int)Constants.RegionSize))); Vector3 extents = Vector3.Zero; extents.Y = regionConnections.YEnd + conn.YEnd; extents.X = regionConnections.XEnd + conn.XEnd; conn.UpdateExtents(extents); scene.BordersLocked = true; conn.RegionScene.BordersLocked = true; RegionData ConnectedRegion = new RegionData(); ConnectedRegion.Offset = offset; ConnectedRegion.RegionId = scene.RegionInfo.originRegionID; ConnectedRegion.RegionScene = scene; conn.ConnectedRegions.Add(ConnectedRegion); m_log.DebugFormat("Scene: {0} to the NorthEast of Scene{1} Offset: {2}. Extents:{3}", conn.RegionScene.RegionInfo.RegionName, regionConnections.RegionScene.RegionInfo.RegionName, offset, extents); conn.RegionScene.PhysicsScene.Combine(null, Vector3.Zero, extents); scene.PhysicsScene.Combine(conn.RegionScene.PhysicsScene, offset, Vector3.Zero); lock (conn.RegionScene.NorthBorders) if (conn.RegionScene.NorthBorders.Count == 1)// && 2) { //compound border // already locked above conn.RegionScene.NorthBorders[0].BorderLine.Z += (int)Constants.RegionSize; lock (conn.RegionScene.EastBorders) conn.RegionScene.EastBorders[0].BorderLine.Y += (int)Constants.RegionSize; lock (conn.RegionScene.WestBorders) conn.RegionScene.WestBorders[0].BorderLine.Y += (int)Constants.RegionSize; } lock (scene.SouthBorders) scene.SouthBorders[0].BorderLine.Z += (int)Constants.RegionSize; //auto teleport south lock (conn.RegionScene.EastBorders) if (conn.RegionScene.EastBorders.Count == 1)// && conn.RegionScene.EastBorders.Count == 2) { conn.RegionScene.EastBorders[0].BorderLine.Z += (int)Constants.RegionSize; lock (conn.RegionScene.NorthBorders) conn.RegionScene.NorthBorders[0].BorderLine.Y += (int)Constants.RegionSize; lock (conn.RegionScene.SouthBorders) conn.RegionScene.SouthBorders[0].BorderLine.Y += (int)Constants.RegionSize; } lock (scene.WestBorders) scene.WestBorders[0].BorderLine.Z += (int)Constants.RegionSize; //auto teleport West /* else { conn.RegionScene.NorthBorders[0].BorderLine.Z += (int)Constants.RegionSize; conn.RegionScene.EastBorders[0].BorderLine.Y += (int)Constants.RegionSize; conn.RegionScene.WestBorders[0].BorderLine.Y += (int)Constants.RegionSize; scene.SouthBorders[0].BorderLine.Z += (int)Constants.RegionSize; //auto teleport south } */ // Reset Terrain.. since terrain normally loads first. //conn.RegionScene.PhysicsScene.SetTerrain(conn.RegionScene.Heightmap.GetFloatsSerialised()); scene.PhysicsScene.SetTerrain(scene.Heightmap.GetFloatsSerialised()); //conn.RegionScene.PhysicsScene.SetTerrain(conn.RegionScene.Heightmap.GetFloatsSerialised()); scene.BordersLocked = false; conn.RegionScene.BordersLocked = false; if (conn.ClientEventForwarder != null) conn.ClientEventForwarder.AddSceneToEventForwarding(scene); connectedYN = true; //scene.PhysicsScene.Combine(conn.RegionScene.PhysicsScene, offset,extents); break; } } if (!connectedYN) { RegionData rdata = new RegionData(); rdata.Offset = Vector3.Zero; rdata.RegionId = scene.RegionInfo.originRegionID; rdata.RegionScene = scene; regionConnections.RegionLandChannel = scene.LandChannel; RegionCombinerLargeLandChannel lnd = new RegionCombinerLargeLandChannel(rdata, scene.LandChannel, regionConnections.ConnectedRegions); scene.LandChannel = lnd; lock (m_regions) { foreach (RegionData r in regionConnections.ConnectedRegions) { ForwardPermissionRequests(regionConnections, r.RegionScene); } } regionConnections.ClientEventForwarder = new RegionCombinerClientEventForwarder(regionConnections); scene.EventManager.OnNewPresence += SetCourseLocationDelegate; m_regions.Add(scene.RegionInfo.originRegionID, regionConnections); } } AdjustLargeRegionBounds(); }