diff --git a/Programs/Simian/Extensions/AssetManager.cs b/Programs/Simian/Extensions/AssetManager.cs index 1315fa8b..4800be03 100644 --- a/Programs/Simian/Extensions/AssetManager.cs +++ b/Programs/Simian/Extensions/AssetManager.cs @@ -7,9 +7,10 @@ using OpenMetaverse.Packets; namespace Simian.Extensions { - public class AssetManager : ISimianExtension + public class AssetManager : ISimianExtension, IAssetProvider { Simian Server; + public Dictionary AssetStore = new Dictionary(); Dictionary CurrentUploads = new Dictionary(); public AssetManager(Simian server) @@ -31,6 +32,39 @@ namespace Simian.Extensions { } + public void StoreAsset(Asset asset) + { + if (asset.Decode()) + { + lock (AssetStore) + AssetStore[asset.AssetID] = asset; + } + else + { + Logger.Log(String.Format("Failed to decode {0} asset {1}", asset.AssetType, asset.AssetID), + Helpers.LogLevel.Warning); + } + } + + public void StoreTexture(AssetTexture texture) + { + if (texture.DecodeLayerBoundaries()) + { + lock (AssetStore) + AssetStore[texture.AssetID] = texture; + } + else + { + Logger.Log(String.Format("Failed to decoded layer boundaries on texture {0}", texture.AssetID), + Helpers.LogLevel.Warning); + } + } + + public bool TryGetAsset(UUID id, out Asset asset) + { + return AssetStore.TryGetValue(id, out asset); + } + #region Xfer System void AssetUploadRequestHandler(Packet packet, Agent agent) @@ -51,8 +85,7 @@ namespace Simian.Extensions Logger.DebugLog(String.Format("Storing uploaded asset {0} ({1})", assetID, asset.AssetType)); // Store the asset - lock (Server.AssetStore) - Server.AssetStore[assetID] = asset; + StoreAsset(asset); // Send a success response AssetUploadCompletePacket complete = new AssetUploadCompletePacket(); @@ -135,8 +168,7 @@ namespace Simian.Extensions lock (CurrentUploads) CurrentUploads.Remove(xfer.XferID.ID); - lock (Server.AssetStore) - Server.AssetStore[asset.AssetID] = asset; + StoreAsset(asset); AssetUploadCompletePacket complete = new AssetUploadCompletePacket(); complete.AssetBlock.Success = true; @@ -207,7 +239,7 @@ namespace Simian.Extensions // Check if we have this asset Asset asset; - if (Server.AssetStore.TryGetValue(assetID, out asset)) + if (AssetStore.TryGetValue(assetID, out asset)) { if (asset.AssetType == type) { @@ -358,25 +390,22 @@ namespace Simian.Extensions for (int i = 0; i < textures.Length; i++) { UUID assetID = ParseUUIDFromFilename(textures[i]); - AssetTexture item = new AssetTexture(assetID, File.ReadAllBytes(textures[i])); - Server.AssetStore[assetID] = item; + StoreTexture(new AssetTexture(assetID, File.ReadAllBytes(textures[i]))); } for (int i = 0; i < clothing.Length; i++) { UUID assetID = ParseUUIDFromFilename(clothing[i]); - AssetClothing item = new AssetClothing(assetID, File.ReadAllBytes(clothing[i])); - item.Decode(); - Server.AssetStore[assetID] = item; + StoreAsset(new AssetClothing(assetID, File.ReadAllBytes(clothing[i]))); } for (int i = 0; i < bodyparts.Length; i++) { UUID assetID = ParseUUIDFromFilename(bodyparts[i]); - AssetBodypart item = new AssetBodypart(assetID, File.ReadAllBytes(bodyparts[i])); - item.Decode(); - Server.AssetStore[assetID] = item; + StoreAsset(new AssetBodypart(assetID, File.ReadAllBytes(bodyparts[i]))); } + + Logger.DebugLog(String.Format("Loaded {0} assets", AssetStore.Count)); } static UUID ParseUUIDFromFilename(string filename) diff --git a/Programs/Simian/Extensions/ImageDelivery.cs b/Programs/Simian/Extensions/ImageDelivery.cs index 0cd5b364..14a1f2eb 100644 --- a/Programs/Simian/Extensions/ImageDelivery.cs +++ b/Programs/Simian/Extensions/ImageDelivery.cs @@ -10,8 +10,8 @@ namespace Simian.Extensions public class ImageDelivery : ISimianExtension { Simian Server; - byte[] DefaultJP2; - byte[] DefaultBakedJP2; + AssetTexture defaultJP2; + AssetTexture defaultBakedJP2; public ImageDelivery(Simian server) { @@ -22,6 +22,7 @@ namespace Simian.Extensions { Server.UDP.RegisterPacketCallback(PacketType.RequestImage, new PacketCallback(RequestImageHandler)); + // Create default textures for missing images and missing bakes Bitmap defaultImage = new Bitmap(32, 32); Graphics gfx = Graphics.FromImage(defaultImage); gfx.Clear(Color.White); @@ -36,8 +37,8 @@ namespace Simian.Extensions defaultBaked.Alpha = defaultBaked.Red; defaultBaked.Bump = defaultBaked.Red; - DefaultJP2 = OpenJPEG.Encode(defaultManaged, true); - DefaultBakedJP2 = OpenJPEG.Encode(defaultBaked, true); + defaultJP2 = new AssetTexture(UUID.Zero, OpenJPEG.Encode(defaultManaged, true)); + defaultBakedJP2 = new AssetTexture(UUID.Zero, OpenJPEG.Encode(defaultBaked, true)); } public void Stop() @@ -60,12 +61,12 @@ namespace Simian.Extensions if (bake) { Logger.DebugLog(String.Format("Sending default bake texture for {0}", block.Image)); - imageData.ImageData.Data = DefaultBakedJP2; + imageData.ImageData.Data = defaultBakedJP2.AssetData; } else { Logger.DebugLog(String.Format("Sending default texture for {0}", block.Image)); - imageData.ImageData.Data = DefaultJP2; + imageData.ImageData.Data = defaultJP2.AssetData; } imageData.ImageID.Size = (uint)imageData.ImageData.Data.Length; diff --git a/Programs/Simian/Interfaces/IAssetProvider.cs b/Programs/Simian/Interfaces/IAssetProvider.cs new file mode 100644 index 00000000..499bc8d8 --- /dev/null +++ b/Programs/Simian/Interfaces/IAssetProvider.cs @@ -0,0 +1,12 @@ +using System; +using OpenMetaverse; + +namespace Simian +{ + public interface IAssetProvider + { + void StoreAsset(Asset asset); + void StoreTexture(AssetTexture texture); + bool TryGetAsset(UUID id, out Asset asset); + } +} diff --git a/Programs/Simian/Simian.cs b/Programs/Simian/Simian.cs index 3dcd758a..c64856b8 100644 --- a/Programs/Simian/Simian.cs +++ b/Programs/Simian/Simian.cs @@ -20,11 +20,11 @@ namespace Simian public HttpServer HttpServer; public ulong RegionHandle; public float WaterHeight = 35.0f; - public Dictionary AssetStore = new Dictionary(); // Interfaces public IUDPProvider UDP; public ISceneProvider Scene; + public IAssetProvider Assets; public IAvatarProvider Avatars; public IInventoryProvider Inventory; public IMeshingProvider Mesher; @@ -122,6 +122,8 @@ namespace Simian UDP = (IUDPProvider)extension; else if (extension is ISceneProvider) Scene = (ISceneProvider)extension; + else if (extension is IAssetProvider) + Assets = (IAssetProvider)extension; else if (extension is IAvatarProvider) Avatars = (IAvatarProvider)extension; else if (extension is IInventoryProvider) @@ -133,32 +135,21 @@ namespace Simian bool CheckInterfaces() { if (UDP == null) - { Logger.Log("No IUDPProvider interface loaded", Helpers.LogLevel.Error); - return false; - } else if (Scene == null) - { Logger.Log("No ISceneProvider interface loaded", Helpers.LogLevel.Error); - return false; - } + else if (Assets == null) + Logger.Log("No IAssetProvider interface loaded", Helpers.LogLevel.Error); else if (Avatars == null) - { Logger.Log("No IAvatarProvider interface loaded", Helpers.LogLevel.Error); - return false; - } - if (Inventory == null) - { + else if (Inventory == null) Logger.Log("No IInventoryProvider interface loaded", Helpers.LogLevel.Error); - return false; - } - if (Mesher == null) - { + else if (Mesher == null) Logger.Log("No IMeshingProvider interface loaded", Helpers.LogLevel.Error); - return false; - } + else + return true; - return true; + return false; } void InitHttpServer(int port, bool ssl)