OSDN Git Service

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