I can’t seem to figure out how to change a sprite mesh using ISpriteMeshDataProvider
It seems to do nothing?
I have a custom scriptable object that references a texture. Here is a simple content menu method that updates the sprite meshes on the texture:
[ContextMenu("Update Meshes")]
private void UpdateMeshes() {
Texture2D tex = AssetDatabase.LoadAssetAtPath<Texture2D>(texturePath);
var factory = new SpriteDataProviderFactories();
factory.Init();
var dataProvider = factory.GetSpriteEditorDataProviderFromObject(tex);
dataProvider.InitSpriteEditorDataProvider();
var meshProvider = dataProvider.GetDataProvider<ISpriteMeshDataProvider>();
var spriteRects = dataProvider.GetSpriteRects();
foreach (SpriteRect sr in spriteRects) {
if (TryGetGeometry(sr.name, out SpriteGeometry geometry)) {
geometry.Apply(sr, meshProvider);
}
}
dataProvider.Apply();
AssetDatabase.ImportAsset(texturePath);
}
The scriptable object contains an array of SpriteGeometry objects that define the mesh data for each sprite.
The Apply function looks like this:
class SpriteGeometry {
public void Apply(SpriteRect rect, ISpriteMeshDataProvider dataProvider) {
GUID guid = rect.spriteID;
Vertex2DMetaData[] verts = new Vertex2DMetaData[vertices.Length];
for (int i = 0; i < vertices.Length; i++) {
Vector2 position = vertices[i];
verts[i] = new Vertex2DMetaData() {
position = position
};
}
Vector2Int[] edges = new Vector2Int[vertices.Length / 2];
for (int i = 0; i < edges.Length; i++) {
int edge = i * 2;
edges[i] = new Vector2Int(edge, edge + 1);
}
int[] indices = new int[triangles.Length];
for (int i = 0; i < triangles.Length; i++) {
indices[i] = triangles[i];
}
dataProvider.SetVertices(guid, verts);
dataProvider.SetIndices(guid, indices);
dataProvider.SetEdges(guid, edges);
}
}
But nothing happens after re-importing the texture?
How should I be using ISpriteMeshDataProvider to change sprite meshes?