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));
}
}
}