SceneBuilder.cs 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171
  1. using System;
  2. using System.Collections.Generic;
  3. using System.IO;
  4. using BabylonExport.Entities;
  5. using JsonFx.Json;
  6. using UnityEngine;
  7. using Object = UnityEngine.Object;
  8. using JsonFx.Serialization;
  9. using JsonFx.Serialization.Resolvers;
  10. namespace Unity3D2Babylon
  11. {
  12. public partial class SceneBuilder
  13. {
  14. public string OutputPath { get; private set; }
  15. public string SceneName { get; private set; }
  16. readonly Dictionary<string, BabylonMaterial> materialsDictionary;
  17. readonly Dictionary<string, BabylonMultiMaterial> multiMatDictionary;
  18. readonly Dictionary<int, string> uniqueGuids;
  19. readonly BabylonScene babylonScene;
  20. GameObject[] gameObjects;
  21. readonly ExportationOptions exportationOptions;
  22. public SceneBuilder(string outputPath, string sceneName, ExportationOptions exportationOptions)
  23. {
  24. OutputPath = outputPath;
  25. SceneName = string.IsNullOrEmpty(sceneName) ? "scene" : sceneName;
  26. materialsDictionary = new Dictionary<string, BabylonMaterial>();
  27. multiMatDictionary = new Dictionary<string, BabylonMultiMaterial>();
  28. uniqueGuids = new Dictionary<int, string>();
  29. babylonScene = new BabylonScene(OutputPath);
  30. this.exportationOptions = exportationOptions;
  31. }
  32. public string WriteToBabylonFile()
  33. {
  34. babylonScene.Prepare();
  35. var outputFile = Path.Combine(OutputPath, SceneName + ".babylon");
  36. var jsWriter = new JsonWriter(new DataWriterSettings(new DataContractResolverStrategy()));
  37. string babylonJSformat = jsWriter.Write(babylonScene);
  38. using (var sw = new StreamWriter(outputFile))
  39. {
  40. sw.Write(babylonJSformat);
  41. sw.Close();
  42. }
  43. return outputFile;
  44. }
  45. public void GenerateStatus(List<string> logs)
  46. {
  47. var initialLog = new List<string>
  48. {
  49. "*Exportation Status:",
  50. babylonScene.meshes.Length + " mesh(es)",
  51. babylonScene.lights.Length + " light(s)",
  52. babylonScene.cameras.Length + " camera(s)",
  53. babylonScene.materials.Length + " material(s)",
  54. babylonScene.multiMaterials.Length + " multi-material(s)",
  55. "",
  56. "*Log:"
  57. };
  58. logs.InsertRange(0, initialLog);
  59. }
  60. string GetParentID(Transform transform)
  61. {
  62. if (transform.parent == null)
  63. {
  64. return null;
  65. }
  66. return GetID(transform.parent.gameObject);
  67. }
  68. string GetID(GameObject gameObject)
  69. {
  70. var key = gameObject.GetInstanceID();
  71. if (!uniqueGuids.ContainsKey(key))
  72. {
  73. uniqueGuids[key] = Guid.NewGuid().ToString();
  74. }
  75. return uniqueGuids[key];
  76. }
  77. public void ConvertFromUnity()
  78. {
  79. ExporterWindow.ReportProgress(0, "Starting Babylon.js exportation process...");
  80. gameObjects = Object.FindObjectsOfType(typeof(GameObject)) as GameObject[];
  81. if (gameObjects.Length == 0)
  82. {
  83. ExporterWindow.ShowMessage("No gameobject! - Please add at least a gameobject to export");
  84. return;
  85. }
  86. var itemsCount = gameObjects.Length;
  87. var index = 0;
  88. foreach (var gameObject in gameObjects)
  89. {
  90. var progress = ((float)index / itemsCount);
  91. index++;
  92. // Static meshes
  93. var meshFilter = gameObject.GetComponent<MeshFilter>();
  94. if (meshFilter != null)
  95. {
  96. ConvertUnityMeshToBabylon(meshFilter.sharedMesh, meshFilter.transform, gameObject, progress);
  97. continue;
  98. }
  99. // Skinned meshes
  100. var skinnedMesh = gameObject.GetComponent<SkinnedMeshRenderer>();
  101. if (skinnedMesh != null)
  102. {
  103. ConvertUnityMeshToBabylon(skinnedMesh.sharedMesh, skinnedMesh.transform, gameObject, progress);
  104. continue;
  105. }
  106. // Light
  107. var light = gameObject.GetComponent<Light>();
  108. if (light != null)
  109. {
  110. ConvertUnityLightToBabylon(light, progress);
  111. continue;
  112. }
  113. // Camera
  114. var camera = gameObject.GetComponent<Camera>();
  115. if (camera != null)
  116. {
  117. ConvertUnityCameraToBabylon(camera, progress);
  118. continue;
  119. }
  120. // Empty
  121. ConvertUnityEmptyObjectToBabylon(gameObject);
  122. }
  123. // Materials
  124. foreach (var mat in materialsDictionary)
  125. {
  126. babylonScene.MaterialsList.Add(mat.Value);
  127. }
  128. foreach (var multiMat in multiMatDictionary)
  129. {
  130. babylonScene.MultiMaterialsList.Add(multiMat.Value);
  131. }
  132. // Collisions
  133. if (exportationOptions.ExportCollisions)
  134. {
  135. babylonScene.gravity = exportationOptions.Gravity.ToFloat();
  136. }
  137. }
  138. }
  139. }