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); } } } }
public void Add(lwGeomObjInfo geom, string filename) { geoms.Add(geom); geomsoriginpath.Add(filename); }
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); }
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); }
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); } } }
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 } }
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); } } } } } }
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(); }
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(); }
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(); }