123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197 |
- using UnityEngine;
- [AddComponentMenu("Modifiers/Page Flip")]
- public class MegaPageFlip : MegaModifier
- {
- public bool animT = false;
- public bool autoMode = true;
- public bool lockRho = true;
- public bool lockTheta = true;
- public float timeStep = 0.01f;
- public float rho = 0.0f;
- public float theta = 0.0f;
- public float deltaT = 0.0f;
- public float kT = 1.0f;
- public float turn = 0.0f;
- public float ap1 = -15.0f;
- public float ap2 = -2.5f;
- public float ap3 = -3.5f;
- public bool flipx = true;
- //Vector2 _pageSize;
- Vector3 apex = new Vector3(0.0f, 0.0f, -3.0f);
- Vector3 _cornerP;
- Vector3 _pageOrigin;
- float fx = 1.0f;
- public void calcAuto(float t)
- {
- float num = 90.0f * Mathf.Deg2Rad;
- if ( t == 0.0f )
- {
- rho = 0.0f;
- theta = num;
- apex.z = ap1; //-15.0f;
- }
- else
- {
- float num2;
- float num3;
- float num4;
- if ( t <= 0.15f )
- {
- num2 = t / 0.15f;
- num3 = Mathf.Sin((Mathf.PI * Mathf.Pow(num2, 0.05f)) / 2.0f);
- num4 = Mathf.Sin((Mathf.PI * Mathf.Pow(num2, 0.5f)) / 2.0f);
- rho = t * 180.0f;
- theta = funcLinear(num3, 90.0f * Mathf.Deg2Rad, 8.0f * Mathf.Deg2Rad);
- apex.z = funcLinear(num4, ap1, ap2); //-15.0f, -2.5f);
- }
- else
- {
- if ( t <= 0.4f )
- {
- num2 = (t - 0.15f) / 0.25f;
- rho = t * 180f;
- theta = funcLinear(num2, 8.0f * Mathf.Deg2Rad, 6.0f * Mathf.Deg2Rad);
- apex.z = funcLinear(num2, ap2, ap3); //-2.5f, -3.5f);
- }
- else
- {
- if ( t <= 1.0f )
- {
- num2 = (t - 0.4f) / 0.6f;
- rho = t * 180.0f;
- num3 = Mathf.Sin((Mathf.PI * Mathf.Pow(num2, 10.0f)) / 2.0f);
- num4 = Mathf.Sin((Mathf.PI * Mathf.Pow(num2, 2.0f)) / 2.0f);
- theta = funcLinear(num3, 6.0f * Mathf.Deg2Rad, 90.0f * Mathf.Deg2Rad);
- apex.z = funcLinear(num4, ap3, ap1); //-3.5f, -15.0f);
- }
- }
- }
- }
- }
- public float calcTheta(float _rho)
- {
- int num = 0;
- float num2 = 1.0f;
- float num3 = 0.05f;
- float num4 = 90.0f * Mathf.Deg2Rad;
- float num5 = (num2 - num3) * num4;
- float num6 = _rho / 180.0f;
- if ( num6 < 0.25f )
- num = (int)(num6 / 0.25f);
- else
- {
- if ( num6 < 0.5f )
- num = 1;
- else
- {
- if ( num6 <= 1.0f )
- num = (int)((1.0f - num6) * 0.5f);
- }
- }
- return (num4 - (num * num5));
- }
- public float calcTheta2(float t)
- {
- float num = 0.1f;
- float num2 = 45.0f * Mathf.Deg2Rad;
- float num3 = Mathf.Abs(1.0f - (t * 2.0f));
- return ((num * num2) + (num3 * num2));
- }
- public Vector3 curlTurn(Vector3 p)
- {
- float rhs = Mathf.Sqrt((p.x * p.x) + Mathf.Pow((p.z - apex.z), 2.0f));
- float num2 = rhs * Mathf.Sin(theta);
- float f = Mathf.Asin(p.x / rhs) / Mathf.Sin(theta);
- p.x = num2 * Mathf.Sin(f);
- p.z = (rhs + apex.z) - ((num2 * (1.0f - Mathf.Cos(f))) * Mathf.Sin(theta));
- p.y = (num2 * (1.0f - Mathf.Cos(f))) * Mathf.Cos(theta);
- return p;
- }
- #if false
- public Vector3 flatTurn(Vector3 p)
- {
- theta = (deltaT * Mathf.PI) * 2.0f;
- float rhs = p.x / _pageSize.x;
- p.x = Mathf.Cos(theta) * rhs * _pageSize.x;
- p.y = Mathf.Sin(theta) * rhs * _pageSize.x;
- return p;
- }
- #endif
- public float funcLinear(float ft, float f0, float f1)
- {
- return (f0 + ((f1 - f0) * ft));
- }
- public float funcQuad(float ft, float f0, float f1, float p)
- {
- return (f0 + ((f1 - f0) * Mathf.Pow(ft, p)));
- }
- public override string ModName() { return "PageFlip"; }
- public override string GetHelpURL() { return "?page_id=271"; }
- public Vector3 flatTurn1(Vector3 p)
- {
- float rhs = p.x;
- p.x = Mathf.Cos(rho * Mathf.Deg2Rad) * rhs;
- p.y = Mathf.Sin(rho * Mathf.Deg2Rad) * -rhs;
- return p;
- }
- public Vector3 rotpage(Vector3 p)
- {
- float x = p.x;
- float y = p.y;
- p.x = Mathf.Cos(rho * Mathf.Deg2Rad) * x + Mathf.Sin(rho * Mathf.Deg2Rad) * y;
- p.y = Mathf.Sin(rho * Mathf.Deg2Rad) * -x + Mathf.Cos(rho * Mathf.Deg2Rad) * y;
- return p;
- }
- public override Vector3 Map(int i, Vector3 p)
- {
- p = tm.MultiplyPoint3x4(p);
- p = curlTurn(p);
- p.x *= fx;
- p = rotpage(p);
- p.x *= fx;
- return invtm.MultiplyPoint3x4(p);
- }
- public override bool ModLateUpdate(MegaModContext mc)
- {
- return Prepare(mc);
- }
- public override bool Prepare(MegaModContext mc)
- {
- if ( flipx )
- fx = -1.0f;
- else
- fx = 1.0f;
- theta = 15.0f * Mathf.Deg2Rad;
- if ( turn < 0.0f )
- turn = 0.0f;
- if ( turn > 100.0f )
- turn = 100.0f;
- deltaT = turn / 100.0f;
- if ( animT )
- deltaT = (kT * Time.time) % 1.0f;
- if ( autoMode )
- calcAuto(deltaT);
- return true;
- }
- }
|