From c77e7fce9ebbdb0a7a5baee316fcf940bf641416 Mon Sep 17 00:00:00 2001 From: Adam Frisby Date: Thu, 9 Apr 2009 14:19:49 +0000 Subject: [PATCH] * Implements IGraphics interface for MRM Scripting. * This allows you to utilize System.Drawing tools on textures within the region. * Example: use System.Drawing.Bitmap to make your texture, then use Host.Graphics.SaveBitmap to make an asset from it in JPEG2K. You can edit (but not overwrite) existing textures using Host.Graphics.LoadBitmap. --- .../Scripting/Minimodule/Graphics.cs | 48 +++++++++++++++++++ .../Scripting/Minimodule/Host.cs | 13 ++++- .../Scripting/Minimodule/IGraphics.cs | 12 +++++ .../Scripting/Minimodule/IHost.cs | 1 + .../Scripting/Minimodule/MRMModule.cs | 2 +- .../Scripting/Minimodule/World.cs | 5 +- 6 files changed, 75 insertions(+), 6 deletions(-) create mode 100644 OpenSim/Region/OptionalModules/Scripting/Minimodule/Graphics.cs create mode 100644 OpenSim/Region/OptionalModules/Scripting/Minimodule/IGraphics.cs diff --git a/OpenSim/Region/OptionalModules/Scripting/Minimodule/Graphics.cs b/OpenSim/Region/OptionalModules/Scripting/Minimodule/Graphics.cs new file mode 100644 index 0000000000..4de249f2ea --- /dev/null +++ b/OpenSim/Region/OptionalModules/Scripting/Minimodule/Graphics.cs @@ -0,0 +1,48 @@ +using System.Drawing; +using OpenMetaverse; +using OpenMetaverse.Imaging; +using OpenSim.Framework; +using OpenSim.Region.Framework.Scenes; + +namespace OpenSim.Region.OptionalModules.Scripting.Minimodule +{ + class Graphics : IGraphics + { + private readonly Scene m_scene; + + public Graphics(Scene m_scene) + { + this.m_scene = m_scene; + } + + public UUID SaveBitmap(Bitmap data) + { + return SaveBitmap(data, false, true); + } + + public UUID SaveBitmap(Bitmap data, bool lossless, bool temporary) + { + AssetBase asset = new AssetBase(); + asset.FullID = UUID.Random(); + asset.Data = OpenJPEG.EncodeFromImage(data, lossless); + asset.Name = "MRMDynamicImage" + Util.RandomClass.Next(1, 10000); + asset.Type = 0; + asset.Description = "MRM Image"; + asset.Local = false; + asset.Temporary = temporary; + m_scene.CommsManager.AssetCache.AddAsset(asset); + + return asset.FullID; + } + + public Bitmap LoadBitmap(UUID assetID) + { + AssetBase bmp = m_scene.CommsManager.AssetCache.GetAsset(assetID, true); + ManagedImage outimg; + Image img; + OpenJPEG.DecodeToImage(bmp.Data, out outimg, out img); + + return new Bitmap(img); + } + } +} diff --git a/OpenSim/Region/OptionalModules/Scripting/Minimodule/Host.cs b/OpenSim/Region/OptionalModules/Scripting/Minimodule/Host.cs index 394e02410c..f5953d0fd7 100644 --- a/OpenSim/Region/OptionalModules/Scripting/Minimodule/Host.cs +++ b/OpenSim/Region/OptionalModules/Scripting/Minimodule/Host.cs @@ -27,6 +27,7 @@ using System.Reflection; using log4net; +using OpenSim.Region.Framework.Scenes; namespace OpenSim.Region.OptionalModules.Scripting.Minimodule { @@ -34,10 +35,15 @@ namespace OpenSim.Region.OptionalModules.Scripting.Minimodule { private readonly IObject m_obj; private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); + private readonly IGraphics m_graphics; + private Scene m_scene; - public Host(IObject m_obj) + public Host(IObject m_obj, Scene m_scene) { this.m_obj = m_obj; + this.m_scene = m_scene; + + m_graphics = new Graphics(m_scene); } public IObject Object @@ -49,5 +55,10 @@ namespace OpenSim.Region.OptionalModules.Scripting.Minimodule { get { return m_log; } } + + public IGraphics Graphics + { + get { return m_graphics; } + } } } diff --git a/OpenSim/Region/OptionalModules/Scripting/Minimodule/IGraphics.cs b/OpenSim/Region/OptionalModules/Scripting/Minimodule/IGraphics.cs new file mode 100644 index 0000000000..f4bc12e96f --- /dev/null +++ b/OpenSim/Region/OptionalModules/Scripting/Minimodule/IGraphics.cs @@ -0,0 +1,12 @@ +using System.Drawing; +using OpenMetaverse; + +namespace OpenSim.Region.OptionalModules.Scripting.Minimodule +{ + public interface IGraphics + { + UUID SaveBitmap(Bitmap data); + UUID SaveBitmap(Bitmap data, bool lossless, bool temporary); + Bitmap LoadBitmap(UUID assetID); + } +} diff --git a/OpenSim/Region/OptionalModules/Scripting/Minimodule/IHost.cs b/OpenSim/Region/OptionalModules/Scripting/Minimodule/IHost.cs index deb7c57619..6c7691925e 100644 --- a/OpenSim/Region/OptionalModules/Scripting/Minimodule/IHost.cs +++ b/OpenSim/Region/OptionalModules/Scripting/Minimodule/IHost.cs @@ -36,5 +36,6 @@ namespace OpenSim.Region.OptionalModules.Scripting.Minimodule { IObject Object { get; } ILog Console { get; } + IGraphics Graphics { get; } } } diff --git a/OpenSim/Region/OptionalModules/Scripting/Minimodule/MRMModule.cs b/OpenSim/Region/OptionalModules/Scripting/Minimodule/MRMModule.cs index 910ddea910..b978d7cacb 100644 --- a/OpenSim/Region/OptionalModules/Scripting/Minimodule/MRMModule.cs +++ b/OpenSim/Region/OptionalModules/Scripting/Minimodule/MRMModule.cs @@ -82,7 +82,7 @@ namespace OpenSim.Region.OptionalModules.Scripting.Minimodule { m_log.Info("[MRM] Found C# MRM"); IWorld m_world = new World(m_scene); - IHost m_host = new Host(new SOPObject(m_scene, localID)); + IHost m_host = new Host(new SOPObject(m_scene, localID), m_scene); MRMBase mmb = (MRMBase)AppDomain.CurrentDomain.CreateInstanceFromAndUnwrap( CompileFromDotNetText(script, itemID.ToString()), diff --git a/OpenSim/Region/OptionalModules/Scripting/Minimodule/World.cs b/OpenSim/Region/OptionalModules/Scripting/Minimodule/World.cs index 228002205f..f2b3e8113d 100644 --- a/OpenSim/Region/OptionalModules/Scripting/Minimodule/World.cs +++ b/OpenSim/Region/OptionalModules/Scripting/Minimodule/World.cs @@ -26,10 +26,7 @@ */ using System.Collections.Generic; -using System.Reflection; -using log4net; using OpenSim.Framework; -using OpenSim.Framework.Client; using OpenSim.Region.Framework.Interfaces; using OpenSim.Region.Framework.Scenes; @@ -159,7 +156,7 @@ namespace OpenSim.Region.OptionalModules.Scripting.Minimodule // Skip if other } - void EventManager_OnChatFromClient(object sender, OpenSim.Framework.OSChatMessage chat) + void EventManager_OnChatFromClient(object sender, OSChatMessage chat) { if (_OnChat != null) {