Пример #1
0
        void ExportToObj(lwGeomObjInfo geom, string obj_name, string pathtomodel, ExportGroup group, ExportObjInfo info)
        {
            System.IO.StreamWriter objwriter = info.objwriter;
            System.IO.StreamWriter mtlwriter = info.mtlwriter;

            int startvertex   = info.totalvertexes;
            int startnormal   = info.totalnormals;
            int starttexcoord = info.totaltexcoord;
            int startindex    = info.totalindexes;

            bool texcoordexist = false;
            bool normalexist   = false;

            lock (threadLock)
            {
                for (int i = 0; i < geom.mesh.header.vertex_num; i++)
                {
                    D3DXVECTOR3 pos = geom.mesh.vertex_seq[i];
                    pos = pos * geom.header.mat_local;

                    if (checkBox5.Checked)
                    {
                        float z = -pos.y;
                        pos.y = pos.z;
                        pos.z = z;
                    }

                    objwriter.WriteLine("v {0:0.0000} {1:0.0000} {2:0.0000}", pos.x, pos.y, pos.z);
                    info.totalvertexes++;
                }

                if ((geom.mesh.header.fvf & 0x10) != 0)
                {
                    normalexist = true;
                    for (int i = 0; i < geom.mesh.header.vertex_num; i++)
                    {
                        objwriter.WriteLine("vn {0:0.0000} {1:0.0000} {2:0.0000}", geom.mesh.normal_seq[i].x, geom.mesh.normal_seq[i].y, geom.mesh.normal_seq[i].z);
                        info.totalnormals++;
                    }
                }
                if ((geom.mesh.header.fvf & 0x100) != 0 || (geom.mesh.header.fvf & 0x200) != 0 || (geom.mesh.header.fvf & 0x300) != 0 || (geom.mesh.header.fvf & 0x400) != 0)
                {
                    texcoordexist = true;
                    for (int i = 0; i < geom.mesh.header.vertex_num; i++)
                    {
                        if (checkBox4.Checked)
                        {
                            objwriter.WriteLine("vt {0:0.0000} {1:0.0000}", geom.mesh.texcoord0_seq[i].x, 1 - geom.mesh.texcoord0_seq[i].y);
                        }
                        else
                        {
                            objwriter.WriteLine("vt {0:0.0000} {1:0.0000}", geom.mesh.texcoord0_seq[i].x, geom.mesh.texcoord0_seq[i].y);
                        }
                        info.totaltexcoord++;
                    }
                }
            }

            for (int i = 0; i < geom.mesh.header.subset_num; i++)
            {
                string mtlname = obj_name;
                lock (threadLock)
                {
                    objwriter.WriteLine("\ng {0}_{1}", mtlname, i);
                    objwriter.WriteLine("usemtl {0}-{1}\n", mtlname, i);
                    objwriter.WriteLine("s off");

                    for (int j = 0; j < geom.mesh.subset_seq[i].primitive_num * 3; j += 3)
                    {
                        objwriter.Write("f ");
                        for (int k = 0; k < 3; k++)
                        {
                            uint facevertex   = (uint)(geom.mesh.index_seq[j + k + geom.mesh.subset_seq[i].start_index] + startvertex) + 1;
                            uint facenormal   = (uint)(geom.mesh.index_seq[j + k + geom.mesh.subset_seq[i].start_index] + startnormal) + 1;
                            uint facetexcoord = (uint)(geom.mesh.index_seq[j + k + geom.mesh.subset_seq[i].start_index] + starttexcoord) + 1;
                            if (normalexist && texcoordexist)
                            {
                                objwriter.Write("{0}/{1}/{2} ", facevertex, facetexcoord, facenormal);
                            }
                            else if (normalexist && !texcoordexist)
                            {
                                objwriter.Write("{0}//{2} ", facevertex, facenormal);
                            }
                            else if (!normalexist && texcoordexist)
                            {
                                objwriter.Write("{0}/{1} ", facevertex, facetexcoord);
                            }
                            else
                            {
                                objwriter.Write("{0} ", facevertex);
                            }
                        }
                        objwriter.Write("\n");
                    }

                    mtlwriter.WriteLine("newmtl {0}-{1}", mtlname, i);
                    mtlwriter.WriteLine("Ka {0} {1} {2}", geom.mtl_seq[i].mtl.amb.r, geom.mtl_seq[i].mtl.amb.g, geom.mtl_seq[i].mtl.amb.b);
                    mtlwriter.WriteLine("Kd {0} {1} {2}", geom.mtl_seq[i].mtl.dif.r, geom.mtl_seq[i].mtl.dif.g, geom.mtl_seq[i].mtl.dif.b);
                    mtlwriter.WriteLine("Ks {0} {1} {2}", geom.mtl_seq[i].mtl.spe.r, geom.mtl_seq[i].mtl.spe.g, geom.mtl_seq[i].mtl.spe.b);

                    string newtexturepath = RelativePath(System.IO.Path.GetDirectoryName(textBox1.Text) + "\\", System.IO.Path.GetDirectoryName(textBox2.Text) + "\\");
                    mtlwriter.WriteLine("map_Kd {0}", newtexturepath + CutString(geom.mtl_seq[i].tex_seq[0].file_name));
                }

                if (checkBox2.Checked)
                {
                    string path = System.IO.Path.GetDirectoryName(pathtomodel).Replace("\\model\\", "\\texture\\");
                    System.Drawing.Bitmap bmp = parentForm.LoadBitmaByTextureName(path + "\\" + CutString(geom.mtl_seq[i].tex_seq[0].file_name));
                    bmp.Save(System.IO.Path.GetDirectoryName(textBox2.Text) + "\\" + CutString(geom.mtl_seq[i].tex_seq[0].file_name));
                }
                else
                {
                    string path     = System.IO.Path.GetDirectoryName(pathtomodel).Replace("\\model\\", "\\texture\\");
                    string filename = parentForm.GetRightTextureName(path + "\\" + CutString(geom.mtl_seq[i].tex_seq[0].file_name));

                    if (filename != null)
                    {
                        System.IO.File.Copy(filename, System.IO.Path.GetDirectoryName(textBox2.Text) + "\\" + CutString(geom.mtl_seq[i].tex_seq[0].file_name), true);
                    }
                }
            }
        }
