Esempio n. 1
0
        /// <summary>
        /// Copy a subtileset source textures in the atlas
        /// </summary>
        /// <param name="autoTileset"></param>
        /// <param name="tilesetConf"></param>
        public static void CopySubTilesetInAtlas( AutoTileset autoTileset, SubTilesetConf tilesetConf )
        {
            //+++ old values for 32x32 tiles, now depend on tile size
            int _768 = 24 * autoTileset.TileWidth;
            int _640 = 20 * autoTileset.TileWidth;
            int _512 = 16 * autoTileset.TileWidth;
            int _480 = 15 * autoTileset.TileWidth;
            int _384 = 12 * autoTileset.TileWidth;
            int _256 = 8 * autoTileset.TileWidth;
            //---

            for (int i = 0; i < tilesetConf.SourceTexture.Length; ++i )
            {
                ImportTexture(tilesetConf.SourceTexture[i]);
            }

            if (tilesetConf.HasAutotiles)
            {
                int xf = (int)tilesetConf.AtlasRec.x;
                int yf = (int)tilesetConf.AtlasRec.y;
                _CopyTilesetInAtlas(autoTileset.AtlasTexture, tilesetConf.SourceTexture[0], xf, yf, _512, _384); // animated
                _CopyTilesetInAtlas(autoTileset.AtlasTexture, tilesetConf.SourceTexture[1], xf, yf+_384, _512, _384); // ground
                _CopyTilesetInAtlas(autoTileset.AtlasTexture, tilesetConf.SourceTexture[2], xf, yf + _768, _512, _256); // building
                _CopyTilesetInAtlas(autoTileset.AtlasTexture, tilesetConf.SourceTexture[3], xf+_512, yf, _512, _480); // wall
                _CopyTilesetInAtlas(autoTileset.AtlasTexture, tilesetConf.SourceTexture[4], xf+_512, yf + _512, _256, _512); // normal

                _CopyBuildingThumbnails(autoTileset, tilesetConf.SourceTexture[2], xf + _768, yf + _512);
                _CopyWallThumbnails(autoTileset, tilesetConf.SourceTexture[3], xf+_768, yf+_640);
            }
            else
            {
                _CopyTilesetInAtlas(autoTileset.AtlasTexture, tilesetConf.SourceTexture[0], tilesetConf.AtlasRec); // object
            }
        }
Esempio n. 2
0
        /// <summary>
        /// Copy a subtileset source textures in the atlas
        /// </summary>
        /// <param name="autoTileset"></param>
        /// <param name="tilesetConf"></param>
        public static void CopySubTilesetInAtlas(AutoTileset autoTileset, SubTilesetConf tilesetConf)
        {
            //+++ old values for 32x32 tiles, now depend on tile size
            int _768 = 24 * autoTileset.TileWidth;
            int _640 = 20 * autoTileset.TileWidth;
            int _512 = 16 * autoTileset.TileWidth;
            int _480 = 15 * autoTileset.TileWidth;
            int _384 = 12 * autoTileset.TileWidth;
            int _256 = 8 * autoTileset.TileWidth;

            //---

            for (int i = 0; i < tilesetConf.SourceTexture.Length; ++i)
            {
                ImportTexture(tilesetConf.SourceTexture[i]);
            }

            if (tilesetConf.HasAutotiles)
            {
                int xf = (int)tilesetConf.AtlasRec.x;
                int yf = (int)tilesetConf.AtlasRec.y;
                _CopyTilesetInAtlas(autoTileset.AtlasTexture, tilesetConf.SourceTexture[0], xf, yf, _512, _384);               // animated
                _CopyTilesetInAtlas(autoTileset.AtlasTexture, tilesetConf.SourceTexture[1], xf, yf + _384, _512, _384);        // ground
                _CopyTilesetInAtlas(autoTileset.AtlasTexture, tilesetConf.SourceTexture[2], xf, yf + _768, _512, _256);        // building
                _CopyTilesetInAtlas(autoTileset.AtlasTexture, tilesetConf.SourceTexture[3], xf + _512, yf, _512, _480);        // wall
                _CopyTilesetInAtlas(autoTileset.AtlasTexture, tilesetConf.SourceTexture[4], xf + _512, yf + _512, _256, _512); // normal

                _CopyBuildingThumbnails(autoTileset, tilesetConf.SourceTexture[2], xf + _768, yf + _512);
                _CopyWallThumbnails(autoTileset, tilesetConf.SourceTexture[3], xf + _768, yf + _640);
            }
            else
            {
                _CopyTilesetInAtlas(autoTileset.AtlasTexture, tilesetConf.SourceTexture[0], tilesetConf.AtlasRec); // object
            }
        }
