MegaFFD4x4x4.cs 1.7 KB

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