Ejemplo n.º 1
0
        /// <summary>
        /// Set metrics of tileset.
        /// </summary>
        /// <param name="metrics">Object that contains metrics for tileset.</param>
        /// <exception cref="System.InvalidOperationException">
        /// If attempting to set metrics of tileset from itself.
        /// </exception>
        public void SetMetricsFrom(ITilesetMetrics metrics)
        {
            if (ReferenceEquals(metrics, this))
            {
                throw new InvalidOperationException("Unable to set metrics of tileset from itself!");
            }

            this.originalAtlasWidth  = metrics.OriginalAtlasWidth;
            this.originalAtlasHeight = metrics.OriginalAtlasHeight;

            this.rowCount    = metrics.Rows;
            this.columnCount = metrics.Columns;

            this.tileIncrementX = metrics.TileIncrementX;
            this.tileIncrementY = metrics.TileIncrementY;
            this.tileIncrementU = metrics.TileIncrementU;
            this.tileIncrementV = metrics.TileIncrementV;

            this.tileWidth    = metrics.TileWidth;
            this.tileHeight   = metrics.TileHeight;
            this.tileWidthUV  = metrics.TileWidthUV;
            this.tileHeightUV = metrics.TileHeightUV;

            this.borderSize = metrics.BorderSize;
            this.borderU    = metrics.BorderU;
            this.borderV    = metrics.BorderV;

            this.delta  = metrics.Delta;
            this.deltaU = metrics.DeltaU;
            this.deltaV = metrics.DeltaV;
        }
        protected virtual void DrawTilePreviews()
        {
            if (this.tilesetPreviews == null)
            {
                this.tilesetPreviews = new TilesetPreviewUtility(this.designer.Window);
            }

            ITilesetMetrics metrics = this.HasModifiedInputs
                ? this.inputTilesetMetrics
                : this.tileset as ITilesetMetrics;

            this.tilesetPreviews.DrawTilePreviews(this.inputAtlasTexture, metrics);
        }
Ejemplo n.º 3
0
        /// <summary>
        /// Initialize tileset for first time.
        /// </summary>
        /// <param name="material">Atlas material.</param>
        /// <param name="atlas">Atlas texture.</param>
        /// <param name="metrics">Object that contains metrics for tileset.</param>
        /// <exception cref="System.NotSupportedException">
        /// If tileset has already been initialized.
        /// </exception>
        /// <exception cref="System.ArgumentNullException">
        /// If <paramref name="atlas"/> is <c>null</c>.
        /// </exception>
        /// <exception cref="System.InvalidOperationException">
        /// If attempting to set metrics of tileset from itself.
        /// </exception>
        public void Initialize(Material material, Texture2D atlas, ITilesetMetrics metrics)
        {
            if (this.tileWidth != 0)
            {
                throw new NotSupportedException("Tileset has already been initialized.");
            }
            if (material == null)
            {
                throw new ArgumentNullException("material");
            }

            this.atlasMaterial = material;
            this.atlasTexture  = atlas;

            this.SetMetricsFrom(metrics);
        }
