Exemple #1
0
        protected virtual void OnTilesetChanged()
        {
            Tileset            tileset    = this.tileset.Res;
            TilesetRenderInput mainInput  = (tileset != null) ? tileset.RenderConfig.ElementAtOrDefault(this.displayedConfigIndex) : null;
            Pixmap             sourceData = (mainInput != null) ? mainInput.SourceData.Res : null;

            // Dispose old local bitmaps
            if (this.tileBitmap != null)
            {
                this.tileBitmap.Dispose();
                this.tileBitmap = null;
            }

            // Retrieve tileset data and create local tileset bitmap
            if (mainInput != null && sourceData != null)
            {
                this.tileBitmap = sourceData.MainLayer.ToBitmap();

                Point2 sourceTileCount = mainInput.GetSourceTileCount(this.tileBitmap.Width, this.tileBitmap.Height);
                this.tileCount      = new Point(sourceTileCount.X, sourceTileCount.Y);
                this.totalTileCount = this.tileCount.X * this.tileCount.Y;
                this.sourceTileSize = mainInput.SourceTileSize;
            }
            else
            {
                this.tileBitmap     = null;
                this.tileCount      = Point.Empty;
                this.totalTileCount = 0;
                this.sourceTileSize = Tileset.DefaultTileSize;
            }

            this.UpdateContentLayout();
            this.GenerateBackgroundPattern();
            this.Invalidate();
        }
        /// <inheritdoc />
        public override void RemoveLayer()
        {
            base.RemoveLayer();

            Tileset            tileset = this.SelectedTileset.Res;
            TilesetRenderInput layer   = this.SelectedVisualLayer;

            if (tileset == null)
            {
                return;
            }
            if (layer == null)
            {
                return;
            }

            UndoRedoManager.Do(new RemoveTilesetConfigLayerAction <TilesetRenderInput>(
                                   tileset,
                                   TilemapsReflectionInfo.Property_Tileset_RenderConfig,
                                   layer));
        }
