private void _UpdateMeshIfNeeded()
        {
            m_meshVertices3D.Clear();
            m_trackedPlane.GetPlanePolygon(m_meshVertices3D);

            if (_AreVerticesListsEqual(m_previousFrameMeshVertices, m_meshVertices3D))
            {
                return;
            }

            Pose centerPose = m_trackedPlane.GetCenterPose();

            for (int i = 0; i < m_meshVertices3D.Count; i++)
            {
                m_meshVertices3D[i] = centerPose.rotation * m_meshVertices3D[i] + centerPose.position;
            }

            Vector3 planeNormal = centerPose.rotation * Vector3.up;

            m_meshRenderer.material.SetVector("_PlaneNormal", planeNormal);

            m_previousFrameMeshVertices.Clear();
            m_previousFrameMeshVertices.AddRange(m_meshVertices3D);

            m_meshVertices2D.Clear();
            m_trackedPlane.GetPlanePolygon(ref m_meshVertices2D);

            Triangulator tr = new Triangulator(m_meshVertices2D);

            m_mesh.Clear();
            m_mesh.SetVertices(m_meshVertices3D);
            m_mesh.SetIndices(tr.Triangulate(), MeshTopology.Triangles, 0);
            m_mesh.SetColors(m_meshColors);
        }