diff --git a/OpenSim/Region/CoreModules/Resources/CoreModulePlugin.addin.xml b/OpenSim/Region/CoreModules/Resources/CoreModulePlugin.addin.xml
index e85e4e95f0..df23eacde0 100644
--- a/OpenSim/Region/CoreModules/Resources/CoreModulePlugin.addin.xml
+++ b/OpenSim/Region/CoreModules/Resources/CoreModulePlugin.addin.xml
@@ -76,6 +76,8 @@
\
\
+ \
+ \
diff --git a/OpenSim/Region/CoreModules/World/LegacyMap/MapImageModule.cs b/OpenSim/Region/CoreModules/World/LegacyMap/MapImageModule.cs
index 8408bf9382..c9ef1f4285 100644
--- a/OpenSim/Region/CoreModules/World/LegacyMap/MapImageModule.cs
+++ b/OpenSim/Region/CoreModules/World/LegacyMap/MapImageModule.cs
@@ -59,7 +59,7 @@ namespace OpenSim.Region.CoreModules.World.LegacyMap
public face[] trns;
}
- public class MapImageModule : IMapImageGenerator, IRegionModule
+ public class MapImageModule : IMapImageGenerator, INonSharedRegionModule
{
private static readonly ILog m_log =
LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
@@ -67,6 +67,7 @@ namespace OpenSim.Region.CoreModules.World.LegacyMap
private Scene m_scene;
private IConfigSource m_config;
private IMapTileTerrainRenderer terrainRenderer;
+ private bool m_Enabled = false;
#region IMapImageGenerator Members
@@ -132,9 +133,8 @@ namespace OpenSim.Region.CoreModules.World.LegacyMap
#region IRegionModule Members
- public void Initialise(Scene scene, IConfigSource source)
+ public void Initialise(IConfigSource source)
{
- m_scene = scene;
m_config = source;
IConfig startupConfig = m_config.Configs["Startup"];
@@ -142,10 +142,24 @@ namespace OpenSim.Region.CoreModules.World.LegacyMap
"MapImageModule")
return;
+ m_Enabled = true;
+ }
+
+ public void AddRegion(Scene scene)
+ {
+ if (!m_Enabled)
+ return;
+
+ m_scene = scene;
+
m_scene.RegisterModuleInterface(this);
}
- public void PostInitialise()
+ public void RegionLoaded(Scene scene)
+ {
+ }
+
+ public void RemoveRegion(Scene scene)
{
}
@@ -158,9 +172,9 @@ namespace OpenSim.Region.CoreModules.World.LegacyMap
get { return "MapImageModule"; }
}
- public bool IsSharedModule
+ public Type ReplaceableInterface
{
- get { return false; }
+ get { return null; }
}
#endregion
diff --git a/OpenSim/Region/CoreModules/World/Warp3DMap/MapImageModule.cs b/OpenSim/Region/CoreModules/World/Warp3DMap/MapImageModule.cs
index 803a33a65c..eca85d3022 100644
--- a/OpenSim/Region/CoreModules/World/Warp3DMap/MapImageModule.cs
+++ b/OpenSim/Region/CoreModules/World/Warp3DMap/MapImageModule.cs
@@ -49,7 +49,7 @@ using WarpRenderer = global::Warp3D.Warp3D;
namespace OpenSim.Region.CoreModules.World.Warp3DMap
{
- public class Warp3DImageModule : IMapImageGenerator, IRegionModule
+ public class Warp3DImageModule : IMapImageGenerator, INonSharedRegionModule
{
private static readonly UUID TEXTURE_METADATA_MAGIC = new UUID("802dc0e0-f080-4931-8b57-d1be8611c4f3");
private static readonly Color4 WATER_COLOR = new Color4(29, 71, 95, 216);
@@ -62,18 +62,28 @@ namespace OpenSim.Region.CoreModules.World.Warp3DMap
private IConfigSource m_config;
private Dictionary m_colors = new Dictionary();
private bool m_useAntiAliasing = true; // TODO: Make this a config option
+ private bool m_Enabled = false;
#region IRegionModule Members
- public void Initialise(Scene scene, IConfigSource source)
+ public void Initialise(IConfigSource source)
{
- m_scene = scene;
m_config = source;
IConfig startupConfig = m_config.Configs["Startup"];
if (startupConfig.GetString("MapImageModule", "MapImageModule") != "Warp3DImageModule")
return;
+ m_Enabled = true;
+ }
+
+ public void AddRegion(Scene scene)
+ {
+ if (!m_Enabled)
+ return;
+
+ m_scene = scene;
+
List renderers = RenderingLoader.ListRenderers(Util.ExecutingDirectory());
if (renderers.Count > 0)
{
@@ -88,7 +98,11 @@ namespace OpenSim.Region.CoreModules.World.Warp3DMap
m_scene.RegisterModuleInterface(this);
}
- public void PostInitialise()
+ public void RegionLoaded(Scene scene)
+ {
+ }
+
+ public void RemoveRegion(Scene scene)
{
}
@@ -101,9 +115,9 @@ namespace OpenSim.Region.CoreModules.World.Warp3DMap
get { return "Warp3DImageModule"; }
}
- public bool IsSharedModule
+ public Type ReplaceableInterface
{
- get { return false; }
+ get { return null; }
}
#endregion
diff --git a/OpenSim/Region/OptionalModules/Resources/OptionalModules.addin.xml b/OpenSim/Region/OptionalModules/Resources/OptionalModules.addin.xml
index 352052a3f5..5eea286fd7 100644
--- a/OpenSim/Region/OptionalModules/Resources/OptionalModules.addin.xml
+++ b/OpenSim/Region/OptionalModules/Resources/OptionalModules.addin.xml
@@ -12,5 +12,6 @@
+
diff --git a/OpenSim/Region/OptionalModules/World/WorldView/WorldViewModule.cs b/OpenSim/Region/OptionalModules/World/WorldView/WorldViewModule.cs
new file mode 100644
index 0000000000..55be9bac5e
--- /dev/null
+++ b/OpenSim/Region/OptionalModules/World/WorldView/WorldViewModule.cs
@@ -0,0 +1,122 @@
+/*
+ * 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.Drawing;
+using System.Drawing.Imaging;
+using System.Reflection;
+using System.IO;
+using log4net;
+using Nini.Config;
+using OpenMetaverse;
+using OpenMetaverse.Imaging;
+using OpenSim.Framework;
+using OpenSim.Region.Framework.Interfaces;
+using OpenSim.Region.Framework.Scenes;
+using OpenSim.Server.Base;
+using OpenSim.Framework.Servers.HttpServer;
+using OpenSim.Services.Interfaces;
+
+namespace OpenSim.Region.OptionalModules.World.WorldView
+{
+ public class WorldViewModule : INonSharedRegionModule
+ {
+ private static readonly ILog m_log =
+ LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
+
+
+ private bool m_Enabled = false;
+ private IMapImageGenerator m_Generator;
+
+ public void Initialise(IConfigSource config)
+ {
+ IConfig moduleConfig = config.Configs["Modules"];
+ if (moduleConfig == null)
+ return;
+
+ if (moduleConfig.GetString("WorldViewModule", String.Empty) != Name)
+ return;
+
+ m_Enabled = true;
+ }
+
+ public void AddRegion(Scene scene)
+ {
+ }
+
+ public void RegionLoaded(Scene scene)
+ {
+ m_Generator = scene.RequestModuleInterface();
+ if (m_Generator == null)
+ {
+ m_Enabled = false;
+ return;
+ }
+
+ m_log.Info("[WORLDVIEW]: Configured and enabled");
+
+ IHttpServer server = MainServer.GetHttpServer(0);
+ server.AddStreamHandler(new WorldViewRequestHandler(this,
+ scene.RegionInfo.RegionID.ToString()));
+ }
+
+ public void RemoveRegion(Scene scene)
+ {
+ }
+
+ public string Name
+ {
+ get { return "WorldViewModule"; }
+ }
+
+ public Type ReplaceableInterface
+ {
+ get { return null; }
+ }
+
+ public void Close()
+ {
+ }
+
+ public byte[] GenerateWorldView(Vector3 pos, Vector3 rot, float fov,
+ int width, int height)
+ {
+ if (!m_Enabled)
+ return new Byte[0];
+
+ Bitmap bmp = m_Generator.CreateViewImage(pos, rot, fov, width,
+ height);
+
+ MemoryStream str = new MemoryStream();
+
+ bmp.Save(str, ImageFormat.Jpeg);
+
+ return str.ToArray();
+ }
+ }
+}
diff --git a/OpenSim/Region/OptionalModules/World/WorldView/WorldViewRequestHandler.cs b/OpenSim/Region/OptionalModules/World/WorldView/WorldViewRequestHandler.cs
new file mode 100644
index 0000000000..5e744bf54e
--- /dev/null
+++ b/OpenSim/Region/OptionalModules/World/WorldView/WorldViewRequestHandler.cs
@@ -0,0 +1,140 @@
+/*
+ * 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.IO;
+using System.Reflection;
+using System.Xml;
+
+using OpenSim.Framework;
+using OpenSim.Server.Base;
+using OpenSim.Framework.Servers.HttpServer;
+using OpenSim.Region.Framework.Scenes;
+using OpenSim.Region.Framework.Interfaces;
+
+using OpenMetaverse;
+using log4net;
+
+namespace OpenSim.Region.OptionalModules.World.WorldView
+{
+ public class WorldViewRequestHandler : BaseStreamHandler
+ {
+ private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
+
+ protected WorldViewModule m_WorldViewModule;
+ protected Object m_RequestLock = new Object();
+
+ public WorldViewRequestHandler(WorldViewModule fmodule, string rid)
+ : base("POST", "/worldview/" + rid)
+ {
+ m_WorldViewModule = fmodule;
+ }
+
+ public override byte[] Handle(string path, Stream requestData,
+ OSHttpRequest httpRequest, OSHttpResponse httpResponse)
+ {
+ StreamReader sr = new StreamReader(requestData);
+ string body = sr.ReadToEnd();
+ sr.Close();
+ body = body.Trim();
+
+ try
+ {
+ lock (m_RequestLock)
+ {
+ Dictionary request =
+ ServerUtils.ParseQueryString(body);
+
+ return SendWorldView(request);
+ }
+ }
+ catch (Exception e)
+ {
+ m_log.Debug("[WORLDVIEW]: Exception {0}" + e.ToString());
+ }
+
+ return new Byte[0];
+ }
+
+ public Byte[] SendWorldView(Dictionary request)
+ {
+ float posX;
+ float posY;
+ float posZ;
+ float rotX;
+ float rotY;
+ float rotZ;
+ float fov;
+ int width;
+ int height;
+
+ if (!request.ContainsKey("posX"))
+ return new Byte[0];
+ if (!request.ContainsKey("posY"))
+ return new Byte[0];
+ if (!request.ContainsKey("posZ"))
+ return new Byte[0];
+ if (!request.ContainsKey("rotX"))
+ return new Byte[0];
+ if (!request.ContainsKey("rotY"))
+ return new Byte[0];
+ if (!request.ContainsKey("rotZ"))
+ return new Byte[0];
+ if (!request.ContainsKey("fov"))
+ return new Byte[0];
+ if (!request.ContainsKey("width"))
+ return new Byte[0];
+ if (!request.ContainsKey("height"))
+ return new Byte[0];
+
+ try
+ {
+ posX = Convert.ToSingle(request["posX"]);
+ posY = Convert.ToSingle(request["posY"]);
+ posZ = Convert.ToSingle(request["posZ"]);
+ rotX = Convert.ToSingle(request["rotX"]);
+ rotY = Convert.ToSingle(request["rotY"]);
+ rotZ = Convert.ToSingle(request["rotZ"]);
+ fov = Convert.ToSingle(request["fov"]);
+ width = Convert.ToInt32(request["width"]);
+ height = Convert.ToInt32(request["height"]);
+ }
+ catch
+ {
+ return new Byte[0];
+ }
+
+ Vector3 pos = new Vector3(posX, posY, posZ);
+ Vector3 rot = new Vector3(rotX, rotY, rotZ);
+
+ return m_WorldViewModule.GenerateWorldView(pos, rot, fov, width,
+ height);
+ }
+ }
+}
+