/// <summary> /// 保存原型骨架 /// </summary> public void SaveSkeleton() { //创建骨架数据文件 _SkeletonAsset = ScriptableObject.CreateInstance <SkeletonAsset>(); //记录骨架网格类型 _SkeletonAsset._SkeletonType = _Mesh.name; //记录骨头信息 _SkeletonAsset._Bones = new List <BoneAsset>(); for (int i = 0; i < _Skeleton._Bones.Count; i++) { EditorUtility.DisplayProgressBar("保存原型骨架", "正在记录骨骼信息(" + i + "/" + _Skeleton._Bones.Count + ")......", 1.0f / _Skeleton._Bones.Count * i); BoneAsset boneAsset = new BoneAsset(); boneAsset._BoneName = _Skeleton._Bones[i]._BoneName; boneAsset._BonePositon = _Skeleton._Bones[i]._BoneObj.transform.position; boneAsset._IsRoot = _Skeleton._Bones[i]._IsRoot; boneAsset._Vertex = new List <int>(_Skeleton._Bones[i]._Vertex); boneAsset._Hierarchy = _Skeleton._Bones[i]._Hierarchy; boneAsset._IsDrawSon = _Skeleton._Bones[i]._IsDrawSon; _SkeletonAsset._Bones.Add(boneAsset); } //记录骨头关联信息 for (int i = 0; i < _Skeleton._Bones.Count; i++) { EditorUtility.DisplayProgressBar("保存原型骨架", "正在记录骨骼关联信息(" + i + "/" + _Skeleton._Bones.Count + ")......", 1.0f / _Skeleton._Bones.Count * i); if (_Skeleton._Bones[i]._LastBone != null) { int index = _Skeleton._Bones.IndexOf(_Skeleton._Bones[i]._LastBone); _SkeletonAsset._Bones[i]._LastBone = index; } else { _SkeletonAsset._Bones[i]._LastBone = -1; } _SkeletonAsset._Bones[i]._NextBone = new List <int>(); if (_Skeleton._Bones[i]._NextBone.Count > 0) { for (int j = 0; j < _Skeleton._Bones[i]._NextBone.Count; j++) { int index = _Skeleton._Bones.IndexOf(_Skeleton._Bones[i]._NextBone[j]); _SkeletonAsset._Bones[i]._NextBone.Add(index); } } } //创建本地文件 string path = "Assets/" + _Mesh.name + "SkeletonData.asset"; AssetDatabase.CreateAsset(_SkeletonAsset, path); EditorUtility.ClearProgressBar(); }
private RenderObject MakeSkeletonMesh(SkeletonAsset skel) { RenderObject ro = new RenderObject(DXHelper.device, RenderObject.RenderType.Lines, DXHelper.pixelShaderSel); List <RawVector3> verts = new List <RawVector3>(); AddBoneToMesh(skel.RootBone, new Vector3(skel.RootBone.Location.members[0], skel.RootBone.Location.members[1], skel.RootBone.Location.members[2]), GetBoneMatrix(skel.RootBone), verts); ro.vertices = verts.ToArray(); ro.InitGeometry(); return(ro); }
private void SelectSkeleton() { int n = toolStripComboBox2.SelectedIndex; if (n == -1) { return; } EBX ebx; switch (n) { case 0: skeleton = null; if (DXHelper.objects.Count > 1) { DXHelper.objects.Remove(DXHelper.objects[1]); } break; case 1: try { OpenFileDialog openSkelFileDialog = new OpenFileDialog(); openSkelFileDialog.Title = "Select skeleton file"; openSkelFileDialog.Filter = "*.bin|*.bin"; if (openSkelFileDialog.ShowDialog() == DialogResult.OK) { ebx = new EBX(new MemoryStream(File.ReadAllBytes(openSkelFileDialog.FileName))); skeleton = new SkeletonAsset(ebx); RenderObject skel = MakeSkeletonMesh(skeleton); for (int i = 0; i < skel.vertices.Length; i++) { skel.vertices[i].X -= mid.X; skel.vertices[i].Y -= mid.Y; skel.vertices[i].Z -= mid.Z; } skel.InitGeometry(); if (DXHelper.objects.Count == 2) { DXHelper.objects[1] = skel; } else { DXHelper.objects.Add(skel); } } } catch { } break; default: try { string sha1 = skeletons[toolStripComboBox2.Items[n].ToString()]; ebx = new EBX(new MemoryStream(main.Host.getDataBySha1(Helpers.HexStringToByteArray(sha1)))); skeleton = new SkeletonAsset(ebx); RenderObject skel = MakeSkeletonMesh(skeleton); for (int i = 0; i < skel.vertices.Length; i++) { skel.vertices[i].X -= mid.X; skel.vertices[i].Y -= mid.Y; skel.vertices[i].Z -= mid.Z; } skel.InitGeometry(); if (DXHelper.objects.Count == 2) { DXHelper.objects[1] = skel; } else { DXHelper.objects.Add(skel); } } catch { } break; } }
private void toolStripButton5_Click(object sender, EventArgs e) { int n = toolStripComboBox1.SelectedIndex; string selectedSkeleton = null; if (toolStripComboBox2.Enabled && toolStripComboBox2.SelectedIndex > 1) { selectedSkeleton = (string)toolStripComboBox2.SelectedItem; } ExportMeshSaveDialog emsd = new ExportMeshSaveDialog(mesh.lods.Count, 100f, false, (mesh.header.type == MeshType.MeshType_Skinned), selectedSkeleton, n); if (emsd.ShowDialog() == DialogResult.OK) { // we try to load the skeleton only if none was already selected for preview // or if one was selected and it is different from the one selected in the option window if (!skeletons.ContainsKey(toolStripComboBox2.SelectedItem.ToString()) || (skeletons.ContainsKey(toolStripComboBox2.SelectedItem.ToString()) && skeletons[toolStripComboBox2.SelectedItem.ToString()] != emsd.Skeleton)) { string sha1 = emsd.Skeleton; if (sha1 != null) { var sebx = new EBX(new MemoryStream(main.Host.getDataBySha1(Helpers.HexStringToByteArray(sha1)))); skeleton = new SkeletonAsset(sebx); } } // scale float aScale = emsd.ExportScale; // get exporter by format var exporter = MeshExporter.GetExporterByExtension(emsd.Format, skeleton); if (exporter != null) { if (emsd.AllLod) { FolderBrowserDialog fbd = new FolderBrowserDialog(); fbd.Description = "Select folder where to save the lods"; if (fbd.ShowDialog() == DialogResult.OK) { Cursor.Current = Cursors.WaitCursor; for (int i = 0; i < mesh.lods.Count; i++) { PrepareLodForExport(mesh, i); } exporter.ExportAllLods(mesh, fbd.SelectedPath, aScale); MessageBox.Show("Done."); Cursor.Current = Cursors.Default; } } else { // lod int sLod = emsd.Lod; SaveFileDialog saveFileDiag = new SaveFileDialog(); saveFileDiag.Title = "Save as..."; saveFileDiag.Filter = "*" + emsd.Format + "|*" + emsd.Format; saveFileDiag.FileName = mesh.lods[n].shortName; if (saveFileDiag.ShowDialog() == DialogResult.OK) { Cursor.Current = Cursors.WaitCursor; string targetFile = saveFileDiag.FileName; PrepareLodForExport(mesh, sLod); exporter.ExportLod(mesh, sLod, targetFile, aScale); MessageBox.Show("Done."); Cursor.Current = Cursors.Default; } } } else { MessageBox.Show("Unknown extension " + emsd.Format); } } }
public void OnEnable() { _SkeletonAsset = (SkeletonAsset)target; }
/// <summary> /// 导入骨架 /// </summary> void ImportSkeleton() { #if UNITY_EDITOR if (_SkeletonAsset._SkeletonType != _Mesh.name) { _SkeletonAsset = null; EditorUtility.DisplayDialog("警告", "这份骨架所包含的骨骼信息无法应用于当前网格!", "确定"); return; } _Skeleton = new Skeleton(); _Skeleton._Bones = new List <Bone>(); //导入骨头信息 for (int i = 0; i < _SkeletonAsset._Bones.Count; i++) { EditorUtility.DisplayProgressBar("导入骨架", "正在导入骨骼信息(" + i + "/" + _SkeletonAsset._Bones.Count + ")......", 1.0f / _SkeletonAsset._Bones.Count * i); Bone bone = new Bone(); bone._BoneName = _SkeletonAsset._Bones[i]._BoneName; bone._BoneObj = new GameObject(bone._BoneName); bone._BonePositon = _SkeletonAsset._Bones[i]._BonePositon; bone._IsRoot = _SkeletonAsset._Bones[i]._IsRoot; bone._Vertex = new List <int>(_SkeletonAsset._Bones[i]._Vertex); bone._Hierarchy = _SkeletonAsset._Bones[i]._Hierarchy; bone._IsDrawSon = _SkeletonAsset._Bones[i]._IsDrawSon; _Skeleton._Bones.Add(bone); } //建立骨头关联信息 for (int i = 0; i < _SkeletonAsset._Bones.Count; i++) { EditorUtility.DisplayProgressBar("导入骨架", "正在导入骨骼关联信息(" + i + "/" + _SkeletonAsset._Bones.Count + ")......", 1.0f / _SkeletonAsset._Bones.Count * i); if (_SkeletonAsset._Bones[i]._LastBone != -1) { _Skeleton._Bones[i]._LastBone = _Skeleton._Bones[_SkeletonAsset._Bones[i]._LastBone]; } else { _Skeleton._Bones[i]._LastBone = null; } _Skeleton._Bones[i]._NextBone = new List <Bone>(); if (_SkeletonAsset._Bones[i]._NextBone.Count > 0) { for (int j = 0; j < _SkeletonAsset._Bones[i]._NextBone.Count; j++) { _Skeleton._Bones[i]._NextBone.Add(_Skeleton._Bones[_SkeletonAsset._Bones[i]._NextBone[j]]); } } } //导入骨头蒙皮信息 for (int i = 0; i < _Skeleton._Bones.Count; i++) { EditorUtility.DisplayProgressBar("导入骨架", "正在应用骨骼信息(" + i + "/" + _Skeleton._Bones.Count + ")......", 1.0f / _Skeleton._Bones.Count * i); _Skeleton._Bones[i]._BoneObj.transform.position = _Skeleton._Bones[i]._BonePositon; if (_Skeleton._Bones[i]._LastBone != null) { _Skeleton._Bones[i]._BoneObj.transform.SetParent(_Skeleton._Bones[i]._LastBone._BoneObj.transform); } else { _Skeleton._Bones[i]._BoneObj.transform.SetParent(transform); } if (_Skeleton._Bones[i]._Vertex.Count > 0) { for (int j = 0; j < _Skeleton._Bones[i]._Vertex.Count; j++) { _Vertices[_Skeleton._Bones[i]._Vertex[j]].transform.SetParent(_Skeleton._Bones[i]._BoneObj.transform); _Vertices[_Skeleton._Bones[i]._Vertex[j]].GetComponent <Vertex>()._TheBoneName = _Skeleton._Bones[i]._BoneName; } } } EditorUtility.ClearProgressBar(); #endif }
// export selected morph : // search for base mesh and applies selected morph deformation to it and to selected skeleton and exports the result. private void exportMorphToolStripMenuItem_Click(object sender, EventArgs e) { if (rawEbxBuffer != null && rawResBuffer != null) { string morphName = Path.GetFileName(currPath); var morph = new MorphStaticExtended(new MemoryStream(rawResBuffer), new MemoryStream(rawEbxBuffer), morphName); ExportMeshSaveDialog emd = new ExportMeshSaveDialog(morph.LodCount, 100f, true); if (emd.ShowDialog() == System.Windows.Forms.DialogResult.OK) { Cursor.Current = Cursors.WaitCursor; // look for preset Mesh DataInfo presetMeshRes = SearchItemRES(morph.PresetMesh); if (presetMeshRes != null) { byte[] meshData = main.Host.getDataBySha1(presetMeshRes.sha1); MeshAsset presetMeshAsset = new MeshAsset(new MemoryStream(meshData)); SkeletonAsset skeleton = null; int lod = emd.Lod; string sha1 = emd.Skeleton; if (sha1 != null) { var sebx = new EBX(new MemoryStream(main.Host.getDataBySha1(Helpers.HexStringToByteArray(sha1)))); skeleton = new SkeletonAsset(sebx); } float oScale = emd.ExportScale; bool bakeMorphToMesh = emd.BakeMorph; string ext = emd.Format; IMeshExporter exporter = MeshExporter.GetExporterByExtension(ext, skeleton); Cursor.Current = Cursors.Default; if (emd.AllLod) { FolderBrowserDialog fbd = new FolderBrowserDialog(); fbd.Description = "Select folder where to save all LODS..."; if (fbd.ShowDialog() == DialogResult.OK) { Cursor.Current = Cursors.WaitCursor; for (int i = 0; i < morph.LodCount; i++) { ChunkInfo lodChunk = SearchChunk(Helpers.ByteArrayToHexString(presetMeshAsset.lods[i].chunkID)); if (lodChunk != null) { byte[] rawChunkBuffer = main.Host.getDataBySha1(lodChunk.sha1); presetMeshAsset.lods[i].LoadVertexData(new MemoryStream(rawChunkBuffer)); } } exporter.ExportAllLodsWithMorph(presetMeshAsset, morph, fbd.SelectedPath, oScale, bakeMorphToMesh); MessageBox.Show("Done."); Cursor.Current = Cursors.Default; } } else { SaveFileDialog sfd = new SaveFileDialog(); sfd.Title = "Save Morph as..."; sfd.Filter = "*" + ext + "|*" + ext; sfd.FileName = Path.GetFileName(currPath) + ext; if (sfd.ShowDialog() == DialogResult.OK) { Cursor.Current = Cursors.WaitCursor; ChunkInfo lodChunk = SearchChunk(Helpers.ByteArrayToHexString(presetMeshAsset.lods[lod].chunkID)); if (lodChunk != null) { byte[] rawChunkBuffer = main.Host.getDataBySha1(lodChunk.sha1); presetMeshAsset.lods[lod].LoadVertexData(new MemoryStream(rawChunkBuffer)); exporter.ExportLodWithMorph(presetMeshAsset, lod, morph, sfd.FileName, oScale, bakeMorphToMesh); MessageBox.Show("Done."); Cursor.Current = Cursors.Default; } else { MessageBox.Show("Error : chunk for this lod was not found"); } } } Cursor.Current = Cursors.Default; } else { MessageBox.Show("Error : Res data corresponding to preset mesh " + morph.PresetMesh + " not found."); } } } }