InTerra_TerrainData.cs 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. using UnityEngine;
  2. namespace InTerra
  3. {
  4. [ExecuteInEditMode]
  5. public class InTerra_TerrainData : MonoBehaviour
  6. {
  7. [HideInInspector] MaterialPropertyBlock mtb;
  8. [HideInInspector] public Terrain terrain;
  9. void Start()
  10. {
  11. gameObject.TryGetComponent<Terrain>(out terrain);
  12. }
  13. void Update()
  14. {
  15. if (terrain)
  16. {
  17. if (terrain.materialTemplate && InTerra_Data.EightLayersEnabled(terrain.materialTemplate) && terrain.terrainData.terrainLayers.Length > 4)
  18. {
  19. if (mtb == null)
  20. {
  21. mtb = new MaterialPropertyBlock();
  22. }
  23. terrain.GetSplatMaterialPropertyBlock(mtb);
  24. if (!mtb.GetTexture("_Control1") || !mtb.GetTexture("_Splat4"))
  25. {
  26. for (int i = 0; i < terrain.terrainData.alphamapLayers && i < 8; i++)
  27. {
  28. InTerra_Data.TerrainLaeyrDataToTerrain(terrain.terrainData.size, terrain.terrainData.terrainLayers[i], i, mtb);
  29. }
  30. mtb.SetTexture("_Control", terrain.terrainData.alphamapTextureCount > 0 ? terrain.terrainData.alphamapTextures[0] : Texture2D.redTexture);
  31. mtb.SetTexture("_Control1", terrain.terrainData.alphamapTextureCount > 1 ? terrain.terrainData.alphamapTextures[1] : Texture2D.blackTexture);
  32. terrain.SetSplatMaterialPropertyBlock(mtb);
  33. terrain.terrainData.SetBaseMapDirty();
  34. }
  35. }
  36. else
  37. {
  38. if(mtb != null)
  39. {
  40. mtb.Clear();
  41. mtb.SetFloat("_NumLayersCount", terrain.terrainData.alphamapLayers);
  42. terrain.SetSplatMaterialPropertyBlock(mtb);
  43. }
  44. }
  45. }
  46. else
  47. {
  48. gameObject.TryGetComponent<Terrain>(out terrain);
  49. }
  50. }
  51. }
  52. }