Example #1
0
 private bool DoLoadMQO(string mqo_file)
 {
     // MQO読み込み
     mqo = new MqoFile();
     mqo.Load(mqo_file);
     mqo.Dump();
     return(true);
 }
Example #2
0
 public void Load(string path)
 {
     using (FileStream stream = File.OpenRead(path))
     {
         reader = new StreamReader(stream, Encoding.Default);
         mqo    = new MqoFile();
         ReadAll();
     }
 }
Example #3
0
        protected virtual bool DoCleanup()
        {
            dir       = null;
            tsoref    = null;
            nodes     = null;
            meshes    = null;
            mqo       = null;
            ii        = null;
            bw        = null;
            materials = null;
            textures  = null;

            System.GC.Collect();
            return(true);
        }
Example #4
0
        private void btnRefresh_Click(object sender, EventArgs e)
        {
            try
            {
                // 一旦現状を保存
                SaveAssign();

                // オブジェクト
                MqoFile mqo = new MqoFile();
                mqo.Load(tbMqoFile.Text);
                lvObjects.Items.Clear();

                foreach (MqoObject i in mqo.Objects)
                {
                    ListViewItem item = lvObjects.Items.Add(i.name);
                    item.Tag = i;
                    string bone;

                    if (Config.Instance.object_bone_map.TryGetValue(i.name, out bone))
                    {
                        item.SubItems.Add(bone);
                    }
                    else
                    {
                        item.SubItems.Add("");
                    }
                }

                // ボーン構造
                TSOFile tso = new TSOFile(tbTsoFileRef.Text);
                tso.ReadAll();
                tvBones.Visible = false;
                tvBones.Nodes.Clear();
                BuildBoneTree(tvBones.Nodes, tso.nodes[0]);
                tvBones.ExpandAll();
                tvBones.Nodes[0].EnsureVisible();
            }
            catch (Exception ex)
            {
                Util.ProcessError(ex);
            }
            finally
            {
                tvBones.Visible = true;
            }
        }
