From c2462bc8bb76b215437412c7dae839b5d0925df8 Mon Sep 17 00:00:00 2001 From: MW Date: Mon, 15 Oct 2007 08:51:59 +0000 Subject: Added "LoadImageUrl" module , that is a dynamic texture render, that works with the DynamicTextureModule to allow loading of a image from a webserver and a texture of that image created. --- .../Environment/Modules/DynamicTextureModule.cs | 11 +- .../Environment/Modules/LoadImageURLModule.cs | 123 +++++++++++++++++++++ 2 files changed, 131 insertions(+), 3 deletions(-) create mode 100644 OpenSim/Region/Environment/Modules/LoadImageURLModule.cs (limited to 'OpenSim/Region/Environment/Modules') diff --git a/OpenSim/Region/Environment/Modules/DynamicTextureModule.cs b/OpenSim/Region/Environment/Modules/DynamicTextureModule.cs index 51a5534..bac0d59 100644 --- a/OpenSim/Region/Environment/Modules/DynamicTextureModule.cs +++ b/OpenSim/Region/Environment/Modules/DynamicTextureModule.cs @@ -96,9 +96,10 @@ namespace OpenSim.Region.Environment.Modules public LLUUID AddDynamicTextureURL(LLUUID simID, LLUUID primID, string contentType, string url, string extraParams, int updateTimer) { - Console.WriteLine("dynamic texture being created: " + url + " of type " + contentType); if (RenderPlugins.ContainsKey(contentType)) { + //Console.WriteLine("dynamic texture being created: " + url + " of type " + contentType); + DynamicTextureUpdater updater = new DynamicTextureUpdater(); updater.SimUUID = simID; updater.PrimID = primID; @@ -166,12 +167,16 @@ namespace OpenSim.Region.Environment.Modules public void DataReceived(byte[] data, Scene scene) { //TODO delete the last asset(data), if it was a dynamic texture - + byte[] assetData = new byte[data.Length]; + Array.Copy(data, assetData, data.Length); AssetBase asset = new AssetBase(); asset.FullID = LLUUID.Random(); - asset.Data = data; + asset.Data = assetData; asset.Name = "DynamicImage" + Util.RandomClass.Next(1, 10000); asset.Type = 0; + asset.Description = "dynamic image"; + asset.Local = false; + asset.Temporary = false; scene.commsManager.AssetCache.AddAsset(asset); LastAssetID = asset.FullID; diff --git a/OpenSim/Region/Environment/Modules/LoadImageURLModule.cs b/OpenSim/Region/Environment/Modules/LoadImageURLModule.cs new file mode 100644 index 0000000..f1f479d --- /dev/null +++ b/OpenSim/Region/Environment/Modules/LoadImageURLModule.cs @@ -0,0 +1,123 @@ +using System; +using System.Collections.Generic; +using System.Text; +using System.Net; +using System.IO; +using System.Drawing; +using libsecondlife; +using OpenJPEGNet; +using OpenSim.Region.Environment.Scenes; +using OpenSim.Region.Environment.Interfaces; + +namespace OpenSim.Region.Environment.Modules +{ + public class LoadImageURLModule : IRegionModule , IDynamicTextureRender + { + private string m_name = "LoadImageURL"; + private IDynamicTextureManager m_textureManager; + private Scene m_scene; + + public void Initialise(Scene scene) + { + if (m_scene == null) + { + m_scene = scene; + } + } + + public void PostInitialise() + { + m_textureManager = m_scene.RequestModuleInterface(); + m_textureManager.RegisterRender(GetContentType(), this); + } + + public void Close() + { + } + + public string Name + { + get { return m_name; } + } + + public bool IsSharedModule + { + get { return true; } + } + + public string GetName() + { + return m_name; + } + + public string GetContentType() + { + return ("image"); + } + + public bool SupportsAsynchronous() + { + return true; + } + + public byte[] ConvertUrl(string url, string extraParams) + { + return null; + } + + public byte[] ConvertStream(Stream data, string extraParams) + { + return null; + } + + public bool AsyncConvertUrl(LLUUID id, string url, string extraParams) + { + MakeHttpRequest(url, id); + return true; + } + + public bool AsyncConvertData(LLUUID id, string bodyData, string extraParams) + { + return false; + } + + private void MakeHttpRequest(string url, LLUUID requestID) + { + WebRequest request = HttpWebRequest.Create(url); + RequestState state = new RequestState((HttpWebRequest)request, requestID); + IAsyncResult result = request.BeginGetResponse(new AsyncCallback(HttpRequestReturn), state); + + TimeSpan t = (DateTime.UtcNow - new DateTime(1970, 1, 1)); + state.TimeOfRequest = (int)t.TotalSeconds; + } + + private void HttpRequestReturn(IAsyncResult result) + { + RequestState state = (RequestState)result.AsyncState; + WebRequest request = (WebRequest)state.Request; + HttpWebResponse response = (HttpWebResponse)request.EndGetResponse(result); + if (response.StatusCode == HttpStatusCode.OK) + { + Bitmap image = new Bitmap(response.GetResponseStream()); + Bitmap resize = new Bitmap(image, new Size(512, 512)); + byte[] imageJ2000 = OpenJPEG.EncodeFromImage(resize, true); + + m_textureManager.ReturnData(state.RequestID, imageJ2000); + } + } + + public class RequestState + { + public HttpWebRequest Request = null; + public LLUUID RequestID = LLUUID.Zero; + public int TimeOfRequest = 0; + + public RequestState(HttpWebRequest request, LLUUID requestID) + { + Request = request; + RequestID = requestID; + } + } + + } +} -- cgit v1.1