List<Vector2> GetBlendshapePositions(BlendShape blendshape, float weight)
{
weight = Mathf.Clamp(weight, 0f, weight);
List<Vector2> result = new List<Vector2>(m_TexVertices.Count);
if(blendshape)
{
BlendShapeFrame prevFrame = null;
BlendShapeFrame nextFrame = null;
foreach(BlendShapeFrame frame in blendshape.frames)
{
if(frame && frame.weight < weight)
{
prevFrame = frame;
}else if(frame && nextFrame == null)
{
nextFrame = frame;
break;
}
}
Vector3[] prevFrameVertices = null;
Vector3[] nextFrameVertices = null;
float prevWeight = 0f;
float nextWeight = 0f;
if(prevFrame)
{
prevFrameVertices = prevFrame.vertices;
prevWeight = prevFrame.weight;
}else{
prevFrameVertices = ToVertices(m_TexVertices).ToArray();
}
if(nextFrame)
{
nextFrameVertices = nextFrame.vertices;
nextWeight = nextFrame.weight;
}else if(prevFrameVertices != null)
{
nextFrameVertices = prevFrameVertices;
nextWeight = prevWeight;
}
if(prevFrameVertices != null &&
nextFrameVertices != null &&
prevFrameVertices.Length == nextFrameVertices.Length)
{
int count = prevFrameVertices.Length;
float pixelsPerUnit = SpriteMeshUtils.GetSpritePixelsPerUnit(spriteMesh.sprite);
float t = 0f;
float weightDelta = (nextWeight - prevWeight);
if(weightDelta > 0f)
{
t = (weight - prevWeight) / weightDelta;
}
for(int i = 0; i < count; ++i)
{
Vector3 v = Vector3.Lerp(prevFrameVertices[i],nextFrameVertices[i],t);
result.Add(SpriteMeshUtils.VertexToTexCoord(spriteMesh,pivotPoint,v,pixelsPerUnit));
}
}
}
return result;
}