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:
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user