--- /dev/null
+using System;
+
+namespace Tso2MqoGui
+{
+ static class MqxDump
+ {
+ static void Main(string[] args)
+ {
+ if (args.Length < 1)
+ {
+ Console.WriteLine("MqxDump.exe <mqo file>");
+ return;
+ }
+ string mqo_file = args[0];
+
+ MqxReader reader = new MqxReader();
+ reader.MqoFile = mqo_file;
+ reader.Read();
+ }
+ }
+}
--- /dev/null
+using System;
+using System.Collections.Generic;
+using System.IO;
+using System.Text;
+using System.Xml;
+
+namespace Tso2MqoGui
+{
+ public class MqoBone
+ {
+ public int id;
+ public string name;
+ public bool tail;
+ //\82È\82¯\82ê\82Î-1
+ public int pid;
+ public List<int> cids = new List<int>();
+
+ //\8dª\96{position
+ public Point3 q;
+
+ //\90æ\92[position
+ public Point3 p;
+
+ public List<MqoWeit> weits;
+
+ public MqoBone()
+ {
+ weits = new List<MqoWeit>(2048*3*4);
+ }
+
+ public void Write(XmlWriter writer)
+ {
+ writer.WriteStartElement("Bone");
+ writer.WriteAttributeString("id", (id+1).ToString());
+
+ writer.WriteAttributeString("rtX", q.X.ToString());
+ writer.WriteAttributeString("rtY", q.Y.ToString());
+ writer.WriteAttributeString("rtZ", q.Z.ToString());
+
+ writer.WriteAttributeString("tpX", p.X.ToString());
+ writer.WriteAttributeString("tpY", p.Y.ToString());
+ writer.WriteAttributeString("tpZ", p.Z.ToString());
+
+ writer.WriteAttributeString("rotB", "0.0");
+ writer.WriteAttributeString("rotH", "0.0");
+ writer.WriteAttributeString("rotP", "0.0");
+
+ writer.WriteAttributeString("mvX", "0.0");
+ writer.WriteAttributeString("mvY", "0.0");
+ writer.WriteAttributeString("mvZ", "0.0");
+
+ writer.WriteAttributeString("sc", "1.0");
+
+ writer.WriteAttributeString("maxAngB", "90.0");
+ writer.WriteAttributeString("maxAngH", "180.0");
+ writer.WriteAttributeString("maxAngP", "180.0");
+
+ writer.WriteAttributeString("minAngB", "-90.0");
+ writer.WriteAttributeString("minAngH", "-180.0");
+ writer.WriteAttributeString("minAngP", "-180.0");
+
+ writer.WriteAttributeString("isDummy", tail ? "1" : "0");
+ writer.WriteAttributeString("name", name);
+
+ writer.WriteStartElement("P");
+ writer.WriteAttributeString("id", (pid+1).ToString());
+ writer.WriteEndElement();
+
+ foreach (int cid in cids)
+ {
+ writer.WriteStartElement("C");
+ writer.WriteAttributeString("id", (cid+1).ToString());
+ writer.WriteEndElement();
+ }
+ foreach (MqoWeit weit in weits)
+ {
+ weit.Write(writer);
+ }
+
+ writer.WriteEndElement();
+ }
+
+ public void Read(XmlReader reader)
+ {
+ Console.WriteLine("Bone");
+
+ this.id = int.Parse(reader.GetAttribute("id"));
+ this.name = reader.GetAttribute("name");
+
+ Console.WriteLine(" id:{0}", this.id);
+ Console.WriteLine(" name:{0}", this.name);
+
+ reader.Read();//Bone
+
+ if (reader.IsStartElement("P"))
+ {
+ Console.WriteLine("P");
+ int id = int.Parse(reader.GetAttribute("id"));
+ Console.WriteLine(" id:{0}", id);
+ reader.Read();//P
+ this.pid = id;
+ }
+
+ while (reader.IsStartElement("C"))
+ {
+ Console.WriteLine("C");
+ int id = int.Parse(reader.GetAttribute("id"));
+ Console.WriteLine(" id:{0}", reader.GetAttribute("id"));
+ reader.Read();//C
+ this.cids.Add(id);
+ }
+
+ while (reader.IsStartElement("W"))
+ {
+ MqoWeit weit = new MqoWeit();
+ weit.Read(reader);
+ this.weits.Add(weit);
+ }
+
+ reader.ReadEndElement();//Bone
+ }
+ }
+
+ public class MqoWeit
+ {
+ public int object_id;
+ public int vertex_id;
+ //public int bone_id;
+ public float weit;
+
+ public void Write(XmlWriter writer)
+ {
+ float weit_percent = weit * 100.0f;
+
+ writer.WriteStartElement("W");
+ writer.WriteAttributeString("oi", object_id.ToString());
+ writer.WriteAttributeString("vi", vertex_id.ToString());
+ writer.WriteAttributeString("w", weit_percent.ToString());
+ writer.WriteEndElement();
+ }
+
+ public void Read(XmlReader reader)
+ {
+ Console.WriteLine("W");
+
+ this.object_id = int.Parse(reader.GetAttribute("oi"));
+ this.vertex_id = int.Parse(reader.GetAttribute("vi"));
+ this.weit = float.Parse(reader.GetAttribute("w"));
+
+ Console.WriteLine(" oi:{0}", this.object_id);
+ Console.WriteLine(" vi:{0}", this.vertex_id);
+ Console.WriteLine(" w:{0}", this.weit);
+
+ reader.Read();//W
+ }
+ }
+}
--- /dev/null
+using System;
+using System.Collections.Generic;
+using System.IO;
+using System.Text;
+using System.Xml;
+
+namespace Tso2MqoGui
+{
+ /// MqxFileを読み込みます。
+ public class MqxReader
+ {
+ // mqo path
+ //todo: rename to MqoPath
+ public string MqoFile;
+
+ string GetMqxPath()
+ {
+ return Path.ChangeExtension(MqoFile, ".mqx");
+ }
+
+ // ボーン配列 [out]
+ public MqoBone[] bones;
+
+ // MqxFileを読み込む。
+ public void Read()
+ {
+ XmlReader reader = XmlReader.Create(GetMqxPath());
+ reader.Read();
+
+ reader.ReadStartElement("MetasequoiaDocument");
+
+ reader.ReadStartElement("IncludedBy");
+ string mqo_file = reader.ReadString();
+ Console.WriteLine(mqo_file);
+ reader.ReadEndElement();//IncludedBy
+
+ reader.ReadStartElement("Plugin.56A31D20.71F282AB");
+ reader.ReadStartElement("BoneSet");
+ int len = 255;
+ bones = new MqoBone[len];
+ int i = 0;
+ while (reader.IsStartElement("Bone"))
+ {
+ MqoBone bone = new MqoBone();
+ bone.Read(reader);
+ this.bones[i++] = bone;
+ }
+ reader.ReadEndElement();//BoneSet
+
+ while (reader.IsStartElement("Obj"))
+ {
+ Console.WriteLine("Obj");
+ Console.WriteLine(" id:{0}", reader.GetAttribute("id"));
+ reader.Read();//Obj
+ }
+
+ while (reader.IsStartElement("Poses"))
+ {
+ Console.WriteLine("Poses");
+ Console.WriteLine(" isExist:{0}", reader.GetAttribute("isExist"));
+ bool empty = reader.IsEmptyElement;
+ reader.Read();//Poses
+ if (empty)
+ continue;
+ while (reader.IsStartElement("Pose"))
+ {
+ Console.WriteLine("Pose");
+ Console.WriteLine(" id:{0}", reader.GetAttribute("id"));
+ reader.Read();//Pose
+ }
+ reader.ReadEndElement();//Poses
+ }
+ reader.ReadEndElement();//Plugin.56A31D20.71F282AB
+ reader.ReadEndElement();//MetasequoiaDocument
+
+ reader.Close();
+ }
+ }
+}
//todo: rename to MqoPath
public string MqoFile;
+ string GetMqxPath()
+ {
+ return Path.ChangeExtension(MqoFile, ".mqx");
+ }
+
// MqxFileを書き出す。
//
// bones:
XmlWriterSettings settings = new XmlWriterSettings();
settings.Indent = true;
settings.IndentChars = new String(' ', 4);
- XmlWriter writer = XmlWriter.Create(Path.ChangeExtension(MqoFile, ".mqx"), settings);
+ XmlWriter writer = XmlWriter.Create(GetMqxPath(), settings);
writer.WriteStartElement("MetasequoiaDocument");
writer.WriteElementString("IncludedBy", Path.GetFileName(MqoFile));
writer.Close();
}
}
-
- public class MqoBone
- {
- public int id;
- public string name;
- public bool tail;
- //なければ-1
- public int pid;
- public List<int> cids = new List<int>();
-
- //根本position
- public Point3 q;
-
- //先端position
- public Point3 p;
-
- public List<MqoWeit> weits;
-
- public MqoBone()
- {
- weits = new List<MqoWeit>(2048*3*4);
- }
-
- public void Write(XmlWriter writer)
- {
- writer.WriteStartElement("Bone");
- writer.WriteAttributeString("id", (id+1).ToString());
-
- writer.WriteAttributeString("rtX", q.X.ToString());
- writer.WriteAttributeString("rtY", q.Y.ToString());
- writer.WriteAttributeString("rtZ", q.Z.ToString());
-
- writer.WriteAttributeString("tpX", p.X.ToString());
- writer.WriteAttributeString("tpY", p.Y.ToString());
- writer.WriteAttributeString("tpZ", p.Z.ToString());
-
- writer.WriteAttributeString("rotB", "0.0");
- writer.WriteAttributeString("rotH", "0.0");
- writer.WriteAttributeString("rotP", "0.0");
-
- writer.WriteAttributeString("mvX", "0.0");
- writer.WriteAttributeString("mvY", "0.0");
- writer.WriteAttributeString("mvZ", "0.0");
-
- writer.WriteAttributeString("sc", "1.0");
-
- writer.WriteAttributeString("maxAngB", "90.0");
- writer.WriteAttributeString("maxAngH", "180.0");
- writer.WriteAttributeString("maxAngP", "180.0");
-
- writer.WriteAttributeString("minAngB", "-90.0");
- writer.WriteAttributeString("minAngH", "-180.0");
- writer.WriteAttributeString("minAngP", "-180.0");
-
- writer.WriteAttributeString("isDummy", tail ? "1" : "0");
- writer.WriteAttributeString("name", name);
-
- writer.WriteStartElement("P");
- writer.WriteAttributeString("id", (pid+1).ToString());
- writer.WriteEndElement();
-
- foreach (int cid in cids)
- {
- writer.WriteStartElement("C");
- writer.WriteAttributeString("id", (cid+1).ToString());
- writer.WriteEndElement();
- }
- foreach (MqoWeit weit in weits)
- {
- weit.Write(writer);
- }
-
- writer.WriteEndElement();
- }
- }
-
- public class MqoWeit
- {
- public int object_id;
- public int vertex_id;
- //public int bone_id;
- public float weit;
-
- public void Write(XmlWriter writer)
- {
- float weit_percent = weit * 100.0f;
-
- writer.WriteStartElement("W");
- writer.WriteAttributeString("oi", object_id.ToString());
- writer.WriteAttributeString("vi", vertex_id.ToString());
- writer.WriteAttributeString("w", weit_percent.ToString());
- writer.WriteEndElement();
- }
- }
}
--- /dev/null
+using System;
+using System.Collections.Generic;
+using System.IO;
+using System.Text;
+
+namespace Tso2MqoGui
+{
+ public class TSOGeneratorMqxBone : TSOGenerator
+ {
+ public TSOGeneratorMqxBone(TSOGeneratorConfig config)
+ : base(config)
+ {
+ }
+
+ protected override bool DoLoadRefTSO(string path)
+ {
+ return true;
+ }
+
+ protected override bool DoGenerateMeshes()
+ {
+ return true;
+ }
+ }
+}
-<?xml version="1.0" encoding="utf-8"?>
+<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="4.0">
<PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Compile Include="MqoGenerator.cs" />
<Compile Include="MqoReader.cs" />
<Compile Include="MqoWriter.cs" />
+ <Compile Include="MqxFile.cs" />
+ <Compile Include="MqxReader.cs" />
<Compile Include="MqxWriter.cs" />
<Compile Include="NvTriStrip.cs" />
<Compile Include="PointCluster.cs" />
<Target Name="AfterBuild">
</Target>
-->
-</Project>
\ No newline at end of file
+</Project>
--- /dev/null
+csc /debug /d:DEBUG /out:bin\MqxDump.exe MqxDump.cs MqxReader.cs MqxFile.cs General.cs