public void Subdivide(ITriangulator triangulator, float largestAreaFactor, float areaThreshold)
        {
            Debug.Assert(spriteMeshData != null);
            Debug.Assert(triangulator != null);

            m_VerticesTemp.Clear();
            m_EdgesTemp.Clear();
            m_EdgesTemp.AddRange(spriteMeshData.edges);

            for (int i = 0; i < spriteMeshData.vertexCount; ++i)
            {
                m_VerticesTemp.Add(spriteMeshData.GetPosition(i));
            }

            try
            {
                var indices = new List <int>();

                triangulator.Tessellate(0f, 0f, 0f, largestAreaFactor, areaThreshold, 100, m_VerticesTemp, m_EdgesTemp, indices);

                spriteMeshData.Clear();

                for (int i = 0; i < m_VerticesTemp.Count; ++i)
                {
                    spriteMeshData.AddVertex(m_VerticesTemp[i], default(BoneWeight));
                }

                spriteMeshData.edges.AddRange(m_EdgesTemp);
                spriteMeshData.indices.AddRange(indices);
            }
            catch (Exception)
            {
            }
        }
Example #2
0
        public void Triangulate(ITriangulator triangulator)
        {
            Debug.Assert(spriteMeshData != null);
            Debug.Assert(triangulator != null);

            FillMeshDataContainers(ref m_VerticesTemp, ref m_EdgesTemp, out var weightData, out var hasWeightData);

            var indices = new List <int>();

            triangulator.Triangulate(m_VerticesTemp, m_EdgesTemp, indices);

            if (m_VerticesTemp.Count == 0)
            {
                spriteMeshData.Clear();
                CreateQuad();

                FillMeshDataContainers(ref m_VerticesTemp, ref m_EdgesTemp, out weightData, out hasWeightData);
                indices.Clear();
                triangulator.Triangulate(m_VerticesTemp, m_EdgesTemp, indices);
            }

            spriteMeshData.Clear();
            spriteMeshData.edges.AddRange(m_EdgesTemp);
            spriteMeshData.indices.AddRange(indices);

            var hasNewVertices = m_VerticesTemp.Count != weightData.Count;

            for (var i = 0; i < m_VerticesTemp.Count; ++i)
            {
                var boneWeight = default(BoneWeight);
                if (!hasNewVertices)
                {
                    boneWeight = weightData[i].ToBoneWeight(true);
                }
                spriteMeshData.AddVertex(m_VerticesTemp[i], boneWeight);
            }

            if (hasNewVertices && hasWeightData)
            {
                CalculateWeights(new BoundedBiharmonicWeightsGenerator(), null, 0.01f);
            }
        }
Example #3
0
        public void DebugMesh(ISpriteMeshData spriteMeshData, Vector2[] vertices, Edge[] edges, Vector2[] controlPoints, Edge[] bones, int[] pins)
        {
            var boneSamples  = SampleBones(controlPoints, bones, kNumSamples);
            var verticesList = new List <Vector2>(vertices.Length + controlPoints.Length + boneSamples.Length);
            var edgesList    = new List <Edge>(edges);
            var indicesList  = new List <int>();

            verticesList.AddRange(vertices);
            verticesList.AddRange(controlPoints);
            verticesList.AddRange(boneSamples);

            TriangulationUtility.Tessellate(kMinAngle, 0f, kMeshAreaFactor, kLargestTriangleAreaFactor, 0, verticesList, edgesList, indicesList);

            spriteMeshData.Clear();

            verticesList.ForEach(v => spriteMeshData.AddVertex(v, new BoneWeight()));
            spriteMeshData.edges.AddRange(edgesList);
            spriteMeshData.indices.AddRange(indicesList);
        }