MegaDisplaceLimits.cs 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118
  1. using UnityEngine;
  2. [AddComponentMenu("Modifiers/Displace Limits")]
  3. public class MegaDisplaceLimits : MegaModifier
  4. {
  5. public Texture2D map;
  6. public float amount = 0.0f;
  7. public Vector2 offset = Vector2.zero;
  8. public float vertical = 0.0f;
  9. public Vector2 scale = Vector2.one;
  10. public MegaChannel channel = MegaChannel.Red;
  11. public bool CentLum = true;
  12. public float CentVal = 0.5f;
  13. public float Decay = 0.0f;
  14. public Vector3 origin = Vector3.zero;
  15. public Vector3 size = Vector3.one;
  16. [HideInInspector]
  17. public Vector2[] uvs;
  18. [HideInInspector]
  19. public Vector3[] normals;
  20. public override string ModName() { return "Displace"; }
  21. public override string GetHelpURL() { return "?page_id=168"; }
  22. public override MegaModChannel ChannelsReq() { return MegaModChannel.Verts | MegaModChannel.UV; }
  23. public override MegaModChannel ChannelsChanged() { return MegaModChannel.Verts; }
  24. [ContextMenu("Init")]
  25. public virtual void Init()
  26. {
  27. MegaModifyObject mod = (MegaModifyObject)GetComponent<MegaModifyObject>();
  28. uvs = mod.cachedMesh.uv;
  29. normals = mod.cachedMesh.normals;
  30. }
  31. public override void MeshChanged()
  32. {
  33. Init();
  34. }
  35. public override Vector3 Map(int i, Vector3 p)
  36. {
  37. p = tm.MultiplyPoint3x4(p);
  38. if ( i >= 0 )
  39. {
  40. Vector3 bp = p - origin;
  41. if ( Mathf.Abs(bp.x) < size.x && Mathf.Abs(bp.y) < size.y && Mathf.Abs(bp.z) < size.z )
  42. {
  43. Vector2 uv = Vector2.Scale(uvs[i] + offset, scale);
  44. Color col = map.GetPixelBilinear(uv.x, uv.y);
  45. float str = amount;
  46. if ( Decay != 0.0f )
  47. str *= (float)Mathf.Exp(-Decay * bp.magnitude);
  48. if ( CentLum )
  49. str *= (col[(int)channel] + CentVal);
  50. else
  51. str *= (col[(int)channel]);
  52. float of = col[(int)channel] * str;
  53. p.x += (normals[i].x * of) + (normals[i].x * vertical);
  54. p.y += (normals[i].y * of) + (normals[i].y * vertical);
  55. p.z += (normals[i].z * of) + (normals[i].z * vertical);
  56. }
  57. }
  58. return invtm.MultiplyPoint3x4(p);
  59. }
  60. public override void Modify(MegaModifiers mc)
  61. {
  62. for ( int i = 0; i < verts.Length; i++ )
  63. sverts[i] = Map(i, verts[i]);
  64. }
  65. public override bool ModLateUpdate(MegaModContext mc)
  66. {
  67. return Prepare(mc);
  68. }
  69. public override bool Prepare(MegaModContext mc)
  70. {
  71. if ( uvs == null || uvs.Length == 0 )
  72. uvs = mc.mod.mesh.uv;
  73. if ( normals == null || normals.Length == 0 )
  74. {
  75. MegaModifyObject mobj = (MegaModifyObject)GetComponent<MegaModifyObject>();
  76. if ( mobj )
  77. normals = mobj.cachedMesh.normals;
  78. else
  79. normals = mc.mod.mesh.normals;
  80. }
  81. if ( uvs.Length == 0 )
  82. return false;
  83. if ( normals.Length == 0 )
  84. return false;
  85. if ( map == null )
  86. return false;
  87. return true;
  88. }
  89. public override void DrawGizmo(MegaModContext context)
  90. {
  91. base.DrawGizmo(context);
  92. Gizmos.color = Color.yellow;
  93. Gizmos.DrawWireCube(origin, size * 2.0f);
  94. }
  95. }