TC_Compute.cs 80 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749
  1. using UnityEngine;
  2. using System.Collections;
  3. using System.Collections.Generic;
  4. using System.IO;
  5. using System;
  6. namespace TerrainComposer2
  7. {
  8. [ExecuteInEditMode]
  9. public class TC_Compute : MonoBehaviour
  10. {
  11. static public TC_Compute instance;
  12. public TC_CamCapture camCapture;
  13. public Transform target;
  14. public bool run;
  15. public ComputeShader shader;
  16. public string path;
  17. [NonSerialized] public float threads = 512;
  18. public int collisionMask;
  19. public PerlinNoise m_perlin;
  20. // List<TC_ItemBehaviour> portalList = new List<TC_ItemBehaviour>();
  21. int copyComputeBufferToRenderTextureKernel, CopyComputeMaskBufferToRenderTextureKernel;
  22. int[] methodKernel, methodTexKernel, colorMethodTexKernel, multiMethodTexKernel; // multiMethodKernel
  23. int[] noisePerlinKernel, noiseBillowKernel, noiserRidgedKernel;
  24. int[] noisePerlin2Kernel, noiseBillow2Kernel, noiseRidged2Kernel, noiseIQKernel, noiseSwissKernel, noiseJordanKernel;
  25. int[] calcSplatKernel, normalizeSplatKernel;
  26. int noiseRandomKernel, noiseCellNormalKernel, noiseCellFastKernel;
  27. int colorMethodMultiplyBufferKernel, colorMethodTexLerpMaskKernel;
  28. int multiMethodMultiplyBufferKernel;
  29. public int terrainHeightKernel, terrainAngleKernel, terrainSplatmap0Kernel, terrainSplatmap1Kernel, terrainConvexityKernel;
  30. public int terrainCollisionHeightKernel, terrainCollisionHeightIncludeKernel, terrainCollisionMaskKernel;
  31. int methodLerpMaskKernel, methodTexLerpMaskKernel, multiMethodTexLerpMaskKernel;
  32. int shapeGradientKernel, shapeCircleKernel, shapeSquareKernel, shapeConstantKernel;
  33. int rawImageKernel, imageColorKernel, imageColorRangeKernel;
  34. int currentBlurNormalKernel, currentBlurOutwardKernel, currentBlurInwardKernel, currentExpandKernel, currentShrinkKernel, currentEdgeDetectKernel, currentDistortionKernel;
  35. int calcColorKernel, calcColorTexKernel;
  36. int calcObjectKernel, methodItemTexMaskKernel, methodItemTex0MaskKernel, calcObjectPositionKernel;
  37. int terrainTexKernel, resultBufferToTexKernel;
  38. int portalKernel, copyRenderTextureKernel;
  39. int methodItemTexMaxKernel, methodItemTexMinKernel, methodItemTexLerpKernel, methodItemTexLerpMaskKernel;
  40. Vector3 posOld, scaleOld;
  41. Quaternion rotOld;
  42. float bufferLength;
  43. public RenderTexture[] rtsColor;
  44. public RenderTexture[] rtsSplatmap;
  45. public RenderTexture[] rtsResult;
  46. public RenderTexture rtResult;
  47. public RenderTexture rtSplatPreview;
  48. public Texture2D[] texGrassmaps;
  49. public Vector4[] splatColors;
  50. public Vector4[] colors;
  51. [NonSerialized] public BytesArray[] bytesArray;
  52. // TODO: Only set shader parameters that really need to be set and aren't set already
  53. void OnEnable()
  54. {
  55. instance = this;
  56. methodKernel = new int[9];
  57. methodTexKernel = new int[9];
  58. colorMethodTexKernel = new int[9];
  59. // multiMethodKernel = new int[9];
  60. multiMethodTexKernel = new int[9];
  61. noisePerlinKernel = new int[12];
  62. noiseBillowKernel = new int[12];
  63. noiserRidgedKernel = new int[12];
  64. noisePerlin2Kernel = new int[3];
  65. noiseBillow2Kernel = new int[3];
  66. noiseRidged2Kernel = new int[3];
  67. noiseIQKernel = new int[3];
  68. noiseSwissKernel = new int[3];
  69. noiseJordanKernel = new int[3];
  70. calcSplatKernel = new int[4];
  71. normalizeSplatKernel = new int[4];
  72. TC_Reporter.Log("Init compute");
  73. TC_Reporter.Log(methodKernel.Length + " - " + methodTexKernel.Length);
  74. string method;
  75. for (int i = 0; i < 9; i++)
  76. {
  77. method = ((Method)i).ToString();
  78. methodKernel[i] = shader.FindKernel("Method" + method);
  79. methodTexKernel[i] = shader.FindKernel("MethodTex" + method);
  80. // multiMethodKernel[i] = shader.FindKernel("MultiMethod" + method);
  81. multiMethodTexKernel[i] = shader.FindKernel("MultiMethodTex" + method);
  82. colorMethodTexKernel[i] = shader.FindKernel("ColorMethodTex" + method);
  83. // Reporter.Log(methodKernel[i] + ", " + methodTexKernel[i]+ " "+((Method)i).ToString());
  84. // TC_Reporter.Log(multiMethodKernel[i] + ", " + multiMethodTexKernel[i] + " " + ((Method)i).ToString());
  85. // Debug.Log(colorMethodTexKernel[i]);
  86. }
  87. // Debug.Log(noiseBillowKernel.Length);
  88. for (int i = 1; i < noisePerlinKernel.Length + 1; i++) noisePerlinKernel[i - 1] = shader.FindKernel("NoisePerlin" + i.ToString());
  89. for (int i = 1; i < noiseBillowKernel.Length + 1; i++) noiseBillowKernel[i - 1] = shader.FindKernel("NoiseBillow" + i.ToString());
  90. for (int i = 1; i < noiserRidgedKernel.Length + 1; i++) noiserRidgedKernel[i - 1] = shader.FindKernel("NoiseMultiFractal" + i.ToString());
  91. for (int i = 0; i < 3; i++)
  92. {
  93. noisePerlin2Kernel[i] = shader.FindKernel("NoisePerlin" + Enum.GetName(typeof(NoiseMode), i + 1));
  94. noiseBillow2Kernel[i] = shader.FindKernel("NoiseBillow" + Enum.GetName(typeof(NoiseMode), i + 1));
  95. noiseRidged2Kernel[i] = shader.FindKernel("NoiseRidged" + Enum.GetName(typeof(NoiseMode), i + 1));
  96. noiseIQKernel[i] = shader.FindKernel("NoiseIQ" + Enum.GetName(typeof(NoiseMode), i + 1));
  97. noiseSwissKernel[i] = shader.FindKernel("NoiseSwiss" + Enum.GetName(typeof(NoiseMode), i + 1));
  98. noiseJordanKernel[i] = shader.FindKernel("NoiseJordan" + Enum.GetName(typeof(NoiseMode), i + 1));
  99. }
  100. for (int i = 0; i < 4; i++)
  101. {
  102. int index = (i + 1) * 4;
  103. calcSplatKernel[i] = shader.FindKernel("CalcSplat" + index.ToString());
  104. normalizeSplatKernel[i] = shader.FindKernel("NormalizeSplat" + index.ToString());
  105. }
  106. noiseCellNormalKernel = shader.FindKernel("NoiseCellNormal");
  107. noiseCellFastKernel = shader.FindKernel("NoiseCellFast");
  108. colorMethodTexLerpMaskKernel = shader.FindKernel("ColorMethodTexLerpMask");
  109. // Debug.Log("colorMethodTexLerpMaskKernel " + colorMethodTexLerpMaskKernel);
  110. colorMethodMultiplyBufferKernel = shader.FindKernel("ColorMethodMultiplyBuffer");
  111. multiMethodMultiplyBufferKernel = shader.FindKernel("MultiMethodMultiplyBuffer");
  112. terrainHeightKernel = shader.FindKernel("TerrainHeight");
  113. terrainAngleKernel = shader.FindKernel("TerrainAngle");
  114. terrainConvexityKernel = shader.FindKernel("TerrainConvexity");
  115. terrainSplatmap0Kernel = shader.FindKernel("TerrainSplatmap0");
  116. terrainSplatmap1Kernel = shader.FindKernel("TerrainSplatmap1");
  117. #if UNITY_5_0 || UNITY_5_1 || UNITY_5_2 || UNITY_5_3 || UNITY_5_4
  118. terrainCollisionHeightKernel = shader.FindKernel("TerrainCollisionHeight");
  119. terrainCollisionHeightIncludeKernel = shader.FindKernel("TerrainCollisionHeightInclude");
  120. terrainCollisionMaskKernel = shader.FindKernel("TerrainCollisionMask");
  121. #else
  122. terrainCollisionHeightKernel = shader.FindKernel("TerrainCollisionHeightInverted");
  123. terrainCollisionHeightIncludeKernel = shader.FindKernel("TerrainCollisionHeightIncludeInverted");
  124. terrainCollisionMaskKernel = shader.FindKernel("TerrainCollisionMaskInverted");
  125. #endif
  126. noiseRandomKernel = shader.FindKernel("NoiseRandom");
  127. #if UNITY_EDITOR_OSX
  128. rawImageKernel = shader.FindKernel("RawImageOSX");
  129. #else
  130. rawImageKernel = shader.FindKernel("RawImage");
  131. #endif
  132. imageColorKernel = shader.FindKernel("ImageColor");
  133. imageColorRangeKernel = shader.FindKernel("ImageColorRange");
  134. shapeGradientKernel = shader.FindKernel("ShapeGradient");
  135. shapeCircleKernel = shader.FindKernel("ShapeCircle");
  136. shapeSquareKernel = shader.FindKernel("ShapeSquare");
  137. shapeConstantKernel = shader.FindKernel("ShapeConstant");
  138. currentBlurNormalKernel = shader.FindKernel("CurrentBlurNormal");
  139. currentBlurOutwardKernel = shader.FindKernel("CurrentBlurOutward");
  140. currentBlurInwardKernel = shader.FindKernel("CurrentBlurInward");
  141. currentExpandKernel = shader.FindKernel("CurrentExpand");
  142. currentShrinkKernel = shader.FindKernel("CurrentShrink");
  143. currentEdgeDetectKernel = shader.FindKernel("CurrentEdgeDetect");
  144. currentDistortionKernel = shader.FindKernel("CurrentDistortion");
  145. methodLerpMaskKernel = shader.FindKernel("MethodLerpMask");
  146. methodTexLerpMaskKernel = shader.FindKernel("MethodTexLerpMask");
  147. multiMethodTexLerpMaskKernel = shader.FindKernel("MultiMethodTexLerpMask");
  148. calcColorKernel = shader.FindKernel("CalcColor");
  149. calcColorTexKernel = shader.FindKernel("CalcColorTex");
  150. calcObjectKernel = shader.FindKernel("CalcObject");
  151. calcObjectPositionKernel = shader.FindKernel("CalcObjectPosition");
  152. methodItemTexMaskKernel = shader.FindKernel("MethodItemTexMask");
  153. methodItemTex0MaskKernel = shader.FindKernel("MethodItemTex0Mask");
  154. terrainTexKernel = shader.FindKernel("TerrainTex");
  155. resultBufferToTexKernel = shader.FindKernel("ResultBufferToTex");
  156. methodItemTexMaxKernel = shader.FindKernel("MethodItemTexMax");
  157. methodItemTexMinKernel = shader.FindKernel("MethodItemTexMin");
  158. methodItemTexLerpKernel = shader.FindKernel("MethodItemTexLerp");
  159. methodItemTexLerpMaskKernel = shader.FindKernel("MethodItemTexLerpMask");
  160. portalKernel = shader.FindKernel("Portal");
  161. copyRenderTextureKernel = shader.FindKernel("CopyRenderTexture");
  162. copyComputeBufferToRenderTextureKernel = shader.FindKernel("CopyComputeBufferToRenderTexture");
  163. CopyComputeMaskBufferToRenderTextureKernel = shader.FindKernel("CopyComputeMaskBufferToRenderTexture");
  164. // shader.SetTexture(resultBufferToTexKernel, "resultTex", resultTex);
  165. if (TC_Settings.instance == null) return;// Reporter.Log("GM singleton null");
  166. if (TC_Settings.instance.global == null)
  167. {
  168. TC.GetInstallPath();
  169. if (!TC.LoadGlobalSettings()) return;
  170. }
  171. if (TC_Settings.instance.global == null) return;
  172. splatColors = Mathw.ColorsToVector4(TC_Settings.instance.global.previewColors);
  173. TC_Reporter.Log("LerpKernel " + methodLerpMaskKernel + " - " + methodTexLerpMaskKernel);
  174. TC_Reporter.Log(rawImageKernel + " - " + noisePerlinKernel + " - " + shapeConstantKernel);
  175. }
  176. void OnDestroy()
  177. {
  178. instance = null;
  179. DisposeTextures();
  180. }
  181. public void DisposeTextures()
  182. {
  183. DisposeRenderTextures(ref rtsColor);
  184. DisposeRenderTextures(ref rtsSplatmap);
  185. DisposeRenderTextures(ref rtsResult);
  186. DisposeRenderTexture(ref rtResult);
  187. DisposeRenderTexture(ref rtSplatPreview);
  188. DisposeTextures(ref texGrassmaps);
  189. DisposeTexture(ref m_perlin.m_permTable1D);
  190. DisposeTexture(ref m_perlin.m_permTable2D);
  191. DisposeTexture(ref m_perlin.m_gradient2D);
  192. DisposeTexture(ref m_perlin.m_gradient3D);
  193. DisposeTexture(ref m_perlin.m_gradient4D);
  194. }
  195. public void InitCurves(TC_ItemBehaviour item)
  196. {
  197. item.localCurve.ConvertCurve();
  198. item.worldCurve.ConvertCurve();
  199. }
  200. public void SetPreviewColors(Vector4[] colors)
  201. {
  202. // for (int i = 0; i < colors.Length; i++) shader.SetVector("itemColor" + i.ToString(), colors[i]);
  203. }
  204. public void RunColorCompute(TC_NodeGroup nodeGroup, TC_SelectItemGroup itemGroup, ref RenderTexture rt, ref ComputeBuffer resultBuffer)
  205. {
  206. TC_Area2D area2D = TC_Area2D.current;
  207. ComputeBuffer colorMixBuffer = new ComputeBuffer(itemGroup.colorMixBuffer.Length, 28);
  208. colorMixBuffer.SetData(itemGroup.colorMixBuffer);
  209. int kernel = calcColorKernel;
  210. shader.SetInt("itemCount", itemGroup.colorMixBuffer.Length);
  211. shader.SetBuffer(kernel, "resultBuffer", resultBuffer);
  212. shader.SetTexture(kernel, "splatmap0", rt);
  213. shader.SetTexture(kernel, "splatPreviewTex", nodeGroup.rtColorPreview);
  214. shader.SetBuffer(kernel, "colorMixBuffer", colorMixBuffer);
  215. // shader.SetBuffer(kernel, "itemColorBuffer", itemColorBuffer);
  216. shader.SetVector("resolutionPM", area2D.resolutionPM);
  217. shader.SetVector("resToPreview", area2D.resToPreview);
  218. shader.SetInt("resolutionX", area2D.intResolution.x);
  219. shader.SetInt("resolutionY", area2D.intResolution.y);
  220. Int2 resolution = area2D.intResolution;
  221. bufferLength = resolution.x * resolution.y;
  222. if (kernel == -1) { Debug.Log("Kernel not found"); return; }
  223. shader.Dispatch(kernel, Mathf.CeilToInt(bufferLength / threads), 1, 1);
  224. DisposeBuffer(ref resultBuffer);
  225. DisposeBuffer(ref colorMixBuffer);
  226. // DisposeBuffer(ref itemColorBuffer);
  227. }
  228. public void RunColorTexCompute(TC_NodeGroup nodeGroup, TC_SelectItem selectItem, ref RenderTexture rt, ref ComputeBuffer resultBuffer)
  229. {
  230. // Debug.Log("Run Color Tex");
  231. TC_Area2D area2D = TC_Area2D.current;
  232. int kernel = calcColorTexKernel;
  233. selectItem.ct.CopySpecial(selectItem);
  234. // Debug.Log(selectItem.ct.position);
  235. shader.SetInt("isClamp", selectItem.wrapMode == ImageWrapMode.Clamp ? 1 : 0);
  236. shader.SetInt("isMirror", selectItem.wrapMode == ImageWrapMode.Mirror ? 1 : 0);
  237. shader.SetVector("offset", selectItem.ct.position - area2D.startPos);
  238. shader.SetVector("posOffset", selectItem.ct.posOffset);
  239. shader.SetVector("areaPos", area2D.area.position);
  240. shader.SetVector("totalAreaPos", area2D.totalArea.position);
  241. shader.SetVector("rot", new Vector4(selectItem.ct.rotation.x, selectItem.ct.rotation.y, selectItem.ct.rotation.z, selectItem.ct.rotation.w));
  242. shader.SetVector("uvOffset", Vector2.zero);
  243. shader.SetFloat("overlay", selectItem.brightness);
  244. shader.SetFloat("mixValue", selectItem.saturation);
  245. shader.SetVector("colLayer", selectItem.color);
  246. float scaleY = selectItem.ct.scale.y;
  247. shader.SetVector("scale", new Vector3(selectItem.ct.scale.x, scaleY, selectItem.ct.scale.z)); // * (node.size.y / 1000)
  248. shader.SetBuffer(kernel, "resultBuffer", resultBuffer);
  249. shader.SetTexture(kernel, "splatmap0", rt);
  250. shader.SetTexture(kernel, "splatPreviewTex", nodeGroup.rtColorPreview);
  251. InitPreviewRenderTexture(ref selectItem.rtPreview, "Preview");
  252. selectItem.rtDisplay = selectItem.rtPreview;
  253. shader.SetTexture(kernel, "previewTex", selectItem.rtPreview);
  254. if (selectItem.texColor != null) shader.SetTexture(kernel, "leftSplatmap0", selectItem.texColor);
  255. else Debug.Log("No Texture Assigned");
  256. // shader.SetBuffer(kernel, "itemColorBuffer", itemColorBuffer);
  257. shader.SetVector("resolutionPM", area2D.resolutionPM);
  258. shader.SetVector("resToPreview", area2D.resToPreview);
  259. shader.SetInt("resolutionX", area2D.intResolution.x);
  260. shader.SetInt("resolutionY", area2D.intResolution.y);
  261. Int2 resolution = area2D.intResolution;
  262. bufferLength = resolution.x * resolution.y;
  263. if (kernel == -1) { Debug.Log("Kernel not found"); return; }
  264. shader.Dispatch(kernel, Mathf.CeilToInt(bufferLength / threads), 1, 1);
  265. DisposeBuffer(ref resultBuffer);
  266. // DisposeBuffer(ref itemColorBuffer);
  267. }
  268. public void RunSplatCompute(TC_NodeGroup nodeGroup, TC_SelectItemGroup itemGroup, ref RenderTexture[] rts, ref ComputeBuffer resultBuffer)
  269. {
  270. TC_Area2D area2D = TC_Area2D.current;
  271. // ComputeBuffer resultBuffer = RunShader(null, node);
  272. ComputeBuffer splatMixBuffer = new ComputeBuffer(itemGroup.splatMixBuffer.Length, 80);
  273. splatMixBuffer.SetData(itemGroup.splatMixBuffer);
  274. // for (int i = 0; i < itemGroup.splatMixBuffer.Length; i++) Debug.Log(itemGroup.splatMixBuffer[i].map1);
  275. ComputeBuffer itemColorBuffer = new ComputeBuffer(16, 16);
  276. itemColorBuffer.SetData(TC_Settings.instance.global.previewColors);
  277. // itemColorBuffer.SetData(area2D.currentTCUnityTerrain.splatColors);
  278. // Debug.Log(rts.Length - 1);
  279. int kernel = calcSplatKernel[rts.Length - 1];
  280. shader.SetInt("itemCount", itemGroup.splatMixBuffer.Length);
  281. shader.SetBuffer(kernel, "resultBuffer", resultBuffer);
  282. shader.SetTexture(kernel, "splatmap0", rts[0]);
  283. if (rts.Length > 1) shader.SetTexture(kernel, "splatmap1", rts[1]);
  284. if (rts.Length > 2) shader.SetTexture(kernel, "splatmap2", rts[2]);
  285. if (rts.Length > 3) shader.SetTexture(kernel, "splatmap3", rts[3]);
  286. shader.SetTexture(kernel, "splatPreviewTex", nodeGroup.rtColorPreview);
  287. shader.SetBuffer(kernel, "splatMixBuffer", splatMixBuffer);
  288. shader.SetBuffer(kernel, "itemColorBuffer", itemColorBuffer);
  289. shader.SetVector("resolutionPM", area2D.resolutionPM);
  290. shader.SetVector("resToPreview", area2D.resToPreview);
  291. shader.SetInt("resolutionX", area2D.intResolution.x);
  292. shader.SetInt("resolutionY", area2D.intResolution.y);
  293. Int2 resolution = area2D.intResolution;
  294. bufferLength = resolution.x * resolution.y;
  295. if (kernel == -1) { Debug.Log("Kernel not found"); return; }
  296. shader.Dispatch(kernel, Mathf.CeilToInt(bufferLength / threads), 1, 1);
  297. DisposeBuffer(ref resultBuffer);
  298. DisposeBuffer(ref splatMixBuffer);
  299. DisposeBuffer(ref itemColorBuffer);
  300. }
  301. public void RunItemCompute(TC_Layer layer, ref ComputeBuffer itemMapBuffer, ref ComputeBuffer resultBuffer)
  302. {
  303. TC_GlobalSettings global = TC_Settings.instance.global;
  304. TC_Area2D area2D = TC_Area2D.current;
  305. TC_SelectItemGroup itemGroup = layer.selectItemGroup;
  306. TC_NodeGroup nodeGroup = layer.selectNodeGroup;
  307. int kernel = calcObjectKernel;
  308. // Debug.Log(kernel);
  309. if (itemGroup.indices == null) itemGroup.CreateItemMixBuffer();
  310. ComputeBuffer itemIndexBuffer = new ComputeBuffer(itemGroup.indices.Length, 20);
  311. itemIndexBuffer.SetData(itemGroup.indices);
  312. // for (int i = 0; i < itemGroup.indices.Length; i++) Debug.Log(itemGroup.indices[i].randomPosition);
  313. // Debug.Log("****************");
  314. ComputeBuffer itemColorBuffer = new ComputeBuffer(8, 16);
  315. itemColorBuffer.SetData(global.previewColors);
  316. int resolution = area2D.intResolution.x * area2D.intResolution.y;
  317. itemMapBuffer = new ComputeBuffer(resolution, 24);
  318. shader.SetBuffer(kernel, "itemIndexBuffer", itemIndexBuffer);
  319. shader.SetBuffer(kernel, "itemColorBuffer", itemColorBuffer);
  320. shader.SetBuffer(kernel, "resultBuffer", resultBuffer);
  321. shader.SetBuffer(kernel, "itemMapBuffer", itemMapBuffer);
  322. shader.SetTexture(kernel, "splatPreviewTex", nodeGroup.rtColorPreview);
  323. shader.SetTexture(kernel, "previewTex", layer.rtPreview);
  324. shader.SetVector("colLayer", global.GetVisualizeColor(layer.listIndex));
  325. shader.SetInt("itemCount", itemGroup.indices.Length);
  326. shader.SetInt("resolutionX", area2D.intResolution.x);
  327. shader.SetInt("resolutionY", area2D.intResolution.y);
  328. shader.SetFloat("mixValue", itemGroup.mix);
  329. shader.SetVector("resolutionPM", area2D.resolutionPM);
  330. shader.SetVector("resToPreview", area2D.resToPreview);
  331. // shader.SetVector("areaPos", area2D.area.position - area2D.outputOffsetV2);
  332. shader.SetVector("areaPos", area2D.area.position);// - area2D.outputOffsetV2);
  333. shader.SetVector("outputOffsetV2", area2D.outputOffsetV2);
  334. shader.SetVector("totalAreaPos", area2D.totalArea.position);
  335. if (kernel == -1) { Debug.Log("Kernel not found"); return; }
  336. shader.Dispatch(kernel, Mathf.CeilToInt(resolution / threads), 1, 1);
  337. DisposeBuffer(ref itemIndexBuffer);
  338. DisposeBuffer(ref itemColorBuffer);
  339. }
  340. public void RunItemPositionCompute(ComputeBuffer itemMapBuffer, int outputId)
  341. {
  342. TC_Area2D area2D = TC_Area2D.current;
  343. int kernel = calcObjectPositionKernel;
  344. int resolution = area2D.intResolution.x * area2D.intResolution.y;
  345. List<TC_SelectItem> items;
  346. if (outputId == TC.treeOutput) items = area2D.terrainLayer.treeSelectItems;
  347. else items = area2D.terrainLayer.objectSelectItems;
  348. float[] indices = new float[items.Count];
  349. if (outputId == TC.treeOutput) for (int i = 0; i < items.Count; i++) indices[i] = items[i].tree.randomPosition / 2;
  350. else for (int i = 0; i < items.Count; i++) indices[i] = items[i].spawnObject.randomPosition / 2;
  351. ComputeBuffer resultBuffer = new ComputeBuffer(items.Count, 4);
  352. resultBuffer.SetData(indices);
  353. shader.SetBuffer(kernel, "resultBuffer", resultBuffer);
  354. if (area2D.currentTCTerrain.texHeight != null)
  355. {
  356. shader.SetTexture(kernel, "terrainTexRead", area2D.currentTCTerrain.texHeight);
  357. shader.SetFloat("terrainTexReadResolution", area2D.currentTCTerrain.texHeight.width);
  358. shader.SetFloat("terrainTexReadNormalResolution", area2D.currentTCTerrain.texHeight.width - area2D.resExpandBorder * 2);
  359. shader.SetFloat("resExpandBorder", area2D.resExpandBorder);
  360. // Debug.Log("T " + area2D.currentTCTerrain.texHeight.width);
  361. // Debug.Log(area2D.currentTCTerrain.texHeight.width - area2D.resExpandBorder * 2);
  362. }
  363. shader.SetBuffer(kernel, "itemMapBuffer", itemMapBuffer);
  364. shader.SetInt("resolutionX", area2D.intResolution.x);
  365. shader.SetInt("resolutionY", area2D.intResolution.y);
  366. // Debug.Log("ResolutionX " + area2D.intResolution.x);
  367. shader.SetVector("posOffset", Vector3.zero);// target.position);
  368. shader.SetVector("texResolution", new Vector2(TC_Settings.instance.global.defaultTerrainSize.x, TC_Settings.instance.global.defaultTerrainSize.z));
  369. shader.SetVector("resolutionPM", area2D.resolutionPM);
  370. shader.SetVector("resToPreview", area2D.resToPreview);
  371. // shader.SetVector("areaPos", area2D.area.position - area2D.outputOffsetV2);
  372. shader.SetVector("areaPos", area2D.area.position); // - area2D.outputOffsetV2);
  373. shader.SetVector("outputOffsetV2", area2D.outputOffsetV2);
  374. shader.SetVector("totalAreaPos", area2D.totalArea.position);
  375. shader.SetVector("snapOffset", area2D.snapOffsetUV);
  376. shader.SetFloat("terrainHeight", area2D.terrainSize.y);
  377. // Debug.Log(area2D.area.position - area2D.outputOffsetV2);
  378. // Debug.Log("areaPos " + area2D.area.position);
  379. // Debug.Log("totalAreaPos " + area2D.totalArea.position);
  380. // Debug.Log("resolutionPM" + area2D.resolutionPM);
  381. // Debug.Log("pos" + area2D.startPos);
  382. // Debug.Log("scale " + area2D.terrainSize);
  383. if (kernel == -1) { Debug.Log("Kernel not found"); return; }
  384. shader.Dispatch(kernel, Mathf.CeilToInt(resolution / threads), 1, 1);
  385. DisposeBuffer(ref resultBuffer);
  386. }
  387. public void RunComputeCopyRenderTexture(RenderTexture rtSource, RenderTexture rtDest)
  388. {
  389. int kernel = copyRenderTextureKernel;
  390. Int2 resolution = new Int2(rtSource.width, rtSource.height);
  391. shader.SetTexture(kernel, "splatmap1", rtDest);
  392. shader.SetTexture(kernel, "rightSplatmap1", rtSource);
  393. if (kernel == -1) { Debug.Log("Kernel not found"); return; }
  394. shader.Dispatch(kernel, resolution.x / 8, resolution.y / 8, 1);
  395. }
  396. public void RunItemComputeMask(TC_ItemBehaviour item, ref RenderTexture rtPreview, RenderTexture rtColorPreview, ref ComputeBuffer itemMapBuffer, ref ComputeBuffer maskBuffer)
  397. {
  398. TC_Area2D area2D = TC_Area2D.current;
  399. int kernel = item.level == 0 ? methodItemTex0MaskKernel : methodItemTexMaskKernel;
  400. //a Debug.Log("Layer mask kernel " + kernel);
  401. int resolution = area2D.intResolution.x * area2D.intResolution.y;
  402. shader.SetVector("areaPos", area2D.area.position - area2D.outputOffsetV2);
  403. shader.SetInt("resolutionX", area2D.intResolution.x);
  404. shader.SetInt("resolutionY", area2D.intResolution.y);
  405. shader.SetVector("colLayer", TC_Settings.instance.global.GetVisualizeColor(item.listIndex));
  406. shader.SetVector("resolutionPM", area2D.resolutionPM);
  407. shader.SetVector("resToPreview", area2D.resToPreview);
  408. shader.SetVector("areaPos", area2D.area.position); // - area2D.outputOffsetV2);
  409. shader.SetVector("outputOffsetV2", area2D.outputOffsetV2);
  410. shader.SetVector("totalAreaPos", area2D.totalArea.position);
  411. shader.SetTexture(kernel, "leftPreviewTex", rtColorPreview);
  412. shader.SetTexture(kernel, "splatPreviewTex", rtPreview);
  413. shader.SetBuffer(kernel, "itemMapBuffer", itemMapBuffer);
  414. shader.SetBuffer(kernel, "maskBuffer", maskBuffer);
  415. if (kernel == -1) { Debug.Log("Kernel not found RunItemComputeMask"); return; }
  416. shader.Dispatch(kernel, Mathf.CeilToInt(resolution / threads), 1, 1);
  417. DisposeBuffer(ref maskBuffer);
  418. }
  419. public ComputeBuffer RunNodeCompute(TC_GroupBehaviour groupItem, TC_Node node, float seedParent, ComputeBuffer rightBuffer = null, bool disposeRightBuffer = false)//, int method, ComputeBuffer leftBuffer, bool last)
  420. {
  421. float _threads = threads;
  422. TC_Area2D area2D = TC_Area2D.current;
  423. TC_Settings localSettings = TC_Settings.instance;
  424. // TC_GlobalSettings globalSettings = localSettings.global;
  425. node.ct.CopySpecial(node);
  426. Vector2 resolution = area2D.resolution;
  427. InitCurves(node);
  428. if (groupItem != null) groupItem.localCurve.ConvertCurve();
  429. // Reporter.Log("bufferLength " + bufferLength);
  430. // Reporter.Log("Kernel " + kernel);
  431. int kernel = 0;
  432. // Reporter.Log("previewRes " + item.previewTex.width);
  433. // shader.SetInt("method", method);
  434. if (node.useConstant) kernel = shapeConstantKernel;
  435. else if (node.inputKind == InputKind.Terrain)
  436. {
  437. // shader.SetInt("totalResolutionX", area2D.currentTerrainArea.heightTexResolution.x);
  438. // shader.SetInt("totalResolutionY", area2D.currentTerrainArea.heightTexResolution.y);
  439. // Debug.Log(new Vector2((float)area2D.currentTCUnityTerrain.tileX / (float)area2D.currentTerrainArea.tiles.x, (float)area2D.currentTCUnityTerrain.tileZ / (float)area2D.currentTerrainArea.tiles.y));
  440. if (node.inputTerrain == InputTerrain.Height)
  441. {
  442. kernel = terrainHeightKernel;
  443. }
  444. else if (node.inputTerrain == InputTerrain.Angle)
  445. {
  446. kernel = terrainAngleKernel;
  447. }
  448. else if (node.inputTerrain == InputTerrain.Convexity && area2D.currentTCTerrain.texHeight != null)
  449. {
  450. kernel = terrainConvexityKernel;
  451. float resolutionLevel = Mathf.Log(area2D.currentTCTerrain.texHeight.width, 2) - 6;
  452. int mipmapLevel = Mathf.Clamp(node.mipmapLevel + (int)resolutionLevel, 1, 8);
  453. shader.SetInt("itemCount", mipmapLevel);
  454. shader.SetFloat("overlay", node.convexityMode == ConvexityMode.Convex ? node.convexityStrength : -node.convexityStrength);// / resolutionLevel);
  455. // Debug.Log(Mathf.Log(area2D.currentTCTerrain.texHeight.width, 2));
  456. }
  457. else if (node.inputTerrain == InputTerrain.Splatmap)
  458. {
  459. // if (node.outputId == TC.treeOutput || node.outputId == TC.objectOutput) kernel = terrainSplatmapItemMapKernel; else
  460. if (node.outputId == TC.splatOutput)
  461. {
  462. TC.AddMessage("Splat Input settings is currently not available in Splat Output. The node will be set inactive");
  463. node.enabled = false;
  464. return null;
  465. }
  466. Texture[] textures = area2D.currentTerrain.terrainData.alphamapTextures;
  467. if (node.splatSelectIndex < 4)
  468. {
  469. kernel = terrainSplatmap0Kernel;
  470. // if (node.outputId == TC.splatOutput) shader.SetTexture(kernel, "leftSplatmap0", rtsSplatmap[0]);
  471. // else
  472. shader.SetTexture(kernel, "leftSplatmap0", textures[0]);
  473. shader.SetInt("splatIndex", node.splatSelectIndex);
  474. }
  475. else
  476. {
  477. kernel = terrainSplatmap1Kernel;
  478. // if (node.outputId == TC.splatOutput) shader.SetTexture(kernel, "leftSplatmap1", rtsSplatmap[1]);
  479. // else
  480. shader.SetTexture(kernel, "leftSplatmap1", textures[1]);
  481. shader.SetInt("splatIndex", node.splatSelectIndex - 4);
  482. }
  483. // RenderTexture[] textures = area2D.currentTerrainArea.rtSplatmaps;
  484. }
  485. else if (node.inputTerrain == InputTerrain.Collision)
  486. {
  487. if (camCapture.collisionMask != node.collisionMask || !camCapture.terrain != area2D.currentTerrain) camCapture.Capture(node.collisionMask, node.collisionDirection, node.outputId, resolution);
  488. if (node.collisionMode == CollisionMode.Height)
  489. {
  490. if (node.includeTerrainHeight && node.heightDetectRange) kernel = terrainCollisionHeightIncludeKernel; else kernel = terrainCollisionHeightKernel;
  491. }
  492. else kernel = terrainCollisionMaskKernel;
  493. shader.SetTexture(kernel, "tex1", camCapture.cam.targetTexture);
  494. if (rightBuffer != null) shader.SetBuffer(kernel, "rightBuffer", rightBuffer);
  495. if (node.heightDetectRange) shader.SetVector("range", node.range / area2D.terrainSize.y); else shader.SetVector("range", new Vector2(0, area2D.terrainSize.y));
  496. }
  497. if (node.inputTerrain != InputTerrain.Splatmap && area2D.currentTCTerrain.texHeight != null)
  498. {
  499. shader.SetTexture(kernel, "terrainTexRead", area2D.currentTCTerrain.texHeight);
  500. shader.SetFloat("terrainTexReadResolution", area2D.currentTCTerrain.texHeight.width);
  501. shader.SetFloat("terrainTexReadNormalResolution", area2D.currentTCTerrain.texHeight.width - area2D.resExpandBorder * 2);
  502. shader.SetFloat("resExpandBorder", area2D.resExpandBorder);
  503. // Debug.Log("terrainTexReadResolution " + area2D.currentTCTerrain.texHeight.width);
  504. // Debug.Log("terrainTexReadNormalResolution " + (area2D.currentTCTerrain.texHeight.width - area2D.resExpandBorder * 2));
  505. // Debug.Log("resExpandBorder" + area2D.resExpandBorder);
  506. // Debug.Log("terrainTexRead " + area2D.currentTCUnityTerrain.terrain.name);
  507. }
  508. }
  509. else if (node.inputKind == InputKind.Noise || (node.inputKind == InputKind.Current && node.inputCurrent == InputCurrent.Distortion))
  510. {
  511. if (node.inputNoise == InputNoise.Perlin)
  512. {
  513. if (node.noise.mode == NoiseMode.TextureLookup) kernel = noisePerlinKernel[node.noise.octaves - 1];
  514. else kernel = noisePerlin2Kernel[((int)node.noise.mode) - 1];
  515. }
  516. else if (node.inputNoise == InputNoise.Billow)
  517. {
  518. if (node.noise.mode == NoiseMode.TextureLookup) kernel = noiseBillowKernel[node.noise.octaves - 1];
  519. else kernel = noiseBillow2Kernel[((int)node.noise.mode) - 1];
  520. }
  521. else if (node.inputNoise == InputNoise.Ridged)
  522. {
  523. if (node.noise.mode == NoiseMode.TextureLookup) kernel = noiserRidgedKernel[node.noise.octaves - 1];
  524. else kernel = noiseRidged2Kernel[((int)node.noise.mode) - 1];
  525. }
  526. else if (node.inputNoise == InputNoise.IQ) { kernel = noiseIQKernel[((int)node.noise.mode) - 1]; _threads = 512; }
  527. else if (node.inputNoise == InputNoise.Swiss) { kernel = noiseSwissKernel[((int)node.noise.mode) - 1]; _threads = 512; }
  528. else if (node.inputNoise == InputNoise.Jordan) { kernel = noiseJordanKernel[((int)node.noise.mode) - 1]; _threads = 512; }
  529. else if (node.inputNoise == InputNoise.Cell)
  530. {
  531. if (node.noise.cellMode == CellNoiseMode.Normal) kernel = noiseCellNormalKernel; else kernel = noiseCellFastKernel;
  532. shader.SetInt("_CellType", node.noise.cellType);
  533. shader.SetInt("_DistanceFunction", node.noise.distanceFunction);
  534. }
  535. else if (node.inputNoise == InputNoise.Random) kernel = noiseRandomKernel;
  536. if (m_perlin.GetPermutationTable2D() == null)
  537. {
  538. m_perlin = new PerlinNoise(0);
  539. m_perlin.LoadResourcesFor3DNoise();
  540. // Debug.Log("Init perlin textures");
  541. }
  542. shader.SetTexture(kernel, "_PermTable2D", m_perlin.GetPermutationTable2D());
  543. shader.SetTexture(kernel, "_Gradient3D", m_perlin.GetGradient3D());
  544. shader.SetFloat("_Frequency", node.noise.frequency / 10000);
  545. shader.SetFloat("_Lacunarity", node.noise.lacunarity);
  546. shader.SetFloat("_Persistence", node.noise.persistence);
  547. shader.SetFloat("_Seed", (node.noise.seed + seedParent + localSettings.seed));
  548. // Debug.Log("Seed " + (node.noise.seed + seedParent + TC_Settings.instance.seed));
  549. if (node.noise.mode != NoiseMode.TextureLookup)
  550. {
  551. shader.SetFloat("_Amplitude", node.noise.amplitude);
  552. shader.SetInt("_Octaves", node.noise.octaves);
  553. shader.SetFloat("_Warp0", node.noise.warp0);
  554. shader.SetFloat("_Warp", node.noise.warp);
  555. shader.SetFloat("_Damp0", node.noise.damp0);
  556. shader.SetFloat("_Damp", node.noise.damp);
  557. shader.SetFloat("_DampScale", node.noise.dampScale);
  558. }
  559. // Reporter.Log(node.generator.seed);
  560. }
  561. else if (node.inputKind == InputKind.Shape)
  562. {
  563. if (node.inputShape == InputShape.Gradient) kernel = shapeGradientKernel;
  564. else if (node.inputShape == InputShape.Circle) kernel = shapeCircleKernel;
  565. else if (node.inputShape == InputShape.Rectangle)
  566. {
  567. kernel = shapeSquareKernel;
  568. shader.SetVector("topResolution", node.shapes.topSize);
  569. shader.SetVector("bottomResolution", node.shapes.bottomSize);
  570. }
  571. else if (node.inputShape == InputShape.Constant) kernel = shapeConstantKernel;
  572. shader.SetFloat("shapeSize", node.shapes.size);
  573. }
  574. else if (node.inputKind == InputKind.File)
  575. {
  576. if (node.inputFile == InputFile.Image)
  577. {
  578. if (node.imageSettings.colSelectMode == ColorSelectMode.Color) kernel = imageColorKernel; else kernel = imageColorRangeKernel;
  579. if (node.stampTex != null) shader.SetTexture(kernel, "leftSplatmap0", node.stampTex);
  580. for (int i = 0; i < 4; i++)
  581. {
  582. ImageSettings.ColChannel colChannel = node.imageSettings.colChannels[i];
  583. shader.SetVector(TC.colChannelNamesLowerCase[i] + "Channel", new Vector3(colChannel.active ? 1 : 0, colChannel.range.x / 255.0f, colChannel.range.y / 255.0f));
  584. }
  585. }
  586. else if (node.inputFile == InputFile.RawImage)
  587. {
  588. if (node.rawImage == null) return null;
  589. if (node.rawImage.tex == null)
  590. {
  591. node.rawImage.LoadRawImage(node.rawImage.path);
  592. if (node.rawImage.tex == null) return null;
  593. }
  594. kernel = rawImageKernel;
  595. shader.SetInt("_Octaves", node.mipmapLevel);
  596. #if UNITY_EDITOR_OSX
  597. shader.SetTexture(kernel, "tex1b", node.rawImage.tex);
  598. shader.SetTexture(kernel, "tex2b", node.rawImage.tex2);
  599. #else
  600. shader.SetTexture(kernel, "tex1", node.rawImage.tex);
  601. #endif
  602. }
  603. }
  604. else if (node.inputKind == InputKind.Portal)
  605. {
  606. kernel = portalKernel;
  607. if (node.portalNode.rtPortal == null)
  608. {
  609. TC.AddMessage("Portal node " + node.portalNode.name + " doesn't have any result. Portals can only be used after the original node is generated. So the orinal node/portal node order needs to be switched or the original node is inactive.");
  610. return null;
  611. }
  612. shader.SetTexture(kernel, "tex1", node.portalNode.rtPortal);
  613. shader.SetFloat("overlay", node.opacity);
  614. shader.SetFloat("resExpandBorder", (node.portalNode.outputId == TC.heightOutput && node.outputId != TC.heightOutput) ? area2D.resExpandBorder : 0);
  615. shader.SetInt("portalResolution", node.portalNode.rtPortal.width);
  616. }
  617. if (node.inputKind == InputKind.Current)
  618. {
  619. if (node.inputCurrent == InputCurrent.Blur)
  620. {
  621. if (node.blurMode == BlurMode.Normal) kernel = currentBlurNormalKernel;
  622. else if (node.blurMode == BlurMode.Outward) kernel = currentBlurOutwardKernel;
  623. else if (node.blurMode == BlurMode.Inward) kernel = currentBlurInwardKernel;
  624. }
  625. else if (node.inputCurrent == InputCurrent.Expand) kernel = currentExpandKernel;
  626. else if (node.inputCurrent == InputCurrent.Shrink) kernel = currentShrinkKernel;
  627. else if (node.inputCurrent == InputCurrent.EdgeDetect)
  628. {
  629. kernel = currentEdgeDetectKernel;
  630. shader.SetVector("range", node.detectRange);
  631. }
  632. else if (node.inputCurrent == InputCurrent.Distortion)
  633. {
  634. kernel = currentDistortionKernel;
  635. shader.SetFloat("shapeSize", node.radius);
  636. }
  637. shader.SetBuffer(kernel, "rightBuffer", rightBuffer);
  638. }
  639. shader.SetVector("texResolution", new Vector2(node.size.x, node.size.z));// globalSettings.defaultTerrainSize.ToVector2());
  640. shader.SetInt("isClamp", node.wrapMode == ImageWrapMode.Clamp ? 1 : 0);
  641. shader.SetInt("isMirror", node.wrapMode == ImageWrapMode.Mirror ? 1 : 0);
  642. shader.SetInt("preview", localSettings.preview ? 1 : 0);
  643. InitPreviewRenderTexture(ref node.rtPreview, node.name);
  644. shader.SetInt("previewResolution", node.rtPreview.width);
  645. shader.SetTexture(kernel, "previewTex", node.rtPreview);
  646. InitPreviewRenderTexture(ref groupItem.rtPreview, "Preview");
  647. shader.SetTexture(kernel, "previewTex2", groupItem.rtPreview);
  648. bufferLength = (int)resolution.x * (int)resolution.y;
  649. TC_Reporter.Log("Compute node buffer resolution " + resolution.x + " " + resolution.y);
  650. ComputeBuffer resultBuffer = new ComputeBuffer((int)bufferLength, 4);
  651. shader.SetBuffer(kernel, "resultBuffer", resultBuffer);
  652. shader.SetInt("resolutionX", (int)resolution.x);
  653. shader.SetInt("resolutionY", (int)resolution.y);
  654. // Debug.Log("resolutionX " + resolution.x);
  655. // Debug.Log("resolutionY " + resolution.y);
  656. ComputeBuffer localCurveCalc = null, localCurveKeys = null;
  657. SetComputeCurve("local", kernel, node.localCurve, ref localCurveCalc, ref localCurveKeys);
  658. ComputeBuffer localGroupCurveCalc = null, localGroupCurveKeys = null;
  659. if (groupItem != null)
  660. {
  661. SetComputeCurve("localGroup", kernel, groupItem.localCurve, ref localGroupCurveCalc, ref localGroupCurveKeys);
  662. }
  663. ComputeBuffer worldCurveCalc = null, worldCurveKeys = null;
  664. SetComputeCurve("world", kernel, node.worldCurve, ref worldCurveCalc, ref worldCurveKeys);
  665. // Reporter.Log(Area2D.current.currentTerrain.terrainData.size.y);
  666. // Reporter.Log(item.cT.position + " -- " + item.cT.scale);
  667. if (node.nodeType == NodeGroupType.Mask) shader.SetInt("mask", 1);
  668. else shader.SetInt("mask", 0);
  669. shader.SetVector("resolutionPM", area2D.resolutionPM);
  670. shader.SetVector("resToPreview", area2D.resToPreview);
  671. shader.SetVector("terrainSize", new Vector2(area2D.terrainSize.x, area2D.terrainSize.z));
  672. shader.SetVector("offset", (node.ct.position - area2D.startPos) + localSettings.generateOffset);
  673. shader.SetVector("posOffset", node.ct.posOffset);
  674. shader.SetVector("areaPos", area2D.area.position);
  675. shader.SetVector("totalAreaPos", area2D.totalArea.position);
  676. shader.SetVector("rot", new Vector4(node.ct.rotation.x, node.ct.rotation.y, node.ct.rotation.z, node.ct.rotation.w));
  677. if (node.outputId == TC.treeOutput || node.outputId == TC.objectOutput) shader.SetVector("uvOffset", new Vector2(0.5f / resolution.x, 0.5f / resolution.y));
  678. else shader.SetVector("uvOffset", Vector2.zero);
  679. float scaleY = node.ct.scale.y;
  680. if (node.inputKind == InputKind.Noise && node.inputNoise == InputNoise.Swiss || node.inputNoise == InputNoise.Jordan)
  681. {
  682. if (node.noise.amplitude > 1) scaleY /= node.noise.amplitude;
  683. }
  684. shader.SetVector("scale", new Vector3(node.ct.scale.x, scaleY * (node.size.y / localSettings.defaultTerrainHeight), node.ct.scale.z));
  685. // shader.SetFloat("terrainHeight", node.outputId == TC.heightOutput ? Area2D.current.terrainSize.y : 1000);
  686. shader.SetFloat("defaultTerrainHeight", localSettings.defaultTerrainHeight);
  687. shader.SetFloat("terrainHeight", area2D.terrainSize.y);
  688. // Debug.Log(area2D.terrainSize.y);
  689. shader.SetInt("outputId", node.outputId);
  690. // Reporter.Log("Run shader");
  691. if (kernel == -1) { Debug.Log("Kernel not found"); return null; }
  692. shader.Dispatch(kernel, Mathf.CeilToInt(bufferLength / _threads), 1, 1);
  693. DisposeBuffers(ref localCurveKeys, ref localCurveCalc);
  694. DisposeBuffers(ref localGroupCurveKeys, ref localGroupCurveCalc);
  695. DisposeBuffers(ref worldCurveKeys, ref worldCurveCalc);
  696. if (disposeRightBuffer) DisposeBuffer(ref rightBuffer);
  697. if (node.isPortalCount > 0) MakePortalBuffer(node, resultBuffer);
  698. return resultBuffer;
  699. }
  700. public void MakePortalBuffer(TC_ItemBehaviour item, ComputeBuffer inputBuffer, ComputeBuffer maskBuffer = null)
  701. {
  702. CopyComputeBufferToRenderTexture(inputBuffer, ref item.rtPortal, (int)TC_Area2D.current.resolution.x, maskBuffer);
  703. // portalList.Add(item);
  704. }
  705. public void RunComputeMultiMethod(TC_ItemBehaviour item, Method method, bool normalize, ref RenderTexture[] rtsLeft, ref RenderTexture[] rtsRight, ComputeBuffer maskBuffer, RenderTexture rtPreview, ref RenderTexture rtPreviewClone, ref RenderTexture rtLeftPreview, RenderTexture rtRightPreview)
  706. {
  707. TC_Area2D area2D = TC_Area2D.current;
  708. int kernel = -1;
  709. int _method = (int)method;
  710. if (method == Method.Lerp && maskBuffer != null)
  711. {
  712. kernel = multiMethodTexLerpMaskKernel;
  713. TC_Reporter.Log(kernel + " -> Lerp mask");
  714. shader.SetTexture(kernel, "previewTex2", item.rtPreview);
  715. shader.SetBuffer(kernel, "maskBuffer", maskBuffer);
  716. }
  717. // else if (rtLeftPreview == null) kernel = multiMethodKernel[_method];
  718. else kernel = multiMethodTexKernel[_method];
  719. shader.SetFloat("overlay", item.opacity);
  720. shader.SetInt("doNormalize", normalize ? 1 : 0);
  721. Int2 resolution = area2D.intResolution;
  722. shader.SetInt("resolutionX", resolution.x);
  723. shader.SetInt("resolutionY", resolution.y);
  724. shader.SetTexture(kernel, "leftSplatmap0", rtsLeft[0]);
  725. shader.SetTexture(kernel, "rightSplatmap0", rtsRight[0]);
  726. shader.SetTexture(kernel, "splatmap0", rtsResult[0]);
  727. if (rtsLeft.Length > 1)
  728. {
  729. shader.SetTexture(kernel, "leftSplatmap1", rtsLeft[1]);
  730. shader.SetTexture(kernel, "rightSplatmap1", rtsRight[1]);
  731. shader.SetTexture(kernel, "splatmap1", rtsResult[1]);
  732. }
  733. if (rtsRight.Length > 2)
  734. {
  735. shader.SetTexture(kernel, "leftSplatmap2", rtsLeft[2]);
  736. shader.SetTexture(kernel, "rightSplatmap2", rtsRight[2]);
  737. shader.SetTexture(kernel, "splatmap2", rtsResult[2]);
  738. }
  739. if (rtsRight.Length > 3)
  740. {
  741. shader.SetTexture(kernel, "leftSplatmap3", rtsLeft[3]);
  742. shader.SetTexture(kernel, "rightSplatmap3", rtsRight[3]);
  743. shader.SetTexture(kernel, "splatmap3", rtsResult[3]);
  744. }
  745. InitPreviewRenderTexture(ref rtPreviewClone, "Preview");
  746. shader.SetTexture(kernel, "leftPreviewTex", rtLeftPreview);
  747. shader.SetTexture(kernel, "rightPreviewTex", rtRightPreview);
  748. shader.SetTexture(kernel, "splatPreviewTex", rtPreview);
  749. shader.SetTexture(kernel, "splatPreviewTexClone", rtPreviewClone);
  750. if (kernel == -1) { Debug.Log("Kernel not found"); return; }
  751. shader.Dispatch(kernel, resolution.x / 8, resolution.y / 8, 1);
  752. // for (int i = 0; i < leftRTextures.Length; i++) leftRTextures[i] = resultRTextures[i];
  753. rtLeftPreview = rtPreviewClone;
  754. // Debug.Log(rtsLeft.Length + ", " + rtsResult.Length);
  755. TC.Swap(ref rtsLeft, ref rtsResult);
  756. // TC.Swap(ref rightPreviewTex, ref previewTex);
  757. // TC.Swap(ref leftPreviewTex, ref resultTex);
  758. DisposeRenderTextures(ref rtsRight);
  759. }
  760. public void RunComputeMultiMethod(TC_ItemBehaviour item, bool doNormalize, ref RenderTexture[] rtsLeft, ComputeBuffer maskBuffer, RenderTexture rtLeftPreview = null)
  761. {
  762. TC_Area2D area2D = TC_Area2D.current;
  763. int kernel = -1;
  764. //if (previewTex == null) kernel = multiMethodMultiplyBufferKernel;
  765. // else
  766. kernel = multiMethodMultiplyBufferKernel;
  767. shader.SetBuffer(kernel, "rightBuffer", maskBuffer);
  768. shader.SetInt("doNormalize", doNormalize ? 1 : 0);
  769. Int2 resolution = area2D.intResolution;
  770. shader.SetInt("resolutionX", resolution.x);
  771. shader.SetInt("resolutionY", resolution.y);
  772. shader.SetTexture(kernel, "leftSplatmap0", rtsLeft[0]);
  773. shader.SetTexture(kernel, "splatmap0", rtsResult[0]);
  774. if (rtsLeft.Length > 1)
  775. {
  776. shader.SetTexture(kernel, "leftSplatmap1", rtsLeft[1]);
  777. shader.SetTexture(kernel, "splatmap1", rtsResult[1]);
  778. }
  779. TC_Layer layer = item as TC_Layer;
  780. if (layer != null) shader.SetTexture(kernel, "leftPreviewTex", layer.selectNodeGroup.rtColorPreview);
  781. else
  782. {
  783. TC_LayerGroup layerGroup = item as TC_LayerGroup;
  784. if (layerGroup != null) shader.SetTexture(kernel, "leftPreviewTex", rtLeftPreview);
  785. }
  786. shader.SetTexture(kernel, "splatPreviewTex", item.rtPreview);
  787. TC_Reporter.Log("maskbuffer " + resolution.x + " , " + resolution.y);
  788. if (kernel == -1) { Debug.Log("Kernel not found"); return; }
  789. shader.Dispatch(kernel, resolution.x / 8, resolution.y / 8, 1);
  790. // for (int i = 0; i < leftRTextures.Length; i++) leftRTextures[i] = resultRTextures[i];
  791. TC.Swap(ref rtsLeft, ref rtsResult);
  792. }
  793. public void RunComputeColorMethod(TC_ItemBehaviour item, Method method, ref RenderTexture rtLeft, ref RenderTexture rtRight, ComputeBuffer maskBuffer, RenderTexture rtPreview, ref RenderTexture rtPreviewClone, ref RenderTexture rtLeftPreview, RenderTexture rtRightPreview)
  794. {
  795. TC_Area2D area2D = TC_Area2D.current;
  796. int kernel = -1;
  797. int _method = (int)method;
  798. if (method == Method.Lerp && maskBuffer != null)
  799. {
  800. kernel = colorMethodTexLerpMaskKernel;
  801. TC_Reporter.Log(kernel + " -> Lerp mask");
  802. shader.SetTexture(kernel, "previewTex2", item.rtPreview);
  803. shader.SetBuffer(kernel, "maskBuffer", maskBuffer);
  804. }
  805. // else if (leftPreviewTex == null) kernel = colorMethodTexKernel[_method];
  806. else kernel = colorMethodTexKernel[_method];
  807. shader.SetFloat("overlay", item.opacity);
  808. Int2 resolution = area2D.intResolution;
  809. shader.SetInt("resolutionX", resolution.x);
  810. shader.SetInt("resolutionY", resolution.y);
  811. shader.SetTexture(kernel, "leftSplatmap0", rtLeft);
  812. shader.SetTexture(kernel, "rightSplatmap0", rtRight);
  813. // Debug.Log(leftRTexture.width + " - " + resultRTextures[0].width);
  814. // Debug.Log(resolution.x + " - " + resolution.y);
  815. shader.SetTexture(kernel, "splatmap0", rtResult);
  816. // shader.SetTexture(kernel, "splatmap0", leftRTexture);
  817. InitPreviewRenderTexture(ref rtPreviewClone, "Preview");
  818. shader.SetTexture(kernel, "leftPreviewTex", rtLeftPreview);
  819. shader.SetTexture(kernel, "rightPreviewTex", rtRightPreview);
  820. shader.SetTexture(kernel, "splatPreviewTex", rtPreview);
  821. shader.SetTexture(kernel, "splatPreviewTexClone", rtPreviewClone);
  822. // Debug.Log("kernel " + kernel);
  823. if (kernel == -1) { Debug.Log("Kernel not found"); return; }
  824. shader.Dispatch(kernel, resolution.x / 8, resolution.y / 8, 1);
  825. TC.Swap(ref rtLeft, ref rtResult);
  826. rtLeftPreview = rtPreviewClone;
  827. // TC.Swap(ref rightPreviewTex, ref previewTex);
  828. // TC.Swap(ref leftPreviewTex, ref resultTex);
  829. // DisposeRenderTexture(ref rightRTexture);
  830. }
  831. public void RunComputeColorMethod(TC_ItemBehaviour item, ref RenderTexture rtLeft, ComputeBuffer maskBuffer, RenderTexture rtLeftPreview = null)
  832. {
  833. TC_Area2D area2D = TC_Area2D.current;
  834. int kernel = -1;
  835. kernel = colorMethodMultiplyBufferKernel;
  836. shader.SetBuffer(kernel, "rightBuffer", maskBuffer);
  837. Int2 resolution = area2D.intResolution;
  838. shader.SetInt("resolutionX", resolution.x);
  839. shader.SetInt("resolutionY", resolution.y);
  840. shader.SetTexture(kernel, "leftSplatmap0", rtLeft);
  841. shader.SetTexture(kernel, "splatmap0", rtResult);
  842. // shader.SetTexture(kernel, "splatmap0", leftRTexture);
  843. TC_Layer layer = item as TC_Layer;
  844. if (layer != null) shader.SetTexture(kernel, "leftPreviewTex", layer.selectNodeGroup.rtColorPreview);
  845. else
  846. {
  847. TC_LayerGroup layerGroup = item as TC_LayerGroup;
  848. if (layerGroup != null) shader.SetTexture(kernel, "leftPreviewTex", rtLeftPreview);
  849. }
  850. shader.SetTexture(kernel, "splatPreviewTex", item.rtPreview);
  851. TC_Reporter.Log("maskbuffer " + resolution.x + " , " + resolution.y);
  852. if (kernel == -1) { Debug.Log("Kernel not found"); return; }
  853. shader.Dispatch(kernel, resolution.x / 8, resolution.y / 8, 1);
  854. // leftRTexture = resultRTex;
  855. TC.Swap(ref rtLeft, ref rtResult);
  856. }
  857. public void RunSplatNormalize(TC_LayerGroup layerGroup, ref RenderTexture[] rtsLeft, ref RenderTexture rtPreview)
  858. {
  859. if (!TC_Settings.instance.preview && !layerGroup.active) return;
  860. int kernel = normalizeSplatKernel[rtsLeft.Length - 1];
  861. shader.SetTexture(kernel, "leftSplatmap0", rtsLeft[0]);
  862. shader.SetTexture(kernel, "leftSplatmap1", rtsLeft[1]);
  863. shader.SetTexture(kernel, "splatmap0", rtsResult[0]);
  864. shader.SetTexture(kernel, "splatmap1", rtsResult[1]);
  865. if (rtPreview != null)
  866. {
  867. shader.SetTexture(kernel, "leftPreviewTex", rtPreview);
  868. shader.SetTexture(kernel, "splatPreviewTex", rtSplatPreview);
  869. }
  870. // for (int i = 0; i < leftRTextures.Length; i++) leftRTextures[i] = resultRTextures[i];
  871. // previewTex = splatPreviewTex;
  872. TC.Swap(ref rtsLeft, ref rtsResult);
  873. TC.Swap(ref rtPreview, ref rtSplatPreview);
  874. }
  875. public void RunComputeMethod(TC_GroupBehaviour groupItem, TC_ItemBehaviour item, ComputeBuffer resultBuffer, ref ComputeBuffer rightBuffer, int itemCount, RenderTexture rtPreview, ComputeBuffer maskBuffer = null)
  876. {
  877. if (!TC_Settings.instance.preview && !item.active) return;
  878. int kernel = -1;
  879. int method;
  880. if (groupItem != null)
  881. {
  882. method = (int)item.method;
  883. // InitCurves(groupItem);
  884. }
  885. else
  886. {
  887. method = 3;
  888. shader.SetInt("localCurveKeysLength", 0);
  889. shader.SetInt("worldCurveKeysLength", 0);
  890. }
  891. // if (previewTex == null) Debug.Log("PreviewTex = null");
  892. if (rtPreview != null && TC_Settings.instance.preview)
  893. {
  894. if (maskBuffer == null) { kernel = methodTexKernel[method]; }
  895. else
  896. {
  897. kernel = methodTexLerpMaskKernel;
  898. if (item.rtPreview != null) shader.SetTexture(kernel, "previewTex2", item.rtPreview);
  899. shader.SetBuffer(kernel, "maskBuffer", maskBuffer);
  900. }
  901. shader.SetTexture(kernel, "previewTex", rtPreview);
  902. }
  903. else
  904. {
  905. if (maskBuffer == null) kernel = methodKernel[method];
  906. else
  907. {
  908. kernel = methodLerpMaskKernel;
  909. shader.SetBuffer(kernel, "maskBuffer", maskBuffer);
  910. }
  911. }
  912. if (item != null) shader.SetFloat("overlay", item.opacity);
  913. shader.SetInt("itemCount", itemCount);
  914. shader.SetBuffer(kernel, "rightBuffer", rightBuffer);
  915. shader.SetBuffer(kernel, "resultBuffer", resultBuffer);
  916. if (kernel == -1) { Debug.Log("Kernel not found"); return; }
  917. if (groupItem != null)
  918. {
  919. ComputeBuffer worldCurveCalc = null, worldCurveKeys = null;
  920. groupItem.worldCurve.ConvertCurve();
  921. SetComputeCurve("world", kernel, groupItem.worldCurve, ref worldCurveCalc, ref worldCurveKeys);
  922. shader.Dispatch(kernel, Mathf.CeilToInt(bufferLength / threads), 1, 1);
  923. DisposeBuffers(ref worldCurveKeys, ref worldCurveCalc);
  924. }
  925. else
  926. {
  927. shader.Dispatch(kernel, Mathf.CeilToInt(bufferLength / threads), 1, 1);
  928. }
  929. DisposeBuffer(ref rightBuffer);
  930. }
  931. public void RunComputeObjectMethod(TC_GroupBehaviour groupItem, TC_ItemBehaviour item, ComputeBuffer itemMapBuffer, ref ComputeBuffer rightItemMapBuffer, ComputeBuffer maskBuffer, RenderTexture rtPreview, ref RenderTexture rtPreviewClone, ref RenderTexture rtLeftPreview, RenderTexture rtRightPreview)
  932. {
  933. TC_Area2D area2D = TC_Area2D.current;
  934. TC_Settings settings = TC_Settings.instance;
  935. // if (rtPreview == null) Debug.Log("null"); else Debug.Log("Not null");
  936. int kernel = -1;
  937. if (item.method == Method.Max) kernel = methodItemTexMaxKernel;
  938. else if (item.method == Method.Min) kernel = methodItemTexMinKernel;
  939. else if (item.method == Method.Lerp)
  940. {
  941. if (maskBuffer == null)
  942. {
  943. kernel = methodItemTexLerpKernel;
  944. // Debug.Log("method overlay " + kernel);
  945. }
  946. else
  947. {
  948. kernel = methodItemTexLerpMaskKernel;
  949. shader.SetBuffer(kernel, "maskBuffer", maskBuffer);
  950. // Debug.Log("methodItemTexLerpMaskKernel " + kernel);
  951. }
  952. }
  953. // Debug.Log("ObjectMethod " + kernel);
  954. if (rtPreview == null) TC_Reporter.Log("rtPreview = null");
  955. if (rtPreview != null && settings.preview)
  956. {
  957. InitPreviewRenderTexture(ref rtPreviewClone, "rtPreviewClone_"+TC.outputNames[groupItem.outputId]);
  958. if (maskBuffer != null)
  959. {
  960. shader.SetTexture(kernel, "previewTex2", item.rtPreview);
  961. shader.SetBuffer(kernel, "maskBuffer", maskBuffer);
  962. shader.SetVector("colLayer", settings.global.GetVisualizeColor(item.listIndex));
  963. }
  964. if (groupItem.level != 0)
  965. {
  966. InitPreviewRenderTexture(ref groupItem.parentItem.rtPreview, "rtPreview LayerGroup" + TC.outputNames[groupItem.outputId]);
  967. shader.SetTexture(kernel, "splatmap0", groupItem.parentItem.rtPreview);
  968. shader.SetVector("colLayer2", settings.global.GetVisualizeColor(groupItem.parentItem.listIndex));
  969. }
  970. if (rtLeftPreview != null) shader.SetTexture(kernel, "leftPreviewTex", rtLeftPreview);
  971. shader.SetTexture(kernel, "rightPreviewTex", rtRightPreview);
  972. shader.SetTexture(kernel, "splatPreviewTex", rtPreview);
  973. shader.SetTexture(kernel, "splatPreviewTexClone", rtPreviewClone);
  974. }
  975. else
  976. {
  977. if (maskBuffer != null) shader.SetBuffer(kernel, "maskBuffer", maskBuffer);
  978. }
  979. if (item != null) shader.SetFloat("overlay", item.opacity);
  980. shader.SetBuffer(kernel, "itemMapBuffer", itemMapBuffer);
  981. shader.SetBuffer(kernel, "rightItemMapBuffer", rightItemMapBuffer);
  982. shader.SetVector("resolutionPM", area2D.resolutionPM);
  983. Int2 resolution = area2D.intResolution;
  984. shader.SetInt("resolutionX", resolution.x);
  985. shader.SetInt("resolutionY", resolution.y);
  986. shader.SetVector("areaPos", area2D.area.position);
  987. shader.SetVector("totalAreaPos", area2D.totalArea.position);
  988. shader.SetVector("resToPreview", area2D.resToPreview);
  989. // Debug.Log("areaPos " + area2D.area.position);
  990. // Debug.Log("totalAreaPos " + area2D.totalArea.position);
  991. // Debug.Log("resolutionPM " + area2D.resToTerrain);
  992. // Debug.Log("resToPreview " + area2D.resToPreview);
  993. //a Debug.Log("resolutionPM " + area2D.resToTerrain);
  994. if (groupItem != null)
  995. {
  996. // ComputeBuffer worldCurveCalc = null, worldCurveKeys = null;
  997. // groupItem.worldCurve.ConvertCurve();
  998. // SetComputeCurve("world", kernel, groupItem.worldCurve, ref worldCurveCalc, ref worldCurveKeys);
  999. if (kernel == -1) { Debug.Log("Kernel not found RunComputeObjectMethod"); return; }
  1000. // Debug.Log(bufferLength + " / " + threads);
  1001. shader.Dispatch(kernel, Mathf.CeilToInt(bufferLength / threads), 1, 1);
  1002. // DisposeBuffers(ref worldCurveKeys, ref worldCurveCalc);
  1003. }
  1004. rtLeftPreview = rtPreviewClone;
  1005. DisposeBuffer(ref rightItemMapBuffer);
  1006. }
  1007. public void RunTerrainTexFromTerrainData(TerrainData terrainData, ref RenderTexture rtHeight)
  1008. {
  1009. Debug.Log("Run terrain tex from TerrainData "+terrainData.name);
  1010. int heightmapResolution = terrainData.heightmapResolution - 1;
  1011. float[,] heights2D = terrainData.GetHeights(0, 0, heightmapResolution, heightmapResolution);
  1012. float[] heights = new float[heightmapResolution * heightmapResolution];
  1013. for (int y = 0; y < heightmapResolution; y++)
  1014. {
  1015. for (int x = 0; x < heightmapResolution; x++)
  1016. {
  1017. heights[x + (y * heightmapResolution)] = heights2D[y, x];
  1018. }
  1019. }
  1020. ComputeBuffer resultBuffer = new ComputeBuffer(heights.Length, 4);
  1021. resultBuffer.SetData(heights);
  1022. RunTerrainTex(resultBuffer, ref rtHeight, heightmapResolution);
  1023. DisposeBuffer(ref resultBuffer);
  1024. }
  1025. public void RunTerrainTex(ComputeBuffer resultBuffer, ref RenderTexture rtHeight, int resolution, bool useRTP = false)
  1026. {
  1027. TC_Area2D area2D = TC_Area2D.current;
  1028. TC_Reporter.Log("Run terrain tex");
  1029. // Reporter.Log(Area2D.current.currentTCTerrain.terrain.name);
  1030. // Debug.Log("rb " + resultBuffer.count);
  1031. // Debug.Log("con" + Area2D.current.resToTerrain);
  1032. // Debug.Log("res" + resolution);
  1033. // Debug.Log("Area resolution "+ area2D.resolution.ToString());
  1034. InitRenderTexture(ref rtResult, "rtResult", resolution, RenderTextureFormat.RFloat);
  1035. InitRenderTexture(ref rtHeight, "rtHeight "+area2D.currentTCUnityTerrain.terrain.name, resolution, RenderTextureFormat.ARGB32, false, true);
  1036. shader.SetBuffer(resultBufferToTexKernel, "resultBuffer", resultBuffer);
  1037. shader.SetTexture(resultBufferToTexKernel, "resultTex", rtResult);
  1038. TC_Reporter.Log("result Kernel " + resultBufferToTexKernel);
  1039. float t = Time.realtimeSinceStartup;
  1040. if (resultBufferToTexKernel == -1) { Debug.Log("Kernel not found"); return; }
  1041. TC_Reporter.Log("Area resolution " + area2D.resolution);
  1042. int kernel = resultBufferToTexKernel;
  1043. if (kernel == -1) { Debug.Log("Kernel not found"); return; }
  1044. shader.SetInt("resolutionX", resolution);
  1045. shader.SetInt("resolutionY", resolution);
  1046. shader.Dispatch(kernel, Mathf.CeilToInt(resolution / 8.0f), Mathf.CeilToInt(resolution / 8.0f), 1);
  1047. float f = 1 / (Time.realtimeSinceStartup - t);
  1048. TC_Reporter.Log("Frames compute " + f);
  1049. kernel = terrainTexKernel;
  1050. // shader.SetBuffer(terrainTexKernel, "resultBuffer", resultBuffer);
  1051. shader.SetTexture(terrainTexKernel, "terrainTex", rtHeight);
  1052. shader.SetTexture(terrainTexKernel, "resultTexRead", rtResult);
  1053. // --resolution;
  1054. Vector3 size = area2D.currentTCUnityTerrain.terrain.terrainData.size;
  1055. Vector2 resolutionPM = new Vector2(size.x / (resolution), size.z / (resolution));
  1056. shader.SetVector("resolutionPM", resolutionPM);
  1057. // Debug.Log("resolution " + resolution);
  1058. // shader.SetInts("idOffset", new int[] { area2D.currentTCUnityTerrain.tileX * resolution, area2D.currentTCUnityTerrain.tileZ * resolution });
  1059. // Reporter.Log("terrainTex " + Mathf.FloorToInt(Area2D.current.intResolution.x / 8.0f) * 8 + ", "+resolution.y);
  1060. if (kernel == -1) { Debug.Log("Kernel not found"); return; }
  1061. shader.Dispatch(kernel, Mathf.CeilToInt(resolution / 8.0f), Mathf.CeilToInt(resolution / 8.0f), 1);
  1062. }
  1063. void SetComputeCurve(string name, int kernel, Curve curve, ref ComputeBuffer curveCalc, ref ComputeBuffer curveKeys)
  1064. {
  1065. if (curve.length > 0)
  1066. {
  1067. curveCalc = new ComputeBuffer(curve.c.Length, 16);
  1068. curveKeys = new ComputeBuffer(curve.curveKeys.Length, 4);
  1069. curveCalc.SetData(curve.c);
  1070. curveKeys.SetData(curve.curveKeys);
  1071. shader.SetBuffer(kernel, name + "CurveKeys", curveKeys);
  1072. shader.SetBuffer(kernel, name + "CurveCalc", curveCalc);
  1073. }
  1074. shader.SetInt(name + "CurveKeysLength", curve.length);
  1075. shader.SetVector(name + "CurveRange", new Vector3(curve.range.x, curve.range.y, curve.range.y - curve.range.x));
  1076. }
  1077. //public void ClearandDisposePortalList()
  1078. //{
  1079. // for (int i = 0; i < portalList.Count; i++)
  1080. // {
  1081. // DisposeRenderTexture(ref portalList[i].rtPortal);
  1082. // }
  1083. // portalList.Clear();
  1084. //}
  1085. void CopyComputeBufferToRenderTexture(ComputeBuffer inputBuffer, ref RenderTexture rtOutput, int resolution, ComputeBuffer maskBuffer = null)
  1086. {
  1087. InitRenderTexture(ref rtOutput, "rtOutput", resolution, RenderTextureFormat.RHalf);
  1088. int kernel;
  1089. if (maskBuffer != null)
  1090. {
  1091. kernel = CopyComputeMaskBufferToRenderTextureKernel;
  1092. shader.SetBuffer(kernel, "maskBuffer", maskBuffer);
  1093. }
  1094. else kernel = copyComputeBufferToRenderTextureKernel;
  1095. shader.SetBuffer(kernel, "inputBuffer", inputBuffer);
  1096. shader.SetTexture(kernel, "rtOutput", rtOutput);
  1097. shader.Dispatch(kernel, Mathf.CeilToInt(resolution / 8.0f), Mathf.CeilToInt(resolution / 8.0f), 1);
  1098. }
  1099. static public void InitTextures(ref Texture2D[] textures, string name, int length = 1)
  1100. {
  1101. TC_Area2D area2D = TC_Area2D.current;
  1102. TC_Reporter.Log("InitTextures", 1);
  1103. if (textures == null) textures = new Texture2D[length];
  1104. else if (textures.Length != length)
  1105. {
  1106. // TODO: copy old texture array to new array
  1107. DisposeTextures(ref textures);
  1108. textures = new Texture2D[length];
  1109. }
  1110. for (int i = 0; i < textures.Length; i++)
  1111. {
  1112. if (textures[i] != null)
  1113. {
  1114. TC_Reporter.Log(textures[i].name + " is assigned");
  1115. if (textures[i].width == area2D.intResolution.x && textures[i].height == area2D.intResolution.y) continue;
  1116. else
  1117. {
  1118. textures[i].Resize(area2D.intResolution.x, area2D.intResolution.y);
  1119. continue;
  1120. }
  1121. }
  1122. textures[i] = new Texture2D(area2D.intResolution.x, area2D.intResolution.y, TextureFormat.ARGB32, false, true);
  1123. textures[i].hideFlags = HideFlags.DontSave;
  1124. textures[i].name = name;
  1125. }
  1126. }
  1127. static public void InitTexture(ref Texture2D tex, string name, int resolution = -1, bool mipmap = false, TextureFormat format = TextureFormat.ARGB32, bool clamp = false, bool linear = true)
  1128. {
  1129. TC_Area2D area2D = TC_Area2D.current;
  1130. TC_Reporter.Log("InitTextures", 1);
  1131. Int2 intResolution;
  1132. if (resolution == -1) intResolution = area2D.intResolution;
  1133. else intResolution = new Int2(resolution, resolution);
  1134. if (tex != null)
  1135. {
  1136. TC_Reporter.Log(tex.name + " is assigned");
  1137. if (tex.format == format)
  1138. {
  1139. if (!(tex.mipmapCount == 1 && mipmap))
  1140. {
  1141. if (tex.width == intResolution.x && tex.height == intResolution.y) return;
  1142. else
  1143. {
  1144. tex.Resize(intResolution.x, intResolution.y);
  1145. return;
  1146. }
  1147. }
  1148. }
  1149. else DisposeTexture(ref tex);
  1150. }
  1151. TC_Reporter.Log("Create new Texture2D " + name);
  1152. tex = new Texture2D(intResolution.x, intResolution.y, format, mipmap, linear);
  1153. tex.hideFlags = HideFlags.DontSave;
  1154. tex.name = name;
  1155. if (clamp) tex.wrapMode = TextureWrapMode.Clamp;
  1156. }
  1157. static public void InitPreviewRenderTexture(ref RenderTexture rt, string name)
  1158. {
  1159. TC_Area2D area2D = TC_Area2D.current;
  1160. TC_Reporter.Log("InitPreviewRenderTextures", 1);
  1161. if (area2D == null) return;
  1162. int resolution = area2D.previewResolution;
  1163. if (rt != null)
  1164. {
  1165. if (!rt.IsCreated())
  1166. {
  1167. DisposeRenderTexture(ref rt);
  1168. // Debug.Log("RenderTexture not Created!");
  1169. }
  1170. else if (rt.width != resolution)
  1171. {
  1172. // Debug.Log("Release RenderTexture "+rt.width+" res "+resolution+" "+name);
  1173. TC_Reporter.Log("release " + rt.width + " " + resolution);
  1174. DisposeRenderTexture(ref rt);
  1175. }
  1176. }
  1177. if (rt == null)
  1178. {
  1179. //a Debug.Log("Create RenderTexture "+name);
  1180. rt = new RenderTexture(resolution, resolution, 0, RenderTextureFormat.ARGB32, RenderTextureReadWrite.Linear);
  1181. rt.name = name;
  1182. rt.enableRandomWrite = true;
  1183. rt.hideFlags = HideFlags.DontSave;
  1184. rt.Create();
  1185. //if (GlobalManager.singleton.saveRenderTextures)
  1186. //{
  1187. // UnityEditor.AssetDatabase.CreateAsset(renderTexture, "Assets/Power of Nature/TerrainComposer2/RenderTextures/" + renderTexture.GetInstanceID() + ".renderTexture");
  1188. //}
  1189. }
  1190. }
  1191. static public void InitRenderTextures(ref RenderTexture[] rts, string name, int length = 2)
  1192. {
  1193. TC_Area2D area2D = TC_Area2D.current;
  1194. TC_Reporter.Log("InitRenderTextures");
  1195. if (rts == null) rts = new RenderTexture[length];
  1196. else if (rts.Length != length)
  1197. {
  1198. // TODO: Copy old rts to new array
  1199. DisposeRenderTextures(ref rts);
  1200. rts = new RenderTexture[length];
  1201. }
  1202. for (int i = 0; i < rts.Length; i++)
  1203. {
  1204. if (rts[i] != null)
  1205. {
  1206. if (!rts[i].IsCreated())
  1207. {
  1208. DisposeRenderTexture(ref rts[i]);
  1209. // Debug.Log("RenderTexture not Created!");
  1210. }
  1211. else if (rts[i].width == area2D.intResolution.x && rts[i].height == area2D.intResolution.y) continue;
  1212. else
  1213. {
  1214. // Debug.Log("release ");
  1215. DisposeRenderTexture(ref rts[i]);
  1216. }
  1217. }
  1218. // Debug.Log("Create RenderTexture");
  1219. rts[i] = new RenderTexture(area2D.intResolution.x, area2D.intResolution.y, 0, RenderTextureFormat.ARGB32, RenderTextureReadWrite.Linear);
  1220. rts[i].enableRandomWrite = true;
  1221. rts[i].name = name;
  1222. rts[i].hideFlags = HideFlags.DontSave;
  1223. rts[i].Create();
  1224. }
  1225. }
  1226. static public void InitRenderTexture(ref RenderTexture rt, string name)
  1227. {
  1228. TC_Area2D area2D = TC_Area2D.current;
  1229. TC_Reporter.Log("InitRenderTextures");
  1230. if (rt != null)
  1231. {
  1232. if (!rt.IsCreated())
  1233. {
  1234. DisposeRenderTexture(ref rt);
  1235. // Debug.Log("RenderTexture not Created!");
  1236. }
  1237. else if (rt.width == area2D.intResolution.x && rt.height == area2D.intResolution.y) return;
  1238. else
  1239. {
  1240. TC_Reporter.Log("release " + name + " from " + rt.width + " x " + rt.height +" to "+area2D.intResolution.x +" x " + area2D.intResolution.y);
  1241. DisposeRenderTexture(ref rt);
  1242. }
  1243. }
  1244. // Debug.Log("Create RenderTexture "+name);
  1245. rt = new RenderTexture(area2D.intResolution.x, area2D.intResolution.y, 0, RenderTextureFormat.ARGB32, RenderTextureReadWrite.Linear);
  1246. rt.enableRandomWrite = true;
  1247. rt.name = name;
  1248. rt.hideFlags = HideFlags.DontSave;
  1249. rt.Create();
  1250. }
  1251. static public void InitRenderTexture(ref RenderTexture rt, string name, int resolution, RenderTextureFormat format = RenderTextureFormat.ARGB32, bool forceCreate = false)
  1252. {
  1253. TC_Reporter.Log("InitRenderTextures");
  1254. bool create = forceCreate;
  1255. if (rt == null) create = true;
  1256. else
  1257. {
  1258. if (!rt.IsCreated())
  1259. {
  1260. DisposeRenderTexture(ref rt);
  1261. create = true;
  1262. // Debug.Log("RenderTexture not Created!");
  1263. }
  1264. else if (rt.width != resolution)
  1265. {
  1266. // Debug.Log("Release RenderTexture");
  1267. TC_Reporter.Log("release " + rt.width + " " + resolution);
  1268. DisposeRenderTexture(ref rt);
  1269. create = true;
  1270. }
  1271. else return;
  1272. }
  1273. if (create)
  1274. {
  1275. // Debug.Log("Create RenderTexture");
  1276. rt = new RenderTexture(resolution, resolution, 0, format, RenderTextureReadWrite.Linear);
  1277. rt.name = name;
  1278. rt.hideFlags = HideFlags.DontSave;
  1279. rt.enableRandomWrite = true;
  1280. rt.Create();
  1281. }
  1282. }
  1283. static public void InitRenderTexture(ref RenderTexture rt, string name, int resolution, RenderTextureFormat format, bool forceCreate, bool useMipmap = false)
  1284. {
  1285. TC_Reporter.Log("InitRenderTextures", 1);
  1286. bool create = forceCreate;
  1287. if (rt == null) create = true;
  1288. else
  1289. {
  1290. if (!rt.IsCreated())
  1291. {
  1292. DisposeRenderTexture(ref rt);
  1293. create = true;
  1294. // Debug.Log("RenderTexture not Created!");
  1295. }
  1296. else if (rt.width != resolution || rt.height != resolution || rt.useMipMap != useMipmap)
  1297. {
  1298. // Debug.Log("Release RenderTexture");
  1299. TC_Reporter.Log("release " + rt.width + " " + resolution);
  1300. DisposeRenderTexture(ref rt);
  1301. create = true;
  1302. }
  1303. }
  1304. if (create)
  1305. {
  1306. // Debug.Log("Create RenderTexture");
  1307. rt = new RenderTexture(resolution, resolution, 0, format, RenderTextureReadWrite.Linear);
  1308. rt.name = name;
  1309. rt.useMipMap = useMipmap;
  1310. #if UNITY_5_0 || UNITY_5_1 || UNITY_5_2 || UNITY_5_3 || UNITY_5_4
  1311. rt.generateMips = useMipmap;
  1312. #else
  1313. rt.autoGenerateMips = useMipmap;
  1314. #endif
  1315. rt.hideFlags = HideFlags.DontSave;
  1316. rt.enableRandomWrite = true;
  1317. rt.Create();
  1318. }
  1319. }
  1320. public void DisposeBuffer(ref ComputeBuffer buffer, bool warningEmpty = false)
  1321. {
  1322. if (buffer == null)
  1323. {
  1324. if (warningEmpty) TC_Reporter.Log("Dispose buffer is empty");
  1325. return;
  1326. }
  1327. buffer.Dispose(); buffer = null;
  1328. }
  1329. public void DisposeBuffers(ref ComputeBuffer buffer1, ref ComputeBuffer buffer2)
  1330. {
  1331. if (buffer1 != null) { buffer1.Dispose(); buffer1 = null; }
  1332. if (buffer2 != null) { buffer2.Dispose(); buffer2 = null; }
  1333. }
  1334. static public void DisposeRenderTexture(ref RenderTexture rt)
  1335. {
  1336. if (rt == null) return;
  1337. TC_Reporter.Log("DisposeRenderTextures", 1);
  1338. // Debug.Log("Dispose RenderTexture " + renderTexture.name);
  1339. rt.Release();
  1340. #if UNITY_EDITOR
  1341. DestroyImmediate(rt);
  1342. #else
  1343. Destroy(rt);
  1344. #endif
  1345. rt = null;
  1346. }
  1347. static public void DisposeRenderTextures(ref RenderTexture[] rts)
  1348. {
  1349. if (rts == null) return;
  1350. TC_Reporter.Log("DisposeRenderTextures");
  1351. for (int i = 0; i < rts.Length; i++)
  1352. {
  1353. if (rts[i] == null) continue;
  1354. // Debug.Log("Dispose RenderTexture " + renderTextures[i].name);
  1355. rts[i].Release();
  1356. #if UNITY_EDITOR
  1357. DestroyImmediate(rts[i]);
  1358. #else
  1359. Destroy(rts[i]);
  1360. #endif
  1361. rts[i] = null;
  1362. }
  1363. }
  1364. static public void DisposeTexture(ref Texture2D tex)
  1365. {
  1366. if (tex == null) return;
  1367. #if UNITY_EDITOR
  1368. DestroyImmediate(tex);
  1369. #else
  1370. Destroy(tex);
  1371. #endif
  1372. tex = null;
  1373. }
  1374. static public void DisposeTextures(ref Texture2D[] textures)
  1375. {
  1376. for (int i = 0; i < textures.Length; i++) DisposeTexture(ref textures[i]);
  1377. }
  1378. public void InitBytesArray(int length)
  1379. {
  1380. TC_Reporter.Log("InitByteArray");
  1381. bool create = false;
  1382. if (bytesArray == null) create = true;
  1383. else
  1384. {
  1385. if (bytesArray.Length != length) { create = true; }
  1386. else
  1387. {
  1388. for (int i = 0; i < bytesArray.Length; i++)
  1389. {
  1390. if (bytesArray[i] == null) { create = true; break; }
  1391. }
  1392. }
  1393. }
  1394. if (create)
  1395. {
  1396. bytesArray = new BytesArray[length];
  1397. for (int i = 0; i < length; i++) bytesArray[i] = new BytesArray();
  1398. }
  1399. }
  1400. public class BytesArray
  1401. {
  1402. public byte[] bytes;
  1403. }
  1404. //float Evaluate(float t)
  1405. //{
  1406. // if (t > curve.keys[c.Length].time) t = curve.keys[c.Length].time;
  1407. // if (t < curve.keys[0].time) t = curve.keys[0].time;
  1408. // // Reporter.Log(t);
  1409. // int i = 0;
  1410. // for (int j = 1; j < c.Length + 1; j++)
  1411. // {
  1412. // if (curve.keys[j].time >= t) { i = j - 1; break; }
  1413. // }
  1414. // Reporter.Log(i);
  1415. // return c[i].x * t * t * t + c[i].y * t * t + c[i].z * t + c[i].w;
  1416. //}
  1417. }
  1418. }