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.

afrisby
MW 2007-10-15 08:51:59 +00:00
parent 9de589bc37
commit c2462bc8bb
3 changed files with 132 additions and 4 deletions

View File

@ -75,7 +75,7 @@ namespace OpenSim.Region.Environment
} }
} }
private void InitializeModule(IRegionModule module, Scene scene) public void InitializeModule(IRegionModule module, Scene scene)
{ {
module.Initialise(scene); module.Initialise(scene);
scene.AddModule(module.Name, module); scene.AddModule(module.Name, module);

View File

@ -96,9 +96,10 @@ namespace OpenSim.Region.Environment.Modules
public LLUUID AddDynamicTextureURL(LLUUID simID, LLUUID primID, string contentType, string url, public LLUUID AddDynamicTextureURL(LLUUID simID, LLUUID primID, string contentType, string url,
string extraParams, int updateTimer) string extraParams, int updateTimer)
{ {
Console.WriteLine("dynamic texture being created: " + url + " of type " + contentType);
if (RenderPlugins.ContainsKey(contentType)) if (RenderPlugins.ContainsKey(contentType))
{ {
//Console.WriteLine("dynamic texture being created: " + url + " of type " + contentType);
DynamicTextureUpdater updater = new DynamicTextureUpdater(); DynamicTextureUpdater updater = new DynamicTextureUpdater();
updater.SimUUID = simID; updater.SimUUID = simID;
updater.PrimID = primID; updater.PrimID = primID;
@ -166,12 +167,16 @@ namespace OpenSim.Region.Environment.Modules
public void DataReceived(byte[] data, Scene scene) public void DataReceived(byte[] data, Scene scene)
{ {
//TODO delete the last asset(data), if it was a dynamic texture //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(); AssetBase asset = new AssetBase();
asset.FullID = LLUUID.Random(); asset.FullID = LLUUID.Random();
asset.Data = data; asset.Data = assetData;
asset.Name = "DynamicImage" + Util.RandomClass.Next(1, 10000); asset.Name = "DynamicImage" + Util.RandomClass.Next(1, 10000);
asset.Type = 0; asset.Type = 0;
asset.Description = "dynamic image";
asset.Local = false;
asset.Temporary = false;
scene.commsManager.AssetCache.AddAsset(asset); scene.commsManager.AssetCache.AddAsset(asset);
LastAssetID = asset.FullID; LastAssetID = asset.FullID;

View File

@ -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<IDynamicTextureManager>();
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;
}
}
}
}