public void CalculateWeights_FiltersSmallWeights()
        {
            float tolerance = 0.1f;

            IWeightsGenerator generator = Substitute.For <IWeightsGenerator>();

            m_SpriteMeshDataController.CreateVertex(Vector2.zero);

            BoneWeight[] weigts = new BoneWeight[]
            {
                new BoneWeight()
                {
                    boneIndex0 = 0,
                    boneIndex1 = 1,
                    weight0    = 0.05f,
                    weight1    = 0.95f
                }
            };

            generator.Calculate(Arg.Any <Vector2[]>(), Arg.Any <Edge[]>(), Arg.Any <Vector2[]>(), Arg.Any <Edge[]>(), Arg.Any <int[]>()).Returns(weigts);

            m_SpriteMeshDataController.CalculateWeights(generator, null, tolerance);

            BoneWeight result = m_SpriteMeshData.vertices[0].editableBoneWeight.ToBoneWeight(false);

            Assert.AreEqual(0, result.boneIndex0, "Incorrect bone index");
            Assert.AreEqual(1, result.boneIndex1, "Incorrect bone index");
            Assert.AreEqual(0f, result.weight0, "Incorrect bone weight");
            Assert.AreEqual(1f, result.weight1, "Incorrect bone weight");
        }
예제 #2
0
        void AutoGenerateSpriteSkinData(SpriteMetaData metaData)
        {
            //If bone data exist but skinning data doesn't exist, auto generate them
            if (metaData.spriteBone != null && metaData.spriteBone.Count > 0 &&
                (metaData.vertices == null || metaData.vertices.Count == 0))
            {
                var spriteMeshDataController = new SpriteMeshDataController();
                var smd = new SpriteMeshData();
                smd.spriteID = metaData.spriteID;
                smd.frame    = metaData.rect;
                smd.pivot    = metaData.pivot;
                smd.bones    = ModuleUtility.CreateSpriteBoneData(metaData.spriteBone.ToArray(), Matrix4x4.TRS(metaData.rect.position, Quaternion.identity, Vector3.one));
                spriteMeshDataController.spriteMeshData = smd;
                spriteMeshDataController.OutlineFromAlpha(new OutlineGenerator(), GetDataProvider <ITextureDataProvider>(), 0.05f, 200);
                spriteMeshDataController.Triangulate(new Triangulator());
                spriteMeshDataController.Subdivide(new Triangulator(), 0.25f);
                spriteMeshDataController.CalculateWeights(new BoundedBiharmonicWeightsGenerator(), null, 0.01f);
                spriteMeshDataController.SortTrianglesByDepth();

                List <Vertex2DMetaData> vmd = new List <Vertex2DMetaData>(smd.vertices.Count);
                foreach (var v in smd.vertices)
                {
                    vmd.Add(new Vertex2DMetaData()
                    {
                        position = v.position - smd.frame.position, boneWeight = v.editableBoneWeight.ToBoneWeight(true)
                    });
                }
                List <Vector2Int> emd = new List <Vector2Int>(smd.edges.Count);
                foreach (var e in smd.edges)
                {
                    emd.Add(new Vector2Int(e.index1, e.index2));
                }

                metaData.vertices = vmd;
                metaData.indices  = smd.indices.ToArray();
                metaData.edges    = emd.ToArray();
            }
        }