MayaFlux 0.2.0
Digital-First Multimedia Processing Framework
Loading...
Searching...
No Matches

◆ apply_region_transition()

void MayaFlux::Kakshya::RegionOrganizationProcessor::apply_region_transition ( const OrganizedRegion current_region,
const OrganizedRegion next_region,
const std::shared_ptr< SignalSourceContainer > &  container,
std::vector< DataVariant > &  output_data 
)
protectedvirtual

Apply a transition between two regions.

Parameters
current_regionThe current region.
next_regionThe next region.
containerThe signal container.
output_dataOutput data variant to fill.

Definition at line 280 of file RegionProcessors.cpp.

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 // TODO:: Reenable when C++23 is more widely supported
292 /* for (auto&& [current_var, next_var] : std::views::zip(output_data, next_data)) {
293 auto current_span = convert_variant<double>(current_var);
294 auto next_span = convert_variant<double>(const_cast<DataVariant&>(next_var));
295 auto paired_samples = std::views::zip(current_span, next_span)
296 | std::views::enumerate;
297
298 switch (current_region.transition_type) {
299 case RegionTransition::CROSSFADE:
300 std::ranges::for_each(paired_samples, [size = current_span.size()](auto&& item) {
301 auto [i, sample_pair] = item;
302 auto [current, next] = sample_pair;
303 double fade_factor = static_cast<double>(i) / static_cast<double>(size);
304 current = current * (1.0 - fade_factor) + next * fade_factor;
305 });
306 break;
307
308 case RegionTransition::OVERLAP:
309 std::ranges::for_each(paired_samples, [](auto&& item) {
310 auto [i, sample_pair] = item;
311 auto [current, next] = sample_pair;
312 current = current * 0.5 + next * 0.5;
313 });
314 break;
315
316 default:
317 break;
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.
Definition NDData.hpp:73
@ OVERLAP
Overlap regions during transition.
@ CROSSFADE
Crossfade between regions.

References MayaFlux::Kakshya::CROSSFADE, MayaFlux::Kakshya::OVERLAP, MayaFlux::Kakshya::OrganizedRegion::segments, and MayaFlux::Kakshya::OrganizedRegion::transition_type.

Referenced by process_organized_regions().

+ Here is the caller graph for this function: