1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889 |
- using UnityEngine;
- [AddComponentMenu("Modifiers/Bulge")]
- public class MegaBulge : MegaModifier
- {
- public Vector3 Amount = Vector3.zero;
- public Vector3 FallOff = Vector3.zero;
- public bool LinkFallOff = true;
- Vector3 per = Vector3.zero;
- float xsize;
- float ysize;
- float zsize;
- float size;
- float cx,cy,cz;
- Vector3 dcy = Vector3.zero;
- public override string ModName() { return "Bulge"; }
- public override string GetHelpURL() { return "?page_id=163"; }
- public override Vector3 Map(int i, Vector3 p)
- {
- p = tm.MultiplyPoint3x4(p);
- float xw,yw,zw;
- xw = p.x - cx; yw = p.y - cy; zw = p.z - cz;
- if ( xw == 0.0f && yw == 0.0f && zw == 0.0f )
- xw = yw = zw = 1.0f;
- float vdist = Mathf.Sqrt(xw * xw + yw * yw + zw * zw);
- float mfac = size / vdist;
- dcy.x = Mathf.Exp(-FallOff.x * Mathf.Abs(xw));
- if ( !LinkFallOff )
- {
- dcy.y = Mathf.Exp(-FallOff.y * Mathf.Abs(yw));
- dcy.z = Mathf.Exp(-FallOff.z * Mathf.Abs(zw));
- }
- else
- {
- dcy.y = dcy.z = dcy.x;
- }
- p.x = cx + xw + (Mathf.Sign(xw) * ((Mathf.Abs(xw * mfac) - Mathf.Abs(xw)) * per.x) * dcy.x);
- p.y = cy + yw + (Mathf.Sign(yw) * ((Mathf.Abs(yw * mfac) - Mathf.Abs(yw)) * per.y) * dcy.y);
- p.z = cz + zw + (Mathf.Sign(zw) * ((Mathf.Abs(zw * mfac) - Mathf.Abs(zw)) * per.z) * dcy.z);
- return invtm.MultiplyPoint3x4(p);
- }
- public override void ModStart(MegaModifiers mc)
- {
- xsize = bbox.max.x - bbox.min.x;
- ysize = bbox.max.y - bbox.min.y;
- zsize = bbox.max.z - bbox.min.z;
- size = (xsize > ysize) ? xsize : ysize;
- size = (zsize > size) ? zsize : size;
- size /= 2.0f;
- cx = bbox.center.x;
- cy = bbox.center.y;
- cz = bbox.center.z;
- // Get the percentage to spherify at this time
- per = Amount / 100.0f;
- }
- public override bool ModLateUpdate(MegaModContext mc)
- {
- return Prepare(mc);
- }
- public override bool Prepare(MegaModContext mc)
- {
- xsize = bbox.max.x - bbox.min.x;
- ysize = bbox.max.y - bbox.min.y;
- zsize = bbox.max.z - bbox.min.z;
- size = (xsize > ysize) ? xsize : ysize;
- size = (zsize > size) ? zsize : size;
- size /= 2.0f;
- cx = bbox.center.x;
- cy = bbox.center.y;
- cz = bbox.center.z;
- // Get the percentage to spherify at this time
- per = Amount / 100.0f;
- return true;
- }
- }
|