MegaFFD4x4x4Warp.cs 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  1. using UnityEngine;
  2. [AddComponentMenu("Modifiers/Warps/FFD 4x4x4")]
  3. public class MegaFFD4x4x4Warp : MegaFFDWarp
  4. {
  5. public override string WarpName() { return "FFD4x4x4"; }
  6. public override int GridSize()
  7. {
  8. return 4;
  9. }
  10. public override Vector3 Map(int ii, Vector3 p)
  11. {
  12. Vector3 q = Vector3.zero;
  13. Vector3 pp = tm.MultiplyPoint3x4(p);
  14. if ( inVol )
  15. {
  16. for ( int i = 0; i < 3; i++ )
  17. {
  18. if ( pp[i] < -EPSILON || pp[i] > 1.0f + EPSILON )
  19. return p;
  20. }
  21. }
  22. Vector3 ipp = pp;
  23. float dist = pp.magnitude;
  24. float dcy = Mathf.Exp(-totaldecay * Mathf.Abs(dist));
  25. float ip, jp, kp;
  26. float sx = 1.0f - pp.x;
  27. float sy = 1.0f - pp.y;
  28. float sz = 1.0f - pp.z;
  29. float sy2 = sy * sy;
  30. float py = pp.y * pp.y;
  31. float sz2 = sz * sz;
  32. float pz = pp.z * pp.z;
  33. for ( int i = 0; i < 4; i++ )
  34. {
  35. if ( i == 0 )
  36. ip = (sx * sx * sx);
  37. else
  38. {
  39. if ( i == 1 )
  40. ip = (3.0f * pp.x * sx * sx);
  41. else
  42. {
  43. if ( i == 2 )
  44. ip = (3.0f * pp.x * pp.x * sx);
  45. else
  46. ip = (pp.x * pp.x * pp.x);
  47. }
  48. }
  49. for ( int j = 0; j < 4; j++ )
  50. {
  51. if ( j == 0 )
  52. jp = ip * (sy * sy2);
  53. else
  54. {
  55. if ( j == 1 )
  56. jp = ip * (3.0f * pp.y * sy2);
  57. else
  58. {
  59. if ( j == 2 )
  60. jp = ip * (3.0f * py * sy);
  61. else
  62. jp = ip * (py * pp.y);
  63. }
  64. }
  65. for ( int k = 0; k < 4; k++ )
  66. {
  67. if ( k == 0 )
  68. kp = jp * (sz * sz2);
  69. else
  70. {
  71. if ( k == 1 )
  72. kp = jp * (3.0f * pp.z * sz2);
  73. else
  74. {
  75. if ( k == 2 )
  76. kp = jp * (3.0f * pz * sz);
  77. else
  78. kp = jp * (pz * pp.z);
  79. }
  80. }
  81. int ix = (i << 4) + (j << 2) + k;
  82. q.x += pt[ix].x * kp;
  83. q.y += pt[ix].y * kp;
  84. q.z += pt[ix].z * kp;
  85. }
  86. }
  87. }
  88. q = Vector3.Lerp(ipp, q, dcy);
  89. return invtm.MultiplyPoint3x4(q);
  90. }
  91. public override int GridIndex(int i, int j, int k)
  92. {
  93. return (i << 4) + (j << 2) + k;
  94. }
  95. }