ExporterWindow.cs 5.7 KB

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