ctm: add an internal fade animation to ctm transitions
This commit is contained in:
parent
3f40d6d936
commit
deb077c346
4 changed files with 68 additions and 2 deletions
|
|
@ -81,6 +81,52 @@ void CHyprlandCTMControlProtocol::destroyResource(CHyprlandCTMControlResource* r
|
|||
std::erase_if(m_vManagers, [&](const auto& other) { return other.get() == res; });
|
||||
}
|
||||
|
||||
void CHyprlandCTMControlProtocol::setCTM(PHLMONITOR monitor, const Mat3x3& ctm) {
|
||||
monitor->setCTM(ctm);
|
||||
CHyprlandCTMControlProtocol::SCTMData::SCTMData() {
|
||||
progress.create(g_pConfigManager->getAnimationPropertyConfig("__internal_fadeCTM"), AVARDAMAGE_NONE);
|
||||
progress.setValueAndWarp(0.F);
|
||||
}
|
||||
|
||||
void CHyprlandCTMControlProtocol::setCTM(PHLMONITOR monitor, const Mat3x3& ctm) {
|
||||
|
||||
std::erase_if(m_mCTMDatas, [](const auto& el) { return !el.first; });
|
||||
|
||||
if (!m_mCTMDatas.contains(monitor))
|
||||
m_mCTMDatas[monitor] = std::make_unique<SCTMData>();
|
||||
|
||||
auto& data = m_mCTMDatas.at(monitor);
|
||||
|
||||
data->ctmFrom = data->ctmTo;
|
||||
data->ctmTo = ctm;
|
||||
|
||||
data->progress.setValueAndWarp(0.F);
|
||||
data->progress = 1.F;
|
||||
|
||||
monitor->setCTM(data->ctmFrom);
|
||||
|
||||
data->progress.setUpdateCallback([monitor = PHLMONITORREF{monitor}, this](void* self) {
|
||||
if (!monitor || !m_mCTMDatas.contains(monitor))
|
||||
return;
|
||||
auto& data = m_mCTMDatas.at(monitor);
|
||||
const auto from = data->ctmFrom.getMatrix();
|
||||
const auto to = data->ctmTo.getMatrix();
|
||||
const auto PROGRESS = data->progress.getPercent();
|
||||
|
||||
static const auto lerp = [](const float one, const float two, const float progress) -> float { return one + (two - one) * progress; };
|
||||
|
||||
std::array<float, 9> mtx;
|
||||
for (size_t i = 0; i < 9; ++i) {
|
||||
mtx[i] = lerp(from[i], to[i], PROGRESS);
|
||||
}
|
||||
|
||||
monitor->setCTM(mtx);
|
||||
});
|
||||
|
||||
data->progress.setCallbackOnEnd([monitor = PHLMONITORREF{monitor}, this](void* self) {
|
||||
if (!monitor || !m_mCTMDatas.contains(monitor)) {
|
||||
monitor->setCTM(Mat3x3::identity());
|
||||
return;
|
||||
}
|
||||
auto& data = m_mCTMDatas.at(monitor);
|
||||
monitor->setCTM(data->ctmTo);
|
||||
});
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue