Apply a transition between two regions.
284{
285 if (next_region.segments.empty()) {
286 return;
287 }
288
289 auto next_data = container->get_region_data(next_region.segments[0].source_region);
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321 const size_t data_count = std::min<size_t>(output_data.size(), next_data.size());
322 for (size_t variant_idx = 0; variant_idx < data_count; ++variant_idx) {
323 auto current_span = convert_variant<double>(output_data[variant_idx]);
324 auto next_span = convert_variant<double>(
const_cast<DataVariant&
>(next_data[variant_idx]));
325
326 const size_t sample_count = std::min<size_t>(current_span.size(), next_span.size());
327
328 switch (current_region.transition_type) {
330 for (size_t i = 0; i < sample_count; ++i) {
331 double fade_factor = static_cast<double>(i) / static_cast<double>(sample_count);
332 current_span[i] = current_span[i] * (1.0 - fade_factor) + next_span[i] * fade_factor;
333 }
334 break;
335
337 for (size_t i = 0; i < sample_count; ++i) {
338 current_span[i] = current_span[i] * 0.5 + next_span[i] * 0.5;
339 }
340 break;
341
342 default:
343 break;
344 }
345 }
346}
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.