SceneBuilder.cs 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169
  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 void 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. }
  44. public void GenerateStatus(List<string> logs)
  45. {
  46. var initialLog = new List<string>
  47. {
  48. "*Exportation Status:",
  49. babylonScene.meshes.Length + " mesh(es)",
  50. babylonScene.lights.Length + " light(s)",
  51. babylonScene.cameras.Length + " camera(s)",
  52. babylonScene.materials.Length + " material(s)",
  53. babylonScene.multiMaterials.Length + " multi-material(s)",
  54. "",
  55. "*Log:"
  56. };
  57. logs.InsertRange(0, initialLog);
  58. }
  59. string GetParentID(Transform transform)
  60. {
  61. if (transform.parent == null)
  62. {
  63. return null;
  64. }
  65. return GetID(transform.parent.gameObject);
  66. }
  67. string GetID(GameObject gameObject)
  68. {
  69. var key = gameObject.GetInstanceID();
  70. if (!uniqueGuids.ContainsKey(key))
  71. {
  72. uniqueGuids[key] = Guid.NewGuid().ToString();
  73. }
  74. return uniqueGuids[key];
  75. }
  76. public void ConvertFromUnity()
  77. {
  78. ExporterWindow.ReportProgress(0, "Starting Babylon.js exportation process...");
  79. gameObjects = Object.FindObjectsOfType(typeof(GameObject)) as GameObject[];
  80. if (gameObjects.Length == 0)
  81. {
  82. ExporterWindow.ShowMessage("No gameobject! - Please add at least a gameobject to export");
  83. return;
  84. }
  85. var itemsCount = gameObjects.Length;
  86. var index = 0;
  87. foreach (var gameObject in gameObjects)
  88. {
  89. var progress = ((float)index / itemsCount);
  90. index++;
  91. // Static meshes
  92. var meshFilter = gameObject.GetComponent<MeshFilter>();
  93. if (meshFilter != null)
  94. {
  95. ConvertUnityMeshToBabylon(meshFilter.sharedMesh, meshFilter.transform, gameObject, progress);
  96. continue;
  97. }
  98. // Skinned meshes
  99. var skinnedMesh = gameObject.GetComponent<SkinnedMeshRenderer>();
  100. if (skinnedMesh != null)
  101. {
  102. ConvertUnityMeshToBabylon(skinnedMesh.sharedMesh, skinnedMesh.transform, gameObject, progress);
  103. continue;
  104. }
  105. // Light
  106. var light = gameObject.GetComponent<Light>();
  107. if (light != null)
  108. {
  109. ConvertUnityLightToBabylon(light, progress);
  110. continue;
  111. }
  112. // Camera
  113. var camera = gameObject.GetComponent<Camera>();
  114. if (camera != null)
  115. {
  116. ConvertUnityCameraToBabylon(camera, progress);
  117. continue;
  118. }
  119. // Empty
  120. ConvertUnityEmptyObjectToBabylon(gameObject);
  121. }
  122. // Materials
  123. foreach (var mat in materialsDictionary)
  124. {
  125. babylonScene.MaterialsList.Add(mat.Value);
  126. }
  127. foreach (var multiMat in multiMatDictionary)
  128. {
  129. babylonScene.MultiMaterialsList.Add(multiMat.Value);
  130. }
  131. // Collisions
  132. if (exportationOptions.ExportCollisions)
  133. {
  134. babylonScene.gravity = exportationOptions.Gravity.ToFloat();
  135. }
  136. }
  137. }
  138. }