Apply a transition between two regions.
283{
284 if (next_region.segments.empty()) {
285 return;
286 }
287
288 auto next_data = container->get_region_data(next_region.segments[0].source_region);
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
314
315
316
317
318
319
320 const size_t data_count = std::min<size_t>(output_data.size(), next_data.size());
321 for (size_t variant_idx = 0; variant_idx < data_count; ++variant_idx) {
322 auto current_span = convert_variant<double>(output_data[variant_idx]);
323 auto next_span = convert_variant<double>(
const_cast<DataVariant&
>(next_data[variant_idx]));
324
325 const size_t sample_count = std::min<size_t>(current_span.size(), next_span.size());
326
327 switch (current_region.transition_type) {
329 for (size_t i = 0; i < sample_count; ++i) {
330 double fade_factor = static_cast<double>(i) / static_cast<double>(sample_count);
331 current_span[i] = current_span[i] * (1.0 - fade_factor) + next_span[i] * fade_factor;
332 }
333 break;
334
336 for (size_t i = 0; i < sample_count; ++i) {
337 current_span[i] = current_span[i] * 0.5 + next_span[i] * 0.5;
338 }
339 break;
340
341 default:
342 break;
343 }
344 }
345}
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.