| 138 | } |
| 139 | |
| 140 | std::vector<float> GetAverageSpeed(AEGP_StreamRefH streamHandle, int index, int dimensionality) { |
| 141 | const auto& Suites = GetSuites(); |
| 142 | const auto& PluginID = GetPluginID(); |
| 143 | |
| 144 | std::vector<float> averageSpeedList; |
| 145 | AEGP_StreamType streamType; |
| 146 | Suites->StreamSuite4()->AEGP_GetStreamType(streamHandle, &streamType); |
| 147 | if (streamType == AEGP_StreamType_NO_DATA) { |
| 148 | averageSpeedList.push_back(1); |
| 149 | return averageSpeedList; |
| 150 | } |
| 151 | |
| 152 | AEGP_StreamValue2 lastValue = {}; |
| 153 | Suites->KeyframeSuite4()->AEGP_GetNewKeyframeValue(PluginID, streamHandle, index - 1, &lastValue); |
| 154 | AEGP_StreamValue2 value = {}; |
| 155 | Suites->KeyframeSuite4()->AEGP_GetNewKeyframeValue(PluginID, streamHandle, index, &value); |
| 156 | |
| 157 | A_Time lastTime = {}; |
| 158 | Suites->KeyframeSuite4()->AEGP_GetKeyframeTime(streamHandle, index - 1, AEGP_LTimeMode_CompTime, |
| 159 | &lastTime); |
| 160 | A_Time time = {}; |
| 161 | Suites->KeyframeSuite4()->AEGP_GetKeyframeTime(streamHandle, index, AEGP_LTimeMode_CompTime, |
| 162 | &time); |
| 163 | auto duration = static_cast<float>(time.value - lastTime.value) / time.scale; |
| 164 | |
| 165 | switch (streamType) { |
| 166 | case AEGP_StreamType_ThreeD_SPATIAL: |
| 167 | case AEGP_StreamType_TwoD_SPATIAL: { |
| 168 | AEGP_StreamValue2 spatialTemp = {}; |
| 169 | AEGP_StreamValue2 spatialIn = {}; |
| 170 | AEGP_StreamValue2 spatialOut = {}; |
| 171 | Suites->KeyframeSuite4()->AEGP_GetNewKeyframeSpatialTangents( |
| 172 | PluginID, streamHandle, index - 1, &spatialTemp, &spatialOut); |
| 173 | Suites->KeyframeSuite4()->AEGP_GetNewKeyframeSpatialTangents(PluginID, streamHandle, index, |
| 174 | &spatialIn, &spatialTemp); |
| 175 | auto curveLength = GetCurveLength(lastValue, spatialOut, spatialIn, value); |
| 176 | Suites->StreamSuite4()->AEGP_DisposeStreamValue(&spatialTemp); |
| 177 | Suites->StreamSuite4()->AEGP_DisposeStreamValue(&spatialIn); |
| 178 | Suites->StreamSuite4()->AEGP_DisposeStreamValue(&spatialOut); |
| 179 | averageSpeedList.push_back(curveLength / duration); |
| 180 | } break; |
| 181 | case AEGP_StreamType_ThreeD: |
| 182 | averageSpeedList.push_back(static_cast<float>(value.val.three_d.x - lastValue.val.three_d.x) / |
| 183 | duration); |
| 184 | averageSpeedList.push_back(static_cast<float>(value.val.three_d.y - lastValue.val.three_d.y) / |
| 185 | duration); |
| 186 | averageSpeedList.push_back(static_cast<float>(value.val.three_d.z - lastValue.val.three_d.z) / |
| 187 | duration); |
| 188 | break; |
| 189 | case AEGP_StreamType_TwoD: |
| 190 | averageSpeedList.push_back(static_cast<float>(value.val.two_d.x - lastValue.val.two_d.x) / |
| 191 | duration); |
| 192 | averageSpeedList.push_back(static_cast<float>(value.val.two_d.y - lastValue.val.two_d.y) / |
| 193 | duration); |
| 194 | break; |
| 195 | case AEGP_StreamType_OneD: |
| 196 | averageSpeedList.push_back(static_cast<float>(value.val.one_d - lastValue.val.one_d) / |
| 197 | duration); |
no test coverage detected