// Called when the mouse begins hovering an editable object.
        internal override void OnBrushEnter(EditableObject target, BrushSettings settings)
        {
            base.OnBrushEnter(target, settings);

            if (target.graphicsMesh == null)
            {
                return;
            }

            EditableObjectData data;

            if (!m_EditableObjectsData.TryGetValue(target, out data))
            {
                data = new EditableObjectData();
                m_EditableObjectsData.Add(target, data);
            }

            RebuildCaches(target, settings);

            data.TriangleLookup = PolyMeshUtility.GetAdjacentTriangles(target.editMesh);

            MeshRenderer mr = target.gameObjectAttached.GetComponent <MeshRenderer>();

            if (mr != null && mr.sharedMaterials != null)
            {
                data.LikelySupportsVertexColors = mr.sharedMaterials.Any(x =>
                                                                         x != null && x.shader != null && PolyShaderUtil.SupportsVertexColors(x.shader));
            }
            else
            {
                data.LikelySupportsVertexColors = false;
            }
        }
        void RebuildCaches(PolyMesh m, float strength)
        {
            m_VertexCount    = m.vertexCount;
            m_TriangleLookup = PolyMeshUtility.GetAdjacentTriangles(m);

            if (meshAttributes == null)
            {
                // clear caches
                splat_cache   = null;
                splat_current = null;
                splat_target  = null;
                splat_erase   = null;
                return;
            }

            splat_cache   = new SplatSet(m, meshAttributes);
            splat_current = new SplatSet(splat_cache);
            splat_target  = new SplatSet(m_VertexCount, meshAttributes);
            splat_erase   = new SplatSet(m_VertexCount, meshAttributes);
        }
        void RebuildCaches(EditableObjectData data)
        {
            PolyMesh mesh = data.CacheTarget.editMesh;

            data.VertexCount    = mesh.vertexCount;
            data.TriangleLookup = PolyMeshUtility.GetAdjacentTriangles(mesh);

            if (meshAttributes == null)
            {
                // clear caches
                data.SplatCache   = null;
                data.SplatCurrent = null;
                data.SplatTarget  = null;
                data.SplatErase   = null;
                return;
            }

            data.SplatCache = new SplatSet(mesh, meshAttributes);
            SetupBaseTextures(data.SplatCache);
            data.SplatCurrent = new SplatSet(data.SplatCache);
            data.SplatTarget  = new SplatSet(data.VertexCount, meshAttributes);
            data.SplatErase   = new SplatSet(data.VertexCount, meshAttributes);
        }