Пример #2
0
 public void Add(lwGeomObjInfo geom, string filename)
 {
     geoms.Add(geom);
     geomsoriginpath.Add(filename);
 }
Пример #3
0
        private void button5_Click(object sender, EventArgs e)
        {
            foreach (object obj in listBoxExport.SelectedItems)
            {
                ExportGroup group = new ExportGroup();
                string listItem = (string)obj;

                int indexstart = listItem.LastIndexOf('[');
                int indexend = listItem.LastIndexOf(']');

                string indexstring = listItem.Substring(indexstart + 1, indexend - indexstart - 1);
                int index = int.Parse(indexstring);

                if (listItem.StartsWith("[lgo]"))
                {
                    string filename = parentForm.lgofiles[index];

                    lwGeomObjInfo geom = new lwGeomObjInfo();
                    if (geom.Load(filename) == 0)
                        group.Add(geom, filename);
                }
                if (listItem.StartsWith("[lmo]"))
                {
                    string filename = parentForm.lmofiles[index];

                    lwModelObjInfo model = new lwModelObjInfo();
                    if (model.Load(filename) == 0)
                        group.Add(model, filename);
                }
                if (listItem.StartsWith("[char]"))
                {
                    CChaRecord character = parentForm.chainfo[index];

                    for (int i = 0; i < 5; i++)
                    {
                        if (character.sSkinInfo[i] != 0)
                        {
                            if (character.chModalType == 1)
                            {
                                CItemRecord rec = parentForm.iteminfo[parentForm.iteminfokeys[character.sSkinInfo[i]]];

                                char[] mdl = new char[19];
                                Array.Copy(rec.chModule, (character.sModel + 1) * 19, mdl, 0, 19);

                                lwGeomObjInfo geom = new lwGeomObjInfo();
                                string filenameModel = parentForm.textBox1.Text + "model\\character\\" + CutString(mdl) + ".lgo";
                                if (geom.Load(filenameModel) == 0)
                                    group.Add(geom, filenameModel);
                            }
                            if (character.chModalType == 2)
                            {
                                CItemRecord rec = parentForm.iteminfo[parentForm.iteminfokeys[character.sSkinInfo[i]]];

                                char[] mdl = new char[19];
                                Array.Copy(rec.chModule, 0, mdl, 0, 19);

                                lwGeomObjInfo geom = new lwGeomObjInfo();
                                string filenameModel = parentForm.textBox1.Text + "model\\character\\" + CutString(mdl) + ".lgo";
                                if (geom.Load(filenameModel) == 0)
                                    group.Add(geom, filenameModel);
                            }
                            if (character.chModalType == 4)
                            {
                                lwGeomObjInfo geom = new lwGeomObjInfo();
                                string filenameModel = parentForm.textBox1.Text + "model\\character\\" + (i + 10000 * (character.sSuitID + 100 * character.sModel)).ToString("0000000000") + ".lgo";
                                if (geom.Load(filenameModel) == 0)
                                    group.Add(geom, filenameModel);
                            }
                        }
                    }
                }
                if (listItem.StartsWith("[item]"))
                {
                    CItemRecord item = parentForm.iteminfo[index];

                    for (int i = 0; i < 5; i++)
                    {
                        char[] mdl = new char[19];
                        Array.Copy(item.chModule, i * 19, mdl, 0, 19);
                        lwGeomObjInfo geom = new lwGeomObjInfo();
                        string filenameModel = parentForm.textBox1.Text + "model\\item\\" + CutString(mdl) + ".lgo";
                        if (item.sType >= 19 && item.sType <= 25) filenameModel = parentForm.textBox1.Text + "model\\character\\" + CutString(mdl) + ".lgo";

                        if (geom.Load(filenameModel) == 0)
                            group.Add(geom, filenameModel);
                    }
                }

                Export(group);
            }

            button4_Click(sender, e);
        }
