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"); }
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(); } }