void FixedUpdate()
    {
        if (!socketStarted && targetIPReady)
        {
            socketStarted = true;
            doSocketSetup();
        }
        if (outputText != null)
        {
            outputText.text = currentOutput;
        }
        if (!outgoingQueue.IsEmpty)
        {
            messagePackage mp = null;
            outgoingQueue.TryDequeue(out mp);
            if (mp != null)
            {
                sendOutgoingPacket(mp);
                textOut("Packet Sent.");
            }
        }

        if (!incomingLineRenderers.IsEmpty)
        {
            lrStruct l = new lrStruct();
            if (incomingLineRenderers.TryDequeue(out l))
            {
                GameObject go = new GameObject();
                go.transform.parent = this.gameObject.transform;
                LineRenderer lr = go.gameObject.AddComponent <LineRenderer>();
                lr.material       = new Material(LineRendererDefaultMaterial);//copy
                lr.material.color = new Color(l.r, l.g, l.b, l.a);
                lr.startWidth     = l.sw;
                lr.endWidth       = l.ew;
                lr.endColor       = lr.startColor = new Color(l.r, l.g, l.b, l.a);

                /* some helpful notes
                 * LineRenderer lineRenderer = gameObject.AddComponent<LineRenderer>();
                 * lineRenderer.material = new Material(Shader.Find("Sprites/Default"));
                 * lineRenderer.widthMultiplier = 0.2f;
                 * lineRenderer.positionCount = lengthOfLineRenderer;
                 *
                 * // A simple 2 color gradient with a fixed alpha of 1.0f.
                 * float alpha = 1.0f;
                 * Gradient gradient = new Gradient();
                 * gradient.SetKeys(
                 *  new GradientColorKey[] { new GradientColorKey(c1, 0.0f), new GradientColorKey(c2, 1.0f) },
                 *  new GradientAlphaKey[] { new GradientAlphaKey(alpha, 0.0f), new GradientAlphaKey(alpha, 1.0f) }
                 * );
                 * lineRenderer.colorGradient = gradient;
                 */
            }
        }
        //SendHeadsetLocation();
    }
    void FixedUpdate()
    {
        //    Task t = HandleSocket();
        // while(!t.IsCompleted)
        //{
        //
        // }

        if (!socketStarted && targetIPReady)
        {
            socketStarted = true;
            setupSocket();
        }
        if (!outgoingQueue.IsEmpty)
        {
            messagePackage mp = null;
            outgoingQueue.TryDequeue(out mp);
            if (mp != null)
            {
                sendOutgoingPacket(mp);
            }
        }

        if (!incomingLineRenderers.IsEmpty)
        {
            lrStruct l = new lrStruct();
            if (incomingLineRenderers.TryDequeue(out l))
            {
                LineRenderer lr = this.gameObject.AddComponent <LineRenderer>();
                lr.material       = new Material(LineRendererDefaultMaterial);//copy
                lr.material.color = new Color(l.r, l.g, l.b, l.a);
                lr.startWidth     = l.sw;
                lr.endWidth       = l.ew;
                lr.endColor       = lr.startColor = new Color(l.r, l.g, l.b, l.a);
            }
        }
        //SendHeadsetLocation();
    }
    public async Task setupSocket()
    {
#if !UNITY_EDITOR
        tcpClient = new Windows.Networking.Sockets.StreamSocket();
        tcpClient.Control.NoDelay   = false;
        tcpClient.Control.KeepAlive = false;
        tcpClient.Control.OutboundBufferSizeInBytes = 1500;


        while (!connected)
        {
            try
            {
                textOut("Connecting to " + targetIP + " " + targetPort);
                await tcpClient.ConnectAsync(new HostName(targetIP), "" + targetPort);

                textOut("Connected!");

                outputStream              = tcpClient.OutputStream;
                inputStream               = tcpClient.InputStream;
                writer                    = new DataWriter(outputStream);
                reader                    = new DataReader(inputStream);
                reader.UnicodeEncoding    = Windows.Storage.Streams.UnicodeEncoding.Utf8;
                reader.ByteOrder          = Windows.Storage.Streams.ByteOrder.LittleEndian;
                reader.InputStreamOptions = InputStreamOptions.Partial;
                connected                 = true;

                while (connected)
                {
                    await reader.LoadAsync(8192);

                    if (reader.UnconsumedBufferLength > 4)
                    {
                        textOut("Reading....");
                        int incomingSize = reader.ReadInt32();
                        if (incomingSize > 0 && incomingSize < 100000)
                        {
                            //await reader.LoadAsync((uint)incomingSize);//preloads the buffer with the data which makes the following not needed.

                            while (reader.UnconsumedBufferLength < incomingSize)
                            {
                                System.Threading.Tasks.Task.Delay(100).Wait();
                                await reader.LoadAsync(8192);
                            }

                            textOut("Getting new Line!");
                            int    packetType = reader.ReadInt32();
                            float  r          = reader.ReadSingle();
                            float  g          = reader.ReadSingle();
                            float  b          = reader.ReadSingle();
                            float  a          = reader.ReadSingle();
                            int    count      = reader.ReadInt32();// this is actually just for padding...
                            float  sw         = reader.ReadSingle();
                            float  ew         = reader.ReadSingle();
                            byte[] packet     = new byte[incomingSize - 36];
                            //reader.ReadBytes(packet);
                            if (packetType == 4 && packet.Length > 0)
                            {
                                lrStruct l = new lrStruct
                                {
                                    r     = r,
                                    g     = g,
                                    b     = b,
                                    a     = a,
                                    pc    = count,
                                    sw    = sw,
                                    ew    = ew,
                                    verts = new Vector3[count]
                                };
                                textOut("" + count + " " + r + " " + g + " " + b + " " + a + " " + sw + " " + ew + "\n" + "Count Suggested Bytes:" + (count * 4 * 3) + " Preloaded Package Size:" + packet.Length);

                                for (int i = 0; i < count; i++)//Dan Simplified this. Probably not bugged.
                                {
                                    l.verts[i] = new Vector3(reader.ReadSingle(), reader.ReadSingle(), reader.ReadSingle());
                                }
                                incomingLineRenderers.Enqueue(l);
                                textOut("Line Renderer Enqueued");
                            }
                            if (packetType == 5)
                            {
                                undoLineRenderer = true;
                            }
                        }
                        else
                        {
                            //TODO Handle it.
                        }
                    }
                }


                //outputStream = await udpClient.GetOutputStreamAsync(new HostName(targetIP), "" + targetPort);
            }
            catch (Exception e)
            {
                Debug.LogError(e.ToString());
                connected     = false;
                socketStarted = false;
                return;
            }
        }
#endif
    }
    void FixedUpdate()
    {
        if (Camera.main != null)
        {
            headsetLocation = Camera.main.transform.position;
            headsetRotation = Camera.main.transform.rotation;

            if (lastCamPosSendTime + 0.5f < Time.realtimeSinceStartup)
            {
                SendHeadsetLocation();
                lastCamPosSendTime = Time.realtimeSinceStartup;
            }
        }


        if (!socketStarted && targetIPReady)
        {
            socketStarted = true;
            doSocketSetup();
        }

        if (doReconnect)
        {
            doReconnect   = false;
            socketStarted = false;
            connected     = false;
            doSocketSetup();
        }

        if (!outgoingQueue.IsEmpty)
        {
            messagePackage mp = null;
            outgoingQueue.TryDequeue(out mp);
            if (mp != null)
            {
                sendOutgoingPacket(mp);
            }
        }

        if (undoLineRenderer)
        {
            undoLineRenderer = false;
            try
            {
                LineRenderer lr = lineRenderers.Pop();
                lr.enabled = false;
                Destroy(lr.gameObject);
            }
            catch (Exception e)
            {
            }
        }

        if (!incomingLineRenderers.IsEmpty)
        {
            lrStruct l = new lrStruct();
            if (incomingLineRenderers.TryDequeue(out l))
            {
                if (l == null)
                {
                    return;
                }
                GameObject go = new GameObject();
                go.transform.parent = this.gameObject.transform;
                LineRenderer lr = go.AddComponent <LineRenderer>();
                lr.material        = new Material(LineRendererDefaultMaterial);//copy
                lr.material.color  = new Color(l.r, l.g, l.b, l.a);
                lr.startWidth      = l.sw;
                lr.endWidth        = l.ew;
                lr.widthMultiplier = 1.0f;
                lr.endColor        = lr.startColor = new Color(l.r, l.g, l.b, l.a);
                lr.SetVertexCount(l.verts.Length);
                //lr.positionCount = l.verts.Length;
                for (int i = 0; i < l.verts.Length; i++)
                {
                    lr.SetPosition(i, l.verts[i]);
                }

                go.active = true;
                Gradient gradient = new Gradient();
                gradient.SetKeys(
                    new GradientColorKey[] { new GradientColorKey(lr.material.color, 0.0f), new GradientColorKey(lr.material.color, 1.0f) },
                    new GradientAlphaKey[] { new GradientAlphaKey(1.0f, 0.0f), new GradientAlphaKey(1.0f, 1.0f) }
                    );
                lr.colorGradient = gradient;
                lineRenderers.Push(lr);

                /* some helpful notes
                 * LineRenderer lineRenderer = gameObject.AddComponent<LineRenderer>();
                 * lineRenderer.material = new Material(Shader.Find("Sprites/Default"));
                 * lineRenderer.widthMultiplier = 0.2f;
                 * lineRenderer.positionCount = lengthOfLineRenderer;
                 *
                 * // A simple 2 color gradient with a fixed alpha of 1.0f.
                 * float alpha = 1.0f;
                 * Gradient gradient = new Gradient();
                 * gradient.SetKeys(
                 *  new GradientColorKey[] { new GradientColorKey(c1, 0.0f), new GradientColorKey(c2, 1.0f) },
                 *  new GradientAlphaKey[] { new GradientAlphaKey(alpha, 0.0f), new GradientAlphaKey(alpha, 1.0f) }
                 * );
                 * lineRenderer.colorGradient = gradient;
                 */
            }
        }
        //SendHeadsetLocation();
    }
    public async void setupSocket()
    {
#if !UNITY_EDITOR
        tcpClient = new Windows.Networking.Sockets.StreamSocket();
        tcpClient.Control.NoDelay   = false;
        tcpClient.Control.KeepAlive = false;
        tcpClient.Control.OutboundBufferSizeInBytes = 1500;
        while (!connected)
        {
            try
            {
                await tcpClient.ConnectAsync(new HostName(targetIP), "" + targetPort);

                outputStream              = tcpClient.OutputStream;
                inputStream               = tcpClient.InputStream;
                writer                    = new DataWriter(outputStream);
                reader                    = new DataReader(inputStream);
                reader.UnicodeEncoding    = Windows.Storage.Streams.UnicodeEncoding.Utf8;
                reader.ByteOrder          = Windows.Storage.Streams.ByteOrder.LittleEndian;
                reader.InputStreamOptions = InputStreamOptions.Partial;
                connected                 = true;

                while (connected)
                {
                    await reader.LoadAsync(8192);

                    if (reader.UnconsumedBufferLength > 4)
                    {
                        int incomingSize = reader.ReadInt32();
                        if (incomingSize > 0 && incomingSize < 100000)
                        {
                            while (reader.UnconsumedBufferLength < incomingSize)
                            {
                                System.Threading.Tasks.Task.Delay(100).Wait();
                                await reader.LoadAsync(8192);
                            }

                            int    packetType = reader.ReadInt32();
                            float  r          = reader.ReadSingle();
                            float  g          = reader.ReadSingle();
                            float  b          = reader.ReadSingle();
                            float  a          = reader.ReadSingle();
                            int    count      = reader.ReadInt32();
                            float  sw         = reader.ReadSingle();
                            float  ew         = reader.ReadSingle();
                            byte[] packet     = new byte[incomingSize - 36];// this differs from spatialmapvuforia
                            if (packetType == 4 && packet.Length > 0)
                            {
                                lrStruct l = new lrStruct
                                {
                                    r     = r,
                                    g     = g,
                                    b     = b,
                                    a     = a,
                                    pc    = count,
                                    sw    = sw,
                                    ew    = ew,
                                    verts = new Vector3[count]
                                };

                                for (int i = 0; i < count; i++)//Dan Simplified this. Probably not bugged.
                                {
                                    l.verts[i] = new Vector3(reader.ReadSingle(), reader.ReadSingle(), reader.ReadSingle());
                                }
                                incomingLineRenderers.Enqueue(l);
                            }
                            if (packetType == 5)
                            {
                                undoLineRenderer = true;
                            }
                        }
                        else
                        {
                            //TODO Handle it.
                        }
                    }
                }
            }
            catch (Exception e)
            {
                Debug.LogError(e.ToString());
                connected     = false;
                socketStarted = false;
                doReconnect   = true;
                return;
            }
        }
        doReconnect = true;
#endif
    }
    /*
     #if !UNITY_EDITOR
     * public async Task HandleSocket()
     *  {
     *
     *  if(!socketStarted&&targetIPReady&&!connected&&!startConnect&&tcpClient==null)
     *  {
     *      tcpClient = new Windows.Networking.Sockets.StreamSocket();
     *      tcpClient.Control.NoDelay = false;
     *      tcpClient.Control.KeepAlive = false;
     *      tcpClient.Control.OutboundBufferSizeInBytes = 1500;
     *      startConnect=true;
     *      await tcpClient.ConnectAsync(new HostName(targetIP), "" + targetPort);
     *      outputStream = tcpClient.OutputStream;
     *      inputStream = tcpClient.InputStream;
     *      writer = new DataWriter(outputStream);
     *      reader = new DataReader(inputStream);
     *      reader.InputStreamOptions = InputStreamOptions.Partial;
     *      reader.UnicodeEncoding = Windows.Storage.Streams.UnicodeEncoding.Utf8;
     *      reader.ByteOrder = Windows.Storage.Streams.ByteOrder.LittleEndian;
     *      connected = true;
     *  }
     *
     *  if(connected&&reader.UnconsumedBufferLength>4)
     *  {
     *      lengthOfNextPacket=reader.ReadInt32();
     *  }
     *  if(lengthOfNextPacket>0&&reader.UnconsumedBufferLength>lengthOfNextPacket)
     *  {
     *      int packetType = reader.ReadInt32();
     *      float r = reader.ReadSingle();
     *      float g = reader.ReadSingle();
     *      float b = reader.ReadSingle();
     *      float a = reader.ReadSingle();
     *      int count = reader.ReadInt32();// this is actually just for padding...
     *      float sw = reader.ReadSingle();
     *      float ew = reader.ReadSingle();
     *      byte[] packet = new byte[lengthOfNextPacket-32];
     *      reader.ReadBytes(packet);
     *      if(packetType==4&&packet.Length>0)
     *      {
     *          lrStruct l = new lrStruct();
     *          l.r = r;
     *          l.g = g;
     *          l.b = b;
     *          l.a = a;
     *          l.pc = count;
     *          l.sw = sw;
     *          l.ew = ew;
     *          l.verts = new Vector3[count];
     *          for(int i = 0; i < count; i++)//Dan actually wrote this one from scratch, so might be bugged.
     *          {
     *              l.verts[i]=new Vector3(BitConverter.ToSingle(packet, i*12+0), BitConverter.ToSingle(packet, i * 12 + 4),
     *                  BitConverter.ToSingle(packet, i * 12 + 8));
     *          }
     *          incomingLineRenderers.Enqueue(l);
     *      }
     *      if (packetType == 5)
     *          undoLineRenderer = true;
     *      lengthOfNextPacket=-1;
     *  }
     *
     *
     *
     *
     *
     * }
     #endif
     */



