SceneBuilder.cs 7.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213
  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. babylonScene.producer = new BabylonProducer
  32. {
  33. file = Path.GetFileName(outputPath),
  34. version = "Unity3D",
  35. name = SceneName,
  36. exporter_version = "0.8"
  37. };
  38. this.exportationOptions = exportationOptions;
  39. }
  40. public string WriteToBabylonFile()
  41. {
  42. babylonScene.Prepare();
  43. var outputFile = Path.Combine(OutputPath, SceneName + ".babylon");
  44. var settings = new DataWriterSettings(new DataContractResolverStrategy()) {PrettyPrint = true};
  45. var jsWriter = new JsonWriter(settings);
  46. string babylonJSformat = jsWriter.Write(babylonScene);
  47. using (var sw = new StreamWriter(outputFile))
  48. {
  49. sw.Write(babylonJSformat);
  50. sw.Close();
  51. }
  52. return outputFile;
  53. }
  54. public void GenerateStatus(List<string> logs)
  55. {
  56. var initialLog = new List<string>
  57. {
  58. "*Exportation Status:",
  59. babylonScene.meshes.Length + " mesh(es)",
  60. babylonScene.lights.Length + " light(s)",
  61. babylonScene.cameras.Length + " camera(s)",
  62. babylonScene.materials.Length + " material(s)",
  63. babylonScene.multiMaterials.Length + " multi-material(s)",
  64. "",
  65. "*Log:"
  66. };
  67. logs.InsertRange(0, initialLog);
  68. }
  69. string GetParentID(Transform transform)
  70. {
  71. if (transform.parent == null)
  72. {
  73. return null;
  74. }
  75. return GetID(transform.parent.gameObject);
  76. }
  77. string GetID(GameObject gameObject)
  78. {
  79. var key = gameObject.GetInstanceID();
  80. if (!uniqueGuids.ContainsKey(key))
  81. {
  82. uniqueGuids[key] = Guid.NewGuid().ToString();
  83. }
  84. return uniqueGuids[key];
  85. }
  86. public void ConvertFromUnity()
  87. {
  88. ExporterWindow.ReportProgress(0, "Starting Babylon.js exportation process...");
  89. gameObjects = Object.FindObjectsOfType(typeof(GameObject)) as GameObject[];
  90. if (gameObjects.Length == 0)
  91. {
  92. ExporterWindow.ShowMessage("No gameobject! - Please add at least a gameobject to export");
  93. return;
  94. }
  95. var itemsCount = gameObjects.Length;
  96. var index = 0;
  97. foreach (var gameObject in gameObjects)
  98. {
  99. var progress = ((float)index / itemsCount);
  100. index++;
  101. // Static meshes
  102. var meshFilter = gameObject.GetComponent<MeshFilter>();
  103. if (meshFilter != null)
  104. {
  105. ConvertUnityMeshToBabylon(meshFilter.sharedMesh, meshFilter.transform, gameObject, progress);
  106. continue;
  107. }
  108. // Skinned meshes
  109. var skinnedMesh = gameObject.GetComponent<SkinnedMeshRenderer>();
  110. if (skinnedMesh != null)
  111. {
  112. var babylonMesh = ConvertUnityMeshToBabylon(skinnedMesh.sharedMesh, skinnedMesh.transform, gameObject, progress);
  113. var skeleton = ConvertUnitySkeletonToBabylon(skinnedMesh.bones, skinnedMesh.sharedMesh.bindposes, skinnedMesh.transform, gameObject, progress);
  114. babylonMesh.skeletonId = skeleton.id;
  115. ExportSkeletonAnimation(skinnedMesh, babylonMesh, skeleton);
  116. continue;
  117. }
  118. // Light
  119. var light = gameObject.GetComponent<Light>();
  120. if (light != null)
  121. {
  122. ConvertUnityLightToBabylon(light, progress);
  123. continue;
  124. }
  125. // Camera
  126. var camera = gameObject.GetComponent<Camera>();
  127. if (camera != null)
  128. {
  129. ConvertUnityCameraToBabylon(camera, progress);
  130. ConvertUnitySkyboxToBabylon(camera, progress);
  131. continue;
  132. }
  133. // Empty
  134. ConvertUnityEmptyObjectToBabylon(gameObject);
  135. }
  136. // Materials
  137. foreach (var mat in materialsDictionary)
  138. {
  139. babylonScene.MaterialsList.Add(mat.Value);
  140. }
  141. foreach (var multiMat in multiMatDictionary)
  142. {
  143. babylonScene.MultiMaterialsList.Add(multiMat.Value);
  144. }
  145. // Collisions
  146. if (exportationOptions.ExportCollisions)
  147. {
  148. babylonScene.gravity = exportationOptions.Gravity.ToFloat();
  149. }
  150. }
  151. private static void ExportSkeletonAnimation(SkinnedMeshRenderer skinnedMesh, BabylonMesh babylonMesh, BabylonSkeleton skeleton)
  152. {
  153. var animator = skinnedMesh.rootBone.gameObject.GetComponent<Animator>();
  154. if (animator != null)
  155. {
  156. ExportSkeletonAnimationClips(animator, true, skeleton, skinnedMesh.bones, babylonMesh);
  157. }
  158. else
  159. {
  160. var parent = skinnedMesh.rootBone.parent;
  161. while (parent != null)
  162. {
  163. animator = parent.gameObject.GetComponent<Animator>();
  164. if (animator != null)
  165. {
  166. ExportSkeletonAnimationClips(animator, true, skeleton, skinnedMesh.bones, babylonMesh);
  167. break;
  168. }
  169. parent = parent.parent;
  170. }
  171. }
  172. }
  173. }
  174. }