123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510 |
- using UnityEngine;
- using System.Collections.Generic;
- using System.Threading;
- public enum MegaAlter
- {
- Offset,
- Scale,
- Both,
- }
- public enum MegaAffect
- {
- X,
- Y,
- Z,
- XY,
- XZ,
- YZ,
- XYZ,
- None,
- }
- // TODO: define box for effect, origin and sizes, and a falloff
- [System.Serializable]
- public class MegaSculptCurve
- {
- public MegaSculptCurve()
- {
- curve = new AnimationCurve(new Keyframe(0.0f, 0.0f), new Keyframe(1.0f, 0.0f));
- offamount = Vector3.one;
- sclamount = Vector3.one;
- axis = MegaAxis.X;
- affectOffset = MegaAffect.Y;
- affectScale = MegaAffect.None;
- enabled = true;
- weight = 1.0f;
- name = "None";
- uselimits = false;
- }
- public AnimationCurve curve = new AnimationCurve(new Keyframe(0.0f, 0.0f), new Keyframe(1.0f, 0.0f));
- public Vector3 offamount = Vector3.one;
- public Vector3 sclamount = Vector3.one;
- public MegaAxis axis = MegaAxis.X;
- public MegaAffect affectOffset = MegaAffect.Y;
- public MegaAffect affectScale = MegaAffect.None;
- public bool enabled = true;
- public float weight = 1.0f;
- public string name = "None";
- public Color regcol = Color.yellow;
- public Vector3 origin = Vector3.zero;
- public Vector3 boxsize = Vector3.one;
- public bool uselimits = false;
- public Vector3 size = Vector3.zero;
- static public MegaSculptCurve Create()
- {
- MegaSculptCurve crv = new MegaSculptCurve();
- return crv;
- }
- }
- [AddComponentMenu("Modifiers/Curve Sculpt Layered")]
- public class MegaCurveSculptLayered : MegaModifier
- {
- public List<MegaSculptCurve> curves = new List<MegaSculptCurve>();
- Vector3 size = Vector3.zero;
- public override string ModName() { return "CurveSculpLayered"; }
- public override string GetHelpURL() { return "?page_id=2411"; }
- static object resourceLock = new object();
- public override void DoWork(MegaModifiers mc, int index, int start, int end, int cores)
- {
- if ( selection != null )
- {
- DoWorkWeighted(mc, index, start, end, cores);
- return;
- }
- for ( int i = start; i < end; i++ )
- sverts[i] = MapMT(i, verts[i]);
- }
- public override void DoWorkWeighted(MegaModifiers mc, int index, int start, int end, int cores)
- {
- for ( int i = start; i < end; i++ )
- {
- Vector3 p = verts[i];
- float w = selection[i]; //[(int)weightChannel];
- if ( w > 0.001f )
- {
- Vector3 mp = MapMT(i, verts[i]);
- sverts[i].x = p.x + (mp.x - p.x) * w;
- sverts[i].y = p.y + (mp.y - p.y) * w;
- sverts[i].z = p.z + (mp.z - p.z) * w;
- }
- else
- sverts[i] = p; //verts[i];
- }
- }
- public Vector3 MapMT(int i, Vector3 p)
- {
- p = tm.MultiplyPoint3x4(p);
- for ( int c = 0; c < curves.Count; c++ )
- {
- MegaSculptCurve crv = curves[c];
- if ( crv.enabled )
- {
- int ax = (int)crv.axis;
- if ( crv.uselimits )
- {
- // Is the point in the box
- Vector3 bp = p - crv.origin;
- if ( Mathf.Abs(bp.x) < crv.size.x && Mathf.Abs(bp.y) < crv.size.y && Mathf.Abs(bp.z) < crv.size.z )
- {
- float alpha = 0.5f + ((bp[ax] / crv.size[ax]) * 0.5f);
- if ( alpha >= 0.0f && alpha <= 1.0f )
- {
- Monitor.Enter(resourceLock);
- float a = crv.curve.Evaluate(alpha) * crv.weight;
- Monitor.Exit(resourceLock);
- switch ( crv.affectScale )
- {
- case MegaAffect.X:
- p.x += bp.x * (a * crv.sclamount.x);
- break;
- case MegaAffect.Y:
- p.y += bp.y * (a * crv.sclamount.y);
- break;
- case MegaAffect.Z:
- p.z += bp.z * (a * crv.sclamount.z);
- break;
- case MegaAffect.XY:
- p.x += bp.x * (a * crv.sclamount.x);
- p.y += bp.y * (a * crv.sclamount.y);
- break;
- case MegaAffect.XZ:
- p.x += bp.x * (a * crv.sclamount.x);
- p.z += bp.z * (a * crv.sclamount.z);
- break;
- case MegaAffect.YZ:
- p.y += bp.y * (a * crv.sclamount.y);
- p.z += bp.z * (a * crv.sclamount.z);
- break;
- case MegaAffect.XYZ:
- p.x += bp.x * (a * crv.sclamount.x);
- p.y += bp.y * (a * crv.sclamount.y);
- p.z += bp.z * (a * crv.sclamount.z);
- break;
- }
- switch ( crv.affectOffset )
- {
- case MegaAffect.X:
- p.x += a * crv.offamount.x;
- break;
- case MegaAffect.Y:
- p.y += a * crv.offamount.y;
- break;
- case MegaAffect.Z:
- p.z += a * crv.offamount.z;
- break;
- case MegaAffect.XY:
- p.x += a * crv.offamount.x;
- p.y += a * crv.offamount.y;
- break;
- case MegaAffect.XZ:
- p.x += a * crv.offamount.x;
- p.z += a * crv.offamount.z;
- break;
- case MegaAffect.YZ:
- p.y += a * crv.offamount.y;
- p.z += a * crv.offamount.z;
- break;
- case MegaAffect.XYZ:
- p.x += a * crv.offamount.x;
- p.y += a * crv.offamount.y;
- p.z += a * crv.offamount.z;
- break;
- }
- }
- }
- }
- else
- {
- float alpha = (p[ax] - bbox.min[ax]) / size[ax];
- Monitor.Enter(resourceLock);
- float a = crv.curve.Evaluate(alpha) * crv.weight;
- Monitor.Exit(resourceLock);
- switch ( crv.affectScale )
- {
- case MegaAffect.X:
- p.x *= 1.0f + (a * crv.sclamount.y);
- break;
- case MegaAffect.Y:
- p.y *= 1.0f + (a * crv.sclamount.y);
- break;
- case MegaAffect.Z:
- p.z *= 1.0f + (a * crv.sclamount.z);
- break;
- case MegaAffect.XY:
- p.x *= 1.0f + (a * crv.sclamount.y);
- p.y *= 1.0f + (a * crv.sclamount.y);
- break;
- case MegaAffect.XZ:
- p.x *= 1.0f + (a * crv.sclamount.y);
- p.z *= 1.0f + (a * crv.sclamount.z);
- break;
- case MegaAffect.YZ:
- p.y *= 1.0f + (a * crv.sclamount.y);
- p.z *= 1.0f + (a * crv.sclamount.z);
- break;
- case MegaAffect.XYZ:
- p.x *= 1.0f + (a * crv.sclamount.y);
- p.y *= 1.0f + (a * crv.sclamount.y);
- p.z *= 1.0f + (a * crv.sclamount.z);
- break;
- }
- switch ( crv.affectOffset )
- {
- case MegaAffect.X:
- p.x += a * crv.offamount.x;
- break;
- case MegaAffect.Y:
- p.y += a * crv.offamount.y;
- break;
- case MegaAffect.Z:
- p.z += a * crv.offamount.z;
- break;
- case MegaAffect.XY:
- p.x += a * crv.offamount.x;
- p.y += a * crv.offamount.y;
- break;
- case MegaAffect.XZ:
- p.x += a * crv.offamount.x;
- p.z += a * crv.offamount.z;
- break;
- case MegaAffect.YZ:
- p.y += a * crv.offamount.y;
- p.z += a * crv.offamount.z;
- break;
- case MegaAffect.XYZ:
- p.x += a * crv.offamount.x;
- p.y += a * crv.offamount.y;
- p.z += a * crv.offamount.z;
- break;
- }
- }
- }
- }
- return invtm.MultiplyPoint3x4(p);
- }
- public override Vector3 Map(int i, Vector3 p)
- {
- p = tm.MultiplyPoint3x4(p);
- for ( int c = 0; c < curves.Count; c++ )
- {
- MegaSculptCurve crv = curves[c];
- if ( crv.enabled )
- {
- int ax = (int)crv.axis;
- if ( crv.uselimits )
- {
- // Is the point in the box
- Vector3 bp = p - crv.origin;
- if ( Mathf.Abs(bp.x) < crv.size.x && Mathf.Abs(bp.y) < crv.size.y && Mathf.Abs(bp.z) < crv.size.z )
- {
- float alpha = 0.5f + ((bp[ax] / crv.size[ax]) * 0.5f);
- if ( alpha >= 0.0f && alpha <= 1.0f )
- {
- float a = crv.curve.Evaluate(alpha) * crv.weight;
- switch ( crv.affectScale )
- {
- case MegaAffect.X:
- p.x += bp.x * (a * crv.sclamount.x);
- break;
- case MegaAffect.Y:
- p.y += bp.y * (a * crv.sclamount.y);
- break;
- case MegaAffect.Z:
- p.z += bp.z * (a * crv.sclamount.z);
- break;
- case MegaAffect.XY:
- p.x += bp.x * (a * crv.sclamount.x);
- p.y += bp.y * (a * crv.sclamount.y);
- break;
- case MegaAffect.XZ:
- p.x += bp.x * (a * crv.sclamount.x);
- p.z += bp.z * (a * crv.sclamount.z);
- break;
- case MegaAffect.YZ:
- p.y += bp.y * (a * crv.sclamount.y);
- p.z += bp.z * (a * crv.sclamount.z);
- break;
- case MegaAffect.XYZ:
- p.x += bp.x * (a * crv.sclamount.x);
- p.y += bp.y * (a * crv.sclamount.y);
- p.z += bp.z * (a * crv.sclamount.z);
- break;
- }
- switch ( crv.affectOffset )
- {
- case MegaAffect.X:
- p.x += a * crv.offamount.x;
- break;
- case MegaAffect.Y:
- p.y += a * crv.offamount.y;
- break;
- case MegaAffect.Z:
- p.z += a * crv.offamount.z;
- break;
- case MegaAffect.XY:
- p.x += a * crv.offamount.x;
- p.y += a * crv.offamount.y;
- break;
- case MegaAffect.XZ:
- p.x += a * crv.offamount.x;
- p.z += a * crv.offamount.z;
- break;
- case MegaAffect.YZ:
- p.y += a * crv.offamount.y;
- p.z += a * crv.offamount.z;
- break;
- case MegaAffect.XYZ:
- p.x += a * crv.offamount.x;
- p.y += a * crv.offamount.y;
- p.z += a * crv.offamount.z;
- break;
- }
- }
- }
- }
- else
- {
- float alpha = (p[ax] - bbox.min[ax]) / size[ax];
- float a = crv.curve.Evaluate(alpha) * crv.weight;
- switch ( crv.affectScale )
- {
- case MegaAffect.X:
- p.x *= 1.0f + (a * crv.sclamount.y);
- break;
- case MegaAffect.Y:
- p.y *= 1.0f + (a * crv.sclamount.y);
- break;
- case MegaAffect.Z:
- p.z *= 1.0f + (a * crv.sclamount.z);
- break;
- case MegaAffect.XY:
- p.x *= 1.0f + (a * crv.sclamount.y);
- p.y *= 1.0f + (a * crv.sclamount.y);
- break;
- case MegaAffect.XZ:
- p.x *= 1.0f + (a * crv.sclamount.y);
- p.z *= 1.0f + (a * crv.sclamount.z);
- break;
- case MegaAffect.YZ:
- p.y *= 1.0f + (a * crv.sclamount.y);
- p.z *= 1.0f + (a * crv.sclamount.z);
- break;
- case MegaAffect.XYZ:
- p.x *= 1.0f + (a * crv.sclamount.y);
- p.y *= 1.0f + (a * crv.sclamount.y);
- p.z *= 1.0f + (a * crv.sclamount.z);
- break;
- }
- switch ( crv.affectOffset )
- {
- case MegaAffect.X:
- p.x += a * crv.offamount.x;
- break;
- case MegaAffect.Y:
- p.y += a * crv.offamount.y;
- break;
- case MegaAffect.Z:
- p.z += a * crv.offamount.z;
- break;
- case MegaAffect.XY:
- p.x += a * crv.offamount.x;
- p.y += a * crv.offamount.y;
- break;
- case MegaAffect.XZ:
- p.x += a * crv.offamount.x;
- p.z += a * crv.offamount.z;
- break;
- case MegaAffect.YZ:
- p.y += a * crv.offamount.y;
- p.z += a * crv.offamount.z;
- break;
- case MegaAffect.XYZ:
- p.x += a * crv.offamount.x;
- p.y += a * crv.offamount.y;
- p.z += a * crv.offamount.z;
- break;
- }
- }
- }
- }
- return invtm.MultiplyPoint3x4(p);
- }
- public override bool ModLateUpdate(MegaModContext mc)
- {
- return Prepare(mc);
- }
- public override bool Prepare(MegaModContext mc)
- {
- size = bbox.max - bbox.min;
- for ( int i = 0; i < curves.Count; i++ )
- {
- curves[i].size = curves[i].boxsize * 0.5f; //Vector3.Scale(size, curves[i].boxsize);
- }
- return true;
- }
- public override void DrawGizmo(MegaModContext context)
- {
- base.DrawGizmo(context);
- for ( int i = 0; i < curves.Count; i++ )
- {
- if ( curves[i].enabled && curves[i].uselimits )
- {
- Gizmos.color = curves[i].regcol; //Color.yellow;
- Gizmos.DrawWireCube(curves[i].origin, curves[i].boxsize); // * 0.5f);
- }
- }
- }
- }
|