Exemplo n.º 1
0
        public static void ExportFile(HSD_JOBJ rootJOBJ, Dictionary <int, string> boneLabels = null)
        {
            StringBuilder sup = new StringBuilder();

            AssimpContext importer = new AssimpContext();
            var           length   = importer.GetSupportedExportFormats().Length;
            var           index    = 0;

            foreach (var v in importer.GetSupportedExportFormats())
            {
                sup.Append($"{v.Description} (*.{v.FileExtension})|*.{v.FileExtension};");
                index++;
                if (index != length)
                {
                    sup.Append("|");
                }
            }

            var f = Tools.FileIO.SaveFile(sup.ToString());

            if (f != null)
            {
                var settings = new ModelExportSettings();
                using (PropertyDialog d = new PropertyDialog("Model Import Options", settings))
                {
                    if (d.ShowDialog() == System.Windows.Forms.DialogResult.OK)
                    {
                        ExportFile(f, rootJOBJ, settings, boneLabels);
                    }
                }
            }
        }
Exemplo n.º 2
0
        /// <summary>
        ///
        /// </summary>
        /// <param name="root"></param>
        /// <returns></returns>
        private Scene WriteRootNode(HSD_JOBJ root, ModelExportSettings settings, Dictionary <int, string> boneLabels)
        {
            Scene.RootNode = RootNode;

            RecursiveExport(root, RootNode, Matrix4.Identity, boneLabels);

            WriteDOBJNodes(settings);

            return(Scene);
        }
Exemplo n.º 3
0
        /// <summary>
        ///
        /// </summary>
        /// <param name="filePath"></param>
        /// <param name="rootJOBJ"></param>
        public static void ExportFile(string filePath, HSD_JOBJ rootJOBJ, ModelExportSettings settings = null, Dictionary <int, string> boneLabels = null)
        {
            ModelExporter mex      = new ModelExporter();
            AssimpContext importer = new AssimpContext();

            Dictionary <string, string> extToId = new Dictionary <string, string>();

            foreach (var v in importer.GetSupportedExportFormats())
            {
                if (!extToId.ContainsKey("." + v.FileExtension))
                {
                    extToId.Add("." + v.FileExtension, v.FormatId);
                }
            }

            PostProcessSteps postProcess = PostProcessSteps.FlipWindingOrder;

            if (settings.Optimize)
            {
                postProcess |= PostProcessSteps.JoinIdenticalVertices;
            }

            if (settings.FlipUVs)
            {
                postProcess |= PostProcessSteps.FlipUVs;
            }

            settings.Directory = System.IO.Path.GetDirectoryName(filePath) + "\\";

            if (System.IO.Path.GetExtension(filePath).ToLower() == ".dae")
            {
                var sc = mex.WriteRootNode(rootJOBJ, settings, boneLabels);

                /*var scn = Scene.ToUnmanagedScene(sc);
                 * scn = AssimpLibrary.Instance.ApplyPostProcessing(scn, postProcess);
                 * var scene = Scene.FromUnmanagedScene(scn);
                 * Scene.FreeUnmanagedScene(scn);*/
                ExportCustomDAE(filePath, sc, settings);
            }
            else
            {
                importer.ExportFile(mex.WriteRootNode(rootJOBJ, settings, boneLabels), filePath, extToId[System.IO.Path.GetExtension(filePath)], postProcess);
            }

            importer.Dispose();
        }
