private Texture GetTilesChunkTexture(DevicePanel d, int x, int y) { if (this.TileChunksTextures[y][x] != null) { return(this.TileChunksTextures[y][x]); } Rectangle rect = GetTilesChunkArea(x, y); using (Bitmap bmp = new Bitmap(rect.Width * TILE_SIZE, rect.Height * TILE_SIZE, System.Drawing.Imaging.PixelFormat.Format32bppArgb)) { using (Graphics g = Graphics.FromImage(bmp)) { for (int ty = rect.Y; ty < rect.Y + rect.Height; ++ty) { for (int tx = rect.X; tx < rect.X + rect.Width; ++tx) { if (this.Layer.Tiles[ty][tx] != 0xffff) { DrawTile(g, Layer.Tiles[ty][tx], tx - rect.X, ty - rect.Y); } } } } this.TileChunksTextures[y][x] = TextureCreator.FromBitmap(d._device, bmp); } return(this.TileChunksTextures[y][x]); }
public void LoadNextAnimation() { if (AnimsToLoad.Count == 0) { return; } var val = AnimsToLoad[0]; if (val.anim == null) { string key = $"{val.name}-{val.AnimId}-{val.frameId}-{val.fliph}-{val.flipv}-{val.rotate}"; if (!Animations.ContainsKey(key)) { if (!Working) { try { LoadAnimation(val.name, val.d, val.AnimId, val.frameId, val.fliph, val.flipv, val.rotate, false); } catch (Exception) { // lots of changes introduced by Plus, just hide errors for now (evil I know!) //Console.WriteLine($"Pop loading next animiation. {val.name}, {val.AnimId}, {val.frameId}, {val.fliph}, {val.flipv}, {val.rotate}", e); } } } else { val.anim = Animations[key]; } } if (val.anim == null) { return; } if (val.anim.Ready) { AnimsToLoad.RemoveAt(0); } else { if (val.anim.Frames.Count == 0) { val.anim.Ready = true; AnimsToLoad.RemoveAt(0); return; } val.anim.Frames[val.anim.loadedFrames].Texture = TextureCreator.FromBitmap(val.d._device, val.anim.Frames[val.anim.loadedFrames]._Bitmap); val.anim.Frames[val.anim.loadedFrames]._Bitmap.Dispose(); ++val.anim.loadedFrames; if (val.anim.loadedFrames == val.anim.Frames.Count) { val.anim.Ready = true; } } }
public void InitDeviceResources() { sprite = new Sprite(_device); sprite2 = new Sprite(_device); tx = TextureCreator.FromBitmap(_device, txb); tcircle = TextureCreator.FromBitmap(_device, tcircleb); tecircle = TextureCreator.FromBitmap(_device, tecircleb); hcursor = TextureCreator.FromBitmap(_device, hcursorb); vcursor = TextureCreator.FromBitmap(_device, vcursorb); hvcursor = TextureCreator.FromBitmap(_device, hvcursorb); FontDescription fontDescription = new FontDescription() { Height = 18, Italic = false, CharacterSet = FontCharacterSet.Ansi, FaceName = "Microsoft Sans Serif", MipLevels = 0, OutputPrecision = FontPrecision.TrueType, PitchAndFamily = FontPitchAndFamily.Default, Quality = FontQuality.Antialiased, Weight = FontWeight.Regular }; FontDescription fontDescriptionBold = new FontDescription() { Height = 18, Italic = false, CharacterSet = FontCharacterSet.Ansi, FaceName = "Microsoft Sans Serif", MipLevels = 0, OutputPrecision = FontPrecision.TrueType, PitchAndFamily = FontPitchAndFamily.Default, Quality = FontQuality.Antialiased, Weight = FontWeight.Bold }; font = new Font(_device, fontDescription); fontBold = new Font(_device, fontDescriptionBold); }
/// <summary> /// Loads / Gets the Sprite Animation /// NOTE: /// </summary> /// <param name="name">The Name of the object</param> /// <param name="d">The DevicePanel</param> /// <param name="AnimId">The Animation ID (-1 to Load Normal)</param> /// <param name="frameId">The Frame ID for the specified Animation (-1 to load all frames)</param> /// <param name="fliph">Flip the Texture Horizontally</param> /// <param name="flipv">Flip the Texture Vertically</param> /// <returns>The fully loaded Animation</returns> public EditorAnimation LoadAnimation(string name, DevicePanel d, int AnimId, int frameId, bool fliph, bool flipv, bool rotate, bool loadImageToDX = true) { string key = $"{name}-{AnimId}-{frameId}-{fliph}-{flipv}-{rotate}"; var anim = new EditorAnimation(); if (Animations.ContainsKey(key)) { if (Animations[key].Ready) { // Use the already loaded Amination return(Animations[key]); } else { return(null); } } Animations.Add(key, anim); string path, path2; if (name == "EditorAssets" || name == "SuperSpecialRing" || name == "EditorIcons2" || name == "TransportTubes") { if (name == "EditorAssets") { path2 = Path.Combine(Environment.CurrentDirectory, "EditorAssets.bin"); if (!File.Exists(path2)) { return(null); } } else if (name == "EditorIcons2") { path2 = Path.Combine(Environment.CurrentDirectory, "EditorIcons2.bin"); if (!File.Exists(path2)) { return(null); } } else if (name == "TransportTubes") { path2 = Path.Combine(Environment.CurrentDirectory, "Global\\", "TransportTubes.bin"); if (!File.Exists(path2)) { return(null); } } else { path2 = Path.Combine(Environment.CurrentDirectory, "Global\\", "SuperSpecialRing.bin"); Debug.Print(path2); if (!File.Exists(path2)) { return(null); } } } else { if (DataDirectoryList == null) { DataDirectoryList = Directory.GetFiles(Path.Combine(Editor.DataDirectory, "Sprites"), $"*.bin", SearchOption.AllDirectories); } // Checks Global frist path = Editor.Instance.SelectedZone + "\\" + name + ".bin"; path2 = Path.Combine(Editor.DataDirectory, "sprites") + '\\' + path; if (!File.Exists(path2)) { // Checks without last character path = path = Editor.Instance.SelectedZone.Substring(0, Editor.Instance.SelectedZone.Length - 1) + "\\" + name + ".bin"; path2 = Path.Combine(Editor.DataDirectory, "sprites") + '\\' + path; } /*if (!File.Exists(path2)) * { * // Checks Editor Global * path2 = Environment.CurrentDirectory + "\\Global\\" + name + ".bin"; * }*/ if (!File.Exists(path2)) { // Checks Global path = "Global\\" + name + ".bin"; path2 = Path.Combine(Editor.DataDirectory, "sprites") + '\\' + path; } if (!File.Exists(path2)) { // Checks the Stage folder foreach (string dir in Directory.GetDirectories(Path.Combine(Editor.DataDirectory, "Sprites"), $"*", SearchOption.TopDirectoryOnly)) { path = Path.GetFileName(dir) + "\\" + name + ".bin"; path2 = Path.Combine(Editor.DataDirectory, "sprites") + '\\' + path; if (File.Exists(path2)) { break; } } } if (!File.Exists(path2)) { // Seaches all around the Data directory var list = DataDirectoryList; if (list.Any(t => Path.GetFileName(t.ToLower()).Contains(name.ToLower()))) { list = list.Where(t => Path.GetFileName(t.ToLower()).Contains(name.ToLower())).ToArray(); if (list.Any(t => t.ToLower().Contains(Editor.Instance.SelectedZone))) { path2 = list.Where(t => t.ToLower().Contains(Editor.Instance.SelectedZone)).First(); } else { path2 = list.First(); } } } if (!File.Exists(path2)) { // No animation found return(null); } } using (var stream = File.OpenRead(path2)) { rsdkAnim = new Animation(); rsdkAnim.Load(new BinaryReader(stream)); } if (AnimId == -1) { if (rsdkAnim.Animations.Any(t => t.AnimName.Contains("Normal"))) { AnimId = rsdkAnim.Animations.FindIndex(t => t.AnimName.Contains("Normal")); } else { AnimId = 0; } // Use Vertical Amination if one exists if (rotate && rsdkAnim.Animations.Any(t => t.AnimName.EndsWith(" V"))) { AnimId = rsdkAnim.Animations.FindIndex(t => t.AnimName.EndsWith(" V")); } } if (AnimId >= rsdkAnim.Animations.Count) { AnimId = rsdkAnim.Animations.Count - 1; } for (int i = 0; i < rsdkAnim.Animations[AnimId].Frames.Count; ++i) { // check we don't stray outside our loaded animations/frames // if user enters a value that would take us there, just show // a valid frame instead var animiation = rsdkAnim.Animations[AnimId]; var frame = animiation.Frames[i]; if (frameId >= 0 && frameId < animiation.Frames.Count) { frame = animiation.Frames[frameId]; } Bitmap map; if (!Sheets.ContainsKey(rsdkAnim.SpriteSheets[frame.SpriteSheet])) { string targetFile; if (name == "EditorAssets" || name == "SuperSpecialRing" || name == "EditorIcons2" || name == "TransportTubes") { if (name == "EditorAssets") { targetFile = Path.Combine(Environment.CurrentDirectory, "EditorAssets.gif"); } else if (name == "EditorIcons2") { targetFile = Path.Combine(Environment.CurrentDirectory, "EditorIcons2.gif"); } else if (name == "TransportTubes") { targetFile = Path.Combine(Environment.CurrentDirectory, "Global\\", "TransportTubes.gif"); } else { targetFile = Path.Combine(Environment.CurrentDirectory, "Global\\", "SuperSpecialRing.gif"); } } else { targetFile = Path.Combine(Editor.DataDirectory, "sprites", rsdkAnim.SpriteSheets[frame.SpriteSheet].Replace('/', '\\')); } if (!File.Exists(targetFile)) { map = null; // add a Null to our lookup, so we can avoid looking again in the future Sheets.Add(rsdkAnim.SpriteSheets[frame.SpriteSheet], map); } else { map = new Bitmap(targetFile); Sheets.Add(rsdkAnim.SpriteSheets[frame.SpriteSheet], map); } } else { map = Sheets[rsdkAnim.SpriteSheets[frame.SpriteSheet]]; } if (frame.Width == 0 || frame.Height == 0) { continue; } // can't load the animation, it probably doesn't exist in the User's Sprites folder if (map == null) { return(null); } // We are storing the first colour from the palette so we can use it to make sprites transparent var colour = map.Palette.Entries[0]; // Slow map = CropImage(map, new Rectangle(frame.X, frame.Y, frame.Width, frame.Height), fliph, flipv); RemoveColourImage(map, colour, frame.Width, frame.Height); Texture texture = null; if (loadImageToDX) { texture = TextureCreator.FromBitmap(d._device, map); } var editorFrame = new EditorAnimation.EditorFrame() { Texture = texture, Frame = frame, Entry = rsdkAnim.Animations[AnimId] }; if (!loadImageToDX) { editorFrame._Bitmap = map; } anim.Frames.Add(editorFrame); if (frameId != -1) { break; } } anim.ImageLoaded = true; if (loadImageToDX) { anim.Ready = true; } Working = false; return(anim); }