private void transformSkull(Matrix4x4 latestSkullTransformationMatrix)
 {
     if (latestSkullTransformationMatrix != null)
     {
         skullObject.transform.position = HoloEvacUtils.PositionFromMatrix(latestSkullTransformationMatrix);
         skullObject.transform.rotation = HoloEvacUtils.QuaternionFromMatrix(latestSkullTransformationMatrix);
     }
 }
    private void transformTool(Matrix4x4 latestSkullTransformationMatrix, Matrix4x4 latestToolTransformationMatrix)
    {
        if (latestSkullTransformationMatrix != null && latestToolTransformationMatrix != null)
        {
            // Transform tool's position from HoloLens marker coordinate space to skull's coordinate space
            Matrix4x4 toolPositionInSkullSpace = latestSkullTransformationMatrix * latestToolTransformationMatrix;

            toolObject.transform.position = HoloEvacUtils.PositionFromMatrix(toolPositionInSkullSpace);
            toolObject.transform.rotation = HoloEvacUtils.QuaternionFromMatrix(toolPositionInSkullSpace);
        }
    }
    public void processMessage(string ms)
    {
        processFlag = 0;

        Debug.Log("In processMessage, ms = " + ms);

        char delimiter = ';';

        bool skullFlag = false;
        bool toolFlag  = false;

        if (ms != null)
        {
            string[] msSubString = ms.Split(delimiter);

            // if two data exists, skull position has changed with position grater than 3mm. Changes less than 3mm will not be updated to prevent jitter and cause discomfort
            if (msSubString.Length == 2)
            {
                int count = 0;
                foreach (string substring in msSubString)
                {
                    string[] array = substring.Split(',');

                    if (array.Length == 12)
                    {
                        float[] matrxArray = new float[12];

                        for (int i = 0; i < matrxArray.Length; i++)
                        {
                            matrxArray[i] = float.Parse(array[i]);
                        }

                        if (count == 0)
                        {
                            latestSkullTransformationMatrix = HoloEvacUtils.ConvertFloatArrayToMatrix4x4(matrxArray);
                            skullFlag = true;
                        }
                        else if (count == 1)
                        {
                            latestToolTransformationMatrix = HoloEvacUtils.ConvertFloatArrayToMatrix4x4(matrxArray);
                            toolFlag = true;
                        }
                        else
                        {
                            Debug.Log("Wrong Count!!!");
                        }
                    }
                    else
                    {
                        Debug.Log("Array size != 12!!!");
                    }

                    count++;
                }//End of foreach (string substring in msSubString)
            }
            else if (msSubString.Length == 1)
            {
                string[] array = msSubString[0].Split(',');

                if (array.Length == 12)
                {
                    float[] matrxArray = new float[12];

                    for (int i = 0; i < matrxArray.Length; i++)
                    {
                        matrxArray[i] = float.Parse(array[i]);
                    }

                    latestToolTransformationMatrix = HoloEvacUtils.ConvertFloatArrayToMatrix4x4(matrxArray);
                    toolFlag = true;
                }
                else
                {
                    Debug.Log("Wrong Count!!!");
                }
            }
            else
            {
                Debug.Log("Array size != 12!!!");
            }
        }
        else
        {
            Debug.Log("Message arrived in wrong size, check MicronTracker code!!!");
        }

        if (skullFlag && toolFlag && overlayFlag)
        {
            transformSkull(latestSkullTransformationMatrix);
            transformTool(latestSkullTransformationMatrix, latestToolTransformationMatrix);
            skullFlag = false;
            toolFlag  = false;
        }
        else
        {
            transformTool(Matrix4x4.TRS(skullCachedPosition, skullCachedTransform.rotation, skullCachedTransform.localScale), latestToolTransformationMatrix);
            skullFlag = false;
            toolFlag  = false;
        }
    }