TC_Layer.cs 9.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257
  1. using UnityEngine;
  2. using System;
  3. using System.Collections;
  4. using System.Collections.Generic;
  5. namespace TerrainComposer2
  6. {
  7. public class TC_Layer : TC_ItemBehaviour
  8. {
  9. [NonSerialized] public TC_SelectItemGroup selectItemGroup;
  10. [NonSerialized] public TC_NodeGroup maskNodeGroup;
  11. [NonSerialized] public TC_NodeGroup selectNodeGroup;
  12. // public new TC_LayerGroupResult parentItem;
  13. public List<TC_SelectItem.DistanceRule> distanceRules;
  14. public bool doNormalize;
  15. public float placeLimit = 0.5f;
  16. public float selectValue;
  17. public float maskValue;
  18. public float seed = 0;
  19. public int placed;
  20. float splatTotal;
  21. float x, y;
  22. // Compute Heightm
  23. public void ComputeHeight(ref ComputeBuffer layerBuffer, ref ComputeBuffer maskBuffer, float seedParent, bool first = false)
  24. {
  25. TC_Compute compute = TC_Compute.instance;
  26. float seedTotal = seed + seedParent;
  27. layerBuffer = selectNodeGroup.ComputeValue(seedTotal);
  28. if (layerBuffer != null)
  29. {
  30. if (maskNodeGroup.active) maskBuffer = maskNodeGroup.ComputeValue(seedTotal);
  31. if (maskBuffer != null)
  32. {
  33. if (method != Method.Lerp || first)
  34. {
  35. InitPreviewRenderTexture(true, "rtPreview_Layer_" + TC.outputNames[outputId]);
  36. compute.RunComputeMethod(null, null, layerBuffer, ref maskBuffer, 0, rtPreview);
  37. }
  38. }
  39. else rtDisplay = selectNodeGroup.rtDisplay;
  40. if (isPortalCount > 0) TC_Compute.instance.MakePortalBuffer(this, layerBuffer, method == Method.Lerp ? maskBuffer : null);
  41. }
  42. else TC_Reporter.Log("Layerbuffer " + listIndex + " = null, reporting from layer");
  43. }
  44. // Compute color, splat and grass
  45. public bool ComputeMulti(ref RenderTexture[] renderTextures, ref ComputeBuffer maskBuffer, float seedParent, bool first = false)
  46. {
  47. TC_Compute compute = TC_Compute.instance;
  48. bool didCompute = false;
  49. float seedTotal = seed + seedParent;
  50. ComputeBuffer layerBuffer = selectNodeGroup.ComputeValue(seedTotal);
  51. if (layerBuffer != null)
  52. {
  53. didCompute = true;
  54. TC_Compute.InitPreviewRenderTexture(ref rtPreview, "rtPreview_Layer");
  55. if (maskNodeGroup.active) maskBuffer = maskNodeGroup.ComputeValue(seedTotal);
  56. TC_Compute.InitPreviewRenderTexture(ref selectNodeGroup.rtColorPreview, "rtNodeGroupPreview_" + TC.outputNames[outputId]);
  57. if (outputId == TC.colorOutput)
  58. {
  59. if (selectItemGroup.itemList.Count == 1 && selectItemGroup.itemList[0].texColor != null) compute.RunColorTexCompute(selectNodeGroup, selectItemGroup.itemList[0], ref renderTextures[0], ref layerBuffer);
  60. else compute.RunColorCompute(selectNodeGroup, selectItemGroup, ref renderTextures[0], ref layerBuffer);
  61. }
  62. else compute.RunSplatCompute(selectNodeGroup, selectItemGroup, ref renderTextures, ref layerBuffer);
  63. compute.DisposeBuffer(ref layerBuffer);
  64. if (maskBuffer != null)
  65. {
  66. TC_Reporter.Log("Run layer select * mask");
  67. if (method != Method.Lerp || first)
  68. {
  69. if (outputId == TC.colorOutput) compute.RunComputeColorMethod(this, ref renderTextures[0], maskBuffer, rtPreview);
  70. else compute.RunComputeMultiMethod(this, doNormalize, ref renderTextures, maskBuffer, rtPreview);
  71. }
  72. rtDisplay = rtPreview;
  73. }
  74. else
  75. {
  76. TC_Reporter.Log("No mask buffer assign colorPreviewTex to layer");
  77. rtDisplay = selectNodeGroup.rtColorPreview;
  78. }
  79. }
  80. return didCompute;
  81. }
  82. // Compute trees and objects
  83. public bool ComputeItem(ref ComputeBuffer itemMapBuffer, ref ComputeBuffer maskBuffer, float seedParent, bool first = false)
  84. {
  85. TC_Compute compute = TC_Compute.instance;
  86. bool didCompute = false;
  87. float seedTotal = seed + seedParent;
  88. ComputeBuffer selectBuffer = selectNodeGroup.ComputeValue(seedTotal);
  89. if (selectBuffer != null)
  90. {
  91. didCompute = true;
  92. TC_Compute.InitPreviewRenderTexture(ref rtPreview, "rtPreview_Layer_" + TC.outputNames[outputId]);
  93. rtDisplay = rtPreview;
  94. TC_Compute.InitPreviewRenderTexture(ref selectNodeGroup.rtColorPreview, "rtColorPreview");
  95. compute.RunItemCompute(this, ref itemMapBuffer, ref selectBuffer);
  96. compute.DisposeBuffer(ref selectBuffer);
  97. // compute.shader.SetBuffer(compute.terrainSplatmap0Kernel, "itemMapBuffer", itemMapBuffer);
  98. // compute.RunItemPositionCompute(itemMapBuffer, TC.treeOutput);
  99. if (maskNodeGroup.active) maskBuffer = maskNodeGroup.ComputeValue(seedTotal);
  100. if (maskBuffer != null)
  101. {
  102. TC_Reporter.Log("Run layer select * mask");
  103. if (method != Method.Lerp || first)
  104. {
  105. compute.RunItemComputeMask(this, ref rtPreview, selectNodeGroup.rtColorPreview, ref itemMapBuffer, ref maskBuffer);
  106. }
  107. }
  108. }
  109. return didCompute;
  110. }
  111. public void LinkClone(TC_Layer layerS)
  112. {
  113. preview = layerS.preview;
  114. maskNodeGroup.LinkClone(layerS.maskNodeGroup);
  115. selectNodeGroup.LinkClone(layerS.selectNodeGroup);
  116. }
  117. public void ResetPlaced()
  118. {
  119. selectItemGroup.ResetPlaced();
  120. }
  121. public int CalcPlaced()
  122. {
  123. placed = selectItemGroup.CalcPlaced();
  124. return placed;
  125. }
  126. public void ResetObjects()
  127. {
  128. selectItemGroup.ResetObjects();
  129. }
  130. public override void GetItems(bool refresh, bool rebuildGlobalLists, bool resetTextures)
  131. {
  132. if (resetTextures) DisposeTextures();
  133. active = visible;
  134. // Init();
  135. // InitPreview(ref rtPreview);
  136. bool newBounds = true;
  137. maskNodeGroup = GetGroup<TC_NodeGroup>(0, refresh, resetTextures);
  138. if (maskNodeGroup != null)
  139. {
  140. maskNodeGroup.type = NodeGroupType.Mask;
  141. if (maskNodeGroup.totalActive > 0)
  142. {
  143. bounds = maskNodeGroup.bounds;
  144. newBounds = false;
  145. }
  146. }
  147. selectNodeGroup = GetGroup<TC_NodeGroup>(1, refresh, resetTextures);
  148. if (selectNodeGroup != null)
  149. {
  150. selectNodeGroup.type = NodeGroupType.Select;
  151. if (selectNodeGroup.totalActive == 0) { TC_Reporter.Log("SelectNodeGroup 0 active"); active = false; }
  152. else
  153. {
  154. if (newBounds) bounds = selectNodeGroup.bounds;
  155. else bounds.Encapsulate(selectNodeGroup.bounds);
  156. }
  157. }
  158. else active = false;
  159. if (outputId != TC.heightOutput)
  160. {
  161. selectItemGroup = GetGroup<TC_SelectItemGroup>(2, refresh, resetTextures);
  162. if (selectItemGroup != null)
  163. {
  164. if (selectItemGroup.totalActive == 0) { TC_Reporter.Log("itemGroup 0 active"); active = false; }
  165. else if (selectItemGroup.itemList.Count <= 1)
  166. {
  167. // TODO: Make better solution for this
  168. selectNodeGroup.useConstant = true;
  169. if (selectNodeGroup.itemList.Count > 0)
  170. {
  171. selectNodeGroup.itemList[0].visible = true;
  172. active = visible;
  173. GetGroup<TC_NodeGroup>(1, true, resetTextures);
  174. }
  175. }
  176. else selectNodeGroup.useConstant = false;
  177. }
  178. else active = false;
  179. }
  180. }
  181. public override void SetLockChildrenPosition(bool lockPos)
  182. {
  183. // Debug.Log("lockPos " + lockPos);
  184. lockPosParent = lockPos;
  185. // Debug.Log("lockPosParent " + lockPosParent);
  186. if (maskNodeGroup != null) maskNodeGroup.SetLockChildrenPosition(lockPosParent || lockPosChildren);
  187. if (selectNodeGroup != null) selectNodeGroup.SetLockChildrenPosition(lockPosParent || lockPosChildren);
  188. }
  189. public override void UpdateTransforms()
  190. {
  191. // ct.CopySpecial(this);
  192. maskNodeGroup.UpdateTransforms();
  193. selectNodeGroup.UpdateTransforms();
  194. }
  195. public override void ChangeYPosition(float y) { selectNodeGroup.ChangeYPosition(y); }
  196. public override void SetFirstLoad(bool active)
  197. {
  198. base.SetFirstLoad(active);
  199. maskNodeGroup.SetFirstLoad(active);
  200. selectNodeGroup.SetFirstLoad(active);
  201. selectItemGroup.SetFirstLoad(active);
  202. }
  203. public override bool ContainsCollisionNode()
  204. {
  205. if (selectNodeGroup.ContainsCollisionNode()) return true;
  206. if (maskNodeGroup.ContainsCollisionNode()) return true;
  207. return false;
  208. }
  209. }
  210. }