OSDN Git Service

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