Esempio n. 3
0
        /// <summary>
        /// Generate a tileset texture for a given tilesetConf
        /// </summary>
        /// <param name="autoTileset"></param>
        /// <param name="tilesetConf"></param>
        /// <returns></returns>
        public static Texture2D GenerateTilesetTexture(AutoTileset autoTileset, SubTilesetConf tilesetConf)
        {
            //+++ old values for 32x32 tiles, now depend on tile size
            int _1024 = 32 * autoTileset.TileWidth;
            int _256  = 8 * autoTileset.TileWidth;
            //---
            List <Rect> sprList = new List <Rect>();

            FillWithTilesetThumbnailSprites(sprList, autoTileset, tilesetConf);
            Texture2D tilesetTexture = new Texture2D(_256, _1024, TextureFormat.ARGB32, false);

            tilesetTexture.filterMode = FilterMode.Point;

            int  sprIdx  = 0;
            Rect dstRect = new Rect(0, tilesetTexture.height - autoTileset.TileHeight, autoTileset.TileWidth, autoTileset.TileHeight);

            for (; dstRect.y >= 0; dstRect.y -= autoTileset.TileHeight)
            {
                for (dstRect.x = 0; dstRect.x < tilesetTexture.width && sprIdx < sprList.Count; dstRect.x += autoTileset.TileWidth, ++sprIdx)
                {
                    Rect    srcRect        = sprList[sprIdx];
                    Color[] autotileColors = autoTileset.AtlasTexture.GetPixels(Mathf.RoundToInt(srcRect.x), Mathf.RoundToInt(srcRect.y), autoTileset.TileWidth, autoTileset.TileHeight);
                    tilesetTexture.SetPixels(Mathf.RoundToInt(dstRect.x), Mathf.RoundToInt(dstRect.y), autoTileset.TileWidth, autoTileset.TileHeight, autotileColors);
                }
            }
            tilesetTexture.Apply();

            return(tilesetTexture);
        }
        /// <summary>
        /// Generate a tileset texture for a given tilesetConf
        /// </summary>
        /// <param name="autoTileset"></param>
        /// <param name="tilesetConf"></param>
        /// <returns></returns>
		public static Texture2D GenerateTilesetTexture( AutoTileset autoTileset, SubTilesetConf tilesetConf )
		{
            //+++ old values for 32x32 tiles, now depend on tile size
            int _1024 = 32 * autoTileset.TileWidth;
            int _256 = 8 * autoTileset.TileWidth;
            //---
			List<Rect> sprList = new List<Rect>();
            FillWithTilesetThumbnailSprites(sprList, autoTileset, tilesetConf);
			Texture2D tilesetTexture = new Texture2D( _256, _1024 );

			int sprIdx = 0;
            Rect dstRect = new Rect(0, tilesetTexture.height - autoTileset.TileHeight, autoTileset.TileWidth, autoTileset.TileHeight);
            for (; dstRect.y >= 0; dstRect.y -= autoTileset.TileHeight)
			{
                for (dstRect.x = 0; dstRect.x < tilesetTexture.width && sprIdx < sprList.Count; dstRect.x += autoTileset.TileWidth, ++sprIdx)
				{
					Rect srcRect = sprList[sprIdx];
                    Color[] autotileColors = autoTileset.AtlasTexture.GetPixels(Mathf.RoundToInt(srcRect.x), Mathf.RoundToInt(srcRect.y), autoTileset.TileWidth, autoTileset.TileHeight);
                    tilesetTexture.SetPixels(Mathf.RoundToInt(dstRect.x), Mathf.RoundToInt(dstRect.y), autoTileset.TileWidth, autoTileset.TileHeight, autotileColors);
				}
			}
			tilesetTexture.Apply();

			return tilesetTexture;
		}
