/
TextureImport.cs
128 lines (123 loc) · 5.13 KB
/
TextureImport.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
// MIT License - Copyright (c) Callum McGing
// This file is subject to the terms and conditions defined in
// LICENSE, which is part of this source code package
using System;
using System.Collections.Generic;
using System.IO;
using TeximpNet.Compression;
using LibreLancer;
namespace LancerEdit
{
public enum DDSFormat
{
Uncompressed = CompressionFormat.BGRA,
DXT1 = CompressionFormat.DXT1,
DXT1a = CompressionFormat.DXT1a,
DXT3 = CompressionFormat.DXT3,
DXT5 = CompressionFormat.DXT5
}
public enum MipmapMethod
{
None = -1,
Box = TeximpNet.ImageFilter.Box,
Bicubic = TeximpNet.ImageFilter.Bicubic,
Bilinear = TeximpNet.ImageFilter.Bilinear,
Bspline = TeximpNet.ImageFilter.Bspline,
CatmullRom = TeximpNet.ImageFilter.CatmullRom,
Lanczos3 = TeximpNet.ImageFilter.Lanczos3
}
public class TextureImport
{
static bool first = true;
public static void LoadLibraries()
{
if (first)
{
if (Platform.RunningOS == OS.Linux)
{
TeximpNet.Unmanaged.FreeImageLibrary.Instance.LoadLibrary("libfreeimage.so.3");
var mypath = Path.GetDirectoryName(typeof(TextureImport).Assembly.Location);
TeximpNet.Unmanaged.NvTextureToolsLibrary.Instance.LoadLibrary(Path.Combine(mypath, "libnvtt.so"));
}
else if (Platform.RunningOS == OS.Windows)
{
TeximpNet.Unmanaged.FreeImageLibrary.Instance.LoadLibrary("FreeImage32.dll", "FreeImage64.dll");
TeximpNet.Unmanaged.NvTextureToolsLibrary.Instance.LoadLibrary("nvtt32.dll", "nvtt64.dll");
}
first = false;
}
}
static List<TeximpNet.Surface> GenerateMipmapsRGBA(string input, MipmapMethod mipm, bool flip)
{
List<TeximpNet.Surface> mips = new List<TeximpNet.Surface>();
var surface = TeximpNet.Surface.LoadFromFile(input);
if (flip) surface.FlipVertically();
surface.ConvertTo(TeximpNet.ImageConversion.To32Bits);
surface.GenerateMipMaps(mips, (TeximpNet.ImageFilter)mipm);
return mips;
}
public static byte[] TGANoMipmap(string input, bool flip)
{
LoadLibraries();
using(var stream = new MemoryStream()) {
using(var surface = TeximpNet.Surface.LoadFromFile(input)) {
if (flip) surface.FlipVertically();
surface.ConvertTo(TeximpNet.ImageConversion.To32Bits);
surface.SaveToStream(TeximpNet.ImageFormat.TARGA, stream);
}
return stream.ToArray();
}
}
public static unsafe List<LUtfNode> TGAMipmaps(string input, MipmapMethod mipm, bool flip)
{
LoadLibraries();
var nodes = new List<LUtfNode>();
var mips = GenerateMipmapsRGBA(input, mipm, flip);
for (int i = 0; i < mips.Count; i++) {
using(var stream = new MemoryStream()) {
mips[i].SaveToStream(TeximpNet.ImageFormat.TARGA, stream);
var n = new LUtfNode() { Name = "MIP" + i, Data = stream.ToArray() };
nodes.Add(n);
mips[i].Dispose();
}
}
return nodes;
}
public static byte[] CreateDDS(string input, DDSFormat format, MipmapMethod mipm, bool slow, bool flip)
{
LoadLibraries();
using (var stream = new MemoryStream())
{
using (var compress = new Compressor())
{
compress.Input.GenerateMipmaps = false;
List<TeximpNet.Surface> toDispose = null;
if (mipm == MipmapMethod.None)
{
using (var surface = TeximpNet.Surface.LoadFromFile(input))
{
if (flip) surface.FlipVertically();
compress.Input.SetData(surface);
}
} else {
var mips = GenerateMipmapsRGBA(input, mipm, flip);
compress.Input.SetTextureLayout(TextureType.Texture2D, mips[0].Width, mips[0].Height);
for (int i = 0; i < mips.Count; i++) {
compress.Input.SetMipmapData(mips[i], i);
}
toDispose = mips;
}
compress.Compression.Format = (CompressionFormat)format;
compress.Compression.Quality = slow ? CompressionQuality.Production : CompressionQuality.Normal;
compress.Compression.SetBGRAPixelFormat();
compress.Process(stream);
if(toDispose != null) {
foreach (var sfc in toDispose)
sfc.Dispose();
}
}
return stream.ToArray();
}
}
}
}