MegaWarpBind.cs 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  1. using UnityEngine;
  2. [AddComponentMenu("Modifiers/Warps/Bind")]
  3. public class MegaWarpBind : MegaModifier
  4. {
  5. public GameObject SourceWarpObj; // TODO: or point at mod on the warp
  6. GameObject current;
  7. public float decay = 0.0f;
  8. MegaWarp warp;
  9. public override string ModName() { return "WarpBind"; }
  10. public override string GetHelpURL() { return "?page_id=576"; }
  11. [ContextMenu("Add To Siblings")]
  12. public void AddSiblings()
  13. {
  14. Transform parent = transform.parent;
  15. MegaModifyObject thismod = GetComponent<MegaModifyObject>();
  16. for ( int i = 0; i < parent.childCount; i++ )
  17. {
  18. Transform child = parent.GetChild(i);
  19. MegaWarpBind bind = child.gameObject.GetComponent<MegaWarpBind>();
  20. if ( !bind )
  21. {
  22. bind = child.gameObject.AddComponent<MegaWarpBind>();
  23. MegaModifyObject mod = child.gameObject.GetComponent<MegaModifyObject>();
  24. mod.NormalMethod = thismod.NormalMethod;
  25. bind.SetTarget(SourceWarpObj);
  26. }
  27. }
  28. }
  29. public override Vector3 Map(int i, Vector3 p)
  30. {
  31. // Get point to World Space as its a WSM
  32. p = tm.MultiplyPoint3x4(p);
  33. // So this mod should transform world point into local space of mod (gizmo offset if OSM, node tm if warp)
  34. p = warp.Map(i, p);
  35. return invtm.MultiplyPoint3x4(p);
  36. }
  37. public override bool ModLateUpdate(MegaModContext mc)
  38. {
  39. return Prepare(mc);
  40. }
  41. public override bool Prepare(MegaModContext mc)
  42. {
  43. if ( SourceWarpObj != current )
  44. {
  45. current = SourceWarpObj;
  46. warp = null;
  47. }
  48. if ( SourceWarpObj != null )
  49. {
  50. if ( warp == null )
  51. warp = SourceWarpObj.GetComponent<MegaWarp>();
  52. if ( warp != null && warp.Enabled )
  53. {
  54. tm = transform.localToWorldMatrix;
  55. invtm = tm.inverse;
  56. return warp.Prepare(decay);
  57. }
  58. }
  59. return false;
  60. }
  61. public void SetTarget(GameObject go)
  62. {
  63. SourceWarpObj = go;
  64. }
  65. public override void Modify(MegaModifiers mc)
  66. {
  67. for ( int i = 0; i < verts.Length; i++ )
  68. {
  69. Vector3 p = tm.MultiplyPoint3x4(verts[i]);
  70. // So this mod should transform world point into local space of mod (gizmo offset if OSM, node tm if warp)
  71. p = warp.Map(i, p);
  72. sverts[i] = invtm.MultiplyPoint3x4(p);
  73. }
  74. }
  75. public override void ModStart(MegaModifiers mc)
  76. {
  77. if ( SourceWarpObj != null && SourceWarpObj != current )
  78. {
  79. current = SourceWarpObj;
  80. warp = SourceWarpObj.GetComponent<MegaWarp>();
  81. }
  82. }
  83. }