OSDN Git Service

MqxReader#CreateWeitMap
authornomeu <nomeu@nomeu.org>
Mon, 26 Jan 2015 16:38:47 +0000 (01:38 +0900)
committernomeu <nomeu@nomeu.org>
Mon, 26 Jan 2015 16:38:47 +0000 (01:38 +0900)
MqxDump.cs
MqxFile.cs
MqxReader.cs
TSOGenerator.cs
TSOGeneratorMqxBone.cs

index 19fff65..895fb75 100644 (file)
@@ -14,8 +14,7 @@ namespace Tso2MqoGui
             string mqo_file = args[0];
 
             MqxReader reader = new MqxReader();
-            reader.MqoFile = mqo_file;
-            reader.Read();
+            reader.Load(mqo_file);
         }
     }
 }
index a3d6d4e..dd60091 100644 (file)
@@ -84,30 +84,21 @@ namespace Tso2MqoGui
 
         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);
             }
@@ -121,6 +112,23 @@ namespace Tso2MqoGui
 
             reader.ReadEndElement();//Bone
         }
+
+        public void Dump()
+        {
+            Console.WriteLine("Bone");
+
+            Console.WriteLine("  id:{0}", this.id);
+            Console.WriteLine("  name:{0}", this.name);
+
+            Console.WriteLine("P");
+            Console.WriteLine("  id:{0}", pid);
+
+            foreach (int cid in cids)
+            {
+                Console.WriteLine("C");
+                Console.WriteLine("  id:{0}", cid);
+            }
+        }
     }
 
     public class MqoWeit
@@ -143,17 +151,20 @@ namespace Tso2MqoGui
 
         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"));
+            this.weit = float.Parse(reader.GetAttribute("w")) * 0.01f;
+
+            reader.Read();//W
+        }
+
+        public void Dump()
+        {
+            Console.WriteLine("W");
 
             Console.WriteLine("  oi:{0}", this.object_id);
             Console.WriteLine("  vi:{0}", this.vertex_id);
             Console.WriteLine("  w:{0}", this.weit);
-
-            reader.Read();//W
         }
     }
 }
index b620bdf..2bf3730 100644 (file)
@@ -21,10 +21,36 @@ namespace Tso2MqoGui
         // ボーン配列 [out]
         public MqoBone[] bones;
 
+        //頂点ウェイト配列 [out]
+        public MqoWeit[] weits;
+
+        public void CreateWeits()
+        {
+            weits = new MqoWeit[4];
+            for (int i = 0; i < 4; ++i)
+            {
+                weits[i] = new MqoWeit();
+            }
+        }
+
         // MqxFileを読み込む。
-        public void Read()
+        public bool Load(string mqo_file)
+        {
+            MqoFile = mqo_file;
+            string mqx_path = GetMqxPath();
+
+            if (! File.Exists(mqx_path))
+                return false;
+
+            XmlReader reader = XmlReader.Create(mqx_path);
+            Read(reader);
+            reader.Close();
+
+            return true;
+        }
+
+        public void Read(XmlReader reader)
         {
-            XmlReader reader = XmlReader.Create(GetMqxPath());
             reader.Read();
 
             reader.ReadStartElement("MetasequoiaDocument");
@@ -49,31 +75,78 @@ namespace Tso2MqoGui
 
             while (reader.IsStartElement("Obj"))
             {
-                Console.WriteLine("Obj");
-                Console.WriteLine("  id:{0}", reader.GetAttribute("id"));
+                //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"));
+                //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"));
+                    //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();
+        List<Dictionary<int, List<MqoWeit>>> weitmap;
+
+        public void CreateWeitMap()
+        {
+            int maxobjects = 255;
+            weitmap = new List<Dictionary<int, List<MqoWeit>>>(maxobjects);
+            for (int i = 0; i < maxobjects; i++)
+            {
+                weitmap.Add(new Dictionary<int, List<MqoWeit>>(2048));
+            }
+            foreach (MqoBone bone in bones)
+            {
+                if (bone == null)
+                    continue;
+
+                foreach (MqoWeit weit in bone.weits)
+                {
+                    Dictionary<int, List<MqoWeit>> map = weitmap[weit.object_id];
+                    List<MqoWeit> weits;
+                    if (! map.TryGetValue(weit.vertex_id, out weits))
+                    {
+                        weits = map[weit.vertex_id] = new List<MqoWeit>(4);
+                    }
+                    weits.Add(weit);
+                }
+            }
+        }
+
+        public void UpdateWeits(int object_id, int vertex_id)
+        {
+            List<MqoWeit> weits = weitmap[object_id][vertex_id];
+            int len = weits.Count;
+            if (len > 4)
+                len = 4;
+
+            //todo: sort
+
+            for (int i = 0; i < len; ++i)
+            {
+                this.weits[i].bone_id = weits[i].bone_id;
+                this.weits[i].weit = weits[i].weit; 
+            }
+            for (int i = len; i < 4; ++i)
+            {
+                this.weits[i].bone_id = 1;
+                this.weits[i].weit = 0.0f;
+            }
         }
     }
 }