Пример #4
0
        private void button5_Click(object sender, EventArgs e)
        {
            foreach (object obj in listBoxExport.SelectedItems)
            {
                ExportGroup group    = new ExportGroup();
                string      listItem = (string)obj;

                int indexstart = listItem.LastIndexOf('[');
                int indexend   = listItem.LastIndexOf(']');

                string indexstring = listItem.Substring(indexstart + 1, indexend - indexstart - 1);
                int    index       = int.Parse(indexstring);

                if (listItem.StartsWith("[lgo]"))
                {
                    string filename = parentForm.lgofiles[index];

                    lwGeomObjInfo geom = new lwGeomObjInfo();
                    if (geom.Load(filename) == 0)
                    {
                        group.Add(geom, filename);
                    }
                }
                if (listItem.StartsWith("[lmo]"))
                {
                    string filename = parentForm.lmofiles[index];

                    lwModelObjInfo model = new lwModelObjInfo();
                    if (model.Load(filename) == 0)
                    {
                        group.Add(model, filename);
                    }
                }
                if (listItem.StartsWith("[char]"))
                {
                    CChaRecord character = parentForm.chainfo[index];

                    for (int i = 0; i < 5; i++)
                    {
                        if (character.sSkinInfo[i] != 0)
                        {
                            if (character.chModalType == 1)
                            {
                                CItemRecord rec = parentForm.iteminfo[parentForm.iteminfokeys[character.sSkinInfo[i]]];

                                char[] mdl = new char[19];
                                Array.Copy(rec.chModule, (character.sModel + 1) * 19, mdl, 0, 19);

                                lwGeomObjInfo geom          = new lwGeomObjInfo();
                                string        filenameModel = parentForm.textBox1.Text + "model\\character\\" + CutString(mdl) + ".lgo";
                                if (geom.Load(filenameModel) == 0)
                                {
                                    group.Add(geom, filenameModel);
                                }
                            }
                            if (character.chModalType == 2)
                            {
                                CItemRecord rec = parentForm.iteminfo[parentForm.iteminfokeys[character.sSkinInfo[i]]];

                                char[] mdl = new char[19];
                                Array.Copy(rec.chModule, 0, mdl, 0, 19);

                                lwGeomObjInfo geom          = new lwGeomObjInfo();
                                string        filenameModel = parentForm.textBox1.Text + "model\\character\\" + CutString(mdl) + ".lgo";
                                if (geom.Load(filenameModel) == 0)
                                {
                                    group.Add(geom, filenameModel);
                                }
                            }
                            if (character.chModalType == 4)
                            {
                                lwGeomObjInfo geom          = new lwGeomObjInfo();
                                string        filenameModel = parentForm.textBox1.Text + "model\\character\\" + (i + 10000 * (character.sSuitID + 100 * character.sModel)).ToString("0000000000") + ".lgo";
                                if (geom.Load(filenameModel) == 0)
                                {
                                    group.Add(geom, filenameModel);
                                }
                            }
                        }
                    }
                }
                if (listItem.StartsWith("[item]"))
                {
                    CItemRecord item = parentForm.iteminfo[index];

                    for (int i = 0; i < 5; i++)
                    {
                        char[] mdl = new char[19];
                        Array.Copy(item.chModule, i * 19, mdl, 0, 19);
                        lwGeomObjInfo geom          = new lwGeomObjInfo();
                        string        filenameModel = parentForm.textBox1.Text + "model\\item\\" + CutString(mdl) + ".lgo";
                        if (item.sType >= 19 && item.sType <= 25)
                        {
                            filenameModel = parentForm.textBox1.Text + "model\\character\\" + CutString(mdl) + ".lgo";
                        }

                        if (geom.Load(filenameModel) == 0)
                        {
                            group.Add(geom, filenameModel);
                        }
                    }
                }

                Export(group);
            }

            button4_Click(sender, e);
        }
