static void GenerateOutline(SpriteCache sprite, ITextureDataProvider textureDataProvider, out List <Vertex2D> vertices, out List <int> indices, out List <Edge> edges) { if (textureDataProvider == null || textureDataProvider.texture == null) { vertices = new List <Vertex2D>(); indices = new List <int>(); edges = new List <Edge>(); return; } const float detail = 0.05f; const byte alphaTolerance = 200; var smd = new SpriteMeshData { spriteID = new GUID(sprite.id), frame = sprite.textureRect, pivot = sprite.pivotNormalized }; var meshDataController = new SpriteMeshDataController { spriteMeshData = smd }; meshDataController.OutlineFromAlpha(new OutlineGenerator(), textureDataProvider, detail, alphaTolerance); meshDataController.Triangulate(new Triangulator()); vertices = smd.vertices; indices = smd.indices; edges = smd.edges; }
private void GenerateGeometry(SpriteCache sprite, float outlineDetail, byte alphaTolerance, float subdivide) { Debug.Assert(sprite != null); var mesh = sprite.GetMesh(); Debug.Assert(mesh != null); m_SpriteMeshDataController.spriteMeshData = mesh; m_SpriteMeshDataController.OutlineFromAlpha(m_OutlineGenerator, mesh.textureDataProvider, outlineDetail, alphaTolerance); m_SpriteMeshDataController.Triangulate(m_Triangulator); if (subdivide > 0f) { var largestAreaFactor = subdivide != 0 ? Mathf.Lerp(0.5f, 0.05f, Math.Min(subdivide, 100f) / 100f) : subdivide; m_SpriteMeshDataController.Subdivide(m_Triangulator, largestAreaFactor, 0f); } }