public static void TGAToTexture(TexInfo Texture, bool mipmaps)
{
GameDatabase.TextureInfo texture = Texture.texture;
TextureConverter.InitImageBuffer();
FileStream tgaStream = new FileStream(Texture.filename, FileMode.Open, FileAccess.Read);
tgaStream.Position = 0;
tgaStream.Read(imageBuffer, 0, MAX_IMAGE_SIZE);
tgaStream.Close();
byte imgType = imageBuffer[2];
int width = imageBuffer[12] | (imageBuffer[13] << 8);
int height = imageBuffer[14] | (imageBuffer[15] << 8);
if (Texture.loadOriginalFirst)
{
Texture.Resize(width, height);
}
int depth = imageBuffer[16];
bool alpha = depth == 32 ? true : false;
TextureFormat texFormat = depth == 32 ? TextureFormat.RGBA32 : TextureFormat.RGB24;
if (texture.isNormalMap)
{
texFormat = TextureFormat.ARGB32;
}
bool convertToNormalFormat = texture.isNormalMap ? true : false;
Texture2D tex = texture.texture;
Color32[] colors = new Color32[width * height];
int n = 18;
if (imgType == 2)
{
for (int i = 0; i < width * height; i++)
{
colors[i].b = imageBuffer[n++];
colors[i].g = imageBuffer[n++];
colors[i].r = imageBuffer[n++];
if (alpha)
{
colors[i].a = imageBuffer[n++];
}
else
{
colors[i].a = 255;
}
if (convertToNormalFormat)
{
colors[i].a = colors[i].r;
colors[i].r = colors[i].g;
colors[i].b = colors[i].g;
}
}
}
else if (imgType == 10)
{
int i = 0;
int run = 0;
while (i < width * height)
{
run = imageBuffer[n++];
if ((run & 0x80) != 0)
{
run = (run ^ 0x80) + 1;
colors[i].b = imageBuffer[n++];
colors[i].g = imageBuffer[n++];
colors[i].r = imageBuffer[n++];
if (alpha)
{
colors[i].a = imageBuffer[n++];
}
else
{
colors[i].a = 255;
}
if (convertToNormalFormat)
{
colors[i].a = colors[i].r;
colors[i].r = colors[i].g;
colors[i].b = colors[i].g;
}
i++;
for (int c = 1; c < run; c++, i++)
{
colors[i] = colors[i - 1];
}
}
else
{
run += 1;
for (int c = 0; c < run; c++, i++)
{
colors[i].b = imageBuffer[n++];
colors[i].g = imageBuffer[n++];
colors[i].r = imageBuffer[n++];
if (alpha)
{
colors[i].a = imageBuffer[n++];
}
else
{
colors[i].a = 255;
}
if (convertToNormalFormat)
{
colors[i].a = colors[i].r;
colors[i].r = colors[i].g;
colors[i].b = colors[i].g;
}
}
}
}
}
else
{
ActiveTextureManagement.DBGLog("TGA format is not supported!");
}
if (Texture.needsResize)
{
colors = TextureConverter.ResizePixels(colors, width, height, Texture.resizeWidth, Texture.resizeHeight);
width = Texture.resizeWidth;
height = Texture.resizeHeight;
}
tex.Resize((int)width, (int)height, texFormat, mipmaps);
tex.SetPixels32(colors);
tex.Apply(mipmaps, false);
}