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); } } } }
/// <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); }
/// <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(); }
/// <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++; } }
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(); } }