MegaFFD3x3x3.cs 1.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. using UnityEngine;
  2. [AddComponentMenu("Modifiers/FFD/FFD 3x3x3")]
  3. public class MegaFFD3x3x3 : MegaFFD
  4. {
  5. public override string ModName() { 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. float ip,jp,kp;
  23. float sx = 1.0f - pp.x;
  24. float sy = 1.0f - pp.y;
  25. float sz = 1.0f - pp.z;
  26. for ( int i = 0; i < 3; i++ )
  27. {
  28. if ( i == 0 )
  29. ip = sx * sx;
  30. else
  31. {
  32. if ( i == 1 )
  33. ip = 2.0f * pp.x * sx;
  34. else
  35. ip = pp.x * pp.x;
  36. }
  37. for ( int j = 0; j < 3; j++ )
  38. {
  39. if ( j == 0 )
  40. jp = ip * sy * sy;
  41. else
  42. {
  43. if ( j == 1 )
  44. jp = ip * 2.0f * pp.y * sy;
  45. else
  46. jp = ip * pp.y * pp.y;
  47. }
  48. for ( int k = 0; k < 3; k++ )
  49. {
  50. if ( k == 0 )
  51. kp = jp * sz * sz;
  52. else
  53. {
  54. if ( k == 1 )
  55. kp = jp * 2.0f * pp.z * sz;
  56. else
  57. kp = jp * pp.z * pp.z;
  58. }
  59. int ix = (i * 9) + (j * 3) + k;
  60. q.x += pt[ix].x * kp;
  61. q.y += pt[ix].y * kp;
  62. q.z += pt[ix].z * kp;
  63. }
  64. }
  65. }
  66. return invtm.MultiplyPoint3x4(q);
  67. }
  68. public override int GridIndex(int i, int j, int k)
  69. {
  70. return (i * 9) + (j * 3) + k;
  71. }
  72. }