#if !UNITY_EDITOR
    private async void _streamSocket_ConnectionReceived(StreamSocketListener sender,
                                                        StreamSocketListenerConnectionReceivedEventArgs args)
    {
        using (IInputStream inStream = args.Socket.InputStream)
        {
            reader = new DataReader(inStream);
            reader.InputStreamOptions = InputStreamOptions.Partial;
            outputStream = args.Socket.OutputStream;
            inputStream  = inStream;
            writer       = new DataWriter(outputStream);
            connected    = true;

            while (connected)
            {
                await reader.LoadAsync(8192);

                if (reader.UnconsumedBufferLength > 4)
                {
                    int incomingSize = reader.ReadInt32();
                    if (incomingSize > 0 && incomingSize < 100000)
                    {
                        await reader.LoadAsync((uint)incomingSize);    //preloads the buffer with the data which makes the following not needed.



                        int    packetType = reader.ReadInt32();
                        float  r          = reader.ReadSingle();
                        float  g          = reader.ReadSingle();
                        float  b          = reader.ReadSingle();
                        float  a          = reader.ReadSingle();
                        int    count      = reader.ReadInt32();// this is actually just for padding...
                        float  sw         = reader.ReadSingle();
                        float  ew         = reader.ReadSingle();
                        byte[] packet     = new byte[incomingSize - 32];
                        reader.ReadBytes(packet);
                        if (packetType == 4 && packet.Length > 0)
                        {
                            lrStruct l = new lrStruct();
                            l.r     = r;
                            l.g     = g;
                            l.b     = b;
                            l.a     = a;
                            l.pc    = count;
                            l.sw    = sw;
                            l.ew    = ew;
                            l.verts = new Vector3[count];
                            for (int i = 0; i < count; i++)   //Dan actually wrote this one from scratch, so might be bugged.
                            {
                                l.verts[i] = new Vector3(BitConverter.ToSingle(packet, i * 12 + 0), BitConverter.ToSingle(packet, i * 12 + 4),
                                                         BitConverter.ToSingle(packet, i * 12 + 8));
                            }
                            incomingLineRenderers.Enqueue(l);
                        }
                        if (packetType == 5)
                        {
                            undoLineRenderer = true;
                        }
                    }
                    else
                    {
                        //TODO Handle it.
                    }
                }
            }
        }

        System.Diagnostics.Debug.WriteLine("Finished reading");
    }