TC_LayerGroup.cs 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205
  1. using UnityEngine;
  2. using System;
  3. using System.Collections;
  4. using System.Collections.Generic;
  5. namespace TerrainComposer2
  6. {
  7. public class TC_LayerGroup : TC_ItemBehaviour
  8. {
  9. [NonSerialized] public TC_NodeGroup maskNodeGroup;
  10. [NonSerialized] public TC_LayerGroupResult groupResult;
  11. public bool doNormalize;
  12. public float placeLimit = 0.5f;
  13. public Vector2 nodePos;
  14. public float seed = 0;
  15. public int placed;
  16. // Compute height, trees and objects
  17. public ComputeBuffer ComputeSingle(ref ComputeBuffer totalBuffer, float seedParent, bool first = false)
  18. {
  19. if (!groupResult.active) return null;
  20. TC_Compute compute = TC_Compute.instance;
  21. float seedTotal = seed + seedParent;
  22. totalBuffer = groupResult.ComputeSingle(seedTotal, first);
  23. // Debug.Log("layerMaskBuffer " + layerMaskBuffer == null);
  24. ComputeBuffer maskBuffer = null;
  25. if (maskNodeGroup.active) maskBuffer = maskNodeGroup.ComputeValue(seedTotal);
  26. if (maskBuffer != null)
  27. {
  28. TC_Compute.InitPreviewRenderTexture(ref rtPreview, "rtPreview_LayerGroup");
  29. if (method != Method.Lerp || first)
  30. {
  31. if (outputId == TC.heightOutput) compute.RunComputeMethod(null, null, totalBuffer, ref maskBuffer, 0, rtPreview);
  32. else compute.RunItemComputeMask(this, ref rtPreview, groupResult.rtDisplay, ref totalBuffer, ref maskBuffer);
  33. }
  34. rtDisplay = rtPreview;
  35. }
  36. else
  37. {
  38. if (outputId == TC.heightOutput || level == 0 || groupResult.totalActive == 1) rtDisplay = groupResult.rtDisplay;
  39. else rtDisplay = rtPreview;
  40. }
  41. if (totalBuffer == null) TC_Reporter.Log("Layer buffer null");
  42. else
  43. {
  44. if (isPortalCount > 0 && outputId == TC.heightOutput) TC_Compute.instance.MakePortalBuffer(this, totalBuffer, method == Method.Lerp ? maskBuffer : null);
  45. }
  46. return maskBuffer;
  47. }
  48. // Compute Color, splat and grass
  49. public bool ComputeMulti(ref RenderTexture[] renderTextures, ref ComputeBuffer maskBuffer, float seedParent, bool first = false)
  50. {
  51. TC_Compute compute = TC_Compute.instance;
  52. float totalSeed = seed + seedParent;
  53. bool computed = groupResult.ComputeMulti(ref renderTextures, totalSeed, doNormalize, first);
  54. if (maskNodeGroup.active) maskBuffer = maskNodeGroup.ComputeValue(totalSeed);
  55. if (maskBuffer != null)
  56. {
  57. TC_Compute.InitPreviewRenderTexture(ref rtPreview, "rtPreview_LayerGroup_" + TC.outputNames[outputId]);
  58. if (method != Method.Lerp || first)
  59. {
  60. if (outputId == TC.colorOutput) compute.RunComputeColorMethod(this, ref renderTextures[0], maskBuffer, groupResult.rtDisplay);
  61. else compute.RunComputeMultiMethod(this, doNormalize, ref renderTextures, maskBuffer, groupResult.rtDisplay);
  62. }
  63. rtDisplay = rtPreview;
  64. }
  65. else rtDisplay = groupResult.rtDisplay;
  66. return computed;
  67. }
  68. public void ResetPlaced()
  69. {
  70. groupResult.ResetPlaced();
  71. }
  72. public int CalcPlaced()
  73. {
  74. placed = groupResult.CalcPlaced();
  75. return placed;
  76. }
  77. public void LinkClone(TC_LayerGroup layerGroupS)
  78. {
  79. preview = layerGroupS.preview;
  80. maskNodeGroup.LinkClone(layerGroupS.maskNodeGroup);
  81. groupResult.LinkClone(layerGroupS.groupResult);
  82. }
  83. public override void SetLockChildrenPosition(bool lockPos)
  84. {
  85. lockPosParent = lockPos;
  86. groupResult.SetLockChildrenPosition(lockPosParent || lockPosChildren);
  87. maskNodeGroup.SetLockChildrenPosition(lockPosParent || lockPosChildren);
  88. }
  89. public override void UpdateTransforms()
  90. {
  91. ct.Copy(this);
  92. groupResult.UpdateTransforms();
  93. }
  94. public override void SetFirstLoad(bool active)
  95. {
  96. base.SetFirstLoad(active);
  97. maskNodeGroup.SetFirstLoad(active);
  98. groupResult.SetFirstLoad(active);
  99. }
  100. public void ResetObjects()
  101. {
  102. groupResult.ResetObjects();
  103. }
  104. public override void GetItems(bool refresh, bool rebuildGlobalLists, bool resetTextures)
  105. {
  106. bool newBounds = true;
  107. active = visible;
  108. if (resetTextures) DisposeTextures();
  109. maskNodeGroup = GetGroup<TC_NodeGroup>(0, refresh, resetTextures);
  110. if (maskNodeGroup == null) active = false;
  111. else
  112. {
  113. maskNodeGroup.type = NodeGroupType.Mask;
  114. if (maskNodeGroup.active)
  115. {
  116. if (newBounds) bounds = maskNodeGroup.bounds;
  117. else bounds.Encapsulate(maskNodeGroup.bounds);
  118. }
  119. }
  120. if (t.childCount <= 1) active = false;
  121. else
  122. {
  123. Transform child = t.GetChild(1);
  124. groupResult = child.GetComponent<TC_LayerGroupResult>();
  125. if (groupResult == null)
  126. {
  127. TC.MoveToDustbin(child);
  128. active = false;
  129. }
  130. else
  131. {
  132. groupResult.SetParameters(this, 1);
  133. groupResult.GetItems(refresh, rebuildGlobalLists, resetTextures);
  134. if (!groupResult.active) active = false;
  135. }
  136. }
  137. }
  138. public override void ChangeYPosition(float y)
  139. {
  140. if (groupResult != null) groupResult.ChangeYPosition(y);
  141. }
  142. public override bool ContainsCollisionNode()
  143. {
  144. if (groupResult != null) return groupResult.ContainsCollisionNode();
  145. return false;
  146. }
  147. public int ExecuteCommand(string[] arg)
  148. {
  149. if (arg == null) return -1;
  150. if (arg.Length == 0) return -1;
  151. int returnValue = -1;
  152. if (arg[0] == "LayerGroup" || arg[0] == "All")
  153. {
  154. }
  155. if (arg[0] != "LayerGroup")
  156. {
  157. if (arg.Length <= 1) return -1;
  158. if (groupResult != null) returnValue = groupResult.ExecuteCommand(arg);
  159. }
  160. return returnValue;
  161. }
  162. }
  163. }