MegaFFD2x2x2Warp.cs 1.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. using UnityEngine;
  2. [AddComponentMenu("Modifiers/Warps/FFD 2x2x2")]
  3. public class MegaFFD2x2x2Warp : MegaFFDWarp
  4. {
  5. public override string WarpName() { return "FFD2x2x2"; }
  6. public override int GridSize()
  7. {
  8. return 2;
  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. //if ( pp.x < -hw || pp.x > hw || pp.y < -hh || pp.y > hh || pp.z < -hl || pp.z > hl )
  22. //if ( pp.x < 0.0f || pp.x > Width || pp.y < 0.0f || pp.y > Height || pp.z < 0.0f || pp.z > Length )
  23. //return p;
  24. }
  25. Vector3 ipp = pp;
  26. float dist = pp.magnitude;
  27. float dcy = Mathf.Exp(-totaldecay * Mathf.Abs(dist));
  28. float ip, jp, kp;
  29. for ( int i = 0; i < 2; i++ )
  30. {
  31. ip = i == 0 ? 1.0f - pp.x : pp.x;
  32. for ( int j = 0; j < 2; j++ )
  33. {
  34. jp = ip * (j == 0 ? 1.0f - pp.y : pp.y);
  35. for ( int k = 0; k < 2; k++ )
  36. {
  37. kp = jp * (k == 0 ? 1.0f - pp.z : pp.z);
  38. int ix = (i * 4) + (j * 2) + k;
  39. q.x += pt[ix].x * kp;
  40. q.y += pt[ix].y * kp;
  41. q.z += pt[ix].z * kp;
  42. }
  43. }
  44. }
  45. q = Vector3.Lerp(ipp, q, dcy);
  46. return invtm.MultiplyPoint3x4(q);
  47. }
  48. public override int GridIndex(int i, int j, int k)
  49. {
  50. return (i * 4) + (j * 2) + k;
  51. }
  52. }