using UnityEngine; using System.Collections; using System.Collections.Generic; using UnityEngine.UI; public class ArgosHexLighter : MonoBehaviour { public Slider sld_Variance; public Slider sld_PauseTime; public Slider sld_MoverTime; public Slider sld_NeighborSeeks; public Text VarianceText; public Text PauseTimeText; public Text MoverTimeText; public Text NeighborSeeksText; public float moveTime = 4.0f; public float pauseTime = 2.0f; public float variance = 0.1f; public int neighborSeeks = 10; ArgSphereUtility asu; public GameObject hexPrefab; public GameObject quadPrefab; GameObject ArgosSphere; ArgosSphere_Indexing asi; public Color quadColor; void Start () { asu = GetComponent<ArgSphereUtility>(); ArgosSphere = GameObject.Find("Argos_Sphere"); asi = ArgosSphere.GetComponent<ArgosSphere_Indexing>(); asu.init(); init_mover(); } //Slider sld_Variance; //Slider sld_PauseTime; //Slider sld_MoverTime; //Text VarianceText; //Text PauseTimeText; //Text MoverTimeText; public void onSliderVariance() { variance = sld_Variance.value; VarianceText.text = "Variance = " + variance.ToString("F2"); } public void onSliderPauseTime() { pauseTime = sld_PauseTime.value; PauseTimeText.text = "PauseTime = " + pauseTime.ToString("F1"); } public void onSliderMoveTime() { moveTime = sld_MoverTime.value; MoverTimeText.text = "MoveTime = " + moveTime.ToString("F1"); } public void onSliderNeighborSeeks() { if(sld_NeighborSeeks.value < 15) { neighborSeeks = (int)sld_NeighborSeeks.value; } else { neighborSeeks = 15 + (int)(sld_NeighborSeeks.value*40f); } NeighborSeeksText.text = "Neighbor Seeks = " + neighborSeeks.ToString(); } public enum moverStates { Paused, Moving, }; class ToFroms { public int hIdx; public Quaternion q0; public Quaternion q1; public int aIdx; public moverStates state; public float timer; public float pauseTime; public float movetime; } List<ToFroms> toFromList = new List<ToFroms>(); void init_mover() { int idxStart; int idxEnd; Color col; Quaternion q0, q1; for (int i = 0; i < 300; i++) { idxStart = 4096 + Random.Range(-1000, 1000); int idx = idxStart; for (int j = 0; j < 5; j++) { idx = asi.HexQuads[idx].neighborLoc[Random.Range(0, 5)]; } idxEnd = idx; col = getRandColor(); asu.lightHex(idxStart, hexPrefab, col); ToFroms tf = new ToFroms(); q0 = asi.HexQuads[idxStart].GetQuat(); q1 = asi.HexQuads[idxEnd].GetQuat(); tf.q1 = q1 * Quaternion.Inverse(q0); tf.q0 = Quaternion.identity; tf.aIdx = i; tf.hIdx = idxEnd; tf.state = moverStates.Paused; tf.timer = 0.0f; tf.pauseTime = pauseTime + Random.Range(-pauseTime * variance / 2, pauseTime * variance / 2); tf.movetime = moveTime + Random.Range(-moveTime * variance / 2, moveTime * variance / 2); toFromList.Add(tf); } } void Update() { Quaternion q0, q1; for (int i = 0; i < 300; i++) { toFromList[i].timer += Time.deltaTime; if (toFromList[i].state == moverStates.Paused) { toFromList[i].timer += Time.deltaTime; if (toFromList[i].timer > toFromList[i].pauseTime) { toFromList[i].state = moverStates.Moving; toFromList[i].timer = 0.0f; } } else //(toFromList[i].state == moverStates.Moveing) { float sTime = ElasticEaseInOut(toFromList[i].timer, 0.0f, 1.0f, toFromList[i].movetime); asu.aQuads[toFromList[i].aIdx].go.transform.rotation = Quaternion.LerpUnclamped(toFromList[i].q0, toFromList[i].q1, sTime); if (toFromList[i].timer > toFromList[i].movetime) { asu.aQuads[toFromList[i].aIdx].go.transform.rotation = Quaternion.LerpUnclamped(toFromList[i].q0, toFromList[i].q1, 1.0f); toFromList[i].state = moverStates.Paused; toFromList[i].timer = 0.0f; int idx = toFromList[i].hIdx; int idxTest; int idxStart, idxEnd; int seeks = neighborSeeks + Random.Range((int)(-(float)(variance/2)*neighborSeeks), (int)((float)(variance / 2) * neighborSeeks)) ; for (int j = 0; j < seeks; j++)//Let it randomly find the next point by searching through "seeks" neighbors { idxTest = asi.HexQuads[idx].neighborLoc[Random.Range(0, 6)]; if (idxTest > 1000 && idxTest < 7000) idx = idxTest; else idx = toFromList[i].hIdx; } idxStart = toFromList[i].hIdx; idxEnd = idx; toFromList[i].hIdx = idx; q1 = asi.HexQuads[idxEnd].GetQuat(); q0 = asi.HexQuads[idxStart].GetQuat(); toFromList[i].q1 = q1 * Quaternion.Inverse(q0) * asu.aQuads[toFromList[i].aIdx].go.transform.rotation; toFromList[i].q0 = asu.aQuads[toFromList[i].aIdx].go.transform.rotation; toFromList[i].state = moverStates.Paused; toFromList[i].timer = 0.0f; toFromList[i].pauseTime = pauseTime + Random.Range(-pauseTime * variance / 2, pauseTime * variance / 2); toFromList[i].movetime = moveTime + Random.Range(-moveTime * variance / 2, moveTime * variance / 2); } } } } //q0 = asi.HexQuads[3060].GetQuat(); //q1 = asi.HexQuads[4064].GetQuat(); //q2 = q1* Quaternion.Inverse(q0); //q0 = Quaternion.identity; void init_OneOFF() { int idxStart; int idxEnd; Color col; Quaternion q0,q1; for (int i = 0; i < 30; i++) { idxStart = 4096 + Random.Range(-1000, 1000); int idx = idxStart; for (int j = 0; j<20; j++) { idx = asi.HexQuads[idx].neighborLoc[Random.Range(0, 5)]; } idxEnd = idx; col = getRandColor(); asu.lightHex(idxStart, hexPrefab, col); asu.lightHex(idxStart, hexPrefab, col); asu.lightHex(idxEnd, hexPrefab, col); ToFroms tf = new ToFroms(); q0 = asi.HexQuads[idxStart].GetQuat(); q1 = asi.HexQuads[idxEnd].GetQuat(); tf.q0 = Quaternion.identity; tf.q1 = q1 * Quaternion.Inverse(q0); tf.aIdx = i * 3 + 1; tf.hIdx = idxStart; toFromList.Add(tf); } } float accumTime = 0.0f; //void Update_OneOff() //{ // accumTime += Time.deltaTime; // float linTime; // float sTime; // if(accumTime>2f) // { // linTime = (accumTime - 2f); // for (int i = 0; i < 30; i++) // { // sTime = ElasticEaseInOut(linTime, 0.0f, 1.0f, durr); // if (linTime > durr) sTime = 1.0f; // asu.aQuads[toFromList[i].aIdx].go.transform.rotation = Quaternion.SlerpUnclamped(toFromList[i].q0, toFromList[i].q1, sTime); // } // if (accumTime > 2+durr) accumTime = 0; // } //} /// <summary> /// Easing equation function for an elastic (exponentially decaying sine wave) easing out: /// decelerating from zero velocity. /// </summary> /// <param name="t">Current time in seconds.</param> /// <param name="b">Starting value.</param> /// <param name="c">Final value.</param> /// <param name="d">Duration of animation.</param> /// <returns>The correct value.</returns> public static float ElasticEaseOut(float t, float b, float c, float d) { if ((t /= d) == 1) return b + c; float p = d * 0.3f; float s = p / 4; return (c * Mathf.Pow(2, -10 * t) * Mathf.Sin((t * d - s) * (2 * Mathf.PI) / p) + c + b); } /// <summary> /// Easing equation function for an elastic (exponentially decaying sine wave) easing in: /// accelerating from zero velocity. /// </summary> /// <param name="t">Current time in seconds.</param> /// <param name="b">Starting value.</param> /// <param name="c">Final value.</param> /// <param name="d">Duration of animation.</param> /// <returns>The correct value.</returns> public static float ElasticEaseIn(float t, float b, float c, float d) { if ((t /= d) == 1) return b + c; float p = d * 0.3f; float s = p / 4; return -(c * Mathf.Pow(2, 10 * (t -= 1)) * Mathf.Sin((t * d - s) * (2f * Mathf.PI) / p)) + b; } /// <summary> /// Easing equation function for an elastic (exponentially decaying sine wave) easing in/out: /// acceleration until halfway, then deceleration. /// </summary> /// <param name="t">Current time in seconds.</param> /// <param name="b">Starting value.</param> /// <param name="c">Final value.</param> /// <param name="d">Duration of animation.</param> /// <returns>The correct value.</returns> public static float ElasticEaseInOut(float t, float b, float c, float d) { if ((t /= d / 2) == 2) return b + c; float p = d * (0.3f * 1.5f); float s = p / 4; if (t < 1) return -0.5f * (c * Mathf.Pow(2, 10 * (t -= 1)) * Mathf.Sin((t * d - s) * (2 * Mathf.PI) / p)) + b; return c * Mathf.Pow(2, -10 * (t -= 1)) * Mathf.Sin((t * d - s) * (2 * Mathf.PI) / p) * 0.5f + c + b; } /// <summary> /// Easing equation function for an elastic (exponentially decaying sine wave) easing out/in: /// deceleration until halfway, then acceleration. /// </summary> /// <param name="t">Current time in seconds.</param> /// <param name="b">Starting value.</param> /// <param name="c">Final value.</param> /// <param name="d">Duration of animation.</param> /// <returns>The correct value.</returns> public static float ElasticEaseOutIn(float t, float b, float c, float d) { if (t < d / 2) return ElasticEaseOut(t * 2, b, c / 2, d); return ElasticEaseIn((t * 2) - d, b + c / 2, c / 2, d); } Color getRandColor() { Color col; col.r = 0.4f + Random.Range(0.0f, 0.6f); col.g = 0.5f + Random.Range(0.0f, 0.5f); col.b = 0.1f + Random.Range(0.0f, 0.9f); col.a = 0.8f + Random.Range(0.0f, 0.2f); return col; } bool drawn = false; float numSpawned = 0; int quadIdx = 1536; void Update_Org () { accumTime += Time.deltaTime; Color col; if (accumTime>1.0f && !drawn) { //HEX Quads //Draw 3 sets until done - (50 times ~ 1 second) for (int i = 0; i < 3; i++) { int centerIdx = 4096 + Random.Range(-2048, 2048); asu.lightHexDuration(centerIdx, hexPrefab, getRandColor(), 4.0f + Random.Range(0f,2.5f)); col = getRandColor(); for(int j = 0; j<6; j++) { asu.lightHexDuration(asi.HexQuads[centerIdx].neighborLoc[j], hexPrefab, col, 8.0f + Random.Range(0f, .25f)); } } if (++numSpawned > 150) { drawn = true; } } //Quad Quads for (int i = 0; i < 2; i++) { asu.lightQuadDuration(quadIdx, quadPrefab, quadColor, 1.0f); if (++quadIdx > 2560) quadIdx = 1536; } if (drawn && accumTime > 14.0f) { drawn = false; accumTime = 0.0f; numSpawned = 0; } } }