AnimTestbed/tests/SyncTrackTests.cc

202 lines
6.6 KiB
C++

//
// Created by martin on 16.11.21.
//
#include "SkinnedMesh.h"
#include "catch.hpp"
TEST_CASE("Basic", "[SyncTrack]") {
SyncTrack track_A;
track_A.m_num_intervals = 2;
track_A.m_duration = 2.0;
track_A.m_interval_start[0] = 0.f;
track_A.m_interval_ratio[0] = 0.7;
track_A.m_interval_start[1] = 0.7f;
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_ratio[0] = 0.6;
track_B.m_interval_start[1] = 0.6f;
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 =
track_B.CalcSyncFromAbsTime(0.5 * track_B.m_duration);
REQUIRE(sync_time_at_0_75 == Catch::Detail::Approx(0.83333));
}
WHEN("Calculating sync time of track_B at 0.6 duration") {
float sync_time_at_0_6 =
track_B.CalcSyncFromAbsTime(0.6 * track_B.m_duration);
REQUIRE(sync_time_at_0_6 == Catch::Detail::Approx(1.0));
}
WHEN("Calculating sync time of track_B at 0.7 duration") {
float sync_time_at_0_7 =
track_B.CalcSyncFromAbsTime(0.7 * track_B.m_duration);
REQUIRE(sync_time_at_0_7 == Catch::Detail::Approx(1.25));
}
WHEN("Calculating sync time of track_B at 0.0 duration") {
float sync_time_at_1_0 =
track_B.CalcSyncFromAbsTime(0.0 * track_B.m_duration);
REQUIRE(sync_time_at_1_0 == Catch::Detail::Approx(0.0));
}
WHEN("Calculating sync time of track_B at 1.0 duration") {
float sync_time_at_1_0 =
track_B.CalcSyncFromAbsTime(0.9999 * track_B.m_duration);
REQUIRE(sync_time_at_1_0 == Catch::Detail::Approx(2.0).epsilon(0.001f));
}
WHEN("Calculating ratio from sync time on track_A at 0.83333") {
float ratio = track_A.CalcRatioFromSyncTime(0.83333333);
REQUIRE(ratio == Catch::Detail::Approx(0.5833333));
}
WHEN("Calculating ratio from sync time on track_A at 0.83333") {
float ratio = track_A.CalcRatioFromSyncTime(1.25);
REQUIRE(ratio == Catch::Detail::Approx(0.775));
}
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); }
}
}
TEST_CASE("Sync Marker Interval Calculation", "[SyncTrack]") {
SyncTrack track_A;
track_A.m_num_intervals = 2;
track_A.m_duration = 2.0;
track_A.m_sync_markers[0] = 0.9;
track_A.m_sync_markers[1] = 0.2;
WHEN("Calculating intervals") {
track_A.CalcIntervals();
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] == 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);
CHECK(ratio == Catch::Detail::Approx(0.2).epsilon(0.001));
}
WHEN("Querying ratio at sync time at 1.001") {
float ratio = track_A.CalcRatioFromSyncTime(0.0001f);
CHECK(ratio == Catch::Detail::Approx(0.9).epsilon(0.001));
}
WHEN("Querying ratio at sync time at 1.9999") {
float ratio = track_A.CalcRatioFromSyncTime(0.9999f);
CHECK(ratio == Catch::Detail::Approx(0.2).epsilon(0.001));
}
}
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 = 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])
);
}
}
}