| 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 | }
 | 
|---|