LIBOMV-505 Merge in jradford-texturepipeline branch

This changes the way texture requests are handled, the AssetManager
RequestImage method signatures have been changed and are now expecting
the callback with the request.
Progressive requests for textures are supported for rendering viewers
Tuning parameters have been moved to Settings


git-svn-id: http://libopenmetaverse.googlecode.com/svn/libopenmetaverse/trunk@2699 52acb1d6-8a22-11de-b505-999d5b087335
This commit is contained in:
Jim Radford
2009-05-07 16:10:52 +00:00
parent 2725f1b660
commit 14869cab48
11 changed files with 883 additions and 759 deletions

View File

@@ -10,7 +10,6 @@ namespace OpenMetaverse.TestClient
public class DumpOutfitCommand : Command
{
List<UUID> OutfitAssets = new List<UUID>();
AssetManager.ImageReceivedCallback ImageReceivedHandler;
public DumpOutfitCommand(TestClient testClient)
{
@@ -18,7 +17,6 @@ namespace OpenMetaverse.TestClient
Description = "Dumps all of the textures from an avatars outfit to the hard drive. Usage: dumpoutfit [avatar-uuid]";
Category = CommandCategory.Inventory;
ImageReceivedHandler = new AssetManager.ImageReceivedCallback(Assets_OnImageReceived);
}
public override string Execute(string[] args, UUID fromAgentID)
@@ -35,9 +33,7 @@ namespace OpenMetaverse.TestClient
{
for (int i = 0; i < Client.Network.Simulators.Count; i++)
{
Avatar targetAv;
targetAv = Client.Network.Simulators[i].ObjectsAvatars.Find(
Avatar targetAv = Client.Network.Simulators[i].ObjectsAvatars.Find(
delegate(Avatar avatar)
{
return avatar.ID == target;
@@ -49,7 +45,6 @@ namespace OpenMetaverse.TestClient
StringBuilder output = new StringBuilder("Downloading ");
lock (OutfitAssets) OutfitAssets.Clear();
Client.Assets.OnImageReceived += ImageReceivedHandler;
for (int j = 0; j < targetAv.Textures.FaceTextures.Length; j++)
{
@@ -71,8 +66,7 @@ namespace OpenMetaverse.TestClient
}
OutfitAssets.Add(face.TextureID);
Client.Assets.RequestImage(face.TextureID, type, 100000.0f, 0, 0);
Client.Assets.RequestImage(face.TextureID, type, Assets_OnImageReceived);
output.Append(((AppearanceManager.TextureIndex)j).ToString());
output.Append(" ");
}
@@ -86,24 +80,24 @@ namespace OpenMetaverse.TestClient
return "Couldn't find avatar " + target.ToString();
}
private void Assets_OnImageReceived(ImageDownload image, AssetTexture assetTexture)
private void Assets_OnImageReceived(TextureRequestState state, AssetTexture assetTexture)
{
lock (OutfitAssets)
{
if (OutfitAssets.Contains(image.ID))
if (OutfitAssets.Contains(assetTexture.AssetID))
{
if (image.Success)
if (state == TextureRequestState.Finished)
{
try
{
File.WriteAllBytes(image.ID.ToString() + ".jp2", image.AssetData);
Console.WriteLine("Wrote JPEG2000 image " + image.ID.ToString() + ".jp2");
File.WriteAllBytes(assetTexture.AssetID + ".jp2", assetTexture.AssetData);
Console.WriteLine("Wrote JPEG2000 image " + assetTexture.AssetID + ".jp2");
ManagedImage imgData;
OpenJPEG.DecodeToImage(image.AssetData, out imgData);
OpenJPEG.DecodeToImage(assetTexture.AssetData, out imgData);
byte[] tgaFile = imgData.ExportTGA();
File.WriteAllBytes(image.ID.ToString() + ".tga", tgaFile);
Console.WriteLine("Wrote TGA image " + image.ID.ToString() + ".tga");
File.WriteAllBytes(assetTexture.AssetID + ".tga", tgaFile);
Console.WriteLine("Wrote TGA image " + assetTexture.AssetID + ".tga");
}
catch (Exception e)
{
@@ -112,13 +106,10 @@ namespace OpenMetaverse.TestClient
}
else
{
Console.WriteLine("Failed to download image " + image.ID.ToString());
Console.WriteLine("Failed to download image " + assetTexture.AssetID);
}
OutfitAssets.Remove(image.ID);
if (OutfitAssets.Count == 0)
Client.Assets.OnImageReceived -= ImageReceivedHandler;
OutfitAssets.Remove(assetTexture.AssetID);
}
}
}

View File

@@ -9,8 +9,8 @@ namespace OpenMetaverse.TestClient
{
UUID TextureID;
AutoResetEvent DownloadHandle = new AutoResetEvent(false);
ImageDownload Image;
AssetTexture Asset;
TextureRequestState resultState;
public DownloadTextureCommand(TestClient testClient)
{
@@ -19,8 +19,6 @@ namespace OpenMetaverse.TestClient
"Usage: downloadtexture [texture-uuid] [discardlevel]";
Category = CommandCategory.Inventory;
testClient.Assets.OnImageReceiveProgress += new AssetManager.ImageReceiveProgressCallback(Assets_OnImageReceiveProgress);
testClient.Assets.OnImageReceived += new AssetManager.ImageReceivedCallback(Assets_OnImageReceived);
}
public override string Execute(string[] args, UUID fromAgentID)
@@ -30,7 +28,6 @@ namespace OpenMetaverse.TestClient
TextureID = UUID.Zero;
DownloadHandle.Reset();
Image = null;
Asset = null;
if (UUID.TryParse(args[0], out TextureID))
@@ -43,31 +40,31 @@ namespace OpenMetaverse.TestClient
return "Usage: downloadtexture [texture-uuid] [discardlevel]";
}
Client.Assets.RequestImage(TextureID, ImageType.Normal, 1000000.0f, discardLevel, 0);
Client.Assets.RequestImage(TextureID, ImageType.Normal, Assets_OnImageReceived);
if (DownloadHandle.WaitOne(120 * 1000, false))
{
if (Image != null && Image.Success)
if (resultState == TextureRequestState.Finished)
{
if (Asset != null && Asset.Decode())
{
try { File.WriteAllBytes(Image.ID.ToString() + ".jp2", Asset.AssetData); }
try { File.WriteAllBytes(Asset.AssetID + ".jp2", Asset.AssetData); }
catch (Exception ex) { Logger.Log(ex.Message, Helpers.LogLevel.Error, Client, ex); }
return String.Format("Saved {0}.jp2 ({1}x{2})", Image.ID, Asset.Image.Width, Asset.Image.Height);
return String.Format("Saved {0}.jp2 ({1}x{2})", Asset.AssetID, Asset.Image.Width, Asset.Image.Height);
}
else
{
return "Failed to decode texture " + TextureID.ToString();
}
}
else if (Image != null && Image.NotFound)
else if (resultState == TextureRequestState.NotFound)
{
return "Simulator reported texture not found: " + TextureID.ToString();
}
else
{
return "Download failed for texture " + TextureID.ToString();
return "Download failed for texture " + TextureID + " " + resultState;
}
}
else
@@ -81,18 +78,12 @@ namespace OpenMetaverse.TestClient
}
}
private void Assets_OnImageReceived(ImageDownload image, AssetTexture asset)
private void Assets_OnImageReceived(TextureRequestState state, AssetTexture asset)
{
Image = image;
resultState = state;
Asset = asset;
DownloadHandle.Set();
}
private void Assets_OnImageReceiveProgress(UUID image, int lastPacket, int recieved, int total)
{
if (image == TextureID)
Console.WriteLine(String.Format("Texture {0}: Received {1} / {2} (Packet: {3})", image, recieved, total, lastPacket));
}
}
}

View File

@@ -22,7 +22,6 @@ namespace OpenMetaverse.TestClient
{
testClient.Objects.OnObjectPropertiesFamily += new ObjectManager.ObjectPropertiesFamilyCallback(Objects_OnObjectPropertiesFamily);
testClient.Objects.OnObjectProperties += new ObjectManager.ObjectPropertiesCallback(Objects_OnObjectProperties);
testClient.Assets.OnImageReceived += new AssetManager.ImageReceivedCallback(Assets_OnImageReceived);
testClient.Avatars.OnPointAt += new AvatarManager.PointAtCallback(Avatars_OnPointAt);
Name = "export";
@@ -143,7 +142,10 @@ namespace OpenMetaverse.TestClient
}
// Download all of the textures in the export list
Client.Assets.RequestImages(textureRequests);
foreach (ImageRequest request in textureRequests)
{
Client.Assets.RequestImage(request.ImageID, request.Type, Assets_OnImageReceived);
}
return "XML exported, began downloading " + Textures.Count + " textures";
}
@@ -176,33 +178,34 @@ namespace OpenMetaverse.TestClient
return AllPropertiesReceived.WaitOne(2000 + msPerRequest * objects.Count, false);
}
private void Assets_OnImageReceived(ImageDownload image, AssetTexture asset)
private void Assets_OnImageReceived(TextureRequestState state, AssetTexture asset)
{
if (Textures.Contains(image.ID))
if (state == TextureRequestState.Finished && Textures.Contains(asset.AssetID))
{
lock (Textures)
Textures.Remove(image.ID);
Textures.Remove(asset.AssetID);
if (image.Success)
if (state == TextureRequestState.Finished)
{
try { File.WriteAllBytes(image.ID.ToString() + ".jp2", asset.AssetData); }
try { File.WriteAllBytes(asset.AssetID + ".jp2", asset.AssetData); }
catch (Exception ex) { Logger.Log(ex.Message, Helpers.LogLevel.Error, Client); }
if (asset.Decode())
{
try { File.WriteAllBytes(image.ID.ToString() + ".tga", asset.Image.ExportTGA()); }
try { File.WriteAllBytes(asset.AssetID + ".tga", asset.Image.ExportTGA()); }
catch (Exception ex) { Logger.Log(ex.Message, Helpers.LogLevel.Error, Client); }
}
else
{
Logger.Log("Failed to decode image " + image.ID.ToString(), Helpers.LogLevel.Error, Client);
Logger.Log("Failed to decode image " + asset.AssetID, Helpers.LogLevel.Error, Client);
}
Logger.Log("Finished downloading image " + image.ID.ToString(), Helpers.LogLevel.Info, Client);
Logger.Log("Finished downloading image " + asset.AssetID, Helpers.LogLevel.Info, Client);
}
else
{
Logger.Log("Failed to download image " + image.ID.ToString(), Helpers.LogLevel.Warning, Client);
Logger.Log("Failed to download image " + asset.AssetID + ":" + state, Helpers.LogLevel.Warning, Client);
}
}
}

