using UnityEngine; using System.Collections; using ProceduralToolkit; using UnityEngine.UI; using System.Collections.Generic; using System.IO; public class Cursor_1 : MonoBehaviour { StreamWriter sWrite; public float T1 = 0.5f; public float T2 = 5f; public float wiggleFreq = 0.5f; public float startScale = 1f; public float pctModulate = 0.5f; private int numHQuadsInCursor = 300; public UserMovement userMovement; public ArgosSphere_Indexing argos_Sphere; public PaintElement hexElement; public PaintElement paintElement; PaintElement instHexElement; PaintElement instPaintElement; Quaternion myStartRotation; int iCurrHexIDX; MeshDraft mdScratch; //Watch out for stepping on template Hex Quads public class Hex_Track { public float timer; public int type; public int iHAddess; public float currScale; public float vCV_Mag; //magnitude of vector Center of quad to vertex; } public List<Hex_Track> htHexList = new List<Hex_Track>(); public class Paint_Track { public float timer; public int type; } public List<Paint_Track> ptPaintList = new List<Paint_Track>(); Vector3 v0 = new Vector3(); Vector3 v1 = new Vector3(); Vector3 v2 = new Vector3(); Vector3 v3 = new Vector3(); Quaternion LocalRotation; Vector3 vCurrLoc; Vector3 vRotated; int count = 0; Vector3 vC; Vector3 vC0; Hex_Track ht; Vector3 vCentLast; float vAvgDistVc1_Vc2; void Start () { sWrite = new StreamWriter("Argos_Cursor.txt"); } void OnApplicationQuit() { sWrite.Close(); } void OnEnable() { mdScratch = new MeshDraft(); Initialize(); } void OnDisable() { } void Initialize() { if(instHexElement != null) { Destroy(instHexElement.gameObject); htHexList.Clear(); } instHexElement = Instantiate(hexElement); instHexElement.transform.SetParent(argos_Sphere.transform); instHexElement.transform.localPosition = Vector3.zero; myStartRotation = argos_Sphere.transform.rotation; iCurrHexIDX = 0; } void Update () { int idxCheck; vCurrLoc = userMovement.cursorTran.pos - argos_Sphere.transform.position; LocalRotation = Quaternion.Inverse(argos_Sphere.transform.rotation); vRotated = LocalRotation * vCurrLoc; idxCheck = argos_Sphere.getHexIdx(vRotated); if (idxCheck != iCurrHexIDX) { if(instHexElement.GetNumVertices() > numHQuadsInCursor*4) { instHexElement.Mdraft.Remove_Front_Quad(); htHexList.RemoveAt(0); count--; } iCurrHexIDX = idxCheck; mdScratch.Copy_MeshDraft(argos_Sphere.HexQuads[idxCheck].mdH); mdScratch.Rotate(myStartRotation); instHexElement.AddMeshDraft_Only(mdScratch); ht = new Hex_Track(); ht.iHAddess = iCurrHexIDX; ht.type = 0; ht.timer = 0f; ht.currScale = 1.0f; vC = (mdScratch.vertices[0] + mdScratch.vertices[1] + mdScratch.vertices[2] + mdScratch.vertices[3]) / 4f; vC0 = mdScratch.vertices[0] - vC; ht.vCV_Mag = vC0.magnitude; htHexList.Add(ht); count++; instHexElement.MeshDraft_ToMesh(); } Vector3 vCent; for (int i = 0; i < htHexList.Count; i++) { htHexList[i].timer += Time.deltaTime; float scale = argos_wiggle_evnvelope(T1, T2, htHexList[i].timer); float deltaScale = 1f + scale - htHexList[i].currScale; htHexList[i].currScale = scale; v0 = instHexElement.GetVertex((i * 4) + 0); v1 = instHexElement.GetVertex((i * 4) + 1); v2 = instHexElement.GetVertex((i * 4) + 2); v3 = instHexElement.GetVertex((i * 4) + 3); vCent = (v0 + v1 + v2 + v3) / 4f; v0 = v0 - vCent; v1 = v1 - vCent; v2 = v2 - vCent; v3 = v3 - vCent; v0.Normalize(); v1.Normalize(); v2.Normalize(); v3.Normalize(); instHexElement.Mdraft.vertices[i * 4 + 0] = vCent + scale * htHexList[i].vCV_Mag * v0 * startScale; instHexElement.Mdraft.vertices[i * 4 + 1] = vCent + scale * htHexList[i].vCV_Mag * v1 * startScale; instHexElement.Mdraft.vertices[i * 4 + 2] = vCent + scale * htHexList[i].vCV_Mag * v2 * startScale; instHexElement.Mdraft.vertices[i * 4 + 3] = vCent + scale * htHexList[i].vCV_Mag * v3 * startScale; } instHexElement.MeshDraft_ToMesh(); } public float argos_bloom_envelope(float T1, float T2, float t) { if(t<T1) { return Mathf.Sin((t / T1) * (Mathf.PI / 2f)); } else if(t>T1 && t<T2+T1) { return Mathf.SmoothStep(1f, 0f, (t - T1) / T2); } return 0f; } public float argos_wiggle_evnvelope(float T1, float T2, float t) { float bas,amp; bas = 1f - (pctModulate / 2f); amp = pctModulate / 2f; float lev = argos_bloom_envelope(T1, T2, t); float wiggle = bas + amp * Mathf.Sin((t) * (wiggleFreq*2f*Mathf.PI)); if(t>0f && t < T2 + T1) { return lev * wiggle; } return 0f; } }