private FastMesh createTileMesh(LBDTile tile, TMD tilesTmd, Dictionary <TMDObject, FastMesh> tileCache)
        {
            TMDObject tileObj = tilesTmd.ObjectTable[tile.TileType];

            if (tileCache.ContainsKey(tileObj))
            {
                return(tileCache[tileObj]);
            }

            Mesh     m  = LibLSDUnity.MeshFromTMDObject(tileObj);
            FastMesh fm = new FastMesh(m, new[] { LBDDiffuse, LBDAlpha });

            tileCache[tileObj] = fm;
            return(fm);
        }
        private GameObject createLBDTileMap(LBD lbd, Vector3 posOffset, Dictionary <TMDObject, FastMesh> tileCache)
        {
            List <CombineInstance> colliderMeshes = new List <CombineInstance>();

            int tileNo = 0;

            for (int i = 0; i < lbd.TileLayout.Length; i++)
            {
                int     x    = tileNo % lbd.Header.TileWidth;
                int     y    = tileNo / lbd.Header.TileWidth;
                LBDTile tile = lbd.TileLayout[x, y];

                // create an LBD tile if we should draw it
                if (tile.DrawTile)
                {
                    FastMesh mesh   = createTileMesh(tile, lbd.Tiles, tileCache);
                    var      matrix = mesh.AddInstance(new Vector3(x, -tile.TileHeight, y) + posOffset, tileRotation(tile));
                    colliderMeshes.Add(new CombineInstance
                    {
                        mesh         = mesh.Mesh,
                        transform    = matrix,
                        subMeshIndex = 0
                    });
                    if (mesh.Mesh.subMeshCount > 1)
                    {
                        colliderMeshes.Add(new CombineInstance
                        {
                            mesh         = mesh.Mesh,
                            transform    = matrix,
                            subMeshIndex = 1
                        });
                    }

                    // now do extra tiles
                    LBDTile curTile = tile;
                    int     j       = 0;
                    while (curTile.ExtraTileIndex >= 0 && j <= 1)
                    {
                        LBDTile  extraTile     = lbd.ExtraTiles[curTile.ExtraTileIndex];
                        FastMesh extraTileMesh = createTileMesh(extraTile, lbd.Tiles, tileCache);
                        var      extraMatrix   =
                            extraTileMesh.AddInstance(new Vector3(x, -extraTile.TileHeight, y) + posOffset,
                                                      tileRotation(extraTile));
                        colliderMeshes.Add(new CombineInstance
                        {
                            mesh         = extraTileMesh.Mesh,
                            transform    = extraMatrix,
                            subMeshIndex = 0
                        });
                        if (extraTileMesh.Mesh.subMeshCount > 1)
                        {
                            colliderMeshes.Add(new CombineInstance
                            {
                                mesh         = extraTileMesh.Mesh,
                                transform    = extraMatrix,
                                subMeshIndex = 1
                            });
                        }

                        curTile = extraTile;
                        j++;
                    }
                }

                tileNo++;
            }

            return(createLBDCollider(colliderMeshes, posOffset));
        }