Added bilinear scaling and mesh replacing export mode

This commit is contained in:
Kiryl Tkachou 2019-07-26 15:52:40 +03:00
parent 9a13ddb24e
commit 9f5240967a
4 changed files with 133 additions and 5 deletions

View File

@ -315,6 +315,25 @@ namespace MA_TextureAtlasserPro
} }
} }
public static void ModifyMeshes(MA_TextureAtlasserProAtlas atlas)
{
if (atlas == null || atlas.textureQuads == null) return;
var quads = atlas.textureQuads;
for (var index = 0; index < quads.Count; index++)
{
var quad = quads[index];
if (quad.meshes == null) continue;
var meshes = quad.meshes;
for (var meshIndex = 0; meshIndex < quad.meshes.Count; meshIndex++)
{
if (meshes[meshIndex] == null) continue;
MA_MeshUtils.MA_UVReMap(meshes[meshIndex], atlas.textureAtlasSize, quad.guiRect);
EditorUtility.SetDirty(meshes[meshIndex]);
}
}
AssetDatabase.SaveAssets();
}
// public static void ExportAtlasTexturePNG(MA_TextureAtlasserProAtlas atlas, string savePath = EXPORTASSETPATH) // public static void ExportAtlasTexturePNG(MA_TextureAtlasserProAtlas atlas, string savePath = EXPORTASSETPATH)
// { // {
// if(atlas != null && atlas.textureQuads != null) // if(atlas != null && atlas.textureQuads != null)
@ -363,7 +382,7 @@ namespace MA_TextureAtlasserPro
//Create new texture part //Create new texture part
Texture2D newTexturePart = (Texture2D)MA_Texture.MA_TextureUtils.ConvertToReadableTexture(q.textureGroups[i].texture); Texture2D newTexturePart = (Texture2D)MA_Texture.MA_TextureUtils.ConvertToReadableTexture(q.textureGroups[i].texture);
//Scale it //Scale it
newTexturePart = newTexturePart.MA_Scale32D((int)q.guiRect.width, (int)q.guiRect.height); newTexturePart = newTexturePart.ScaleTexture((int)q.guiRect.width, (int)q.guiRect.height, true);
//Add it //Add it
newTexture = newTexture.MA_Combine2D(newTexturePart, (int)q.guiRect.x, (int)q.guiRect.y); newTexture = newTexture.MA_Combine2D(newTexturePart, (int)q.guiRect.x, (int)q.guiRect.y);
} }

View File

@ -130,9 +130,7 @@ namespace MA_TextureAtlasserPro
} }
if (_replaceMeshes) if (_replaceMeshes)
{ MA_TextureAtlasserProUtils.ModifyMeshes(curWindow.textureAtlas);
}
if(exportPngDefault) if(exportPngDefault)
{ {

View File

@ -44,6 +44,7 @@ namespace MA_Texture
// Copy the pixels from the RenderTexture to the new Texture // Copy the pixels from the RenderTexture to the new Texture
myTexture2D.ReadPixels(new Rect(0, 0, tmp.width, tmp.height), 0, 0); myTexture2D.ReadPixels(new Rect(0, 0, tmp.width, tmp.height), 0, 0);
myTexture2D.Apply(); myTexture2D.Apply();
myTexture2D.name = texture.name;
// Reset the active RenderTexture // Reset the active RenderTexture
RenderTexture.active = previous; RenderTexture.active = previous;
@ -174,11 +175,18 @@ namespace MA_Texture
} }
} }
newTexture.name = texture.name; newTexture.name = texture.name;
newTexture.Apply(); newTexture.Apply();
return newTexture; return newTexture;
} }
public static Texture2D ScaleTexture(this Texture2D texture, int width, int height, bool bilinear)
{
TextureScaler.Scale(texture, width, height, bilinear);
return texture;
}
#endregion #endregion
#region combine #region combine

View File

@ -0,0 +1,103 @@
using System.Threading;
using UnityEngine;
namespace MA_Texture
{
public static class TextureScaler
{
public class ThreadData
{
public int start;
public int end;
public ThreadData (int s, int e) {
start = s;
end = e;
}
}
private static Color[] texColors;
private static Color[] newColors;
private static int w;
private static float ratioX;
private static float ratioY;
private static int w2;
private static int finishCount;
public static void Scale (Texture2D tex, int newWidth, int newHeight, bool useBilinear)
{
texColors = tex.GetPixels();
newColors = new Color[newWidth * newHeight];
if (useBilinear)
{
ratioX = 1.0f / ((float)newWidth / (tex.width-1));
ratioY = 1.0f / ((float)newHeight / (tex.height-1));
}
else {
ratioX = ((float)tex.width) / newWidth;
ratioY = ((float)tex.height) / newHeight;
}
w = tex.width;
w2 = newWidth;
finishCount = 0;
if (useBilinear)
{
BilinearScale(0, newHeight);
}
else
{
PointScale(0, newHeight);
}
tex.Resize(newWidth, newHeight);
tex.SetPixels(newColors);
tex.Apply();
texColors = null;
newColors = null;
}
public static void BilinearScale (int start, int end)
{
for (var y = start; y < end; y++)
{
int yFloor = (int)Mathf.Floor(y * ratioY);
var y1 = yFloor * w;
var y2 = (yFloor+1) * w;
var yw = y * w2;
for (var x = 0; x < w2; x++) {
int xFloor = (int)Mathf.Floor(x * ratioX);
var xLerp = x * ratioX-xFloor;
newColors[yw + x] = ColorLerpUnclamped(ColorLerpUnclamped(texColors[y1 + xFloor], texColors[y1 + xFloor+1], xLerp),
ColorLerpUnclamped(texColors[y2 + xFloor], texColors[y2 + xFloor+1], xLerp),
y*ratioY-yFloor);
}
}
finishCount++;
}
public static void PointScale (int start, int end)
{
for (var y = start; y < end; y++)
{
var thisY = (int)(ratioY * y) * w;
var yw = y * w2;
for (var x = 0; x < w2; x++) {
newColors[yw + x] = texColors[(int)(thisY + ratioX*x)];
}
}
finishCount++;
}
private static Color ColorLerpUnclamped (Color c1, Color c2, float value)
{
return new Color (c1.r + (c2.r - c1.r)*value,
c1.g + (c2.g - c1.g)*value,
c1.b + (c2.b - c1.b)*value,
c1.a + (c2.a - c1.a)*value);
}
}
}