From: nomeu Date: Mon, 26 Jan 2015 16:38:47 +0000 (+0900) Subject: MqxReader#CreateWeitMap X-Git-Tag: v0.37-rc2~15 X-Git-Url: http://git.sourceforge.jp/view?p=tdcgexplorer%2Ftso2mqo.git;a=commitdiff_plain;h=0c3a043a8603644a6fe5e11b63d445cbf05d28f7 MqxReader#CreateWeitMap --- diff --git a/MqxDump.cs b/MqxDump.cs index 19fff65..895fb75 100644 --- a/MqxDump.cs +++ b/MqxDump.cs @@ -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); } } } diff --git a/MqxFile.cs b/MqxFile.cs index a3d6d4e..dd60091 100644 --- a/MqxFile.cs +++ b/MqxFile.cs @@ -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 } } } diff --git a/MqxReader.cs b/MqxReader.cs index b620bdf..2bf3730 100644 --- a/MqxReader.cs +++ b/MqxReader.cs @@ -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>> weitmap; + + public void CreateWeitMap() + { + int maxobjects = 255; + weitmap = new List>>(maxobjects); + for (int i = 0; i < maxobjects; i++) + { + weitmap.Add(new Dictionary>(2048)); + } + foreach (MqoBone bone in bones) + { + if (bone == null) + continue; + + foreach (MqoWeit weit in bone.weits) + { + Dictionary> map = weitmap[weit.object_id]; + List weits; + if (! map.TryGetValue(weit.vertex_id, out weits)) + { + weits = map[weit.vertex_id] = new List(4); + } + weits.Add(weit); + } + } + } + + public void UpdateWeits(int object_id, int vertex_id) + { + List 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; + } } } } diff --git a/TSOGenerator.cs b/TSOGenerator.cs index bbeae84..2ed0bd0 100644 --- a/TSOGenerator.cs +++ b/TSOGenerator.cs @@ -14,6 +14,7 @@ namespace Tso2MqoGui string dir; TSOGeneratorConfig config; protected MqoReader mqo; + protected MqxReader mqx; protected TSOFile tsoref; protected List meshes; ImportInfo ii; @@ -49,6 +50,18 @@ namespace Tso2MqoGui return true; } + bool DoLoadMqx(string mqo_file) + { + // Mqx読み込み + mqx = new MqxReader(); + if (mqx.Load(mqo_file)) + { + mqx.CreateWeits(); + mqx.CreateWeitMap(); + } + return true; + } + bool DoLoadXml(string importinfo_file) { // XML読み込み @@ -296,6 +309,7 @@ namespace Tso2MqoGui { if (!SetCurrentDirectory(dir)) return; if (!DoLoadMQO(mqo_file)) return; + if (!DoLoadMqx(mqo_file)) return; if (!DoLoadRefTSO(tsoref_file)) return; if (!DoLoadXml(importinfo_file)) return; if (!DoOutput(tsoout_file)) return; diff --git a/TSOGeneratorMqxBone.cs b/TSOGeneratorMqxBone.cs index e6c598c..e84379e 100644 --- a/TSOGeneratorMqxBone.cs +++ b/TSOGeneratorMqxBone.cs @@ -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;