//-***************************************************************************** void GetRelevantSampleTimes( ProcArgs &args, TimeSamplingPtr timeSampling, size_t numSamples, SampleTimeSet &output ) { if ( numSamples < 2 ) { output.insert( 0.0 ); return; } chrono_t frameTime = args.frame / args.fps; chrono_t shutterOpenTime = ( args.frame + args.shutterOpen ) / args.fps; chrono_t shutterCloseTime = ( args.frame + args.shutterClose ) / args.fps; std::pair<index_t, chrono_t> shutterOpenFloor = timeSampling->getFloorIndex( shutterOpenTime, numSamples ); std::pair<index_t, chrono_t> shutterCloseCeil = timeSampling->getCeilIndex( shutterCloseTime, numSamples ); //TODO, what's a reasonable episilon? static const chrono_t epsilon = 1.0 / 10000.0; //check to see if our second sample is really the //floor that we want due to floating point slop //first make sure that we have at least two samples to work with if ( shutterOpenFloor.first < shutterCloseCeil.first ) { //if our open sample is less than open time, //look at the next index time if ( shutterOpenFloor.second < shutterOpenTime ) { chrono_t nextSampleTime = timeSampling->getSampleTime( shutterOpenFloor.first + 1 ); if ( fabs( nextSampleTime - shutterOpenTime ) < epsilon ) { shutterOpenFloor.first += 1; shutterOpenFloor.second = nextSampleTime; } } } for ( index_t i = shutterOpenFloor.first; i < shutterCloseCeil.first; ++i ) { output.insert( timeSampling->getSampleTime( i ) ); } //no samples above? put frame time in there and get out if ( output.size() == 0 ) { output.insert( frameTime ); return; } chrono_t lastSample = *(output.rbegin() ); //determine whether we need the extra sample at the end if ( ( fabs( lastSample - shutterCloseTime ) > epsilon ) && lastSample < shutterCloseTime ) { output.insert( shutterCloseCeil.second ); } }