Exemplo n.º 1
0
        public void CalculateAutomaticWeights(List <Node> targetNodes)
        {
            float pixelsPerUnit = SpriteMeshUtils.GetSpritePixelsPerUnit(spriteMesh.sprite);

            if (nodes.Count <= 0)
            {
                Debug.Log("Cannot calculate automatic weights from a SpriteMesh with no vertices.");
                return;
            }

            if (bindPoses.Count <= 0)
            {
                Debug.Log("Cannot calculate automatic weights. Specify bones to the SpriteMeshInstance.");
                return;
            }

            if (!spriteMesh)
            {
                return;
            }

            List <Vector2>     controlPoints     = new List <Vector2>();
            List <IndexedEdge> controlPointEdges = new List <IndexedEdge>();
            List <int>         pins = new List <int>();

            foreach (BindInfo bindInfo in bindPoses)
            {
                Vector2 tip  = SpriteMeshUtils.VertexToTexCoord(spriteMesh, pivotPoint, bindInfo.position, pixelsPerUnit);
                Vector2 tail = SpriteMeshUtils.VertexToTexCoord(spriteMesh, pivotPoint, bindInfo.endPoint, pixelsPerUnit);

                if (bindInfo.boneLength <= 0f)
                {
                    int index = controlPoints.Count;
                    controlPoints.Add(tip);
                    pins.Add(index);

                    continue;
                }

                int index1 = -1;

                if (!ContainsVector(tip, controlPoints, 0.01f, out index1))
                {
                    index1 = controlPoints.Count;
                    controlPoints.Add(tip);
                }

                int index2 = -1;

                if (!ContainsVector(tail, controlPoints, 0.01f, out index2))
                {
                    index2 = controlPoints.Count;
                    controlPoints.Add(tail);
                }

                IndexedEdge edge = new IndexedEdge(index1, index2);
                controlPointEdges.Add(edge);
            }

            UnityEngine.BoneWeight[] boneWeights = BbwPlugin.CalculateBbw(m_TexVertices.ToArray(), indexedEdges.ToArray(), controlPoints.ToArray(), controlPointEdges.ToArray(), pins.ToArray());

            foreach (Node node in targetNodes)
            {
                UnityEngine.BoneWeight unityBoneWeight = boneWeights[node.index];

                SetBoneWeight(node, CreateBoneWeightFromUnityBoneWeight(unityBoneWeight));
            }

            isDirty = true;
        }
Exemplo n.º 2
0
        public void CalculateAutomaticWeights(List <Node> targetNodes)
        {
            float pixelsPerUnit = SpriteMeshUtils.GetSpritePixelsPerUnit(spriteMesh.sprite);

            if (nodes.Count <= 0)
            {
                Debug.Log("Cannot calculate automatic weights from a SpriteMesh with no vertices.");
                return;
            }

            if (bindPoses.Count <= 0)
            {
                Debug.Log("Cannot calculate automatic weights. Specify bones to the SpriteMeshInstance.");
                return;
            }

            if (spriteMesh && bindPoses.Count > 1)
            {
                List <Vector2>     controlPoints     = new List <Vector2>(bindPoses.Count * 2);
                List <IndexedEdge> controlPointEdges = new List <IndexedEdge>(bindPoses.Count);

                foreach (BindInfo bindInfo in bindPoses)
                {
                    Vector2 tip  = SpriteMeshUtils.VertexToTexCoord(spriteMesh, pivotPoint, bindInfo.position, pixelsPerUnit);
                    Vector2 tail = SpriteMeshUtils.VertexToTexCoord(spriteMesh, pivotPoint, bindInfo.endPoint, pixelsPerUnit);

                    int index1 = -1;

                    if (!ContainsVector(tip, controlPoints, 0.01f, out index1))
                    {
                        index1 = controlPoints.Count;
                        controlPoints.Add(tip);
                    }

                    int index2 = -1;

                    if (!ContainsVector(tail, controlPoints, 0.01f, out index2))
                    {
                        index2 = controlPoints.Count;
                        controlPoints.Add(tail);
                    }

                    IndexedEdge edge = new IndexedEdge(index1, index2);
                    controlPointEdges.Add(edge);
                }

                float[,] weightArray;

                BbwPlugin.CalculateBbw(m_TexVertices.ToArray(),
                                       indexedEdges.ToArray(),
                                       controlPoints.ToArray(),
                                       controlPointEdges.ToArray(),
                                       out weightArray);

                FillBoneWeights(targetNodes, weightArray);

                isDirty = true;
            }
            else
            {
                BoneWeight boneWeight = BoneWeight.Create();
                boneWeight.boneIndex0 = 0;
                boneWeight.weight0    = 1f;

                foreach (Node node in targetNodes)
                {
                    SetBoneWeight(node, boneWeight);
                }
            }
        }
Exemplo n.º 3
0
        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);
        }
Exemplo n.º 4
0
        public void CalculateAutomaticWeights(List <Vertex> targetVertices)
        {
            if (texVertices.Count <= 0)
            {
                Debug.Log("Cannot calculate automatic weights from a SpriteMesh with no vertices.");
                return;
            }

            if (bindPoses.Count <= 0)
            {
                Debug.Log("Cannot calculate automatic weights. Specify bones to the SpriteMeshInstance.");
                return;
            }

            if (spriteMesh)
            {
                List <Vector3> vertices = new List <Vector3>(texVertices.Count);

                for (int i = 0; i < texVertices.Count; i++)
                {
                    Vertex vertex = texVertices[i];
                    vertices.Add(vertex.vertex);
                }

                List <Vector3>     controlPoints     = new List <Vector3>(bindPoses.Count * 2);
                List <IndexedEdge> controlPointEdges = new List <IndexedEdge>(bindPoses.Count);

                foreach (BindInfo bindInfo in bindPoses)
                {
                    Vector3 tip  = SpriteMeshUtils.VertexToTexCoord(spriteMesh, bindInfo.position);
                    Vector3 tail = SpriteMeshUtils.VertexToTexCoord(spriteMesh, bindInfo.endPoint);

                    int index1 = -1;

                    if (!ContainsVector(tip, controlPoints, 0.01f, out index1))
                    {
                        index1 = controlPoints.Count;
                        controlPoints.Add(tip);
                    }

                    int index2 = -1;

                    if (!ContainsVector(tail, controlPoints, 0.01f, out index2))
                    {
                        index2 = controlPoints.Count;
                        controlPoints.Add(tail);
                    }

                    IndexedEdge edge = new IndexedEdge(index1, index2);
                    controlPointEdges.Add(edge);
                }

                float[,] weightArray;

                UpdateIndexedEdges();

                BbwPlugin.CalculateBbw(vertices.ToArray(),
                                       indices.ToArray(),
                                       indexedEdges.ToArray(),
                                       controlPoints.ToArray(),
                                       controlPointEdges.ToArray(),
                                       out weightArray);

                FillBoneWeights(targetVertices, weightArray);

                isDirty = true;
            }
        }