Esempio n. 5
0
        private bool _validateTilesetTextures(AtlasSlot atlasSlot)
        {
            //+++ old values for 32x32 tiles, now depend on tile size
            int _512 = 16 * m_autoTileset.TileWidth;
            int _480 = 15 * m_autoTileset.TileWidth;
            int _384 = 12 * m_autoTileset.TileWidth;
            int _256 = 8 * m_autoTileset.TileWidth;
            //---

            List <Texture2D> invalidTextures = new List <Texture2D>();

            Debug.Log("atlasSlot.SubTilesets.Count   " + atlasSlot.SubTilesets.Count);
            for (int i = 0; i < atlasSlot.SubTilesets.Count; ++i)
            {
                SubTilesetConf tilesetConf = atlasSlot.SubTilesets[i];
                if (tilesetConf.HasAutotiles)
                {
                    Debug.Log(tilesetConf.SourceTexture.Length);
                    for (int j = 0; j < tilesetConf.SourceTexture.Length; ++j)
                    {
                        if (tilesetConf.SourceTexture[j] != null &&
                            (
                                (j == 0) && (tilesetConf.SourceTexture[j].width != _512 || tilesetConf.SourceTexture[j].height != _384) ||
                                (j == 1) && (tilesetConf.SourceTexture[j].width != _512 || tilesetConf.SourceTexture[j].height != _384) ||
                                (j == 2) && (tilesetConf.SourceTexture[j].width != _512 || tilesetConf.SourceTexture[j].height != _256) ||
                                (j == 3) && (tilesetConf.SourceTexture[j].width != _512 || tilesetConf.SourceTexture[j].height != _480) ||
                                (j == 4) && (tilesetConf.SourceTexture[j].width != _256 || tilesetConf.SourceTexture[j].height != _512)
                            )
                            )
                        {
                            invalidTextures.Add(tilesetConf.SourceTexture[j]);
                            tilesetConf.SourceTexture[j] = null;
                        }
                    }
                }
                else
                {
                    if (tilesetConf.SourceTexture[0] != null && (tilesetConf.SourceTexture[0].width != _512 || tilesetConf.SourceTexture[0].height != _512))
                    {
                        invalidTextures.Add(tilesetConf.SourceTexture[0]);
                        tilesetConf.SourceTexture[0] = null;
                    }
                }
            }
            if (invalidTextures.Count > 0)
            {
                string wrongTextures = "";
                foreach (Texture2D text in invalidTextures)
                {
                    wrongTextures += "\n" + text.name;
                }
                EditorUtility.DisplayDialog(
                    "Wrong texture size", "One or more textures have a wrong texture size:" + wrongTextures + "\n" +
                    "The texture size could be changed by the import settings. If this is the case, use Texture Type: Sprite in the texture import settings."
                    , "Ok");
            }
            return(invalidTextures.Count == 0);
        }
