TC_Node.cs 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394
  1. using UnityEngine;
  2. using System;
  3. using System.IO;
  4. using System.Collections;
  5. using System.Collections.Generic;
  6. namespace TerrainComposer2
  7. {
  8. public class TC_Node : TC_ItemBehaviour
  9. {
  10. public InputKind inputKind;
  11. public InputTerrain inputTerrain;
  12. public InputNoise inputNoise;
  13. public InputShape inputShape;
  14. public InputFile inputFile;
  15. public InputCurrent inputCurrent;
  16. public InputPortal inputPortal;
  17. public NodeGroupType nodeType;
  18. public CollisionMode collisionMode;
  19. public CollisionDirection collisionDirection;
  20. public BlurMode blurMode;
  21. public int nodeGroupLevel;
  22. public ImageWrapMode wrapMode = ImageWrapMode.Repeat;
  23. public bool clamp;
  24. public float radius = 300;
  25. public TC_RawImage rawImage;
  26. public TC_Image image;
  27. public ImageSettings imageSettings;
  28. public bool square;
  29. public int splatSelectIndex;
  30. public Noise noise;
  31. public Shapes shapes;
  32. public int iterations = 1;
  33. public Vector2 detectRange = new Vector2(1.0f / 255f, 1.0f / 255f);
  34. public int mipmapLevel = 1;
  35. public ConvexityMode convexityMode;
  36. public float convexityStrength = 5;
  37. public Texture stampTex;
  38. // public Texture[] texArray;
  39. public string pathTexStamp = "";
  40. public bool isStampInResourcesFolder;
  41. public string resourcesFolder;
  42. public float posYOld;
  43. public int collisionMask = -1;
  44. public bool heightDetectRange;
  45. public bool includeTerrainHeight = true;
  46. public Vector2 range;
  47. public bool useConstant;
  48. public Vector3 size = new Vector3(2048, 0, 2048);
  49. [Serializable]
  50. public class Shapes
  51. {
  52. public Vector2 topSize = new Vector2(500, 500);
  53. public Vector2 bottomSize = new Vector2(1000,1000);
  54. public float size = 500;
  55. }
  56. public override void Awake()
  57. {
  58. base.Awake();
  59. if (rawImage != null) rawImage.referenceCount++;
  60. if (image != null) image.referenceCount++;
  61. // Debug.Log("Awake");
  62. }
  63. public override void OnDestroy()
  64. {
  65. base.OnDestroy();
  66. // Debug.Log("Node " + UnityEditor.EditorApplication.isPlayingOrWillChangePlaymode + " --- "+ UnityEditor.EditorApplication.isPlaying);
  67. #if UNITY_EDITOR
  68. if (UnityEditor.EditorApplication.isPlayingOrWillChangePlaymode || UnityEditor.EditorApplication.isPlaying) return;
  69. #endif
  70. if (rawImage != null) rawImage.UnregisterReference();
  71. if (image != null) image.UnregisterReference();
  72. }
  73. public void SetDefaultSettings()
  74. {
  75. size = TC_Settings.instance.global.defaultTerrainSize;
  76. if (transform.parent.GetSiblingIndex() == 0)
  77. {
  78. inputKind = InputKind.Shape;
  79. inputShape = InputShape.Circle;
  80. wrapMode = ImageWrapMode.Clamp;
  81. }
  82. else if (outputId == TC.heightOutput)
  83. {
  84. inputKind = InputKind.File;
  85. inputFile = InputFile.RawImage;
  86. wrapMode = ImageWrapMode.Clamp;
  87. }
  88. }
  89. public void CheckTransformChange()
  90. {
  91. // Debug.Log("check tansform change");
  92. if (ctOld.hasChanged(this))
  93. {
  94. TC.AutoGenerate();
  95. // Debug.Log(t.name);
  96. ctOld.Copy(this);
  97. }
  98. }
  99. public override void ChangeYPosition(float y)
  100. {
  101. #if UNITY_EDITOR
  102. // UnityEditor.Undo.RecordObject(t, "Edit Transform");
  103. UnityEditor.Undo.RecordObject(this, "Edit Transform");
  104. #endif
  105. posY += y / t.lossyScale.y;
  106. }
  107. public void CalcBounds()
  108. {
  109. // if (bounds == null) bounds = new Bounds();
  110. bounds.center = t.position;
  111. bounds.size = Vector3.Scale(new Vector3(1000, 100, 1000), t.lossyScale);
  112. }
  113. public bool OutOfBounds()
  114. {
  115. // Debug.Log(bounds + " " + Area2D.current.bounds);
  116. if (bounds.Intersects(TC_Area2D.current.bounds)) return false;
  117. else
  118. {
  119. TC_Reporter.Log(name + " Out of bounds!");
  120. return true;
  121. }
  122. }
  123. public Enum GetInputPopup()
  124. {
  125. if (inputKind == InputKind.Terrain)
  126. {
  127. if (outputId == TC.heightOutput)
  128. {
  129. InputTerrainHeight inputTerrainHeight = InputTerrainHeight.Collision;
  130. return inputTerrainHeight;
  131. }
  132. else return inputTerrain;
  133. }
  134. else if (inputKind == InputKind.Noise) return inputNoise;
  135. else if (inputKind == InputKind.Shape) return inputShape;
  136. else if (inputKind == InputKind.File) return inputFile;
  137. else if (inputKind == InputKind.Current) return inputCurrent;
  138. else if (inputKind == InputKind.Portal) return inputPortal;
  139. return null;
  140. }
  141. public void SetInputPopup(Enum popup)
  142. {
  143. if (inputKind == InputKind.Terrain) inputTerrain = (InputTerrain)popup;
  144. else if (inputKind == InputKind.Noise) inputNoise = (InputNoise)popup;
  145. else if (inputKind == InputKind.Shape) inputShape = (InputShape)popup;
  146. else if (inputKind == InputKind.File) inputFile = (InputFile)popup;
  147. else if (inputKind == InputKind.Current) inputCurrent = (InputCurrent)popup;
  148. // else if (inputKind == InputKind.Portal) inputPortal = (InputPortal)popup;
  149. }
  150. public void Init()
  151. {
  152. // Debug.Log("Init");
  153. if (inputKind == InputKind.Terrain)
  154. {
  155. if (inputTerrain == InputTerrain.Normal) { active = false; }
  156. }
  157. if (inputKind == InputKind.Noise)
  158. {
  159. if (noise == null) noise = new Noise();
  160. if (inputNoise == InputNoise.IQ || inputNoise == InputNoise.Swiss || inputNoise == InputNoise.Jordan)
  161. {
  162. if (noise.mode == NoiseMode.TextureLookup) noise.mode = NoiseMode.Normal;
  163. }
  164. }
  165. else if (inputKind == InputKind.Shape)
  166. {
  167. if (shapes == null) shapes = new Shapes();
  168. }
  169. else if (inputKind == InputKind.File)
  170. {
  171. if (inputFile == InputFile.RawImage)
  172. {
  173. if (rawImage != null && rawImage.tex != null && stampTex != null) { active = visible; return; }
  174. if (rawImage != null)
  175. {
  176. if (rawImage.tex == null) rawImage.LoadRawImage(rawImage.path);
  177. if (stampTex != null && rawImage.tex != null) { active = visible; return; }
  178. }
  179. if (stampTex == null)
  180. {
  181. #if UNITY_EDITOR
  182. if (pathTexStamp != "")
  183. {
  184. stampTex = UnityEditor.AssetDatabase.LoadAssetAtPath(pathTexStamp, typeof(Texture2D)) as Texture2D;
  185. if (stampTex == null) { active = false; return; }
  186. }
  187. #endif
  188. if (pathTexStamp == "") { active = false; return; }
  189. }
  190. if (rawImage == null) DropTextureEditor(stampTex);
  191. if (rawImage == null)
  192. {
  193. active = false; stampTex = null;
  194. }
  195. else active = visible;
  196. }
  197. else if (inputFile == InputFile.Image)
  198. {
  199. if (stampTex == null) active = false;
  200. }
  201. }
  202. else if (inputKind == InputKind.Portal)
  203. {
  204. if (portalNode != null)
  205. {
  206. if (portalNode.isPortalCount > 0) active = visible; else active = false;
  207. }
  208. else active = false;
  209. }
  210. }
  211. public void UpdateVersion()
  212. {
  213. if (versionNumber == 0)
  214. {
  215. wrapMode = clamp ? ImageWrapMode.Clamp : ImageWrapMode.Repeat;
  216. size.y = 1024;
  217. if (inputKind == InputKind.Terrain)
  218. {
  219. if (inputTerrain == InputTerrain.Collision) inputTerrain = InputTerrain.Convexity;
  220. else if (inputTerrain == InputTerrain.Splatmap) inputTerrain = InputTerrain.Collision;
  221. else if (inputTerrain == InputTerrain.Convexity) inputTerrain = InputTerrain.Splatmap;
  222. }
  223. if (inputKind == InputKind.File && inputFile == InputFile.RawImage)
  224. {
  225. t.localScale = new Vector3(t.localScale.x, t.localScale.y, -t.localScale.z);
  226. }
  227. if (inputKind == InputKind.Noise)
  228. {
  229. if (inputNoise == InputNoise.Billow) inputNoise = InputNoise.Ridged;
  230. else if (inputNoise == InputNoise.Ridged) inputNoise = InputNoise.Billow;
  231. else if (inputNoise == InputNoise.IQ) inputNoise = InputNoise.Random;
  232. }
  233. SetVersionNumber();
  234. }
  235. }
  236. public bool DropTextureEditor(Texture tex)
  237. {
  238. #if UNITY_EDITOR
  239. if (tex != null)
  240. {
  241. pathTexStamp = UnityEditor.AssetDatabase.GetAssetPath(tex);
  242. string path = pathTexStamp;
  243. int index = path.LastIndexOf("/");
  244. path = path.Insert(index, "/RawFiles");
  245. index = path.IndexOf("/Resources/");
  246. isStampInResourcesFolder = (index != -1);
  247. if (isStampInResourcesFolder)
  248. {
  249. path = path.Substring(index + 11);
  250. path = path.Remove(path.Length - 4);
  251. resourcesFolder = path;
  252. // Debug.Log(path);
  253. }
  254. else
  255. {
  256. path = path.Remove(path.Length - 3) + "raw";
  257. if (!TC.FileExistsPath(path))
  258. {
  259. path = path.Remove(path.Length - 3) + "r16";
  260. }
  261. if (!TC.FileExistsPath(path))
  262. {
  263. // TC.AddMessage("Cannot find the file " + path.Remove(path.Length - 3, 3) + "\n\nThe file extension needs to be .raw or .r16");
  264. if (rawImage != null) rawImage.UnregisterReference();
  265. inputFile = InputFile.Image;
  266. stampTex = tex;
  267. TC.AutoGenerate();
  268. return false;
  269. }
  270. }
  271. TC_RawImage oldRawImage = rawImage;
  272. if (oldRawImage) oldRawImage.UnregisterReference();
  273. // Debug.Log(path);
  274. rawImage = TC_Settings.instance.AddRawFile(path, isStampInResourcesFolder);
  275. }
  276. #else
  277. if (isStampInResourcesFolder)
  278. {
  279. rawImage = TC_Settings.instance.AddRawFile(resourcesFolder, isStampInResourcesFolder);
  280. }
  281. #endif
  282. if (rawImage != null)
  283. {
  284. stampTex = tex;
  285. TC.RefreshOutputReferences(outputId, true);
  286. // TC_Reporter.Log(path);
  287. TC_Reporter.Log("Node index " + rawImage.name);
  288. return true;
  289. }
  290. else
  291. {
  292. TC.AddMessage("This is not a stamp preview image.\n\nThe raw heightmap file needs to be placed in a 'RawFiles' folder, then TC2 will automatically make a preview image one folder before it.\nThis image needs to be used for dropping on the node.", 0, 4);
  293. }
  294. return false;
  295. }
  296. }
  297. [Serializable]
  298. public class Noise
  299. {
  300. public NoiseMode mode;
  301. public CellNoiseMode cellMode;
  302. public float frequency = 100f;
  303. public float lacunarity = 2.0f;
  304. public int octaves = 6;
  305. public float persistence = 0.5f;
  306. public float seed = 0;
  307. public float amplitude = 7f;
  308. public float warp0 = 0.5f;
  309. public float warp = 0.25f;
  310. public float damp0 = 0.8f;
  311. public float damp = 1.0f;
  312. public float dampScale = 1.0f;
  313. public int cellType = 1;
  314. public int distanceFunction = 1;
  315. }
  316. [Serializable]
  317. public class ImageSettings
  318. {
  319. const int red = 0, green = 1, blue = 2, alpha = 3;
  320. public ColorSelectMode colSelectMode = ColorSelectMode.ColorRange;
  321. public ColChannel[] colChannels;
  322. public Int2 tiles = new Int2(1, 1);
  323. public ImageSettings()
  324. {
  325. colChannels = new ColChannel[4];
  326. for (int i = 0; i < 4; i++) colChannels[i] = new ColChannel();
  327. colChannels[3].active = false;
  328. }
  329. [Serializable]
  330. public class ColChannel
  331. {
  332. public bool active = true;
  333. public Vector2 range = new Vector2(0, 255);
  334. }
  335. }
  336. }