Paint:
Unity Project: Argos_Sphere_Networking – in AR_Dev/Archives
public void OnPaintButtonDown() { if (userMovement.isCursorValid()) { bPaintOn = true; iStartPaint = 0; currPE_Idx++; txtNumPaintElements.text = currPE_Idx.ToString(); paintList.Add(Instantiate(paintElement)); paintList[currPE_Idx].transform.SetParent(argos_Sphere.transform); paintList[currPE_Idx].transform.localPosition = Vector3.zero; Quaternion LocalRotation = Quaternion.Inverse(argos_Sphere.transform.rotation); vLastLoc = userMovement.cursorTran.pos - argos_Sphere.transform.position; Vector3 vRotated = LocalRotation * vLastLoc; vLastLoc = vRotated; myPaintRotation = argos_Sphere.transform.rotation; } }
if (bPaintOn) { vCurrLoc = userMovement.cursorTran.pos - argos_Sphere.transform.position; Quaternion LocalRotation = myPaintRotation*Quaternion.Inverse(argos_Sphere.transform.rotation); vCurrLoc = LocalRotation * vCurrLoc; if (vCurrLoc != vLastLoc) { Vector3 len = vCurrLoc - vLastLoc; if (len.magnitude > minPaintLen || iStartPaint<2) { Vector3 vFwd = userMovement.cursorTran.screenProjTrans.forward; Vector3 vFwdRtd = LocalRotation * vFwd; Vector3 vUp = Vector3.Cross(vFwdRtd, len ); vUp.Normalize(); v1curr = vCurrLoc + (lineWidth / 2f) * vUp; v2curr = vCurrLoc - (lineWidth / 2f) * vUp; //sWrite.WriteLine("len =" + v2last.ToString("F3") + " vFwdRtd =" + vFwdRtd.ToString("F3") + " vUp =" + vUp.ToString("F3") + " vLastLoc =" + vLastLoc.ToString("F3") + " vCurrLoc =" + vCurrLoc.ToString("F3")); if (++iStartPaint > 2) //don't write 2 times though { paintList[currPE_Idx].AddQuad(v2last, v1last, v1curr, v2curr,selColor); //sWrite.WriteLine("v0 =" + v2last.ToString("F3") + "v1 =" + v1last.ToString("F3") + "v2 =" + v1curr.ToString("F3") + "v3 =" + v2curr.ToString("F3")); } vLastLoc = vCurrLoc; v1last = v1curr; v2last = v2curr; //if (currPE_Idx > -1 && paintList[currPE_Idx].Mdraft != null) // InfoLineTxt.text = " Pn = " + (paintList[currPE_Idx].Mdraft.triangles.Count / 2).ToString(); } } }
Quad
public void OnLLQuadButtonDown() { if (userMovement.isCursorValid()) { bLLQuadOn = true; txtButtonState.text = "LLQuad On"; currQE_Idx++; txtNumLLQuadElements.text = currQE_Idx.ToString(); PaintElement rectLLQuads = Instantiate(LLQuadElement); rectLLQuads.transform.SetParent(argos_Sphere.transform); rectLLQuads.transform.localPosition = Vector3.zero; LLQuadList.Add(rectLLQuads); Quaternion LocalRotation = Quaternion.Inverse(argos_Sphere.transform.rotation); vLastLoc = userMovement.cursorTran.pos - argos_Sphere.transform.position; Vector3 vRotated = LocalRotation * vLastLoc; vLastLoc = vRotated; myQuadRotation = argos_Sphere.transform.rotation; } }
if (bLLQuadOn) { vCurrLoc = userMovement.cursorTran.pos - argos_Sphere.transform.position; Quaternion LocalRotation = Quaternion.Inverse(argos_Sphere.transform.rotation); vCurrLoc = LocalRotation * vCurrLoc; if (vCurrLoc != vLastLoc) { int currLatLong_Idx = argos_Sphere.getLLQuadIdx(vCurrLoc); if (currLatLong_Idx != nDrawnLLQuadIdx) { mdScratch.Copy_MeshDraft(argos_Sphere.LLQuads[currLatLong_Idx].mdQuad); mdScratch.Rotate(myQuadRotation); mdScratch.Paint(selColor); LLQuadList[currQE_Idx].AddMeshDraft(mdScratch); nDrawnLLQuadIdx = currLatLong_Idx; } } vLastLoc = vCurrLoc; //if (currQE_Idx > -1 && LLQuadList[currQE_Idx].Mdraft != null) //InfoLineTxt.text = " Qn = " + (LLQuadList[currQE_Idx].Mdraft.triangles.Count / 2).ToString(); }
Hex
public void OnHexButtonDown() { if (userMovement.isCursorValid()) { bHexOn = true; txtButtonState.text = "Hexagonal On"; currHE_Idx++; txtHexElements.text = currHE_Idx.ToString(); PaintElement HObj = Instantiate(HexElement); HObj.transform.SetParent(argos_Sphere.transform); HObj.transform.localPosition = Vector3.zero; HexQuadList.Add(HObj); Quaternion LocalRotation = Quaternion.Inverse(argos_Sphere.transform.rotation); vLastLoc = userMovement.cursorTran.pos - argos_Sphere.transform.position; Vector3 vRotated = LocalRotation * vLastLoc; vLastLoc = vRotated; myHexRotation = argos_Sphere.transform.rotation; } }
if (bHexOn) { vCurrLoc = userMovement.cursorTran.pos - argos_Sphere.transform.position; Quaternion LocalRotation = Quaternion.Inverse(argos_Sphere.transform.rotation); vCurrLoc = LocalRotation * vCurrLoc; if (vCurrLoc != vLastLoc) { int cHIdx = argos_Sphere.getHexIdx(vCurrLoc); if (cHIdx != nDrawnHexQuadIdx) { mdScratch.Copy_MeshDraft(argos_Sphere.HexQuads[cHIdx].mdH); mdScratch.Rotate(myHexRotation); mdScratch.Paint(selColor); HexQuadList[currHE_Idx].AddMeshDraft(mdScratch); nDrawnHexQuadIdx = cHIdx; //if (currHE_Idx > -1 && HexQuadList[currHE_Idx].Mdraft != null) //InfoLineTxt.text = " Hn = " + (HexQuadList[currHE_Idx].Mdraft.triangles.Count / 2).ToString(); } vLastLoc = vCurrLoc; } }
Spawn
uses – texture atlas
public void onSpawnButtonDown() { if (userMovement.isCursorValid()) { currSpn_Idx++; txtNumSpawnElements.text = currSpn_Idx.ToString(); SpawnElement SObj = Instantiate(spawnElement); SObj.transform.SetParent(argos_Sphere.transform); SObj.transform.localPosition = Vector3.zero; SpawnList.Add(SObj); vCurrLoc = userMovement.cursorTran.pos - argos_Sphere.transform.position; Quaternion LocalRotation = Quaternion.Inverse(argos_Sphere.transform.rotation); Vector3 vRotated = LocalRotation * vCurrLoc; int cSpnHexGridIdxStart = argos_Sphere.getHexIdx(vRotated); mdScratch.Copy_MeshDraft(argos_Sphere.HexQuads[cSpnHexGridIdxStart].mdH); Quaternion snapRotation; snapRotation = argos_Sphere.transform.rotation; mdScratch.Rotate(snapRotation); SpawnList[currSpn_Idx].AddMeshDraft(mdScratch, cSpnHexGridIdxStart, currSpn_Idx % 6, snapRotation); txtButtonState.text = "Spawned at Reticle"; } }
void Update() { if (userMovement.isCursorValid()) { //Update for Spawn Elements Vector3 v = userMovement.cursorTran.pos - argos_Sphere.transform.position; int H = argos_Sphere.getHexIdx(v); if(currSpn_Idx > -1)// { foreach(SpawnElement s in SpawnList) { s.update_from_PaintCtrl(v,H); } } if (bPaintOn) {
using UnityEngine; using System.Collections; using ProceduralToolkit; using UnityEngine.UI; using System.Collections.Generic; public class SpawnElement : MonoBehaviour { public ArgosSphere_Indexing Argos_Sphere; private Mesh mesh; MeshDraft mdSpawnQuads; Quaternion myStartRotation; public class Quad_Track { public float timer; public int type; public int iHAddess; public int xInc; public int yInc; public int currDirection; } public List<Quad_Track> qtSpawnList = new List<Quad_Track>(); MeshDraft mdScratch; //Watch out for stepping on template Hex Quads float tAccum, tAccumPaintCtrl; int xInc, yInc; int xDiv; int yDiv; float dx; float dy; int currDirection; public MeshDraft Mdraft { get { return mdSpawnQuads; } } void Start () { Argos_Sphere = (ArgosSphere_Indexing)FindObjectOfType(typeof(ArgosSphere_Indexing)); tAccum = 0f; xInc = 0; yInc = 0; xDiv = 4; yDiv = 4; dx = 1f / xDiv; dy = 1f / yDiv; mdScratch = new MeshDraft(); } // Update is called once per frame void Update () { } public void update_from_PaintCtrl(Vector3 vReticleLoc, int iRetHexIdx) { tAccumPaintCtrl += Time.deltaTime; Vector2 v0, v1, v2, v3; for(int i = 0; i< qtSpawnList.Count; i++) { qtSpawnList[i].timer += Time.deltaTime; //Update Textures if (qtSpawnList[i].timer > .3f) { if (++qtSpawnList[i].xInc > xDiv - 1) { qtSpawnList[i].xInc = 0; if (++qtSpawnList[i].yInc > yDiv - 1) { qtSpawnList[i].yInc = 0; } } v0.x = dx * qtSpawnList[i].xInc; v0.y = 1f - (dy * qtSpawnList[i].yInc); v1.x = dx * qtSpawnList[i].xInc; v1.y = 1f - (dy * (qtSpawnList[i].yInc + 1f)); v2.x = dx * (qtSpawnList[i].xInc + 1f); v2.y = 1f - (dy * qtSpawnList[i].yInc); v3.x = dx * (qtSpawnList[i].xInc + 1f); v3.y = 1f - (dy * (qtSpawnList[i].yInc + 1)); mdSpawnQuads.uv[i * 4 + 0] = v0; mdSpawnQuads.uv[i * 4 + 1] = v1; mdSpawnQuads.uv[i * 4 + 2] = v2; mdSpawnQuads.uv[i * 4 + 3] = v3; GetComponent<MeshFilter>().mesh = mdSpawnQuads.ToMesh(); qtSpawnList[i].timer = 0f; } } if (tAccumPaintCtrl > .02f) { if (qtSpawnList.Count > 100) return; int currDir = qtSpawnList[qtSpawnList.Count - 1].currDirection; int hI = Argos_Sphere.getSpawnLoc(qtSpawnList[qtSpawnList.Count - 1].iHAddess, currDir); if (hI != -1) { mdScratch.Copy_MeshDraft(Argos_Sphere.HexQuads[hI].mdH); mdScratch.Rotate(myStartRotation); mdSpawnQuads.Add(mdScratch); v0.x = 0f; v0.y = 1f; v1.x = 0f; v1.y = 1f - dy; v2.x = dx; v2.y = 1f; v3.x = dx; v3.y = 1f - dy; int c = mdSpawnQuads.vertices.Count-4; mdSpawnQuads.uv = v0; mdSpawnQuads.uv = v1; mdSpawnQuads.uv = v2; mdSpawnQuads.uv = v3; GetComponent<MeshFilter>().mesh = mdSpawnQuads.ToMesh(); Quad_Track qt = new Quad_Track(); qt.iHAddess = hI; qt.type = 0; qt.timer = 0f; qt.xInc = 0; qt.yInc = 0; qt.currDirection = currDir; int rand; if(qtSpawnList.Count % 3 == 0) { rand = Random.Range(0, 5); if(rand != 3) qt.currDirection += rand; if (qt.currDirection > 5) qt.currDirection = 0; } qtSpawnList.Add(qt); } tAccumPaintCtrl = 0f; } } public void AddHexQuad(ArgosSphere_Indexing.H_Element H) { } public void AddMeshDraft(MeshDraft md, int hAddress,int direction,Quaternion snapRotation) { MeshFilter mf = GetComponent<MeshFilter>(); if (mf.mesh == null) mf.mesh = new Mesh(); mesh = mf.mesh; xDiv = 4; yDiv = 4; dx = 1f / xDiv; dy = 1f / yDiv; mdSpawnQuads = new MeshDraft(); if (mdSpawnQuads != null) { myStartRotation = snapRotation; mdSpawnQuads.Add(md); mdSpawnQuads.uv[0] = new Vector2(0f, 1f); mdSpawnQuads.uv[1] = new Vector2(0f, 1f-dy); mdSpawnQuads.uv[2] = new Vector2(dx, 1f); mdSpawnQuads.uv[3] = new Vector2(dx, 1f-dy); GetComponent<MeshFilter>().mesh = mdSpawnQuads.ToMesh(); Quad_Track qt = new Quad_Track(); qt.iHAddess = hAddress; qt.type = 0; qt.timer = 0f; qt.xInc = 0; qt.yInc = 0; qt.currDirection = direction; qtSpawnList.Add(qt); } } public void AddQuad(Vector3 v0, Vector3 v1, Vector3 v2, Vector3 v3) { if (mdSpawnQuads != null) { mdSpawnQuads.Add(MeshDraft.Quad(v0, v1, v2, v3)); GetComponent<MeshFilter>().mesh = mdSpawnQuads.ToMesh(); //mesh.RecalculateBounds(); } } }
Slerp SpergsBurg
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; } } }
using UnityEngine; using System.Collections; using System.Collections.Generic; using ProceduralToolkit; public class ArgSphereUtility : MonoBehaviour { GameObject argosSphere; ArgosSphere_Indexing asi; public class AqHold { public GameObject go; public MeshDraft md; public MeshFilter mf; public float lifeTime; public bool isTimed = false; public int id; } public List<AqHold> aQuads = new List<AqHold>(); void Update() { for(int i = 0; i<aQuads.Count; i++) { if (aQuads[i].isTimed) { aQuads[i].lifeTime -= Time.deltaTime; if (aQuads[i].lifeTime < 0.0f) { GameObject.Destroy(aQuads[i].go); aQuads.RemoveAt(i); i--; } } } } public void init() { argosSphere = GameObject.Find("Argos_Sphere"); asi = argosSphere.GetComponent<ArgosSphere_Indexing>(); } public void initAqHold(AqHold aq) { MeshFilter mf = aq.go.GetComponent<MeshFilter>(); if (mf.mesh == null) mf.mesh = new Mesh(); aq.md = new MeshDraft(); } public void lightHex(int hHaddress, GameObject hexPrefab) { GameObject aQuad = Instantiate(hexPrefab); aQuad.transform.SetParent(argosSphere.transform); aQuad.transform.position = argosSphere.transform.position; AqHold aQuadHold = new AqHold(); aQuadHold.go = aQuad; initAqHold(aQuadHold); aQuadHold.md.Copy_MeshDraft(asi.HexQuads[hHaddress].mdH); aQuadHold.md.Rotate(argosSphere.transform.rotation); aQuadHold.go.GetComponent<MeshFilter>().mesh = aQuadHold.md.ToMesh(); aQuads.Add(aQuadHold); } public void lightHex(int hHaddress, GameObject hexPrefab, Color col) { GameObject aQuad = Instantiate(hexPrefab); aQuad.transform.SetParent(argosSphere.transform); aQuad.transform.position = argosSphere.transform.position; AqHold aQuadHold = new AqHold(); aQuadHold.go = aQuad; initAqHold(aQuadHold); aQuadHold.md.Copy_MeshDraft(asi.HexQuads[hHaddress].mdH); aQuadHold.md.Rotate(argosSphere.transform.rotation); aQuadHold.md.Paint(col); aQuadHold.go.GetComponent<MeshFilter>().mesh = aQuadHold.md.ToMesh(); aQuads.Add(aQuadHold); } public void lightHexDuration(int hHaddress, GameObject hexPrefab, Color col, float duration) { GameObject aQuad = Instantiate(hexPrefab); aQuad.transform.SetParent(argosSphere.transform); aQuad.transform.position = argosSphere.transform.position; AqHold aQuadHold = new AqHold(); aQuadHold.go = aQuad; initAqHold(aQuadHold); aQuadHold.md.Copy_MeshDraft(asi.HexQuads[hHaddress].mdH); aQuadHold.md.Rotate(argosSphere.transform.rotation); aQuadHold.md.Paint(col); aQuadHold.go.GetComponent<MeshFilter>().mesh = aQuadHold.md.ToMesh(); aQuadHold.lifeTime = duration; aQuadHold.isTimed = true; aQuads.Add(aQuadHold); } public void lightQuadDuration(int LLAdress, GameObject quadPrefab, Color col, float duration) { GameObject aQuad = Instantiate(quadPrefab); aQuad.transform.SetParent(argosSphere.transform); aQuad.transform.position = argosSphere.transform.position; AqHold aQuadHold = new AqHold(); aQuadHold.go = aQuad; initAqHold(aQuadHold); aQuadHold.md.Copy_MeshDraft(asi.LLQuads[LLAdress].mdQuad); aQuadHold.md.Rotate(argosSphere.transform.rotation); aQuadHold.md.Paint(col); aQuadHold.go.GetComponent<MeshFilter>().mesh = aQuadHold.md.ToMesh(); aQuadHold.lifeTime = duration; aQuadHold.isTimed = true; aQuads.Add(aQuadHold); } }
UV Remapping
Particle Systems
Fibo_Rider
In UnityProject Argos_Sphere_Mapping.argos_fibonacci.unity
using UnityEngine; using System.Collections; using ProceduralToolkit; using System.Collections.Generic; using System.IO; public class Fibo_Rider : MonoBehaviour { StreamWriter sWrite; public ArgosMeshDraft_Fibonacci AMD_Base; List<GameObject> gO_List = new List<GameObject>(); GameObject goMyPivot; GameObject goTweenFollower; Quaternion qStart; Quaternion qEnd; int m_startLoc; int m_toLoc; int m_deltLoc; int m_numPoints; float m_pathTime; public void initFromSpawner(int FibLoc, int delt, int numPoints, float pathTime ) { //sWrite = new StreamWriter("Fibo_Rider4.csv"); m_startLoc = FibLoc; m_deltLoc = delt; m_toLoc = FibLoc + delt; m_pathTime = pathTime; m_numPoints = numPoints; GameObject gFibSphere = GameObject.Find("Fibonacci_Sphere"); ArgosFibonacci aF = gFibSphere.GetComponent<ArgosFibonacci>(); AMD_Base = aF.aMF_Base; Quaternion q0, q1; q0 = Quaternion.LookRotation(AMD_Base.funcVerts[m_startLoc].vPos.normalized); q1 = Quaternion.LookRotation(AMD_Base.funcVerts[m_toLoc].vPos.normalized); transform.rotation = q0; transform.position = AMD_Base.funcVerts[FibLoc].vPos; goTweenFollower = transform.Find("TweenFollower").gameObject; goMyPivot = new GameObject(); goMyPivot.transform.position = new Vector3(0, 0, 0); goMyPivot.transform.rotation = Quaternion.identity; transform.SetParent(goMyPivot.transform); goTweenFollower.transform.SetParent(transform);//this goTweenFollower.transform.position = Vector3.zero; qEnd = q1 * Quaternion.Inverse(q0); qStart = Quaternion.identity; iTween.MoveTo(goTweenFollower, iTween.Hash("x", 1, "time", m_pathTime, "easetype", "easeInOutBack", "onstart", "fibTweenStarted", "onstartparams", "FIB Rider Started...", "onupdate", "fibTweenUpdate", "onupdateparams", FibLoc.ToString(), "oncomplete", "fibTweenComplete", "oncompleteparams", "fib Tween DONE", "onCompleteTarget", gameObject, "onStartTarget", gameObject, "onUpdateTarget", gameObject)); m_numPoints--; } void fibTweenStarted(string textToDisplay) { print("fibTween on Start " + textToDisplay); } int CBcount = 0; float fAccumTime = 0.0f; void fibTweenUpdate(string textToDisplay) { //print("fibTweenUpdate " + textToDisplay + " call count = " + CBcount.ToString() + " pos = " + goTweenFollower.transform.position.x.ToString("F3") + " deltaTime = " + Time.deltaTime.ToString("F3")); float sTime = goTweenFollower.transform.position.x; goMyPivot.transform.rotation = Quaternion.LerpUnclamped(qStart, qEnd, sTime); CBcount++; } void fibTweenComplete(string textToDisplay) { Quaternion q0, q1; goMyPivot.transform.rotation = Quaternion.LerpUnclamped(qStart, qEnd, 1.0f); if (--m_numPoints > 0) { q0 = Quaternion.LookRotation(AMD_Base.funcVerts[m_toLoc].vPos.normalized); m_toLoc += m_deltLoc; q1 = Quaternion.LookRotation(AMD_Base.funcVerts[m_toLoc].vPos.normalized); qEnd = q1 * Quaternion.Inverse(q0) * goMyPivot.transform.rotation; qStart = goMyPivot.transform.rotation; goTweenFollower.transform.position = Vector3.zero; iTween.MoveTo(goTweenFollower, iTween.Hash("x", 1, "time", m_pathTime, "easetype", "easeInOutBack", "onstart", "fibTweenStarted", "onstartparams", "FIB Rider Started...", "onupdate", "fibTweenUpdate", "onupdateparams", m_toLoc.ToString(), "oncomplete", "fibTweenComplete", "oncompleteparams", "fib Tween DONE", "onCompleteTarget", gameObject, "onStartTarget", gameObject, "onUpdateTarget", gameObject)); } } void Update () { } } //public enum EaseType //{ // easeInQuad, // easeOutQuad, // easeInOutQuad, // easeInCubic, // easeOutCubic, // easeInOutCubic, // easeInQuart, // easeOutQuart, // easeInOutQuart, // easeInQuint, // easeOutQuint, // easeInOutQuint, // easeInSine, // easeOutSine, // easeInOutSine, // easeInExpo, // easeOutExpo, // easeInOutExpo, // easeInCirc, // easeOutCirc, // easeInOutCirc, // linear, // spring, // /* GFX47 MOD START */ // //bounce, // easeInBounce, // easeOutBounce, // easeInOutBounce, // /* GFX47 MOD END */ // easeInBack, // easeOutBack, // easeInOutBack, // /* GFX47 MOD START */ // //elastic, // easeInElastic, // easeOutElastic, // easeInOutElastic, // /* GFX47 MOD END */ // punch //}
ColorPicker
Allows queries to texture
public void onColorSelected() { Color Color; Color = colorPicker.GetComponent<ColorPickerUnityUI>().value; selColor = Color; if (argosNetCam_Local != null) { argosNetCam_Local.CmdSetColor(Color); } colPanelSelectedColor.GetComponent<Image>().color = Color; txtButtonState.text = Color.ToString(); }
Classic animation methodology
The “12 Laws” or 12 Basic Principles of Animation
using UnityEngine; using System.Collections; using UnityEngine.UI; using System.Collections.Generic; using ProceduralToolkit; using System.IO; public class Paint_Controller : MonoBehaviour { StreamWriter sWrite; public float minPaintLen = 0.01f; public Toggle togPaint; public Toggle togQuad; public Toggle togHex; public GameObject colorPicker; public GameObject colPanelSelectedColor; public Color selColor; public Text txtButtonState; public Text txtNumPaintElements; public Text txtNumLLQuadElements; public Text txtHexElements; public Text txtNumSpawnElements; public Text InfoLineTxt; public Slider widthSlide; public Text SlideVal; //PreFabs for Types of Mesh Instancing public PaintElement paintElement; public PaintElement LLQuadElement; public PaintElement HexElement; public SpawnElement spawnElement; public UserMovement userMovement; public ArgosSphere_Indexing argos_Sphere; private bool bPaintOn = false; private int iStartPaint = 0; private bool bLLQuadOn = false; private bool bHexOn = false; //spawn on not needed - instanced private int nDrawnLLQuadIdx = -1; private int nDrawnHexQuadIdx = -1; List<PaintElement> paintList = new List<PaintElement>(); List<PaintElement> LLQuadList = new List<PaintElement>(); List<PaintElement> HexQuadList = new List<PaintElement>(); List<SpawnElement> SpawnList = new List<SpawnElement>(); int currPE_Idx = -1; int currQE_Idx = -1; int currHE_Idx = -1; int currSpn_Idx = -1; Vector3 vLastLoc; Vector3 vCurrLoc; Vector3 v1curr; Vector3 v2curr; Vector3 v1last; Vector3 v2last; float lineWidth = 0.025f; Quaternion myPaintRotation; Quaternion myQuadRotation; Quaternion myHexRotation; MeshDraft mdScratch; //Watch out for stepping on template Hex Quads GameObject goANC_Local; netCamMove argosNetCam_Local; // Use this for initialization void Start () { mdScratch = new MeshDraft(); selColor = Color.white; //sWrite = new StreamWriter("Argos_Cursor_Paint.txt"); } void OnApplicationQuit() { //sWrite.Close(); } public void Find_ArgosNet_Local_Inst() { goANC_Local = GameObject.Find("ArgosNet_Local"); if (goANC_Local != null) { argosNetCam_Local = goANC_Local.GetComponent<netCamMove>(); argosNetCam_Local.CmdSetLineWidth(widthSlide.value); argosNetCam_Local.CmdSetColor(selColor); } } public Vector3 getCursorPostiion() { return userMovement.cursorTran.pos; } public void OnSliderChanged() { if (argosNetCam_Local != null) { argosNetCam_Local.CmdSetLineWidth(widthSlide.value); } lineWidth = widthSlide.value; SlideVal.text = (100f*lineWidth).ToString("F1"); } public void onColorSelected() { //Color Color; //Color = colorPicker.GetComponent<ColorPickerUnityUI>().value; //selColor = Color; //if (argosNetCam_Local != null) //{ // argosNetCam_Local.CmdSetColor(Color); //} //colPanelSelectedColor.GetComponent<Image>().color = Color; //txtButtonState.text = Color.ToString(); } public void onPaintTogSwitched() { if(argosNetCam_Local != null) { argosNetCam_Local.CmdPaintRemote(togPaint.isOn); } if (togPaint.isOn == true) { OnPaintButtonDown(); } else { OnPaintButtonUp(); } } public void onQuadTogSwitched() { if (argosNetCam_Local != null) { argosNetCam_Local.CmdQuadRemote(togQuad.isOn); } if (togQuad.isOn == true) { OnLLQuadButtonDown(); } else { OnLLQuadButtonUp(); } } public void onHexTogSwitched() { if (argosNetCam_Local != null) { argosNetCam_Local.CmdHexRemote(togHex.isOn); } if (togHex.isOn == true) { OnHexButtonDown(); } else { OnHexButtonUp(); } } public void OnPaintButtonDown() { if (userMovement.isCursorValid()) { bPaintOn = true; iStartPaint = 0; currPE_Idx++; txtNumPaintElements.text = currPE_Idx.ToString(); paintList.Add(Instantiate(paintElement)); paintList[currPE_Idx].transform.SetParent(argos_Sphere.transform); paintList[currPE_Idx].transform.localPosition = Vector3.zero; Quaternion LocalRotation = Quaternion.Inverse(argos_Sphere.transform.rotation); vLastLoc = userMovement.cursorTran.pos - argos_Sphere.transform.position; Vector3 vRotated = LocalRotation * vLastLoc; vLastLoc = vRotated; myPaintRotation = argos_Sphere.transform.rotation; } } public void OnPaintButtonUp() { bPaintOn = false; txtButtonState.text = "Paint Off"; } public void OnLLQuadButtonDown() { if (userMovement.isCursorValid()) { bLLQuadOn = true; txtButtonState.text = "LLQuad On"; currQE_Idx++; txtNumLLQuadElements.text = currQE_Idx.ToString(); PaintElement rectLLQuads = Instantiate(LLQuadElement); rectLLQuads.transform.SetParent(argos_Sphere.transform); rectLLQuads.transform.localPosition = Vector3.zero; LLQuadList.Add(rectLLQuads); Quaternion LocalRotation = Quaternion.Inverse(argos_Sphere.transform.rotation); vLastLoc = userMovement.cursorTran.pos - argos_Sphere.transform.position; Vector3 vRotated = LocalRotation * vLastLoc; vLastLoc = vRotated; myQuadRotation = argos_Sphere.transform.rotation; } } public void OnLLQuadButtonUp() { bLLQuadOn = false; txtButtonState.text = "LLQuad Off"; } public void OnHexButtonDown() { if (userMovement.isCursorValid()) { bHexOn = true; txtButtonState.text = "Hexagonal On"; currHE_Idx++; txtHexElements.text = currHE_Idx.ToString(); PaintElement HObj = Instantiate(HexElement); HObj.transform.SetParent(argos_Sphere.transform); HObj.transform.localPosition = Vector3.zero; HexQuadList.Add(HObj); Quaternion LocalRotation = Quaternion.Inverse(argos_Sphere.transform.rotation); vLastLoc = userMovement.cursorTran.pos - argos_Sphere.transform.position; Vector3 vRotated = LocalRotation * vLastLoc; vLastLoc = vRotated; myHexRotation = argos_Sphere.transform.rotation; } } public void OnHexButtonUp() { bHexOn = false; txtButtonState.text = "Hexagonal Off"; } public void onSpawnButtonDown() { if (userMovement.isCursorValid()) { currSpn_Idx++; txtNumSpawnElements.text = currSpn_Idx.ToString(); SpawnElement SObj = Instantiate(spawnElement); SObj.transform.SetParent(argos_Sphere.transform); SObj.transform.localPosition = Vector3.zero; SpawnList.Add(SObj); vCurrLoc = userMovement.cursorTran.pos - argos_Sphere.transform.position; Quaternion LocalRotation = Quaternion.Inverse(argos_Sphere.transform.rotation); Vector3 vRotated = LocalRotation * vCurrLoc; int cSpnHexGridIdxStart = argos_Sphere.getHexIdx(vRotated); mdScratch.Copy_MeshDraft(argos_Sphere.HexQuads[cSpnHexGridIdxStart].mdH); Quaternion snapRotation; snapRotation = argos_Sphere.transform.rotation; mdScratch.Rotate(snapRotation); SpawnList[currSpn_Idx].AddMeshDraft(mdScratch, cSpnHexGridIdxStart, currSpn_Idx % 6, snapRotation); txtButtonState.text = "Spawned at Reticle"; } } // Update is called once per frame void Update() { if (userMovement.isCursorValid()) { //Update for Spawn Elements Vector3 v = userMovement.cursorTran.pos - argos_Sphere.transform.position; int H = argos_Sphere.getHexIdx(v); if(currSpn_Idx > -1)// { foreach(SpawnElement s in SpawnList) { s.update_from_PaintCtrl(v,H); } } if (bPaintOn) { vCurrLoc = userMovement.cursorTran.pos - argos_Sphere.transform.position; Quaternion LocalRotation = myPaintRotation*Quaternion.Inverse(argos_Sphere.transform.rotation); vCurrLoc = LocalRotation * vCurrLoc; if (vCurrLoc != vLastLoc) { Vector3 len = vCurrLoc - vLastLoc; if (len.magnitude > minPaintLen || iStartPaint<2) { Vector3 vFwd = userMovement.cursorTran.screenProjTrans.forward; Vector3 vFwdRtd = LocalRotation * vFwd; Vector3 vUp = Vector3.Cross(vFwdRtd, len ); vUp.Normalize(); v1curr = vCurrLoc + (lineWidth / 2f) * vUp; v2curr = vCurrLoc - (lineWidth / 2f) * vUp; //sWrite.WriteLine("len =" + v2last.ToString("F3") + " vFwdRtd =" + vFwdRtd.ToString("F3") + " vUp =" + vUp.ToString("F3") + " vLastLoc =" + vLastLoc.ToString("F3") + " vCurrLoc =" + vCurrLoc.ToString("F3")); if (++iStartPaint > 2) //don't write 2 times though { paintList[currPE_Idx].AddQuad(v2last, v1last, v1curr, v2curr,selColor); //sWrite.WriteLine("v0 =" + v2last.ToString("F3") + "v1 =" + v1last.ToString("F3") + "v2 =" + v1curr.ToString("F3") + "v3 =" + v2curr.ToString("F3")); } vLastLoc = vCurrLoc; v1last = v1curr; v2last = v2curr; //if (currPE_Idx > -1 && paintList[currPE_Idx].Mdraft != null) // InfoLineTxt.text = " Pn = " + (paintList[currPE_Idx].Mdraft.triangles.Count / 2).ToString(); } } } if (bLLQuadOn) { vCurrLoc = userMovement.cursorTran.pos - argos_Sphere.transform.position; Quaternion LocalRotation = Quaternion.Inverse(argos_Sphere.transform.rotation); vCurrLoc = LocalRotation * vCurrLoc; if (vCurrLoc != vLastLoc) { int currLatLong_Idx = argos_Sphere.getLLQuadIdx(vCurrLoc); if (currLatLong_Idx != nDrawnLLQuadIdx) { mdScratch.Copy_MeshDraft(argos_Sphere.LLQuads[currLatLong_Idx].mdQuad); mdScratch.Rotate(myQuadRotation); mdScratch.Paint(selColor); LLQuadList[currQE_Idx].AddMeshDraft(mdScratch); nDrawnLLQuadIdx = currLatLong_Idx; } } vLastLoc = vCurrLoc; //if (currQE_Idx > -1 && LLQuadList[currQE_Idx].Mdraft != null) // InfoLineTxt.text = " Qn = " + (LLQuadList[currQE_Idx].Mdraft.triangles.Count / 2).ToString(); } if (bHexOn) { vCurrLoc = userMovement.cursorTran.pos - argos_Sphere.transform.position; Quaternion LocalRotation = Quaternion.Inverse(argos_Sphere.transform.rotation); vCurrLoc = LocalRotation * vCurrLoc; if (vCurrLoc != vLastLoc) { int cHIdx = argos_Sphere.getHexIdx(vCurrLoc); if (cHIdx != nDrawnHexQuadIdx) { mdScratch.Copy_MeshDraft(argos_Sphere.HexQuads[cHIdx].mdH); mdScratch.Rotate(myHexRotation); mdScratch.Paint(selColor); HexQuadList[currHE_Idx].AddMeshDraft(mdScratch); nDrawnHexQuadIdx = cHIdx; //if (currHE_Idx > -1 && HexQuadList[currHE_Idx].Mdraft != null) // InfoLineTxt.text = " Hn = " + (HexQuadList[currHE_Idx].Mdraft.triangles.Count / 2).ToString(); } vLastLoc = vCurrLoc; } } } } }