No longer use DevIL

This commit is contained in:
Perfare 2017-02-01 20:23:09 +08:00
parent 0ad6e6a456
commit c2f7f0a92d
11 changed files with 231 additions and 3595 deletions

View File

@ -4,7 +4,6 @@ using System.Drawing.Imaging;
using System.IO; using System.IO;
using System.Linq; using System.Linq;
using System.Runtime.InteropServices; using System.Runtime.InteropServices;
using Tao.DevIl;
namespace Unity_Studio namespace Unity_Studio
{ {
@ -82,7 +81,7 @@ namespace Unity_Studio
public int bytesOfKeyValueData = 0; public int bytesOfKeyValueData = 0;
//KTX End //KTX End
//TextureConverter //TextureConverter
public int q_format; public QFORMAT q_format;
[DllImport("PVRTexLibWrapper.dll", CallingConvention = CallingConvention.Cdecl)] [DllImport("PVRTexLibWrapper.dll", CallingConvention = CallingConvention.Cdecl)]
private static extern void DecompressPVR(byte[] buffer, IntPtr bmp, int len); private static extern void DecompressPVR(byte[] buffer, IntPtr bmp, int len);
@ -185,6 +184,7 @@ namespace Unity_Studio
switch (m_TextureFormat) switch (m_TextureFormat)
{ {
//TODO 导出到DDS容器时应该用原像素还是转换以后的像素
case TextureFormat.Alpha8: //test pass case TextureFormat.Alpha8: //test pass
{ {
/*dwFlags2 = 0x2; /*dwFlags2 = 0x2;
@ -192,84 +192,150 @@ namespace Unity_Studio
dwRBitMask = 0x0; dwRBitMask = 0x0;
dwGBitMask = 0x0; dwGBitMask = 0x0;
dwBBitMask = 0x0; dwBBitMask = 0x0;
dwABitMask = 0xFF; *///透明通道丢失? dwABitMask = 0xFF; */
//转ARGB32
var bytes = Enumerable.Repeat<byte>(0xFF, image_data_size * 4).ToArray(); //转BGRA32
for (int i = 0; i < image_data_size; i++) var BGRA32 = Enumerable.Repeat<byte>(0xFF, image_data_size * 4).ToArray();
for (var i = 0; i < image_data_size; i++)
{ {
bytes[i * 4] = image_data[i]; BGRA32[i * 4 + 3] = image_data[i];
} }
image_data = bytes; image_data = BGRA32;
image_data_size = image_data_size * 4; image_data_size = BGRA32.Length;
dwFlags2 = 0x41; dwFlags2 = 0x41;
dwRGBBitCount = 0x20; dwRGBBitCount = 0x20;
dwRBitMask = 0xFF00; dwRBitMask = 0xFF0000;
dwGBitMask = 0xFF0000; dwGBitMask = 0xFF00;
dwBBitMask = -16777216; dwBBitMask = 0xFF;
dwABitMask = 0xFF; dwABitMask = -16777216;
break; break;
} }
case TextureFormat.ARGB4444: //test pass case TextureFormat.ARGB4444: //test pass
{ {
if (sourceFile.platform == 11) //swap bytes for Xbox confirmed, PS3 not encountered SwapBytesForXbox(sourceFile.platform);
{
for (int i = 0; i < (image_data_size / 2); i++)
{
byte b0 = image_data[i * 2];
image_data[i * 2] = image_data[i * 2 + 1];
image_data[i * 2 + 1] = b0;
}
}
dwFlags2 = 0x41; /*dwFlags2 = 0x41;
dwRGBBitCount = 0x10; dwRGBBitCount = 0x10;
dwRBitMask = 0xF00; dwRBitMask = 0xF00;
dwGBitMask = 0xF0; dwGBitMask = 0xF0;
dwBBitMask = 0xF; dwBBitMask = 0xF;
dwABitMask = 0xF000; dwABitMask = 0xF000;*/
//转BGRA32
var BGRA32 = new byte[image_data_size * 2];
for (var i = 0; i < image_data_size / 2; i++)
{
var pixelNew = new byte[4];
var pixelOldShort = BitConverter.ToUInt16(image_data, i * 2);
pixelNew[0] = (byte)(pixelOldShort & 0x000f);
pixelNew[1] = (byte)((pixelOldShort & 0x00f0) >> 4);
pixelNew[2] = (byte)((pixelOldShort & 0x0f00) >> 8);
pixelNew[3] = (byte)((pixelOldShort & 0xf000) >> 12);
// convert range
for (var j = 0; j < 4; j++)
pixelNew[j] = (byte)((pixelNew[j] << 4) | pixelNew[j]);
pixelNew.CopyTo(BGRA32, i * 4);
}
image_data = BGRA32;
image_data_size = BGRA32.Length;
dwFlags2 = 0x41;
dwRGBBitCount = 0x20;
dwRBitMask = 0xFF0000;
dwGBitMask = 0xFF00;
dwBBitMask = 0xFF;
dwABitMask = -16777216;
break; break;
} }
case TextureFormat.RGB24: //test pass case TextureFormat.RGB24: //test pass
{ {
dwFlags2 = 0x40; /*dwFlags2 = 0x40;
dwRGBBitCount = 0x18; dwRGBBitCount = 0x18;
dwRBitMask = 0xFF; dwRBitMask = 0xFF;
dwGBitMask = 0xFF00; dwGBitMask = 0xFF00;
dwBBitMask = 0xFF0000; dwBBitMask = 0xFF0000;
dwABitMask = 0x0; dwABitMask = 0x0;*/
//转BGRA32
var BGRA32 = new byte[image_data_size / 3 * 4];
for (var i = 0; i < image_data_size / 3; i++)
{
BGRA32[i * 4] = image_data[i * 3 + 2];
BGRA32[i * 4 + 1] = image_data[i * 3 + 1];
BGRA32[i * 4 + 2] = image_data[i * 3 + 0];
BGRA32[i * 4 + 3] = 255;
}
image_data = BGRA32;
image_data_size = BGRA32.Length;
dwFlags2 = 0x41;
dwRGBBitCount = 0x20;
dwRBitMask = 0xFF0000;
dwGBitMask = 0xFF00;
dwBBitMask = 0xFF;
dwABitMask = -16777216;
break; break;
} }
case TextureFormat.RGBA32: //test pass case TextureFormat.RGBA32: //test pass
{ {
dwFlags2 = 0x41; /*dwFlags2 = 0x41;
dwRGBBitCount = 0x20; dwRGBBitCount = 0x20;
dwRBitMask = 0xFF; dwRBitMask = 0xFF;
dwGBitMask = 0xFF00; dwGBitMask = 0xFF00;
dwBBitMask = 0xFF0000; dwBBitMask = 0xFF0000;
dwABitMask = -16777216;*/
//转BGRA32
var BGRA32 = new byte[image_data_size];
for (var i = 0; i < image_data_size; i += 4)
{
BGRA32[i] = image_data[i + 2];
BGRA32[i + 1] = image_data[i + 1];
BGRA32[i + 2] = image_data[i + 0];
BGRA32[i + 3] = image_data[i + 3];
}
image_data = BGRA32;
dwFlags2 = 0x41;
dwRGBBitCount = 0x20;
dwRBitMask = 0xFF0000;
dwGBitMask = 0xFF00;
dwBBitMask = 0xFF;
dwABitMask = -16777216; dwABitMask = -16777216;
break; break;
} }
case TextureFormat.ARGB32://test pass case TextureFormat.ARGB32://test pass
{ {
dwFlags2 = 0x41; /*dwFlags2 = 0x41;
dwRGBBitCount = 0x20; dwRGBBitCount = 0x20;
dwRBitMask = 0xFF00; dwRBitMask = 0xFF00;
dwGBitMask = 0xFF0000; dwGBitMask = 0xFF0000;
dwBBitMask = -16777216; dwBBitMask = -16777216;
dwABitMask = 0xFF; dwABitMask = 0xFF;*/
//转BGRA32
var BGRA32 = new byte[image_data_size];
for (var i = 0; i < image_data_size; i += 4)
{
BGRA32[i] = image_data[i + 3];
BGRA32[i + 1] = image_data[i + 2];
BGRA32[i + 2] = image_data[i + 1];
BGRA32[i + 3] = image_data[i + 0];
}
image_data = BGRA32;
dwFlags2 = 0x41;
dwRGBBitCount = 0x20;
dwRBitMask = 0xFF0000;
dwGBitMask = 0xFF00;
dwBBitMask = 0xFF;
dwABitMask = -16777216;
break; break;
} }
case TextureFormat.RGB565: //test pass case TextureFormat.RGB565: //test pass
{ {
if (sourceFile.platform == 11) SwapBytesForXbox(sourceFile.platform);
{
for (int i = 0; i < (image_data_size / 2); i++)
{
byte b0 = image_data[i * 2];
image_data[i * 2] = image_data[i * 2 + 1];
image_data[i * 2 + 1] = b0;
}
}
dwFlags2 = 0x40; dwFlags2 = 0x40;
dwRGBBitCount = 0x10; dwRGBBitCount = 0x10;
@ -279,11 +345,11 @@ namespace Unity_Studio
dwABitMask = 0x0; dwABitMask = 0x0;
break; break;
} }
case TextureFormat.R16: case TextureFormat.R16: //test pass
{ {
//转BGRA32 //转BGRA32
var BGRA32 = new byte[image_data.Length * 2]; var BGRA32 = new byte[image_data_size * 2];
for (var i = 0; i < image_data.Length; i += 2) for (var i = 0; i < image_data_size; i += 2)
{ {
float f = Half.ToHalf(image_data, i); float f = Half.ToHalf(image_data, i);
BGRA32[i * 2 + 2] = (byte)Math.Ceiling(f * 255);//R BGRA32[i * 2 + 2] = (byte)Math.Ceiling(f * 255);//R
@ -291,6 +357,7 @@ namespace Unity_Studio
} }
image_data = BGRA32; image_data = BGRA32;
image_data_size *= 2; image_data_size *= 2;
dwFlags2 = 0x41; dwFlags2 = 0x41;
dwRGBBitCount = 0x20; dwRGBBitCount = 0x20;
dwRBitMask = 0xFF0000; dwRBitMask = 0xFF0000;
@ -301,15 +368,7 @@ namespace Unity_Studio
} }
case TextureFormat.DXT1: //test pass case TextureFormat.DXT1: //test pass
{ {
if (sourceFile.platform == 11) //X360 only, PS3 not SwapBytesForXbox(sourceFile.platform);
{
for (int i = 0; i < (image_data_size / 2); i++)
{
byte b0 = image_data[i * 2];
image_data[i * 2] = image_data[i * 2 + 1];
image_data[i * 2 + 1] = b0;
}
}
if (m_MipMap) { dwPitchOrLinearSize = m_Height * m_Width / 2; } if (m_MipMap) { dwPitchOrLinearSize = m_Height * m_Width / 2; }
dwFlags2 = 0x4; dwFlags2 = 0x4;
@ -319,19 +378,13 @@ namespace Unity_Studio
dwGBitMask = 0x0; dwGBitMask = 0x0;
dwBBitMask = 0x0; dwBBitMask = 0x0;
dwABitMask = 0x0; dwABitMask = 0x0;
q_format = QFORMAT.Q_FORMAT_S3TC_DXT1_RGB;
break; break;
} }
case TextureFormat.DXT5: //test pass case TextureFormat.DXT5: //test pass
{ {
if (sourceFile.platform == 11) //X360, PS3 not SwapBytesForXbox(sourceFile.platform);
{
for (int i = 0; i < (image_data_size / 2); i++)
{
byte b0 = image_data[i * 2];
image_data[i * 2] = image_data[i * 2 + 1];
image_data[i * 2 + 1] = b0;
}
}
if (m_MipMap) { dwPitchOrLinearSize = m_Height * m_Width / 2; } if (m_MipMap) { dwPitchOrLinearSize = m_Height * m_Width / 2; }
dwFlags2 = 0x4; dwFlags2 = 0x4;
@ -341,16 +394,43 @@ namespace Unity_Studio
dwGBitMask = 0x0; dwGBitMask = 0x0;
dwBBitMask = 0x0; dwBBitMask = 0x0;
dwABitMask = 0x0; dwABitMask = 0x0;
q_format = QFORMAT.Q_FORMAT_S3TC_DXT5_RGBA;
break; break;
} }
case TextureFormat.RGBA4444: //test pass case TextureFormat.RGBA4444: //test pass
{ {
dwFlags2 = 0x41; /*dwFlags2 = 0x41;
dwRGBBitCount = 0x10; dwRGBBitCount = 0x10;
dwRBitMask = 0xF000; dwRBitMask = 0xF000;
dwGBitMask = 0xF00; dwGBitMask = 0xF00;
dwBBitMask = 0xF0; dwBBitMask = 0xF0;
dwABitMask = 0xF; dwABitMask = 0xF;*/
//转BGRA32
var BGRA32 = new byte[image_data_size * 2];
for (var i = 0; i < image_data_size / 2; i++)
{
var pixelNew = new byte[4];
var pixelOldShort = BitConverter.ToUInt16(image_data, i * 2);
pixelNew[0] = (byte)((pixelOldShort & 0x00f0) >> 4);
pixelNew[1] = (byte)((pixelOldShort & 0x0f00) >> 8);
pixelNew[2] = (byte)((pixelOldShort & 0xf000) >> 12);
pixelNew[3] = (byte)(pixelOldShort & 0x000f);
// convert range
for (var j = 0; j < 4; j++)
pixelNew[j] = (byte)((pixelNew[j] << 4) | pixelNew[j]);
pixelNew.CopyTo(BGRA32, i * 4);
}
image_data = BGRA32;
image_data_size = BGRA32.Length;
dwFlags2 = 0x41;
dwRGBBitCount = 0x20;
dwRBitMask = 0xFF0000;
dwGBitMask = 0xFF00;
dwBBitMask = 0xFF;
dwABitMask = -16777216;
break; break;
} }
case TextureFormat.BGRA32: //test pass case TextureFormat.BGRA32: //test pass
@ -363,52 +443,51 @@ namespace Unity_Studio
dwABitMask = -16777216; dwABitMask = -16777216;
break; break;
} }
case TextureFormat.RHalf://Not sure case TextureFormat.RHalf: //test pass
{ {
q_format = (int)QFORMAT.Q_FORMAT_R_16F; q_format = QFORMAT.Q_FORMAT_R_16F;
glInternalFormat = KTXHeader.GL_R16F; glInternalFormat = KTXHeader.GL_R16F;
glBaseInternalFormat = KTXHeader.GL_RED; glBaseInternalFormat = KTXHeader.GL_RED;
break; break;
} }
case TextureFormat.RGHalf://Not sure case TextureFormat.RGHalf: //test pass
{ {
q_format = (int)QFORMAT.Q_FORMAT_RG_HF; q_format = QFORMAT.Q_FORMAT_RG_HF;
glInternalFormat = KTXHeader.GL_RG16F; glInternalFormat = KTXHeader.GL_RG16F;
glBaseInternalFormat = KTXHeader.GL_RG; glBaseInternalFormat = KTXHeader.GL_RG;
break; break;
} }
case TextureFormat.RGBAHalf://Not sure case TextureFormat.RGBAHalf: //test pass
{ {
q_format = (int)QFORMAT.Q_FORMAT_RGBA_HF; q_format = QFORMAT.Q_FORMAT_RGBA_HF;
glInternalFormat = KTXHeader.GL_RGBA16F; glInternalFormat = KTXHeader.GL_RGBA16F;
glBaseInternalFormat = KTXHeader.GL_RGBA; glBaseInternalFormat = KTXHeader.GL_RGBA;
break; break;
} }
case TextureFormat.RFloat://Not sure case TextureFormat.RFloat: //test pass
{ {
q_format = (int)QFORMAT.Q_FORMAT_R_F; q_format = QFORMAT.Q_FORMAT_R_F;
glInternalFormat = KTXHeader.GL_R32F; glInternalFormat = KTXHeader.GL_R32F;
glBaseInternalFormat = KTXHeader.GL_RED; glBaseInternalFormat = KTXHeader.GL_RED;
break; break;
} }
case TextureFormat.RGFloat://Not sure case TextureFormat.RGFloat: //test pass
{ {
q_format = (int)QFORMAT.Q_FORMAT_RG_F; q_format = QFORMAT.Q_FORMAT_RG_F;
glInternalFormat = KTXHeader.GL_RG32F; glInternalFormat = KTXHeader.GL_RG32F;
glBaseInternalFormat = KTXHeader.GL_RG; glBaseInternalFormat = KTXHeader.GL_RG;
break; break;
} }
case TextureFormat.RGBAFloat://Not sure case TextureFormat.RGBAFloat: //test pass
{ {
q_format = (int)QFORMAT.Q_FORMAT_RGBA_F; q_format = QFORMAT.Q_FORMAT_RGBA_F;
glInternalFormat = KTXHeader.GL_RGBA32F; glInternalFormat = KTXHeader.GL_RGBA32F;
glBaseInternalFormat = KTXHeader.GL_RGBA; glBaseInternalFormat = KTXHeader.GL_RGBA;
break; break;
} }
case TextureFormat.YUY2://Not sure case TextureFormat.YUY2: //test pass
{ {
pvrPixelFormat = 17; pvrPixelFormat = 17;
q_format = (int)QFORMAT.Q_FORMAT_YUYV_16;
break; break;
} }
case TextureFormat.BC4: case TextureFormat.BC4:
@ -466,6 +545,7 @@ namespace Unity_Studio
glBaseInternalFormat = KTXHeader.GL_RGBA; glBaseInternalFormat = KTXHeader.GL_RGBA;
break; break;
} }
case TextureFormat.ETC_RGB4_3DS: //test pass
case TextureFormat.ETC_RGB4: //test pass case TextureFormat.ETC_RGB4: //test pass
{ {
pvrPixelFormat = 6; pvrPixelFormat = 6;
@ -475,42 +555,42 @@ namespace Unity_Studio
} }
case TextureFormat.ATC_RGB4: //test pass case TextureFormat.ATC_RGB4: //test pass
{ {
q_format = (int)QFORMAT.Q_FORMAT_ATITC_RGB; q_format = QFORMAT.Q_FORMAT_ATITC_RGB;
glInternalFormat = KTXHeader.GL_ATC_RGB_AMD; glInternalFormat = KTXHeader.GL_ATC_RGB_AMD;
glBaseInternalFormat = KTXHeader.GL_RGB; glBaseInternalFormat = KTXHeader.GL_RGB;
break; break;
} }
case TextureFormat.ATC_RGBA8: //test pass case TextureFormat.ATC_RGBA8: //test pass
{ {
q_format = (int)QFORMAT.Q_FORMAT_ATC_RGBA_INTERPOLATED_ALPHA; q_format = QFORMAT.Q_FORMAT_ATC_RGBA_INTERPOLATED_ALPHA;
glInternalFormat = KTXHeader.GL_ATC_RGBA_INTERPOLATED_ALPHA_AMD; glInternalFormat = KTXHeader.GL_ATC_RGBA_INTERPOLATED_ALPHA_AMD;
glBaseInternalFormat = KTXHeader.GL_RGBA; glBaseInternalFormat = KTXHeader.GL_RGBA;
break; break;
} }
case TextureFormat.EAC_R: case TextureFormat.EAC_R: //test pass
{ {
q_format = (int)QFORMAT.Q_FORMAT_EAC_R_UNSIGNED; q_format = QFORMAT.Q_FORMAT_EAC_R_UNSIGNED;
glInternalFormat = KTXHeader.GL_COMPRESSED_R11_EAC; glInternalFormat = KTXHeader.GL_COMPRESSED_R11_EAC;
glBaseInternalFormat = KTXHeader.GL_RED; glBaseInternalFormat = KTXHeader.GL_RED;
break; break;
} }
case TextureFormat.EAC_R_SIGNED: case TextureFormat.EAC_R_SIGNED: //test pass
{ {
q_format = (int)QFORMAT.Q_FORMAT_EAC_R_SIGNED; q_format = QFORMAT.Q_FORMAT_EAC_R_SIGNED;
glInternalFormat = KTXHeader.GL_COMPRESSED_SIGNED_R11_EAC; glInternalFormat = KTXHeader.GL_COMPRESSED_SIGNED_R11_EAC;
glBaseInternalFormat = KTXHeader.GL_RED; glBaseInternalFormat = KTXHeader.GL_RED;
break; break;
} }
case TextureFormat.EAC_RG: case TextureFormat.EAC_RG: //test pass
{ {
q_format = (int)QFORMAT.Q_FORMAT_EAC_RG_UNSIGNED; q_format = QFORMAT.Q_FORMAT_EAC_RG_UNSIGNED;
glInternalFormat = KTXHeader.GL_COMPRESSED_RG11_EAC; glInternalFormat = KTXHeader.GL_COMPRESSED_RG11_EAC;
glBaseInternalFormat = KTXHeader.GL_RG; glBaseInternalFormat = KTXHeader.GL_RG;
break; break;
} }
case TextureFormat.EAC_RG_SIGNED: case TextureFormat.EAC_RG_SIGNED: //test pass
{ {
q_format = (int)QFORMAT.Q_FORMAT_EAC_RG_SIGNED; q_format = QFORMAT.Q_FORMAT_EAC_RG_SIGNED;
glInternalFormat = KTXHeader.GL_COMPRESSED_SIGNED_RG11_EAC; glInternalFormat = KTXHeader.GL_COMPRESSED_SIGNED_RG11_EAC;
glBaseInternalFormat = KTXHeader.GL_RG; glBaseInternalFormat = KTXHeader.GL_RG;
break; break;
@ -529,6 +609,7 @@ namespace Unity_Studio
glBaseInternalFormat = KTXHeader.GL_RGBA; glBaseInternalFormat = KTXHeader.GL_RGBA;
break; break;
} }
case TextureFormat.ETC_RGBA8_3DS: //test pass
case TextureFormat.ETC2_RGBA8: //test pass case TextureFormat.ETC2_RGBA8: //test pass
{ {
pvrPixelFormat = 23; pvrPixelFormat = 23;
@ -572,9 +653,6 @@ namespace Unity_Studio
pvrPixelFormat = 40; pvrPixelFormat = 40;
break; break;
} }
case TextureFormat.ETC_RGB4_3DS:
case TextureFormat.ETC_RGBA8_3DS:
break;
} }
} }
else else
@ -622,6 +700,8 @@ namespace Unity_Studio
case TextureFormat.ASTC_RGBA_8x8: case TextureFormat.ASTC_RGBA_8x8:
case TextureFormat.ASTC_RGBA_10x10: case TextureFormat.ASTC_RGBA_10x10:
case TextureFormat.ASTC_RGBA_12x12: case TextureFormat.ASTC_RGBA_12x12:
case TextureFormat.ETC_RGB4_3DS:
case TextureFormat.ETC_RGBA8_3DS:
preloadData.extension = ".pvr"; break; preloadData.extension = ".pvr"; break;
case TextureFormat.RHalf: case TextureFormat.RHalf:
case TextureFormat.RGHalf: case TextureFormat.RGHalf:
@ -640,8 +720,6 @@ namespace Unity_Studio
case TextureFormat.EAC_RG: case TextureFormat.EAC_RG:
case TextureFormat.EAC_RG_SIGNED: case TextureFormat.EAC_RG_SIGNED:
preloadData.extension = ".ktx"; break; preloadData.extension = ".ktx"; break;
default:
preloadData.extension = "_" + type + ".tex"; break;
} }
switch (m_FilterMode) switch (m_FilterMode)
@ -666,6 +744,19 @@ namespace Unity_Studio
} }
} }
private void SwapBytesForXbox(int platform)
{
if (platform == 11) //swap bytes for Xbox confirmed, PS3 not encountered
{
for (var i = 0; i < (image_data_size / 2); i++)
{
var b0 = image_data[i * 2];
image_data[i * 2] = image_data[i * 2 + 1];
image_data[i * 2 + 1] = b0;
}
}
}
public byte[] ConvertToContainer() public byte[] ConvertToContainer()
{ {
switch (m_TextureFormat) switch (m_TextureFormat)
@ -703,6 +794,8 @@ namespace Unity_Studio
case TextureFormat.ASTC_RGBA_8x8: case TextureFormat.ASTC_RGBA_8x8:
case TextureFormat.ASTC_RGBA_10x10: case TextureFormat.ASTC_RGBA_10x10:
case TextureFormat.ASTC_RGBA_12x12: case TextureFormat.ASTC_RGBA_12x12:
case TextureFormat.ETC_RGB4_3DS:
case TextureFormat.ETC_RGBA8_3DS:
return ConvertToPVR(); return ConvertToPVR();
case TextureFormat.RHalf: case TextureFormat.RHalf:
case TextureFormat.RGHalf: case TextureFormat.RGHalf:
@ -806,13 +899,13 @@ namespace Unity_Studio
case TextureFormat.RGB24: case TextureFormat.RGB24:
case TextureFormat.RGBA32: case TextureFormat.RGBA32:
case TextureFormat.ARGB32: case TextureFormat.ARGB32:
case TextureFormat.RGB565:
case TextureFormat.R16: case TextureFormat.R16:
case TextureFormat.DXT1:
case TextureFormat.DXT5:
case TextureFormat.RGBA4444: case TextureFormat.RGBA4444:
case TextureFormat.BGRA32: case TextureFormat.BGRA32:
bitmap = DDSToBitmap(ConvertToDDS()); bitmap = BGRA32ToBitmap();
break;
case TextureFormat.RGB565:
bitmap = RGB565ToBitmap();
break; break;
case TextureFormat.YUY2: case TextureFormat.YUY2:
case TextureFormat.PVRTC_RGB2: case TextureFormat.PVRTC_RGB2:
@ -835,8 +928,12 @@ namespace Unity_Studio
case TextureFormat.ASTC_RGBA_8x8: case TextureFormat.ASTC_RGBA_8x8:
case TextureFormat.ASTC_RGBA_10x10: case TextureFormat.ASTC_RGBA_10x10:
case TextureFormat.ASTC_RGBA_12x12: case TextureFormat.ASTC_RGBA_12x12:
case TextureFormat.ETC_RGB4_3DS:
case TextureFormat.ETC_RGBA8_3DS:
bitmap = PVRToBitmap(ConvertToPVR()); bitmap = PVRToBitmap(ConvertToPVR());
break; break;
case TextureFormat.DXT1:
case TextureFormat.DXT5:
case TextureFormat.RHalf: case TextureFormat.RHalf:
case TextureFormat.RGHalf: case TextureFormat.RGHalf:
case TextureFormat.RGBAHalf: case TextureFormat.RGBAHalf:
@ -851,46 +948,38 @@ namespace Unity_Studio
case TextureFormat.EAC_RG_SIGNED: case TextureFormat.EAC_RG_SIGNED:
bitmap = TextureConverter(); bitmap = TextureConverter();
break; break;
case TextureFormat.BC4:
case TextureFormat.BC5:
case TextureFormat.BC6H:
case TextureFormat.BC7:
//texgenpack
break;
case TextureFormat.DXT1Crunched:
case TextureFormat.DXT5Crunched:
//crunch
break;
} }
if (bitmap != null && flip) if (bitmap != null && flip)
bitmap.RotateFlip(RotateFlipType.RotateNoneFlipY); bitmap.RotateFlip(RotateFlipType.RotateNoneFlipY);
return bitmap; return bitmap;
} }
private static Bitmap DDSToBitmap(byte[] DDSData) private Bitmap BGRA32ToBitmap()
{ {
// Create a DevIL image "name" (which is actually a number) var hObject = GCHandle.Alloc(image_data, GCHandleType.Pinned);
int img_name; var pObject = hObject.AddrOfPinnedObject();
Il.ilGenImages(1, out img_name); var bitmap = new Bitmap(m_Width, m_Height, m_Width * 4, PixelFormat.Format32bppArgb, pObject);
Il.ilBindImage(img_name); hObject.Free();
return bitmap;
}
// Load the DDS file into the bound DevIL image private Bitmap RGB565ToBitmap()
Il.ilLoadL(Il.IL_DDS, DDSData, DDSData.Length); {
var hObject = GCHandle.Alloc(image_data, GCHandleType.Pinned);
// Set a few size variables that will simplify later code var pObject = hObject.AddrOfPinnedObject();
var bitmap = new Bitmap(m_Width, m_Height, m_Width * 2, PixelFormat.Format16bppRgb565, pObject);
var ImgWidth = Il.ilGetInteger(Il.IL_IMAGE_WIDTH); hObject.Free();
var ImgHeight = Il.ilGetInteger(Il.IL_IMAGE_HEIGHT); return bitmap;
var rect = new Rectangle(0, 0, ImgWidth, ImgHeight);
// Convert the DevIL image to a pixel byte array to copy into Bitmap
Il.ilConvertImage(Il.IL_BGRA, Il.IL_UNSIGNED_BYTE);
// Create a Bitmap to copy the image into, and prepare it to get data
var bmp = new Bitmap(ImgWidth, ImgHeight);
var bmd = bmp.LockBits(rect, ImageLockMode.WriteOnly, PixelFormat.Format32bppArgb);
// Copy the pixel byte array from the DevIL image to the Bitmap
Il.ilCopyPixels(0, 0, 0,
Il.ilGetInteger(Il.IL_IMAGE_WIDTH),
Il.ilGetInteger(Il.IL_IMAGE_HEIGHT),
1, Il.IL_BGRA, Il.IL_UNSIGNED_BYTE,
bmd.Scan0);
// Clean up and return Bitmap
Il.ilDeleteImages(1, ref img_name);
bmp.UnlockBits(bmd);
return bmp;
} }
private Bitmap PVRToBitmap(byte[] pvrdata) private Bitmap PVRToBitmap(byte[] pvrdata)
@ -909,12 +998,25 @@ namespace Unity_Studio
var bitmap = new Bitmap(m_Width, m_Height); var bitmap = new Bitmap(m_Width, m_Height);
var rect = new Rectangle(0, 0, m_Width, m_Height); var rect = new Rectangle(0, 0, m_Width, m_Height);
var bmd = bitmap.LockBits(rect, ImageLockMode.WriteOnly, PixelFormat.Format32bppArgb); var bmd = bitmap.LockBits(rect, ImageLockMode.WriteOnly, PixelFormat.Format32bppArgb);
Ponvert(image_data, bmd.Scan0, m_Width, m_Height, image_data_size, q_format); Ponvert(image_data, bmd.Scan0, m_Width, m_Height, image_data_size, (int)q_format);
bitmap.UnlockBits(bmd); bitmap.UnlockBits(bmd);
//if (glBaseInternalFormat == KTXHeader.GL_RED || glBaseInternalFormat == KTXHeader.GL_RG) if (glBaseInternalFormat == KTXHeader.GL_RED || glBaseInternalFormat == KTXHeader.GL_RG)
// FixAlpha(bitmap); FixAlpha(bitmap);
return bitmap; return bitmap;
} }
private void FixAlpha(Bitmap imageTexture)
{
for (var y = 0; y < imageTexture.Height; y++)
{
for (var x = 0; x < imageTexture.Width; x++)
{
var color = imageTexture.GetPixel(x, y);
color = Color.FromArgb(255, color.R, color.G, color.B);
imageTexture.SetPixel(x, y, color);
}
}
}
} }

View File

@ -88,9 +88,6 @@
<Reference Include="System.Drawing" /> <Reference Include="System.Drawing" />
<Reference Include="System.Windows.Forms" /> <Reference Include="System.Windows.Forms" />
<Reference Include="System.Xml" /> <Reference Include="System.Xml" />
<Reference Include="Tao.DevIl">
<HintPath>library\Tao.DevIl.dll</HintPath>
</Reference>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<Compile Include="7zip\Common\CommandLineParser.cs"> <Compile Include="7zip\Common\CommandLineParser.cs">

View File

@ -1,22 +0,0 @@
MIT License
Copyright ©2003-2006 Tao Framework Team
http://www.taoframework.com
All rights reserved.
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

Binary file not shown.

File diff suppressed because it is too large Load Diff

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.