private PointF[] CalculateFaceTextureCoordinates(TmxTile tmxTile, bool flipDiagonal, bool flipHorizontal, bool flipVertical) { Point imageLocation = tmxTile.LocationOnSource; Size tileSize = tmxTile.TileSize; Size imageSize = tmxTile.TmxImage.Size; PointF[] points = new PointF[4]; points[0] = imageLocation; points[1] = PointF.Add(imageLocation, new Size(tileSize.Width, 0)); points[2] = PointF.Add(imageLocation, tileSize); points[3] = PointF.Add(imageLocation, new Size(0, tileSize.Height)); // Transform the points with our flip flags PointF center = new PointF(tileSize.Width * 0.5f, tileSize.Height * 0.5f); center.X += imageLocation.X; center.Y += imageLocation.Y; TmxMath.TransformPoints_DiagFirst(points, center, flipDiagonal, flipHorizontal, flipVertical); // "Tuck in" the points a tiny bit to help avoid seams // This can be turned off by setting Texel Bias to zero // Note that selecting a texel bias that is too small or a texture that is too big may affect pixel-perfect rendering (pixel snapping in shader will help) float bias = 0.0f; PointF[] tucks = new PointF[4]; if (Tiled2Unity.Settings.TexelBias > 0) { bias = 1.0f / Tiled2Unity.Settings.TexelBias; tucks[0].X += 1.0f; tucks[0].Y += 1.0f; tucks[1].X -= 1.0f; tucks[1].Y += 1.0f; tucks[2].X -= 1.0f; tucks[2].Y -= 1.0f; tucks[3].X += 1.0f; tucks[3].Y -= 1.0f; } TmxMath.TransformPoints_DiagFirst(tucks, PointF.Empty, flipDiagonal, flipHorizontal, flipVertical); PointF[] coordinates = new PointF[4]; coordinates[3] = TmxMath.AddPoints(PointToTextureCoordinate(points[0], imageSize), TmxMath.ScalePoint(tucks[0].X, -tucks[0].Y, bias)); coordinates[2] = TmxMath.AddPoints(PointToTextureCoordinate(points[1], imageSize), TmxMath.ScalePoint(tucks[1].X, -tucks[1].Y, bias)); coordinates[1] = TmxMath.AddPoints(PointToTextureCoordinate(points[2], imageSize), TmxMath.ScalePoint(tucks[2].X, -tucks[2].Y, bias)); coordinates[0] = TmxMath.AddPoints(PointToTextureCoordinate(points[3], imageSize), TmxMath.ScalePoint(tucks[3].X, -tucks[3].Y, bias)); return(coordinates); }