Implement PathVertex.ComputeWeight()
Use PathVertex.ComputeWeight() instead of counting paths directly

Check the weight against the path count.

Feature-End: bdpt-incremental-weights
Add PathVertex.IsSpecular() method and use it in BidirectionalPathTracer

Feature-Start: bdpt-light-contributions
Add an option to record light contributions for BidirectionalPathTracer

Leave it off for all BDPT scenes for now.
Add scaffolding for handling light contributions in BidirectionalPathTracer
Implement contribution computation from sensor super-vertices
Add Sensor.ComputePixelPosition() method and implement for all Sensors
Relax restrictions on Sensor.ComputePixelPosition()
Implement contribution computation for sensor vertices
Make all BDPT scenes record light contributions

Feature-End: bdpt-light-contributions
Add Light.SampleLeSpatialFromPoint() method and implement for DiffuseAreaLight

Also rename Light.ComputeLePdfFromPoint() to Light.ComputePdfFromPoint().

Feature-Start: bdpt-direct-lighting
Add PathVertex.SampleDirect() method and implement direct light sampling
Add an option to use direct lighting for BidirectionalPathTracer

Leave it off for all BDPT scenes for now.
Use direct lighting in BidirectionalPathTracer when directed to
Turn on direct lighting for most BDPT scenes

Feature-End: bdpt-direct-lighting
Add Sensor.SampleWeSpatialFromPoint() method and implement for all sensors

Also rename Sensor.ComputeWePdfFromPoint() to Sensor.ComputePdfFromPoint().

Feature-Start: bdpt-direct-sensor-sampling
Implement direct sensor sampling in PathVertex.SampleDirect()
Add an option to use direct sensor sampling for BidirectionalPathTracer

Leave it off for all BDPT scenes for now.
Use direct sensor sampling in BidirectionalPathTracer when directed to
Turn on direct sensor sampling for most BDPT scenes

Feature-End: bdpt-direct-sensor-sampling