| 981 | } |
| 982 | |
| 983 | void |
| 984 | TrackerPanel::onAverageButtonClicked() |
| 985 | { |
| 986 | boost::shared_ptr<TrackerContext> context = getContext(); |
| 987 | |
| 988 | assert(context); |
| 989 | std::list<TrackMarkerPtr > markers; |
| 990 | context->getSelectedMarkers(&markers); |
| 991 | if ( markers.empty() ) { |
| 992 | Dialogs::warningDialog( tr("Average").toStdString(), tr("No tracks selected").toStdString() ); |
| 993 | |
| 994 | return; |
| 995 | } |
| 996 | |
| 997 | TrackMarkerPtr marker = makeTrackInternal(); |
| 998 | boost::shared_ptr<KnobDouble> centerKnob = marker->getCenterKnob(); |
| 999 | |
| 1000 | #ifdef AVERAGE_ALSO_PATTERN_QUAD |
| 1001 | boost::shared_ptr<KnobDouble> topLeftKnob = marker->getPatternTopLeftKnob(); |
| 1002 | boost::shared_ptr<KnobDouble> topRightKnob = marker->getPatternTopRightKnob(); |
| 1003 | boost::shared_ptr<KnobDouble> btmRightKnob = marker->getPatternBtmRightKnob(); |
| 1004 | boost::shared_ptr<KnobDouble> btmLeftKnob = marker->getPatternBtmLeftKnob(); |
| 1005 | #endif |
| 1006 | |
| 1007 | RangeD keyframesRange; |
| 1008 | keyframesRange.min = INT_MAX; |
| 1009 | keyframesRange.max = INT_MIN; |
| 1010 | for (std::list<TrackMarkerPtr >::iterator it = markers.begin(); it != markers.end(); ++it) { |
| 1011 | boost::shared_ptr<KnobDouble> markCenter = (*it)->getCenterKnob(); |
| 1012 | double mini, maxi; |
| 1013 | bool hasKey = markCenter->getFirstKeyFrameTime(ViewSpec(0), 0, &mini); |
| 1014 | if (!hasKey) { |
| 1015 | continue; |
| 1016 | } |
| 1017 | if (mini < keyframesRange.min) { |
| 1018 | keyframesRange.min = mini; |
| 1019 | } |
| 1020 | hasKey = markCenter->getLastKeyFrameTime(ViewSpec(0), 0, &maxi); |
| 1021 | |
| 1022 | ///both dimensions must have keyframes |
| 1023 | assert(hasKey); |
| 1024 | if (maxi > keyframesRange.max) { |
| 1025 | keyframesRange.max = maxi; |
| 1026 | } |
| 1027 | } |
| 1028 | |
| 1029 | bool hasKeyFrame = keyframesRange.min != INT_MIN && keyframesRange.max != INT_MAX; |
| 1030 | for (double t = keyframesRange.min; t <= keyframesRange.max; t += 1) { |
| 1031 | Point avgCenter; |
| 1032 | avgCenter.x = avgCenter.y = 0.; |
| 1033 | |
| 1034 | #ifdef AVERAGE_ALSO_PATTERN_QUAD |
| 1035 | Point avgTopLeft, avgTopRight, avgBtmRight, avgBtmLeft; |
| 1036 | avgTopLeft.x = avgTopLeft.y = avgTopRight.x = avgTopRight.y = avgBtmRight.x = avgBtmRight.y = avgBtmLeft.x = avgBtmLeft.y = 0; |
| 1037 | #endif |
| 1038 | |
| 1039 | |
| 1040 | for (std::list<TrackMarkerPtr >::iterator it = markers.begin(); it != markers.end(); ++it) { |
nothing calls this directly
no test coverage detected