TC_LayerGroupResult.cs 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452
  1. using UnityEngine;
  2. using System.Collections;
  3. using System.Collections.Generic;
  4. using System;
  5. namespace TerrainComposer2
  6. {
  7. public class TC_LayerGroupResult : TC_GroupBehaviour
  8. {
  9. // [NonSerialized]
  10. public List<TC_ItemBehaviour> itemList = new List<TC_ItemBehaviour>();
  11. public float seed = 0;
  12. // Compute height, trees and objects
  13. public ComputeBuffer ComputeSingle(float seedParent, bool first = false)
  14. {
  15. TC_Compute compute = TC_Compute.instance;
  16. ComputeBuffer totalBuffer = null;
  17. ComputeBuffer layerBuffer = null;
  18. ComputeBuffer layerMaskBuffer = null;
  19. RenderTexture[] rtsPreview = null;
  20. RenderTexture rtRightPreview = null;
  21. RenderTexture rtLeftPreview = null;
  22. if (outputId != TC.heightOutput) rtsPreview = new RenderTexture[2];
  23. SetPreviewTextureBefore();
  24. int even = 0;
  25. float seedTotal = seed + seedParent;
  26. for (int i = 0; i < itemList.Count; i++)
  27. {
  28. TC_Layer layer = itemList[i] as TC_Layer;
  29. if (layer != null)
  30. {
  31. if (!layer.active) { TC_Reporter.Log("Inactive layer " + i); continue; }
  32. if (totalBuffer == null)
  33. {
  34. if (outputId == TC.heightOutput) layer.ComputeHeight(ref totalBuffer, ref layerMaskBuffer, seedTotal, i == firstActive);
  35. else
  36. {
  37. layer.ComputeItem(ref totalBuffer, ref layerMaskBuffer, seedTotal, i == firstActive);
  38. if (totalBuffer != null) rtLeftPreview = layer.rtDisplay;
  39. }
  40. compute.DisposeBuffer(ref layerMaskBuffer);
  41. }
  42. else
  43. {
  44. if (outputId == TC.heightOutput) layer.ComputeHeight(ref layerBuffer, ref layerMaskBuffer, seedTotal);
  45. else layer.ComputeItem(ref layerBuffer, ref layerMaskBuffer, seedTotal);
  46. if (layerBuffer != null)
  47. {
  48. if (outputId == TC.heightOutput) compute.RunComputeMethod(this, layer, totalBuffer, ref layerBuffer, totalActive, i == lastActive ? rtPreview : null, layerMaskBuffer);
  49. else
  50. {
  51. rtRightPreview = layer.rtDisplay;
  52. compute.RunComputeObjectMethod(this, layer, totalBuffer, ref layerBuffer, layerMaskBuffer, rtPreview, ref rtsPreview[even++ % 2], ref rtLeftPreview, rtRightPreview);
  53. }
  54. }
  55. compute.DisposeBuffer(ref layerMaskBuffer);
  56. }
  57. }
  58. else
  59. {
  60. TC_LayerGroup layerGroup = itemList[i] as TC_LayerGroup;
  61. if (layerGroup == null) continue;
  62. if (!layerGroup.active) continue;
  63. if (totalBuffer == null)
  64. {
  65. layerMaskBuffer = layerGroup.ComputeSingle(ref totalBuffer, seedTotal, i == firstActive);
  66. if (totalBuffer != null) rtLeftPreview = layerGroup.rtDisplay;
  67. compute.DisposeBuffer(ref layerMaskBuffer);
  68. }
  69. else
  70. {
  71. layerMaskBuffer = layerGroup.ComputeSingle(ref layerBuffer, seedTotal);
  72. if (layerBuffer != null)
  73. {
  74. if (outputId == TC.heightOutput) compute.RunComputeMethod(this, layerGroup, totalBuffer, ref layerBuffer, totalActive, i == lastActive ? rtPreview : null, layerMaskBuffer);
  75. else
  76. {
  77. rtRightPreview = layerGroup.rtDisplay;
  78. compute.RunComputeObjectMethod(this, layerGroup, totalBuffer, ref layerBuffer, layerMaskBuffer, rtPreview, ref rtsPreview[even++ % 2], ref rtLeftPreview, rtRightPreview);
  79. }
  80. }
  81. compute.DisposeBuffer(ref layerMaskBuffer);
  82. }
  83. }
  84. }
  85. SetPreviewTextureAfter();
  86. if (outputId != TC.heightOutput) TC_Compute.DisposeRenderTextures(ref rtsPreview);
  87. compute.DisposeBuffer(ref layerMaskBuffer);
  88. if (totalBuffer == null) TC_Reporter.Log("Layer buffer null");
  89. return totalBuffer;
  90. }
  91. public bool ComputeMulti(ref RenderTexture[] renderTextures, float seedParent, bool doNormalize, bool first = false)
  92. {
  93. TC_Compute compute = TC_Compute.instance;
  94. RenderTexture[] rtsLayer = null;
  95. RenderTexture rtRightPreview = null;
  96. RenderTexture rtLeftPreview = null;
  97. RenderTexture[] rtsPreview = null;
  98. // RenderTexture rtPreview2 = null;
  99. ComputeBuffer layerMaskBuffer = null;
  100. TC_LayerGroup layerGroup;
  101. TC_Layer layer;
  102. bool firstCompute = false;
  103. bool lastCompute = false;
  104. int even = 0;
  105. rtsPreview = new RenderTexture[2];
  106. SetPreviewTextureBefore();
  107. float seedTotal = seed + seedParent;
  108. for (int i = 0; i < itemList.Count; i++)
  109. {
  110. layer = itemList[i] as TC_Layer;
  111. if (layer != null)
  112. {
  113. if (!layer.active) continue;
  114. // InitPreview(ref layer.previewRenderTex);
  115. if (!firstCompute)
  116. {
  117. firstCompute = layer.ComputeMulti(ref renderTextures, ref layerMaskBuffer, seedTotal, i == firstActive);
  118. if (firstCompute)
  119. {
  120. rtLeftPreview = layer.rtDisplay;
  121. TC_Reporter.Log("firt compute " + layer.maskNodeGroup.totalActive);
  122. compute.DisposeBuffer(ref layerMaskBuffer);
  123. }
  124. }
  125. else
  126. {
  127. TC_Compute.InitRenderTextures(ref rtsLayer, "rtsLayer", renderTextures.Length);
  128. lastCompute = layer.ComputeMulti(ref rtsLayer, ref layerMaskBuffer, seedTotal);
  129. if (lastCompute)
  130. {
  131. TC_Reporter.Log("Run layer method multi");
  132. rtRightPreview = (layer.method == Method.Lerp) ? layer.selectNodeGroup.rtColorPreview : layer.rtDisplay;
  133. // Debug.Log(rtRight.name+ " "+ (layer.maskNodeGroup.activeTotal == 0 || layer.method == Method.Lerp));
  134. if (outputId == TC.colorOutput) compute.RunComputeColorMethod(layer, layer.method, ref renderTextures[0], ref rtsLayer[0], layerMaskBuffer, rtPreview, ref rtsPreview[even++ % 2], ref rtLeftPreview, rtRightPreview);
  135. else compute.RunComputeMultiMethod(layer, layer.method, i == lastActive && doNormalize, ref renderTextures, ref rtsLayer, layerMaskBuffer, rtPreview, ref rtsPreview[even++ % 2], ref rtLeftPreview, rtRightPreview);
  136. compute.DisposeBuffer(ref layerMaskBuffer);
  137. }
  138. }
  139. }
  140. else
  141. {
  142. layerGroup = itemList[i] as TC_LayerGroup;
  143. if (layerGroup == null) continue;
  144. if (!layerGroup.active) continue;
  145. if (!firstCompute)
  146. {
  147. firstCompute = layerGroup.ComputeMulti(ref renderTextures, ref layerMaskBuffer, seedTotal, i == firstActive);
  148. if (firstCompute)
  149. {
  150. rtLeftPreview = layerGroup.rtDisplay;
  151. compute.DisposeBuffer(ref layerMaskBuffer);
  152. TC_Reporter.Log("LayerGroup did first compute");
  153. }
  154. }
  155. else
  156. {
  157. TC_Compute.InitRenderTextures(ref rtsLayer, "rtsLayer", renderTextures.Length);
  158. lastCompute = layerGroup.ComputeMulti(ref rtsLayer, ref layerMaskBuffer, seedTotal);
  159. if (lastCompute)
  160. {
  161. // if (layerGroup.groupResult.activeTotal == 1) rtRight = layerGroup.rtDisplay; else rtRight = layerGroup.rtPreview;
  162. rtRightPreview = (layerGroup.method == Method.Lerp) ? layerGroup.groupResult.rtDisplay : layerGroup.rtDisplay;
  163. if (outputId == TC.colorOutput) compute.RunComputeColorMethod(layerGroup, layerGroup.method, ref renderTextures[0], ref rtsLayer[0], layerMaskBuffer, rtPreview, ref rtsPreview[even++ % 2], ref rtLeftPreview, rtRightPreview);
  164. else compute.RunComputeMultiMethod(layerGroup, layerGroup.method, i == lastActive && doNormalize, ref renderTextures, ref rtsLayer, layerMaskBuffer, rtPreview, ref rtsPreview[even++ % 2], ref rtLeftPreview, rtRightPreview);
  165. compute.DisposeBuffer(ref layerMaskBuffer);
  166. }
  167. }
  168. }
  169. }
  170. SetPreviewTextureAfter();
  171. if (layerMaskBuffer != null) { compute.DisposeBuffer(ref layerMaskBuffer); TC_Reporter.Log("Dispose layerMaskBuffer"); }
  172. TC_Compute.DisposeRenderTextures(ref rtsPreview);
  173. TC_Compute.DisposeRenderTextures(ref rtsLayer);
  174. return firstCompute;
  175. }
  176. public void SetPreviewTextureBefore()
  177. {
  178. // Debug.Log("no " + maskNodeGroup.itemList.Count + " " + itemList.Count);
  179. if (totalActive == 0)
  180. {
  181. active = false;
  182. rtDisplay = null;
  183. TC_Compute.DisposeRenderTexture(ref rtPreview);
  184. }
  185. else if (totalActive != 1)
  186. {
  187. TC_Compute.InitPreviewRenderTexture(ref rtPreview, "rtGroupResult");
  188. rtDisplay = rtPreview;
  189. }
  190. }
  191. public void SetPreviewTextureAfter()
  192. {
  193. if (totalActive == 1)
  194. {
  195. TC_Compute.DisposeRenderTexture(ref rtPreview);
  196. rtDisplay = itemList[firstActive].rtDisplay;
  197. }
  198. }
  199. public void LinkClone(TC_LayerGroupResult resultLayerGroupS)
  200. {
  201. preview = resultLayerGroupS.preview;
  202. for (int i = 0; i < itemList.Count; i++)
  203. {
  204. TC_Layer layer = itemList[i] as TC_Layer;
  205. if (layer != null)
  206. {
  207. TC_Layer layerS = resultLayerGroupS.itemList[i] as TC_Layer;
  208. layer.LinkClone(layerS);
  209. }
  210. else
  211. {
  212. TC_LayerGroup layerGroup = itemList[i] as TC_LayerGroup;
  213. if (layerGroup != null)
  214. {
  215. TC_LayerGroup layerGroupS = resultLayerGroupS.itemList[i] as TC_LayerGroup;
  216. layerGroup.LinkClone(layerGroupS);
  217. }
  218. }
  219. }
  220. }
  221. public void ResetPlaced()
  222. {
  223. for (int i = 0; i < itemList.Count; i++)
  224. {
  225. TC_Layer layer = itemList[i] as TC_Layer;
  226. if (layer != null) layer.ResetPlaced();
  227. else
  228. {
  229. TC_LayerGroup layerGroup = itemList[i] as TC_LayerGroup;
  230. if (layerGroup != null) layerGroup.ResetPlaced();
  231. }
  232. }
  233. }
  234. public int CalcPlaced()
  235. {
  236. int placed = 0;
  237. for (int i = 0; i < itemList.Count; i++)
  238. {
  239. TC_Layer layer = itemList[i] as TC_Layer;
  240. if (layer != null) placed += layer.CalcPlaced();
  241. else
  242. {
  243. TC_LayerGroup layerGroup = itemList[i] as TC_LayerGroup;
  244. if (layerGroup != null) placed += layerGroup.CalcPlaced();
  245. }
  246. }
  247. return placed;
  248. }
  249. public override void SetLockChildrenPosition(bool lockPos)
  250. {
  251. lockPosParent = lockPos;
  252. for (int i = 0; i < itemList.Count; i++) itemList[i].SetLockChildrenPosition(lockPosParent || lockPosChildren);
  253. }
  254. public override void UpdateTransforms()
  255. {
  256. // ct.CopySpecial(this);
  257. for (int i = 0; i < itemList.Count; i++) itemList[i].UpdateTransforms();
  258. }
  259. public override void ChangeYPosition(float y)
  260. {
  261. for (int i = 0; i < itemList.Count; i++) itemList[i].ChangeYPosition(y);
  262. }
  263. public override void SetFirstLoad(bool active)
  264. {
  265. base.SetFirstLoad(active);
  266. for (int i = 0; i < itemList.Count; i++) itemList[i].SetFirstLoad(active);
  267. }
  268. public override bool ContainsCollisionNode()
  269. {
  270. bool returnValue = false;
  271. for (int i = 0; i < itemList.Count; i++)
  272. {
  273. returnValue = itemList[i].ContainsCollisionNode();
  274. if (returnValue) return true;
  275. }
  276. return false;
  277. }
  278. public void ResetObjects()
  279. {
  280. for (int i = 0; i < itemList.Count; i++)
  281. {
  282. TC_Layer layer = itemList[i] as TC_Layer;
  283. if (layer != null) layer.ResetObjects();
  284. else
  285. {
  286. TC_LayerGroup layerGroup = itemList[i] as TC_LayerGroup;
  287. if (layerGroup != null) layerGroup.ResetObjects();
  288. }
  289. }
  290. }
  291. public override void GetItems(bool refresh, bool rebuildGlobalLists, bool resetTextures)
  292. {
  293. if (resetTextures) DisposeTextures();
  294. active = visible;
  295. itemList.Clear();
  296. firstActive = lastActive = -1;
  297. totalActive = 0;
  298. bool newBounds = true;
  299. int listIndex = 0;
  300. // Debug.Log(name + " GetItems");
  301. for (int i = t.childCount - 1; i >= 0; i--)
  302. {
  303. Transform child = transform.GetChild(i);
  304. TC_Layer layer = child.GetComponent<TC_Layer>();
  305. if (layer != null)
  306. {
  307. layer.SetParameters(this, listIndex);
  308. layer.GetItems(refresh, rebuildGlobalLists, resetTextures);
  309. if (layer.active)
  310. {
  311. ++totalActive;
  312. lastActive = listIndex;
  313. if (firstActive == -1) firstActive = lastActive;
  314. }
  315. itemList.Add(layer);
  316. ++listIndex;
  317. if (newBounds) { bounds = layer.bounds; newBounds = false; }
  318. else bounds.Encapsulate(layer.bounds);
  319. }
  320. else
  321. {
  322. TC_LayerGroup layerGroup = child.GetComponent<TC_LayerGroup>();
  323. if (layerGroup == null) TC.MoveToDustbin(child);
  324. else
  325. {
  326. layerGroup.SetParameters(this, listIndex);
  327. layerGroup.GetItems(refresh, rebuildGlobalLists, resetTextures);
  328. if (layerGroup.active)
  329. {
  330. ++totalActive;
  331. lastActive = listIndex;
  332. if (firstActive == -1) firstActive = lastActive;
  333. }
  334. if (layerGroup.groupResult == null) TC.MoveToDustbin(child);
  335. else
  336. {
  337. itemList.Add(layerGroup);
  338. listIndex++;
  339. }
  340. if (newBounds) { bounds = layerGroup.bounds; newBounds = false; }
  341. else bounds.Encapsulate(layerGroup.bounds);
  342. }
  343. }
  344. }
  345. TC_Reporter.Log(TC.outputNames[outputId] + " Level " + level + " activeTotal " + totalActive);
  346. if (!active) totalActive = 0;
  347. else if (totalActive == 0) active = false;
  348. }
  349. public int ExecuteCommand(string[] arg)
  350. {
  351. if (arg == null) return -1;
  352. if (arg.Length == 0) return -1;
  353. int returnValue = -1;
  354. if (arg[0] == "ResultGroup" || arg[0] == "All")
  355. {
  356. }
  357. if (arg[0] != "ResultGroup")
  358. {
  359. if (arg.Length <= 1) return -1;
  360. for (int i = 0; i < itemList.Count; i++)
  361. {
  362. // if (itemList[i].layer != null) returnValue = Mathf.Max(returnValue, itemList[i].layer.ExecuteCommand(arg));
  363. // else if (itemList[i].layerGroup != null) returnValue = Mathf.Max(returnValue, itemList[i].layerGroup.ExecuteCommand(arg));
  364. }
  365. }
  366. return returnValue;
  367. }
  368. }
  369. }