From 701ca1e4b8b3d54e1e93baf54aada3867d403075 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Thu, 10 Jan 2013 22:38:48 +0000 Subject: [PATCH 1/8] Add "debug scene pbackup true|false" console command. This enables or disable periodic scene backup. For debug purposes. If false, scene is still saved on shutdown. --- OpenSim/Region/Application/OpenSim.cs | 10 +++--- OpenSim/Region/Framework/Scenes/Scene.cs | 39 ++++++++++++++++++------ 2 files changed, 36 insertions(+), 13 deletions(-) diff --git a/OpenSim/Region/Application/OpenSim.cs b/OpenSim/Region/Application/OpenSim.cs index cffbb3b101..492ee4af6b 100644 --- a/OpenSim/Region/Application/OpenSim.cs +++ b/OpenSim/Region/Application/OpenSim.cs @@ -239,13 +239,15 @@ namespace OpenSim m_console.Commands.AddCommand("Debug", false, "debug teleport", "debug teleport", "Toggle teleport route debugging", Debug); m_console.Commands.AddCommand("Debug", false, "debug scene", - "debug scene active|collisions|physics|scripting|teleport true|false", - "Turn on scene debugging.", + "debug scene active|collisions|pbackup|physics|scripting|teleport|updates true|false", + "Turn on scene debugging options.", "If active is false then main scene update and maintenance loops are suspended.\n" + "If collisions is false then collisions with other objects are turned off.\n" + + "If pbackup is false then periodic scene backup is turned off.\n" + "If physics is false then all physics objects are non-physical.\n" + "If scripting is false then no scripting operations happen.\n" - + "If teleport is true then some extra teleport debug information is logged.", + + "If teleport is true then some extra teleport debug information is logged." + + "If updates is true then any frame which exceeds double the maximum desired frame time is logged.", Debug); m_console.Commands.AddCommand("General", false, "change region", @@ -764,7 +766,7 @@ namespace OpenSim else { MainConsole.Instance.Output( - "Usage: debug scene active|scripting|collisions|physics|teleport true|false"); + "Usage: debug scene active|collisions|pbackup|physics|scripting|teleport|updates true|false"); } break; diff --git a/OpenSim/Region/Framework/Scenes/Scene.cs b/OpenSim/Region/Framework/Scenes/Scene.cs index 11b63b7c35..d0a211532d 100644 --- a/OpenSim/Region/Framework/Scenes/Scene.cs +++ b/OpenSim/Region/Framework/Scenes/Scene.cs @@ -77,6 +77,23 @@ namespace OpenSim.Region.Framework.Scenes /// public bool DebugUpdates { get; private set; } + /// + /// If true then the scene is saved to persistent storage periodically, every m_update_backup frames and + /// if objects meet required conditions (m_dontPersistBefore and m_dontPersistAfter). + /// + /// + /// Even if false, the scene will still be saved on clean shutdown. + /// FIXME: Currently, setting this to false will mean that objects are not periodically returned from parcels. + /// This needs to be fixed. + /// + public bool PeriodicBackup { get; private set; } + + /// + /// If false then the scene is never saved to persistence storage even if PeriodicBackup == true and even + /// if the scene is being shut down for the final time. + /// + public bool UseBackup { get; private set; } + public SynchronizeSceneHandler SynchronizeScene; /// @@ -341,7 +358,6 @@ namespace OpenSim.Region.Framework.Scenes private Timer m_mapGenerationTimer = new Timer(); private bool m_generateMaptiles; - private bool m_useBackup = true; #endregion Fields @@ -594,11 +610,6 @@ namespace OpenSim.Region.Framework.Scenes get { return m_authenticateHandler; } } - public bool UseBackup - { - get { return m_useBackup; } - } - // an instance to the physics plugin's Scene object. public PhysicsScene PhysicsScene { @@ -768,8 +779,8 @@ namespace OpenSim.Region.Framework.Scenes StartDisabled = startupConfig.GetBoolean("StartDisabled", false); m_defaultDrawDistance = startupConfig.GetFloat("DefaultDrawDistance", m_defaultDrawDistance); - m_useBackup = startupConfig.GetBoolean("UseSceneBackup", m_useBackup); - if (!m_useBackup) + UseBackup = startupConfig.GetBoolean("UseSceneBackup", UseBackup); + if (!UseBackup) m_log.InfoFormat("[SCENE]: Backup has been disabled for {0}", RegionInfo.RegionName); //Animation states @@ -937,6 +948,8 @@ namespace OpenSim.Region.Framework.Scenes { PhysicalPrims = true; CollidablePrims = true; + PeriodicBackup = true; + UseBackup = true; BordersLocked = true; Border northBorder = new Border(); @@ -1189,6 +1202,14 @@ namespace OpenSim.Region.Framework.Scenes Active = active; } + if (options.ContainsKey("pbackup")) + { + bool active; + + if (bool.TryParse(options["pbackup"], out active)) + PeriodicBackup = active; + } + if (options.ContainsKey("scripting")) { bool enableScripts = true; @@ -1570,7 +1591,7 @@ namespace OpenSim.Region.Framework.Scenes eventMS = Util.EnvironmentTickCountSubtract(tmpMS); } - if (Frame % m_update_backup == 0) + if (PeriodicBackup && Frame % m_update_backup == 0) { tmpMS = Util.EnvironmentTickCount(); UpdateStorageBackup(); From f566dc06182c51399e9dcb66553645c742d29673 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Thu, 10 Jan 2013 22:42:12 +0000 Subject: [PATCH 2/8] Remove unimplemented "debug teleport" console command --- OpenSim/Region/Application/OpenSim.cs | 2 -- 1 file changed, 2 deletions(-) diff --git a/OpenSim/Region/Application/OpenSim.cs b/OpenSim/Region/Application/OpenSim.cs index 492ee4af6b..fc87b6dae4 100644 --- a/OpenSim/Region/Application/OpenSim.cs +++ b/OpenSim/Region/Application/OpenSim.cs @@ -236,8 +236,6 @@ namespace OpenSim + "If an avatar name is given then only packets from that avatar are logged", Debug); - m_console.Commands.AddCommand("Debug", false, "debug teleport", "debug teleport", "Toggle teleport route debugging", Debug); - m_console.Commands.AddCommand("Debug", false, "debug scene", "debug scene active|collisions|pbackup|physics|scripting|teleport|updates true|false", "Turn on scene debugging options.", From e65737be9369cbb39081026577e93748f8a18fdb Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Thu, 10 Jan 2013 22:42:33 +0000 Subject: [PATCH 3/8] minor: add missing newline to "debug scene" console command --- OpenSim/Region/Application/OpenSim.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/OpenSim/Region/Application/OpenSim.cs b/OpenSim/Region/Application/OpenSim.cs index fc87b6dae4..603cfbc21e 100644 --- a/OpenSim/Region/Application/OpenSim.cs +++ b/OpenSim/Region/Application/OpenSim.cs @@ -244,7 +244,7 @@ namespace OpenSim + "If pbackup is false then periodic scene backup is turned off.\n" + "If physics is false then all physics objects are non-physical.\n" + "If scripting is false then no scripting operations happen.\n" - + "If teleport is true then some extra teleport debug information is logged." + + "If teleport is true then some extra teleport debug information is logged.\n" + "If updates is true then any frame which exceeds double the maximum desired frame time is logged.", Debug); From 17f21ba9a0d11f68fa892ab9d83eaa7db89aae37 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Thu, 10 Jan 2013 22:46:25 +0000 Subject: [PATCH 4/8] minor: Capitalize GroupsModule command category --- .../Region/OptionalModules/Avatar/XmlRpcGroups/GroupsModule.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/OpenSim/Region/OptionalModules/Avatar/XmlRpcGroups/GroupsModule.cs b/OpenSim/Region/OptionalModules/Avatar/XmlRpcGroups/GroupsModule.cs index 193d1db84d..29f95919b2 100644 --- a/OpenSim/Region/OptionalModules/Avatar/XmlRpcGroups/GroupsModule.cs +++ b/OpenSim/Region/OptionalModules/Avatar/XmlRpcGroups/GroupsModule.cs @@ -126,7 +126,7 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups { scene.RegisterModuleInterface(this); scene.AddCommand( - "debug", + "Debug", this, "debug groups verbose", "debug groups verbose ", From 983e458bb67defd79c48d6ee66682f8f86e2029c Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Thu, 10 Jan 2013 22:59:40 +0000 Subject: [PATCH 5/8] refactor: route the final scene backup through the same code that handles periodic backup This is rather than making unnecessary duplicate checks that the SOG later performs again. --- OpenSim/Region/Framework/Scenes/Scene.cs | 11 +---------- 1 file changed, 1 insertion(+), 10 deletions(-) diff --git a/OpenSim/Region/Framework/Scenes/Scene.cs b/OpenSim/Region/Framework/Scenes/Scene.cs index d0a211532d..515184c5eb 100644 --- a/OpenSim/Region/Framework/Scenes/Scene.cs +++ b/OpenSim/Region/Framework/Scenes/Scene.cs @@ -1322,16 +1322,7 @@ namespace OpenSim.Region.Framework.Scenes m_log.Debug("[SCENE]: Persisting changed objects"); EventManager.TriggerSceneShuttingDown(this); - - EntityBase[] entities = GetEntities(); - foreach (EntityBase entity in entities) - { - if (!entity.IsDeleted && entity is SceneObjectGroup && ((SceneObjectGroup)entity).HasGroupChanged) - { - ((SceneObjectGroup)entity).ProcessBackup(SimulationDataService, false); - } - } - + Backup(false); m_sceneGraph.Close(); if (!GridService.DeregisterRegion(RegionInfo.RegionID)) From a16ae5d7e3e687fdcdae39f848f66087f16433a2 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Thu, 10 Jan 2013 23:49:48 +0000 Subject: [PATCH 6/8] Move scene debug commands into separate module. Command changes from "debug scene " to "debug scene set " to accomodate future settings --- OpenSim/Region/Application/OpenSim.cs | 37 --- .../World/Estate/EstateManagementModule.cs | 19 +- .../Interfaces/ISceneCommandsModule.cs | 43 ++++ OpenSim/Region/Framework/Scenes/Scene.cs | 153 +++++------- .../SceneCommands/SceneCommandsModule.cs | 236 ++++++++++++++++++ 5 files changed, 350 insertions(+), 138 deletions(-) create mode 100644 OpenSim/Region/Framework/Interfaces/ISceneCommandsModule.cs create mode 100644 OpenSim/Region/OptionalModules/World/SceneCommands/SceneCommandsModule.cs diff --git a/OpenSim/Region/Application/OpenSim.cs b/OpenSim/Region/Application/OpenSim.cs index 603cfbc21e..c4731a3bf0 100644 --- a/OpenSim/Region/Application/OpenSim.cs +++ b/OpenSim/Region/Application/OpenSim.cs @@ -236,18 +236,6 @@ namespace OpenSim + "If an avatar name is given then only packets from that avatar are logged", Debug); - m_console.Commands.AddCommand("Debug", false, "debug scene", - "debug scene active|collisions|pbackup|physics|scripting|teleport|updates true|false", - "Turn on scene debugging options.", - "If active is false then main scene update and maintenance loops are suspended.\n" - + "If collisions is false then collisions with other objects are turned off.\n" - + "If pbackup is false then periodic scene backup is turned off.\n" - + "If physics is false then all physics objects are non-physical.\n" - + "If scripting is false then no scripting operations happen.\n" - + "If teleport is true then some extra teleport debug information is logged.\n" - + "If updates is true then any frame which exceeds double the maximum desired frame time is logged.", - Debug); - m_console.Commands.AddCommand("General", false, "change region", "change region ", "Change current console region", ChangeSelectedRegion); @@ -744,31 +732,6 @@ namespace OpenSim break; - case "scene": - if (args.Length == 4) - { - if (SceneManager.CurrentScene == null) - { - MainConsole.Instance.Output("Please use 'change region ' first"); - } - else - { - string key = args[2]; - string value = args[3]; - SceneManager.CurrentScene.SetSceneCoreDebug( - new Dictionary() { { key, value } }); - - MainConsole.Instance.OutputFormat("Set debug scene {0} = {1}", key, value); - } - } - else - { - MainConsole.Instance.Output( - "Usage: debug scene active|collisions|pbackup|physics|scripting|teleport|updates true|false"); - } - - break; - default: MainConsole.Instance.Output("Unknown debug command"); break; diff --git a/OpenSim/Region/CoreModules/World/Estate/EstateManagementModule.cs b/OpenSim/Region/CoreModules/World/Estate/EstateManagementModule.cs index d05abc59d3..60f67396db 100644 --- a/OpenSim/Region/CoreModules/World/Estate/EstateManagementModule.cs +++ b/OpenSim/Region/CoreModules/World/Estate/EstateManagementModule.cs @@ -753,13 +753,18 @@ namespace OpenSim.Region.CoreModules.World.Estate Scene.RegionInfo.RegionSettings.Save(); TriggerRegionInfoChange(); - Scene.SetSceneCoreDebug( - new Dictionary() { - { "scripting", (!disableScripts).ToString() }, - { "collisions", (!disableCollisions).ToString() }, - { "physics", (!disablePhysics).ToString() } - } - ); + ISceneCommandsModule scm = Scene.RequestModuleInterface(); + + if (scm != null) + { + scm.SetSceneDebugOptions( + new Dictionary() { + { "scripting", (!disableScripts).ToString() }, + { "collisions", (!disableCollisions).ToString() }, + { "physics", (!disablePhysics).ToString() } + } + ); + } } private void handleEstateTeleportOneUserHomeRequest(IClientAPI remover_client, UUID invoice, UUID senderID, UUID prey) diff --git a/OpenSim/Region/Framework/Interfaces/ISceneCommandsModule.cs b/OpenSim/Region/Framework/Interfaces/ISceneCommandsModule.cs new file mode 100644 index 0000000000..c5e678b42a --- /dev/null +++ b/OpenSim/Region/Framework/Interfaces/ISceneCommandsModule.cs @@ -0,0 +1,43 @@ +/* + * Copyright (c) Contributors, http://opensimulator.org/ + * See CONTRIBUTORS.TXT for a full list of copyright holders. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the OpenSim Project nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +using System; +using System.Collections.Generic; +using OpenMetaverse; +using OpenSim.Framework; +using OpenSim.Region.Framework.Scenes; + +namespace OpenSim.Region.Framework.Interfaces +{ + public interface ISceneCommandsModule + { + /// + /// Sets the scene debug options. + /// + void SetSceneDebugOptions(Dictionary options); + } +} \ No newline at end of file diff --git a/OpenSim/Region/Framework/Scenes/Scene.cs b/OpenSim/Region/Framework/Scenes/Scene.cs index 515184c5eb..4859dffadb 100644 --- a/OpenSim/Region/Framework/Scenes/Scene.cs +++ b/OpenSim/Region/Framework/Scenes/Scene.cs @@ -70,12 +70,12 @@ namespace OpenSim.Region.Framework.Scenes /// /// Show debug information about teleports. /// - public bool DebugTeleporting { get; private set; } + public bool DebugTeleporting { get; set; } /// /// Show debug information about the scene loop. /// - public bool DebugUpdates { get; private set; } + public bool DebugUpdates { get; set; } /// /// If true then the scene is saved to persistent storage periodically, every m_update_backup frames and @@ -86,13 +86,61 @@ namespace OpenSim.Region.Framework.Scenes /// FIXME: Currently, setting this to false will mean that objects are not periodically returned from parcels. /// This needs to be fixed. /// - public bool PeriodicBackup { get; private set; } + public bool PeriodicBackup { get; set; } /// /// If false then the scene is never saved to persistence storage even if PeriodicBackup == true and even /// if the scene is being shut down for the final time. /// - public bool UseBackup { get; private set; } + public bool UseBackup { get; set; } + + /// + /// If false then physical objects are disabled, though collisions will continue as normal. + /// + public bool PhysicsEnabled { get; set; } + + /// + /// If false then scripts are not enabled on the smiulator + /// + public bool ScriptsEnabled + { + get { return m_scripts_enabled; } + set + { + if (m_scripts_enabled != value) + { + if (!value) + { + m_log.Info("Stopping all Scripts in Scene"); + + EntityBase[] entities = Entities.GetEntities(); + foreach (EntityBase ent in entities) + { + if (ent is SceneObjectGroup) + ((SceneObjectGroup)ent).RemoveScriptInstances(false); + } + } + else + { + m_log.Info("Starting all Scripts in Scene"); + + EntityBase[] entities = Entities.GetEntities(); + foreach (EntityBase ent in entities) + { + if (ent is SceneObjectGroup) + { + SceneObjectGroup sog = (SceneObjectGroup)ent; + sog.CreateScriptInstances(0, false, DefaultScriptEngine, 0); + sog.ResumeScripts(); + } + } + } + + m_scripts_enabled = value; + } + } + } + private bool m_scripts_enabled; public SynchronizeSceneHandler SynchronizeScene; @@ -299,8 +347,6 @@ namespace OpenSim.Region.Framework.Scenes private Dictionary m_returns = new Dictionary(); private Dictionary m_groupsWithTargets = new Dictionary(); - private bool m_physics_enabled = true; - private bool m_scripts_enabled = true; private string m_defaultScriptEngine; /// @@ -762,9 +808,11 @@ namespace OpenSim.Region.Framework.Scenes DumpAssetsToFile = dumpAssetsToFile; + // XXX: Don't set the public property since we don't want to activate here. This needs to be handled + // better in the future. m_scripts_enabled = !RegionInfo.RegionSettings.DisableScripts; - m_physics_enabled = !RegionInfo.RegionSettings.DisablePhysics; + PhysicsEnabled = !RegionInfo.RegionSettings.DisablePhysics; m_simulatorVersion = simulatorVersion + " (" + Util.GetRuntimeInformation() + ")"; @@ -948,6 +996,8 @@ namespace OpenSim.Region.Framework.Scenes { PhysicalPrims = true; CollidablePrims = true; + PhysicsEnabled = true; + PeriodicBackup = true; UseBackup = true; @@ -1192,91 +1242,6 @@ namespace OpenSim.Region.Framework.Scenes } } - public void SetSceneCoreDebug(Dictionary options) - { - if (options.ContainsKey("active")) - { - bool active; - - if (bool.TryParse(options["active"], out active)) - Active = active; - } - - if (options.ContainsKey("pbackup")) - { - bool active; - - if (bool.TryParse(options["pbackup"], out active)) - PeriodicBackup = active; - } - - if (options.ContainsKey("scripting")) - { - bool enableScripts = true; - if (bool.TryParse(options["scripting"], out enableScripts) && m_scripts_enabled != enableScripts) - { - if (!enableScripts) - { - m_log.Info("Stopping all Scripts in Scene"); - - EntityBase[] entities = Entities.GetEntities(); - foreach (EntityBase ent in entities) - { - if (ent is SceneObjectGroup) - ((SceneObjectGroup)ent).RemoveScriptInstances(false); - } - } - else - { - m_log.Info("Starting all Scripts in Scene"); - - EntityBase[] entities = Entities.GetEntities(); - foreach (EntityBase ent in entities) - { - if (ent is SceneObjectGroup) - { - SceneObjectGroup sog = (SceneObjectGroup)ent; - sog.CreateScriptInstances(0, false, DefaultScriptEngine, 0); - sog.ResumeScripts(); - } - } - } - - m_scripts_enabled = enableScripts; - } - } - - if (options.ContainsKey("physics")) - { - bool enablePhysics; - if (bool.TryParse(options["physics"], out enablePhysics)) - m_physics_enabled = enablePhysics; - } - -// if (options.ContainsKey("collisions")) -// { -// // TODO: Implement. If false, should stop objects colliding, though possibly should still allow -// // the avatar themselves to collide with the ground. -// } - - if (options.ContainsKey("teleport")) - { - bool enableTeleportDebugging; - if (bool.TryParse(options["teleport"], out enableTeleportDebugging)) - DebugTeleporting = enableTeleportDebugging; - } - - if (options.ContainsKey("updates")) - { - bool enableUpdateDebugging; - if (bool.TryParse(options["updates"], out enableUpdateDebugging)) - { - DebugUpdates = enableUpdateDebugging; - GcNotify.Enabled = DebugUpdates; - } - } - } - public int GetInaccurateNeighborCount() { return m_neighbours.Count; @@ -1526,7 +1491,7 @@ namespace OpenSim.Region.Framework.Scenes } tmpMS = Util.EnvironmentTickCount(); - if ((Frame % m_update_physics == 0) && m_physics_enabled) + if (PhysicsEnabled && Frame % m_update_physics == 0) m_sceneGraph.UpdatePreparePhysics(); physicsMS2 = Util.EnvironmentTickCountSubtract(tmpMS); @@ -1541,7 +1506,7 @@ namespace OpenSim.Region.Framework.Scenes tmpMS = Util.EnvironmentTickCount(); if (Frame % m_update_physics == 0) { - if (m_physics_enabled) + if (PhysicsEnabled) physicsFPS = m_sceneGraph.UpdatePhysics(MinFrameTime); if (SynchronizeScene != null) diff --git a/OpenSim/Region/OptionalModules/World/SceneCommands/SceneCommandsModule.cs b/OpenSim/Region/OptionalModules/World/SceneCommands/SceneCommandsModule.cs new file mode 100644 index 0000000000..5dbf207653 --- /dev/null +++ b/OpenSim/Region/OptionalModules/World/SceneCommands/SceneCommandsModule.cs @@ -0,0 +1,236 @@ +/* + * Copyright (c) Contributors, http://opensimulator.org/ + * See CONTRIBUTORS.TXT for a full list of copyright holders. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the OpenSimulator Project nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Reflection; +using System.Text; +using log4net; +using Mono.Addins; +using Nini.Config; +using OpenMetaverse; +using OpenSim.Framework; +using OpenSim.Framework.Console; +using OpenSim.Framework.Monitoring; +using OpenSim.Region.Framework.Interfaces; +using OpenSim.Region.Framework.Scenes; + +namespace OpenSim.Region.OptionalModules.Avatar.Attachments +{ + /// + /// A module that just holds commands for inspecting avatar appearance. + /// + [Extension(Path = "/OpenSim/RegionModules", NodeName = "RegionModule", Id = "SceneCommandsModule")] + public class SceneCommandsModule : ISceneCommandsModule, INonSharedRegionModule + { + private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); + + private Scene m_scene; +// private IAvatarFactoryModule m_avatarFactory; + + public string Name { get { return "Scene Commands Module"; } } + + public Type ReplaceableInterface { get { return null; } } + + public void Initialise(IConfigSource source) + { +// m_log.DebugFormat("[SCENE COMMANDS MODULE]: INITIALIZED MODULE"); + } + + public void PostInitialise() + { +// m_log.DebugFormat("[SCENE COMMANDS MODULE]: POST INITIALIZED MODULE"); + } + + public void Close() + { +// m_log.DebugFormat("[SCENE COMMANDS MODULE]: CLOSED MODULE"); + } + + public void AddRegion(Scene scene) + { +// m_log.DebugFormat("[SCENE COMMANDS MODULE]: REGION {0} ADDED", scene.RegionInfo.RegionName); + + m_scene = scene; + } + + public void RemoveRegion(Scene scene) + { +// m_log.DebugFormat("[SCENE COMMANDS MODULE]: REGION {0} REMOVED", scene.RegionInfo.RegionName); + } + + public void RegionLoaded(Scene scene) + { +// m_log.DebugFormat("[ATTACHMENTS COMMAND MODULE]: REGION {0} LOADED", scene.RegionInfo.RegionName); + + scene.AddCommand( + "Debug", this, "debug scene set", + "debug scene set active|collisions|pbackup|physics|scripting|teleport|updates true|false", + "Turn on scene debugging options.", + "If active is false then main scene update and maintenance loops are suspended.\n" + + "If collisions is false then collisions with other objects are turned off.\n" + + "If pbackup is false then periodic scene backup is turned off.\n" + + "If physics is false then all physics objects are non-physical.\n" + + "If scripting is false then no scripting operations happen.\n" + + "If teleport is true then some extra teleport debug information is logged.\n" + + "If updates is true then any frame which exceeds double the maximum desired frame time is logged.", + HandleDebugSceneCommand); + } + + private void HandleDebugSceneCommand(string module, string[] args) + { + if (args.Length == 5) + { + if (MainConsole.Instance.ConsoleScene == null) + { + MainConsole.Instance.Output("Please use 'change region ' first"); + } + else + { + string key = args[3]; + string value = args[4]; + SetSceneDebugOptions(new Dictionary() { { key, value } }); + + MainConsole.Instance.OutputFormat("Set debug scene {0} = {1}", key, value); + } + } + else + { + MainConsole.Instance.Output( + "Usage: debug scene set active|collisions|pbackup|physics|scripting|teleport|updates true|false"); + } + } + + public void SetSceneDebugOptions(Dictionary options) + { + if (options.ContainsKey("active")) + { + bool active; + + if (bool.TryParse(options["active"], out active)) + m_scene.Active = active; + } + + if (options.ContainsKey("pbackup")) + { + bool active; + + if (bool.TryParse(options["pbackup"], out active)) + m_scene.PeriodicBackup = active; + } + + if (options.ContainsKey("scripting")) + { + bool enableScripts = true; + if (bool.TryParse(options["scripting"], out enableScripts)) + m_scene.ScriptsEnabled = enableScripts; + } + + if (options.ContainsKey("physics")) + { + bool enablePhysics; + if (bool.TryParse(options["physics"], out enablePhysics)) + m_scene.PhysicsEnabled = enablePhysics; + } + +// if (options.ContainsKey("collisions")) +// { +// // TODO: Implement. If false, should stop objects colliding, though possibly should still allow +// // the avatar themselves to collide with the ground. +// } + + if (options.ContainsKey("teleport")) + { + bool enableTeleportDebugging; + if (bool.TryParse(options["teleport"], out enableTeleportDebugging)) + m_scene.DebugTeleporting = enableTeleportDebugging; + } + + if (options.ContainsKey("updates")) + { + bool enableUpdateDebugging; + if (bool.TryParse(options["updates"], out enableUpdateDebugging)) + { + m_scene.DebugUpdates = enableUpdateDebugging; + GcNotify.Enabled = enableUpdateDebugging; + } + } + } + + private void GetAttachmentsReport(ScenePresence sp, StringBuilder sb) + { + sb.AppendFormat("Attachments for {0}\n", sp.Name); + + ConsoleDisplayTable ct = new ConsoleDisplayTable() { Indent = 2 }; + ct.Columns.Add(new ConsoleDisplayTableColumn("Attachment Name", 50)); + ct.Columns.Add(new ConsoleDisplayTableColumn("Local ID", 10)); + ct.Columns.Add(new ConsoleDisplayTableColumn("Item ID", 36)); + ct.Columns.Add(new ConsoleDisplayTableColumn("Attach Point", 14)); + ct.Columns.Add(new ConsoleDisplayTableColumn("Position", 15)); + +// sb.AppendFormat( +// " {0,-36} {1,-10} {2,-36} {3,-14} {4,-15}\n", +// "Attachment Name", "Local ID", "Item ID", "Attach Point", "Position"); + + List attachmentObjects = sp.GetAttachments(); + foreach (SceneObjectGroup attachmentObject in attachmentObjects) + { +// InventoryItemBase attachmentItem +// = m_scenes[0].InventoryService.GetItem(new InventoryItemBase(attachmentObject.FromItemID)); + +// if (attachmentItem == null) +// { +// sb.AppendFormat( +// "WARNING: Couldn't find attachment for item {0} at point {1}\n", +// attachmentData.ItemID, (AttachmentPoint)attachmentData.AttachPoint); +// continue; +// } +// else +// { +// sb.AppendFormat( +// " {0,-36} {1,-10} {2,-36} {3,-14} {4,-15}\n", +// attachmentObject.Name, attachmentObject.LocalId, attachmentObject.FromItemID, +// (AttachmentPoint)attachmentObject.AttachmentPoint, attachmentObject.RootPart.AttachedPos); + ct.Rows.Add( + new ConsoleDisplayTableRow( + new List() + { + attachmentObject.Name, + attachmentObject.LocalId.ToString(), + attachmentObject.FromItemID.ToString(), + ((AttachmentPoint)attachmentObject.AttachmentPoint).ToString(), + attachmentObject.RootPart.AttachedPos.ToString() + })); +// } + } + + ct.AddToStringBuilder(sb); + sb.Append("\n"); + } + } +} \ No newline at end of file From f3a2bbbd93bd670f54add28fab09c824aa7f9c97 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Thu, 10 Jan 2013 23:56:11 +0000 Subject: [PATCH 7/8] Add "debug scene get" console command to list current scene options --- .../SceneCommands/SceneCommandsModule.cs | 45 ++++++++++++++++++- 1 file changed, 43 insertions(+), 2 deletions(-) diff --git a/OpenSim/Region/OptionalModules/World/SceneCommands/SceneCommandsModule.cs b/OpenSim/Region/OptionalModules/World/SceneCommands/SceneCommandsModule.cs index 5dbf207653..555231758f 100644 --- a/OpenSim/Region/OptionalModules/World/SceneCommands/SceneCommandsModule.cs +++ b/OpenSim/Region/OptionalModules/World/SceneCommands/SceneCommandsModule.cs @@ -88,6 +88,19 @@ namespace OpenSim.Region.OptionalModules.Avatar.Attachments { // m_log.DebugFormat("[ATTACHMENTS COMMAND MODULE]: REGION {0} LOADED", scene.RegionInfo.RegionName); + scene.AddCommand( + "Debug", this, "debug scene get", + "debug scene get", + "List current scene options.", + "If active is false then main scene update and maintenance loops are suspended.\n" + + "If collisions is false then collisions with other objects are turned off.\n" + + "If pbackup is false then periodic scene backup is turned off.\n" + + "If physics is false then all physics objects are non-physical.\n" + + "If scripting is false then no scripting operations happen.\n" + + "If teleport is true then some extra teleport debug information is logged.\n" + + "If updates is true then any frame which exceeds double the maximum desired frame time is logged.", + HandleDebugSceneGetCommand); + scene.AddCommand( "Debug", this, "debug scene set", "debug scene set active|collisions|pbackup|physics|scripting|teleport|updates true|false", @@ -99,10 +112,38 @@ namespace OpenSim.Region.OptionalModules.Avatar.Attachments + "If scripting is false then no scripting operations happen.\n" + "If teleport is true then some extra teleport debug information is logged.\n" + "If updates is true then any frame which exceeds double the maximum desired frame time is logged.", - HandleDebugSceneCommand); + HandleDebugSceneSetCommand); } - private void HandleDebugSceneCommand(string module, string[] args) + private void HandleDebugSceneGetCommand(string module, string[] args) + { + if (args.Length == 3) + { + if (MainConsole.Instance.ConsoleScene == null) + MainConsole.Instance.Output("Please use 'change region ' first"); + else + OutputSceneDebugOptions(); + } + else + { + MainConsole.Instance.Output("Usage: debug scene get"); + } + } + + private void OutputSceneDebugOptions() + { + ConsoleDisplayList cdl = new ConsoleDisplayList(); + cdl.AddRow("active", m_scene.Active); + cdl.AddRow("pbackup", m_scene.PeriodicBackup); + cdl.AddRow("physics", m_scene.PhysicsEnabled); + cdl.AddRow("scripting", m_scene.ScriptsEnabled); + cdl.AddRow("teleport", m_scene.DebugTeleporting); + cdl.AddRow("updates", m_scene.DebugUpdates); + + MainConsole.Instance.Output(cdl.ToString()); + } + + private void HandleDebugSceneSetCommand(string module, string[] args) { if (args.Length == 5) { From 26347307ec39f05a138322554787b88d8d07be4a Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Fri, 11 Jan 2013 00:08:52 +0000 Subject: [PATCH 8/8] Fix a regression in the last few scene commands changes where setting these via the viewer estate dialog stopped working. Forgot to register the new interface. Also removes some code which got included by adpating an existing module. --- .../SceneCommands/SceneCommandsModule.cs | 54 +------------------ 1 file changed, 2 insertions(+), 52 deletions(-) diff --git a/OpenSim/Region/OptionalModules/World/SceneCommands/SceneCommandsModule.cs b/OpenSim/Region/OptionalModules/World/SceneCommands/SceneCommandsModule.cs index 555231758f..8b8758e59c 100644 --- a/OpenSim/Region/OptionalModules/World/SceneCommands/SceneCommandsModule.cs +++ b/OpenSim/Region/OptionalModules/World/SceneCommands/SceneCommandsModule.cs @@ -51,7 +51,6 @@ namespace OpenSim.Region.OptionalModules.Avatar.Attachments private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); private Scene m_scene; -// private IAvatarFactoryModule m_avatarFactory; public string Name { get { return "Scene Commands Module"; } } @@ -77,6 +76,8 @@ namespace OpenSim.Region.OptionalModules.Avatar.Attachments // m_log.DebugFormat("[SCENE COMMANDS MODULE]: REGION {0} ADDED", scene.RegionInfo.RegionName); m_scene = scene; + + m_scene.RegisterModuleInterface(this); } public void RemoveRegion(Scene scene) @@ -222,56 +223,5 @@ namespace OpenSim.Region.OptionalModules.Avatar.Attachments } } } - - private void GetAttachmentsReport(ScenePresence sp, StringBuilder sb) - { - sb.AppendFormat("Attachments for {0}\n", sp.Name); - - ConsoleDisplayTable ct = new ConsoleDisplayTable() { Indent = 2 }; - ct.Columns.Add(new ConsoleDisplayTableColumn("Attachment Name", 50)); - ct.Columns.Add(new ConsoleDisplayTableColumn("Local ID", 10)); - ct.Columns.Add(new ConsoleDisplayTableColumn("Item ID", 36)); - ct.Columns.Add(new ConsoleDisplayTableColumn("Attach Point", 14)); - ct.Columns.Add(new ConsoleDisplayTableColumn("Position", 15)); - -// sb.AppendFormat( -// " {0,-36} {1,-10} {2,-36} {3,-14} {4,-15}\n", -// "Attachment Name", "Local ID", "Item ID", "Attach Point", "Position"); - - List attachmentObjects = sp.GetAttachments(); - foreach (SceneObjectGroup attachmentObject in attachmentObjects) - { -// InventoryItemBase attachmentItem -// = m_scenes[0].InventoryService.GetItem(new InventoryItemBase(attachmentObject.FromItemID)); - -// if (attachmentItem == null) -// { -// sb.AppendFormat( -// "WARNING: Couldn't find attachment for item {0} at point {1}\n", -// attachmentData.ItemID, (AttachmentPoint)attachmentData.AttachPoint); -// continue; -// } -// else -// { -// sb.AppendFormat( -// " {0,-36} {1,-10} {2,-36} {3,-14} {4,-15}\n", -// attachmentObject.Name, attachmentObject.LocalId, attachmentObject.FromItemID, -// (AttachmentPoint)attachmentObject.AttachmentPoint, attachmentObject.RootPart.AttachedPos); - ct.Rows.Add( - new ConsoleDisplayTableRow( - new List() - { - attachmentObject.Name, - attachmentObject.LocalId.ToString(), - attachmentObject.FromItemID.ToString(), - ((AttachmentPoint)attachmentObject.AttachmentPoint).ToString(), - attachmentObject.RootPart.AttachedPos.ToString() - })); -// } - } - - ct.AddToStringBuilder(sb); - sb.Append("\n"); - } } } \ No newline at end of file