private void SendData(object state)
    {
        if (meshKey != 0 && isRegistered == true && needsToSend == true)
        {
            bool send = false;

            lock (meshDataLock)
            {
                send = serializer.Serialize(meshTriangles, meshVerts, meshColor);
            }
            if (send)
            {
                UploadMesh(rootServerUrl + "/mesh/" + meshSlot + "/frame", serializer.packet, meshKey);
            }
        }
    }
    void Update()
    {
        if (wwwcall != null && wwwcall.IsDone && meshKey == 0 && isRegistered == false)
        {
            if (wwwcall.Error != null)
            {
                Debug.Log("error registering: " + wwwcall.Error);
            }
            else
            {
                var result = Json.Deserialize(wwwcall.Text) as Dictionary <string, object>;

                if ((bool)result["result"])
                {
                    isRegistered = true;
                    meshKey      = (int)((long)result["key"]);
                    meshSlot     = (int)((long)result["index"]);
                }
                else
                {
                    isRegistered = false;
                    Debug.Log("Unable to register: " + (string)result["error"]);
                }
            }
            wwwcall = null;
        }
        else if (meshKey != 0 && isRegistered == true && needsToSend == true && meshToSend != null)
        {
            if (wwwcall == null)
            {
                wwwcall = new RequestWWW();
                serializer.Serialize(meshToSend);
                StartCoroutine(wwwcall.doHttpPost(rootServerUrl + "/mesh/" + meshSlot + "/frame", serializer.packet, meshKey));
            }
            else if (wwwcall != null && wwwcall.IsDone)
            {
                wwwcall = null;
            }
        }
    }