In the case of other things we collide with (particles and voxels), we initialize the ParticleCollisionSystem with a class that manages those things (ParticleTree, VoxelTree)... why not follow that same paradigm and initialize the ParticleCollisionSystem with a either a QVector<AvatarData>*, or some other class that contains a QVector<AvatarData>*?

Why am I suggesting this? mostly for consistency of operation, but also imagine an instance of PCS that doesn't have access to AvatarData (maybe a script node that doesn't care about avatar collisions). It seems like it would be cleaner to be able to call update() with the assumption that the PCS has been configured for context.