bool DistanceConstraint::solvePositionConstraint(SimulationModel &model)
{
	ParticleData &pd = model.getParticles();

	const unsigned i1 = m_bodies[0];
	const unsigned i2 = m_bodies[1];

	Eigen::Vector3f &x1 = pd.getPosition(i1);
	Eigen::Vector3f &x2 = pd.getPosition(i2);
	const float invMass1 = pd.getInvMass(i1);
	const float invMass2 = pd.getInvMass(i2);

	Eigen::Vector3f corr1, corr2;
	const bool res = PositionBasedDynamics::solve_DistanceConstraint(
		x1, invMass1, x2, invMass2,
		m_restLength, model.getClothStiffness(), model.getClothStiffness(), corr1, corr2);

	if (res)
	{
		if (invMass1 != 0.0f)
			x1 += corr1;
		if (invMass2 != 0.0f)
			x2 += corr2;
	}
	return res;
}
bool GenericDistanceConstraint::solvePositionConstraint(SimulationModel &model)
{
    ParticleData &pd = model.getParticles();

    const unsigned i1 = m_bodies[0];
    const unsigned i2 = m_bodies[1];

    Eigen::Vector3f &x1 = pd.getPosition(i1);
    Eigen::Vector3f &x2 = pd.getPosition(i2);
    const float invMass1 = pd.getInvMass(i1);
    const float invMass2 = pd.getInvMass(i2);

    const float invMass[2] = { invMass1, invMass2 };
    const Eigen::Vector3f x[2] = { x1, x2 };

    Eigen::Vector3f corr[2];
    const bool res = PositionBasedGenericConstraints::solve_GenericConstraint<2, 1>(
                         invMass, x, &m_restLength,
                         GenericDistanceConstraint::constraintFct,
                         GenericDistanceConstraint::gradientFct,
                         corr);

    if (res)
    {
        const float stiffness = model.getClothStiffness();
        if (invMass1 != 0.0f)
            x1 += stiffness * corr[0];
        if (invMass2 != 0.0f)
            x2 += stiffness * corr[1];
    }
    return res;
}