OSDN Git Service

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