Implemented sync track blending for tracks with more than 2 markers.
This commit is contained in:
+100
-53
@@ -10,21 +10,17 @@ TEST_CASE("Basic", "[SyncTrack]") {
|
||||
track_A.m_num_intervals = 2;
|
||||
track_A.m_duration = 2.0;
|
||||
track_A.m_interval_start[0] = 0.f;
|
||||
track_A.m_interval_end[0] = 0.7f;
|
||||
track_A.m_interval_durations[0] = 0.7;
|
||||
track_A.m_interval_ratio[0] = 0.7;
|
||||
track_A.m_interval_start[1] = 0.7f;
|
||||
track_A.m_interval_end[1] = 1.0f;
|
||||
track_A.m_interval_durations[1] = 0.3;
|
||||
track_A.m_interval_ratio[1] = 0.3;
|
||||
|
||||
SyncTrack track_B;
|
||||
track_B.m_num_intervals = 2;
|
||||
track_B.m_duration = 1.5;
|
||||
track_B.m_interval_start[0] = 0.0f;
|
||||
track_B.m_interval_end[0] = 0.6f;
|
||||
track_B.m_interval_durations[0] = 0.6;
|
||||
track_B.m_interval_ratio[0] = 0.6;
|
||||
track_B.m_interval_start[1] = 0.6f;
|
||||
track_B.m_interval_end[1] = 1.0f;
|
||||
track_B.m_interval_durations[1] = 0.4;
|
||||
track_B.m_interval_ratio[1] = 0.4;
|
||||
|
||||
WHEN("Calculating sync time of track_B at 0.5 duration") {
|
||||
float sync_time_at_0_75 =
|
||||
@@ -69,48 +65,16 @@ TEST_CASE("Basic", "[SyncTrack]") {
|
||||
WHEN("Blending two synctracks with weight 0.") {
|
||||
SyncTrack blended = SyncTrack::Blend(0.f, track_A, track_B);
|
||||
|
||||
THEN("Result must equal track_A") {
|
||||
REQUIRE(blended.m_duration == track_A.m_duration);
|
||||
REQUIRE(
|
||||
blended.m_interval_durations[0] == track_A.m_interval_durations[0]);
|
||||
REQUIRE(
|
||||
blended.m_interval_durations[1] == track_A.m_interval_durations[1]);
|
||||
|
||||
REQUIRE(blended.m_sync_markers[0] == track_A.m_sync_markers[0]);
|
||||
REQUIRE(blended.m_sync_markers[1] == track_A.m_sync_markers[1]);
|
||||
|
||||
REQUIRE(blended.m_interval_start[0] == track_A.m_interval_start[0]);
|
||||
REQUIRE(blended.m_interval_start[1] == track_A.m_interval_start[1]);
|
||||
|
||||
REQUIRE(blended.m_interval_end[0] == track_A.m_interval_end[0]);
|
||||
REQUIRE(blended.m_interval_end[1] == track_A.m_interval_end[1]);
|
||||
}
|
||||
THEN("Result must equal track_A") { REQUIRE(track_A == blended); }
|
||||
}
|
||||
|
||||
WHEN("Blending two synctracks with weight 1.") {
|
||||
SyncTrack blended = SyncTrack::Blend(1.f, track_A, track_B);
|
||||
|
||||
THEN("Result must equal track_B") {
|
||||
REQUIRE(blended.m_duration == track_B.m_duration);
|
||||
REQUIRE(
|
||||
blended.m_interval_durations[0] == track_B.m_interval_durations[0]);
|
||||
REQUIRE(
|
||||
blended.m_interval_durations[1] == track_B.m_interval_durations[1]);
|
||||
|
||||
REQUIRE(blended.m_sync_markers[0] == track_B.m_sync_markers[0]);
|
||||
REQUIRE(blended.m_sync_markers[1] == track_B.m_sync_markers[1]);
|
||||
|
||||
REQUIRE(blended.m_interval_start[0] == track_B.m_interval_start[0]);
|
||||
REQUIRE(blended.m_interval_start[1] == track_B.m_interval_start[1]);
|
||||
|
||||
REQUIRE(blended.m_interval_end[0] == track_B.m_interval_end[0]);
|
||||
REQUIRE(blended.m_interval_end[1] == track_B.m_interval_end[1]);
|
||||
}
|
||||
THEN("Result must equal track_B") { REQUIRE(track_B == blended); }
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
TEST_CASE("Sync Marker Interval Calculation", "[SyncTrack]") {
|
||||
SyncTrack track_A;
|
||||
track_A.m_num_intervals = 2;
|
||||
@@ -121,13 +85,11 @@ TEST_CASE("Sync Marker Interval Calculation", "[SyncTrack]") {
|
||||
WHEN("Calculating intervals") {
|
||||
track_A.CalcIntervals();
|
||||
|
||||
CHECK(track_A.m_interval_start[0] == 0.9f);
|
||||
CHECK(track_A.m_interval_end[0] == 0.2f);
|
||||
CHECK(track_A.m_interval_durations[0] == 0.3f);
|
||||
CHECK(track_A.m_interval_start[0] == Catch::Detail::Approx(0.9f));
|
||||
CHECK(track_A.m_interval_ratio[0] == Catch::Detail::Approx(0.3f));
|
||||
|
||||
CHECK(track_A.m_interval_start[1] == 0.2f);
|
||||
CHECK(track_A.m_interval_end[1] == 0.9f);
|
||||
CHECK(track_A.m_interval_durations[1] == 0.7f);
|
||||
CHECK(track_A.m_interval_start[1] == Catch::Detail::Approx(0.2f));
|
||||
CHECK(track_A.m_interval_ratio[1] == Catch::Detail::Approx(0.7f));
|
||||
|
||||
WHEN("Querying ratio at sync time at 1.001") {
|
||||
float ratio = track_A.CalcRatioFromSyncTime(1.0001f);
|
||||
@@ -145,11 +107,96 @@ TEST_CASE("Sync Marker Interval Calculation", "[SyncTrack]") {
|
||||
}
|
||||
}
|
||||
|
||||
WHEN ("Blending with another sync track") {
|
||||
WHEN("Blending sync track with 3 events") {
|
||||
track_A.m_num_intervals = 3;
|
||||
track_A.m_duration = 2.0;
|
||||
track_A.m_sync_markers[0] = 0.;
|
||||
track_A.m_sync_markers[1] = 0.3;
|
||||
track_A.m_sync_markers[2] = 0.9;
|
||||
track_A.CalcIntervals();
|
||||
|
||||
SyncTrack track_B;
|
||||
track_B.m_num_intervals = 2;
|
||||
track_B.m_duration = 1.0;
|
||||
track_B.m_sync_markers[0] = 0.9;
|
||||
track_B.m_sync_markers[1] = 0.2;
|
||||
track_B.m_num_intervals = 3;
|
||||
track_B.m_duration = 1.5;
|
||||
track_B.m_sync_markers[0] = 0.7;
|
||||
track_B.m_sync_markers[1] = 0.9;
|
||||
track_B.m_sync_markers[2] = 0.2;
|
||||
track_B.CalcIntervals();
|
||||
|
||||
WHEN("Calculating A's durations") {
|
||||
CHECK(track_A.m_interval_ratio[0] == Catch::Detail::Approx(0.3));
|
||||
CHECK(track_A.m_interval_ratio[1] == Catch::Detail::Approx(0.6));
|
||||
CHECK(track_A.m_interval_ratio[2] == Catch::Detail::Approx(0.1));
|
||||
}
|
||||
|
||||
WHEN("Calculating B's durations") {
|
||||
CHECK(track_B.m_interval_ratio[0] == Catch::Detail::Approx(0.2));
|
||||
CHECK(track_B.m_interval_ratio[1] == Catch::Detail::Approx(0.3));
|
||||
CHECK(track_B.m_interval_ratio[2] == Catch::Detail::Approx(0.5));
|
||||
}
|
||||
|
||||
WHEN("Blending two synctracks with weight 0.") {
|
||||
SyncTrack blended = SyncTrack::Blend(0.f, track_A, track_B);
|
||||
|
||||
THEN("Result must equal track_A") { REQUIRE(track_A == blended); }
|
||||
}
|
||||
|
||||
WHEN("Blending two synctracks with weight 1.") {
|
||||
SyncTrack blended = SyncTrack::Blend(1.f, track_A, track_B);
|
||||
|
||||
THEN("Result must equal track_B") { REQUIRE(track_B == blended); }
|
||||
}
|
||||
|
||||
WHEN("Blending with weight 0.2") {
|
||||
float weight = 0.2f;
|
||||
SyncTrack blended = SyncTrack::Blend(weight, track_A, track_B);
|
||||
|
||||
REQUIRE(
|
||||
blended.m_duration
|
||||
== (1.0f - weight) * track_A.m_duration
|
||||
+ weight * track_B.m_duration);
|
||||
REQUIRE(
|
||||
blended.m_interval_start[0]
|
||||
== fmodf(
|
||||
(1.0f - weight) * (track_A.m_interval_start[0] + 1.0f)
|
||||
+ weight * (track_B.m_interval_start[0]),
|
||||
1.0f));
|
||||
REQUIRE(
|
||||
blended.m_interval_ratio[1]
|
||||
== (1.0f - weight) * (track_A.m_interval_ratio[1])
|
||||
+ weight * (track_B.m_interval_ratio[1])
|
||||
);
|
||||
REQUIRE(
|
||||
blended.m_interval_ratio[2]
|
||||
== (1.0f - weight) * (track_A.m_interval_ratio[2])
|
||||
+ weight * (track_B.m_interval_ratio[2])
|
||||
);
|
||||
}
|
||||
|
||||
WHEN("Inverted blending with weight 0.2") {
|
||||
float weight = 0.2f;
|
||||
SyncTrack blended = SyncTrack::Blend(weight, track_B, track_A);
|
||||
|
||||
REQUIRE(
|
||||
blended.m_duration
|
||||
== (1.0f - weight) * track_B.m_duration
|
||||
+ weight * track_A.m_duration);
|
||||
REQUIRE(
|
||||
blended.m_interval_start[0]
|
||||
== fmodf(
|
||||
(1.0f - weight) * (track_B.m_interval_start[0])
|
||||
+ weight * (track_A.m_interval_start[0] + 1.0f),
|
||||
1.0f));
|
||||
REQUIRE(
|
||||
blended.m_interval_ratio[1]
|
||||
== (1.0f - weight) * (track_B.m_interval_ratio[1])
|
||||
+ weight * (track_A.m_interval_ratio[1])
|
||||
);
|
||||
REQUIRE(
|
||||
blended.m_interval_ratio[2]
|
||||
== (1.0f - weight) * (track_B.m_interval_ratio[2])
|
||||
+ weight * (track_A.m_interval_ratio[2])
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user