SceneBuilder.Meshes.cs 7.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208
  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: " + mesh.name);
  32. babylonMesh.name = mesh.name;
  33. babylonMesh.id = GetID(transform.gameObject);
  34. babylonMesh.receiveShadows = renderer.receiveShadows;
  35. babylonMesh.parentId = GetParentID(transform);
  36. babylonMesh.position = transform.localPosition.ToFloat();
  37. babylonMesh.rotation = new float[3];
  38. babylonMesh.rotation[0] = transform.localRotation.eulerAngles.x * (float)Math.PI / 180;
  39. babylonMesh.rotation[1] = transform.localRotation.eulerAngles.y * (float)Math.PI / 180;
  40. babylonMesh.rotation[2] = transform.localRotation.eulerAngles.z * (float)Math.PI / 180;
  41. babylonMesh.scaling = transform.localScale.ToFloat();
  42. babylonMesh.positions = new float[mesh.vertexCount * 3];
  43. for (int i = 0; i < mesh.vertices.Length; i++)
  44. {
  45. babylonMesh.positions[i * 3] = mesh.vertices[i].x;
  46. babylonMesh.positions[(i * 3) + 1] = mesh.vertices[i].y;
  47. babylonMesh.positions[(i * 3) + 2] = mesh.vertices[i].z;
  48. // Computing world extends
  49. var worldPosition = transform.TransformPoint(mesh.vertices[i]);
  50. if (worldPosition.x > babylonScene.MaxVector.X)
  51. {
  52. babylonScene.MaxVector.X = worldPosition.x;
  53. }
  54. if (worldPosition.y > babylonScene.MaxVector.Y)
  55. {
  56. babylonScene.MaxVector.Y = worldPosition.y;
  57. }
  58. if (worldPosition.z > babylonScene.MaxVector.Z)
  59. {
  60. babylonScene.MaxVector.Z = worldPosition.z;
  61. }
  62. if (worldPosition.x < babylonScene.MinVector.X)
  63. {
  64. babylonScene.MinVector.X = worldPosition.x;
  65. }
  66. if (worldPosition.y < babylonScene.MinVector.Y)
  67. {
  68. babylonScene.MinVector.Y = worldPosition.y;
  69. }
  70. if (worldPosition.z < babylonScene.MinVector.Z)
  71. {
  72. babylonScene.MinVector.Z = worldPosition.z;
  73. }
  74. }
  75. babylonMesh.normals = new float[mesh.vertexCount * 3];
  76. for (int i = 0; i < mesh.normals.Length; i++)
  77. {
  78. babylonMesh.normals[i * 3] = mesh.normals[i].x;
  79. babylonMesh.normals[(i * 3) + 1] = mesh.normals[i].y;
  80. babylonMesh.normals[(i * 3) + 2] = mesh.normals[i].z;
  81. }
  82. babylonMesh.uvs = new float[mesh.vertexCount * 2];
  83. for (int i = 0; i < mesh.uv.Length; i++)
  84. {
  85. babylonMesh.uvs[i * 2] = mesh.uv[i].x;
  86. babylonMesh.uvs[(i * 2) + 1] = mesh.uv[i].y;
  87. }
  88. if (mesh.uv2 != null)
  89. {
  90. babylonMesh.uvs2 = new float[mesh.vertexCount * 2];
  91. for (int i = 0; i < mesh.uv2.Length; i++)
  92. {
  93. babylonMesh.uvs2[i * 2] = mesh.uv2[i].x;
  94. babylonMesh.uvs2[(i * 2) + 1] = mesh.uv2[i].y;
  95. }
  96. }
  97. babylonMesh.indices = new int[mesh.triangles.Length];
  98. for (int i = 0; i < mesh.triangles.Length; i += 3)
  99. {
  100. babylonMesh.indices[i] = mesh.triangles[i + 2];
  101. babylonMesh.indices[i + 1] = mesh.triangles[i + 1];
  102. babylonMesh.indices[i + 2] = mesh.triangles[i];
  103. }
  104. if (mesh.subMeshCount > 1) // Multimaterials
  105. {
  106. BabylonMultiMaterial bMultiMat;
  107. if (!multiMatDictionary.ContainsKey(renderer.sharedMaterial.name))
  108. {
  109. bMultiMat = new BabylonMultiMaterial
  110. {
  111. materials = new string[mesh.subMeshCount],
  112. id = Guid.NewGuid().ToString(),
  113. name = renderer.sharedMaterial.name
  114. };
  115. for (int i = 0; i < renderer.sharedMaterials.Length; i++)
  116. {
  117. var bMat = DumpMaterial(renderer.sharedMaterials[i], renderer);
  118. bMultiMat.materials[i] = bMat.id;
  119. }
  120. if (mesh.subMeshCount > 1)
  121. {
  122. multiMatDictionary.Add(bMultiMat.name, bMultiMat);
  123. }
  124. }
  125. else
  126. {
  127. bMultiMat = multiMatDictionary[renderer.sharedMaterial.name];
  128. }
  129. babylonMesh.materialId = bMultiMat.id;
  130. babylonMesh.subMeshes = new BabylonSubMesh[mesh.subMeshCount];
  131. var offset = 0;
  132. for (int materialIndex = 0; materialIndex < mesh.subMeshCount; materialIndex++)
  133. {
  134. var unityTriangles = mesh.GetTriangles(materialIndex);
  135. babylonMesh.subMeshes[materialIndex] = new BabylonSubMesh
  136. {
  137. verticesStart = 0,
  138. verticesCount = mesh.vertexCount,
  139. materialIndex = materialIndex,
  140. indexStart = offset,
  141. indexCount = unityTriangles.Length
  142. };
  143. offset += unityTriangles.Length;
  144. }
  145. }
  146. else
  147. {
  148. babylonMesh.materialId = DumpMaterial(renderer.sharedMaterial, renderer).id;
  149. }
  150. babylonScene.MeshesList.Add(babylonMesh);
  151. // Animations
  152. ExportAnimations(transform, babylonMesh);
  153. if (IsRotationQuaternionAnimated(babylonMesh))
  154. {
  155. babylonMesh.rotationQuaternion = transform.localRotation.ToFloat();
  156. }
  157. // Collisions
  158. if (exportationOptions.ExportCollisions)
  159. {
  160. var collider = gameObject.GetComponent<Collider>();
  161. if (collider != null)
  162. {
  163. babylonMesh.checkCollisions = true;
  164. }
  165. }
  166. }
  167. }
  168. }