OSDN Git Service

rename var v to refvs.
[tdcgexplorer/tso2mqo.git] / MqoWriter.cs
index e86f1e2..06bb5c1 100644 (file)
@@ -6,13 +6,6 @@ using System.Xml;
 
 namespace Tso2MqoGui
 {
-    public enum MqoBoneMode
-    {
-        None,
-        RokDeBone,
-        Mikoto,
-    }
-
     public class Pair<T, U>
     {
         public T First;
@@ -34,7 +27,7 @@ namespace Tso2MqoGui
         public TextWriter tw;
         public string OutPath;
         public string OutFile;
-        public MqoBoneMode BoneMode = MqoBoneMode.None;
+        public bool MqxEnabled;
 
         public MqoWriter(string file)
         {
@@ -127,13 +120,10 @@ namespace Tso2MqoGui
 
         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("");
@@ -172,25 +162,57 @@ namespace Tso2MqoGui
 
             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);
                 }
 
                 //根本
@@ -203,88 +225,7 @@ namespace Tso2MqoGui
 
                 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;
         }
     }
 
@@ -294,11 +235,11 @@ namespace Tso2MqoGui
 
         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()
@@ -413,98 +354,4 @@ namespace Tso2MqoGui
             }
         }
     }
-
-    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();
-        }
-    }
 }