Ejemplo n.º 4
0
        public bool DrawTilePreviews(Texture2D tileset, ITilesetMetrics metrics, int tileCount = 0)
        {
            if (tileset == null || metrics == null || metrics.TileWidth == 0 || metrics.TileHeight == 0)
            {
                return(false);
            }

            int  tilesetCount       = metrics.Rows * metrics.Columns;
            bool tilesetCountCapped = false;

            // Limit number of tiles that are displayed.
            // Note: Do not exceed 2500 because that starts to become slow!
            if (tileCount > 0)
            {
                tilesetCount = Mathf.Min(tileCount, tilesetCount);
            }
            if (tilesetCount > 2500)
            {
                tilesetCount       = 2500;
                tilesetCountCapped = true;
            }

            int previewSpacing = 5;
            int previewOffsetX = metrics.TileWidth + previewSpacing + 2;
            int previewOffsetY = metrics.TileHeight + previewSpacing + 2;

            Rect r = EditorGUILayout.BeginVertical();

            if (r.width > 0)
            {
                this.previewColumnCount = (int)r.width / previewOffsetX;
                this.previewRowCount    = Mathf.CeilToInt((float)tilesetCount / (float)this.previewColumnCount);
            }

            if (this.previewColumnCount == 0)
            {
                GUILayout.Space(1);
                EditorGUILayout.EndVertical();
                return(false);
            }

            // Repaint window if preview area has changed.
            float previewAreaHeight = this.previewRowCount * previewOffsetY;

            if (previewAreaHeight != this.previewAreaHeight)
            {
                this.previewAreaHeight = previewAreaHeight;
                this.repaintableUI.Repaint();
            }
            GUILayout.Space(this.previewAreaHeight);

            // Get rectangle for outputting previews.
            Rect output = new Rect(r.x, r.y, metrics.TileWidth + 2, metrics.TileHeight + 2);

            float texX = metrics.BorderU;

            Rect texCoords = new Rect(
                texX,
                1f - (metrics.BorderV + metrics.TileHeightUV),
                metrics.TileWidthUV,
                metrics.TileHeightUV
                );

            GUIStyle boxStyle = GUI.skin.box;

            for (int i = 0; i < tilesetCount; ++i)
            {
                if (i != 0)
                {
                    if (i % this.previewColumnCount == 0)
                    {
                        output.x  = r.x;
                        output.y += previewOffsetY;
                    }

                    if (i % metrics.Columns == 0)
                    {
                        texCoords.x  = texX;
                        texCoords.y -= metrics.TileIncrementV;
                    }
                }

                if (Event.current.type == EventType.Repaint)
                {
                    boxStyle.Draw(output, false, false, false, false);

                    GUI.DrawTextureWithTexCoords(
                        new Rect(output.x + 1, output.y + 1, output.width - 2, output.height - 2),
                        tileset,
                        texCoords
                        );
                }

                output.x    += previewOffsetX;
                texCoords.x += metrics.TileIncrementU;
            }

            // Display warning message?
            if (tilesetCountCapped)
            {
                EditorGUILayout.HelpBox(TileLang.Text("Not all tile previews have been displayed to avoid poor performance."), MessageType.Info);
            }

            EditorGUILayout.EndVertical();
            return(true);
        }
Ejemplo n.º 5
0
        public bool DrawTilePreviews(AutotileLayout layout, Texture2D tileset, bool innerJoins, ITilesetMetrics metrics)
        {
            int tileCount = 0;

            switch (layout)
            {
            //case AutotileStyle.tIDE:
            //    tileCount = 16;
            //    break;
            case AutotileLayout.Basic:
                tileCount = innerJoins ? 47 : 16;
                break;

            case AutotileLayout.Extended:
                tileCount = innerJoins ? 48 : 16;
                break;
            }

            if (tileCount == 0)
            {
                return(false);
            }

            return(this.DrawTilePreviews(tileset, metrics, tileCount));
        }
Ejemplo n.º 6
0
        /// <summary>
        /// Initialize tileset for first time.
        /// </summary>
        /// <param name="material">Atlas material.</param>
        /// <param name="atlas">Atlas texture.</param>
        /// <param name="metrics">Object that contains metrics for tileset.</param>
        /// <exception cref="System.NotSupportedException">
        /// If tileset has already been initialized.
        /// </exception>
        /// <exception cref="System.ArgumentNullException">
        /// If <paramref name="atlas"/> is <c>null</c>.
        /// </exception>
        /// <exception cref="System.InvalidOperationException">
        /// If attempting to set metrics of tileset from itself.
        /// </exception>
        public void Initialize(AutotileLayout layout, bool hasInnerJoins, Material material, Texture2D atlas, ITilesetMetrics metrics)
        {
            base.Initialize(material, atlas, metrics);

            this.autotileLayout = layout;
            this.hasInnerJoins  = hasInnerJoins;
        }