devNotes 4-01-16 networking remote testing

using UnityEngine;
using System.Collections;
using UnityEngine.UI;
using System.Collections.Generic;
using ProceduralToolkit;
using System.IO;

public class Remote_Paint_Controller : MonoBehaviour
{
    StreamWriter sWrite;

    public float minPaintLen = 0.01f;


    public class CursorTran
    {
        public Vector3 pos;
        public Transform normProjTrans;
        public Transform screenProjTrans;
        public bool bValid = false;
    };

    private CursorTran _cursorTran;

    public CursorTran cursorTran
    {
        get { return _cursorTran; }
    }
    public Text SlideVal;

    public GameObject retSphere;

    //PreFabs for Types of Mesh Instancing
    public PaintElement paintElement;
    public PaintElement LLQuadElement;
    public PaintElement HexElement;
    public SpawnElement spawnElement;

    //public UserMovement userMovement;
    public GameObject argos_SphereGO;
    public ArgosSphere_Indexing argos_Sphere;
    GameObject netCam;

    public bool isCursorValid()
    {
        return _cursorTran.bValid;
    }

    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

    // Use this for initialization
    void Start()
    {
        retSphere = GameObject.Find("RetSphere");
        argos_SphereGO = GameObject.Find("Argos_Sphere");
        argos_Sphere = argos_SphereGO.GetComponent<ArgosSphere_Indexing>();

        netCam = GameObject.Find("ArgosNet_Remote");

        mdScratch = new MeshDraft();

        _cursorTran = new CursorTran();
        //sWrite = new StreamWriter("Argos_Cursor_Paint.txt");
    }
    private bool IsRayIntersecting(Transform mPose)
    {
        //Let s be the start point of the ray, and d a unit vector in the direction of the ray.
        //Let c be the center point of the sphere, and r its radius.
        Vector3 s = mPose.transform.position;
        Vector3 d = mPose.transform.forward;
        Vector3 c = argos_Sphere.transform.position;
        float r = argos_Sphere.GetComponent<ArgosSphere_Indexing>().radius;

        // Calculate ray's start offset from the sphere center
        Vector3 p = s - c;

        float rSquared = r * r;
        float p_d = Vector3.Dot(p, d);

        // The sphere is behind or surrounding the start point.
        //if (p_d < 0 || Vector3.Dot(p, p) < rSquared)
        //    return false;

        // Flatten p into the plane passing through c perpendicular to the ray.
        // This gives the closest approach of the ray to the center.
        Vector3 a = p - p_d * d;

        float aSquared = Vector3.Dot(a, a);

        // Closest approach is outside the sphere.
        if (aSquared > rSquared)
            return false;
        return true;
    }

    void OnApplicationQuit()
    {
        //sWrite.Close();
    }

    public void OnSliderChanged()
    {
        //lineWidth = widthSlide.value;
        //SlideVal.text = lineWidth.ToString("F2");
    }

    public void onPaintTogSwitched(bool isOn)
    {
        Debug.Log("Remote Paint Switched");
        bPaintOn = isOn;
        if (isOn)
        {
            OnPaintButtonDown();
        }
        else
        {
            OnPaintButtonUp();
        }
    }

    public void onQuadTogSwitched(bool isOn)
    {
        Debug.Log("Remote Quad Switched");
        if (isOn)
        {
            OnLLQuadButtonDown();
        }
        else
        {
            OnLLQuadButtonUp();
        }
    }

    public void onHexTogSwitched(bool isOn)
    {
        Debug.Log("Remote Hex Switched");
        if (isOn)
        {
            OnHexButtonDown();
        }
        else
        {
            OnHexButtonUp();
        }
    }


    public void OnPaintButtonDown()
    {

        bPaintOn = true;

        if (isCursorValid())
        {
            bPaintOn = true;
            iStartPaint = 0;
            //txtButtonState.text = "Paint On";
            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 = cursorTran.pos - argos_Sphere.transform.position;
            Vector3 vRotated = LocalRotation * vLastLoc;
            vLastLoc = vRotated;

            //sWrite.WriteLine("-------------------------");

            myPaintRotation = argos_Sphere.transform.rotation;
        }
    }

    public void OnPaintButtonUp()
    {
        bPaintOn = false;
        //txtButtonState.text = "Paint Off";
    }

    public void OnLLQuadButtonDown()
    {
        if (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 = 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 (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 = 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 (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 = 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";
        }
    }

    public void MoveScreenIndicator(Vector3 pos, Transform mPose, Vector3 vR)
    {
        retSphere.transform.position = pos;
        //vPaddleVel = (pos - vPaddlePos_Last)/Time.deltaTime;
        //vPaddlePos_Last = pos;
        Quaternion rotation = Quaternion.LookRotation(vR.normalized, mPose.up);
        retSphere.transform.rotation = rotation;
        _cursorTran.screenProjTrans = retSphere.transform;
    }

    public void OnPoseUpdated(Transform mPose)
    {

        _cursorTran.bValid = IsRayIntersecting(mPose);

        if (_cursorTran.bValid)
        {
            float R = 1.5f;/*ArgosSphere.m_GridScale*/;
            Vector3 vPC = argos_Sphere.transform.position - mPose.position;
            Vector3 vBpos = mPose.position + Vector3.Dot(vPC, mPose.forward) * mPose.forward;
            Vector3 vBC = vBpos - argos_Sphere.transform.position;

            float BClen = vBC.magnitude;
            float BDlen = Mathf.Sqrt(R * R - BClen * BClen);

            Vector3 D = vBpos + mPose.forward * BDlen;
            //d_Position.text = D.ToString();

            retSphere.transform.position = D;
            _cursorTran.pos = D;

            Vector3 vR = D - argos_Sphere.transform.position;

            Quaternion rotation = Quaternion.LookRotation(vR.normalized, Vector3.up);
            retSphere.transform.rotation = rotation;
            _cursorTran.normProjTrans = retSphere.transform;

            MoveScreenIndicator(D, mPose, vR);
        }
        //MoveBall();
    }
    // Update is called once per frame
    void Update()
    {
        if (netCam != null)
        {
            OnPoseUpdated(netCam.transform);


            if (isCursorValid())
            {
                Vector3 v = 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 = 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 = 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();
                        }
                    }
                }
                if (bLLQuadOn)
                {
                    vCurrLoc = 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);
                            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 = 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);
                            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;
                    }
                }
            }
        }
    }
}

 

Add Clear Mesh Button

Manifold_Garden-970.jpg.673f6d57e3aad7216278c91813b73330