OSDN Git Service

assign node.path and node.local_position.
[tdcgexplorer/tso2mqo.git] / TSOWriter.cs
1 using System;
2 using System.Collections.Generic;
3 using System.IO;
4 using System.Text;
5
6 namespace Tso2MqoGui
7 {
8     public class TSOWriter
9     {
10         public static void WriteHeader(BinaryWriter bw)
11         {
12             bw.Write(0x314F5354);
13         }
14
15         public static void Write(BinaryWriter bw, string s)
16         {
17             foreach (byte i in Encoding.Default.GetBytes(s))
18                 bw.Write(i);
19
20             bw.Write((byte)0);
21         }
22
23         public static void Write(BinaryWriter bw, string[] s)
24         {
25             int n = s[s.Length - 1] == "" ? s.Length - 1 : s.Length;
26
27             bw.Write(n);
28
29             for (int i = 0; i < n; ++i)
30                 Write(bw, s[i]);
31         }
32
33         public static void Write(BinaryWriter bw, TSONode[] items)
34         {
35             bw.Write(items.Length);
36
37             foreach (var i in items)
38                 Write(bw, i);
39
40             bw.Write(items.Length);
41
42             foreach (var i in items)
43                 Write(bw, i.Matrix);
44         }
45
46         public static void Write(BinaryWriter bw, TSONode item)
47         {
48             Write(bw, item.Name);
49         }
50
51         public static void Write(BinaryWriter bw, Matrix44 item)
52         {
53             bw.Write(item.M11); bw.Write(item.M12); bw.Write(item.M13); bw.Write(item.M14);
54             bw.Write(item.M21); bw.Write(item.M22); bw.Write(item.M23); bw.Write(item.M24);
55             bw.Write(item.M31); bw.Write(item.M32); bw.Write(item.M33); bw.Write(item.M34);
56             bw.Write(item.M41); bw.Write(item.M42); bw.Write(item.M43); bw.Write(item.M44);
57         }
58
59         public static void Write(BinaryWriter bw, TSOTex[] items)
60         {
61             bw.Write(items.Length);
62
63             foreach (var i in items)
64                 Write(bw, i);
65         }
66
67         public static void Write(BinaryWriter bw, TSOTex item)
68         {
69             Write(bw, item.name);
70             Write(bw, item.File);
71             bw.Write(item.Width);
72             bw.Write(item.Height);
73             bw.Write(item.Depth);
74             bw.Write(item.data, 0, item.data.Length);
75         }
76
77         public static void Write(BinaryWriter bw, TSOEffect[] items)
78         {
79             bw.Write(items.Length);
80
81             foreach (var i in items)
82                 Write(bw, i);
83         }
84
85         public static void Write(BinaryWriter bw, TSOEffect item)
86         {
87             Write(bw, item.Name);
88             Write(bw, item.Code.Split('\n'));
89         }
90
91         public static void Write(BinaryWriter bw, TSOMaterial[] items)
92         {
93             bw.Write(items.Length);
94
95             foreach (var i in items)
96                 Write(bw, i);
97         }
98
99         public static void Write(BinaryWriter bw, TSOMaterial item)
100         {
101             Write(bw, item.Name);
102             Write(bw, item.File);
103             Write(bw, item.Code.Split('\n'));
104         }
105
106         public static void Write(BinaryWriter bw, TSOMesh[] items)
107         {
108             bw.Write(items.Length);
109
110             foreach (var i in items)
111                 Write(bw, i);
112         }
113
114         public static void Write(BinaryWriter bw, TSOMesh item)
115         {
116             Write(bw, item.Name);
117             Write(bw, item.Matrix);
118             bw.Write(1);
119             Write(bw, item.sub_meshes);
120         }
121
122         public static void Write(BinaryWriter bw, TSOSubMesh[] items)
123         {
124             bw.Write(items.Length);
125
126             foreach (var i in items)
127                 Write(bw, i);
128         }
129
130         public static void Write(BinaryWriter bw, TSOSubMesh item)
131         {
132             bw.Write(item.spec);
133             bw.Write(item.numbones);
134
135             foreach (int k in item.bones)
136                 bw.Write(k);
137
138             bw.Write(item.numvertices);
139
140             foreach (Vertex k in item.vertices)
141                 Write(bw, k);
142         }
143
144         public unsafe static void Write(BinaryWriter bw, Vertex v)
145         {
146             uint idx0 = v.Idx;
147             byte* idx = (byte*)(&idx0);
148             List<int> idxs = new List<int>(4);
149             List<float> wgts = new List<float>(4);
150
151             if (v.Wgt.x > 0) { idxs.Add(idx[0]); wgts.Add(v.Wgt.x); }
152             if (v.Wgt.y > 0) { idxs.Add(idx[1]); wgts.Add(v.Wgt.y); }
153             if (v.Wgt.z > 0) { idxs.Add(idx[2]); wgts.Add(v.Wgt.z); }
154             if (v.Wgt.w > 0) { idxs.Add(idx[3]); wgts.Add(v.Wgt.w); }
155
156             bw.Write(v.Pos.X); bw.Write(v.Pos.Y); bw.Write(v.Pos.Z);
157             bw.Write(v.Nrm.X); bw.Write(v.Nrm.Y); bw.Write(v.Nrm.Z);
158             bw.Write(v.Tex.X); bw.Write(v.Tex.Y);
159
160             bw.Write(wgts.Count);
161
162             for (int i = 0, n = idxs.Count; i < n; ++i)
163             {
164                 bw.Write(idxs[i]);
165                 bw.Write(wgts[i]);
166             }
167         }
168     }
169 }