namespace Tso2MqoGui
{
- public enum MqoBoneMode
- {
- None,
- RokDeBone,
- Mikoto,
- }
-
public class Pair<T, U>
{
public T First;
public TextWriter tw;
public string OutPath;
public string OutFile;
- public MqoBoneMode BoneMode = MqoBoneMode.None;
+ public bool MqxEnabled;
public MqoWriter(string file)
{
public void Write(TSOFile tso)
{
- // ボーンを出す
- bool mqx_enabled = BoneMode == MqoBoneMode.RokDeBone;
-
tw.WriteLine("Metasequoia Document");
tw.WriteLine("Format Text Ver 1.0");
tw.WriteLine("");
- if (mqx_enabled)
+ if (MqxEnabled)
{
tw.WriteLine("IncludeXml \"{0}\"", Path.GetFileName(Path.ChangeExtension(OutFile, ".mqx")));
tw.WriteLine("");
tw.WriteLine("}");
- tso.UpdateNodesWorld();
+ MqoBone[] bones = null;
+
+ if (MqxEnabled)
+ bones = CreateBones(tso);
+
+ MqoObjectGen.uid_enabled = MqxEnabled;
+ MqoObjectGen obj = new MqoObjectGen();
+ ushort object_id = 0;
+ foreach (TSOMesh mesh in tso.meshes)
+ {
+ obj.id = ++object_id;
+ obj.name = mesh.Name;
+ obj.Update(mesh);
+ obj.Write(tw);
+
+ if (MqxEnabled)
+ obj.AddWeits(bones);
+ }
+
+ if (MqxEnabled)
+ {
+ MqxWriter writer = new MqxWriter();
+ writer.MqoFile = OutFile;
+ writer.Write(bones, object_id /* eq numobjects */);
+ }
+
+ tw.WriteLine("Eof");
+ }
+
+ MqoBone[] CreateBones(TSOFile tso)
+ {
MqoBone[] bones = new MqoBone[tso.nodes.Length];
+ tso.UpdateNodesWorld();
+
foreach (TSONode node in tso.nodes)
{
MqoBone bone = new MqoBone();
- bone.id = node.id;
+ bone.id = node.id+1;
bone.name = node.ShortName;
bone.tail = node.children.Count == 0;
if (node.parent == null)
{
- bone.pid = -1;
+ bone.pid = 0;
}
else
{
- bone.pid = node.parent.id;
- bones[bone.pid].cids.Add(bone.id);
+ bone.pid = node.parent.id+1;
+ bones[node.parent.id].cids.Add(bone.id);
}
//根本
bones[node.id] = bone;
}
-
- MqoObjectGen.uid_enabled = mqx_enabled;
- MqoObjectGen obj = new MqoObjectGen();
-
- ushort object_id = 0;
- foreach (TSOMesh mesh in tso.meshes)
- {
- obj.id = ++object_id;
- obj.name = mesh.Name;
- obj.Update(mesh);
- obj.Write(tw);
- obj.AddWeits(bones);
- }
-
- if (mqx_enabled)
- WriteMqxDeBone(bones, object_id /* eq numobjects */);
-
- tw.WriteLine("Eof");
- }
-
- void WriteMqxDeBone(MqoBone[] bones, int numobjects)
- {
- XmlWriterSettings settings = new XmlWriterSettings();
- settings.Indent = true;
- settings.IndentChars = new String(' ', 4);
- XmlWriter writer = XmlWriter.Create(Path.ChangeExtension(OutFile, ".mqx"), settings);
- writer.WriteStartElement("MetasequoiaDocument");
- writer.WriteElementString("IncludedBy", Path.GetFileName(OutFile));
-
- writer.WriteStartElement("Plugin.56A31D20.71F282AB");
- writer.WriteAttributeString("name", "Bone");
- writer.WriteStartElement("BoneSet");
-
- foreach (MqoBone bone in bones)
- bone.Write(writer);
-
- writer.WriteEndElement();//BoneSet
-
- for (int i = 0; i < numobjects; i++)
- {
- writer.WriteStartElement("Obj");
- writer.WriteAttributeString("id", (i+1).ToString());
- writer.WriteEndElement();
- }
- writer.WriteEndElement();//Plugin.56A31D20.71F282AB
-
- writer.WriteEndElement();//MetasequoiaDocument
- writer.Close();
- }
-
- void WriteRokDeBone(MqoBone[] bones)
- {
- tw.WriteLine("Object \"{0}\" {{", "Bone");
- tw.WriteLine("\tvisible {0}", 15);
- tw.WriteLine("\tlocking {0}", 0);
- tw.WriteLine("\tshading {0}", 1);
- tw.WriteLine("\tfacet {0}", 59.5);
- tw.WriteLine("\tcolor {0} {1} {2}", 1, 0, 0);
- tw.WriteLine("\tcolor_type {0}", 0);
-
- tw.WriteLine("\tvertex {0} {{", bones.Length);
-
- foreach (MqoBone bone in bones)
- tw.WriteLine("\t\t{0:F4} {1:F4} {2:F4}", bone.q.x, bone.q.y, bone.q.z);
-
- tw.WriteLine("\t}");
-
- //
- tw.WriteLine("\tface {0} {{", bones.Length);
-
- foreach (MqoBone bone in bones)
- {
- if (bone.pid == -1)
- continue;
-
- //根元と先端を接続するedge
- if (! bone.tail)
- tw.WriteLine(string.Format("\t\t2 V({0} {1})", bone.pid, bone.id));
- }
-
- tw.WriteLine("\t}");
- tw.WriteLine("}");
+ return bones;
}
}
public int id; //object_id
public string name;
- VertexHeap<UVertex> vh = new VertexHeap<UVertex>();
+ Heap<UVertex> vh = new Heap<UVertex>();
public List<MqoFace> faces;
public int numvertices { get { return vh.Count; } }
- public List<UVertex> vertices { get { return vh.verts; } }
+ public List<UVertex> vertices { get { return vh.ary; } }
public int numfaces { get { return faces.Count; } }
public MqoObjectGen()
}
}
}
-
- 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();
- }
- }
}