Example #5
0
        public static void Main(string[] args)
        {
            Debug.Listeners.Add(new TextWriterTraceListener(Console.Out));

            if (args.Length != 1)
            {
                Console.WriteLine("TetraHedron.exe <mqo file>");
                return;
            }
            string source_file = args[0];

            MqoFile mqo = new MqoFile();

            mqo.Load(source_file);
            //mqo.Dump();

            //TextWriter tw = Console.Out;
            string dest_path   = Path.GetDirectoryName(source_file);
            string folder_name = Path.GetFileNameWithoutExtension(source_file);

            dest_path = Path.Combine(dest_path, folder_name + @".tetrahedron.mqo");

            Console.WriteLine("Save File: " + dest_path);
            TextWriter tw = new StreamWriter(File.Create(dest_path));

            tw.WriteLine("Metasequoia Document");
            tw.WriteLine("Format Text Ver 1.0");
            tw.WriteLine("");
            tw.WriteLine("Scene {");
            tw.WriteLine("	pos -7.0446 4.1793 1541.1764");
            tw.WriteLine("	lookat 11.8726 193.8590 0.4676");
            tw.WriteLine("	head 0.8564");
            tw.WriteLine("	pich 0.1708");
            tw.WriteLine("	ortho 0");
            tw.WriteLine("	zoom2 31.8925");
            tw.WriteLine("	amb 0.250 0.250 0.250");
            tw.WriteLine("}");

            foreach (MqoObject obj in mqo.Objects)
            {
                int nverts = obj.vertices.Count;
                int nfaces = obj.faces.Count;
                //Console.WriteLine("name:{0} vertices:{1} faces:{2}", obj.name, nverts, nfaces);

                //面を構成する頂点出現回数
                uint[] vcounts = new uint[nverts];
                for (int i = 0; i < nverts; i++)
                {
                    vcounts[i] = 0;
                }

                foreach (MqoFace face in obj.faces)
                {
                    vcounts[face.a]++;
                    vcounts[face.b]++;
                    vcounts[face.c]++;
                }

                //頂点が3面に含まれるとき真になる頂点配列
                bool[] vfounds = new bool[nverts];
                for (int i = 0; i < nverts; i++)
                {
                    vfounds[i] = false;
                }

                for (int i = 0; i < nverts; i++)
                {
                    if (vcounts[i] == 3)
                    {
                        vfounds[i] = true;
                    }
                }

                //前提: 3面に含まれる頂点が対象
                //頂点idと面リストを対応付ける辞書
                Dictionary <ushort, List <MqoFace> > facemap = new Dictionary <ushort, List <MqoFace> >();

                foreach (MqoFace face in obj.faces)
                {
                    if (vfounds[face.a])
                    {
                        if (!facemap.ContainsKey(face.a))
                        {
                            facemap[face.a] = new List <MqoFace>(3);
                        }
                        facemap[face.a].Add(face);
                    }
                    if (vfounds[face.b])
                    {
                        if (!facemap.ContainsKey(face.b))
                        {
                            facemap[face.b] = new List <MqoFace>(3);
                        }
                        facemap[face.b].Add(face);
                    }
                    if (vfounds[face.c])
                    {
                        if (!facemap.ContainsKey(face.c))
                        {
                            facemap[face.c] = new List <MqoFace>(3);
                        }
                        facemap[face.c].Add(face);
                    }
                }

                //4面体の中心頂点idリスト
                List <ushort> centary = new List <ushort>();

                Dictionary <ushort, ushort> vidxmap = new Dictionary <ushort, ushort>();
                List <ushort> vidxary = new List <ushort>();

                foreach (ushort i in facemap.Keys)
                {
                    List <MqoFace> faces = facemap[i];

                    //前提: 3面に含まれる頂点が対象
                    //頂点idと頂点出現回数を関連付ける辞書
                    Dictionary <ushort, int> vcs = new Dictionary <ushort, int>();

                    foreach (MqoFace face in faces)
                    {
                        if (!vcs.ContainsKey(face.a))
                        {
                            vcs[face.a] = 0;
                        }
                        vcs[face.a]++;
                        if (!vcs.ContainsKey(face.b))
                        {
                            vcs[face.b] = 0;
                        }
                        vcs[face.b]++;
                        if (!vcs.ContainsKey(face.c))
                        {
                            vcs[face.c] = 0;
                        }
                        vcs[face.c]++;
                    }

                    if (vcs.Count == 4)
                    {
                        //Console.WriteLine("v#{0} in tetrahedron.", i);

                        centary.Add(i);
                        foreach (MqoFace face in faces)
                        {
                            if (!vidxmap.ContainsKey(face.a))
                            {
                                vidxmap[face.a] = (ushort)vidxary.Count;
                                vidxary.Add(face.a);
                            }
                            if (!vidxmap.ContainsKey(face.b))
                            {
                                vidxmap[face.b] = (ushort)vidxary.Count;
                                vidxary.Add(face.b);
                            }
                            if (!vidxmap.ContainsKey(face.c))
                            {
                                vidxmap[face.c] = (ushort)vidxary.Count;
                                vidxary.Add(face.c);
                            }
                        }
                    }
                }

                if (vidxary.Count == 0)
                {
                    continue;
                }

                Console.WriteLine("name:{0} vertices:{1} faces:{2}", "tetrahedron-" + obj.name, vidxary.Count, centary.Count * 3);

                tw.WriteLine("Object \"{0}\" {{", "tetrahedron-" + obj.name);
                tw.WriteLine("	visible {0}", 15);
                tw.WriteLine("	locking {0}", 0);
                tw.WriteLine("	shading {0}", 1);
                tw.WriteLine("	facet {0}", 59.5);
                tw.WriteLine("	color {0:F3} {1:F3} {2:F3}", 0.898f, 0.498f, 0.698f);
                tw.WriteLine("	color_type {0}", 0);

                tw.WriteLine("	vertex {0} {{", vidxary.Count);

                foreach (ushort i in vidxary)
                {
                    Point3 po = obj.vertices[i];
                    WriteVert(tw, ref po);
                }

                tw.WriteLine("	}");
                tw.WriteLine("	face {0} {{", centary.Count * 3);

                foreach (ushort i in centary)
                {
                    List <MqoFace> faces = facemap[i];

                    foreach (MqoFace face in faces)
                    {
                        ushort a = vidxmap[face.a];
                        ushort b = vidxmap[face.b];
                        ushort c = vidxmap[face.c];
                        WriteFace(tw, a, b, c);
                    }
                }

                tw.WriteLine("	}");
                tw.WriteLine("}");
            }
            tw.Close();
        }