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)); 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); //TmxMath.TransformPoints(points, center, flipDiagonal, flipHorizontal, flipVertical); PointF[] coordinates = new PointF[4]; coordinates[3] = PointToTextureCoordinate(points[0], imageSize); coordinates[2] = PointToTextureCoordinate(points[1], imageSize); coordinates[1] = PointToTextureCoordinate(points[2], imageSize); coordinates[0] = PointToTextureCoordinate(points[3], imageSize); // Apply a small bias to the "inner" edges of the texels // This keeps us from seeing seams //const float bias = 1.0f / 8192.0f; //const float bias = 1.0f / 4096.0f; //const float bias = 1.0f / 2048.0f; if (Program.TexelBias > 0) { float bias = 1.0f / Program.TexelBias; PointF[] multiply = new PointF[4]; multiply[0] = new PointF(1, 1); multiply[1] = new PointF(-1, 1); multiply[2] = new PointF(-1, -1); multiply[3] = new PointF(1, -1); // This nudge has to be transformed too TmxMath.TransformPoints_DiagFirst(multiply, Point.Empty, flipDiagonal, flipHorizontal, flipVertical); coordinates[0] = TmxMath.AddPoints(coordinates[0], TmxMath.ScalePoints(multiply[0], bias)); coordinates[1] = TmxMath.AddPoints(coordinates[1], TmxMath.ScalePoints(multiply[1], bias)); coordinates[2] = TmxMath.AddPoints(coordinates[2], TmxMath.ScalePoints(multiply[2], bias)); coordinates[3] = TmxMath.AddPoints(coordinates[3], TmxMath.ScalePoints(multiply[3], bias)); } return(coordinates); }
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); }
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)); 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); //TmxMath.TransformPoints(points, center, flipDiagonal, flipHorizontal, flipVertical); PointF[] coordinates = new PointF[4]; coordinates[3] = PointToTextureCoordinate(points[0], imageSize); coordinates[2] = PointToTextureCoordinate(points[1], imageSize); coordinates[1] = PointToTextureCoordinate(points[2], imageSize); coordinates[0] = PointToTextureCoordinate(points[3], imageSize); // Apply a small bias to the "inner" edges of the texels // This keeps us from seeing seams // (If seams continue along "outer" edges we can try applying the bias there as well) // Note: On Oct 25, a user was having issues with outer edges, so I brought those in as well afterall (for version 0.9.5.4) //const float bias = 1.0f / 8192.0f; //const float bias = 1.0f / 4096.0f; //const float bias = 1.0f / 2048.0f; float bias = 1.0f / Program.TexelBias; coordinates[0].X += bias; coordinates[0].Y += bias; coordinates[1].X -= bias; coordinates[1].Y += bias; coordinates[2].X -= bias; coordinates[2].Y -= bias; coordinates[3].X += bias; coordinates[3].Y -= bias; return(coordinates); }