Example #1
0
        public void SortTrianglesByDepth()
        {
            Debug.Assert(spriteMeshData != null);

            if (spriteMeshData.boneCount == 0)
            {
                return;
            }

            m_VertexOrderList.Clear();
            m_WeightedTriangles.Clear();

            for (var i = 0; i < spriteMeshData.vertexCount; i++)
            {
                var vertexOrder = 0f;
                var boneWeight  = spriteMeshData.GetWeight(i);

                for (var j = 0; j < boneWeight.Count; ++j)
                {
                    vertexOrder += spriteMeshData.GetBoneDepth(boneWeight[j].boneIndex) * boneWeight[j].weight;
                }

                m_VertexOrderList.Add(vertexOrder);
            }

            for (int i = 0; i < spriteMeshData.indices.Count; i += 3)
            {
                int   p1     = spriteMeshData.indices[i];
                int   p2     = spriteMeshData.indices[i + 1];
                int   p3     = spriteMeshData.indices[i + 2];
                float weight = (m_VertexOrderList[p1] + m_VertexOrderList[p2] + m_VertexOrderList[p3]) / 3f;

                m_WeightedTriangles.Add(new WeightedTriangle()
                {
                    p1 = p1, p2 = p2, p3 = p3, weight = weight
                });
            }

            m_WeightedTriangles.Sort();

            spriteMeshData.indices.Clear();

            for (var i = 0; i < m_WeightedTriangles.Count; ++i)
            {
                var triangle = m_WeightedTriangles[i];
                spriteMeshData.indices.Add(triangle.p1);
                spriteMeshData.indices.Add(triangle.p2);
                spriteMeshData.indices.Add(triangle.p3);
            }
        }