mirror of
https://github.com/aelurum/AssetStudio.git
synced 2025-06-03 00:58:13 -04:00
No longer use DevIL
This commit is contained in:
parent
0ad6e6a456
commit
c2f7f0a92d
@ -4,7 +4,6 @@ using System.Drawing.Imaging;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using System.Runtime.InteropServices;
|
||||
using Tao.DevIl;
|
||||
|
||||
namespace Unity_Studio
|
||||
{
|
||||
@ -82,7 +81,7 @@ namespace Unity_Studio
|
||||
public int bytesOfKeyValueData = 0;
|
||||
//KTX End
|
||||
//TextureConverter
|
||||
public int q_format;
|
||||
public QFORMAT q_format;
|
||||
|
||||
[DllImport("PVRTexLibWrapper.dll", CallingConvention = CallingConvention.Cdecl)]
|
||||
private static extern void DecompressPVR(byte[] buffer, IntPtr bmp, int len);
|
||||
@ -185,6 +184,7 @@ namespace Unity_Studio
|
||||
|
||||
switch (m_TextureFormat)
|
||||
{
|
||||
//TODO 导出到DDS容器时应该用原像素还是转换以后的像素?
|
||||
case TextureFormat.Alpha8: //test pass
|
||||
{
|
||||
/*dwFlags2 = 0x2;
|
||||
@ -192,84 +192,150 @@ namespace Unity_Studio
|
||||
dwRBitMask = 0x0;
|
||||
dwGBitMask = 0x0;
|
||||
dwBBitMask = 0x0;
|
||||
dwABitMask = 0xFF; *///透明通道丢失?
|
||||
//转ARGB32
|
||||
var bytes = Enumerable.Repeat<byte>(0xFF, image_data_size * 4).ToArray();
|
||||
for (int i = 0; i < image_data_size; i++)
|
||||
dwABitMask = 0xFF; */
|
||||
|
||||
//转BGRA32
|
||||
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_size = image_data_size * 4;
|
||||
image_data = BGRA32;
|
||||
image_data_size = BGRA32.Length;
|
||||
|
||||
dwFlags2 = 0x41;
|
||||
dwRGBBitCount = 0x20;
|
||||
dwRBitMask = 0xFF00;
|
||||
dwGBitMask = 0xFF0000;
|
||||
dwBBitMask = -16777216;
|
||||
dwABitMask = 0xFF;
|
||||
dwRBitMask = 0xFF0000;
|
||||
dwGBitMask = 0xFF00;
|
||||
dwBBitMask = 0xFF;
|
||||
dwABitMask = -16777216;
|
||||
break;
|
||||
}
|
||||
case TextureFormat.ARGB4444: //test pass
|
||||
{
|
||||
if (sourceFile.platform == 11) //swap bytes for Xbox confirmed, PS3 not encountered
|
||||
{
|
||||
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;
|
||||
}
|
||||
}
|
||||
SwapBytesForXbox(sourceFile.platform);
|
||||
|
||||
dwFlags2 = 0x41;
|
||||
/*dwFlags2 = 0x41;
|
||||
dwRGBBitCount = 0x10;
|
||||
dwRBitMask = 0xF00;
|
||||
dwGBitMask = 0xF0;
|
||||
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;
|
||||
}
|
||||
case TextureFormat.RGB24: //test pass
|
||||
{
|
||||
dwFlags2 = 0x40;
|
||||
/*dwFlags2 = 0x40;
|
||||
dwRGBBitCount = 0x18;
|
||||
dwRBitMask = 0xFF;
|
||||
dwGBitMask = 0xFF00;
|
||||
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;
|
||||
}
|
||||
case TextureFormat.RGBA32: //test pass
|
||||
{
|
||||
dwFlags2 = 0x41;
|
||||
/*dwFlags2 = 0x41;
|
||||
dwRGBBitCount = 0x20;
|
||||
dwRBitMask = 0xFF;
|
||||
dwGBitMask = 0xFF00;
|
||||
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;
|
||||
break;
|
||||
}
|
||||
case TextureFormat.ARGB32://test pass
|
||||
{
|
||||
dwFlags2 = 0x41;
|
||||
/*dwFlags2 = 0x41;
|
||||
dwRGBBitCount = 0x20;
|
||||
dwRBitMask = 0xFF00;
|
||||
dwGBitMask = 0xFF0000;
|
||||
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;
|
||||
}
|
||||
case TextureFormat.RGB565: //test pass
|
||||
{
|
||||
if (sourceFile.platform == 11)
|
||||
{
|
||||
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;
|
||||
}
|
||||
}
|
||||
SwapBytesForXbox(sourceFile.platform);
|
||||
|
||||
dwFlags2 = 0x40;
|
||||
dwRGBBitCount = 0x10;
|
||||
@ -279,11 +345,11 @@ namespace Unity_Studio
|
||||
dwABitMask = 0x0;
|
||||
break;
|
||||
}
|
||||
case TextureFormat.R16:
|
||||
case TextureFormat.R16: //test pass
|
||||
{
|
||||
//转BGRA32
|
||||
var BGRA32 = new byte[image_data.Length * 2];
|
||||
for (var i = 0; i < image_data.Length; i += 2)
|
||||
var BGRA32 = new byte[image_data_size * 2];
|
||||
for (var i = 0; i < image_data_size; i += 2)
|
||||
{
|
||||
float f = Half.ToHalf(image_data, i);
|
||||
BGRA32[i * 2 + 2] = (byte)Math.Ceiling(f * 255);//R
|
||||
@ -291,6 +357,7 @@ namespace Unity_Studio
|
||||
}
|
||||
image_data = BGRA32;
|
||||
image_data_size *= 2;
|
||||
|
||||
dwFlags2 = 0x41;
|
||||
dwRGBBitCount = 0x20;
|
||||
dwRBitMask = 0xFF0000;
|
||||
@ -301,15 +368,7 @@ namespace Unity_Studio
|
||||
}
|
||||
case TextureFormat.DXT1: //test pass
|
||||
{
|
||||
if (sourceFile.platform == 11) //X360 only, PS3 not
|
||||
{
|
||||
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;
|
||||
}
|
||||
}
|
||||
SwapBytesForXbox(sourceFile.platform);
|
||||
|
||||
if (m_MipMap) { dwPitchOrLinearSize = m_Height * m_Width / 2; }
|
||||
dwFlags2 = 0x4;
|
||||
@ -319,19 +378,13 @@ namespace Unity_Studio
|
||||
dwGBitMask = 0x0;
|
||||
dwBBitMask = 0x0;
|
||||
dwABitMask = 0x0;
|
||||
|
||||
q_format = QFORMAT.Q_FORMAT_S3TC_DXT1_RGB;
|
||||
break;
|
||||
}
|
||||
case TextureFormat.DXT5: //test pass
|
||||
{
|
||||
if (sourceFile.platform == 11) //X360, PS3 not
|
||||
{
|
||||
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;
|
||||
}
|
||||
}
|
||||
SwapBytesForXbox(sourceFile.platform);
|
||||
|
||||
if (m_MipMap) { dwPitchOrLinearSize = m_Height * m_Width / 2; }
|
||||
dwFlags2 = 0x4;
|
||||
@ -341,16 +394,43 @@ namespace Unity_Studio
|
||||
dwGBitMask = 0x0;
|
||||
dwBBitMask = 0x0;
|
||||
dwABitMask = 0x0;
|
||||
|
||||
q_format = QFORMAT.Q_FORMAT_S3TC_DXT5_RGBA;
|
||||
break;
|
||||
}
|
||||
case TextureFormat.RGBA4444: //test pass
|
||||
{
|
||||
dwFlags2 = 0x41;
|
||||
/*dwFlags2 = 0x41;
|
||||
dwRGBBitCount = 0x10;
|
||||
dwRBitMask = 0xF000;
|
||||
dwGBitMask = 0xF00;
|
||||
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;
|
||||
}
|
||||
case TextureFormat.BGRA32: //test pass
|
||||
@ -363,52 +443,51 @@ namespace Unity_Studio
|
||||
dwABitMask = -16777216;
|
||||
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;
|
||||
glBaseInternalFormat = KTXHeader.GL_RED;
|
||||
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;
|
||||
glBaseInternalFormat = KTXHeader.GL_RG;
|
||||
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;
|
||||
glBaseInternalFormat = KTXHeader.GL_RGBA;
|
||||
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;
|
||||
glBaseInternalFormat = KTXHeader.GL_RED;
|
||||
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;
|
||||
glBaseInternalFormat = KTXHeader.GL_RG;
|
||||
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;
|
||||
glBaseInternalFormat = KTXHeader.GL_RGBA;
|
||||
break;
|
||||
}
|
||||
case TextureFormat.YUY2://Not sure
|
||||
case TextureFormat.YUY2: //test pass
|
||||
{
|
||||
pvrPixelFormat = 17;
|
||||
q_format = (int)QFORMAT.Q_FORMAT_YUYV_16;
|
||||
break;
|
||||
}
|
||||
case TextureFormat.BC4:
|
||||
@ -466,6 +545,7 @@ namespace Unity_Studio
|
||||
glBaseInternalFormat = KTXHeader.GL_RGBA;
|
||||
break;
|
||||
}
|
||||
case TextureFormat.ETC_RGB4_3DS: //test pass
|
||||
case TextureFormat.ETC_RGB4: //test pass
|
||||
{
|
||||
pvrPixelFormat = 6;
|
||||
@ -475,42 +555,42 @@ namespace Unity_Studio
|
||||
}
|
||||
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;
|
||||
glBaseInternalFormat = KTXHeader.GL_RGB;
|
||||
break;
|
||||
}
|
||||
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;
|
||||
glBaseInternalFormat = KTXHeader.GL_RGBA;
|
||||
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;
|
||||
glBaseInternalFormat = KTXHeader.GL_RED;
|
||||
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;
|
||||
glBaseInternalFormat = KTXHeader.GL_RED;
|
||||
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;
|
||||
glBaseInternalFormat = KTXHeader.GL_RG;
|
||||
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;
|
||||
glBaseInternalFormat = KTXHeader.GL_RG;
|
||||
break;
|
||||
@ -529,6 +609,7 @@ namespace Unity_Studio
|
||||
glBaseInternalFormat = KTXHeader.GL_RGBA;
|
||||
break;
|
||||
}
|
||||
case TextureFormat.ETC_RGBA8_3DS: //test pass
|
||||
case TextureFormat.ETC2_RGBA8: //test pass
|
||||
{
|
||||
pvrPixelFormat = 23;
|
||||
@ -572,9 +653,6 @@ namespace Unity_Studio
|
||||
pvrPixelFormat = 40;
|
||||
break;
|
||||
}
|
||||
case TextureFormat.ETC_RGB4_3DS:
|
||||
case TextureFormat.ETC_RGBA8_3DS:
|
||||
break;
|
||||
}
|
||||
}
|
||||
else
|
||||
@ -622,6 +700,8 @@ namespace Unity_Studio
|
||||
case TextureFormat.ASTC_RGBA_8x8:
|
||||
case TextureFormat.ASTC_RGBA_10x10:
|
||||
case TextureFormat.ASTC_RGBA_12x12:
|
||||
case TextureFormat.ETC_RGB4_3DS:
|
||||
case TextureFormat.ETC_RGBA8_3DS:
|
||||
preloadData.extension = ".pvr"; break;
|
||||
case TextureFormat.RHalf:
|
||||
case TextureFormat.RGHalf:
|
||||
@ -640,8 +720,6 @@ namespace Unity_Studio
|
||||
case TextureFormat.EAC_RG:
|
||||
case TextureFormat.EAC_RG_SIGNED:
|
||||
preloadData.extension = ".ktx"; break;
|
||||
default:
|
||||
preloadData.extension = "_" + type + ".tex"; break;
|
||||
}
|
||||
|
||||
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()
|
||||
{
|
||||
switch (m_TextureFormat)
|
||||
@ -703,6 +794,8 @@ namespace Unity_Studio
|
||||
case TextureFormat.ASTC_RGBA_8x8:
|
||||
case TextureFormat.ASTC_RGBA_10x10:
|
||||
case TextureFormat.ASTC_RGBA_12x12:
|
||||
case TextureFormat.ETC_RGB4_3DS:
|
||||
case TextureFormat.ETC_RGBA8_3DS:
|
||||
return ConvertToPVR();
|
||||
case TextureFormat.RHalf:
|
||||
case TextureFormat.RGHalf:
|
||||
@ -806,13 +899,13 @@ namespace Unity_Studio
|
||||
case TextureFormat.RGB24:
|
||||
case TextureFormat.RGBA32:
|
||||
case TextureFormat.ARGB32:
|
||||
case TextureFormat.RGB565:
|
||||
case TextureFormat.R16:
|
||||
case TextureFormat.DXT1:
|
||||
case TextureFormat.DXT5:
|
||||
case TextureFormat.RGBA4444:
|
||||
case TextureFormat.BGRA32:
|
||||
bitmap = DDSToBitmap(ConvertToDDS());
|
||||
bitmap = BGRA32ToBitmap();
|
||||
break;
|
||||
case TextureFormat.RGB565:
|
||||
bitmap = RGB565ToBitmap();
|
||||
break;
|
||||
case TextureFormat.YUY2:
|
||||
case TextureFormat.PVRTC_RGB2:
|
||||
@ -835,8 +928,12 @@ namespace Unity_Studio
|
||||
case TextureFormat.ASTC_RGBA_8x8:
|
||||
case TextureFormat.ASTC_RGBA_10x10:
|
||||
case TextureFormat.ASTC_RGBA_12x12:
|
||||
case TextureFormat.ETC_RGB4_3DS:
|
||||
case TextureFormat.ETC_RGBA8_3DS:
|
||||
bitmap = PVRToBitmap(ConvertToPVR());
|
||||
break;
|
||||
case TextureFormat.DXT1:
|
||||
case TextureFormat.DXT5:
|
||||
case TextureFormat.RHalf:
|
||||
case TextureFormat.RGHalf:
|
||||
case TextureFormat.RGBAHalf:
|
||||
@ -851,46 +948,38 @@ namespace Unity_Studio
|
||||
case TextureFormat.EAC_RG_SIGNED:
|
||||
bitmap = TextureConverter();
|
||||
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)
|
||||
bitmap.RotateFlip(RotateFlipType.RotateNoneFlipY);
|
||||
return bitmap;
|
||||
}
|
||||
|
||||
private static Bitmap DDSToBitmap(byte[] DDSData)
|
||||
private Bitmap BGRA32ToBitmap()
|
||||
{
|
||||
// Create a DevIL image "name" (which is actually a number)
|
||||
int img_name;
|
||||
Il.ilGenImages(1, out img_name);
|
||||
Il.ilBindImage(img_name);
|
||||
var hObject = GCHandle.Alloc(image_data, GCHandleType.Pinned);
|
||||
var pObject = hObject.AddrOfPinnedObject();
|
||||
var bitmap = new Bitmap(m_Width, m_Height, m_Width * 4, PixelFormat.Format32bppArgb, pObject);
|
||||
hObject.Free();
|
||||
return bitmap;
|
||||
}
|
||||
|
||||
// Load the DDS file into the bound DevIL image
|
||||
Il.ilLoadL(Il.IL_DDS, DDSData, DDSData.Length);
|
||||
|
||||
// Set a few size variables that will simplify later code
|
||||
|
||||
var ImgWidth = Il.ilGetInteger(Il.IL_IMAGE_WIDTH);
|
||||
var ImgHeight = Il.ilGetInteger(Il.IL_IMAGE_HEIGHT);
|
||||
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 RGB565ToBitmap()
|
||||
{
|
||||
var hObject = GCHandle.Alloc(image_data, GCHandleType.Pinned);
|
||||
var pObject = hObject.AddrOfPinnedObject();
|
||||
var bitmap = new Bitmap(m_Width, m_Height, m_Width * 2, PixelFormat.Format16bppRgb565, pObject);
|
||||
hObject.Free();
|
||||
return bitmap;
|
||||
}
|
||||
|
||||
private Bitmap PVRToBitmap(byte[] pvrdata)
|
||||
@ -909,12 +998,25 @@ namespace Unity_Studio
|
||||
var bitmap = new Bitmap(m_Width, m_Height);
|
||||
var rect = new Rectangle(0, 0, m_Width, m_Height);
|
||||
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);
|
||||
//if (glBaseInternalFormat == KTXHeader.GL_RED || glBaseInternalFormat == KTXHeader.GL_RG)
|
||||
// FixAlpha(bitmap);
|
||||
if (glBaseInternalFormat == KTXHeader.GL_RED || glBaseInternalFormat == KTXHeader.GL_RG)
|
||||
FixAlpha(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);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
@ -88,9 +88,6 @@
|
||||
<Reference Include="System.Drawing" />
|
||||
<Reference Include="System.Windows.Forms" />
|
||||
<Reference Include="System.Xml" />
|
||||
<Reference Include="Tao.DevIl">
|
||||
<HintPath>library\Tao.DevIl.dll</HintPath>
|
||||
</Reference>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Compile Include="7zip\Common\CommandLineParser.cs">
|
||||
|
@ -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.
Loading…
x
Reference in New Issue
Block a user