string mqo_file = args[0];
MqxReader reader = new MqxReader();
- reader.MqoFile = mqo_file;
- reader.Read();
+ reader.Load(mqo_file);
}
}
}
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);
}
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
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
}
}
}
// ボーン配列 [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");
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;
+ }
}
}
}
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
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
{\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
{
}
- 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()
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;