Пример #5
0
        void ExportToObj(lwGeomObjInfo geom, string obj_name, string pathtomodel, ExportGroup group, ExportObjInfo info)
        {
            System.IO.StreamWriter objwriter = info.objwriter;
            System.IO.StreamWriter mtlwriter = info.mtlwriter;

            int startvertex = info.totalvertexes;
            int startnormal = info.totalnormals;
            int starttexcoord = info.totaltexcoord;
            int startindex = info.totalindexes;

            bool texcoordexist = false;
            bool normalexist = false;

            lock (threadLock)
            {
                for (int i = 0; i < geom.mesh.header.vertex_num; i++)
                {
                    D3DXVECTOR3 pos = geom.mesh.vertex_seq[i];
                    pos = pos * geom.header.mat_local;

                    if (checkBox5.Checked)
                    {
                        float z = -pos.y;
                        pos.y = pos.z;
                        pos.z = z;
                    }

                    objwriter.WriteLine("v {0:0.0000} {1:0.0000} {2:0.0000}", pos.x, pos.y, pos.z);
                    info.totalvertexes++;
                }

                if ((geom.mesh.header.fvf & 0x10) != 0)
                {
                    normalexist = true;
                    for (int i = 0; i < geom.mesh.header.vertex_num; i++)
                    {
                        objwriter.WriteLine("vn {0:0.0000} {1:0.0000} {2:0.0000}", geom.mesh.normal_seq[i].x, geom.mesh.normal_seq[i].y, geom.mesh.normal_seq[i].z);
                        info.totalnormals++;
                    }
                }
                if ((geom.mesh.header.fvf & 0x100) != 0 || (geom.mesh.header.fvf & 0x200) != 0 || (geom.mesh.header.fvf & 0x300) != 0 || (geom.mesh.header.fvf & 0x400) != 0)
                {
                    texcoordexist = true;
                    for (int i = 0; i < geom.mesh.header.vertex_num; i++)
                    {
                        if (checkBox4.Checked)
                            objwriter.WriteLine("vt {0:0.0000} {1:0.0000}", geom.mesh.texcoord0_seq[i].x, 1 - geom.mesh.texcoord0_seq[i].y);
                        else
                            objwriter.WriteLine("vt {0:0.0000} {1:0.0000}", geom.mesh.texcoord0_seq[i].x, geom.mesh.texcoord0_seq[i].y);
                        info.totaltexcoord++;
                    }
                }
            }

            for (int i = 0; i < geom.mesh.header.subset_num; i++)
            {
                string mtlname = obj_name;
                lock (threadLock)
                {
                    objwriter.WriteLine("\ng {0}_{1}", mtlname, i);
                    objwriter.WriteLine("usemtl {0}-{1}\n", mtlname,i);
                    objwriter.WriteLine("s off");

                    for (int j = 0; j < geom.mesh.subset_seq[i].primitive_num * 3; j += 3)
                    {
                        objwriter.Write("f ");
                        for (int k = 0; k < 3; k++)
                        {
                            uint facevertex = (uint)(geom.mesh.index_seq[j + k + geom.mesh.subset_seq[i].start_index] + startvertex) + 1;
                            uint facenormal = (uint)(geom.mesh.index_seq[j + k + geom.mesh.subset_seq[i].start_index] + startnormal) + 1;
                            uint facetexcoord = (uint)(geom.mesh.index_seq[j + k + geom.mesh.subset_seq[i].start_index] + starttexcoord) + 1;
                            if (normalexist && texcoordexist)
                                objwriter.Write("{0}/{1}/{2} ", facevertex, facetexcoord, facenormal);
                            else if (normalexist && !texcoordexist)
                                objwriter.Write("{0}//{2} ", facevertex, facenormal);
                            else if (!normalexist && texcoordexist)
                                objwriter.Write("{0}/{1} ", facevertex, facetexcoord);
                            else
                                objwriter.Write("{0} ", facevertex);
                        }
                        objwriter.Write("\n");
                    }

                    mtlwriter.WriteLine("newmtl {0}-{1}", mtlname,i);
                    mtlwriter.WriteLine("Ka {0} {1} {2}", geom.mtl_seq[i].mtl.amb.r, geom.mtl_seq[i].mtl.amb.g, geom.mtl_seq[i].mtl.amb.b);
                    mtlwriter.WriteLine("Kd {0} {1} {2}", geom.mtl_seq[i].mtl.dif.r, geom.mtl_seq[i].mtl.dif.g, geom.mtl_seq[i].mtl.dif.b);
                    mtlwriter.WriteLine("Ks {0} {1} {2}", geom.mtl_seq[i].mtl.spe.r, geom.mtl_seq[i].mtl.spe.g, geom.mtl_seq[i].mtl.spe.b);

                    string newtexturepath = RelativePath(System.IO.Path.GetDirectoryName(textBox1.Text) + "\\", System.IO.Path.GetDirectoryName(textBox2.Text) + "\\");
                    mtlwriter.WriteLine("map_Kd {0}", newtexturepath + CutString(geom.mtl_seq[i].tex_seq[0].file_name));
                }

                if (checkBox2.Checked)
                {
                    string path = System.IO.Path.GetDirectoryName(pathtomodel).Replace("\\model\\", "\\texture\\");
                    System.Drawing.Bitmap bmp = parentForm.LoadBitmaByTextureName(path + "\\" + CutString(geom.mtl_seq[i].tex_seq[0].file_name));
                    bmp.Save(System.IO.Path.GetDirectoryName(textBox2.Text) + "\\" + CutString(geom.mtl_seq[i].tex_seq[0].file_name));
                }
                else
                {
                    string path = System.IO.Path.GetDirectoryName(pathtomodel).Replace("\\model\\", "\\texture\\");
                    string filename = parentForm.GetRightTextureName(path + "\\" + CutString(geom.mtl_seq[i].tex_seq[0].file_name));

                    if (filename != null)
                        System.IO.File.Copy(filename, System.IO.Path.GetDirectoryName(textBox2.Text) + "\\" + CutString(geom.mtl_seq[i].tex_seq[0].file_name), true);
                }
            }
        }
Пример #6
0
 public void Add(lwGeomObjInfo geom, string filename)
 {
     geoms.Add(geom);
     geomsoriginpath.Add(filename);
 }
