MegaFFD3x3x3Warp.cs 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. using UnityEngine;
  2. [AddComponentMenu("Modifiers/Warps/FFD 3x3x3")]
  3. public class MegaFFD3x3x3Warp : MegaFFDWarp
  4. {
  5. public override string WarpName() { return "FFD3x3x3"; }
  6. public override int GridSize()
  7. {
  8. return 3;
  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. for ( int i = 0; i < 3; i++ )
  30. {
  31. if ( i == 0 )
  32. ip = sx * sx;
  33. else
  34. {
  35. if ( i == 1 )
  36. ip = 2.0f * pp.x * sx;
  37. else
  38. ip = pp.x * pp.x;
  39. }
  40. for ( int j = 0; j < 3; j++ )
  41. {
  42. if ( j == 0 )
  43. jp = ip * sy * sy;
  44. else
  45. {
  46. if ( j == 1 )
  47. jp = ip * 2.0f * pp.y * sy;
  48. else
  49. jp = ip * pp.y * pp.y;
  50. }
  51. for ( int k = 0; k < 3; k++ )
  52. {
  53. if ( k == 0 )
  54. kp = jp * sz * sz;
  55. else
  56. {
  57. if ( k == 1 )
  58. kp = jp * 2.0f * pp.z * sz;
  59. else
  60. kp = jp * pp.z * pp.z;
  61. }
  62. int ix = (i * 9) + (j * 3) + k;
  63. q.x += pt[ix].x * kp;
  64. q.y += pt[ix].y * kp;
  65. q.z += pt[ix].z * kp;
  66. }
  67. }
  68. }
  69. q = Vector3.Lerp(ipp, q, dcy);
  70. return invtm.MultiplyPoint3x4(q);
  71. }
  72. public override int GridIndex(int i, int j, int k)
  73. {
  74. return (i * 9) + (j * 3) + k;
  75. }
  76. }