protected virtual void UpdateBounces(TimeSpan duration)
        {
            Parallel.ForEach(quadTree.AllQuadrants(), quad =>
            {
                for (int i = 0; i < quad.Nodes.Count; i++)
                {
                    NodeBase nodeA = quad.Nodes[i];

                    // find bounces
                    for (int j = i + 1; j < quad.Nodes.Count; j++)
                    {
                        NodeBase nodeB = quad.Nodes[j];

                        double dist = VectorTools.Distance(nodeA.Position, nodeB.Position);
                        if (dist <= nodeA.Radius + nodeB.Radius)
                        {
                            CalcNodeCollision(nodeA, nodeB, bounceEfficiency);
                        }
                    }
                }
            });
        }