Exemplo n.º 4
0
        /// <summary>
        ///
        /// </summary>
        private void WriteDOBJNodes(ModelExportSettings settings)
        {
            var jIndex = 0;

            foreach (var j in Jobjs)
            {
                var dIndex = 0;
                if (j.Dobj != null)
                {
                    foreach (var dobj in j.Dobj.List)
                    {
                        Node dobjNode = new Node();
                        dobjNode.Name = $"JOBJ_{jIndex}_DOBJ_{dIndex}";

                        if (dobj.Pobj != null)
                        {
                            var pindex = 0;
                            foreach (var pobj in dobj.Pobj.List)
                            {
                                dobjNode.MeshIndices.Add(Scene.Meshes.Count);
                                var mesh = ProcessPOBJ(pobj, j, pobj.SingleBoundJOBJ);
                                mesh.Name          = dobjNode.Name + "_POBJ_" + pindex++;
                                mesh.MaterialIndex = Scene.MaterialCount;
                                Scene.Meshes.Add(mesh);
                            }
                        }

                        // process and export textures

                        Material m = new Material();
                        m.Name      = $"JOBJ_{jIndex}_DOBJ_{dIndex}_MOBJ_{dIndex}";
                        m.Shininess = dobj.Mobj.Material.Shininess;
                        m.Opacity   = dobj.Mobj.Material.Alpha;

                        if (dobj.Mobj.Textures != null)
                        {
                            foreach (var t in dobj.Mobj.Textures.List)
                            {
                                if (t.ImageData != null && t.ImageData.ImageData != null && !imageToName.ContainsKey(t.ImageData.ImageData))
                                {
                                    var name = $"TOBJ_{imageToName.Count}";
                                    using (Bitmap img = TOBJConverter.ToBitmap(t))
                                        img.Save(settings.Directory + name + ".png");
                                    imageToName.Add(t.ImageData.ImageData, name);
                                }
                            }

                            var dif = new TextureSlot();
                            dif.TextureType  = TextureType.Diffuse;
                            dif.UVIndex      = 0;
                            dif.FilePath     = imageToName[dobj.Mobj.Textures.ImageData.ImageData];
                            m.TextureDiffuse = dif;
                        }
                        Scene.Materials.Add(m);

                        RootNode.Children.Add(dobjNode);
                        dIndex++;
                    }
                }
                jIndex++;
            }
        }
