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 TSOGeneratorRefBone gen = new TSOGeneratorRefBone(config);
204 gen.Generate(file, tbTsoFileRef.Text, tbTsoFile.Text);
207 if (rbOneBone.Checked)
209 TSOGeneratorOneBone gen = new TSOGeneratorOneBone(config);
211 foreach (ListViewItem item in lvObjects.Items)
213 if (item.SubItems[1].Text == "")
215 MessageBox.Show("すべてのオブジェクトにボーンを設定してください");
219 gen.ObjectBoneNames.Add(item.SubItems[0].Text, item.SubItems[1].Text);
222 gen.Generate(file, tbTsoFileRef.Text, tbTsoFile.Text);
229 private void button1_Click(object sender, EventArgs e)
231 FolderBrowserDialog dlg = new FolderBrowserDialog();
232 dlg.SelectedPath = tbPath.Text;
234 if (dlg.ShowDialog() == DialogResult.OK)
235 tbPath.Text = dlg.SelectedPath;
239 private void radioButton1_CheckedChanged(object sender, EventArgs e)
241 EnableControlStuff();
244 private void radioButton2_CheckedChanged(object sender, EventArgs e)
246 EnableControlStuff();
249 private void EnableControlStuff()
251 gbBone.Enabled = rbOneBone.Checked;
254 private void BuildBoneTree(TreeNodeCollection nodes, TSONode node)
256 TreeNode tn = nodes.Add(node.ShortName);
259 if (node.children != null)
260 foreach (TSONode i in node.children)
261 BuildBoneTree(tn.Nodes, i);
264 private void SaveAssign()
266 foreach (ListViewItem item in lvObjects.Items)
268 string obj = item.SubItems[0].Text;
269 string bone = item.SubItems[1].Text;
271 if (Config.Instance.object_bone_map.ContainsKey(obj))
272 Config.Instance.object_bone_map[obj] = bone;
274 Config.Instance.object_bone_map.Add(obj, bone);
278 private void btnMqoFile_Click(object sender, EventArgs e)
282 OpenFileDialog dlg = new OpenFileDialog();
283 dlg.Filter = "Metasequoia File (*.mqo)|*.mqo";
284 dlg.FileName = tbMqoFile.Text;
286 if (dlg.ShowDialog() == DialogResult.OK)
287 tbMqoFile.Text = dlg.FileName;
289 catch (Exception exception)
291 Util.ProcessError(exception);
295 private void btnTsoFileRef_Click(object sender, EventArgs e)
299 OpenFileDialog dlg = new OpenFileDialog();
300 dlg.Filter = "TSO File (*.tso)|*.tso";
301 dlg.FileName = tbTsoFileRef.Text;
303 if (dlg.ShowDialog() == DialogResult.OK)
304 tbTsoFileRef.Text = dlg.FileName;
306 catch (Exception exception)
308 Util.ProcessError(exception);
312 private void btnTsoFile_Click(object sender, EventArgs e)
316 SaveFileDialog dlg = new SaveFileDialog();
317 dlg.Filter = "TSO File (*.tso)|*.tso";
318 dlg.FileName = tbTsoFile.Text;
320 if (dlg.ShowDialog() == DialogResult.OK)
321 tbTsoFile.Text = dlg.FileName;
323 catch (Exception exception)
325 Util.ProcessError(exception);
329 private void btnRefresh_Click(object sender, EventArgs e)
337 MqoFile mqo = new MqoFile();
338 mqo.Load(tbMqoFile.Text);
339 lvObjects.Items.Clear();
341 foreach (MqoObject obj in mqo.Objects)
343 ListViewItem item = lvObjects.Items.Add(obj.name);
347 if (Config.Instance.object_bone_map.TryGetValue(obj.name, out bone))
348 item.SubItems.Add(bone);
350 item.SubItems.Add("");
354 TSOFile tso = new TSOFile(tbTsoFileRef.Text);
356 tvBones.Visible = false;
357 tvBones.Nodes.Clear();
358 BuildBoneTree(tvBones.Nodes, tso.nodes[0]);
360 tvBones.Nodes[0].EnsureVisible();
362 catch (Exception exception)
364 Util.ProcessError(exception);
368 tvBones.Visible = true;
372 private void btnSelectAll_Click(object sender, EventArgs e)
374 foreach (ListViewItem item in lvObjects.Items)
375 item.Selected = true;
378 private void btnDeselectAll_Click(object sender, EventArgs e)
380 foreach (ListViewItem item in lvObjects.Items)
381 item.Selected = false;
384 private void btnAssign_Click(object sender, EventArgs e)
388 TreeNode node = tvBones.SelectedNode;
392 MessageBox.Show("割り当てるボーンを選択してください");
396 foreach (ListViewItem item in lvObjects.SelectedItems)
397 item.SubItems[1].Text = node.Text;
403 Util.ProcessError(ex);
407 private void btnGenerate_Click(object sender, EventArgs e)
409 Color c = tabPage2.BackColor;
413 tabPage2.BackColor = Color.Tomato;
415 string file = tbMqoFile.Text;
418 catch (Exception exception)
420 Util.ProcessError(exception);
424 tabPage2.BackColor = c;
429 private void AddMergeTso(string[] files)
431 foreach (string file in files)
433 if (Path.GetExtension(files[0]).ToUpper() != ".TSO")
436 if (tvMerge.Nodes.Find(file, false).Length == 0)
438 TreeNode node = tvMerge.Nodes.Add(file);
442 TSOFile tso = new TSOFile(file);
445 foreach (TSOMesh j in tso.meshes)
447 TreeNode mesh = node.Nodes.Add(j.Name);
455 private void btnMerge_Click(object sender, EventArgs e)
457 Color c = tabPage2.BackColor;
461 tabPage2.BackColor = Color.Tomato;
462 List<TSOMesh> meshes = new List<TSOMesh>();
463 Dictionary<string, Pair<TSOMaterial, int>> materialmap = new Dictionary<string, Pair<TSOMaterial, int>>();
464 Dictionary<string, TSOTex> textures = new Dictionary<string, TSOTex>();
467 foreach (TreeNode node in tvMerge.Nodes)
469 TSOFile tso = new TSOFile(node.Text);
475 foreach (TSOMesh mesh in tso.meshes)
477 TreeNode[] found = node.Nodes.Find(mesh.Name, false);
479 if (found.Length == 0 || !found[0].Checked)
482 foreach (TSOSubMesh k in mesh.sub_meshes)
483 mtls |= 1ul << k.spec;
488 foreach (TSOMaterial mat in tso.materials)
490 if ((mask & mtls) != 0)
492 if (!materialmap.ContainsKey(mat.Name))
494 Pair<TSOMaterial, int> value = new Pair<TSOMaterial, int>(mat, materialmap.Count);
495 materialmap.Add(mat.Name, value);
497 if (!textures.ContainsKey(mat.ColorTex))
499 TSOTex tex = tso.texturemap[mat.ColorTex];
500 textures.Add(tex.Name, tex);
503 if (!textures.ContainsKey(mat.ShadeTex))
505 TSOTex tex = tso.texturemap[mat.ShadeTex];
506 textures.Add(tex.Name, tex);
515 using (FileStream fs = File.OpenWrite(tbMergeTso.Text))
519 List<TSOTex> texlist = new List<TSOTex>(textures.Values);
520 TSOMaterial[] mtllist = new TSOMaterial[materialmap.Count];
522 foreach (var i in materialmap.Values)
523 mtllist[i.Second] = i.First;
525 foreach (TSOMesh mesh in meshes)
527 foreach (TSOSubMesh sub in mesh.sub_meshes)
529 TSOMaterial mtl = mesh.file.materials[sub.spec];
530 sub.spec = materialmap[mtl.Name].Second;
534 foreach (TSOTex tex in texlist)
535 TSOFile.ExchangeChannel(tex.data, tex.depth);
537 BinaryWriter bw = new BinaryWriter(fs);
538 TSOWriter.WriteHeader(bw);
539 TSOWriter.Write(bw, last.nodes);
540 TSOWriter.Write(bw, texlist.ToArray());
541 TSOWriter.Write(bw, last.effects);
542 TSOWriter.Write(bw, mtllist);
543 TSOWriter.Write(bw, meshes.ToArray());
546 catch (Exception exception)
548 Util.ProcessError(exception);
552 tabPage2.BackColor = c;
556 private void btnMergeAdd_Click(object sender, EventArgs e)
560 OpenFileDialog dlg = new OpenFileDialog();
561 dlg.Filter = "TSO File(*.tso)|*.tso";
562 dlg.Multiselect = true;
564 if (dlg.ShowDialog() == DialogResult.OK)
565 AddMergeTso(dlg.FileNames);
567 catch (Exception exception)
569 Util.ProcessError(exception);
573 private void btnMergeDel_Click(object sender, EventArgs e)
575 if (tvMerge.SelectedNode != null && tvMerge.SelectedNode.Level == 0)
576 tvMerge.SelectedNode.Remove();
579 private void btnMergeReset_Click(object sender, EventArgs e)
581 tvMerge.Nodes.Clear();
584 private void btnRefMergeTso_Click(object sender, EventArgs e)
588 SaveFileDialog dlg = new SaveFileDialog();
589 dlg.Filter = "TSO File (*.tso)|*.tso";
590 dlg.FileName = tbMergeTso.Text;
592 if (dlg.ShowDialog() == DialogResult.OK)
593 tbMergeTso.Text = dlg.FileName;
595 catch (Exception exception)
597 Util.ProcessError(exception);
601 public static bool bTvMerge_AfterCheck = false;
603 private void tvMerge_AfterCheck(object sender, TreeViewEventArgs e)
605 if (bTvMerge_AfterCheck)
608 bTvMerge_AfterCheck = true;
612 if (e.Node.Level == 0)
614 foreach (TreeNode node in e.Node.Nodes)
615 node.Checked = e.Node.Checked;
621 foreach (TreeNode node in e.Node.Parent.Nodes)
622 if (node.Checked) check = true;
624 e.Node.Parent.Checked = check;
629 bTvMerge_AfterCheck = false;
637 public static void ProcessError(Exception exception)
639 MessageBox.Show(exception.ToString());