public System.Drawing.Bitmap GetImage(string name) { if (LoadedImages.ContainsKey(name)) { return(LoadedImages[name].image); } else { return(null); } }
unsafe void CompositionTarget_Rendering(object sender, EventArgs e) { RenderingEventArgs args = (RenderingEventArgs)e; // It's possible for Rendering to call back twice in the same frame // so only render when we haven't already rendered in this frame. if (_lastRender != args.RenderingTime) { if (!LoadedImages.ContainsKey("roaam_path")) { LoadDefaults(); } foreach (Article art in articles) { string spriteName = art.Sprite; // Check if the sprite is loaded if (!LoadedImages.ContainsKey(spriteName)) { // If spritename is set, attempt to load sprite bool hasSprite = false; if (!string.IsNullOrEmpty(spriteName)) { hasSprite = WindowAPI.LoadImage(spriteName, renderer, out TexData data); LoadedImages.Add(spriteName, data); } // If no sprite is found, use EmptyImage for this article if (!hasSprite) { BitmapImage overrideSpr = FindResource("EmptyImage") as BitmapImage; WindowAPI.RegisterTexture(renderer, spriteName, AppDomain.CurrentDomain.BaseDirectory + overrideSpr.UriSource.LocalPath, 1, out int texture); LoadedImages[spriteName] = new TexData(false, texture, null); } } // Get texture data for this article TexData sprite = LoadedImages[spriteName]; Point offset = art.RealPoint - new Vector(sprite.offset.X, sprite.offset.Y); Point scale = new Point(1, 1); System.Drawing.Color color = System.Drawing.Color.White; switch (art.ArticleNum) { case ArticleType.Terrain: scale = new Point(2, 2); break; case ArticleType.Zone: if (art is Zone zone) { scale = new Point(zone.TriggerWidth, zone.TriggerHeight); // Set the color based on event type switch (zone.EventID) { //blastzone case 4: color = System.Drawing.Color.Red; break; } // Make semi-transparent color = System.Drawing.Color.FromArgb(64, color.R, color.G, color.B); // Show transform handles if (SelectedObj == art) { // Push a box at each corner of the zone for scale handles TexData spr = LoadedImages["roaam_square"]; foreach (Point point in ROAAM_CONST.ZONE_POINTS) { PushArticle(new DX_Article( spr.texture, zone.RealPoint + new Vector(point.X * zone.TriggerWidth, point.Y * zone.TriggerHeight) - (Vector)spr.offset / zoomLevel, new Point(1 / zoomLevel, 1 / zoomLevel), -15)); } } } break; case ArticleType.Target: if (SelectedObj == art && (art as Target).Path.Any()) { Vector prev = (Vector)(art as Target).Path.Last(); for (int i = 0; i < (art as Target).Path.Count; i++) { Vector point = (Vector)(art as Target).Path[i]; TexData targSpr = LoadedImages["roaam_path"]; // Push path point sprite to renderer PushArticle(new DX_Article( targSpr.texture, (Point)((point * ROAAM_CONST.GRID_SIZE) - (Vector)targSpr.offset), new Point(1, 1), -10)); // Push semi-transparent target sprite to renderer PushArticle(new DX_Article( sprite.texture, (Point)((point * ROAAM_CONST.GRID_SIZE) - (Vector)sprite.offset), scale, art.Depth, unchecked ((int)0x40FFFFFF))); // Push transform handles if this path point is selected if (SelectedPath == i) { TexData arrowSpr = LoadedImages["roaam_arrows"]; PushArticle(new DX_Article( arrowSpr.texture, (Point)((point * ROAAM_CONST.GRID_SIZE) - ((Vector)arrowSpr.offset / zoomLevel)), new Point(1 / zoomLevel, 1 / zoomLevel), -15)); } // Push path line to renderer, and highlight orange if selected in editor panel IntPtr pathColor = WhiteBrush; float width = 2; if (i == ObjViewer.Instance.HighlightedPath) { pathColor = OrangeBrush; width = 4; } PushLine(new DX_Line((Point)(prev * ROAAM_CONST.GRID_SIZE), (Point)(point * ROAAM_CONST.GRID_SIZE), width, art.Depth - 0.1f, pathColor)); // Store this point for line drawing prev = point; } } break; case ArticleType.Tilemap: if (art is Tilemap tilemap) { Tileset tileset = tilemap.Tileset; if (tileset == null || string.IsNullOrEmpty(tileset.SpritePath)) { continue; } // Check if the sprite is loaded if (!LoadedImages.ContainsKey(tileset.SpritePath)) { // If spritename is set, attempt to load sprite bool hasSprite = false; if (!string.IsNullOrEmpty(tileset.SpritePath)) { hasSprite = WindowAPI.LoadImage(tileset.SpritePath, renderer, out TexData data); LoadedImages.Add(tileset.SpritePath, data); } // If no sprite is found, use EmptyImage for this article if (!hasSprite) { BitmapImage overrideSpr = FindResource("EmptyImage") as BitmapImage; WindowAPI.RegisterTexture(renderer, tileset.SpritePath, AppDomain.CurrentDomain.BaseDirectory + overrideSpr.UriSource.LocalPath, 1, out int texture); LoadedImages[tileset.SpritePath] = new TexData(false, texture, null); } } TexData tex = LoadedImages[tileset.SpritePath]; foreach (var tilegrid in tilemap.Tilegrid) { Point pos = new Point(tileset.TileWidth * 2 * TilegridArray.ChunkSizeX * tilegrid.Key.Item1 + tilemap.RealPoint.X, tileset.TileHeight * 2 * TilegridArray.ChunkSizeY * tilegrid.Key.Item2 + tilemap.RealPoint.Y); PushTilemap(new DX_Tilemap(tex.texture, pos, tileset.TileWidth, tileset.TileHeight, tilegrid.Value, tilemap.Depth, new Point(2, 2))); } } break; } if (art.ArticleNum != ArticleType.Tilemap) { var c = color.ToArgb(); // Push the article sprite to the renderer PushArticle(new DX_Article( sprite.texture, new Point(offset.X, offset.Y), scale, art.Depth, SelectedObj == art ? System.Drawing.Color.Orange.ToArgb() : color.ToArgb())); } if (SelectedObj == art && SelectedPath == -1 && Overlay.Visibility != Visibility.Visible) { TexData arrowSpr = LoadedImages["roaam_arrows"]; if (art is Zone zone) { offset = new Point(offset.X + zone.TriggerWidth / 2, offset.Y + zone.TriggerHeight / 2); } // Push the transform handles to the renderer if selected PushArticle(new DX_Article( arrowSpr.texture, offset - ((Vector)arrowSpr.offset / zoomLevel), new Point(1 / zoomLevel, 1 / zoomLevel), -15)); } } if (ApplicationSettings.Instance.ActiveProject != null) { TexData respawnSpr = LoadedImages["roaam_respawn"]; PushArticle(new DX_Article( respawnSpr.texture, ApplicationSettings.Instance.ActiveProject.RespawnPoint - (Vector)respawnSpr.offset, new Point(1, 1), 5)); } WindowAPI.PrepareForRender(renderer); WindowAPI.SetCameraTransform(renderer, new Point(RenderOffset.X, RenderOffset.Y), zoomLevel); WindowAPI.Render(renderer, articles_internal, articles_count_internal, lines_internal, lines_count_internal, tilemap_internal, tilemap_count_internal); ClearArticles(); ClearLines(); ClearTilemaps(); _lastRender = args.RenderingTime; } }