SceneBuilder.Lights.cs 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135
  1. using System;
  2. using System.IO;
  3. using System.Collections.Generic;
  4. using BabylonExport.Entities;
  5. using UnityEditor;
  6. using UnityEngine;
  7. using UnityEngine.Rendering;
  8. namespace Unity3D2Babylon
  9. {
  10. partial class SceneBuilder
  11. {
  12. private void GenerateShadowsGenerator(Light light, float progress)
  13. {
  14. var generator = new BabylonShadowGenerator
  15. {
  16. lightId = GetID(light.gameObject),
  17. mapSize = exportationOptions.ShadowMapSize,
  18. blurScale = exportationOptions.ShadowBlurScale,
  19. bias = exportationOptions.ShadowMapBias,
  20. forceBackFacesOnly = false
  21. };
  22. BabylonLightingFilter filter = (BabylonLightingFilter)exportationOptions.DefaultLightFilter;
  23. switch (filter)
  24. {
  25. case BabylonLightingFilter.PoissonSampling:
  26. generator.usePoissonSampling = true;
  27. break;
  28. case BabylonLightingFilter.VarianceShadowMap:
  29. generator.useVarianceShadowMap = true;
  30. break;
  31. case BabylonLightingFilter.BlurVarianceShadowMap:
  32. generator.useBlurVarianceShadowMap = true;
  33. break;
  34. case BabylonLightingFilter.SoftPoissonSampling:
  35. generator.usePoissonSampling = (light.shadows == LightShadows.Soft);
  36. break;
  37. }
  38. var renderList = new List<string>();
  39. foreach (var gameObject in gameObjects)
  40. {
  41. var shadowBake = gameObject.GetComponent<BabylonShadowBake>();
  42. bool realtimeShadows = (shadowBake != null && shadowBake.shadowOption == BabylonShadowOptions.Realtime);
  43. if (realtimeShadows)
  44. {
  45. var renderer = gameObject.GetComponent<Renderer>();
  46. var meshFilter = gameObject.GetComponent<MeshFilter>();
  47. if (meshFilter != null && renderer != null && renderer.shadowCastingMode != ShadowCastingMode.Off)
  48. {
  49. renderList.Add(GetID(gameObject));
  50. continue;
  51. }
  52. var skinnedMesh = gameObject.GetComponent<SkinnedMeshRenderer>();
  53. if (skinnedMesh != null && renderer != null && renderer.shadowCastingMode != ShadowCastingMode.Off)
  54. {
  55. renderList.Add(GetID(gameObject));
  56. }
  57. }
  58. }
  59. generator.renderList = renderList.ToArray();
  60. babylonScene.ShadowGeneratorsList.Add(generator);
  61. }
  62. private void ConvertUnityLightToBabylon(Light light, GameObject gameObject, float progress, ref UnityMetaData metaData, ref List<BabylonExport.Entities.BabylonParticleSystem> particleSystems, ref List<UnityFlareSystem> lensFlares, ref string componentTags)
  63. {
  64. // No Inactive Or Baking Lights
  65. if (light.isActiveAndEnabled == false || light.type == LightType.Area || light.lightmappingMode == LightmappingMode.Baked) return;
  66. ExporterWindow.ReportProgress(progress, "Exporting light: " + light.name);
  67. BabylonLight babylonLight = new BabylonLight
  68. {
  69. name = light.name,
  70. id = GetID(light.gameObject),
  71. parentId = GetParentID(light.transform)
  72. };
  73. metaData.type = "Light";
  74. babylonLight.tags = componentTags;
  75. switch (light.type)
  76. {
  77. case LightType.Point:
  78. babylonLight.type = 0;
  79. babylonLight.range = light.range;
  80. break;
  81. case LightType.Directional:
  82. babylonLight.type = 1;
  83. break;
  84. case LightType.Spot:
  85. babylonLight.type = 2;
  86. break;
  87. }
  88. babylonLight.position = light.transform.localPosition.ToFloat();
  89. var direction = new Vector3(0, 0, 1);
  90. var transformedDirection = light.transform.TransformDirection(direction);
  91. transformedDirection[0] += exportationOptions.LightRotationOffset.X;
  92. transformedDirection[1] += exportationOptions.LightRotationOffset.Y;
  93. transformedDirection[2] += exportationOptions.LightRotationOffset.Z;
  94. babylonLight.direction = transformedDirection.ToFloat();
  95. babylonLight.diffuse = light.color.ToFloat();
  96. babylonLight.intensity = light.intensity * exportationOptions.LightIntensityFactor;
  97. babylonLight.angle = light.spotAngle * (float)Math.PI / 180;
  98. babylonLight.exponent = 1.0f;
  99. babylonLight.metadata = metaData;
  100. babylonScene.LightsList.Add(babylonLight);
  101. // Animations
  102. ExportAnimations(light.transform, babylonLight);
  103. // Lens Flares
  104. ParseLensFlares(gameObject, babylonLight.id, ref lensFlares);
  105. // Particles Systems
  106. ParseParticleSystems(gameObject, babylonLight.id, ref particleSystems);
  107. // Shadow Maps
  108. if (exportationOptions.ExportShadows)
  109. {
  110. if ((light.type == LightType.Directional || light.type == LightType.Spot) && light.shadows != LightShadows.None)
  111. {
  112. GenerateShadowsGenerator(light, progress);
  113. }
  114. }
  115. }
  116. }
  117. }