71 lines
2.5 KiB
C#
71 lines
2.5 KiB
C#
// This was made by aaro4130 on the Unity forums. Thanks boss!
|
|
// It's been optimized and slimmed down for the purpose of loading Quake 3 TGA textures from memory streams.
|
|
|
|
using System;
|
|
using System.IO;
|
|
using UnityEngine;
|
|
|
|
public static class TGALoader
|
|
{
|
|
|
|
public static Texture2D LoadTGA(string fileName)
|
|
{
|
|
using (var imageFile = File.OpenRead(fileName))
|
|
{
|
|
return LoadTGA(imageFile);
|
|
}
|
|
}
|
|
|
|
public static Texture2D LoadTGA(Stream TGAStream)
|
|
{
|
|
|
|
using (BinaryReader r = new BinaryReader(TGAStream))
|
|
{
|
|
// Skip some header info we don't care about.
|
|
// Even if we did care, we have to move the stream seek point to the beginning,
|
|
// as the previous method in the workflow left it at the end.
|
|
r.BaseStream.Seek(12, SeekOrigin.Begin);
|
|
|
|
short width = r.ReadInt16();
|
|
short height = r.ReadInt16();
|
|
int bitDepth = r.ReadByte();
|
|
|
|
// Skip a byte of header information we don't care about.
|
|
r.BaseStream.Seek(1, SeekOrigin.Current);
|
|
|
|
Texture2D tex = new Texture2D(width, height);
|
|
Color32[] pulledColors = new Color32[width * height];
|
|
|
|
if (bitDepth == 32)
|
|
{
|
|
for (int i = 0; i < width * height; i++)
|
|
{
|
|
byte red = r.ReadByte();
|
|
byte green = r.ReadByte();
|
|
byte blue = r.ReadByte();
|
|
byte alpha = r.ReadByte();
|
|
|
|
pulledColors [i] = new Color32(blue, green, red, alpha);
|
|
}
|
|
} else if (bitDepth == 24)
|
|
{
|
|
for (int i = 0; i < width * height; i++)
|
|
{
|
|
byte red = r.ReadByte();
|
|
byte green = r.ReadByte();
|
|
byte blue = r.ReadByte();
|
|
|
|
pulledColors [i] = new Color32(blue, green, red, 1);
|
|
}
|
|
} else
|
|
{
|
|
throw new Exception("TGA texture had non 32/24 bit depth.");
|
|
}
|
|
|
|
tex.SetPixels32(pulledColors);
|
|
tex.Apply();
|
|
return tex;
|
|
|
|
}
|
|
}
|
|
} |