private string gltfToJson(GLTF gltf) { var jsonSerializer = JsonSerializer.Create(new JsonSerializerSettings()); var sb = new StringBuilder(); var sw = new StringWriter(sb, CultureInfo.InvariantCulture); // Do not use the optimized writer because it's not necessary to truncate values // Use the bounded writer in case some values are infinity () using (var jsonWriter = new JsonTextWriterBounded(sw)) { jsonWriter.Formatting = Formatting.None; jsonSerializer.Serialize(jsonWriter, gltf); } return(sb.ToString()); }
public void ExportGltf(BabylonScene babylonScene, string outputFile, bool generateBinary) { RaiseMessage("GLTFExporter | Export outputFile=" + outputFile + " generateBinary=" + generateBinary); RaiseMessage("GLTFExporter | Exportation started", Color.Blue); float progressionStep; var progression = 0.0f; ReportProgressChanged((int)progression); // Initialization initBabylonNodes(babylonScene); babylonMaterialsToExport = new List <BabylonMaterial>(); var gltf = new GLTF(Path.GetDirectoryName(outputFile)); // Asset gltf.asset = new GLTFAsset { version = "2.0", generator = "Babylon2Gltf2017", copyright = "2017 (c) BabylonJS" // no minVersion }; // Scene gltf.scene = 0; // Scenes GLTFScene scene = new GLTFScene(); GLTFScene[] scenes = { scene }; gltf.scenes = scenes; // Meshes RaiseMessage("GLTFExporter | Exporting meshes"); progression = 10.0f; ReportProgressChanged((int)progression); progressionStep = 40.0f / babylonScene.meshes.Length; foreach (var babylonMesh in babylonScene.meshes) { ExportMesh(babylonMesh, gltf, babylonScene); progression += progressionStep; ReportProgressChanged((int)progression); CheckCancelled(); } // Root nodes RaiseMessage("GLTFExporter | Exporting nodes"); List <BabylonNode> babylonRootNodes = babylonNodes.FindAll(node => node.parentId == null); progressionStep = 40.0f / babylonRootNodes.Count; babylonRootNodes.ForEach(babylonNode => { exportNodeRec(babylonNode, gltf, babylonScene); progression += progressionStep; ReportProgressChanged((int)progression); CheckCancelled(); }); // TODO - Choose between this method and the reverse of X axis // Switch from left to right handed coordinate system RaiseMessage("GLTFExporter | Exporting root node"); var tmpNodesList = new List <int>(scene.NodesList); var rootNode = new BabylonMesh { name = "root", rotation = new float[] { 0, (float)Math.PI, 0 }, scaling = new float[] { 1, 1, -1 }, idGroupInstance = -1 }; scene.NodesList.Clear(); GLTFNode gltfRootNode = ExportAbstractMesh(rootNode, gltf, null); gltfRootNode.ChildrenList.AddRange(tmpNodesList); // Materials RaiseMessage("GLTFExporter | Exporting materials"); foreach (var babylonMaterial in babylonMaterialsToExport) { ExportMaterial(babylonMaterial, gltf); CheckCancelled(); } ; RaiseMessage(string.Format("GLTFExporter | Nb materials exported: {0}", gltf.MaterialsList.Count), Color.Gray, 1); // Output RaiseMessage("GLTFExporter | Saving to output file"); // Cast lists to arrays gltf.Prepare(); var jsonSerializer = JsonSerializer.Create(new JsonSerializerSettings()); var sb = new StringBuilder(); var sw = new StringWriter(sb, CultureInfo.InvariantCulture); // Do not use the optimized writer because it's not necessary to truncate values // Use the bounded writer in case some values are infinity () using (var jsonWriter = new JsonTextWriterBounded(sw)) { jsonWriter.Formatting = Formatting.None; jsonSerializer.Serialize(jsonWriter, gltf); } string outputGltfFile = Path.ChangeExtension(outputFile, "gltf"); File.WriteAllText(outputGltfFile, sb.ToString()); // Binary if (generateBinary) { // TODO - Export glTF data to binary format .glb RaiseError("GLTFExporter | TODO - Generating binary files"); } ReportProgressChanged(100); }