SceneBuilder.cs 5.6 KB

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