protected bool TryGetPlaneData(LayerPlaneData layerPlane, Pose layerOriginPose,
                                       List <Vector3> vertices, out Pose pose, out Vector3 center, out Vector2 extents)
        {
            var layerPlaneVertices = layerPlane.Vertices;

            extents = GeometryUtils.OrientedMinimumBoundingBox2D(layerPlaneVertices, k_PlaneBoundingBox);
            if (extents.x < m_MinSideLength || extents.y < m_MinSideLength)
            {
                pose   = default;
                center = default;
                return(false);
            }

            var centroid       = GeometryUtils.PolygonCentroid2D(layerPlaneVertices);
            var layerPlanePose = new Pose(centroid, GeometryUtils.RotationForBox(k_PlaneBoundingBox));

            foreach (var vertex in layerPlaneVertices)
            {
                var localVertex = layerPlanePose.ApplyInverseOffsetTo(vertex);
                vertices.Add(localVertex);
            }

            for (var j = 0; j < k_PlaneBoundingBox.Length; ++j)
            {
                k_PlaneBoundingBox[j] = layerPlanePose.ApplyInverseOffsetTo(k_PlaneBoundingBox[j]);
            }

            layerPlanePose.position += k_Up * (layerPlane.YOffsetFromLayer + k_PlaneYEpsilon);
            pose   = layerOriginPose.ApplyOffsetTo(layerPlanePose);
            center = (k_PlaneBoundingBox[0] + k_PlaneBoundingBox[2]) * 0.5f;
            return(true);
        }
        void UpdateLayerPlaneVertices(LayerPlaneData layerPlane)
        {
            k_VoxelCornersInPlane.Clear();
            foreach (var voxel in layerPlane.Voxels)
            {
                AddVoxelCorners(voxel, k_VoxelCornersInPlane);
            }

            layerPlane.Vertices.Clear();
            GeometryUtils.ConvexHull2D(k_VoxelCornersInPlane, layerPlane.Vertices);
        }