BabylonScene.cs 5.7 KB

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