Skip to content

Instantly share code, notes, and snippets.

@mikezila
Created April 12, 2014 21:13

Revisions

  1. Matthew Lawson created this gist Apr 12, 2014.
    71 changes: 71 additions & 0 deletions TGALoader.cs
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,71 @@
    // 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;

    }
    }
    }