From 2582304f4e48ac9e113a418e9aec6801a2c6225d Mon Sep 17 00:00:00 2001 From: John Hurliman Date: Mon, 29 Sep 2008 13:58:08 +0000 Subject: [PATCH] * OnImageReceiveProgress now returns the packet number it just received * Texture re-request timer will now reduce the DiscardLevel by one each re-request. This is temporary while we re-think the callback system for texture downloads * TestClient downloadtexture now takes an optional DiscardLevel * Added int support to Utils.Clamp() git-svn-id: http://libopenmetaverse.googlecode.com/svn/trunk@2246 52acb1d6-8a22-11de-b505-999d5b087335 --- OpenMetaverse/AssetManager.cs | 11 +++++++---- OpenMetaverse/Types/Utils.cs | 19 +++++++++++++++++++ Programs/PrimWorkshop/TexturePipeline.cs | 2 +- .../Commands/Prims/DownloadTextureCommand.cs | 19 ++++++++++++++----- 4 files changed, 41 insertions(+), 10 deletions(-) diff --git a/OpenMetaverse/AssetManager.cs b/OpenMetaverse/AssetManager.cs index c554a7c6..da61d42d 100644 --- a/OpenMetaverse/AssetManager.cs +++ b/OpenMetaverse/AssetManager.cs @@ -374,7 +374,7 @@ namespace OpenMetaverse /// /// /// - public delegate void ImageReceiveProgressCallback(UUID image, int recieved, int total); + public delegate void ImageReceiveProgressCallback(UUID image, int lastPacket, int recieved, int total); /// /// /// @@ -491,6 +491,7 @@ namespace OpenMetaverse if (download.TimeSinceLastPacket > 5000) { + --download.DiscardLevel; download.TimeSinceLastPacket = 0; RequestImage(download.ID, download.ImageType, download.Priority, download.DiscardLevel, packet); } @@ -1346,6 +1347,8 @@ namespace OpenMetaverse ImageDataPacket data = (ImageDataPacket)packet; ImageDownload transfer = null; + Logger.DebugLog(String.Format("ImageData: Size={0}, Packets={1}", data.ImageID.Size, data.ImageID.Packets)); + lock (Transfers) { if (Transfers.ContainsKey(data.ImageID.ID)) @@ -1361,7 +1364,7 @@ namespace OpenMetaverse if (OnImageReceiveProgress != null) { - try { OnImageReceiveProgress(data.ImageID.ID, data.ImageData.Data.Length, transfer.Size); } + try { OnImageReceiveProgress(data.ImageID.ID, 0, data.ImageData.Data.Length, transfer.Size); } catch (Exception e) { Logger.Log(e.Message, Helpers.LogLevel.Error, Client, e); } } @@ -1437,7 +1440,7 @@ namespace OpenMetaverse if (!transfer.PacketsSeen.ContainsKey(image.ImageID.Packet)) { transfer.PacketsSeen[image.ImageID.Packet] = image.ImageID.Packet; - Array.Copy(image.ImageData.Data, 0, transfer.AssetData, + Buffer.BlockCopy(image.ImageData.Data, 0, transfer.AssetData, transfer.InitialDataSize + (1000 * (image.ImageID.Packet - 1)), image.ImageData.Data.Length); transfer.Transferred += image.ImageData.Data.Length; @@ -1451,7 +1454,7 @@ namespace OpenMetaverse if (OnImageReceiveProgress != null) { - try { OnImageReceiveProgress(image.ImageID.ID, transfer.Transferred, transfer.Size); } + try { OnImageReceiveProgress(image.ImageID.ID, image.ImageID.Packet, transfer.Transferred, transfer.Size); } catch (Exception e) { Logger.Log(e.Message, Helpers.LogLevel.Error, Client, e); } } diff --git a/OpenMetaverse/Types/Utils.cs b/OpenMetaverse/Types/Utils.cs index 71c1cf3e..58e63700 100644 --- a/OpenMetaverse/Types/Utils.cs +++ b/OpenMetaverse/Types/Utils.cs @@ -125,6 +125,25 @@ namespace OpenMetaverse return value; } + /// + /// Clamp a given value between a range + /// + /// Value to clamp + /// Minimum allowable value + /// Maximum allowable value + /// A value inclusively between lower and upper + public static int Clamp(int value, int min, int max) + { + // First we check to see if we're greater than the max + value = (value > max) ? max : value; + + // Then we check to see if we're less than the min. + value = (value < min) ? min : value; + + // There's no check to see if min > max. + return value; + } + /// /// Round a floating-point value to the nearest integer /// diff --git a/Programs/PrimWorkshop/TexturePipeline.cs b/Programs/PrimWorkshop/TexturePipeline.cs index d80c9cc8..35f6269c 100644 --- a/Programs/PrimWorkshop/TexturePipeline.cs +++ b/Programs/PrimWorkshop/TexturePipeline.cs @@ -332,7 +332,7 @@ namespace PrimWorkshop } } - private void Assets_OnImageReceiveProgress(UUID image, int recieved, int total) + private void Assets_OnImageReceiveProgress(UUID image, int lastPacket, int recieved, int total) { if (OnDownloadProgress != null) { diff --git a/Programs/examples/TestClient/Commands/Prims/DownloadTextureCommand.cs b/Programs/examples/TestClient/Commands/Prims/DownloadTextureCommand.cs index b28d80a8..8ce58db9 100644 --- a/Programs/examples/TestClient/Commands/Prims/DownloadTextureCommand.cs +++ b/Programs/examples/TestClient/Commands/Prims/DownloadTextureCommand.cs @@ -25,8 +25,8 @@ namespace OpenMetaverse.TestClient public override string Execute(string[] args, UUID fromAgentID) { - if (args.Length != 1) - return "Usage: downloadtexture [texture-uuid]"; + if (args.Length != 1 && args.Length != 2) + return "Usage: downloadtexture [texture-uuid] [discardlevel]"; TextureID = UUID.Zero; DownloadHandle.Reset(); @@ -35,7 +35,16 @@ namespace OpenMetaverse.TestClient if (UUID.TryParse(args[0], out TextureID)) { - Client.Assets.RequestImage(TextureID, ImageType.Normal); + int discardLevel = 0; + + if (args.Length > 1) + { + if (!Int32.TryParse(args[1], out discardLevel)) + return "Usage: downloadtexture [texture-uuid] [discardlevel]"; + } + + Client.Assets.RequestImage(TextureID, ImageType.Normal, 1000000.0f, discardLevel, 0); + if (DownloadHandle.WaitOne(120 * 1000, false)) { if (Image != null && Image.Success) @@ -80,10 +89,10 @@ namespace OpenMetaverse.TestClient DownloadHandle.Set(); } - private void Assets_OnImageReceiveProgress(UUID image, int recieved, int total) + private void Assets_OnImageReceiveProgress(UUID image, int lastPacket, int recieved, int total) { if (image == TextureID) - Console.WriteLine(String.Format("Texture {0}: Received {1} / {2}", image, recieved, total)); + Console.WriteLine(String.Format("Texture {0}: Received {1} / {2} (Packet: {3})", image, recieved, total, lastPacket)); } } }