Esempio n. 6
0
        /// <summary>
        /// Fill a list of rects with all rect sources for the thumbnails of the tiles. For normal tiles is the same tile, but autotiles are special.
        /// </summary>
        /// <param name="_outList"></param>
        /// <param name="autoTileset"></param>
        /// <param name="tilesetConf"></param>
        public static void FillWithTilesetThumbnailSprites( List<Rect> _outList, AutoTileset autoTileset, SubTilesetConf tilesetConf)
        {
            //+++ old values for 32x32 tiles, now depend on tile size
            int _1024 = 32 * autoTileset.TileWidth;
            int _768 = 24 * autoTileset.TileWidth;
            int _640 = 20 * autoTileset.TileWidth;
            int _512 = 16 * autoTileset.TileWidth;
            int _384 = 12 * autoTileset.TileWidth;
            int _256 = 8 * autoTileset.TileWidth;
            //---

            Rect sprRect = new Rect(0, 0, autoTileset.TileWidth, autoTileset.TileHeight);
            int AtlasPosX = (int)tilesetConf.AtlasRec.x;
            int AtlasPosY = (int)tilesetConf.AtlasRec.y;
            if (tilesetConf.HasAutotiles)
            {
                // animated
                for (sprRect.y = _384 - autoTileset.TileHeight; sprRect.y >= 0; sprRect.y -= 3 * autoTileset.TileHeight)
                {
                    int tx;
                    for (tx = 0, sprRect.x = 0; sprRect.x < _512; sprRect.x += 2 * autoTileset.TileWidth, ++tx)
                    {
                        if( tx % 4 == 0 || tx % 4 == 3 )
                        {
                            Rect r = sprRect; r.position += tilesetConf.AtlasRec.position;
                            _outList.Add(r);
                        }
                    }
                }

                // ground
                for (sprRect.y = _768 - autoTileset.TileHeight; sprRect.y >= _384; sprRect.y -= 3 * autoTileset.TileHeight)
                {
                    for (sprRect.x = 0; sprRect.x < _512; sprRect.x += 2 * autoTileset.TileWidth)
                    {
                        Rect r = sprRect; r.position += tilesetConf.AtlasRec.position;
                        _outList.Add(r);
                    }
                }

                // building
                for (sprRect.y = _512 + 3 * autoTileset.TileHeight; sprRect.y >= _512; sprRect.y -= autoTileset.TileHeight)
                {
                    for (sprRect.x = _768; sprRect.x < _768 + 8 * autoTileset.TileWidth; sprRect.x += autoTileset.TileWidth)
                    {
                        Rect r = sprRect; r.position += tilesetConf.AtlasRec.position;
                        _outList.Add(r);
                    }
                }

                // walls
                sprRect.y = (15 - 1) * autoTileset.TileHeight;
                for (sprRect.x = _512; sprRect.x < _1024; sprRect.x += 2 * autoTileset.TileWidth)
                {
                    Rect r = sprRect; r.position += tilesetConf.AtlasRec.position;
                    _outList.Add(r);
                }
                sprRect.y = _640 + 2 * autoTileset.TileHeight;
                for (sprRect.x = _768; sprRect.x < _768 + 8 * autoTileset.TileWidth; sprRect.x += autoTileset.TileWidth)
                {
                    Rect r = sprRect; r.position += tilesetConf.AtlasRec.position;
                    _outList.Add(r);
                }
                sprRect.y = (10 - 1) * autoTileset.TileHeight;
                for (sprRect.x = _512; sprRect.x < _1024; sprRect.x += 2 * autoTileset.TileWidth)
                {
                    Rect r = sprRect; r.position += tilesetConf.AtlasRec.position;
                    _outList.Add(r);
                }
                sprRect.y = _640 + autoTileset.TileHeight;
                for (sprRect.x = _768; sprRect.x < _768 + 8 * autoTileset.TileWidth; sprRect.x += autoTileset.TileWidth)
                {
                    Rect r = sprRect; r.position += tilesetConf.AtlasRec.position;
                    _outList.Add(r);
                }
                sprRect.y = (5 - 1) * autoTileset.TileHeight;
                for (sprRect.x = _512; sprRect.x < _1024; sprRect.x += 2 * autoTileset.TileWidth)
                {
                    Rect r = sprRect; r.position += tilesetConf.AtlasRec.position;
                    _outList.Add(r);
                }
                sprRect.y = _640;
                for (sprRect.x = _768; sprRect.x < _768 + 8 * autoTileset.TileWidth; sprRect.x += autoTileset.TileWidth)
                {
                    Rect r = sprRect; r.position += tilesetConf.AtlasRec.position;
                    _outList.Add(r);
                }
                //--- walls

                //Normal
                _FillSpritesFromRect(_outList, autoTileset, _512 + AtlasPosX, _512 + AtlasPosY, _256, _512);
            }
            else
            { // split the tileset to create a column of 8 tiles per row
                _FillSpritesFromRect(_outList, autoTileset, AtlasPosX, AtlasPosY, _256, _512);
                _FillSpritesFromRect(_outList, autoTileset, AtlasPosX+_256, AtlasPosY, _256, _512);
            }
        }