Пример #7
0
        private void treeOfFiles_AfterSelect(object sender, TreeViewEventArgs e)
        {
            if (e.Node.Level == 1)
            {
                string name = e.Node.Text;
                int index = e.Node.Index;
                int parentindex = e.Node.Parent.Index;
                pictureBox1.Visible = false;

                #region lab loading
                if (parentindex == 0)
                {
                    lwAnimDataBone bone = new lwAnimDataBone();
                    if (bone.Load(labfiles[index]) != 0) { bone = null; return; }

                    drawNum = 1;
                    drawObject[0] = bone;
                    drawObjectType[0] = DrawObjectType.lab;

                    glControl1.Refresh();

                    string info = labfiles[index] + "\n";
                    info += "\nbones: " + bone._header.bone_num;
                    info += "\nframes: " + bone._header.frame_num;
                    info += "\ndummys: " + bone._header.dummy_num;
                    info += "\nkey type: " + bone._header.key_type;

                    for (int i = 0; i < bone._header.bone_num; i++)
                    {
                        string bonename = new string(bone._base_seq[i].name);
                        if (bonename.IndexOf('\0') > 0)
                        {
                            bonename = bonename.Substring(0, bonename.IndexOf('\0'));
                            info += "\n bone " + bonename + " [" + bone._base_seq[i].id + " - " + bone._base_seq[i].parent_id + "]";
                        }
                    }
                    for (int i = 0; i < bone._header.dummy_num; i++)
                        info += "\n dummy " + bone._dummy_seq[i].id + " [" + bone._dummy_seq[i].parent_bone_id + "]";

                    richTextBox1.Text = info;
                    EnableAnimation((int)bone._header.frame_num);
                }
                #endregion

                #region lgo loading
                else if (parentindex == 1)
                {
                    totaltextures = 0;
                    lwGeomObjInfo geom = new lwGeomObjInfo();
                    if (geom.Load(lgofiles[index]) != 0) { geom = null; return; }

                    drawNum = 1;
                    drawObject[0] = geom;
                    drawObjectType[0] = DrawObjectType.lgo;

                    DisableAnimation();
                    DeleteAllTextures();
                    LoadTexturesToGeom(ref geom, lgofiles[index]);

                    if (geom.anim_data != null)
                    {
                        if (geom.anim_data.anim_bone != null)
                            EnableAnimation((int)geom.anim_data.anim_bone._header.frame_num);
                        if(geom.anim_data.anim_mat!=null)
                            EnableAnimation((int)geom.anim_data.anim_mat._frame_num);
                    }

                    string info = lgofiles[index] + "\n";
                    info += "\nmaterials:" + geom.mtl_num;
                    for (int i = 0; i < geom.mtl_num; i++)
                    {
                        info += "\n    mtl" + i + " textures:" + geom.mtl_seq[i].tex_seq.Length;
                        for (int j = 0; j < geom.mtl_seq[i].tex_seq.Length; j++)
                        {
                            if (geom.mtl_seq[i].tex_seq[j] != null && geom.mtl_seq[i].tex_seq[j].file_name != null)
                            {
                                int length = 0;
                                while (geom.mtl_seq[i].tex_seq[j].file_name[length] != '\0' && length < geom.mtl_seq[i].tex_seq[j].file_name.Length) length++;
                                string filename = new string(geom.mtl_seq[i].tex_seq[j].file_name, 0, length);
                                info += "\n        " + j + ":" + filename;
                            }
                        }
                    }
                    info += "\nmesh vertex num:" + geom.mesh.header.vertex_num;
                    info += "\nmesh index num:" + geom.mesh.header.index_num;

                    richTextBox1.Text = info;

                    glControl1.Refresh();
                }
                #endregion

                #region lmo loading
                else if (parentindex == 2)
                {
                    totaltextures = 0;
                    lwModelObjInfo model = new lwModelObjInfo();
                    if (model.Load(lmofiles[index]) != 0) { model = null; return; }

                    drawNum = 1;
                    drawObject[0] = model;
                    drawObjectType[0] = DrawObjectType.lmo;

                    string info = lmofiles[index] + "\n";
                    info += "\nmodels: " + model.geom_obj_num;

                    DisableAnimation();
                    DeleteAllTextures();

                    for (int q = 0; q < model.geom_obj_num; q++)
                    {
                        lwGeomObjInfo geom = model.geom_obj_seq[q];
                        LoadTexturesToGeom(ref model.geom_obj_seq[q], lmofiles[index]);
                        if (geom.anim_data != null)
                        {
                            if (geom.anim_data.anim_bone != null)
                                EnableAnimation((int)geom.anim_data.anim_bone._header.frame_num);
                            if (geom.anim_data.anim_mat != null)
                                EnableAnimation((int)geom.anim_data.anim_mat._frame_num);
                        }

                        info += "\n\n---model #" + q;
                        info += "\nmaterials:" + geom.mtl_num;
                        for (int i = 0; i < geom.mtl_num; i++)
                        {
                            info += "\n    mtl" + i + " textures:" + geom.mtl_seq[i].tex_seq.Length;
                            for (int j = 0; j < geom.mtl_seq[i].tex_seq.Length; j++)
                            {
                                if (geom.mtl_seq[i].tex_seq[j] != null && geom.mtl_seq[i].tex_seq[j].file_name != null)
                                {
                                    string filename = CutString(geom.mtl_seq[i].tex_seq[j].file_name);
                                    info += "\n        " + j + ":" + filename;
                                }
                            }
                        }
                        info += "\nmesh vertex num:" + geom.mesh.header.vertex_num;
                        info += "\nmesh index num:" + geom.mesh.header.index_num;
                    }

                    richTextBox1.Text = info;

                    glControl1.Refresh();
                }
                #endregion

                #region lxo loading
                else if (parentindex == 3)
                {
                    lwModelInfo modelinfo = new lwModelInfo();
                    modelinfo.Load(lxofiles[index]);
                    if (modelinfo.Load(name) != 0) { modelinfo = null; return; }

                    drawNum = 1;
                    drawObject[0] = modelinfo;
                    drawObjectType[0] = DrawObjectType.lxo;

                    DisableAnimation();
                    glControl1.Refresh();

                    richTextBox1.Text = "Not active in this version";
                }
                #endregion

                #region character loading
                else if (parentindex == 4)
                {
                    CChaRecord character = chainfo[index];
                    drawNum = 0;

                    DisableAnimation();

                    string info = CutString(character.szDataName) + "\n";
                    info += "\nheight " + character.fHeight + "\n";
                    info += "width " + character.fWidth + "\n";
                    info += "length " + character.fLengh + "\n\n";
                    info += "items (";
                    for (int i = 0; i < character.lItem.Length; i++)
                    {
                        if (i != 0) info += ",";
                        info += character.lItem[i];
                    }
                    info += ")\n\n";
                    info += "script " + character.lScript + "\n";
                    info += "ID " + character.nID + "\n";
                    info += "index " + character.nIndex + "\n";
                    info += "actionId " + character.sActionID + "\n";
                    info += "bornEffect " + character.sBornEff + "\n";
                    info += "dieEffect " + character.sDieEff + "\n";
                    info += "effectId " + character.sEeffID + "\n";
                    info += "effectActionId (";
                    for (int i = 0; i < character.sEffectActionID.Length; i++)
                    {
                        if (i != 0) info += ",";
                        info += character.sEffectActionID[i];
                    }
                    info += ")\nmodel " + character.sModel + "\n";
                    info += "scinInfo (";
                    for (int i = 0; i < character.sSkinInfo.Length; i++)
                    {
                        if (i != 0) info += ",";
                        info += character.sSkinInfo[i];
                    }
                    info += ")\nsuitId " + character.sSuitID + "\n";
                    info += "modalType " + (byte)character.chModalType + "\n";
                    info += "suitNum " + character.sSuitNum + "\n\n";
                    info += "guild: " + CutString(character.szGuild) + "\n";
                    info += "iconName: " + CutString(character.szIconName) + "\n";
                    info += "job: " + CutString(character.szJob) + "\n";
                    info += "name: " + CutString(character.szName) + "\n";
                    info += "title: " + CutString(character.szTitle) + "\n";

                    trackBar1.Enabled = false;
                    numericUpDown1.Enabled = false;
                    button1.Enabled = false;
                    enableAnimation = false;
                    pictureBox1.Visible = false;

                    if (character.chModalType == 1)
                    {
                        lwAnimDataBone bone = new lwAnimDataBone();
                        if (bone.Load(textBox1.Text + "animation\\" + character.sModel.ToString("0000") + ".lab") == 0)
                        {
                            drawObject[drawNum] = bone;
                            drawObjectType[drawNum] = DrawObjectType.lab;
                            drawNum++;

                            EnableAnimation((int)bone._header.frame_num);
                        }

                        info += "\nanimation: " + character.sModel.ToString("0000") + ".lab\n";

                        foreach (uint tex in textures)
                            GL.DeleteTexture(tex);
                        totaltextures = 0;

                        for (int i = 0; i < 5; i++)
                        {
                            if (character.sSkinInfo[i] != 0)
                            {
                                CItemRecord rec = iteminfo[iteminfokeys[character.sSkinInfo[i]]];

                                char[] mdl = new char[19];
                                Array.Copy(rec.chModule, (character.sModel + 1) * 19, mdl, 0, 19);

                                lwGeomObjInfo geom = new lwGeomObjInfo();
                                string filenameModel = textBox1.Text + "model\\character\\" + CutString(mdl) + ".lgo";
                                if (geom.Load(filenameModel) == 0)
                                {
                                    LoadTexturesToGeom(ref geom, filenameModel);
                                    drawObject[drawNum] = geom;
                                    drawObjectType[drawNum] = DrawObjectType.lgo;
                                    drawNum++;
                                }

                                info += "model: " + CutString(mdl) + ".lgo\n";
                            }
                        }
                    }
                    if (character.chModalType == 2)
                    {
                        info += "\nanimation: ?? \n";

                        for (int i = 0; i < 5; i++)
                        {
                            if (character.sSkinInfo[i] != 0)
                            {
                                CItemRecord rec = iteminfo[iteminfokeys[character.sSkinInfo[i]]];

                                char[] mdl = new char[19];
                                Array.Copy(rec.chModule, 0, mdl, 0, 19);

                                lwGeomObjInfo geom = new lwGeomObjInfo();
                                string filenameModel = textBox1.Text + "model\\character\\" + CutString(mdl) + ".lgo";
                                if (geom.Load(filenameModel) == 0)
                                {
                                    if (geom.anim_data != null && geom.anim_data.anim_mat != null)
                                    {
                                        EnableAnimation((int)geom.anim_data.anim_mat._frame_num);
                                    }
                                    LoadTexturesToGeom(ref geom, filenameModel);
                                    drawObject[drawNum] = geom;
                                    drawObjectType[drawNum] = DrawObjectType.ship;
                                    drawNum++;
                                }

                                info += "model: " + CutString(mdl) + ".lgo\n";
                            }
                        }
                    }
                    if (character.chModalType == 4)
                    {
                        lwAnimDataBone bone = new lwAnimDataBone();
                        if (bone.Load(textBox1.Text + "animation\\" + character.sModel.ToString("0000") + ".lab") == 0)
                        {
                            drawObject[drawNum] = bone;
                            drawObjectType[drawNum] = DrawObjectType.lab;
                            drawNum++;

                            EnableAnimation((int)bone._header.frame_num);
                        }

                        info += "\nanimation: " + character.sModel.ToString("0000") + ".lab\n";

                        foreach (uint tex in textures)
                            GL.DeleteTexture(tex);
                        totaltextures = 0;

                        for (int i = 0; i < 5; i++)
                        {
                            if (character.sSkinInfo[i] != 0)
                            {
                                lwGeomObjInfo geom = new lwGeomObjInfo();
                                string filenameModel = textBox1.Text + "model\\character\\" + (i + 10000 * (character.sSuitID + 100 * character.sModel)).ToString("0000000000") + ".lgo";
                                if (geom.Load(filenameModel) == 0)
                                {
                                    LoadTexturesToGeom(ref geom, filenameModel);
                                    drawObject[drawNum] = geom;
                                    drawObjectType[drawNum] = DrawObjectType.lgo;
                                    drawNum++;
                                }

                                info += "model: " + (i + 10000 * (character.sSuitID + 100 * character.sModel)).ToString("0000000000") + ".lgo\n";
                            }
                        }
                    }

                    richTextBox1.Text = info;

                    glControl1.Refresh();
                }
                #endregion

                #region items loading
                if (parentindex == 5)
                {
                    CItemRecord item = iteminfo[index];
                    drawNum = 0;
                    DeleteAllTextures();
                    //drawObject[0] = item;
                    //drawObjectType[0] = DrawObjectType.item;

                    string info = CutString(item.szDataName) + "\n\n";
                    //info += "able link: " + CutString(item.szAbleLink) + "\n";
                    info += "attr effect: " + CutString(item.szAttrEffect) + "\n";
                    info += "descriptor: " + CutString(item.szDescriptor) + "\n";
                    info += "icon: " + CutString(item.szICON) + "\n";
                    info += "name: " + CutString(item.szName) + "\n\n";
                    info += "id: " + item.lID + "\n";
                    info += "modules: \n";
                    for (int i = 0; i < 5; i++)
                    {
                        char[] mdl = new char[19];
                        Array.Copy(item.chModule, i * 19, mdl, 0, 19);
                        if (i == 0) info += "on drop:    " + CutString(mdl) + "\n";
                        else if (i == 1) info += "on Lance:   " + CutString(mdl) + "\n";
                        else if (i == 2) info += "on Carsise: " + CutString(mdl) + "\n";
                        else if (i == 3) info += "on Phyllis: " + CutString(mdl) + "\n";
                        else if (i == 4) info += "on Ami:     " + CutString(mdl) + "\n";

                        lwGeomObjInfo geom = new lwGeomObjInfo();
                        string filenameModel = textBox1.Text + "model\\item\\" + CutString(mdl) + ".lgo";
                        if (item.sType >= 19 && item.sType <= 25) filenameModel = textBox1.Text + "model\\character\\" + CutString(mdl) + ".lgo";

                        if (geom.Load(filenameModel) == 0)
                        {
                            LoadTexturesToGeom(ref geom, filenameModel);
                            drawObject[drawNum] = geom;
                            drawObjectType[drawNum] = DrawObjectType.item;
                            drawNum++;
                        }
                    }

                    info += "\nforge lvl: " + (byte)item.chForgeLv + "\n";
                    info += "forge ready: " + (byte)item.chForgeSteady + "\n";
                    info += "instance: " + (byte)item.chInstance + "\n";
                    info += "pick to: " + (byte)item.chPickTo + "\n";
                    info += "price: " + item.lPrice + "\n";
                    info += "index: " + item.nIndex + "\n";
                    info += "l hand value: " + item.sLHandValu + "\n";
                    info += "need lvl: " + item.sNeedLv + "\n";
                    info += "type: " + (EItemType)item.sType + "\n";

                    Bitmap bmp = LoadBitmaByTextureName(textBox1.Text + "texture\\icon\\" + CutString(item.szICON) + ".bmp");
                    pictureBox1.Image = bmp;
                    pictureBox1.Visible = true;

                    DisableAnimation();
                    glControl1.Refresh();

                    richTextBox1.Text = info;
                }
                #endregion
            }
        }
