void FastMassSpring::fillJMatrix(TripletList& triplets, Edges& edges, int edge_counts)
{
  for (decltype(edges.size()) i = 0; i != edges.size(); ++i)
  {
    for (int j = 0; j < 3; ++j)
    {
      triplets.push_back(Triplet(3 * edges[i].first + j, 3 * (i + edge_counts) + j, 1));
      triplets.push_back(Triplet(3 * edges[i].second + j, 3 * (i + edge_counts) + j, -1));
    }
  }
}
void FastMassSpring::fillLMatrix(TripletList& triplets, Edges& edges)
{
  for (auto& i : edges)
  {
    for (int j = 0; j < 3; ++j)
    {
      triplets.push_back(Triplet(3 * i.first + j, 3 * i.first + j, 1));
      triplets.push_back(Triplet(3 * i.first + j, 3 * i.second + j, -1));
      triplets.push_back(Triplet(3 * i.second + j, 3 * i.first + j, -1));
      triplets.push_back(Triplet(3 * i.second + j, 3 * i.second + j, 1));
    }
  }
}
BLI_INLINE void triplets_m3fl(TripletList &tlist, float m[3][3], int i, int j, float factor)
{
	i *= 3;
	j *= 3;
	for (int l = 0; l < 3; ++l) {
		for (int k = 0; k < 3; ++k) {
			tlist.push_back(Triplet(i + k, j + l, m[k][l] * factor));
		}
	}
}
BLI_INLINE void lMatrix_sub_triplets(lMatrix &r, const TripletList &tlist)
{
	lMatrix t(r.rows(), r.cols());
	t.setFromTriplets(tlist.begin(), tlist.end());
	r -= t;
}
BLI_INLINE void lMatrix_madd_triplets(lMatrix &r, const TripletList &tlist, float f)
{
	lMatrix t(r.rows(), r.cols());
	t.setFromTriplets(tlist.begin(), tlist.end());
	r += f * t;
}