My plan is to use CollisionInfo as the results of all collision checks.  It is a general struct that will eventually pick up a few more bits of context, and hopefully all of the details that matter will be filled in.  This particular change is an example of some code that was using some of the original findSpherePenetration() code which only returns a penetration.  As such, the contactPoint was not yet being computed or used for this path.  I wanted to enable JS scripts to know approximately in space where the contact point was happening (so that they could trigger a sound there, for example) so I just approximated with the midpoint between the two particle centers, which should be good enough for JS needs for the short term.

Eventually we must decide what the "contact point" of a collision actually means and standardize on it.  Other code that I wrote for the ShapeCollider computes the world-frame point on the surface of "shape A" (in its current penetrating position) that would be touching "shape B" if B were moved out by the "penetration", which is different from how this particle-particle contact is computed.

If the particles are bouncing then we don't actually need the correct contact point.  We just reflect them as soon we figure out that they are penetrating, and they should separate with approximately correct velocities.  This assumption breaks down when there are piles of particles such that each particle is colliding with more than one thing at a time.

We probably don't want to do mid-step collision detection to find the actual correct contact point because this kind of physics simulation does not degrade well as collision events get complicated -- certain configurations may drive the simulation to its knees.  What I think we want is a more flexible simulation that can be approximately correct if we run out of CPU cycles for the current frame and have to stop early.  One way to do this would be to use a "virlet" simulation strategy which Andrzej mentioned to Philip and I, but we haven't experimented with it yet.