MayaFlux 0.4.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 279 of file RegionProcessors.cpp.

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