Exemplo n.º 1
0
        public void InitFromOutline(float detail, float alphaTolerance, bool holeDetection, float tessellation, string undoName)
        {
            Clear(undoName);

            float   pixelsPerUnit = SpriteMeshUtils.GetSpritePixelsPerUnit(spriteMesh.sprite);
            float   factor        = pixelsPerUnit / spriteMesh.sprite.pixelsPerUnit;
            Vector2 position      = rect.position / factor;
            Vector2 size          = rect.size / factor;

            Rect l_rect = new Rect(position.x, position.y, size.x, size.y);

            Texture2D texture     = SpriteUtility.GetSpriteTexture(spriteMesh.sprite, false);
            Rect      clampedRect = MathUtils.ClampRect(MathUtils.OrderMinMax(l_rect), new Rect(0f, 0f, texture.width, texture.height));

            List <Vector2>     l_texcoords;
            List <IndexedEdge> l_indexedEdges;
            List <int>         l_indices;

            SpriteMeshUtils.InitFromOutline(texture, clampedRect, detail, alphaTolerance, holeDetection, out l_texcoords, out l_indexedEdges, out l_indices);
            SpriteMeshUtils.Tessellate(l_texcoords, l_indexedEdges, holes, l_indices, tessellation * 10f);

            nodes         = l_texcoords.ConvertAll(v => Node.Create(l_texcoords.IndexOf(v)));
            edges         = l_indexedEdges.ConvertAll(e => Edge.Create(nodes[e.index1], nodes[e.index2]));
            m_TexVertices = l_texcoords.ConvertAll(v => v * factor);
            boneWeights   = l_texcoords.ConvertAll(v => BoneWeight.Create());
            indices       = l_indices;

            isDirty = true;

            m_DirtyVertices = 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)
            {
                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.º 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
        Vector3 ToVertex(Vector2 v)
        {
            float pixelsPerUnit = SpriteMeshUtils.GetSpritePixelsPerUnit(spriteMesh.sprite);

            return(ToVertex(v, pixelsPerUnit));
        }
Exemplo n.º 5
0
        List <Vector3> ToVertices(List <Vector2> list)
        {
            float pixelsPerUnit = SpriteMeshUtils.GetSpritePixelsPerUnit(spriteMesh.sprite);

            return(list.ConvertAll(v => ToVertex(v, pixelsPerUnit)));
        }
Exemplo n.º 6
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);
                }
            }
        }