I think you are correct, that seems to work nicely!
Thanks for the input.
Everything seems to behave as described in the paper, definitely an improvement over regular PBD.
The stiffness parameter is a bit tricky though, for two reasons.
By their definition (if I'm interpreting correctly), alpha = 1 / stiffness. I found this to not completely solve a constraint in one step when stiffness = 1.
So, I use a slightly modified version: alpha = (1 / stiffness) - 1. This will give alpha = 0 when stiffness is 1, which will fully solve a constraint in one step.
The second thing about the stiffness is that, although the valid range is [0, 1], how stiff it makes the constraint is highly dependent on the constraint's scaling.
For example, with the usual distance constraint C(a,b) = |a - b| - restLength, with a stiffness of 0.5 and a timestep of 1, the constraint will be reasonably stiff using XPBD.
However, using the normalized version C(a,b) = (|a - b| / restLength) - 1, will apply almost zero correction, so you need a much higher stiffness value to achieve the same effect.
Intuitively, this is due to the alpha in the denominator of the delta lambda "overpowering" the constraint.
This is not a huge issue, since you can simply scale the stiffness value based on your choice of constraint function.