BabylonScene.cs 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214
  1. using System;
  2. using System.Collections.Generic;
  3. using System.IO;
  4. using System.Runtime.Serialization;
  5. namespace BabylonExport.Entities
  6. {
  7. [DataContract]
  8. public class BabylonScene
  9. {
  10. [DataMember]
  11. public BabylonProducer producer { get; set; }
  12. [DataMember]
  13. public bool autoClear { get; set; }
  14. [DataMember]
  15. public float[] clearColor { get; set; }
  16. [DataMember]
  17. public float[] ambientColor { get; set; }
  18. [DataMember]
  19. public int fogMode { get; set; }
  20. [DataMember]
  21. public float[] fogColor { get; set; }
  22. [DataMember]
  23. public float fogStart { get; set; }
  24. [DataMember]
  25. public float fogEnd { get; set; }
  26. [DataMember]
  27. public float fogDensity { get; set; }
  28. [DataMember]
  29. public float[] gravity { get; set; }
  30. [DataMember]
  31. public string physicsEngine { get; set; }
  32. [DataMember]
  33. public bool physicsEnabled { get; set; }
  34. [DataMember]
  35. public float[] physicsGravity { get; set; }
  36. [DataMember(EmitDefaultValue = false)]
  37. public BabylonCamera[] cameras { get; set; }
  38. [DataMember(EmitDefaultValue = false)]
  39. public string activeCameraID { get; set; }
  40. [DataMember]
  41. public BabylonLight[] lights { get; set; }
  42. [DataMember]
  43. public BabylonMesh[] meshes { get; set; }
  44. [DataMember]
  45. public BabylonSound[] sounds { get; set; }
  46. [DataMember]
  47. public BabylonMaterial[] materials { get; set; }
  48. [DataMember]
  49. public BabylonMultiMaterial[] multiMaterials { get; set; }
  50. [DataMember]
  51. public BabylonParticleSystem[] particleSystems { get; set; }
  52. [DataMember]
  53. public BabylonLensFlareSystem[] lensFlareSystems { get; set; }
  54. [DataMember]
  55. public BabylonShadowGenerator[] shadowGenerators { get; set; }
  56. [DataMember]
  57. public BabylonSkeleton[] skeletons { get; set; }
  58. [DataMember]
  59. public BabylonActions actions { get; set; }
  60. [DataMember]
  61. public object metadata { get; set; }
  62. [DataMember]
  63. public bool workerCollisions { get; set; }
  64. [DataMember]
  65. public BabylonMorphTargetManager[] morphTargetManagers { get; set; }
  66. public BabylonVector3 MaxVector { get; set; }
  67. public BabylonVector3 MinVector { get; set; }
  68. public string OutputPath { get; private set; }
  69. public List<BabylonMesh> MeshesList { get; private set; }
  70. public List<BabylonSound> SoundsList { get; private set; }
  71. public List<BabylonCamera> CamerasList { get; private set; }
  72. public List<BabylonLight> LightsList { get; private set; }
  73. public List<BabylonMaterial> MaterialsList { get; private set; }
  74. public List<BabylonMultiMaterial> MultiMaterialsList { get; private set; }
  75. public List<BabylonShadowGenerator> ShadowGeneratorsList { get; private set; }
  76. public List<BabylonSkeleton> SkeletonsList { get; private set; }
  77. public List<BabylonMorphTargetManager> MorphTargetManagersList { get; private set; }
  78. readonly List<string> exportedTextures = new List<string>();
  79. public BabylonScene(string outputPath)
  80. {
  81. OutputPath = outputPath;
  82. MeshesList = new List<BabylonMesh>();
  83. MaterialsList = new List<BabylonMaterial>();
  84. CamerasList = new List<BabylonCamera>();
  85. LightsList = new List<BabylonLight>();
  86. MultiMaterialsList = new List<BabylonMultiMaterial>();
  87. ShadowGeneratorsList = new List<BabylonShadowGenerator>();
  88. SkeletonsList = new List<BabylonSkeleton>();
  89. SoundsList = new List<BabylonSound>();
  90. MorphTargetManagersList = new List<BabylonMorphTargetManager>();
  91. // Default values
  92. autoClear = true;
  93. clearColor = new[] { 0.2f, 0.2f, 0.3f };
  94. ambientColor = new[] { 0f, 0f, 0f };
  95. gravity = new[] { 0f, 0f, -0.9f };
  96. MaxVector = new BabylonVector3 { X = float.MinValue, Y = float.MinValue, Z = float.MinValue };
  97. MinVector = new BabylonVector3 { X = float.MaxValue, Y = float.MaxValue, Z = float.MaxValue };
  98. }
  99. public void Prepare(bool generateDefaultLight = true, bool generateDefaultCamera = true)
  100. {
  101. meshes = MeshesList.ToArray();
  102. sounds = SoundsList.ToArray();
  103. materials = MaterialsList.ToArray();
  104. multiMaterials = MultiMaterialsList.ToArray();
  105. shadowGenerators = ShadowGeneratorsList.ToArray();
  106. skeletons = SkeletonsList.ToArray();
  107. if (MorphTargetManagersList.Count > 0)
  108. {
  109. morphTargetManagers = MorphTargetManagersList.ToArray();
  110. }
  111. if (CamerasList.Count == 0 && generateDefaultCamera)
  112. {
  113. var camera = new BabylonCamera { name = "Default camera", id = Guid.NewGuid().ToString() };
  114. // Default camera init gives infinit values
  115. // Indeed, float.MaxValue - float.MinValue always leads to infinity
  116. var distanceVector = MaxVector - MinVector;
  117. var midPoint = MinVector + distanceVector / 2;
  118. camera.target = midPoint.ToArray();
  119. camera.position = (midPoint + distanceVector).ToArray();
  120. var distance = distanceVector.Length();
  121. camera.speed = distance / 50.0f;
  122. camera.maxZ = distance * 4f;
  123. camera.minZ = distance < 100.0f ? 0.1f : 1.0f;
  124. CamerasList.Add(camera);
  125. }
  126. if (LightsList.Count == 0 && generateDefaultLight)
  127. {
  128. var light = new BabylonLight
  129. {
  130. name = "Default light",
  131. id = Guid.NewGuid().ToString(),
  132. type = 3,
  133. groundColor = new float[] {0, 0, 0},
  134. direction = new[] {0, 1.0f, 0},
  135. intensity = 1
  136. };
  137. LightsList.Add(light);
  138. }
  139. cameras = (CamerasList.Count > 0) ? CamerasList.ToArray() : null;
  140. lights = (LightsList.Count > 0) ? LightsList.ToArray() : null;
  141. if (activeCameraID == null && CamerasList.Count > 0)
  142. {
  143. activeCameraID = CamerasList[0].id;
  144. }
  145. }
  146. public void AddTexture(string texture)
  147. {
  148. if (exportedTextures.Contains(texture))
  149. return;
  150. exportedTextures.Add(texture);
  151. File.Copy(texture, Path.Combine(OutputPath, Path.GetFileName(texture)), true);
  152. }
  153. public bool AddTextureCube(string textureName)
  154. {
  155. if (exportedTextures.Contains(textureName))
  156. return false;
  157. exportedTextures.Add(textureName);
  158. return true;
  159. }
  160. }
  161. }