ExporterWindow.cs 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Diagnostics;
  4. using System.IO;
  5. using UnityEditor;
  6. using UnityEngine;
  7. using JsonFx.Json;
  8. using UnityEngine.SceneManagement;
  9. namespace Unity3D2Babylon
  10. {
  11. public class ExporterWindow : EditorWindow
  12. {
  13. private static readonly List<string> logs = new List<string>();
  14. Vector2 scrollPos;
  15. ExportationOptions exportationOptions;
  16. public static void ReportProgress(float value, string message = "")
  17. {
  18. EditorUtility.DisplayProgressBar("Babylon.js", message, value);
  19. if (!string.IsNullOrEmpty(message))
  20. {
  21. logs.Add(message);
  22. }
  23. }
  24. public static void ShowMessage(string message, string title = "Babylon.js")
  25. {
  26. EditorUtility.DisplayDialog(title, message, "OK");
  27. }
  28. [MenuItem("BabylonJS/Export to .babylon")]
  29. public static void Init()
  30. {
  31. var window = (ExporterWindow)GetWindow(typeof(ExporterWindow));
  32. window.Initialize();
  33. }
  34. void Initialize()
  35. {
  36. titleContent = new GUIContent("Babylon.js");
  37. }
  38. void OnGUI()
  39. {
  40. if (exportationOptions == null)
  41. {
  42. exportationOptions = new ExportationOptions();
  43. if (File.Exists("Unity3D2Babylon.ini"))
  44. {
  45. var readText = File.ReadAllText("Unity3D2Babylon.ini");
  46. var jsReader = new JsonReader();
  47. exportationOptions = jsReader.Read<ExportationOptions>(readText);
  48. }
  49. }
  50. GUILayout.Label("Exportation options", EditorStyles.boldLabel);
  51. exportationOptions.ReflectionDefaultLevel = EditorGUILayout.Slider("Reflection default level", exportationOptions.ReflectionDefaultLevel, 0, 1.0f);
  52. EditorGUILayout.Space();
  53. GUILayout.Label("Collisions options", EditorStyles.boldLabel);
  54. exportationOptions.ExportCollisions = EditorGUILayout.Toggle("Collisions", exportationOptions.ExportCollisions);
  55. EditorGUILayout.BeginHorizontal(GUILayout.ExpandHeight(false));
  56. GUILayout.Label("Camera's Ellipsoid");
  57. exportationOptions.CameraEllipsoid = EditorGUILayout.Vector3Field("", exportationOptions.CameraEllipsoid, GUILayout.ExpandWidth(false));
  58. EditorGUILayout.EndHorizontal();
  59. GUILayout.Space(-16);
  60. EditorGUILayout.BeginHorizontal();
  61. GUILayout.Label("Gravity");
  62. exportationOptions.Gravity = EditorGUILayout.Vector3Field("", exportationOptions.Gravity, GUILayout.ExpandWidth(false));
  63. EditorGUILayout.EndHorizontal();
  64. GUILayout.Space(-16);
  65. EditorGUILayout.Space();
  66. GUILayout.Label("Physics options", EditorStyles.boldLabel);
  67. exportationOptions.ExportPhysics = EditorGUILayout.Toggle("Physics", exportationOptions.ExportPhysics);
  68. EditorGUILayout.Space();
  69. GUILayout.Label("Shadows options", EditorStyles.boldLabel);
  70. exportationOptions.ExportShadows = EditorGUILayout.Toggle("Shadows", exportationOptions.ExportShadows);
  71. EditorGUILayout.Space();
  72. EditorGUILayout.Space();
  73. if (GUILayout.Button("Export"))
  74. {
  75. Export(false);
  76. }
  77. if (WebServer.IsSupported)
  78. {
  79. if (GUILayout.Button("Export & Run"))
  80. {
  81. Export(true);
  82. }
  83. }
  84. EditorGUILayout.Space();
  85. scrollPos = EditorGUILayout.BeginScrollView(scrollPos);
  86. foreach (var log in logs)
  87. {
  88. var bold = log.StartsWith("*");
  89. GUILayout.Label(bold ? log.Remove(0, 1) : log, bold ? (EditorStyles.boldLabel) : EditorStyles.label);
  90. }
  91. EditorGUILayout.EndScrollView();
  92. Repaint();
  93. }
  94. public void Export(bool run)
  95. {
  96. try
  97. {
  98. string sceneName = SceneManager.GetActiveScene().name;
  99. exportationOptions.DefaultFolder = EditorUtility.SaveFolderPanel("Please select a folder", exportationOptions.DefaultFolder, "");
  100. if (string.IsNullOrEmpty(exportationOptions.DefaultFolder))
  101. {
  102. return;
  103. }
  104. Stopwatch watch = new Stopwatch();
  105. watch.Start();
  106. var jsWriter = new JsonWriter();
  107. File.WriteAllText("Unity3D2Babylon.ini", jsWriter.Write(exportationOptions));
  108. logs.Clear();
  109. ReportProgress(0);
  110. var sceneBuilder = new SceneBuilder(exportationOptions.DefaultFolder, sceneName, exportationOptions);
  111. sceneBuilder.ConvertFromUnity();
  112. ReportProgress(1, "Generating output file");
  113. var outputFile = sceneBuilder.WriteToBabylonFile();
  114. watch.Stop();
  115. ReportProgress(1, string.Format("Exportation done in {0:0.00}s", watch.Elapsed.TotalSeconds));
  116. EditorUtility.ClearProgressBar();
  117. sceneBuilder.GenerateStatus(logs);
  118. ShowMessage("Exportation done");
  119. if (run)
  120. {
  121. WebServer.SceneFolder = Path.GetDirectoryName(outputFile);
  122. WebServer.SceneFilename = Path.GetFileName(outputFile);
  123. Process.Start("http://localhost:" + WebServer.Port);
  124. }
  125. }
  126. catch (Exception ex)
  127. {
  128. EditorUtility.ClearProgressBar();
  129. ShowMessage("A problem occurred: " + ex.Message + ex.StackTrace, "Error");
  130. }
  131. }
  132. }
  133. }