ViewVC Help
View File | Revision Log | View Changeset | Root Listing
root/Oni2/OniSplit/Motoko/TextureDatReader.cs
Revision: 1114
Committed: Wed Jan 22 14:08:57 2020 UTC (5 years, 8 months ago) by iritscen
File size: 2423 byte(s)
Log Message:
Adding OniSplit source code (v0.9.99.0). Many thanks to Neo for all his work over the years.

File Contents

# Content
1 using System;
2 using System.Collections.Generic;
3 using Oni.Imaging;
4
5 namespace Oni.Motoko
6 {
7 internal static class TextureDatReader
8 {
9 public static Texture ReadInfo(InstanceDescriptor txmp)
10 {
11 var texture = new Texture
12 {
13 Name = txmp.Name
14 };
15
16 using (var reader = txmp.OpenRead(128))
17 {
18 texture.Flags = (TextureFlags)reader.ReadInt32();
19 texture.Width = reader.ReadInt16();
20 texture.Height = reader.ReadInt16();
21 texture.Format = (TextureFormat)reader.ReadInt32();
22 reader.Skip(8);
23
24 if (txmp.IsMacFile)
25 reader.Skip(4);
26
27 reader.Skip(4);
28 }
29
30 return texture;
31 }
32
33 public static Texture Read(InstanceDescriptor txmp)
34 {
35 var texture = new Texture
36 {
37 Name = txmp.Name
38 };
39
40 int rawOffset;
41
42 using (var reader = txmp.OpenRead(128))
43 {
44 texture.Flags = (TextureFlags)reader.ReadInt32();
45 texture.Width = reader.ReadInt16();
46 texture.Height = reader.ReadInt16();
47 texture.Format = (TextureFormat)reader.ReadInt32();
48 reader.Skip(8);
49
50 if (txmp.IsMacFile)
51 reader.Skip(4);
52
53 rawOffset = reader.ReadInt32();
54 }
55
56 using (var rawReader = txmp.GetSepReader(rawOffset))
57 ReadSurfaces(texture, rawReader);
58
59 return texture;
60 }
61
62 private static void ReadSurfaces(Texture texture, BinaryReader reader)
63 {
64 var format = texture.Format.ToSurfaceFormat();
65 int width = texture.Width;
66 int height = texture.Height;
67 bool hasMipMaps = (texture.Flags & TextureFlags.HasMipMaps) != 0;
68
69 do
70 {
71 var surface = new Surface(width, height, format);
72 reader.Read(surface.Data, 0, surface.Data.Length);
73 texture.Surfaces.Add(surface);
74
75 width = Math.Max(width >> 1, 1);
76 height = Math.Max(height >> 1, 1);
77
78 } while (hasMipMaps && (width > 1 || height > 1));
79 }
80 }
81 }