2 using System.Collections.Generic;
3 using System.ComponentModel;
8 using System.Windows.Forms;
13 public partial class Form1 : Form
17 InitializeComponent();
20 private void Form1_Load(object sender, EventArgs e)
22 RegistryKey reg = Application.UserAppDataRegistry.CreateSubKey("Config");
23 tbPath.Text = (string)reg.GetValue("OutPath", Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments));
24 tabControl1.SelectedIndex = (int)reg.GetValue("TabPage", 0);
25 tbMqoFile.Text = (string)reg.GetValue("MqoIn", "");
26 tbTsoFileRef.Text = (string)reg.GetValue("Tso", "");
27 tbTsoFile.Text = (string)reg.GetValue("TsoEx", "");
28 tbMergeTso.Text = (string)reg.GetValue("MergeTso", "");
29 rbRefBone.Checked = (int)reg.GetValue("RefBone", 1) == 1;
30 rbOneBone.Checked = (int)reg.GetValue("OneBone", 0) == 1;
31 rbBoneNone.Checked = (int)reg.GetValue("BoneNone", 1) == 1;
32 rbBoneRokDeBone.Checked = (int)reg.GetValue("BoneRokDeBone", 0) == 1;
33 cbMakeSub.Checked = (int)reg.GetValue("MakeSub", 1) == 1;
34 cbCopyTSO.Checked = (int)reg.GetValue("CopyTSO", 1) == 1;
35 cbShowMaterials.Checked = (int)reg.GetValue("ShowMaterials", 0) == 1;
37 reg = Application.UserAppDataRegistry.CreateSubKey("Form1");
38 Bounds = new Rectangle(
39 (int)reg.GetValue("Left", 0),
40 (int)reg.GetValue("Top", 0),
41 (int)reg.GetValue("Width", 640),
42 (int)reg.GetValue("Height", 320));
46 Config config = Config.Instance;
49 private void Form1_FormClosed(object sender, FormClosedEventArgs e)
51 RegistryKey reg = Application.UserAppDataRegistry.CreateSubKey("Config");
52 reg.SetValue("OutPath", tbPath.Text);
53 reg.SetValue("TabPage", tabControl1.SelectedIndex);
54 reg.SetValue("MqoIn", tbMqoFile.Text);
55 reg.SetValue("Tso", tbTsoFileRef.Text);
56 reg.SetValue("TsoEx", tbTsoFile.Text);
57 reg.SetValue("MergeTso", tbMergeTso.Text);
58 reg.SetValue("RefBone", rbRefBone.Checked ? 1 : 0);
59 reg.SetValue("OneBone", rbOneBone.Checked ? 1 : 0);
60 reg.SetValue("BoneNone", rbBoneNone.Checked ? 1 : 0);
61 reg.SetValue("BoneRokDeBone", rbBoneRokDeBone.Checked ? 1 : 0);
62 reg.SetValue("MakeSub", cbMakeSub.Checked ? 1 : 0);
63 reg.SetValue("CopyTSO", cbCopyTSO.Checked ? 1 : 0);
64 reg.SetValue("ShowMaterials", cbShowMaterials.Checked ? 1 : 0);
66 reg = Application.UserAppDataRegistry.CreateSubKey("Form1");
68 if ((this.WindowState & FormWindowState.Minimized) == FormWindowState.Minimized)
70 reg.SetValue("Top", RestoreBounds.Top);
71 reg.SetValue("Left", RestoreBounds.Left);
72 reg.SetValue("Width", RestoreBounds.Width);
73 reg.SetValue("Height", RestoreBounds.Height);
77 reg.SetValue("Top", Top);
78 reg.SetValue("Left", Left);
79 reg.SetValue("Width", Width);
80 reg.SetValue("Height", Height);
86 private void Form1_DragDrop(object sender, DragEventArgs e)
90 if (!e.Data.GetDataPresent(DataFormats.FileDrop))
93 string[] files = (string[])e.Data.GetData(DataFormats.FileDrop);
95 if (files.Length == 0)
98 switch (tabControl1.SelectedIndex)
101 foreach (string i in files)
103 if (Path.GetExtension(i).ToUpper() == ".TSO")
110 switch (Path.GetExtension(files[0]).ToUpper())
112 case ".TSO": tbTsoFileRef.Text = files[0]; break;
113 case ".MQO": tbMqoFile.Text = files[0]; break;
123 catch (Exception exception)
125 Util.ProcessError(exception);
129 private void Form1_DragEnter(object sender, DragEventArgs e)
131 if (!e.Data.GetDataPresent(DataFormats.FileDrop))
134 e.Effect = DragDropEffects.Copy;
137 private void tbMergeTso_DragDrop(object sender, DragEventArgs e)
139 if (!e.Data.GetDataPresent(DataFormats.FileDrop))
142 string[] files = (string[])e.Data.GetData(DataFormats.FileDrop);
144 switch (Path.GetExtension(files[0]).ToUpper())
146 case ".TSO": tbMergeTso.Text = files[0]; break;
150 private void tbMergeTso_DragEnter(object sender, DragEventArgs e)
152 if (!e.Data.GetDataPresent(DataFormats.FileDrop))
155 e.Effect = DragDropEffects.Copy;
158 private void GenerateMqo(string tso_file)
160 string out_path = tbPath.Text;
162 if (cbMakeSub.Checked)
164 out_path = Path.Combine(out_path, Path.GetFileNameWithoutExtension(tso_file));
165 Directory.CreateDirectory(out_path);
170 label2.BackColor = Color.Tomato;
171 label2.ForeColor = Color.White;
172 label2.Text = "Processing";
176 MqoGenerator gen = new MqoGenerator();
177 gen.Generate(tso_file, out_path, rbBoneRokDeBone.Checked);
179 if (cbCopyTSO.Checked)
181 string tso_path = Path.Combine(out_path, Path.GetFileName(tso_file));
183 if (tso_file != tso_path)
184 File.Copy(tso_file, tso_path, true);
189 label2.BackColor = SystemColors.Control;
190 label2.BackColor = label2.Parent.BackColor;
191 label2.ForeColor = SystemColors.ControlText;
192 label2.Text = "Drop TSO File Here!";
196 private void GenerateTso(string file)
198 TSOGeneratorConfig config = new TSOGeneratorConfig();
199 config.ShowMaterials = cbShowMaterials.Checked;
201 if (rbRefBone.Checked)
203 if (tbTsoFileRef.Text == "")
205 TSOGeneratorMqxBone gen = new TSOGeneratorMqxBone(config);
206 gen.Generate(file, tbTsoFileRef.Text, tbTsoFile.Text);
210 TSOGeneratorRefBone gen = new TSOGeneratorRefBone(config);
211 gen.Generate(file, tbTsoFileRef.Text, tbTsoFile.Text);
214 else if (rbOneBone.Checked)
216 TSOGeneratorOneBone gen = new TSOGeneratorOneBone(config);
218 foreach (ListViewItem item in lvObjects.Items)
220 if (item.SubItems[1].Text == "")
222 MessageBox.Show("すべてのオブジェクトにボーンを設定してください");
226 gen.ObjectBoneNames.Add(item.SubItems[0].Text, item.SubItems[1].Text);
229 gen.Generate(file, tbTsoFileRef.Text, tbTsoFile.Text);
233 private void button1_Click(object sender, EventArgs e)
235 FolderBrowserDialog dlg = new FolderBrowserDialog();
236 dlg.SelectedPath = tbPath.Text;
238 if (dlg.ShowDialog() == DialogResult.OK)
239 tbPath.Text = dlg.SelectedPath;
243 private void radioButton1_CheckedChanged(object sender, EventArgs e)
245 EnableControlStuff();
248 private void radioButton2_CheckedChanged(object sender, EventArgs e)
250 EnableControlStuff();
253 private void EnableControlStuff()
255 gbBone.Enabled = rbOneBone.Checked;
258 private void BuildBoneTree(TreeNodeCollection nodes, TSONode node)
260 TreeNode tn = nodes.Add(node.Name);
263 if (node.children != null)
264 foreach (TSONode i in node.children)
265 BuildBoneTree(tn.Nodes, i);
268 private void SaveAssign()
270 foreach (ListViewItem item in lvObjects.Items)
272 string obj = item.SubItems[0].Text;
273 string bone = item.SubItems[1].Text;
275 if (Config.Instance.object_bone_map.ContainsKey(obj))
276 Config.Instance.object_bone_map[obj] = bone;
278 Config.Instance.object_bone_map.Add(obj, bone);
282 private void btnMqoFile_Click(object sender, EventArgs e)
286 OpenFileDialog dlg = new OpenFileDialog();
287 dlg.Filter = "Metasequoia File (*.mqo)|*.mqo";
288 dlg.FileName = tbMqoFile.Text;
290 if (dlg.ShowDialog() == DialogResult.OK)
291 tbMqoFile.Text = dlg.FileName;
293 catch (Exception exception)
295 Util.ProcessError(exception);
299 private void btnTsoFileRef_Click(object sender, EventArgs e)
303 OpenFileDialog dlg = new OpenFileDialog();
304 dlg.Filter = "TSO File (*.tso)|*.tso";
305 dlg.FileName = tbTsoFileRef.Text;
307 if (dlg.ShowDialog() == DialogResult.OK)
308 tbTsoFileRef.Text = dlg.FileName;
310 catch (Exception exception)
312 Util.ProcessError(exception);
316 private void btnTsoFile_Click(object sender, EventArgs e)
320 SaveFileDialog dlg = new SaveFileDialog();
321 dlg.Filter = "TSO File (*.tso)|*.tso";
322 dlg.FileName = tbTsoFile.Text;
324 if (dlg.ShowDialog() == DialogResult.OK)
325 tbTsoFile.Text = dlg.FileName;
327 catch (Exception exception)
329 Util.ProcessError(exception);
333 private void btnRefresh_Click(object sender, EventArgs e)
341 MqoReader mqo = new MqoReader();
342 mqo.Load(tbMqoFile.Text);
344 lvObjects.Items.Clear();
345 foreach (MqoObject obj in mqo.Objects)
347 ListViewItem item = lvObjects.Items.Add(obj.name);
351 if (Config.Instance.object_bone_map.TryGetValue(obj.name, out bone))
352 item.SubItems.Add(bone);
354 item.SubItems.Add("");
358 TSOFile tso = new TSOFile();
359 tso.Load(tbTsoFileRef.Text);
360 tvBones.Visible = false;
361 tvBones.Nodes.Clear();
362 BuildBoneTree(tvBones.Nodes, tso.nodes[0]);
364 tvBones.Nodes[0].EnsureVisible();
366 catch (Exception exception)
368 Util.ProcessError(exception);
372 tvBones.Visible = true;
376 private void btnSelectAll_Click(object sender, EventArgs e)
378 foreach (ListViewItem item in lvObjects.Items)
379 item.Selected = true;
382 private void btnDeselectAll_Click(object sender, EventArgs e)
384 foreach (ListViewItem item in lvObjects.Items)
385 item.Selected = false;
388 private void btnAssign_Click(object sender, EventArgs e)
392 TreeNode node = tvBones.SelectedNode;
396 MessageBox.Show("割り当てるボーンを選択してください");
400 foreach (ListViewItem item in lvObjects.SelectedItems)
401 item.SubItems[1].Text = node.Text;
407 Util.ProcessError(ex);
411 private void btnGenerate_Click(object sender, EventArgs e)
413 Color c = tabPage2.BackColor;
417 tabPage2.BackColor = Color.Tomato;
419 string file = tbMqoFile.Text;
422 catch (Exception exception)
424 Util.ProcessError(exception);
428 tabPage2.BackColor = c;
433 private void AddMergeTso(string[] files)
435 foreach (string file in files)
437 if (Path.GetExtension(files[0]).ToUpper() != ".TSO")
440 if (tvMerge.Nodes.Find(file, false).Length == 0)
442 TreeNode node = tvMerge.Nodes.Add(file);
446 TSOFile tso = new TSOFile();
449 foreach (TSOMesh j in tso.meshes)
451 TreeNode mesh = node.Nodes.Add(j.Name);
459 private void btnMerge_Click(object sender, EventArgs e)
461 Color c = tabPage2.BackColor;
465 tabPage2.BackColor = Color.Tomato;
466 List<TSOMesh> meshes = new List<TSOMesh>();
467 Dictionary<string, Pair<TSOMaterial, int>> materialmap = new Dictionary<string, Pair<TSOMaterial, int>>();
468 Dictionary<string, TSOTex> textures = new Dictionary<string, TSOTex>();
471 foreach (TreeNode node in tvMerge.Nodes)
473 TSOFile tso = new TSOFile();
479 foreach (TSOMesh mesh in tso.meshes)
481 TreeNode[] found = node.Nodes.Find(mesh.Name, false);
483 if (found.Length == 0 || !found[0].Checked)
486 foreach (TSOSubMesh k in mesh.sub_meshes)
487 mtls |= 1ul << k.spec;
492 foreach (TSOMaterial mat in tso.materials)
494 if ((mask & mtls) != 0)
496 if (!materialmap.ContainsKey(mat.Name))
498 Pair<TSOMaterial, int> value = new Pair<TSOMaterial, int>(mat, materialmap.Count);
499 materialmap.Add(mat.Name, value);
501 if (!textures.ContainsKey(mat.ColorTex))
503 TSOTex tex = tso.texturemap[mat.ColorTex];
504 textures.Add(tex.Name, tex);
507 if (!textures.ContainsKey(mat.ShadeTex))
509 TSOTex tex = tso.texturemap[mat.ShadeTex];
510 textures.Add(tex.Name, tex);
519 using (FileStream fs = File.OpenWrite(tbMergeTso.Text))
523 List<TSOTex> texlist = new List<TSOTex>(textures.Values);
524 TSOMaterial[] mtllist = new TSOMaterial[materialmap.Count];
526 foreach (var i in materialmap.Values)
527 mtllist[i.Second] = i.First;
529 foreach (TSOMesh mesh in meshes)
531 foreach (TSOSubMesh sub in mesh.sub_meshes)
533 TSOMaterial spec = mesh.file.materials[sub.spec];
534 sub.spec = materialmap[spec.Name].Second;
538 foreach (TSOTex tex in texlist)
539 TSOFile.ExchangeChannel(tex.data, tex.depth);
541 BinaryWriter bw = new BinaryWriter(fs);
542 TSOWriter.WriteHeader(bw);
543 TSOWriter.Write(bw, last.nodes);
544 TSOWriter.Write(bw, texlist.ToArray());
545 TSOWriter.Write(bw, last.effects);
546 TSOWriter.Write(bw, mtllist);
547 TSOWriter.Write(bw, meshes.ToArray());
550 catch (Exception exception)
552 Util.ProcessError(exception);
556 tabPage2.BackColor = c;
560 private void btnMergeAdd_Click(object sender, EventArgs e)
564 OpenFileDialog dlg = new OpenFileDialog();
565 dlg.Filter = "TSO File(*.tso)|*.tso";
566 dlg.Multiselect = true;
568 if (dlg.ShowDialog() == DialogResult.OK)
569 AddMergeTso(dlg.FileNames);
571 catch (Exception exception)
573 Util.ProcessError(exception);
577 private void btnMergeDel_Click(object sender, EventArgs e)
579 if (tvMerge.SelectedNode != null && tvMerge.SelectedNode.Level == 0)
580 tvMerge.SelectedNode.Remove();
583 private void btnMergeReset_Click(object sender, EventArgs e)
585 tvMerge.Nodes.Clear();
588 private void btnRefMergeTso_Click(object sender, EventArgs e)
592 SaveFileDialog dlg = new SaveFileDialog();
593 dlg.Filter = "TSO File (*.tso)|*.tso";
594 dlg.FileName = tbMergeTso.Text;
596 if (dlg.ShowDialog() == DialogResult.OK)
597 tbMergeTso.Text = dlg.FileName;
599 catch (Exception exception)
601 Util.ProcessError(exception);
605 public static bool bTvMerge_AfterCheck = false;
607 private void tvMerge_AfterCheck(object sender, TreeViewEventArgs e)
609 if (bTvMerge_AfterCheck)
612 bTvMerge_AfterCheck = true;
616 if (e.Node.Level == 0)
618 foreach (TreeNode node in e.Node.Nodes)
619 node.Checked = e.Node.Checked;
625 foreach (TreeNode node in e.Node.Parent.Nodes)
626 if (node.Checked) check = true;
628 e.Node.Parent.Checked = check;
633 bTvMerge_AfterCheck = false;
641 public static void ProcessError(Exception exception)
643 MessageBox.Show(exception.ToString());