MegaRolled.cs 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. using UnityEngine;
  2. using System.Collections.Generic;
  3. [AddComponentMenu("Modifiers/Rolled")]
  4. public class MegaRolled : MegaModifier
  5. {
  6. public float radius = 1.0f;
  7. public Transform roller;
  8. public float splurge = 1.0f;
  9. public MegaAxis fwdaxis = MegaAxis.Z;
  10. Matrix4x4 mat = new Matrix4x4();
  11. Vector3[] offsets;
  12. Plane plane;
  13. float height = 0.0f;
  14. public override string ModName() { return "Rolled"; }
  15. public override string GetHelpURL() { return "?page_id=1292"; }
  16. public override Vector3 Map(int i, Vector3 p)
  17. {
  18. if ( i >= 0 )
  19. {
  20. p = tm.MultiplyPoint3x4(p); // tm may have an offset gizmo etc
  21. if ( p.z > rpos.z )
  22. {
  23. p.y *= delta; //height;
  24. p.x += (1.0f - delta) * splurge * p.x;
  25. p.z += (1.0f - delta) * splurge * (p.z - rpos.z);
  26. }
  27. p = invtm.MultiplyPoint3x4(p);
  28. }
  29. return p;
  30. }
  31. public override bool ModLateUpdate(MegaModContext mc)
  32. {
  33. return Prepare(mc);
  34. }
  35. Vector3 rpos;
  36. public bool clearoffsets = false;
  37. float delta = 0.0f;
  38. public override bool Prepare(MegaModContext mc)
  39. {
  40. if ( !roller )
  41. return false;
  42. rpos = transform.worldToLocalMatrix.MultiplyPoint3x4(roller.position);
  43. height = rpos.y - radius;
  44. if ( offsets == null || offsets.Length != mc.mod.verts.Length )
  45. offsets = new Vector3[mc.mod.verts.Length];
  46. mat = Matrix4x4.identity;
  47. SetAxis(mat);
  48. tm = Matrix4x4.identity;
  49. if ( clearoffsets )
  50. {
  51. clearoffsets = false;
  52. for ( int i = 0; i < offsets.Length; i++ )
  53. {
  54. offsets[i] = Vector3.zero;
  55. }
  56. }
  57. if ( height < mc.bbox.Size().y )
  58. delta = height / mc.bbox.Size().y;
  59. else
  60. delta = 1.0f;
  61. return true;
  62. }
  63. public override void PrepareMT(MegaModifiers mc, int cores)
  64. {
  65. }
  66. public override void DoWork(MegaModifiers mc, int index, int start, int end, int cores)
  67. {
  68. if ( index == 0 )
  69. Modify(mc);
  70. }
  71. }