1 | using System;
|
---|
2 | using System.Collections.Generic;
|
---|
3 | using Oni.Imaging;
|
---|
4 |
|
---|
5 | namespace Oni.Motoko
|
---|
6 | {
|
---|
7 | internal class TextureDatWriter
|
---|
8 | {
|
---|
9 | private readonly Importer importer;
|
---|
10 |
|
---|
11 | public static void Write(Texture texture, string outputDirPath)
|
---|
12 | {
|
---|
13 | var writer = new DatWriter();
|
---|
14 | Write(texture, writer);
|
---|
15 | writer.Write(outputDirPath);
|
---|
16 | }
|
---|
17 |
|
---|
18 | public static void Write(Texture texture, Importer importer)
|
---|
19 | {
|
---|
20 | var writer = new TextureDatWriter(importer);
|
---|
21 | writer.Write(texture);
|
---|
22 | }
|
---|
23 |
|
---|
24 | private TextureDatWriter(Importer importer)
|
---|
25 | {
|
---|
26 | this.importer = importer;
|
---|
27 | }
|
---|
28 |
|
---|
29 | private void Write(Texture texture)
|
---|
30 | {
|
---|
31 | var txmp = importer.CreateInstance(TemplateTag.TXMP, texture.Name);
|
---|
32 | int rawOffset = importer.RawWriter.Align32();
|
---|
33 | var flags = texture.Flags;
|
---|
34 | ImporterDescriptor envMapTxmp = null;
|
---|
35 |
|
---|
36 | if (texture.EnvMap != null)
|
---|
37 | {
|
---|
38 | envMapTxmp = importer.CreateInstance(TemplateTag.TXMP, texture.EnvMap.Name);
|
---|
39 | flags |= TextureFlags.HasEnvMap;
|
---|
40 | }
|
---|
41 |
|
---|
42 | if (texture.Surfaces.Count > 1)
|
---|
43 | {
|
---|
44 | flags |= TextureFlags.HasMipMaps;
|
---|
45 | }
|
---|
46 |
|
---|
47 | using (var writer = txmp.OpenWrite(128))
|
---|
48 | {
|
---|
49 | writer.Write((int)flags);
|
---|
50 | writer.WriteInt16(texture.Width);
|
---|
51 | writer.WriteInt16(texture.Height);
|
---|
52 | writer.Write((int)texture.Format);
|
---|
53 | writer.Write(0);
|
---|
54 | writer.Write(envMapTxmp);
|
---|
55 | writer.Write(rawOffset);
|
---|
56 | writer.Skip(12);
|
---|
57 | }
|
---|
58 |
|
---|
59 | foreach (var surface in texture.Surfaces)
|
---|
60 | importer.RawWriter.Write(surface.Data);
|
---|
61 | }
|
---|
62 | }
|
---|
63 | }
|
---|