Esempio n. 7
0
        /// <summary>
        /// Fill a list of rects with all rect sources for the thumbnails of the tiles. For normal tiles is the same tile, but autotiles are special.
        /// </summary>
        /// <param name="_outList"></param>
        /// <param name="autoTileset"></param>
        /// <param name="tilesetConf"></param>
        public static void FillWithTilesetThumbnailSprites(List <Rect> _outList, AutoTileset autoTileset, SubTilesetConf tilesetConf)
        {
            //+++ old values for 32x32 tiles, now depend on tile size
            int _1024 = 32 * autoTileset.TileWidth;
            int _768  = 24 * autoTileset.TileWidth;
            int _640  = 20 * autoTileset.TileWidth;
            int _512  = 16 * autoTileset.TileWidth;
            int _384  = 12 * autoTileset.TileWidth;
            int _256  = 8 * autoTileset.TileWidth;
            //---

            Rect sprRect   = new Rect(0, 0, autoTileset.TileWidth, autoTileset.TileHeight);
            int  AtlasPosX = (int)tilesetConf.AtlasRec.x;
            int  AtlasPosY = (int)tilesetConf.AtlasRec.y;

            if (tilesetConf.HasAutotiles)
            {
                // animated
                for (sprRect.y = _384 - autoTileset.TileHeight; sprRect.y >= 0; sprRect.y -= 3 * autoTileset.TileHeight)
                {
                    int tx;
                    for (tx = 0, sprRect.x = 0; sprRect.x < _512; sprRect.x += 2 * autoTileset.TileWidth, ++tx)
                    {
                        if (tx % 4 == 0 || tx % 4 == 3)
                        {
                            Rect r = sprRect; r.position += tilesetConf.AtlasRec.position;
                            _outList.Add(r);
                        }
                    }
                }

                // ground
                for (sprRect.y = _768 - autoTileset.TileHeight; sprRect.y >= _384; sprRect.y -= 3 * autoTileset.TileHeight)
                {
                    for (sprRect.x = 0; sprRect.x < _512; sprRect.x += 2 * autoTileset.TileWidth)
                    {
                        Rect r = sprRect; r.position += tilesetConf.AtlasRec.position;
                        _outList.Add(r);
                    }
                }

                // building
                for (sprRect.y = _512 + 3 * autoTileset.TileHeight; sprRect.y >= _512; sprRect.y -= autoTileset.TileHeight)
                {
                    for (sprRect.x = _768; sprRect.x < _768 + 8 * autoTileset.TileWidth; sprRect.x += autoTileset.TileWidth)
                    {
                        Rect r = sprRect; r.position += tilesetConf.AtlasRec.position;
                        _outList.Add(r);
                    }
                }

                // walls
                sprRect.y = (15 - 1) * autoTileset.TileHeight;
                for (sprRect.x = _512; sprRect.x < _1024; sprRect.x += 2 * autoTileset.TileWidth)
                {
                    Rect r = sprRect; r.position += tilesetConf.AtlasRec.position;
                    _outList.Add(r);
                }
                sprRect.y = _640 + 2 * autoTileset.TileHeight;
                for (sprRect.x = _768; sprRect.x < _768 + 8 * autoTileset.TileWidth; sprRect.x += autoTileset.TileWidth)
                {
                    Rect r = sprRect; r.position += tilesetConf.AtlasRec.position;
                    _outList.Add(r);
                }
                sprRect.y = (10 - 1) * autoTileset.TileHeight;
                for (sprRect.x = _512; sprRect.x < _1024; sprRect.x += 2 * autoTileset.TileWidth)
                {
                    Rect r = sprRect; r.position += tilesetConf.AtlasRec.position;
                    _outList.Add(r);
                }
                sprRect.y = _640 + autoTileset.TileHeight;
                for (sprRect.x = _768; sprRect.x < _768 + 8 * autoTileset.TileWidth; sprRect.x += autoTileset.TileWidth)
                {
                    Rect r = sprRect; r.position += tilesetConf.AtlasRec.position;
                    _outList.Add(r);
                }
                sprRect.y = (5 - 1) * autoTileset.TileHeight;
                for (sprRect.x = _512; sprRect.x < _1024; sprRect.x += 2 * autoTileset.TileWidth)
                {
                    Rect r = sprRect; r.position += tilesetConf.AtlasRec.position;
                    _outList.Add(r);
                }
                sprRect.y = _640;
                for (sprRect.x = _768; sprRect.x < _768 + 8 * autoTileset.TileWidth; sprRect.x += autoTileset.TileWidth)
                {
                    Rect r = sprRect; r.position += tilesetConf.AtlasRec.position;
                    _outList.Add(r);
                }
                //--- walls

                //Normal
                _FillSpritesFromRect(_outList, autoTileset, _512 + AtlasPosX, _512 + AtlasPosY, _256, _512);
            }
            else
            { // split the tileset to create a column of 8 tiles per row
                _FillSpritesFromRect(_outList, autoTileset, AtlasPosX, AtlasPosY, _256, _512);
                _FillSpritesFromRect(_outList, autoTileset, AtlasPosX + _256, AtlasPosY, _256, _512);
            }
        }
