Apply a transition between two regions.
276{
277 if (next_region.segments.empty()) {
278 return;
279 }
280
281 auto next_data = container->get_region_data(next_region.segments[0].source_region);
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313 const size_t data_count = std::min<size_t>(output_data.size(), next_data.size());
314 for (size_t variant_idx = 0; variant_idx < data_count; ++variant_idx) {
315 auto current_span = convert_variant<double>(output_data[variant_idx]);
316 auto next_span = convert_variant<double>(
const_cast<DataVariant&
>(next_data[variant_idx]));
317
318 const size_t sample_count = std::min<size_t>(current_span.size(), next_span.size());
319
320 switch (current_region.transition_type) {
322 for (size_t i = 0; i < sample_count; ++i) {
323 double fade_factor = static_cast<double>(i) / static_cast<double>(sample_count);
324 current_span[i] = current_span[i] * (1.0 - fade_factor) + next_span[i] * fade_factor;
325 }
326 break;
327
329 for (size_t i = 0; i < sample_count; ++i) {
330 current_span[i] = current_span[i] * 0.5 + next_span[i] * 0.5;
331 }
332 break;
333
334 default:
335 break;
336 }
337 }
338}
std::variant< std::vector< double >, std::vector< float >, std::vector< uint8_t >, std::vector< uint16_t >, std::vector< uint32_t >, std::vector< std::complex< float > >, std::vector< std::complex< double > >, std::vector< glm::vec2 >, std::vector< glm::vec3 >, std::vector< glm::vec4 >, std::vector< glm::mat4 > > DataVariant
Multi-type data storage for different precision needs.
@ OVERLAP
Overlap regions during transition.
@ CROSSFADE
Crossfade between regions.