private void Assets_OnImageReceived(ImageDownload image, AssetTexture asset) { if (Textures.Contains(image.ID)) { lock (Textures) Textures.Remove(image.ID); if (image.Success) { try { File.WriteAllBytes(image.ID.ToString() + ".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()); } 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("Finished downloading image " + image.ID.ToString(), Helpers.LogLevel.Info, Client); } else { Logger.Log("Failed to download image " + image.ID.ToString(), Helpers.LogLevel.Warning, Client); } } }
private void Assets_OnImageReceived(TextureRequestState state, AssetTexture asset) { if (state == TextureRequestState.Finished && Textures.Contains(asset.AssetID)) { lock (Textures) Textures.Remove(asset.AssetID); if (state == TextureRequestState.Finished) { 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(asset.AssetID + ".tga", asset.Image.ExportTGA()); } catch (Exception ex) { Logger.Log(ex.Message, Helpers.LogLevel.Error, Client); } } else { Logger.Log("Failed to decode image " + asset.AssetID, Helpers.LogLevel.Error, Client); } Logger.Log("Finished downloading image " + asset.AssetID, Helpers.LogLevel.Info, Client); } else { Logger.Log("Failed to download image " + asset.AssetID + ":" + state, Helpers.LogLevel.Warning, Client); } } }
/// <summary> /// Adds an image to this baking texture and potentially processes it, or /// stores it for processing later /// </summary> /// <param name="index">The baking texture index of the image to be added</param> /// <param name="texture">JPEG2000 compressed image to be /// added to the baking texture</param> /// <param name="needsDecode">True if <code>Decode()</code> needs to be /// called for the texture, otherwise false</param> /// <returns>True if this texture is completely baked and JPEG2000 data /// is available, otherwise false</returns> public bool AddTexture(AppearanceManager.TextureIndex index, AssetTexture texture, bool needsDecode) { lock (_textures) { if (needsDecode) { try { texture.Decode(); } catch (Exception e) { Logger.Log(String.Format("AddTexture({0}, {1})", index, texture.AssetID), Helpers.LogLevel.Error, e); return(false); } } _textures.Add(index, texture); Logger.DebugLog(String.Format("Added texture {0} (ID: {1}) to bake {2}", index, texture.AssetID, _bakeType), _client); } if (_textures.Count >= _textureCount) { Bake(); return(true); } else { return(false); } }
public override string Execute(string[] args, UUID fromAgentID) { if (args.Length != 1 && args.Length != 2) { return("Usage: downloadtexture [texture-uuid] [discardlevel]"); } TextureID = UUID.Zero; DownloadHandle.Reset(); Asset = null; if (UUID.TryParse(args[0], out TextureID)) { 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, Assets_OnImageReceived); if (DownloadHandle.WaitOne(120 * 1000, false)) { if (resultState == TextureRequestState.Finished) { if (Asset != null && Asset.Decode()) { 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})", Asset.AssetID, Asset.Image.Width, Asset.Image.Height)); } else { return("Failed to decode texture " + TextureID.ToString()); } } else if (resultState == TextureRequestState.NotFound) { return("Simulator reported texture not found: " + TextureID.ToString()); } else { return("Download failed for texture " + TextureID + " " + resultState); } } else { return("Timed out waiting for texture download"); } } else { return("Usage: downloadtexture [texture-uuid]"); } }
public override string Execute(string[] args, UUID fromAgentID) { if (args.Length != 1 && args.Length != 2) return "Usage: downloadtexture [texture-uuid] [discardlevel]"; TextureID = UUID.Zero; DownloadHandle.Reset(); Asset = null; if (UUID.TryParse(args[0], out TextureID)) { 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, Assets_OnImageReceived); if (DownloadHandle.WaitOne(120 * 1000, false)) { if (resultState == TextureRequestState.Finished) { if (Asset != null && Asset.Decode()) { 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})", Asset.AssetID, Asset.Image.Width, Asset.Image.Height); } else { return "Failed to decode texture " + TextureID.ToString(); } } else if (resultState == TextureRequestState.NotFound) { return "Simulator reported texture not found: " + TextureID.ToString(); } else { return "Download failed for texture " + TextureID + " " + resultState; } } else { return "Timed out waiting for texture download"; } } else { return "Usage: downloadtexture [texture-uuid]"; } }
public override string Execute(string[] args, LLUUID fromAgentID) { if (args.Length != 1) { return("Usage: downloadtexture [texture-uuid]"); } TextureID = LLUUID.Zero; DownloadHandle.Reset(); Image = null; Asset = null; if (LLUUID.TryParse(args[0], out TextureID)) { Client.Assets.RequestImage(TextureID, ImageType.Normal); if (DownloadHandle.WaitOne(120 * 1000, false)) { if (Image != null && Image.Success) { if (Asset != null && Asset.Decode()) { try { File.WriteAllBytes(Image.ID.ToString() + ".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)); } else { return("Failed to decode texture " + TextureID.ToString()); } } else if (Image != null && Image.NotFound) { return("Simulator reported texture not found: " + TextureID.ToString()); } else { return("Download failed for texture " + TextureID.ToString()); } } else { return("Timed out waiting for texture download"); } } else { return("Usage: downloadtexture [texture-uuid]"); } }
/// <summary> /// Adds an image to this baking texture and potentially processes it, or /// stores it for processing later /// </summary> /// <param name="index">The baking texture index of the image to be added</param> /// <param name="jp2data">JPEG2000 compressed image to be added to the /// baking texture</param> /// <returns>True if this texture is completely baked and JPEG2000 data /// is available, otherwise false</returns> public bool AddTexture(AppearanceManager.TextureIndex index, AssetTexture texture) { lock (Textures) { texture.Decode(); Textures.Add(index, texture); Client.DebugLog("Adding texture " + index.ToString() + " to bake " + BakeType.ToString()); } if (Textures.Count == TextureCount) { Bake(); return(true); } else { return(false); } }
public static void DetectSteg(GridClient Client) { int count = 1; Console.WriteLine("Found: " + foundPrims.Count + " objects"); foreach (Primitive p in foundPrims) { Console.Write(count + ". Analyzing texture..."); UUID textureID = p.Textures.DefaultTexture.TextureID; DownloadHandle.Reset(); Client.Assets.RequestImage(textureID, ImageType.Normal, ImageReceived); if (DownloadHandle.WaitOne(1000, false)) { if (resultState == TextureRequestState.Finished) { if (asset != null && asset.Decode()) { string s = ""; var file = asset.AssetData; for (int i = 0; i < file.Length; i++) { s += String.Format("{0:X2}", file[i]); } if (s.IndexOf("504B0304") != -1) { Extraction.DownloadSteg(asset.AssetData, asset.AssetID, Client); } else { Console.WriteLine("Nothing found."); } } } } count++; } }
private void Assets_OnImageReceived(AssetTexture assetTexture) { try { byte[] jpegdata; ManagedImage imgManaged; Image image; SimAsset sa = SimAssetStore.FindOrCreateAsset(assetTexture.AssetID, assetTexture.AssetType); if (!OpenJPEG.DecodeToImage(assetTexture.AssetData, out imgManaged, out image)) { throw new Exception("decoding failure"); } jpegdata = assetTexture.AssetData; sa._TypeData = jpegdata; UUIDTypeObjectSetValue(assetTexture.AssetID, jpegdata); assetTexture.Decode(); } catch (Exception excp) { System.Console.WriteLine("Error decoding image: " + excp.Message); } }
/* * * private bool RequestObjectProperties(IList<SimObject> objects, int msPerRequest, Simulator sim) * { * // Create an array of the local IDs of all the prims we are requesting properties for * uint[] localids = new uint[objects.Count]; * * lock (PrimsWaiting) * { * PrimsWaiting.Clear(); * * for (int i = 0; i < objects.Count; ++i) * { * localids[i] = objects[i].LocalID; * PrimsWaiting.Add(objects[i].ID, objects[i].Prim); * } * } * * Client.Objects.SelectObjects(sim, localids); * * return AllPropertiesReceived.WaitOne(2000 + msPerRequest * objects.Count, false); * } */ private void Assets_OnImageReceived(TextureRequestState state, AssetTexture asset) { if (!IsExporting) { return; } lock (ToDownloadAssets) if (state == TextureRequestState.Finished) { AssetComplete(asset.AssetID); if (state == TextureRequestState.Finished) { string sfile = Path.GetFileName(SimAsset.CFileName(asset.AssetID, asset.AssetType)); try { lock (fileWriterLock) File.WriteAllBytes(assetDumpDir + sfile, asset.AssetData); } catch (Exception ex) { Logger.Log(ex.Message, Helpers.LogLevel.Error, Client); } return; if (asset.Decode()) { try { lock (fileWriterLock) File.WriteAllBytes(assetDumpDir + asset.AssetID + ".tga", asset.Image.ExportTGA()); } catch (Exception ex) { Logger.Log(ex.Message, Helpers.LogLevel.Error, Client); } } else { try { lock (fileWriterLock) File.WriteAllBytes(assetDumpDir + sfile, asset.AssetData); } catch (Exception ex) { Logger.Log(ex.Message, Helpers.LogLevel.Error, Client); } return; } Logger.Log("Finished downloading image " + asset.AssetID, Helpers.LogLevel.Info, Client); } else { Logger.Log("Failed to download image " + asset.AssetID + ":" + state, Helpers.LogLevel.Warning, Client); } } }
public void Assets_TextureDownloadCallback(TextureRequestState state, AssetTexture texture) { if (state == TextureRequestState.NotFound || state == TextureRequestState.Aborted || state == TextureRequestState.Timeout) { Console.WriteLine("Failed to download " + texture.AssetID + " - " + state.ToString() + "."); Hashtable hash = new Hashtable(); hash.Add("MessageType", "ImageDownloaded"); hash.Add("UUID", texture.AssetID); hash.Add("Success", false); hash.Add("Error", "Image could not be downloaded: " + state.ToString()); enqueue(hash); } else if (state == TextureRequestState.Finished) { bool success = true; string key = texture.AssetID.ToString(); try { texture.Decode(); byte[] img = texture.Image.ExportRaw(); int size = img.Length; int width = texture.Image.Width; int height = texture.Image.Height; texture.Image.Clear(); // Helpfully, it's upside-down, and has red and blue flipped. // Assuming 32 bits (accurate) and a height as a multiple of two (accurate), // this will vertically invert the image. int length = width * 4; byte[] fliptemp = new byte[length]; for (int i = 0; i < height / 2; ++i) { int index = i * width * 4; int endindex = size - ((i + 1) * width * 4); Array.Copy(img, index, fliptemp, 0, length); Array.Copy(img, endindex, img, index, length); Array.Copy(fliptemp, 0, img, endindex, length); } // This changes RGBA to BGRA. Or possibly vice-versa. I don't actually know. // The documentation is vague/nonexistent. for (int i = 0; i < size; i += 4) { byte temp = img[i + 2]; img[i + 2] = img[i]; img[i] = temp; } // Use System.Drawing.Bitmap to create a PNG. This requires us to feed it a pointer to an array // for whatever reason, so we temporarily pin the image array. GCHandle handle = GCHandle.Alloc(img, GCHandleType.Pinned); Bitmap bitmap = new Bitmap(texture.Image.Width, texture.Image.Height, texture.Image.Width * 4, System.Drawing.Imaging.PixelFormat.Format32bppArgb, handle.AddrOfPinnedObject()); bitmap.Save(AjaxLife.TEXTURE_CACHE + key + ".png", System.Drawing.Imaging.ImageFormat.Png); bitmap.Dispose(); handle.Free(); if (AjaxLife.USE_S3) { try { IThreeSharp service = new ThreeSharpQuery(AjaxLife.S3Config); Affirma.ThreeSharp.Model.ObjectAddRequest request = new Affirma.ThreeSharp.Model.ObjectAddRequest(AjaxLife.TEXTURE_BUCKET, key + ".png"); request.LoadStreamWithFile(AjaxLife.TEXTURE_CACHE + key + ".png"); request.Headers.Add("x-amz-acl", "public-read"); request.Headers.Add("Content-Type", "image/png"); service.ObjectAdd(request).DataStream.Close(); AjaxLife.CachedTextures.Add(texture.AssetID); File.Delete(AjaxLife.TEXTURE_CACHE + key + ".png"); } catch { success = false; } } } catch (Exception e) { success = false; AjaxLife.Debug("Events", "Texture download for " + key + " failed (" + e.GetType().Name + "): " + e.Message); } Hashtable hash = new Hashtable(); hash.Add("MessageType", "ImageDownloaded"); hash.Add("Success", success); hash.Add("UUID", key); hash.Add("URL", AjaxLife.TEXTURE_ROOT + key + ".png"); enqueue(hash); } }
/* private bool RequestObjectProperties(IList<SimObject> objects, int msPerRequest, Simulator sim) { // Create an array of the local IDs of all the prims we are requesting properties for uint[] localids = new uint[objects.Count]; lock (PrimsWaiting) { PrimsWaiting.Clear(); for (int i = 0; i < objects.Count; ++i) { localids[i] = objects[i].LocalID; PrimsWaiting.Add(objects[i].ID, objects[i].Prim); } } Client.Objects.SelectObjects(sim, localids); return AllPropertiesReceived.WaitOne(2000 + msPerRequest * objects.Count, false); } */ private void Assets_OnImageReceived(TextureRequestState state, AssetTexture asset) { if (!IsExporting) return; lock (ToDownloadAssets) if (state == TextureRequestState.Finished) { AssetComplete(asset.AssetID); if (state == TextureRequestState.Finished) { string sfile = Path.GetFileName(SimAsset.CFileName(asset.AssetID, asset.AssetType)); try { lock (fileWriterLock) File.WriteAllBytes(assetDumpDir + sfile, asset.AssetData); } catch (Exception ex) { Logger.Log(ex.Message, Helpers.LogLevel.Error, Client); } return; if (asset.Decode()) { try { lock (fileWriterLock) File.WriteAllBytes(assetDumpDir + asset.AssetID + ".tga", asset.Image.ExportTGA()); } catch (Exception ex) { Logger.Log(ex.Message, Helpers.LogLevel.Error, Client); } } else { try { lock (fileWriterLock) File.WriteAllBytes(assetDumpDir + sfile, asset.AssetData); } catch (Exception ex) { Logger.Log(ex.Message, Helpers.LogLevel.Error, Client); } return; } Logger.Log("Finished downloading image " + asset.AssetID, Helpers.LogLevel.Info, Client); } else { Logger.Log("Failed to download image " + asset.AssetID + ":" + state, Helpers.LogLevel.Warning, Client); } } }
/// <summary> /// Adds an image to this baking texture and potentially processes it, or /// stores it for processing later /// </summary> /// <param name="index">The baking texture index of the image to be added</param> /// <param name="texture">JPEG2000 compressed image to be added to the /// baking texture</param> /// <returns>True if this texture is completely baked and JPEG2000 data /// is available, otherwise false</returns> public bool AddTexture(AppearanceManager.TextureIndex index, AssetTexture texture) { lock (Textures) { try { texture.Decode(); Textures.Add(index, texture); Client.DebugLog("Adding texture " + index.ToString() + " ID: " + texture.AssetID.ToString() + " to bake " + BakeType.ToString()); } catch ( Exception e ) { Client.DebugLog( "caught exception while trying add texture: " + e.Message.ToString()); } } if (Textures.Count == TextureCount) { Bake(); return true; } else return false; }
private static bool LoadAsset(string assetPath, byte[] data, AssetLoadedCallback assetCallback) { // Right now we're nastily obtaining the UUID from the filename string filename = assetPath.Remove(0, ArchiveConstants.ASSETS_PATH.Length); int i = filename.LastIndexOf(ArchiveConstants.ASSET_EXTENSION_SEPARATOR); if (i == -1) { Logger.Log(String.Format( "[OarFile]: Could not find extension information in asset path {0} since it's missing the separator {1}. Skipping", assetPath, ArchiveConstants.ASSET_EXTENSION_SEPARATOR), Helpers.LogLevel.Warning); return false; } string extension = filename.Substring(i); UUID uuid; UUID.TryParse(filename.Remove(filename.Length - extension.Length), out uuid); if (ArchiveConstants.EXTENSION_TO_ASSET_TYPE.ContainsKey(extension)) { AssetType assetType = ArchiveConstants.EXTENSION_TO_ASSET_TYPE[extension]; Asset asset = null; switch (assetType) { case AssetType.Animation: asset = new AssetAnimation(uuid, data); break; case AssetType.Bodypart: asset = new AssetBodypart(uuid, data); break; case AssetType.Clothing: asset = new AssetClothing(uuid, data); break; case AssetType.LSLBytecode: asset = new AssetScriptBinary(uuid, data); break; case AssetType.LSLText: asset = new AssetScriptText(uuid, data); break; case AssetType.Notecard: asset = new AssetNotecard(uuid, data); break; case AssetType.Sound: asset = new AssetSound(uuid, data); break; case AssetType.Texture: asset = new AssetTexture(uuid, data); break; default: Logger.Log("[OarFile] Unhandled asset type " + assetType, Helpers.LogLevel.Error); break; } if (asset != null) { asset.Decode(); assetCallback(asset); return true; } } Logger.Log("[OarFile] Failed to load asset", Helpers.LogLevel.Warning); return false; }
/// <summary> /// Adds an image to this baking texture and potentially processes it, or /// stores it for processing later /// </summary> /// <param name="index">The baking texture index of the image to be added</param> /// <param name="texture">JPEG2000 compressed image to be /// added to the baking texture</param> /// <param name="needsDecode">True if <code>Decode()</code> needs to be /// called for the texture, otherwise false</param> /// <returns>True if this texture is completely baked and JPEG2000 data /// is available, otherwise false</returns> public bool AddTexture(AppearanceManager.TextureIndex index, AssetTexture texture, bool needsDecode) { lock (_textures) { if (needsDecode) { try { texture.Decode(); } catch (Exception e) { Logger.Log(String.Format("AddTexture({0}, {1})", index, texture.AssetID), Helpers.LogLevel.Error, e); return false; } } _textures.Add(index, texture); Logger.DebugLog(String.Format("Added texture {0} (ID: {1}) to bake {2}", index, texture.AssetID, _bakeType), _client); } if (_textures.Count >= _textureCount) { Bake(); return true; } else { return false; } }
/// <summary> /// Adds an image to this baking texture and potentially processes it, or /// stores it for processing later /// </summary> /// <param name="index">The baking texture index of the image to be added</param> /// <param name="jp2data">JPEG2000 compressed image to be added to the /// baking texture</param> /// <returns>True if this texture is completely baked and JPEG2000 data /// is available, otherwise false</returns> public bool AddTexture(AppearanceManager.TextureIndex index, AssetTexture texture) { lock (Textures) { texture.Decode(); Textures.Add(index, texture); Client.DebugLog("Adding texture " + index.ToString() + " to bake " + BakeType.ToString()); } if (Textures.Count == TextureCount) { Bake(); return true; } else return false; }
public void Assets_TextureDownloadCallback(TextureRequestState state, AssetTexture texture) { if(state == TextureRequestState.NotFound || state == TextureRequestState.Aborted || state == TextureRequestState.Timeout) { Console.WriteLine("Failed to download " + texture.AssetID + " - " + state.ToString() + "."); Hashtable hash = new Hashtable(); hash.Add("MessageType", "ImageDownloaded"); hash.Add("UUID", texture.AssetID); hash.Add("Success", false); hash.Add("Error", "Image could not be downloaded: " + state.ToString()); enqueue(hash); } else if(state == TextureRequestState.Finished) { bool success = true; string key = texture.AssetID.ToString(); try { texture.Decode(); byte[] img = texture.Image.ExportRaw(); int size = img.Length; int width = texture.Image.Width; int height = texture.Image.Height; texture.Image.Clear(); // Helpfully, it's upside-down, and has red and blue flipped. // Assuming 32 bits (accurate) and a height as a multiple of two (accurate), // this will vertically invert the image. int length = width * 4; byte[] fliptemp = new byte[length]; for(int i = 0; i < height / 2; ++i) { int index = i * width * 4; int endindex = size - ((i+1) * width * 4); Array.Copy(img, index, fliptemp, 0, length); Array.Copy(img, endindex, img, index, length); Array.Copy(fliptemp, 0, img, endindex, length); } // This changes RGBA to BGRA. Or possibly vice-versa. I don't actually know. // The documentation is vague/nonexistent. for(int i = 0; i < size; i += 4) { byte temp = img[i+2]; img[i+2] = img[i]; img[i] = temp; } // Use System.Drawing.Bitmap to create a PNG. This requires us to feed it a pointer to an array // for whatever reason, so we temporarily pin the image array. GCHandle handle = GCHandle.Alloc(img, GCHandleType.Pinned); Bitmap bitmap = new Bitmap(texture.Image.Width, texture.Image.Height, texture.Image.Width * 4, System.Drawing.Imaging.PixelFormat.Format32bppArgb, handle.AddrOfPinnedObject()); bitmap.Save(AjaxLife.TEXTURE_CACHE + key + ".png", System.Drawing.Imaging.ImageFormat.Png); bitmap.Dispose(); handle.Free(); if(AjaxLife.USE_S3) { try { IThreeSharp service = new ThreeSharpQuery(AjaxLife.S3Config); Affirma.ThreeSharp.Model.ObjectAddRequest request = new Affirma.ThreeSharp.Model.ObjectAddRequest(AjaxLife.TEXTURE_BUCKET, key + ".png"); request.LoadStreamWithFile(AjaxLife.TEXTURE_CACHE + key + ".png"); request.Headers.Add("x-amz-acl", "public-read"); request.Headers.Add("Content-Type", "image/png"); service.ObjectAdd(request).DataStream.Close(); AjaxLife.CachedTextures.Add(texture.AssetID); File.Delete(AjaxLife.TEXTURE_CACHE + key + ".png"); } catch { success = false; } } } catch(Exception e) { success = false; AjaxLife.Debug("Events", "Texture download for "+key+" failed (" + e.GetType().Name + "): " + e.Message); } Hashtable hash = new Hashtable(); hash.Add("MessageType", "ImageDownloaded"); hash.Add("Success", success); hash.Add("UUID", key); hash.Add("URL", AjaxLife.TEXTURE_ROOT + key + ".png"); enqueue(hash); } }