private void CreateMesh(EndeffectorData endEffector, MeshFilter tool)           //, double[] tcp
        {
            List <Vector3> vertices  = new List <Vector3>();
            List <int>     triangles = new List <int>();

            if (endEffector.vertices != null)
            {
                                #if DEBUG
                Debug.Log("Robot: Adding Verticies . . . !");
                                #endif
                for (int j = 0; j < endEffector.vertices.Count; j++)
                {
                    vertices.Add(new Vector3(endEffector.vertices[j][0],
                                             endEffector.vertices[j][1],
                                             endEffector.vertices[j][2]));
                }
            }

            if (endEffector.faces != null)
            {
                                #if DEBUG
                Debug.Log("Robot: Adding Faces . . . !");
                                #endif
                for (int j = 0; j < endEffector.faces.Count; j++)
                {
                    triangles.Add(endEffector.faces[j][1]);
                    triangles.Add(endEffector.faces[j][2]);
                    triangles.Add(endEffector.faces[j][3]);

                    if ((endEffector.faces[j][0] == 1))
                    {
                        triangles.Add(endEffector.faces[j][1]);
                        triangles.Add(endEffector.faces[j][3]);
                        triangles.Add(endEffector.faces[j][4]);
                    }
                }
            }
            tool.mesh = MeshUtilities.DecodeMesh(vertices, triangles);
            tool.transform.Rotate(0, 180, -90);
        }
        // Decode Received Data.
        public void ProcessMesh(List <MeshData> receivedMeshes, SourceType sourceType)
        {
                        #if DEBUG
            Debug.Log("Mesh: Received Count: " + receivedMeshes.Count + ". Type: " + (int)sourceType);
                        #endif

            // Check for C-plane
            if (!ObjectManager.instance.CheckCPlane())
            {
                return;
            }

            // Find relevant objects based on source to update
            GameObject[] goRelevantMeshes;
            string       currentTag;
            GameObject   currentPrefab;
            switch (sourceType)
            {
            case (SourceType.TCP):
                                 #if DEBUG
                Debug.Log("Mesh: TCP");
                                 #endif
                currentPrefab = this.goPrefabMesh;
                currentTag    = this.tagMesh;
                break;

            case (SourceType.UDP):
                                 #if DEBUG
                Debug.Log("Mesh: UDP");
                                 #endif
                currentPrefab = this.goPrefabMeshPlus;
                currentTag    = this.tagMeshPlus;
                break;

            default:
                return;
            }
            goRelevantMeshes = GameObject.FindGameObjectsWithTag(currentTag);

            List <Vector3> currentVertices = new List <Vector3>();
            List <int>     currentFaces    = new List <int>();
            List <Color>   currentColors   = new List <Color>();
            // Loop through all received meshes.
            for (int i = 0; i < receivedMeshes.Count; i++)
            {
                // Condition Vertex based data (points and colors). // Later: normals etc.
                for (int j = 0; j < receivedMeshes[i].vertices.Count; j++)
                {
                    currentVertices.Add(new Vector3(receivedMeshes[i].vertices[j][0],
                                                    receivedMeshes[i].vertices[j][1],
                                                    receivedMeshes[i].vertices[j][2]));
                    int colorIndex = (receivedMeshes[i].colors.Count == receivedMeshes[i].vertices.Count) ? j : 0;
                    currentColors.Add(new Color((float)receivedMeshes[i].colors[colorIndex][1] / 255.0f,
                                                (float)receivedMeshes[i].colors[colorIndex][2] / 255.0f,
                                                (float)receivedMeshes[i].colors[colorIndex][3] / 255.0f,
                                                1.0f));
                }
                float alpha = (float)receivedMeshes[i].colors[0][0] / 255.0f;
                // Condition Faces.
                for (int j = 0; j < receivedMeshes[i].faces.Count; j++)
                {
                    currentFaces.Add(receivedMeshes[i].faces[j][1]);
                    currentFaces.Add(receivedMeshes[i].faces[j][2]);
                    currentFaces.Add(receivedMeshes[i].faces[j][3]);
                    // If quad - add second face.
                    if ((receivedMeshes[i].faces[j][0] == 1))
                    {
                        currentFaces.Add(receivedMeshes[i].faces[j][1]);
                        currentFaces.Add(receivedMeshes[i].faces[j][3]);
                        currentFaces.Add(receivedMeshes[i].faces[j][4]);
                    }
                }

                // Set Values
                GameObject meshInstance;
                if (i < goRelevantMeshes.Length)
                {
                                        #if DEBUG
                    Debug.Log("Mesh: Updating old Mesh");
                                        #endif
                    meshInstance = goRelevantMeshes[i];
                }
                else
                {
                                        #if DEBUG
                    Debug.Log("Mesh: Adding new Mesh");
                                        #endif
                    meshInstance = Instantiate(currentPrefab, ObjectManager.instance.cPlane.transform.position, ObjectManager.instance.cPlane.transform.rotation, ObjectManager.instance.cPlane.transform);
                }
                meshInstance.GetComponent <Renderer>().material.SetFloat("_ShadowStrength", 1.0f);
                meshInstance.GetComponent <Renderer>().material.SetFloat("_Alpha", alpha);
                meshInstance.GetComponent <MeshFilter>().mesh = MeshUtilities.DecodeMesh(currentVertices, currentFaces, currentColors);
            }

            // Delete Extraneous Meshes.
            if (goRelevantMeshes.Length > receivedMeshes.Count)
            {
                                #if DEBUG
                Debug.Log("Mesh: Meshes extra deleting.");
                                #endif
                DeleteMeshes(sourceType, receivedMeshes.Count);
            }
        }