Пример #8
0
        void LoadTexturesToGeom(ref lwGeomObjInfo geom, string originpath)
        {
            string path = originpath.Replace("\\model\\", "\\texture\\");
            int pathid = path.LastIndexOf("\\");
            path = path.Substring(0, pathid + 1);

            for (int i = 0; i < geom.mtl_num; i++)
            {
                lwMtlTexInfo mtl = geom.mtl_seq[i];
                for (int j = 0; j < mtl.tex_seq.Length; j++)
                {
                    lwTexInfo tex = mtl.tex_seq[j];
                    if (tex != null && tex.file_name != null)
                    {
                        string filename = CutString(tex.file_name);

                        if (filename != null && filename.Length > 0)
                        {
                            int id = GL.GenTexture();
                            string path2 = path + filename;

                            if (LoadTexture(path2, id, tex))
                            {
                                textures[totaltextures] = id;
                                totaltextures++;
                                tex.data_pointer = (uint)id;
                            }
                            else
                            {
                                GL.DeleteTexture(id);
                            }
                        }
                    }
                }
            }
        }
Пример #9
0
        void DrawGeom(lwGeomObjInfo geom ,lwAnimDataMatrix mat,bool usematlocal=false)
        {
            uint frame = animationTimer % mat._frame_num;
            lwMatrix43 finishmatrix43 = mat._mat_seq[frame];
            Matrix4 finishmatrix = new Matrix4(finishmatrix43.m[0], finishmatrix43.m[1], finishmatrix43.m[2], 0,
                                               finishmatrix43.m[3], finishmatrix43.m[4], finishmatrix43.m[5], 0,
                                               finishmatrix43.m[6], finishmatrix43.m[7], finishmatrix43.m[8], 0,
                                               finishmatrix43.m[9], finishmatrix43.m[10], finishmatrix43.m[11], 1);

            GL.PushMatrix();
            GL.MultMatrix(ref finishmatrix);
            if (usematlocal)
                GL.MultMatrix(geom.header.mat_local.m);
            for (int j = 0; j < geom.mesh.header.subset_num; j++)
            {
                GL.BindTexture(TextureTarget.Texture2D, geom.mtl_seq[j].tex_seq[0].data_pointer);
                GL.Color3(1f, 1f, 1f);
                GL.Begin(BeginMode.Triangles);
                for (uint i = geom.mesh.subset_seq[j].start_index; i < geom.mesh.subset_seq[j].start_index + geom.mesh.subset_seq[j].primitive_num * 3; i++)
                {
                    D3DXVECTOR3 p1 = geom.mesh.vertex_seq[geom.mesh.index_seq[i]];
                    D3DXVECTOR2 t1 = geom.mesh.texcoord0_seq[geom.mesh.index_seq[i]];

                    //Vector3 p = Vector3.Transform(new Vector3(p1.x, p1.y, p1.z) , finishmatrix);
                    Vector3 p = new Vector3(p1.x, p1.y, p1.z);

                    GL.TexCoord2(t1.x, t1.y);
                    GL.Vertex3(p);
                }
                GL.End();
            }
            GL.PopMatrix();
        }