Exemple #3
0
        public override void Perform(Tileset tileset, PreviewImageQuery query)
        {
            int desiredWidth  = query.DesiredWidth;
            int desiredHeight = query.DesiredHeight;

            TilesetRenderInput input      = tileset.RenderConfig.FirstOrDefault(c => c.SourceData != null);
            Pixmap             mainPixmap = (input != null) ? input.SourceData.Res : null;
            PixelData          layer      = (mainPixmap != null) ? mainPixmap.MainLayer : null;

            if (layer == null)
            {
                query.Result = new Bitmap(1, 1);
                return;
            }
            float widthRatio = (float)layer.Width / (float)layer.Height;

            layer = layer.CloneSubImage(0, 0, desiredWidth * 2, desiredHeight * 2);
            layer.Rescale(desiredWidth, desiredHeight);

            query.Result = layer.ToBitmap();
        }
        protected virtual void OnTilesetChanged()
        {
            Tileset            tileset    = this.tileset.Res;
            TilesetRenderInput mainInput  = (tileset != null) ? tileset.RenderConfig.ElementAtOrDefault(this.displayedConfigIndex) : null;
            Pixmap             sourceData = (mainInput != null) ? mainInput.SourceData.Res : null;

            // Dispose old local bitmaps
            if (this.tileBitmap != null)
            {
                this.tileBitmap.Dispose();
                this.tileBitmap = null;
            }

            // Retrieve tileset data and create local tileset bitmap
            if (mainInput != null && sourceData != null)
            {
                Vector2 originalTileSize = tileset.TileSize;
                float   minDisplayedSize = 30.0f;
                float   maxDisplayedSize = 50.0f;

                // Find a suitable display size for the tileset
                Vector2 displayedTileSize = originalTileSize;
                while (displayedTileSize.X > maxDisplayedSize)
                {
                    displayedTileSize /= 2.0f;
                }
                while (displayedTileSize.X < minDisplayedSize)
                {
                    displayedTileSize *= 2.0f;
                }

                displayedTileSize = displayedTileSize *
                                    (MathF.Clamp(
                                         displayedTileSize.X,
                                         minDisplayedSize,
                                         maxDisplayedSize) /
                                     displayedTileSize.X);

                this.tileBitmap        = sourceData.MainLayer.ToBitmap();
                this.displayedTileSize = new Size(
                    (int)displayedTileSize.X,
                    (int)displayedTileSize.Y);
                Point2 sourceTileCount = mainInput.GetSourceTileCount(this.tileBitmap.Width, this.tileBitmap.Height);
                this.tileCount          = new Point(sourceTileCount.X, sourceTileCount.Y);
                this.totalTileCount     = this.tileCount.X * this.tileCount.Y;
                this.tilesetContentSize = new Size(
                    this.displayedTileSize.Width * this.tileCount.X + this.spacing.Width * (this.tileCount.X - 1),
                    this.displayedTileSize.Height * this.tileCount.Y + this.spacing.Height * (this.tileCount.Y - 1));
            }
            else
            {
                this.tileBitmap         = null;
                this.displayedTileSize  = Size.Empty;
                this.tileCount          = Point.Empty;
                this.totalTileCount     = 0;
                this.tilesetContentSize = Size.Empty;
            }

            this.GenerateBackgroundPattern();
            this.UpdateContentStats();
            this.Invalidate();
        }
 public VisualLayerNode(TilesetRenderInput layer) : base()
 {
     this.layer = layer;
     this.Image = Properties.TilemapsResCache.IconTilesetSingleVisualLayer;
 }
        /// <inheritdoc />
        public override void AddLayer()
        {
            base.AddLayer();
            Tileset tileset = this.SelectedTileset.Res;

            if (tileset == null)
            {
                return;
            }

            // Determine which texture IDs are already present, so we can
            // derive which one we'll pick as a default for creating a new one.
            bool hasMainTex       = false;
            int  highestCustomTex = -1;

            for (int i = 0; i < tileset.RenderConfig.Count; i++)
            {
                if (tileset.RenderConfig[i].Id == TilesetRenderInput.MainTexId)
                {
                    hasMainTex = true;
                }
                else if (tileset.RenderConfig[i].Id.StartsWith(TilesetRenderInput.CustomTexId))
                {
                    string customTexIndexString = tileset.RenderConfig[i].Id.Substring(
                        TilesetRenderInput.CustomTexId.Length,
                        tileset.RenderConfig[i].Id.Length - TilesetRenderInput.CustomTexId.Length);

                    int customTexIndex;
                    if (!int.TryParse(customTexIndexString, out customTexIndex))
                    {
                        customTexIndex = 0;
                    }

                    highestCustomTex = Math.Max(highestCustomTex, customTexIndex);
                }
            }

            // Decide upon an id for our new layer
            string layerId;
            string layerName;

            if (!hasMainTex)
            {
                layerId   = TilesetRenderInput.MainTexId;
                layerName = TilesetRenderInput.MainTexName;
            }
            else
            {
                layerId   = TilesetRenderInput.CustomTexId + (highestCustomTex + 1).ToString();
                layerName = TilesetRenderInput.CustomTexName;
            }

            // Create a new layer using an UndoRedo action
            TilesetRenderInput newLayer = new TilesetRenderInput
            {
                Id   = layerId,
                Name = layerName
            };

            UndoRedoManager.Do(new AddTilesetConfigLayerAction <TilesetRenderInput>(
                                   tileset,
                                   TilemapsReflectionInfo.Property_Tileset_RenderConfig,
                                   newLayer));

            // Select the newly created visual layer
            VisualLayerNode modelNode = this.treeModel
                                        .Nodes
                                        .OfType <VisualLayerNode>()
                                        .FirstOrDefault(n => n.VisualLayer == newLayer);

            this.SelectLayer(modelNode);
        }