Exemplo n.º 5
0
        private static void ExportCustomDAE(string filePath, Scene scene, ModelExportSettings settings)
        {
            using (DAEWriter writer = new DAEWriter(filePath, true))
            {
                var path = System.IO.Path.GetDirectoryName(filePath) + '\\';

                writer.WriteAsset();

                //DialogResult dialogResult = MessageBox.Show("Export Materials and Textures?", "DAE Exporter", MessageBoxButtons.YesNo);
                //if (dialogResult == DialogResult.Yes)
                {
                    List <string> TextureNames = new List <string>();

                    foreach (var tex in scene.Materials)
                    {
                        if (!TextureNames.Contains(tex.TextureDiffuse.FilePath))
                        {
                            TextureNames.Add(tex.TextureDiffuse.FilePath);
                        }
                    }

                    writer.WriteLibraryImages(TextureNames.ToArray(), ".png");

                    writer.StartMaterialSection();
                    foreach (var mat in scene.Materials)
                    {
                        writer.WriteMaterial(mat.Name);
                    }
                    writer.EndMaterialSection();

                    writer.StartEffectSection();
                    foreach (var mat in scene.Materials)
                    {
                        writer.WriteEffect(mat.Name, mat.TextureDiffuse.FilePath);
                    }
                    writer.EndEffectSection();
                }
                //else
                //    writer.WriteLibraryImages();

                var rootSkeleton = scene.RootNode.Children[0];

                RecursivlyWriteDAEJoints(writer, rootSkeleton, "", Matrix4.Identity);

                writer.StartGeometrySection();
                for (int i = 1; i < scene.RootNode.Children.Count; i++)
                {
                    var node = scene.RootNode.Children[i];

                    writer.StartGeometryMesh(node.Name);

                    List <uint>  triangles = new List <uint>();
                    List <float> vertices  = new List <float>();
                    List <float> nrm       = new List <float>();
                    List <float> uv0       = new List <float>();
                    List <float> uv1       = new List <float>();
                    List <float> clr0      = new List <float>();
                    List <float> clr1      = new List <float>();

                    List <List <int> >   BoneIndicies = new List <List <int> >();
                    List <List <float> > BoneWeights  = new List <List <float> >();

                    foreach (var meshIndex in node.MeshIndices)
                    {
                        var vertexOffset = vertices.Count / 3;

                        var mesh = scene.Meshes[meshIndex];

                        if (!mesh.HasFaces || !mesh.HasVertices)
                        {
                            continue;
                        }

                        if (scene.Materials.Count != 0)
                        {
                            writer.CurrentMaterial = scene.Materials[mesh.MaterialIndex].Name;
                        }

                        foreach (var face in mesh.Faces)
                        {
                            for (var k = 0; k < 3; k++)
                            {
                                triangles.Add((uint)(vertexOffset + face.Indices[2 - k]));
                            }
                        }

                        if (mesh.HasBones)
                        {
                            for (int v = 0; v < mesh.VertexCount; v++)
                            {
                                BoneIndicies.Add(new List <int>());
                                BoneWeights.Add(new List <float>());
                            }

                            foreach (var bone in mesh.Bones)
                            {
                                if (bone.HasVertexWeights)
                                {
                                    foreach (var w in bone.VertexWeights)
                                    {
                                        BoneIndicies[w.VertexID + vertexOffset].Add(writer.GetJointIndex(bone.Name));
                                        BoneWeights[w.VertexID + vertexOffset].Add(w.Weight);
                                    }
                                }
                            }
                        }

                        vertices.AddRange(ToFloatArray(mesh.Vertices));

                        if (mesh.HasNormals)
                        {
                            nrm.AddRange(ToFloatArray(mesh.Normals));
                        }

                        if (mesh.HasTextureCoords(0))
                        {
                            uv0.AddRange(ToUVFloatArray(mesh.TextureCoordinateChannels[0], settings.FlipUVs));
                        }

                        if (mesh.HasTextureCoords(1))
                        {
                            uv0.AddRange(ToUVFloatArray(mesh.TextureCoordinateChannels[1], settings.FlipUVs));
                        }

                        if (mesh.HasVertexColors(0))
                        {
                            clr0.AddRange(ToFloatArray(mesh.VertexColorChannels[0]));
                        }

                        if (mesh.HasVertexColors(1))
                        {
                            clr0.AddRange(ToFloatArray(mesh.VertexColorChannels[1]));
                        }
                    }

                    var triArr = triangles.ToArray();

                    writer.WriteGeometrySource(node.Name, DAEWriter.VERTEX_SEMANTIC.POSITION, vertices.ToArray(), triArr);

                    if (nrm.Count > 0)
                    {
                        writer.WriteGeometrySource(node.Name, DAEWriter.VERTEX_SEMANTIC.NORMAL, nrm.ToArray(), triArr);
                    }

                    if (uv0.Count > 0)
                    {
                        writer.WriteGeometrySource(node.Name, DAEWriter.VERTEX_SEMANTIC.TEXCOORD, uv0.ToArray(), triArr, 0);
                    }

                    if (uv1.Count > 0)
                    {
                        writer.WriteGeometrySource(node.Name, DAEWriter.VERTEX_SEMANTIC.TEXCOORD, uv1.ToArray(), triArr, 1);
                    }

                    if (clr0.Count > 0)
                    {
                        writer.WriteGeometrySource(node.Name, DAEWriter.VERTEX_SEMANTIC.COLOR, clr0.ToArray(), triArr, 0);
                    }

                    if (clr1.Count > 0)
                    {
                        writer.WriteGeometrySource(node.Name, DAEWriter.VERTEX_SEMANTIC.COLOR, clr0.ToArray(), triArr, 1);
                    }

                    writer.AttachGeometryController(BoneIndicies, BoneWeights);

                    writer.EndGeometryMesh();
                }
                writer.EndGeometrySection();
            }
        }