MayaFlux 0.1.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 272 of file RegionProcessors.cpp.

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