SceneBuilder.Meshes.cs 9.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244
  1. using System;
  2. using BabylonExport.Entities;
  3. using UnityEngine;
  4. namespace Unity3D2Babylon
  5. {
  6. partial class SceneBuilder
  7. {
  8. private void ConvertUnityEmptyObjectToBabylon(GameObject gameObject)
  9. {
  10. BabylonMesh babylonMesh = new BabylonMesh { name = gameObject.name, id = GetID(gameObject) };
  11. var transform = gameObject.transform;
  12. babylonMesh.parentId = GetParentID(transform);
  13. babylonMesh.position = transform.localPosition.ToFloat();
  14. babylonMesh.rotation = new float[3];
  15. babylonMesh.rotation[0] = transform.localRotation.eulerAngles.x * (float)Math.PI / 180;
  16. babylonMesh.rotation[1] = transform.localRotation.eulerAngles.y * (float)Math.PI / 180;
  17. babylonMesh.rotation[2] = transform.localRotation.eulerAngles.z * (float)Math.PI / 180;
  18. babylonMesh.scaling = transform.localScale.ToFloat();
  19. babylonScene.MeshesList.Add(babylonMesh);
  20. // Animations
  21. ExportAnimations(transform, babylonMesh);
  22. if (IsRotationQuaternionAnimated(babylonMesh))
  23. {
  24. babylonMesh.rotationQuaternion = transform.localRotation.ToFloat();
  25. }
  26. }
  27. private void ConvertUnityMeshToBabylon(Mesh mesh, Transform transform, GameObject gameObject, float progress)
  28. {
  29. BabylonMesh babylonMesh = new BabylonMesh();
  30. var renderer = gameObject.GetComponent<Renderer>();
  31. ExporterWindow.ReportProgress(progress, "Exporting mesh: " + gameObject.name);
  32. babylonMesh.name = gameObject.name;
  33. babylonMesh.id = GetID(transform.gameObject);
  34. if (renderer != null)
  35. {
  36. babylonMesh.receiveShadows = renderer.receiveShadows;
  37. }
  38. babylonMesh.parentId = GetParentID(transform);
  39. babylonMesh.position = transform.localPosition.ToFloat();
  40. babylonMesh.rotation = new float[3];
  41. babylonMesh.rotation[0] = transform.localRotation.eulerAngles.x * (float)Math.PI / 180;
  42. babylonMesh.rotation[1] = transform.localRotation.eulerAngles.y * (float)Math.PI / 180;
  43. babylonMesh.rotation[2] = transform.localRotation.eulerAngles.z * (float)Math.PI / 180;
  44. babylonMesh.scaling = transform.localScale.ToFloat();
  45. if (mesh != null)
  46. {
  47. babylonMesh.positions = new float[mesh.vertexCount * 3];
  48. for (int i = 0; i < mesh.vertices.Length; i++)
  49. {
  50. babylonMesh.positions[i * 3] = mesh.vertices[i].x;
  51. babylonMesh.positions[(i * 3) + 1] = mesh.vertices[i].y;
  52. babylonMesh.positions[(i * 3) + 2] = mesh.vertices[i].z;
  53. // Computing world extends
  54. var worldPosition = transform.TransformPoint(mesh.vertices[i]);
  55. if (worldPosition.x > babylonScene.MaxVector.X)
  56. {
  57. babylonScene.MaxVector.X = worldPosition.x;
  58. }
  59. if (worldPosition.y > babylonScene.MaxVector.Y)
  60. {
  61. babylonScene.MaxVector.Y = worldPosition.y;
  62. }
  63. if (worldPosition.z > babylonScene.MaxVector.Z)
  64. {
  65. babylonScene.MaxVector.Z = worldPosition.z;
  66. }
  67. if (worldPosition.x < babylonScene.MinVector.X)
  68. {
  69. babylonScene.MinVector.X = worldPosition.x;
  70. }
  71. if (worldPosition.y < babylonScene.MinVector.Y)
  72. {
  73. babylonScene.MinVector.Y = worldPosition.y;
  74. }
  75. if (worldPosition.z < babylonScene.MinVector.Z)
  76. {
  77. babylonScene.MinVector.Z = worldPosition.z;
  78. }
  79. }
  80. babylonMesh.normals = new float[mesh.vertexCount * 3];
  81. for (int i = 0; i < mesh.normals.Length; i++)
  82. {
  83. babylonMesh.normals[i * 3] = mesh.normals[i].x;
  84. babylonMesh.normals[(i * 3) + 1] = mesh.normals[i].y;
  85. babylonMesh.normals[(i * 3) + 2] = mesh.normals[i].z;
  86. }
  87. babylonMesh.uvs = new float[mesh.vertexCount * 2];
  88. for (int i = 0; i < mesh.uv.Length; i++)
  89. {
  90. babylonMesh.uvs[i * 2] = mesh.uv[i].x;
  91. babylonMesh.uvs[(i * 2) + 1] = mesh.uv[i].y;
  92. }
  93. babylonMesh.uvs2 = new float[mesh.vertexCount * 2];
  94. if (mesh.uv2 != null && mesh.uv2.Length > 0)
  95. {
  96. for (int i = 0; i < mesh.uv2.Length; i++)
  97. {
  98. babylonMesh.uvs2[i * 2] = mesh.uv2[i].x;
  99. babylonMesh.uvs2[(i * 2) + 1] = mesh.uv2[i].y;
  100. }
  101. }
  102. else
  103. {
  104. for (int i = 0; i < mesh.uv.Length; i++)
  105. {
  106. babylonMesh.uvs2[i * 2] = mesh.uv[i].x;
  107. babylonMesh.uvs2[(i * 2) + 1] = mesh.uv[i].y;
  108. }
  109. }
  110. babylonMesh.indices = new int[mesh.triangles.Length];
  111. for (int i = 0; i < mesh.triangles.Length; i += 3)
  112. {
  113. babylonMesh.indices[i] = mesh.triangles[i + 2];
  114. babylonMesh.indices[i + 1] = mesh.triangles[i + 1];
  115. babylonMesh.indices[i + 2] = mesh.triangles[i];
  116. }
  117. if (renderer != null && renderer.sharedMaterial != null)
  118. {
  119. if (mesh.subMeshCount > 1) // Multimaterials
  120. {
  121. BabylonMultiMaterial bMultiMat;
  122. if (!multiMatDictionary.ContainsKey(renderer.sharedMaterial.name))
  123. {
  124. bMultiMat = new BabylonMultiMaterial
  125. {
  126. materials = new string[mesh.subMeshCount],
  127. id = Guid.NewGuid().ToString(),
  128. name = renderer.sharedMaterial.name
  129. };
  130. for (int i = 0; i < renderer.sharedMaterials.Length; i++)
  131. {
  132. var sharedMaterial = renderer.sharedMaterials[i];
  133. BabylonMaterial babylonMaterial;
  134. if (sharedMaterial.HasProperty("_Metallic"))
  135. {
  136. babylonMaterial = DumpPBRMaterial(sharedMaterial, renderer);
  137. }
  138. else
  139. {
  140. babylonMaterial = DumpMaterial(sharedMaterial, renderer);
  141. }
  142. bMultiMat.materials[i] = babylonMaterial.id;
  143. }
  144. if (mesh.subMeshCount > 1)
  145. {
  146. multiMatDictionary.Add(bMultiMat.name, bMultiMat);
  147. }
  148. }
  149. else
  150. {
  151. bMultiMat = multiMatDictionary[renderer.sharedMaterial.name];
  152. }
  153. babylonMesh.materialId = bMultiMat.id;
  154. babylonMesh.subMeshes = new BabylonSubMesh[mesh.subMeshCount];
  155. var offset = 0;
  156. for (int materialIndex = 0; materialIndex < mesh.subMeshCount; materialIndex++)
  157. {
  158. var unityTriangles = mesh.GetTriangles(materialIndex);
  159. babylonMesh.subMeshes[materialIndex] = new BabylonSubMesh
  160. {
  161. verticesStart = 0,
  162. verticesCount = mesh.vertexCount,
  163. materialIndex = materialIndex,
  164. indexStart = offset,
  165. indexCount = unityTriangles.Length
  166. };
  167. offset += unityTriangles.Length;
  168. }
  169. }
  170. else
  171. {
  172. if (renderer.sharedMaterial.HasProperty("_Metallic"))
  173. {
  174. babylonMesh.materialId = DumpPBRMaterial(renderer.sharedMaterial, renderer).id;
  175. }
  176. else
  177. {
  178. babylonMesh.materialId = DumpMaterial(renderer.sharedMaterial, renderer).id;
  179. }
  180. }
  181. }
  182. babylonScene.MeshesList.Add(babylonMesh);
  183. // Animations
  184. ExportAnimations(transform, babylonMesh);
  185. if (IsRotationQuaternionAnimated(babylonMesh))
  186. {
  187. babylonMesh.rotationQuaternion = transform.localRotation.ToFloat();
  188. }
  189. // Collisions
  190. if (exportationOptions.ExportCollisions)
  191. {
  192. var collider = gameObject.GetComponent<Collider>();
  193. if (collider != null)
  194. {
  195. babylonMesh.checkCollisions = true;
  196. }
  197. }
  198. }
  199. }
  200. }
  201. }