/Assets/Mega-Fiers/Scripts/MegaFiers/Modifiers/MegaModifyObject.cs

https://bitbucket.org/isereda_visco/vuforiademoiosbuild · C# · 518 lines · 422 code · 85 blank · 11 comment · 100 complexity · cbec576d892c3f2664afbdfa4ba163f2 MD5 · raw file

  1. using UnityEngine;
  2. using System;
  3. using System.Collections.Generic;
  4. #if UNITY_EDITOR
  5. using UnityEditor;
  6. #endif
  7. // TODO: Have a move list in the inspector instead of order value
  8. [AddComponentMenu("Modifiers/Modify Object")]
  9. [ExecuteInEditMode]
  10. public class MegaModifyObject : MegaModifiers
  11. {
  12. [HideInInspector]
  13. public Mesh cachedMesh;
  14. public bool InvisibleUpdate = false;
  15. bool visible = true;
  16. int restorekeep = 0;
  17. private static int CompareOrder(MegaModifier m1, MegaModifier m2)
  18. {
  19. return m1.Order - m2.Order;
  20. }
  21. [ContextMenu("Resort")]
  22. public virtual void Resort()
  23. {
  24. BuildList();
  25. }
  26. [ContextMenu("Help")]
  27. public virtual void Help()
  28. {
  29. Application.OpenURL("http://www.west-racing.com/mf/?page_id=444");
  30. }
  31. [ContextMenu("Remove Modify Object (Keep deformed mesh)")]
  32. public virtual void RemoveKeep()
  33. {
  34. MegaModifier[] mods = GetComponents<MegaModifier>();
  35. for ( int i = 0; i < mods.Length; i++ )
  36. {
  37. if ( Application.isEditor )
  38. DestroyImmediate(mods[i]);
  39. else
  40. Destroy(mods[i]);
  41. }
  42. restorekeep = 1;
  43. if ( Application.isEditor )
  44. DestroyImmediate(this);
  45. else
  46. Destroy(this);
  47. }
  48. [ContextMenu("Remove Modify Object (Restore Mesh)")]
  49. public virtual void RemoveRestore()
  50. {
  51. MegaModifier[] mods = GetComponents<MegaModifier>();
  52. for ( int i = 0; i < mods.Length; i++ )
  53. {
  54. if ( Application.isEditor )
  55. DestroyImmediate(mods[i]);
  56. else
  57. Destroy(mods[i]);
  58. }
  59. restorekeep = 2;
  60. if ( Application.isEditor )
  61. DestroyImmediate(this);
  62. else
  63. Destroy(this);
  64. }
  65. void OnDestroy()
  66. {
  67. if ( mesh != cachedMesh )
  68. {
  69. if ( restorekeep == 0 || restorekeep == 2 )
  70. {
  71. if ( !SetMeshNew(gameObject, cachedMesh) )
  72. {
  73. if ( Application.isEditor )
  74. DestroyImmediate(mesh);
  75. else
  76. Destroy(mesh);
  77. }
  78. }
  79. }
  80. }
  81. void Start()
  82. {
  83. if ( dynamicMesh )
  84. cachedMesh = null;
  85. }
  86. void OnRenderObject()
  87. {
  88. if ( UpdateMode == MegaUpdateMode.OnRender )
  89. {
  90. ModifyObjectMT();
  91. }
  92. }
  93. public void GetMesh(bool force)
  94. {
  95. if ( mesh == null || cachedMesh == null || sverts.Length == 0 || mesh.vertexCount != sverts.Length || force )
  96. {
  97. if ( dynamicMesh )
  98. {
  99. cachedMesh = FindMesh(gameObject, out sourceObj);
  100. mesh = cachedMesh;
  101. if ( mesh.vertexCount != 0 )
  102. SetMeshData();
  103. }
  104. else
  105. {
  106. cachedMesh = FindMesh(gameObject, out sourceObj);
  107. mesh = MegaCopyObject.DupMesh(cachedMesh, "");
  108. SetMesh(gameObject, mesh);
  109. if ( mesh.vertexCount != 0 )
  110. SetMeshData();
  111. }
  112. }
  113. }
  114. void SetMeshData()
  115. {
  116. bbox = cachedMesh.bounds;
  117. sverts = new Vector3[cachedMesh.vertexCount];
  118. verts = cachedMesh.vertices;
  119. uvs = cachedMesh.uv;
  120. suvs = new Vector2[cachedMesh.uv.Length];
  121. cols = cachedMesh.colors;
  122. //BuildNormalMapping(cachedMesh, false);
  123. mods = GetComponents<MegaModifier>();
  124. Array.Sort(mods, CompareOrder);
  125. for ( int i = 0; i < mods.Length; i++ )
  126. {
  127. if ( mods[i] != null )
  128. {
  129. mods[i].SetModMesh(mesh);
  130. mods[i].ModStart(this); // Some mods like push error if we dont do this, put in error check and disable
  131. }
  132. }
  133. mapping = null;
  134. UpdateMesh = -1;
  135. }
  136. public void ModReset(MegaModifier m)
  137. {
  138. if ( m != null )
  139. {
  140. m.SetModMesh(cachedMesh);
  141. BuildList();
  142. }
  143. }
  144. // Check, do we need these?
  145. void Update()
  146. {
  147. GetMesh(false);
  148. if ( visible || InvisibleUpdate )
  149. {
  150. if ( UpdateMode == MegaUpdateMode.Update )
  151. ModifyObjectMT();
  152. }
  153. }
  154. void LateUpdate()
  155. {
  156. if ( visible || InvisibleUpdate )
  157. {
  158. if ( UpdateMode == MegaUpdateMode.LateUpdate )
  159. ModifyObjectMT();
  160. }
  161. }
  162. void OnBecameVisible()
  163. {
  164. visible = true;
  165. }
  166. void OnBecameInvisible()
  167. {
  168. visible = false;
  169. }
  170. [ContextMenu("Reset")]
  171. public void Reset()
  172. {
  173. ResetMeshInfo();
  174. }
  175. // Mesh related stuff
  176. [ContextMenu("Reset Mesh Info")]
  177. public void ResetMeshInfo()
  178. {
  179. if ( mods != null )
  180. {
  181. if ( mods.Length > 0 )
  182. {
  183. mesh.vertices = mods[0].verts; //_verts; // mesh.vertices = GetVerts(true);
  184. }
  185. mesh.uv = uvs; //GetUVs(true);
  186. if ( recalcnorms )
  187. RecalcNormals();
  188. if ( recalcbounds )
  189. mesh.RecalculateBounds();
  190. }
  191. #if false
  192. if ( cachedMesh == null )
  193. cachedMesh = (Mesh)Mesh.Instantiate(FindMesh(gameObject, out sourceObj));
  194. GetMeshData(false);
  195. mesh.vertices = verts; //_verts; // mesh.vertices = GetVerts(true);
  196. mesh.uv = uvs; //GetUVs(true);
  197. if ( recalcnorms )
  198. RecalcNormals();
  199. if ( recalcbounds )
  200. mesh.RecalculateBounds();
  201. #endif
  202. }
  203. #if false
  204. void Reset()
  205. {
  206. if ( cachedMesh == null )
  207. cachedMesh = (Mesh)Mesh.Instantiate(FindMesh(gameObject, out sourceObj));
  208. BuildList();
  209. ReStart1(true);
  210. }
  211. #endif
  212. // Called by my scripts when the mesh has changed
  213. public void MeshUpdated()
  214. {
  215. GetMesh(true);
  216. //cachedMesh = (Mesh)Mesh.Instantiate(FindMesh(gameObject, out sourceObj));
  217. //GetMeshData(true);
  218. foreach ( MegaModifier mod in mods ) // Added back in?
  219. mod.SetModMesh(cachedMesh);
  220. }
  221. // Replace mesh data with data from newmesh, called from scripts not used internally
  222. public void MeshChanged(Mesh newmesh)
  223. {
  224. if ( mesh )
  225. {
  226. mesh.vertices = newmesh.vertices;
  227. mesh.normals = newmesh.normals;
  228. mesh.uv = newmesh.uv;
  229. #if UNITY_5_0 || UNITY_5_1 || UNITY_5 || UNITY_2017
  230. mesh.uv2 = newmesh.uv2;
  231. mesh.uv3 = newmesh.uv3;
  232. mesh.uv4 = newmesh.uv4;
  233. #else
  234. mesh.uv1 = newmesh.uv1;
  235. mesh.uv2 = newmesh.uv2;
  236. #endif
  237. mesh.colors = newmesh.colors;
  238. mesh.tangents = newmesh.tangents;
  239. mesh.subMeshCount = newmesh.subMeshCount;
  240. for ( int i = 0; i < newmesh.subMeshCount; i++ )
  241. mesh.SetTriangles(newmesh.GetTriangles(i), i);
  242. bbox = newmesh.bounds;
  243. sverts = new Vector3[mesh.vertexCount];
  244. verts = mesh.vertices;
  245. uvs = mesh.uv;
  246. suvs = new Vector2[mesh.uv.Length];
  247. cols = mesh.colors;
  248. //BuildNormalMapping(cachedMesh, false);
  249. mods = GetComponents<MegaModifier>();
  250. Array.Sort(mods, CompareOrder);
  251. foreach ( MegaModifier mod in mods )
  252. {
  253. if ( mod != null )
  254. {
  255. mod.SetModMesh(newmesh);
  256. mod.ModStart(this); // Some mods like push error if we dont do this, put in error check and disable
  257. }
  258. }
  259. mapping = null;
  260. UpdateMesh = -1;
  261. }
  262. }
  263. #if false
  264. public void GetMeshData(bool force)
  265. {
  266. if ( force || mesh == null )
  267. mesh = FindMesh1(gameObject, out sourceObj); //Utils.GetMesh(gameObject);
  268. // Do we use mesh anymore
  269. if ( mesh != null ) // was mesh
  270. {
  271. bbox = cachedMesh.bounds;
  272. sverts = new Vector3[cachedMesh.vertexCount];
  273. verts = cachedMesh.vertices;
  274. uvs = cachedMesh.uv;
  275. suvs = new Vector2[cachedMesh.uv.Length];
  276. cols = cachedMesh.colors;
  277. //BuildNormalMapping(cachedMesh, false);
  278. mods = GetComponents<MegaModifier>();
  279. Array.Sort(mods, CompareOrder);
  280. for ( int i = 0; i < mods.Length; i++ )
  281. {
  282. if ( mods[i] != null )
  283. mods[i].ModStart(this); // Some mods like push error if we dont do this, put in error check and disable
  284. }
  285. }
  286. UpdateMesh = -1;
  287. }
  288. #endif
  289. public void SetMesh(GameObject go, Mesh mesh)
  290. {
  291. if ( go )
  292. {
  293. Transform[] trans = (Transform[])go.GetComponentsInChildren<Transform>(true);
  294. for ( int i = 0; i < trans.Length; i++ )
  295. {
  296. MeshFilter mf = (MeshFilter)trans[i].GetComponent<MeshFilter>();
  297. if ( mf )
  298. {
  299. mf.sharedMesh = mesh;
  300. return;
  301. }
  302. SkinnedMeshRenderer skin = (SkinnedMeshRenderer)trans[i].GetComponent<SkinnedMeshRenderer>();
  303. if ( skin )
  304. {
  305. skin.sharedMesh = mesh;
  306. return;
  307. }
  308. }
  309. }
  310. }
  311. static public Mesh FindMesh(GameObject go, out GameObject obj)
  312. {
  313. if ( go )
  314. {
  315. Transform[] trans = (Transform[])go.GetComponentsInChildren<Transform>(true);
  316. for ( int i = 0; i < trans.Length; i++ )
  317. {
  318. MeshFilter mf = (MeshFilter)trans[i].GetComponent<MeshFilter>();
  319. if ( mf )
  320. {
  321. if ( mf.gameObject != go )
  322. obj = mf.gameObject;
  323. else
  324. obj = null;
  325. return mf.sharedMesh;
  326. }
  327. SkinnedMeshRenderer skin = (SkinnedMeshRenderer)trans[i].GetComponent<SkinnedMeshRenderer>();
  328. if ( skin )
  329. {
  330. if ( skin.gameObject != go )
  331. obj = skin.gameObject;
  332. else
  333. obj = null;
  334. return skin.sharedMesh;
  335. }
  336. }
  337. }
  338. obj = null;
  339. return null;
  340. }
  341. static public Mesh FindMesh(GameObject go)
  342. {
  343. if ( go )
  344. {
  345. Transform[] trans = (Transform[])go.GetComponentsInChildren<Transform>(true);
  346. for ( int i = 0; i < trans.Length; i++ )
  347. {
  348. MeshFilter mf = (MeshFilter)trans[i].GetComponent<MeshFilter>();
  349. if ( mf )
  350. {
  351. return mf.sharedMesh;
  352. }
  353. SkinnedMeshRenderer skin = (SkinnedMeshRenderer)trans[i].GetComponent<SkinnedMeshRenderer>();
  354. if ( skin )
  355. {
  356. return skin.sharedMesh;
  357. }
  358. }
  359. }
  360. return null;
  361. }
  362. static public bool SetMeshNew(GameObject go, Mesh m)
  363. {
  364. if ( go )
  365. {
  366. Transform[] trans = (Transform[])go.GetComponentsInChildren<Transform>(true);
  367. for ( int i = 0; i < trans.Length; i++ )
  368. {
  369. MeshFilter mf = (MeshFilter)trans[i].GetComponent<MeshFilter>();
  370. if ( mf )
  371. {
  372. mf.sharedMesh = m;
  373. return true;
  374. }
  375. SkinnedMeshRenderer skin = (SkinnedMeshRenderer)trans[i].GetComponent<SkinnedMeshRenderer>();
  376. if ( skin )
  377. {
  378. skin.sharedMesh = m;
  379. return true;
  380. }
  381. }
  382. }
  383. return false;
  384. }
  385. #if false
  386. public Mesh FindMesh1(GameObject go, out GameObject obj)
  387. {
  388. if ( go )
  389. {
  390. MeshFilter[] filters = (MeshFilter[])go.GetComponentsInChildren<MeshFilter>(true);
  391. if ( filters.Length > 0 )
  392. {
  393. if ( filters[0].gameObject != go )
  394. obj = filters[0].gameObject;
  395. else
  396. obj = null;
  397. return filters[0].mesh;
  398. }
  399. SkinnedMeshRenderer[] skins = (SkinnedMeshRenderer[])go.GetComponentsInChildren<SkinnedMeshRenderer>(true);
  400. if ( skins.Length > 0 )
  401. {
  402. if ( skins[0].gameObject != go )
  403. obj = skins[0].gameObject;
  404. else
  405. obj = null;
  406. return skins[0].sharedMesh;
  407. }
  408. }
  409. obj = null;
  410. return null;
  411. }
  412. #endif
  413. #if false
  414. void RestoreMesh(GameObject go, Mesh mesh)
  415. {
  416. if ( go )
  417. {
  418. MeshFilter[] filters = (MeshFilter[])go.GetComponentsInChildren<MeshFilter>(true);
  419. if ( filters.Length > 0 )
  420. {
  421. filters[0].sharedMesh = (Mesh)Instantiate(mesh);
  422. return;
  423. }
  424. SkinnedMeshRenderer[] skins = (SkinnedMeshRenderer[])go.GetComponentsInChildren<SkinnedMeshRenderer>(true);
  425. if ( skins.Length > 0 )
  426. {
  427. skins[0].sharedMesh = (Mesh)Instantiate(mesh);
  428. return;
  429. }
  430. }
  431. }
  432. #endif
  433. }