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) { } }
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); } }
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); }