diff --git a/OpenSim/Framework/Util.cs b/OpenSim/Framework/Util.cs
index 1b9777f10b..5c7797a95e 100644
--- a/OpenSim/Framework/Util.cs
+++ b/OpenSim/Framework/Util.cs
@@ -533,6 +533,19 @@ namespace OpenSim.Framework
return (x + y - (min >> 1) - (min >> 2) + (min >> 4));
}
+ ///
+ /// Determines whether a point is inside a bounding box.
+ ///
+ /// /param>
+ ///
+ ///
+ ///
+ public static bool IsInsideBox(Vector3 v, Vector3 min, Vector3 max)
+ {
+ return v.X >= min.X & v.Y >= min.Y && v.Z >= min.Z
+ && v.X <= max.X && v.Y <= max.Y && v.Z <= max.Z;
+ }
+
///
/// Are the co-ordinates of the new region visible from the old region?
///
diff --git a/OpenSim/Region/CoreModules/World/Objects/Commands/ObjectCommandsModule.cs b/OpenSim/Region/CoreModules/World/Objects/Commands/ObjectCommandsModule.cs
index e96dc3e87d..5ecf5a1e27 100644
--- a/OpenSim/Region/CoreModules/World/Objects/Commands/ObjectCommandsModule.cs
+++ b/OpenSim/Region/CoreModules/World/Objects/Commands/ObjectCommandsModule.cs
@@ -123,6 +123,25 @@ namespace OpenSim.Region.CoreModules.World.Objects.Commands
"If --regex is specified then the name is treatead as a regular expression",
HandleShowObjectByName);
+ m_console.Commands.AddCommand(
+ "Objects",
+ false,
+ "show object pos",
+ "show object pos to ",
+ "Show details of scene objects within the given area.",
+ "Each component of the coord is comma separated. There must be no spaces between the commas.\n"
+ + "If you don't care about the z component you can simply omit it.\n"
+ + "If you don't care about the x or y components then you can leave them blank (though a comma is still required)\n"
+ + "If you want to specify the maxmimum value of a component then you can use ~ instead of a number\n"
+ + "If you want to specify the minimum value of a component then you can use -~ instead of a number\n"
+ + "e.g.\n"
+ + "show object pos 20,20,20 to 40,40,40\n"
+ + "show object pos 20,20 to 40,40\n"
+ + "show object pos ,20,20 to ,40,40\n"
+ + "show object pos ,,30 to ,,~\n"
+ + "show object pos ,,-~ to ,,30\n",
+ HandleShowObjectByPos);
+
m_console.Commands.AddCommand(
"Objects",
false,
@@ -228,6 +247,54 @@ namespace OpenSim.Region.CoreModules.World.Objects.Commands
m_console.OutputFormat(sb.ToString());
}
+ private void HandleShowObjectByPos(string module, string[] cmdparams)
+ {
+ if (!(m_console.ConsoleScene == null || m_console.ConsoleScene == m_scene))
+ return;
+
+ if (cmdparams.Length < 5)
+ {
+ m_console.OutputFormat("Usage: show object pos to ");
+ return;
+ }
+
+ string rawConsoleStartVector = cmdparams[3];
+ Vector3 startVector;
+
+ if (!ConsoleUtil.TryParseConsoleMinVector(rawConsoleStartVector, out startVector))
+ {
+ m_console.OutputFormat("Error: Start vector {0} does not have a valid format", rawConsoleStartVector);
+ return;
+ }
+
+ string rawConsoleEndVector = cmdparams[5];
+ Vector3 endVector;
+
+ if (!ConsoleUtil.TryParseConsoleMaxVector(rawConsoleEndVector, out endVector))
+ {
+ m_console.OutputFormat("Error: End vector {0} does not have a valid format", rawConsoleEndVector);
+ return;
+ }
+
+ List sceneObjects = new List();
+ Action searchAction
+ = so => { if (Util.IsInsideBox(so.AbsolutePosition, startVector, endVector)) { sceneObjects.Add(so); }};
+
+ m_scene.ForEachSOG(searchAction);
+
+ StringBuilder sb = new StringBuilder();
+
+ foreach (SceneObjectGroup so in sceneObjects)
+ {
+ AddSceneObjectReport(sb, so);
+ sb.Append("\n");
+ }
+
+ sb.AppendFormat("{0} objects found in {1}\n", sceneObjects.Count, m_scene.Name);
+
+ m_console.OutputFormat(sb.ToString());
+ }
+
private void HandleShowPartByUuid(string module, string[] cmd)
{
if (!(m_console.ConsoleScene == null || m_console.ConsoleScene == m_scene))