Пример #10
0
        void DrawGeom(lwGeomObjInfo geom, lwAnimDataBone bone)
        {
            if (geom.mesh.header.bone_index_num > 0 && bone._header.frame_num == 0) { DrawGeom(geom); return; }
            uint frame = animationTimer % bone._header.frame_num;
            Matrix4[] finishmatrixes = GetTransformByFrame(bone, frame);
            Vector3[] transformed = new Vector3[geom.mesh.header.bone_infl_factor];

            GL.PushMatrix();
            GL.MultMatrix(geom.header.mat_local.m);
            for (int j = 0; j < geom.mesh.header.subset_num; j++)
            {
                GL.BindTexture(TextureTarget.Texture2D, geom.mtl_seq[j].tex_seq[0].data_pointer);
                GL.Color3(1f, 1f, 1f);
                GL.Begin(BeginMode.Triangles);
                for (uint i = geom.mesh.subset_seq[j].start_index; i < geom.mesh.subset_seq[j].start_index + geom.mesh.subset_seq[j].primitive_num * 3; i++)
                {
                    uint vertexIndex = geom.mesh.index_seq[i];
                    D3DXVECTOR3 dp1 = geom.mesh.vertex_seq[vertexIndex];
                    D3DXVECTOR2 dt1 = geom.mesh.texcoord0_seq[vertexIndex];

                    Vector3 p1 = new Vector3(dp1.x, dp1.y, dp1.z);
                    Vector2 t1 = new Vector2(dt1.x, dt1.y);

                    lwBlendInfo blend = geom.mesh.blend_seq[vertexIndex];
                    for (int q = 0; q < geom.mesh.header.bone_infl_factor; q++)
                    {
                        uint boneIndex = geom.mesh.bone_index_seq[blend.index[q]];
                        Matrix4 invMat = invMat = new Matrix4(bone._invmat_seq[boneIndex].m[0], bone._invmat_seq[boneIndex].m[1], bone._invmat_seq[boneIndex].m[2], bone._invmat_seq[boneIndex].m[3],
                                         bone._invmat_seq[boneIndex].m[4], bone._invmat_seq[boneIndex].m[5], bone._invmat_seq[boneIndex].m[6], bone._invmat_seq[boneIndex].m[7],
                                         bone._invmat_seq[boneIndex].m[8], bone._invmat_seq[boneIndex].m[9], bone._invmat_seq[boneIndex].m[10], bone._invmat_seq[boneIndex].m[11],
                                         bone._invmat_seq[boneIndex].m[12], bone._invmat_seq[boneIndex].m[13], bone._invmat_seq[boneIndex].m[14], bone._invmat_seq[boneIndex].m[15]); ;

                        transformed[q] = Vector3.Transform(p1, invMat * finishmatrixes[boneIndex]);
                    }

                    Vector3 finishpoint = transformed[0] * blend.weight[0];
                    for (int q = 1; q < geom.mesh.header.bone_infl_factor; q++)
                        finishpoint += transformed[q] * blend.weight[q];

                    GL.TexCoord2(t1);
                    GL.Vertex3(finishpoint);
                }
                GL.End();
            }
            GL.PopMatrix();
        }
