Skip to content

Commit 00aef4f

Browse files
authored
Infinite Color Engine: fix for YUV & hybrid interpolators (#1302)
1 parent 176027e commit 00aef4f

File tree

5 files changed

+18
-40
lines changed

5 files changed

+18
-40
lines changed

sources/infinite-color-engine/InfiniteExponentialInterpolator.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -97,7 +97,7 @@ void InfiniteExponentialInterpolator::updateCurrentColors(float currentTimeMs)
9797
return;
9898

9999
float dt = currentTimeMs - _lastUpdate;
100-
float kOrg = 1.0f - std::exp(-dt / _tau);
100+
float kOrg = std::min(std::max(1.0f - std::exp(-dt / _tau), 0.0001f), 1.0f);
101101
_lastUpdate = currentTimeMs;
102102

103103
float4 aspectK = float4{

sources/infinite-color-engine/InfiniteHybridInterpolator.cpp

Lines changed: 9 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -123,10 +123,10 @@ void InfiniteHybridInterpolator::updateCurrentColors(float currentTimeMs) {
123123

124124
auto computeChannelVec = [&](float3& cur, const float3& diff, float3& vel) -> bool {
125125
const float FINISH_COMPONENT_THRESHOLD = 0.0013732906f;
126+
const float VELOCITY_THRESHOLD = 0.0005f;
126127

127-
float val = linalg::maxelem(linalg::abs(diff));
128-
129-
if (val < FINISH_COMPONENT_THRESHOLD)
128+
if (linalg::maxelem(linalg::abs(diff)) < FINISH_COMPONENT_THRESHOLD && // color match
129+
linalg::maxelem(linalg::abs(vel)) < VELOCITY_THRESHOLD) // speed should be almost zero
130130
{
131131
cur += diff;
132132
vel = float3{ 0,0,0 };
@@ -140,23 +140,15 @@ void InfiniteHybridInterpolator::updateCurrentColors(float currentTimeMs) {
140140
vel += acc * (dt * 0.001f);
141141
float3 step = vel * (dt * 0.001f);
142142

143-
if (_maxLuminanceChangePerStep > 0.f)
144-
{
145-
float stepY = step[0];
146-
if (fabs(stepY) > _maxLuminanceChangePerStep)
147-
{
148-
stepY = std::copysignf(_maxLuminanceChangePerStep, stepY);
149-
vel[0] = stepY / (dt * 0.001f);
150-
}
151-
cur[0] += stepY;
152-
}
153-
else
143+
if (_maxLuminanceChangePerStep > 0.f && fabs(step[0]) > _maxLuminanceChangePerStep)
154144
{
155-
cur[0] += step[0];
145+
float scale = _maxLuminanceChangePerStep / fabs(step[0]);
146+
step *= scale;
147+
148+
vel *= scale;
156149
}
150+
cur += step;
157151

158-
cur[1] += step[1];
159-
cur[2] += step[2];
160152
return true;
161153
}
162154
};

sources/infinite-color-engine/InfiniteRgbInterpolator.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -124,7 +124,7 @@ void InfiniteRgbInterpolator::updateCurrentColors(float currentTimeMs)
124124
// obliczenie czasu, analog setupAdvColor
125125
float deltaTime = _targetTime - currentTimeMs;
126126
float totalTime = _targetTime - _startAnimationTimeMs;
127-
float kOrg = std::max(1.0f - deltaTime / totalTime, 0.0001f);
127+
float kOrg = std::min(std::max(1.0f - deltaTime / totalTime, 0.0001f), 1.0f);
128128
_lastUpdate = currentTimeMs;
129129

130130
float4 aspectK = float4{

sources/infinite-color-engine/InfiniteStepperInterpolator.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -102,7 +102,7 @@ void InfiniteStepperInterpolator::updateCurrentColors(float currentTimeMs)
102102
// obliczenie czasu, analog setupAdvColor
103103
float deltaTime = _targetTime - currentTimeMs;
104104
float totalTime = _targetTime - _startAnimationTimeMs;
105-
float kOrg = std::max(1.0f - deltaTime / totalTime, 0.0001f);
105+
float kOrg = std::min(std::max(1.0f - deltaTime / totalTime, 0.0001f), 1.0f);
106106
_lastUpdate = currentTimeMs;
107107

108108
float4 aspectK = float4{

sources/infinite-color-engine/InfiniteYuvInterpolator.cpp

Lines changed: 6 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -137,7 +137,7 @@ void InfiniteYuvInterpolator::updateCurrentColors(float currentTimeMs)
137137
// obliczenie czasu, analog setupAdvColor
138138
float deltaTime = _targetTime - currentTimeMs;
139139
float totalTime = _targetTime - _startAnimationTimeMs;
140-
float kOrg = std::max(1.0f - deltaTime / totalTime, 0.0001f);
140+
float kOrg = std::min(std::max(1.0f - deltaTime / totalTime, 0.0001f), 1.0f);
141141
_lastUpdate = currentTimeMs;
142142

143143
auto computeChannelVec = [&](float3& cur, const float3& diff) -> bool {
@@ -152,27 +152,13 @@ void InfiniteYuvInterpolator::updateCurrentColors(float currentTimeMs)
152152
}
153153
else
154154
{
155-
if (_maxLuminanceChangePerStep == 0.f)
155+
float3 step = kOrg * diff;
156+
if (_maxLuminanceChangePerStep > 0.f && fabs(step[0]) > _maxLuminanceChangePerStep)
156157
{
157-
cur += kOrg * diff;
158-
}
159-
else
160-
{
161-
float scale = kOrg;
162-
auto stepY = kOrg * diff[0];
163-
if (fabs(stepY) > _maxLuminanceChangePerStep)
164-
{
165-
scale = stepY;
166-
stepY = std::copysignf(_maxLuminanceChangePerStep, stepY);
167-
scale = fabs(stepY / scale) * kOrg;
168-
}
169-
cur[0] += stepY;
170-
171-
for (int i = 1; i < 3; ++i)
172-
{
173-
cur[i] += scale * diff[i];
174-
}
158+
float scale = _maxLuminanceChangePerStep / fabs(step[0]);
159+
step *= scale;
175160
}
161+
cur += step;
176162

177163
return true;
178164
}

0 commit comments

Comments
 (0)