3D objects are now loaded directly from .obj
>10s loading time on a nexus 5x, needs rework
This commit is contained in:
168
Assets/OBJImport/TextureLoader.cs
Normal file
168
Assets/OBJImport/TextureLoader.cs
Normal file
@@ -0,0 +1,168 @@
|
||||
/*
|
||||
(C) 2015 AARO4130
|
||||
PARTS OF TGA LOADING CODE (C) 2013 mikezila
|
||||
DO NOT USE PARTS OF, OR THE ENTIRE SCRIPT, AND CLAIM AS YOUR OWN WORK
|
||||
*/
|
||||
|
||||
using System;
|
||||
using UnityEngine;
|
||||
using System.Collections;
|
||||
using System.IO;
|
||||
|
||||
public class TextureLoader : MonoBehaviour
|
||||
{
|
||||
public static Texture2D LoadTGA(string fileName)
|
||||
{
|
||||
using (var imageFile = File.OpenRead(fileName))
|
||||
{
|
||||
return LoadTGA(imageFile);
|
||||
}
|
||||
}
|
||||
|
||||
public static Texture2D LoadDDSManual(string ddsPath)
|
||||
{
|
||||
try
|
||||
{
|
||||
byte[] ddsBytes = File.ReadAllBytes(ddsPath);
|
||||
|
||||
byte ddsSizeCheck = ddsBytes[4];
|
||||
if (ddsSizeCheck != 124)
|
||||
throw new System.Exception("Invalid DDS DXTn texture. Unable to read"); //this header byte should be 124 for DDS image files
|
||||
|
||||
int height = ddsBytes[13] * 256 + ddsBytes[12];
|
||||
int width = ddsBytes[17] * 256 + ddsBytes[16];
|
||||
|
||||
byte DXTType = ddsBytes[87];
|
||||
TextureFormat textureFormat = TextureFormat.DXT5;
|
||||
if (DXTType == 49)
|
||||
{
|
||||
textureFormat = TextureFormat.DXT1;
|
||||
// Debug.Log ("DXT1");
|
||||
}
|
||||
|
||||
if (DXTType == 53)
|
||||
{
|
||||
textureFormat = TextureFormat.DXT5;
|
||||
// Debug.Log ("DXT5");
|
||||
}
|
||||
int DDS_HEADER_SIZE = 128;
|
||||
byte[] dxtBytes = new byte[ddsBytes.Length - DDS_HEADER_SIZE];
|
||||
Buffer.BlockCopy(ddsBytes, DDS_HEADER_SIZE, dxtBytes, 0, ddsBytes.Length - DDS_HEADER_SIZE);
|
||||
|
||||
System.IO.FileInfo finf = new System.IO.FileInfo(ddsPath);
|
||||
Texture2D texture = new Texture2D(width, height, textureFormat, false);
|
||||
texture.LoadRawTextureData(dxtBytes);
|
||||
texture.Apply();
|
||||
texture.name = finf.Name;
|
||||
|
||||
return (texture);
|
||||
}
|
||||
catch (System.Exception)
|
||||
{
|
||||
Debug.LogError("Error: Could not load DDS");
|
||||
return new Texture2D(8, 8);
|
||||
}
|
||||
}
|
||||
|
||||
public static void SetNormalMap(ref Texture2D tex)
|
||||
{
|
||||
Color[] pixels = tex.GetPixels();
|
||||
for (int i = 0; i < pixels.Length; i++)
|
||||
{
|
||||
Color temp = pixels[i];
|
||||
temp.r = pixels[i].g;
|
||||
temp.a = pixels[i].r;
|
||||
pixels[i] = temp;
|
||||
}
|
||||
tex.SetPixels(pixels);
|
||||
}
|
||||
|
||||
public static Texture2D LoadTexture(string fn, bool normalMap = false)
|
||||
{
|
||||
if (!File.Exists(fn))
|
||||
return null;
|
||||
|
||||
string ext = Path.GetExtension(fn).ToLower();
|
||||
if (ext == ".png" || ext == ".jpg")
|
||||
{
|
||||
Texture2D t2d = new Texture2D(1, 1);
|
||||
t2d.LoadImage(File.ReadAllBytes(fn));
|
||||
if (normalMap)
|
||||
SetNormalMap(ref t2d);
|
||||
return t2d;
|
||||
}
|
||||
else if (ext == ".dds")
|
||||
{
|
||||
Texture2D returnTex = LoadDDSManual(fn);
|
||||
if (normalMap)
|
||||
SetNormalMap(ref returnTex);
|
||||
return returnTex;
|
||||
}
|
||||
else if (ext == ".tga")
|
||||
{
|
||||
Texture2D returnTex = LoadTGA(fn);
|
||||
if (normalMap)
|
||||
SetNormalMap(ref returnTex);
|
||||
return returnTex;
|
||||
}
|
||||
else
|
||||
{
|
||||
Debug.Log("texture not supported : " + fn);
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
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;
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user