index bbeae84..2ed0bd0 100644 (file)
@@ -14,6 +14,7 @@ namespace Tso2MqoGui
         string dir;\r
         TSOGeneratorConfig config;\r
         protected MqoReader mqo;\r
+        protected MqxReader mqx;\r
         protected TSOFile tsoref;\r
         protected List<TSOMesh> meshes;\r
         ImportInfo ii;\r
@@ -49,6 +50,18 @@ namespace Tso2MqoGui
             return true;\r
         }\r
 \r
+        bool DoLoadMqx(string mqo_file)\r
+        {\r
+            // Mqx読み込み\r
+            mqx = new MqxReader();\r
+            if (mqx.Load(mqo_file))\r
+            {\r
+                mqx.CreateWeits();\r
+                mqx.CreateWeitMap();\r
+            }\r
+            return true;\r
+        }\r
+\r
         bool DoLoadXml(string importinfo_file)\r
         {\r
             // XML読み込み\r
@@ -296,6 +309,7 @@ namespace Tso2MqoGui
             {\r
                 if (!SetCurrentDirectory(dir)) return;\r
                 if (!DoLoadMQO(mqo_file)) return;\r
+                if (!DoLoadMqx(mqo_file)) return;\r
                 if (!DoLoadRefTSO(tsoref_file)) return;\r
                 if (!DoLoadXml(importinfo_file)) return;\r
                 if (!DoOutput(tsoout_file)) return;\r
index e6c598c..e84379e 100644 (file)
@@ -12,34 +12,11 @@ namespace Tso2MqoGui
         {
         }
 
-        MqoWeit[] weits;
-
-        void CreateWeits()
-        {
-            weits = new MqoWeit[4];
-            for (int i = 0; i < 4; ++i)
-            {
-                weits[i] = new MqoWeit();
-            }
-        }
-
         protected override bool DoLoadRefTSO(string path)
         {
             tsoref = LoadTSO(path);
-            CreateWeits();
-            return true;
-        }
-
-        void UpdateWeits(int object_id, int vertex_id)
-        {
-            //todo
 
-            for (int i = 0; i < 4; ++i)
-            {
-                weits[i].bone_id = 1;
-                weits[i].weit = 0.0f;
-            }
-            weits[0].weit = 1.0f;
+            return true;
         }
 
         protected override bool DoGenerateMeshes()
@@ -105,12 +82,11 @@ namespace Tso2MqoGui
                             float* wgt = (float*)(&wgt0);
 
                             int vertex_id = obj.vertices[face.vert_indices[k]].id;
-                            UpdateWeits(object_id, vertex_id);
-
+                            mqx.UpdateWeits(object_id, vertex_id);
                             for (int l = 0; l < 4; ++l)
                             {
-                                idx[l] = (byte)(weits[l].bone_id-1);
-                                wgt[l] = weits[l].weit;
+                                idx[l] = (byte)(mqx.weits[l].bone_id-1);
+                                wgt[l] = mqx.weits[l].weit;
                             }
                             refvs[k].Idx = idx0;
                             refvs[k].Wgt = wgt0;