Ejemplo n.º 1
0
    /// <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();
    }
Ejemplo n.º 2
0
        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);
        }
Ejemplo n.º 3
0
        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;
            }
        }
Ejemplo n.º 4
0
        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);
                }
            }
        }
Ejemplo n.º 5
0
 public void OnEnable()
 {
     _SkeletonAsset = (SkeletonAsset)target;
 }
Ejemplo n.º 6
0
    /// <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
    }
Ejemplo n.º 7
0
        // 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.");
                    }
                }
            }
        }