Пример #11
0
        void DrawGeom(lwGeomObjInfo geom)
        {
            if (geom.anim_data != null)
            {
                lwAnimDataInfo data = geom.anim_data;
                if (data.anim_bone != null)
                {
                    DrawGeom(geom, data.anim_bone);
                    return;
                }
                if (data.anim_mat!=null)
                {
                    DrawGeom(geom, data.anim_mat);
                    return;
                }
            }
            GL.PushMatrix();
            GL.MultMatrix(geom.header.mat_local.m);
            for (int j = 0; j < geom.mesh.header.subset_num; j++)
            {
                if (CutString(geom.mtl_seq[j].tex_seq[0].file_name) == "1.BMP") // 1.bmp - is for weapon effects
                    continue;
                GL.BindTexture(TextureTarget.Texture2D, geom.mtl_seq[j].tex_seq[0].data_pointer);
                GL.Color3(1f, 1f, 1f);
                GL.Begin(BeginMode.Triangles);
                for (uint i = geom.mesh.subset_seq[j].start_index; i < geom.mesh.subset_seq[j].start_index + geom.mesh.subset_seq[j].primitive_num * 3; i++)
                {
                    D3DXVECTOR3 p1 = geom.mesh.vertex_seq[geom.mesh.index_seq[i]];
                    D3DXVECTOR2 t1 = geom.mesh.texcoord0_seq[geom.mesh.index_seq[i]];

                    GL.TexCoord2(t1.x, t1.y);
                    GL.Vertex3(p1.x, p1.y, p1.z);
                }
                GL.End();
            }
            GL.PopMatrix();
        }