Esempio n. 8
0
        void FillData()
        {
            m_animatedTiles.Clear();
            m_animatedWaterfallTiles.Clear();
            m_vertices  = new Vector3[TileWidth * TileHeight * 4 * 4]; // 4 subtiles x 4 vertex per tile
            m_colors    = new Color32[TileWidth * TileHeight * 4 * 4];
            m_uv        = new Vector2[m_vertices.Length];
            m_triangles = new int[TileWidth * TileHeight * 4 * 2 * 3]; // 4 subtiles x 2 triangles per tile x 3 vertex per triangle

            int vertexIdx   = 0;
            int triangleIdx = 0;
            //TODO: optimize updating only updated tiles inside the chunk
            Dictionary <int, AutoTile> tileCache = new Dictionary <int, AutoTile>();
            int mapWidth  = MyAutoTileMap.MapTileWidth;
            int mapHeight = MyAutoTileMap.MapTileHeight;

            for (int tileX = 0; tileX < TileWidth; ++tileX)
            {
                for (int tileY = 0; tileY < TileHeight; ++tileY)
                {
                    int tx = StartTileX + tileX;
                    int ty = StartTileY + tileY;
                    if (tx >= mapWidth || ty >= mapHeight)
                    {
                        continue;
                    }
                    int      tileIdx = ty * MyAutoTileMap.MapTileWidth + tx;
                    AutoTile autoTile;
                    if (!tileCache.TryGetValue(tileIdx, out autoTile))
                    {
                        //Debug.Log(" Cache miss! ");
                        autoTile           = MyAutoTileMap.GetAutoTile(StartTileX + tileX, StartTileY + tileY, MapLayerIdx);
                        tileCache[tileIdx] = autoTile;
                    }
                    if (autoTile.Id >= 0)
                    {
                        int subTileXBase = tileX << 1; // <<1 == *2
                        int subTileYBase = tileY << 1; // <<1 == *2
                        for (int xf = 0; xf < 2; ++xf)
                        {
                            for (int yf = 0; yf < 2; ++yf)
                            {
                                int subTileX = subTileXBase + xf;
                                int subTileY = subTileYBase + yf;

                                float px0 = subTileX * (MyAutoTileMap.CellSize.x / 2f);
                                float py0 = -subTileY * (MyAutoTileMap.CellSize.y / 2f);
                                float px1 = (subTileX + 1) * (MyAutoTileMap.CellSize.x / 2f);
                                float py1 = -(subTileY + 1) * (MyAutoTileMap.CellSize.y / 2f);

                                m_vertices[vertexIdx + 0] = new Vector3(px0, py0, 0);
                                m_vertices[vertexIdx + 1] = new Vector3(px0, py1, 0);
                                m_vertices[vertexIdx + 2] = new Vector3(px1, py1, 0);
                                m_vertices[vertexIdx + 3] = new Vector3(px1, py0, 0);

                                m_colors[vertexIdx + 0] = new Color32(255, 255, 255, 255);
                                m_colors[vertexIdx + 1] = new Color32(255, 255, 255, 255);
                                m_colors[vertexIdx + 2] = new Color32(255, 255, 255, 255);
                                m_colors[vertexIdx + 3] = new Color32(255, 255, 255, 255);

                                m_triangles[triangleIdx + 0] = vertexIdx + 2;
                                m_triangles[triangleIdx + 1] = vertexIdx + 1;
                                m_triangles[triangleIdx + 2] = vertexIdx + 0;
                                m_triangles[triangleIdx + 3] = vertexIdx + 0;
                                m_triangles[triangleIdx + 4] = vertexIdx + 3;
                                m_triangles[triangleIdx + 5] = vertexIdx + 2;

                                float u0, u1, v0, v1;
                                if (autoTile.Type == eTileType.OBJECTS || autoTile.Type == eTileType.NORMAL)
                                {
                                    int  spriteIdx   = autoTile.TilePartsIdx[0];
                                    Rect sprTileRect = MyAutoTileMap.Tileset.AutoTileRects[spriteIdx];
                                    u0 = (((subTileX % 2) * sprTileRect.width / 2) + sprTileRect.x) / MyAutoTileMap.Tileset.AtlasTexture.width;
                                    u1 = (((subTileX % 2) * sprTileRect.width / 2) + sprTileRect.x + sprTileRect.width / 2) / MyAutoTileMap.Tileset.AtlasTexture.width;
                                    v0 = (((1 - subTileY % 2) * sprTileRect.height / 2) + sprTileRect.y + sprTileRect.height / 2) / MyAutoTileMap.Tileset.AtlasTexture.height;
                                    v1 = (((1 - subTileY % 2) * sprTileRect.height / 2) + sprTileRect.y) / MyAutoTileMap.Tileset.AtlasTexture.height;
                                }
                                else
                                {
                                    int  tilePartIdx = (subTileY % 2) * 2 + (subTileX % 2);
                                    int  spriteIdx   = autoTile.TilePartsIdx[tilePartIdx];
                                    Rect sprTileRect = MyAutoTileMap.Tileset.AutoTileRects[spriteIdx];
                                    u0 = sprTileRect.x / MyAutoTileMap.Tileset.AtlasTexture.width;
                                    u1 = (sprTileRect.x + sprTileRect.width) / MyAutoTileMap.Tileset.AtlasTexture.width;
                                    v0 = (sprTileRect.y + sprTileRect.height) / MyAutoTileMap.Tileset.AtlasTexture.height;
                                    v1 = sprTileRect.y / MyAutoTileMap.Tileset.AtlasTexture.height;

                                    if (MyAutoTileMap.Tileset.IsAutoTileAnimated(autoTile.Id))
                                    {
                                        m_animatedTiles.Add(new AnimTileData()
                                        {
                                            VertexIdx = vertexIdx, U0 = u0, U1 = u1
                                        });
                                    }
                                    else if (MyAutoTileMap.Tileset.IsAutoTileAnimatedWaterfall(autoTile.Id))
                                    {
                                        SubTilesetConf tilesetConf = MyAutoTileMap.Tileset.SubTilesets[autoTile.Id / AutoTileset.k_TilesPerSubTileset];
                                        int            spriteIdxRelToSubTileset = spriteIdx - tilesetConf.TilePartOffset[0];
                                        int            subTileRow = (spriteIdxRelToSubTileset / 32); //32 = number of subtiles in a row;
                                        subTileRow %= 6;                                             // make it relative to this autotile
                                        subTileRow -= 2;                                             // remove top tiles
                                        m_animatedWaterfallTiles.Add(new AnimTileData()
                                        {
                                            VertexIdx = vertexIdx, V0 = v0, V1 = v1, SubTileRow = subTileRow
                                        });
                                    }
                                }
                                m_uv[vertexIdx + 0] = new Vector3(u0, v0, 0);
                                m_uv[vertexIdx + 1] = new Vector3(u0, v1, 0);
                                m_uv[vertexIdx + 2] = new Vector3(u1, v1, 0);
                                m_uv[vertexIdx + 3] = new Vector3(u1, v0, 0);

                                // increment vectex and triangle idx
                                vertexIdx   += 4;
                                triangleIdx += 6;
                            }
                        }
                    }
                }
            }

            // resize arrays
            System.Array.Resize(ref m_vertices, vertexIdx);
            System.Array.Resize(ref m_colors, vertexIdx);
            System.Array.Resize(ref m_uv, vertexIdx);
            System.Array.Resize(ref m_triangles, triangleIdx);
        }