SceneBuilder.cs 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202
  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. var babylonMesh = ConvertUnityMeshToBabylon(skinnedMesh.sharedMesh, skinnedMesh.transform, gameObject, progress);
  105. var skeleton = ConvertUnitySkeletonToBabylon(skinnedMesh.bones, skinnedMesh.sharedMesh.bindposes, skinnedMesh.transform, gameObject, progress);
  106. babylonMesh.skeletonId = skeleton.id;
  107. ExportSkeletonAnimation(skinnedMesh, babylonMesh, skeleton);
  108. continue;
  109. }
  110. // Light
  111. var light = gameObject.GetComponent<Light>();
  112. if (light != null)
  113. {
  114. ConvertUnityLightToBabylon(light, progress);
  115. continue;
  116. }
  117. // Camera
  118. var camera = gameObject.GetComponent<Camera>();
  119. if (camera != null)
  120. {
  121. ConvertUnityCameraToBabylon(camera, progress);
  122. ConvertUnitySkyboxToBabylon(camera, progress);
  123. continue;
  124. }
  125. // Empty
  126. ConvertUnityEmptyObjectToBabylon(gameObject);
  127. }
  128. // Materials
  129. foreach (var mat in materialsDictionary)
  130. {
  131. babylonScene.MaterialsList.Add(mat.Value);
  132. }
  133. foreach (var multiMat in multiMatDictionary)
  134. {
  135. babylonScene.MultiMaterialsList.Add(multiMat.Value);
  136. }
  137. // Collisions
  138. if (exportationOptions.ExportCollisions)
  139. {
  140. babylonScene.gravity = exportationOptions.Gravity.ToFloat();
  141. }
  142. }
  143. private static void ExportSkeletonAnimation(SkinnedMeshRenderer skinnedMesh, BabylonMesh babylonMesh, BabylonSkeleton skeleton)
  144. {
  145. var animator = skinnedMesh.rootBone.gameObject.GetComponent<Animator>();
  146. if (animator != null)
  147. {
  148. ExportSkeletonAnimationClips(animator, true, skeleton, skinnedMesh.bones, babylonMesh);
  149. }
  150. else
  151. {
  152. var parent = skinnedMesh.rootBone.parent;
  153. while (parent != null)
  154. {
  155. animator = parent.gameObject.GetComponent<Animator>();
  156. if (animator != null)
  157. {
  158. ExportSkeletonAnimationClips(animator, true, skeleton, skinnedMesh.bones, babylonMesh);
  159. break;
  160. }
  161. parent = parent.parent;
  162. }
  163. }
  164. }
  165. }
  166. }