diff --git a/Unity Studio/Unity Classes/Texture2D.cs b/Unity Studio/Unity Classes/Texture2D.cs index e75cb4f..bad3490 100644 --- a/Unity Studio/Unity Classes/Texture2D.cs +++ b/Unity Studio/Unity Classes/Texture2D.cs @@ -86,6 +86,8 @@ namespace Unity_Studio public byte[] astc_height = new byte[3]; public byte[] astc_length = new byte[3] { 1, 0, 0 };//I don't know what this is. //ASTC END + //TextureConverter + public int q_format; //Texture data public int image_data_size; @@ -345,16 +347,52 @@ namespace Unity_Studio dwABitMask = -16777216; break; } - case TextureFormat.RHalf: - case TextureFormat.RGHalf: - case TextureFormat.RGBAHalf: - case TextureFormat.RFloat: - case TextureFormat.RGFloat: - case TextureFormat.RGBAFloat: - break; - case TextureFormat.YUY2: + case TextureFormat.RHalf://Not sure + { + q_format = (int)QFORMAT.Q_FORMAT_R_16F; + glInternalFormat = KTXHeader.GL_R16F; + glBaseInternalFormat = KTXHeader.GL_RED; + break; + } + case TextureFormat.RGHalf://Not sure + { + q_format = (int)QFORMAT.Q_FORMAT_RG_HF; + glInternalFormat = KTXHeader.GL_RG16F; + glBaseInternalFormat = KTXHeader.GL_RG; + break; + } + case TextureFormat.RGBAHalf://Not sure + { + q_format = (int)QFORMAT.Q_FORMAT_RGBA_HF; + glInternalFormat = KTXHeader.GL_RGBA16F; + glBaseInternalFormat = KTXHeader.GL_RGBA; + break; + } + case TextureFormat.RFloat://Not sure + { + q_format = (int)QFORMAT.Q_FORMAT_R_F; + glInternalFormat = KTXHeader.GL_R32F; + glBaseInternalFormat = KTXHeader.GL_RED; + break; + } + case TextureFormat.RGFloat://Not sure + { + q_format = (int)QFORMAT.Q_FORMAT_RG_F; + glInternalFormat = KTXHeader.GL_RG32F; + glBaseInternalFormat = KTXHeader.GL_RG; + break; + } + case TextureFormat.RGBAFloat://Not sure + { + q_format = (int)QFORMAT.Q_FORMAT_RGBA_F; + glInternalFormat = KTXHeader.GL_RGBA32F; + glBaseInternalFormat = KTXHeader.GL_RGBA; + break; + } + case TextureFormat.YUY2://Not sure { pvrPixelFormat = 0x11; + q_format = (int)QFORMAT.Q_FORMAT_YUYV_16; break; } case TextureFormat.DXT1Crunched: //DXT1 Crunched @@ -395,14 +433,16 @@ namespace Unity_Studio glBaseInternalFormat = KTXHeader.GL_RGB; break; } - case TextureFormat.ATC_RGB4: //can use QCompress to convert + case TextureFormat.ATC_RGB4: //test pass { + q_format = (int)QFORMAT.Q_FORMAT_ATITC_RGB; glInternalFormat = KTXHeader.GL_ATC_RGB_AMD; glBaseInternalFormat = KTXHeader.GL_RGB; break; } - case TextureFormat.ATC_RGBA8: //can use QCompress to convert + case TextureFormat.ATC_RGBA8: //透明通道很奇怪? { + q_format = (int)QFORMAT.Q_FORMAT_ATC_RGBA_EXPLICIT_ALPHA; glInternalFormat = KTXHeader.GL_ATC_RGBA_EXPLICIT_ALPHA_AMD; glBaseInternalFormat = KTXHeader.GL_RGBA; break; @@ -541,20 +581,14 @@ namespace Unity_Studio case TextureFormat.EAC_RG: case TextureFormat.EAC_RG_SIGNED: preloadData.extension = ".pvr"; preloadData.exportSize += 52; break; - //case TextureFormat.PVRTC_RGB2: - //case TextureFormat.PVRTC_RGBA2: - //case TextureFormat.PVRTC_RGB4: - //case TextureFormat.PVRTC_RGBA4: + case TextureFormat.RHalf: + case TextureFormat.RGHalf: + case TextureFormat.RGBAHalf: + case TextureFormat.RFloat: + case TextureFormat.RGFloat: + case TextureFormat.RGBAFloat: case TextureFormat.ATC_RGB4: case TextureFormat.ATC_RGBA8: - //case TextureFormat.ETC_RGB4: - //case TextureFormat.ETC2_RGB: - //case TextureFormat.ETC2_RGBA1: - //case TextureFormat.ETC2_RGBA8: - //case TextureFormat.EAC_R: - //case TextureFormat.EAC_R_SIGNED: - //case TextureFormat.EAC_RG: - //case TextureFormat.EAC_RG_SIGNED: preloadData.extension = ".ktx"; preloadData.exportSize += 68; break; case TextureFormat.ASTC_RGB_4x4: case TextureFormat.ASTC_RGB_5x5: @@ -679,6 +713,13 @@ public class KTXHeader public static int GL_COMPRESSED_RG11_EAC = 0x9272; public static int GL_COMPRESSED_SIGNED_RG11_EAC = 0x9273; + public static int GL_R16F = 0x822D; + public static int GL_RG16F = 0x822F; + public static int GL_RGBA16F = 0x881A; + public static int GL_R32F = 0x822E; + public static int GL_RG32F = 0x8230; + public static int GL_RGBA32F = 0x8814; + // constants for glBaseInternalFormat public static int GL_RED = 0x1903; public static int GL_GREEN = 0x1904; @@ -687,4 +728,128 @@ public class KTXHeader public static int GL_RGB = 0x1907; public static int GL_RGBA = 0x1908; public static int GL_RG = 0x8227; -} \ No newline at end of file +} + +//from TextureConverter.h +public enum QFORMAT +{ + // General formats + Q_FORMAT_RGBA_8UI = 1, + Q_FORMAT_RGBA_8I, + Q_FORMAT_RGB5_A1UI, + Q_FORMAT_RGBA_4444, + Q_FORMAT_RGBA_16UI, + Q_FORMAT_RGBA_16I, + Q_FORMAT_RGBA_32UI, + Q_FORMAT_RGBA_32I, + + Q_FORMAT_PALETTE_8_RGBA_8888, + Q_FORMAT_PALETTE_8_RGBA_5551, + Q_FORMAT_PALETTE_8_RGBA_4444, + Q_FORMAT_PALETTE_4_RGBA_8888, + Q_FORMAT_PALETTE_4_RGBA_5551, + Q_FORMAT_PALETTE_4_RGBA_4444, + Q_FORMAT_PALETTE_1_RGBA_8888, + Q_FORMAT_PALETTE_8_RGB_888, + Q_FORMAT_PALETTE_8_RGB_565, + Q_FORMAT_PALETTE_4_RGB_888, + Q_FORMAT_PALETTE_4_RGB_565, + + Q_FORMAT_R2_GBA10UI, + Q_FORMAT_RGB10_A2UI, + Q_FORMAT_RGB10_A2I, + Q_FORMAT_RGBA_F, + Q_FORMAT_RGBA_HF, + + Q_FORMAT_RGB9_E5, // Last five bits are exponent bits (Read following section in GLES3 spec: "3.8.17 Shared Exponent Texture Color Conversion") + Q_FORMAT_RGB_8UI, + Q_FORMAT_RGB_8I, + Q_FORMAT_RGB_565, + Q_FORMAT_RGB_16UI, + Q_FORMAT_RGB_16I, + Q_FORMAT_RGB_32UI, + Q_FORMAT_RGB_32I, + + Q_FORMAT_RGB_F, + Q_FORMAT_RGB_HF, + Q_FORMAT_RGB_11_11_10_F, + + Q_FORMAT_RG_F, + Q_FORMAT_RG_HF, + Q_FORMAT_RG_32UI, + Q_FORMAT_RG_32I, + Q_FORMAT_RG_16I, + Q_FORMAT_RG_16UI, + Q_FORMAT_RG_8I, + Q_FORMAT_RG_8UI, + Q_FORMAT_RG_S88, + + Q_FORMAT_R_32UI, + Q_FORMAT_R_32I, + Q_FORMAT_R_F, + Q_FORMAT_R_16F, + Q_FORMAT_R_16I, + Q_FORMAT_R_16UI, + Q_FORMAT_R_8I, + Q_FORMAT_R_8UI, + + Q_FORMAT_LUMINANCE_ALPHA_88, + Q_FORMAT_LUMINANCE_8, + Q_FORMAT_ALPHA_8, + + Q_FORMAT_LUMINANCE_ALPHA_F, + Q_FORMAT_LUMINANCE_F, + Q_FORMAT_ALPHA_F, + Q_FORMAT_LUMINANCE_ALPHA_HF, + Q_FORMAT_LUMINANCE_HF, + Q_FORMAT_ALPHA_HF, + Q_FORMAT_DEPTH_16, + Q_FORMAT_DEPTH_24, + Q_FORMAT_DEPTH_24_STENCIL_8, + Q_FORMAT_DEPTH_32, + + Q_FORMAT_BGR_565, + Q_FORMAT_BGRA_8888, + Q_FORMAT_BGRA_5551, + Q_FORMAT_BGRX_8888, + Q_FORMAT_BGRA_4444, + // Compressed formats + Q_FORMAT_ATITC_RGBA, + Q_FORMAT_ATC_RGBA_EXPLICIT_ALPHA = Q_FORMAT_ATITC_RGBA, + Q_FORMAT_ATITC_RGB, + Q_FORMAT_ATC_RGB = Q_FORMAT_ATITC_RGB, + Q_FORMAT_ATC_RGBA_INTERPOLATED_ALPHA, + Q_FORMAT_ETC1_RGB8, + Q_FORMAT_3DC_X, + Q_FORMAT_3DC_XY, + + Q_FORMAT_ETC2_RGB8, + Q_FORMAT_ETC2_RGBA8, + Q_FORMAT_ETC2_RGB8_PUNCHTHROUGH_ALPHA1, + Q_FORMAT_ETC2_SRGB8, + Q_FORMAT_ETC2_SRGB8_ALPHA8, + Q_FORMAT_ETC2_SRGB8_PUNCHTHROUGH_ALPHA1, + Q_FORMAT_EAC_R_SIGNED, + Q_FORMAT_EAC_R_UNSIGNED, + Q_FORMAT_EAC_RG_SIGNED, + Q_FORMAT_EAC_RG_UNSIGNED, + + Q_FORMAT_S3TC_DXT1_RGB, + Q_FORMAT_S3TC_DXT1_RGBA, + Q_FORMAT_S3TC_DXT3_RGBA, + Q_FORMAT_S3TC_DXT5_RGBA, + + // YUV formats + Q_FORMAT_AYUV_32, + Q_FORMAT_I444_24, + Q_FORMAT_YUYV_16, + Q_FORMAT_UYVY_16, + Q_FORMAT_I420_12, + Q_FORMAT_YV12_12, + Q_FORMAT_NV21_12, + Q_FORMAT_NV12_12, + + // ASTC Format + Q_FORMAT_ASTC_8, + Q_FORMAT_ASTC_16, +}; \ No newline at end of file diff --git a/Unity Studio/UnityStudioForm.cs b/Unity Studio/UnityStudioForm.cs index d000623..164ce1c 100644 --- a/Unity Studio/UnityStudioForm.cs +++ b/Unity Studio/UnityStudioForm.cs @@ -77,6 +77,9 @@ namespace Unity_Studio [DllImport("PVRTexLibWrapper.dll", CallingConvention = CallingConvention.Cdecl)] private static extern void DecompressPVR(byte[] buffer, IntPtr bmp, int len); + [DllImport("TextureConverterWrapper.dll", CallingConvention = CallingConvention.Cdecl)] + private static extern void Ponvert(byte[] buffer, IntPtr bmp, int nWidth, int nHeight, int len, int type); + private void loadFile_Click(object sender, System.EventArgs e) { @@ -1222,8 +1225,12 @@ namespace Unity_Studio } else if (asset.extension == ".ktx") { - StatusStripUpdate("Unsupported image for preview. Can export the ktx file."); - imageTexture = null; + imageTexture = new Bitmap(m_Texture2D.m_Width, m_Texture2D.m_Height); + var rect = new Rectangle(0, 0, m_Texture2D.m_Width, m_Texture2D.m_Height); + BitmapData bmd = imageTexture.LockBits(rect, ImageLockMode.WriteOnly, PixelFormat.Format32bppArgb); + Ponvert(m_Texture2D.image_data, bmd.Scan0, m_Texture2D.m_Width, m_Texture2D.m_Height, m_Texture2D.image_data_size, m_Texture2D.q_format); + imageTexture.UnlockBits(bmd); + imageTexture.RotateFlip(RotateFlipType.RotateNoneFlipY); } else { @@ -3129,7 +3136,7 @@ namespace Unity_Studio ImageFormat format = null; var convert = (bool)Properties.Settings.Default["convertTexture"]; var oldextension = exportFileextension; - if (convert && (exportFileextension == ".dds" || exportFileextension == ".pvr" || exportFileextension == ".astc")) + if (convert && exportFileextension != ".tex") { string str = Properties.Settings.Default["convertType"] as string; exportFileextension = "." + str.ToLower(); @@ -3206,8 +3213,22 @@ namespace Unity_Studio } else if (oldextension == ".ktx") { - var ktxdata = Texture2DToKTX(m_Texture2D); - File.WriteAllBytes(exportFullname, ktxdata); + if (convert) + { + var bitmap = new Bitmap(m_Texture2D.m_Width, m_Texture2D.m_Height); + var rect = new Rectangle(0, 0, m_Texture2D.m_Width, m_Texture2D.m_Height); + var bmd = bitmap.LockBits(rect, ImageLockMode.WriteOnly, PixelFormat.Format32bppArgb); + Ponvert(m_Texture2D.image_data, bmd.Scan0, m_Texture2D.m_Width, m_Texture2D.m_Height, m_Texture2D.image_data_size, m_Texture2D.q_format); + bitmap.UnlockBits(bmd); + if (flip) + bitmap.RotateFlip(RotateFlipType.RotateNoneFlipY); + bitmap.Save(exportFullname, format); + } + else + { + var ktxdata = Texture2DToKTX(m_Texture2D); + File.WriteAllBytes(exportFullname, ktxdata); + } } else { diff --git a/Unity Studio/library/x64/TextureConverter.dll b/Unity Studio/library/x64/TextureConverter.dll new file mode 100644 index 0000000..c590124 Binary files /dev/null and b/Unity Studio/library/x64/TextureConverter.dll differ diff --git a/Unity Studio/library/x64/TextureConverterWrapper.dll b/Unity Studio/library/x64/TextureConverterWrapper.dll new file mode 100644 index 0000000..624baee Binary files /dev/null and b/Unity Studio/library/x64/TextureConverterWrapper.dll differ diff --git a/Unity Studio/library/x86/TextureConverter.dll b/Unity Studio/library/x86/TextureConverter.dll new file mode 100644 index 0000000..23ee246 Binary files /dev/null and b/Unity Studio/library/x86/TextureConverter.dll differ diff --git a/Unity Studio/library/x86/TextureConverterWrapper.dll b/Unity Studio/library/x86/TextureConverterWrapper.dll new file mode 100644 index 0000000..8679acf Binary files /dev/null and b/Unity Studio/library/x86/TextureConverterWrapper.dll differ