68 const auto AdjustSign = [angle](
const float value) ->
float {
69 return angle < 0.0f ? -value : value;
73 const float key_angle = std::abs(angle);
76 if (
const auto front_key = std::get<key_idx>(
DATA.front()); key_angle <= front_key) {
78 const float t = key_angle / front_key;
79 return AdjustSign(
Lerp(0.0f, std::get<value_idx>(
DATA.front()), t));
81 if (key_angle >= std::get<key_idx>(
DATA.back())) {
82 return AdjustSign(std::get<value_idx>(
DATA.back()));
86 for (
size_t i = 0; i <
DATA.size() - 1; ++i) {
87 const auto current_key_angle = std::get<key_idx >(
DATA[i]);
88 const auto current_value_angle = std::get<value_idx>(
DATA[i]);
89 const auto next_key_angle = std::get<key_idx >(
DATA[i + 1]);
90 const auto next_value_angle = std::get<value_idx>(
DATA[i + 1]);
92 if (current_key_angle <= key_angle && key_angle <= next_key_angle) {
94 const float t = (key_angle - current_key_angle) / (next_key_angle - current_key_angle);
96 return AdjustSign(
Lerp(current_value_angle, next_value_angle, t));