View File

@@ -19,7 +19,6 @@ namespace OpenMetaverse.TestClient
testClient.Objects.OnNewPrim += new ObjectManager.NewPrimCallback(Objects_OnNewPrim);
testClient.Objects.OnNewAvatar += new ObjectManager.NewAvatarCallback(Objects_OnNewAvatar);
testClient.Assets.OnImageReceived += new AssetManager.ImageReceivedCallback(Assets_OnImageReceived);
}
public override string Execute(string[] args, UUID fromAgentID)
@@ -72,7 +71,7 @@ namespace OpenMetaverse.TestClient
break;
}
Client.Assets.RequestImage(face.TextureID, type);
Client.Assets.RequestImage(face.TextureID, type, Assets_OnImageReceived);
}
}
}
@@ -93,21 +92,21 @@ namespace OpenMetaverse.TestClient
if (!alreadyRequested.ContainsKey(face.TextureID))
{
alreadyRequested[face.TextureID] = face.TextureID;
Client.Assets.RequestImage(face.TextureID, ImageType.Normal);
Client.Assets.RequestImage(face.TextureID, ImageType.Normal, Assets_OnImageReceived);
}
}
}
}
}
private void Assets_OnImageReceived(ImageDownload image, AssetTexture asset)
private void Assets_OnImageReceived(TextureRequestState state, AssetTexture asset)
{
if (enabled && alreadyRequested.ContainsKey(image.ID))
if (state == TextureRequestState.Finished && enabled && alreadyRequested.ContainsKey(asset.AssetID))
{
if (image.Success)
Logger.DebugLog(String.Format("Finished downloading texture {0} ({1} bytes)", image.ID, image.Size));
if (state == TextureRequestState.Finished)
Logger.DebugLog(String.Format("Finished downloading texture {0} ({1} bytes)", asset.AssetID, asset.AssetData.Length));
else
Logger.Log("Failed to download texture " + image.ID.ToString(), Helpers.LogLevel.Warning);
Logger.Log("Failed to download texture " + asset.AssetID + ": " + state, Helpers.LogLevel.Warning);
}
}
}