DummyMaterial.cs 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950
  1. using UnityEngine;
  2. #if UNITY_EDITOR
  3. using UnityEditor;
  4. #endif
  5. namespace VLB
  6. {
  7. public static class DummyMaterial
  8. {
  9. #if UNITY_EDITOR
  10. static string GetPath(Shader shader)
  11. {
  12. const string kDummyFilename = "VLBDummyMaterial.mat";
  13. const string kDummyPathFallback = "Assets/Plugins/VolumetricLightBeam/Shaders/" + kDummyFilename;
  14. if (shader == null)
  15. return kDummyPathFallback;
  16. var shaderPath = AssetDatabase.GetAssetPath(shader);
  17. if (string.IsNullOrEmpty(shaderPath))
  18. return kDummyPathFallback;
  19. var shaderFolder = System.IO.Path.GetDirectoryName(shaderPath);
  20. return System.IO.Path.Combine(shaderFolder, kDummyFilename);
  21. }
  22. /// <summary>
  23. /// Create a dummy material with the proper instancing flag to prevent from stripping away needed shader variants when exporting build
  24. /// </summary>
  25. public static Material Create(Shader shader, bool gpuInstanced)
  26. {
  27. if (shader == null)
  28. return null;
  29. string path = GetPath(shader);
  30. var dummyMat = AssetDatabase.LoadAssetAtPath<Material>(path);
  31. if (dummyMat == null
  32. || dummyMat.shader != shader
  33. || BatchingHelper.IsGpuInstancingEnabled(dummyMat) != gpuInstanced)
  34. {
  35. dummyMat = MaterialManager.NewMaterialPersistent(shader, gpuInstanced);
  36. if (dummyMat)
  37. AssetDatabase.CreateAsset(dummyMat, path);
  38. }
  39. return dummyMat;
  40. }
  41. #endif
  42. }
  43. }