bool PathVolumeInfo::ContinueToTrace(const BSDF &bsdf) const { // Check if the volume priority system has to be applied if (bsdf.GetEventTypes() & TRANSMIT) { // Ok, the surface can transmit so check if volume priority // system is telling me to continue to trace the ray // I have to continue to trace the ray if: // // 1) I'm entering an object and the interior volume has a // lower priority than the current one (or is the same volume). // // 2) I'm exiting an object and I'm not leaving the current volume. const Volume *bsdfInteriorVol = bsdf.GetMaterialInteriorVolume(); // Condition #1 if (bsdf.hitPoint.intoObject && CompareVolumePriorities(currentVolume, bsdfInteriorVol)) return true; // Condition #2 // // I have to calculate the potentially new currentVolume in order // to check if I'm leaving the current one if ((!bsdf.hitPoint.intoObject) && currentVolume && (SimulateRemoveVolume(bsdfInteriorVol) == currentVolume)) return true; } return false; }