2 using System.Collections.Generic;
\r
3 using System.ComponentModel;
\r
5 using System.Drawing;
\r
8 using System.Windows.Forms;
\r
9 using Microsoft.Win32;
\r
11 namespace Tso2MqoGui
\r
13 public partial class Form1 : Form
\r
15 public string OutPath
\r
17 get { return tbPath.Text; }
\r
18 set { tbPath.Text= value; }
\r
23 InitializeComponent();
\r
26 private void Form1_Load(object sender, EventArgs e)
\r
28 RegistryKey reg = Application.UserAppDataRegistry.CreateSubKey("Config");
\r
29 OutPath = (string)reg.GetValue("OutPath", Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments));
\r
30 tabControl1.SelectedIndex = (int)reg.GetValue("TabPage", 0);
\r
31 tbMqoIn .Text = (string)reg.GetValue("MqoIn", "");
\r
32 tbTso .Text = (string)reg.GetValue("Tso", "");
\r
33 tbTsoEx .Text = (string)reg.GetValue("TsoEx", "");
\r
34 tbMergeTso.Text = (string)reg.GetValue("MergeTso", "");
\r
35 rbAutoBone .Checked = (int)reg.GetValue("AutoBone", 1) == 1;
\r
36 rb1Bone .Checked = (int)reg.GetValue("OneBone", 0) == 1;
\r
37 rbBoneNone .Checked = (int)reg.GetValue("BoneNone", 1) == 1;
\r
38 rbBoneRokDeBone.Checked = (int)reg.GetValue("BoneRokDeBone", 0) == 1;
\r
39 cbMakeSub .Checked = (int)reg.GetValue("MakeSub", 1) == 1;
\r
40 cbCopyTSO .Checked = (int)reg.GetValue("CopyTSO", 1) == 1;
\r
41 cbShowMaterials.Checked = (int)reg.GetValue("ShowMaterials", 0) == 1;
\r
43 reg = Application.UserAppDataRegistry.CreateSubKey("Form1");
\r
44 Bounds = new Rectangle(
\r
45 (int)reg.GetValue("Left", 0),
\r
46 (int)reg.GetValue("Top", 0),
\r
47 (int)reg.GetValue("Width", 640),
\r
48 (int)reg.GetValue("Height", 320));
\r
50 EnableControlStuff();
\r
52 Config config = Config.Instance;
\r
55 private void Form1_FormClosed(object sender, FormClosedEventArgs e)
\r
57 RegistryKey reg = Application.UserAppDataRegistry.CreateSubKey("Config");
\r
58 reg.SetValue("OutPath", OutPath);
\r
59 reg.SetValue("TabPage", tabControl1.SelectedIndex);
\r
60 reg.SetValue("MqoIn", tbMqoIn .Text);
\r
61 reg.SetValue("Tso", tbTso .Text);
\r
62 reg.SetValue("TsoEx", tbTsoEx .Text);
\r
63 reg.SetValue("MergeTso", tbMergeTso.Text);
\r
64 reg.SetValue("AutoBone", rbAutoBone .Checked ? 1 : 0);
\r
65 reg.SetValue("OneBone", rb1Bone .Checked ? 1 : 0);
\r
66 reg.SetValue("BoneNone", rbBoneNone .Checked ? 1 : 0);
\r
67 reg.SetValue("BoneRokDeBone", rbBoneRokDeBone.Checked ? 1 : 0);
\r
68 reg.SetValue("MakeSub", cbMakeSub .Checked ? 1 : 0);
\r
69 reg.SetValue("CopyTSO", cbCopyTSO .Checked ? 1 : 0);
\r
70 reg.SetValue("ShowMaterials", cbShowMaterials.Checked ? 1 : 0);
\r
72 reg= Application.UserAppDataRegistry.CreateSubKey("Form1");
\r
74 if((this.WindowState & FormWindowState.Minimized) == FormWindowState.Minimized)
\r
76 reg.SetValue("Top", RestoreBounds.Top);
\r
77 reg.SetValue("Left", RestoreBounds.Left);
\r
78 reg.SetValue("Width", RestoreBounds.Width);
\r
79 reg.SetValue("Height", RestoreBounds.Height);
\r
82 reg.SetValue("Top", Top);
\r
83 reg.SetValue("Left", Left);
\r
84 reg.SetValue("Width", Width);
\r
85 reg.SetValue("Height", Height);
\r
91 private void Form1_DragDrop(object sender, DragEventArgs e)
\r
95 if(!e.Data.GetDataPresent(DataFormats.FileDrop))
\r
98 string[] files = (string[])e.Data.GetData(DataFormats.FileDrop);
\r
100 if(files.Length == 0)
\r
103 switch(tabControl1.SelectedIndex)
\r
106 switch(Path.GetExtension(files[0]).ToUpper())
\r
108 case ".TSO": OpenTSOFile(files[0]); break;
\r
114 switch(Path.GetExtension(files[0]).ToUpper())
\r
116 case ".TSO": tbTso .Text= files[0]; break;
\r
117 case ".MQO": tbMqoIn.Text= files[0]; break;
\r
118 //case ".MQO": OpenMQOFile(files[0]); break;
\r
124 AddMergeTso(files);
\r
127 } catch(Exception ex)
\r
129 Util.ProcessError(ex);
\r
133 private void Form1_DragEnter(object sender, DragEventArgs e)
\r
135 if(!e.Data.GetDataPresent(DataFormats.FileDrop))
\r
138 e.Effect = DragDropEffects.Copy;
\r
141 private void tbMergeTso_DragDrop(object sender, DragEventArgs e)
\r
143 if(!e.Data.GetDataPresent(DataFormats.FileDrop))
\r
146 string[] files = (string[])e.Data.GetData(DataFormats.FileDrop);
\r
148 switch(Path.GetExtension(files[0]).ToUpper())
\r
150 case ".TSO": tbMergeTso.Text= files[0]; break;
\r
154 private void tbMergeTso_DragEnter(object sender, DragEventArgs e)
\r
156 if(!e.Data.GetDataPresent(DataFormats.FileDrop))
\r
159 e.Effect = DragDropEffects.Copy;
\r
162 private void OpenTSOFile(string f)
\r
164 string dir = OutPath;
\r
166 if(cbMakeSub.Checked)
\r
168 dir = Path.Combine(dir, Path.GetFileNameWithoutExtension(f));
\r
170 if(!Directory.Exists(dir))
\r
171 Directory.CreateDirectory(dir);
\r
174 string file= Path.Combine(dir, Path.ChangeExtension(Path.GetFileName(f), ".mqo"));
\r
175 string info= Path.Combine(dir, Path.ChangeExtension(Path.GetFileName(f), ".xml"));
\r
179 label2.BackColor= Color.Tomato;
\r
180 label2.ForeColor= Color.White;
\r
181 label2.Text = "Processing";
\r
182 label2.Invalidate();
\r
186 using(MqoWriter mqo = new MqoWriter(file))
\r
188 TSOFile tso = new TSOFile(f);
\r
191 if(rbBoneRokDeBone.Checked) mqo.BoneMode = MqoBoneMode.RokDeBone;
\r
196 ImportInfo ii = new ImportInfo();
\r
199 foreach(TSOTex i in tso.textures)
\r
200 ii.textures.Add(new ImportTextureInfo(i));
\r
203 foreach(TSOEffect i in tso.effects)
\r
205 ii.effects.Add(new ImportEffectInfo(i));
\r
206 File.WriteAllText(Path.Combine(dir, i.Name), i.code, Encoding.Default);
\r
210 foreach(TSOMaterial i in tso.materials)
\r
212 ii.materials.Add(new ImportMaterialInfo(i));
\r
213 File.WriteAllText(Path.Combine(dir, i.Name), i.code, Encoding.Default);
\r
214 //File.WriteAllText(Path.Combine(dir, i.File), i.code, Encoding.Default);
\r
217 ImportInfo.Save(info, ii);
\r
220 if(cbCopyTSO.Checked)
\r
222 file = Path.Combine(dir, Path.GetFileName(f));
\r
225 File.Copy(f, file, true);
\r
229 label2.BackColor = SystemColors.Control;
\r
230 label2.BackColor = label2.Parent.BackColor;
\r
231 label2.ForeColor = SystemColors.ControlText;
\r
232 label2.Text = "Drop TSO File Here!";
\r
235 //System.Diagnostics.Process.Start(file);
\r
238 private void OpenMQOFile(string f)
\r
240 TsoGenerator gen = new TsoGenerator();
\r
242 if(rbAutoBone.Checked)
\r
244 TSOGenerateConfig config = new TSOGenerateConfig();
\r
245 config.materialconfig = cbShowMaterials.Checked;
\r
247 gen.GenerateAutoBone(f, tbTso.Text, tbTsoEx.Text, config);
\r
249 if(rb1Bone.Checked)
\r
251 TSOGenerateConfig config = new TSOGenerateConfig();
\r
252 config.materialconfig = cbShowMaterials.Checked;
\r
254 foreach(ListViewItem i in lvObject.Items)
\r
256 if(i.SubItems[1].Text == "")
\r
258 MessageBox.Show("すべてのオブジェクトにボーンを設定してください");
\r
262 config.boneref.Add(i.SubItems[0].Text, i.SubItems[1].Text);
\r
265 gen.GenerateOneBone(f, tbTso.Text, tbTsoEx.Text, config);
\r
270 #region tso->mqo UI
\r
271 private void button1_Click(object sender, EventArgs e)
\r
273 FolderBrowserDialog dlg = new FolderBrowserDialog();
\r
274 dlg.SelectedPath = OutPath;
\r
276 if(dlg.ShowDialog() == DialogResult.OK)
\r
277 OutPath = dlg.SelectedPath;
\r
280 #region mqo->tso UI
\r
281 private void radioButton1_CheckedChanged(object sender, EventArgs e)
\r
283 EnableControlStuff();
\r
286 private void radioButton2_CheckedChanged(object sender, EventArgs e)
\r
288 EnableControlStuff();
\r
291 private void EnableControlStuff()
\r
293 gbBone.Enabled = rb1Bone.Checked;
\r
296 private void BuildBoneTree(TreeNodeCollection nodes, TSONode node)
\r
298 TreeNode tn = nodes.Add(node.ShortName);
\r
301 if(node.children != null)
\r
302 foreach(TSONode i in node.children)
\r
303 BuildBoneTree(tn.Nodes, i);
\r
306 private void SaveAssign()
\r
308 foreach(ListViewItem i in lvObject.Items)
\r
310 string obj = i.SubItems[0].Text;
\r
311 string bone= i.SubItems[1].Text;
\r
313 if(Config.Instance.object_bone_map.ContainsKey(obj))
\r
314 Config.Instance.object_bone_map[obj] = bone;
\r
315 else Config.Instance.object_bone_map.Add(obj, bone);
\r
319 private void bRefMqoIn_Click(object sender, EventArgs e)
\r
323 OpenFileDialog dlg = new OpenFileDialog();
\r
324 dlg.Filter = "Metasequoia File(*.mqo)|*.mqo";
\r
325 dlg.FileName= tbMqoIn.Text;
\r
327 if(dlg.ShowDialog() == DialogResult.OK)
\r
328 tbMqoIn.Text = dlg.FileName;
\r
329 } catch(Exception ex)
\r
331 Util.ProcessError(ex);
\r
335 private void bRefTso_Click(object sender, EventArgs e)
\r
339 OpenFileDialog dlg = new OpenFileDialog();
\r
340 dlg.Filter = "TSO File(*.tso)|*.tso";
\r
341 dlg.FileName= tbTso.Text;
\r
343 if(dlg.ShowDialog() == DialogResult.OK)
\r
344 tbTso.Text = dlg.FileName;
\r
345 } catch(Exception ex)
\r
347 Util.ProcessError(ex);
\r
351 private void bRefTsoEx_Click(object sender, EventArgs e)
\r
355 SaveFileDialog dlg = new SaveFileDialog();
\r
356 dlg.Filter = "TSO File(*.tso)|*.tso";
\r
357 dlg.FileName= tbTsoEx.Text;
\r
359 if(dlg.ShowDialog() == DialogResult.OK)
\r
360 tbTsoEx.Text = dlg.FileName;
\r
361 } catch(Exception ex)
\r
363 Util.ProcessError(ex);
\r
367 private void bRefresh_Click(object sender, EventArgs e)
\r
375 MqoFile mqo = new MqoFile();
\r
376 mqo.Load(tbMqoIn.Text);
\r
377 lvObject.Items.Clear();
\r
379 foreach(MqoObject i in mqo.Objects)
\r
381 ListViewItem item= lvObject.Items.Add(i.name);
\r
385 if(Config.Instance.object_bone_map.TryGetValue(i.name, out bone))
\r
386 item.SubItems.Add(bone);
\r
387 else item.SubItems.Add("");
\r
391 TSOFile tso = new TSOFile(tbTso.Text);
\r
393 tvBone.Visible = false;
\r
394 tvBone.Nodes.Clear();
\r
395 BuildBoneTree(tvBone.Nodes, tso.nodes[0]);
\r
396 tvBone.ExpandAll();
\r
397 tvBone.Nodes[0].EnsureVisible();
\r
398 } catch(Exception ex)
\r
400 Util.ProcessError(ex);
\r
403 tvBone.Visible = true;
\r
408 private void bSelectAll_Click(object sender, EventArgs e)
\r
410 foreach(ListViewItem i in lvObject.Items)
\r
414 private void bDeselectAll_Click(object sender, EventArgs e)
\r
416 foreach(ListViewItem i in lvObject.Items)
\r
417 i.Selected = false;
\r
420 private void bAssign_Click(object sender, EventArgs e)
\r
424 TreeNode n = tvBone.SelectedNode;
\r
428 MessageBox.Show("割り当てるボーンを選択してください");
\r
432 foreach(ListViewItem i in lvObject.SelectedItems)
\r
433 i.SubItems[1].Text = n.Text;
\r
436 } catch(Exception ex)
\r
438 Util.ProcessError(ex);
\r
442 private void bOk_Click(object sender, EventArgs e)
\r
444 Color c = tabPage2.BackColor;
\r
448 tabPage2.BackColor = Color.Tomato;
\r
450 string file= tbMqoIn.Text;
\r
452 } catch(Exception ex)
\r
454 Util.ProcessError(ex);
\r
457 tabPage2.BackColor = c;
\r
462 private void AddMergeTso(string[] files)
\r
464 foreach(string i in files)
\r
466 if(Path.GetExtension(files[0]).ToUpper() != ".TSO")
\r
469 if(tvMerge.Nodes.Find(i, false).Length == 0)
\r
471 TreeNode node= tvMerge.Nodes.Add(i);
\r
473 node.Checked = true;
\r
475 TSOFile tso = new TSOFile(i);
\r
478 foreach(TSOMesh j in tso.meshes)
\r
480 TreeNode mesh= node.Nodes.Add(j.Name);
\r
481 mesh.Name = j.Name;
\r
482 mesh.Checked = true;
\r
488 private void bMerge_Click(object sender, EventArgs e)
\r
490 Color c = tabPage2.BackColor;
\r
494 tabPage2.BackColor = Color.Tomato;
\r
495 List<TSOMesh> meshes = new List<TSOMesh>();
\r
496 Dictionary<string, Pair<TSOMaterial, int>> materialmap = new Dictionary<string, Pair<TSOMaterial, int>>();
\r
497 Dictionary<string, TSOTex> textures = new Dictionary<string, TSOTex>();
\r
498 TSOFile last = null;
\r
500 foreach(TreeNode i in tvMerge.Nodes)
\r
502 TSOFile tso = new TSOFile(i.Text);
\r
508 foreach(TSOMesh j in tso.meshes)
\r
510 TreeNode[] found = i.Nodes.Find(j.Name, false);
\r
512 if(found.Length == 0 || !found[0].Checked)
\r
515 foreach(TSOSubMesh k in j.sub)
\r
516 mtls |=1ul << k.spec;
\r
521 foreach(TSOMaterial j in tso.materials)
\r
523 if((mask & mtls) != 0)
\r
525 if(!materialmap.ContainsKey(j.Name))
\r
527 Pair<TSOMaterial, int> value = new Pair<TSOMaterial,int>(j, materialmap.Count);
\r
528 materialmap.Add(j.Name, value);
\r
530 if(!textures.ContainsKey(j.ColorTex))
\r
532 TSOTex tex = tso.texturemap[j.ColorTex];
\r
533 textures.Add(tex.Name, tex);
\r
536 if(!textures.ContainsKey(j.ShadeTex))
\r
538 TSOTex tex = tso.texturemap[j.ShadeTex];
\r
539 textures.Add(tex.Name, tex);
\r
548 using(FileStream fs= File.OpenWrite(tbMergeTso.Text))
\r
552 List<TSOTex> texlist = new List<TSOTex>(textures.Values);
\r
553 TSOMaterial[] mtllist = new TSOMaterial[materialmap.Count];
\r
555 foreach(var i in materialmap.Values)
\r
556 mtllist[i.Second] = i.First;
\r
558 foreach(TSOMesh i in meshes)
\r
560 foreach(TSOSubMesh j in i.sub)
\r
562 TSOMaterial mtl = i.file.materials[j.spec];
\r
563 j.spec = materialmap[mtl.Name].Second;
\r
567 BinaryWriter bw = new BinaryWriter(fs);
\r
568 TSOWriter.WriteHeader(bw);
\r
569 TSOWriter.Write(bw, last.nodes);
\r
570 TSOWriter.Write(bw, texlist.ToArray());
\r
571 TSOWriter.Write(bw, last.effects);
\r
572 TSOWriter.Write(bw, mtllist);
\r
573 TSOWriter.Write(bw, meshes.ToArray());
\r
575 } catch(Exception ex)
\r
577 Util.ProcessError(ex);
\r
580 tabPage2.BackColor = c;
\r
584 private void bMergeAdd_Click(object sender, EventArgs e)
\r
588 OpenFileDialog dlg = new OpenFileDialog();
\r
589 dlg.Filter = "TSO File(*.tso)|*.tso";
\r
590 dlg.Multiselect = true;
\r
592 if(dlg.ShowDialog() == DialogResult.OK)
\r
593 AddMergeTso(dlg.FileNames);
\r
594 } catch(Exception ex)
\r
596 Util.ProcessError(ex);
\r
600 private void bMergeDel_Click(object sender, EventArgs e)
\r
602 if(tvMerge.SelectedNode != null
\r
603 && tvMerge.SelectedNode.Level == 0)
\r
604 tvMerge.SelectedNode.Remove();
\r
607 private void bMergeReset_Click(object sender, EventArgs e)
\r
609 tvMerge.Nodes.Clear();
\r
612 private void bRefMergeTso_Click(object sender, EventArgs e)
\r
616 SaveFileDialog dlg = new SaveFileDialog();
\r
617 dlg.Filter = "TSO File(*.tso)|*.tso";
\r
618 dlg.FileName= tbMergeTso.Text;
\r
620 if(dlg.ShowDialog() == DialogResult.OK)
\r
621 tbMergeTso.Text = dlg.FileName;
\r
622 } catch(Exception ex)
\r
624 Util.ProcessError(ex);
\r
628 public static bool bTvMerge_AfterCheck = false;
\r
630 private void tvMerge_AfterCheck(object sender, TreeViewEventArgs e)
\r
632 if(bTvMerge_AfterCheck)
\r
635 bTvMerge_AfterCheck = true;
\r
639 if(e.Node.Level == 0)
\r
641 foreach(TreeNode i in e.Node.Nodes)
\r
642 i.Checked = e.Node.Checked;
\r
645 bool check = false;
\r
646 //bool uncheck = false;
\r
648 foreach(TreeNode i in e.Node.Parent.Nodes)
\r
649 if(i.Checked) check = true;
\r
650 //else uncheck = true;
\r
652 e.Node.Parent.Checked = check;
\r
656 bTvMerge_AfterCheck = false;
\r
664 public static void ProcessError(Exception e)
\r
666 MessageBox.Show(e.ToString());
\r