Color on Verts – reflect speed
State machine to adjust material colors on animations in animator
Layered texture on material to crossfade
inject color on speed change
Argos.Vu First Shaders
Written to assure render order of Hex Quads after Paint Quads
// Argos First Shaders - Custom/Unlit/ArgosCursor_Layer_1 // // Unlit alpha-blended shader. // - no lighting // - no lightmap support // - no per-material color Shader "Custom/Unlit/ArgosCursor_Layer_0" { Properties { _MainTex ("Base (RGB) Trans (A)", 2D) = "white" {} } SubShader { Tags {"Queue"="Transparent" "IgnoreProjector"="True" "RenderType"="Transparent"} LOD 100 ZWrite Off Blend SrcAlpha OneMinusSrcAlpha // Added to make sure that this draws above // stuff at the same depth. Offset -1, -1 Pass { CGPROGRAM #pragma vertex vert #pragma fragment frag #pragma multi_compile_fog #include "UnityCG.cginc" struct appdata_t { float4 vertex : POSITION; float2 texcoord : TEXCOORD0; }; struct v2f { float4 vertex : SV_POSITION; half2 texcoord : TEXCOORD0; UNITY_FOG_COORDS(1) }; sampler2D _MainTex; float4 _MainTex_ST; v2f vert (appdata_t v) { v2f o; o.vertex = mul(UNITY_MATRIX_MVP, v.vertex); o.texcoord = TRANSFORM_TEX(v.texcoord, _MainTex); UNITY_TRANSFER_FOG(o,o.vertex); return o; } fixed4 frag (v2f i) : SV_Target { fixed4 col = tex2D(_MainTex, i.texcoord); UNITY_APPLY_FOG(i.fogCoord, col); return col; } ENDCG } } }
// Argos First Shaders - Custom/Unlit/ArgosCursor_Layer_1 // // Unlit alpha-blended shader. // - no lighting // - no lightmap support // - no per-material color Shader "Custom/Unlit/ArgosCursor_Layer_1" { Properties { _MainTex ("Base (RGB) Trans (A)", 2D) = "white" {} } SubShader { Tags {"Queue"="Transparent+1" "IgnoreProjector"="True" "RenderType"="Transparent"} LOD 100 ZWrite Off Blend SrcAlpha OneMinusSrcAlpha // Added to make sure that this draws above // stuff at the same depth. Offset -1, -1 Pass { CGPROGRAM #pragma vertex vert #pragma fragment frag #pragma multi_compile_fog #include "UnityCG.cginc" struct appdata_t { float4 vertex : POSITION; float2 texcoord : TEXCOORD0; }; struct v2f { float4 vertex : SV_POSITION; half2 texcoord : TEXCOORD0; UNITY_FOG_COORDS(1) }; sampler2D _MainTex; float4 _MainTex_ST; v2f vert (appdata_t v) { v2f o; o.vertex = mul(UNITY_MATRIX_MVP, v.vertex); o.texcoord = TRANSFORM_TEX(v.texcoord, _MainTex); UNITY_TRANSFER_FOG(o,o.vertex); return o; } fixed4 frag (v2f i) : SV_Target { fixed4 col = tex2D(_MainTex, i.texcoord); UNITY_APPLY_FOG(i.fogCoord, col); return col; } ENDCG } } }
Cursor_1 and Paint_Controller updated to fix initial quad vertex coordinates:
//in Cursor_1 private void UpdatePaintQuads() { vCurrLoc = userMovement.cursorTran.pos - argos_Sphere.transform.position; Quaternion LocalRotation = myStartRotation * Quaternion.Inverse(argos_Sphere.transform.rotation); vCurrLoc = LocalRotation * vCurrLoc; if (vCurrLoc != vLastLoc) { Vector3 vLen = vCurrLoc - vLastLoc; if (vLen.magnitude > minPaintLen || iStartPaint < 2) { //MeshDraft Vector3 vFwd = userMovement.cursorTran.screenProjTrans.forward; Vector3 vFwdRtd = LocalRotation * vFwd; Vector3 vUp = Vector3.Cross(vFwdRtd, vLen); vUp.Normalize(); v1curr = vCurrLoc + (lineWidth / 2f) * vUp; v2curr = vCurrLoc - (lineWidth / 2f) * vUp; if (++iStartPaint > 2) //don't write 2 times though { instPaintElement.AddQuad(v2last, v1last, v1curr, v2curr); } vLastLoc = vCurrLoc; v1last = v1curr; v2last = v2curr; //Paint_Track pt = new Paint_Track(); pt.timer = 0f; pt.vCursorLoc_at_t = vCurrLoc; pt.vLenRtd = vLen; pt.vUpRtd = vUp; pt.type = 0; ptPaintList.Add(pt); } } for (int i = 0; i < ptPaintList.Count; i++) { ptPaintList[i].timer += Time.deltaTime; float scale = argos_bloom_envelope(pT1, pT2, ptPaintList[i].timer); // This Comes Next :) } }
//in void Update() in PaintController 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); //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(); } } }