diff options
Diffstat (limited to 'src/protocols/CTMControl.cpp')
| -rw-r--r-- | src/protocols/CTMControl.cpp | 48 |
1 files changed, 47 insertions, 1 deletions
diff --git a/src/protocols/CTMControl.cpp b/src/protocols/CTMControl.cpp index cddad830..42c84e8f 100644 --- a/src/protocols/CTMControl.cpp +++ b/src/protocols/CTMControl.cpp @@ -81,6 +81,52 @@ void CHyprlandCTMControlProtocol::destroyResource(CHyprlandCTMControlResource* r std::erase_if(m_vManagers, [&](const auto& other) { return other.get() == res; }); } +CHyprlandCTMControlProtocol::SCTMData::SCTMData() { + progress.create(g_pConfigManager->getAnimationPropertyConfig("__internal_fadeCTM"), AVARDAMAGE_NONE); + progress.setValueAndWarp(0.F); +} + void CHyprlandCTMControlProtocol::setCTM(PHLMONITOR monitor, const Mat3x3& ctm) { - monitor->setCTM(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); + }); } |
