Changed the screensaver to never show the same game again until all games have been cycled through

This commit is contained in:
Leon Styhre 2023-08-20 15:28:30 +02:00
parent b669280412
commit 912c8bb75a
3 changed files with 120 additions and 81 deletions

View file

@ -82,7 +82,9 @@ void Screensaver::startScreensaver(bool generateMediaList)
if (mScreensaverType == "slideshow") { if (mScreensaverType == "slideshow") {
if (generateMediaList) { if (generateMediaList) {
mImageFiles.clear(); mImageFiles.clear();
mFilesInventory.clear();
mImageCustomFiles.clear(); mImageCustomFiles.clear();
mCustomFilesInventory.clear();
} }
mMediaSwapTime = Settings::getInstance()->getInt("ScreensaverSwapImageTimeout"); mMediaSwapTime = Settings::getInstance()->getInt("ScreensaverSwapImageTimeout");
@ -93,6 +95,11 @@ void Screensaver::startScreensaver(bool generateMediaList)
generateCustomImageList(); generateCustomImageList();
pickRandomCustomImage(path); pickRandomCustomImage(path);
// We've cycled through all games, so start from the beginning again.
if (mImageCustomFiles.size() == 0 && mCustomFilesInventory.size() > 0)
mImageCustomFiles.insert(mImageCustomFiles.begin(), mCustomFilesInventory.begin(),
mCustomFilesInventory.end());
if (mImageCustomFiles.size() > 0) if (mImageCustomFiles.size() > 0)
mHasMediaFiles = true; mHasMediaFiles = true;
// Custom images are not tied to the game list. // Custom images are not tied to the game list.
@ -104,6 +111,10 @@ void Screensaver::startScreensaver(bool generateMediaList)
pickRandomImage(path); pickRandomImage(path);
} }
// We've cycled through all games, so start from the beginning again.
if (mImageFiles.size() == 0 && mFilesInventory.size() > 0)
mImageFiles.insert(mImageFiles.begin(), mFilesInventory.begin(), mFilesInventory.end());
if (mImageFiles.size() > 0) if (mImageFiles.size() > 0)
mHasMediaFiles = true; mHasMediaFiles = true;
@ -135,8 +146,10 @@ void Screensaver::startScreensaver(bool generateMediaList)
return; return;
} }
else if (!mVideoScreensaver && (mScreensaverType == "video")) { else if (!mVideoScreensaver && (mScreensaverType == "video")) {
if (generateMediaList) if (generateMediaList) {
mVideoFiles.clear(); mVideoFiles.clear();
mFilesInventory.clear();
}
mMediaSwapTime = Settings::getInstance()->getInt("ScreensaverSwapVideoTimeout"); mMediaSwapTime = Settings::getInstance()->getInt("ScreensaverSwapVideoTimeout");
@ -145,6 +158,10 @@ void Screensaver::startScreensaver(bool generateMediaList)
generateVideoList(); generateVideoList();
pickRandomVideo(path); pickRandomVideo(path);
// We've cycled through all games, so start from the beginning again.
if (mVideoFiles.size() == 0 && mFilesInventory.size() > 0)
mVideoFiles.insert(mVideoFiles.begin(), mFilesInventory.begin(), mFilesInventory.end());
if (mVideoFiles.size() > 0) if (mVideoFiles.size() > 0)
mHasMediaFiles = true; mHasMediaFiles = true;
@ -276,95 +293,92 @@ void Screensaver::renderScreensaver()
} }
} }
if (isScreensaverActive()) { if (mScreensaverType == "slideshow") {
if (mScreensaverType == "slideshow") { if (mHasMediaFiles) {
if (mHasMediaFiles) { if (Settings::getInstance()->getBool("ScreensaverSlideshowScanlines"))
if (Settings::getInstance()->getBool("ScreensaverSlideshowScanlines")) mRenderer->shaderPostprocessing(Renderer::Shader::SCANLINES);
mRenderer->shaderPostprocessing(Renderer::Shader::SCANLINES); if (Settings::getInstance()->getBool("ScreensaverSlideshowGameInfo") &&
if (Settings::getInstance()->getBool("ScreensaverSlideshowGameInfo") && !Settings::getInstance()->getBool("ScreensaverSlideshowCustomImages") &&
mGameOverlay) { mGameOverlay) {
mRenderer->setMatrix(mRenderer->getIdentity()); mRenderer->setMatrix(mRenderer->getIdentity());
if (mGameOverlayRectangleCoords.size() == 4) { if (mGameOverlayRectangleCoords.size() == 4) {
mRenderer->drawRect( mRenderer->drawRect(
mGameOverlayRectangleCoords[0], mGameOverlayRectangleCoords[1], mGameOverlayRectangleCoords[0], mGameOverlayRectangleCoords[1],
mGameOverlayRectangleCoords[2], mGameOverlayRectangleCoords[3], mGameOverlayRectangleCoords[2], mGameOverlayRectangleCoords[3],
0x00000000 | mRectangleFadeIn, 0x00000000 | mRectangleFadeIn); 0x00000000 | mRectangleFadeIn, 0x00000000 | mRectangleFadeIn);
}
mRectangleFadeIn =
glm::clamp(mRectangleFadeIn + 6 + mRectangleFadeIn / 20, 0, 170);
mGameOverlay.get()->setColor(0xFFFFFF00 | mTextFadeIn);
if (mTextFadeIn > 50)
mGameOverlayFont.at(0)->renderTextCache(mGameOverlay.get());
if (mTextFadeIn < 255)
mTextFadeIn = glm::clamp(mTextFadeIn + 2 + mTextFadeIn / 6, 0, 255);
} }
} mRectangleFadeIn = glm::clamp(mRectangleFadeIn + 6 + mRectangleFadeIn / 20, 0, 170);
else {
mFallbackScreensaver = true; mGameOverlay.get()->setColor(0xFFFFFF00 | mTextFadeIn);
if (mTextFadeIn > 50)
mGameOverlayFont.at(0)->renderTextCache(mGameOverlay.get());
if (mTextFadeIn < 255)
mTextFadeIn = glm::clamp(mTextFadeIn + 2 + mTextFadeIn / 6, 0, 255);
} }
} }
else if (mScreensaverType == "video") { else {
if (mHasMediaFiles) { mFallbackScreensaver = true;
Renderer::postProcessingParams videoParameters; }
unsigned int shaders {0}; }
if (Settings::getInstance()->getBool("ScreensaverVideoScanlines")) else if (mScreensaverType == "video") {
shaders = Renderer::Shader::SCANLINES; if (mHasMediaFiles) {
if (Settings::getInstance()->getBool("ScreensaverVideoBlur")) { Renderer::postProcessingParams videoParameters;
if (mRenderer->getScreenRotation() == 90 || unsigned int shaders {0};
mRenderer->getScreenRotation() == 270) if (Settings::getInstance()->getBool("ScreensaverVideoScanlines"))
shaders |= Renderer::Shader::BLUR_VERTICAL; shaders = Renderer::Shader::SCANLINES;
else if (Settings::getInstance()->getBool("ScreensaverVideoBlur")) {
shaders |= Renderer::Shader::BLUR_HORIZONTAL; if (mRenderer->getScreenRotation() == 90 || mRenderer->getScreenRotation() == 270)
shaders |= Renderer::Shader::BLUR_VERTICAL;
else
shaders |= Renderer::Shader::BLUR_HORIZONTAL;
}
// We run two passes to make the blur smoother.
videoParameters.blurPasses = 2;
videoParameters.blurStrength = 1.35f;
if (shaders != 0)
mRenderer->shaderPostprocessing(shaders, videoParameters);
if (Settings::getInstance()->getBool("ScreensaverVideoGameInfo") && mGameOverlay) {
mRenderer->setMatrix(mRenderer->getIdentity());
if (mGameOverlayRectangleCoords.size() == 4) {
mRenderer->drawRect(
mGameOverlayRectangleCoords[0], mGameOverlayRectangleCoords[1],
mGameOverlayRectangleCoords[2], mGameOverlayRectangleCoords[3],
0x00000000 | mRectangleFadeIn, 0x00000000 | mRectangleFadeIn);
} }
mRectangleFadeIn = glm::clamp(mRectangleFadeIn + 6 + mRectangleFadeIn / 20, 0, 170);
// We run two passes to make the blur smoother. mGameOverlay.get()->setColor(0xFFFFFF00 | mTextFadeIn);
videoParameters.blurPasses = 2; if (mTextFadeIn > 50)
videoParameters.blurStrength = 1.35f; mGameOverlayFont.at(0)->renderTextCache(mGameOverlay.get());
if (mTextFadeIn < 255)
if (shaders != 0) mTextFadeIn = glm::clamp(mTextFadeIn + 2 + mTextFadeIn / 6, 0, 255);
mRenderer->shaderPostprocessing(shaders, videoParameters);
if (Settings::getInstance()->getBool("ScreensaverVideoGameInfo") && mGameOverlay) {
mRenderer->setMatrix(mRenderer->getIdentity());
if (mGameOverlayRectangleCoords.size() == 4) {
mRenderer->drawRect(
mGameOverlayRectangleCoords[0], mGameOverlayRectangleCoords[1],
mGameOverlayRectangleCoords[2], mGameOverlayRectangleCoords[3],
0x00000000 | mRectangleFadeIn, 0x00000000 | mRectangleFadeIn);
}
mRectangleFadeIn =
glm::clamp(mRectangleFadeIn + 6 + mRectangleFadeIn / 20, 0, 170);
mGameOverlay.get()->setColor(0xFFFFFF00 | mTextFadeIn);
if (mTextFadeIn > 50)
mGameOverlayFont.at(0)->renderTextCache(mGameOverlay.get());
if (mTextFadeIn < 255)
mTextFadeIn = glm::clamp(mTextFadeIn + 2 + mTextFadeIn / 6, 0, 255);
}
}
else {
mFallbackScreensaver = true;
} }
} }
if (mFallbackScreensaver || mScreensaverType == "dim") { else {
Renderer::postProcessingParams dimParameters; mFallbackScreensaver = true;
dimParameters.dimming = mDimValue;
dimParameters.saturation = mSaturationAmount;
mRenderer->shaderPostprocessing(Renderer::Shader::CORE, dimParameters);
if (mDimValue > 0.4)
mDimValue = glm::clamp(mDimValue - 0.021f, 0.4f, 1.0f);
if (mSaturationAmount > 0.0)
mSaturationAmount = glm::clamp(mSaturationAmount - 0.035f, 0.0f, 1.0f);
}
else if (mScreensaverType == "black") {
Renderer::postProcessingParams blackParameters;
blackParameters.dimming = mDimValue;
mRenderer->shaderPostprocessing(Renderer::Shader::CORE, blackParameters);
if (mDimValue > 0.0)
mDimValue = glm::clamp(mDimValue - 0.045f, 0.0f, 1.0f);
} }
} }
if (mFallbackScreensaver || mScreensaverType == "dim") {
Renderer::postProcessingParams dimParameters;
dimParameters.dimming = mDimValue;
dimParameters.saturation = mSaturationAmount;
mRenderer->shaderPostprocessing(Renderer::Shader::CORE, dimParameters);
if (mDimValue > 0.4)
mDimValue = glm::clamp(mDimValue - 0.021f, 0.4f, 1.0f);
if (mSaturationAmount > 0.0)
mSaturationAmount = glm::clamp(mSaturationAmount - 0.035f, 0.0f, 1.0f);
}
else if (mScreensaverType == "black") {
Renderer::postProcessingParams blackParameters;
blackParameters.dimming = mDimValue;
mRenderer->shaderPostprocessing(Renderer::Shader::CORE, blackParameters);
if (mDimValue > 0.0)
mDimValue = glm::clamp(mDimValue - 0.045f, 0.0f, 1.0f);
}
} }
void Screensaver::update(int deltaTime) void Screensaver::update(int deltaTime)
@ -417,6 +431,8 @@ void Screensaver::generateImageList()
mImageFiles.push_back((*it2)); mImageFiles.push_back((*it2));
} }
} }
mFilesInventory.insert(mFilesInventory.begin(), mImageFiles.begin(), mImageFiles.end());
} }
void Screensaver::generateVideoList() void Screensaver::generateVideoList()
@ -442,6 +458,8 @@ void Screensaver::generateVideoList()
mVideoFiles.push_back((*it2)); mVideoFiles.push_back((*it2));
} }
} }
mFilesInventory.insert(mFilesInventory.begin(), mVideoFiles.begin(), mVideoFiles.end());
} }
void Screensaver::generateCustomImageList() void Screensaver::generateCustomImageList()
@ -469,6 +487,9 @@ void Screensaver::generateCustomImageList()
else { else {
LOG(LogWarning) << "Custom screensaver image directory '" << imageDir << "' does not exist"; LOG(LogWarning) << "Custom screensaver image directory '" << imageDir << "' does not exist";
} }
mCustomFilesInventory.insert(mCustomFilesInventory.begin(), mImageCustomFiles.begin(),
mImageCustomFiles.end());
} }
void Screensaver::pickRandomImage(std::string& path) void Screensaver::pickRandomImage(std::string& path)
@ -485,6 +506,7 @@ void Screensaver::pickRandomImage(std::string& path)
mGameName = mImageFiles.front()->getName(); mGameName = mImageFiles.front()->getName();
mSystemName = mImageFiles.front()->getSystem()->getFullName(); mSystemName = mImageFiles.front()->getSystem()->getFullName();
mCurrentGame = mImageFiles.front(); mCurrentGame = mImageFiles.front();
mImageFiles.clear();
return; return;
} }
@ -503,6 +525,10 @@ void Screensaver::pickRandomImage(std::string& path)
mGameName = mImageFiles.at(index)->getName(); mGameName = mImageFiles.at(index)->getName();
mSystemName = mImageFiles.at(index)->getSystem()->getFullName(); mSystemName = mImageFiles.at(index)->getSystem()->getFullName();
mCurrentGame = mImageFiles.at(index); mCurrentGame = mImageFiles.at(index);
// Don't display the same image again until we've cycled through all entries.
auto it = mImageFiles.begin() + index;
mImageFiles.erase(it);
} }
void Screensaver::pickRandomVideo(std::string& path) void Screensaver::pickRandomVideo(std::string& path)
@ -519,6 +545,7 @@ void Screensaver::pickRandomVideo(std::string& path)
mGameName = mVideoFiles.front()->getName(); mGameName = mVideoFiles.front()->getName();
mSystemName = mVideoFiles.front()->getSystem()->getFullName(); mSystemName = mVideoFiles.front()->getSystem()->getFullName();
mCurrentGame = mVideoFiles.front(); mCurrentGame = mVideoFiles.front();
mVideoFiles.clear();
return; return;
} }
@ -537,6 +564,10 @@ void Screensaver::pickRandomVideo(std::string& path)
mGameName = mVideoFiles.at(index)->getName(); mGameName = mVideoFiles.at(index)->getName();
mSystemName = mVideoFiles.at(index)->getSystem()->getFullName(); mSystemName = mVideoFiles.at(index)->getSystem()->getFullName();
mCurrentGame = mVideoFiles.at(index); mCurrentGame = mVideoFiles.at(index);
// Don't play the same video again until we've cycled through all entries.
auto it = mVideoFiles.begin() + index;
mVideoFiles.erase(it);
} }
void Screensaver::pickRandomCustomImage(std::string& path) void Screensaver::pickRandomCustomImage(std::string& path)
@ -547,6 +578,7 @@ void Screensaver::pickRandomCustomImage(std::string& path)
if (mImageCustomFiles.size() == 1) { if (mImageCustomFiles.size() == 1) {
mPreviousCustomImage = mImageCustomFiles.front(); mPreviousCustomImage = mImageCustomFiles.front();
path = mImageCustomFiles.front(); path = mImageCustomFiles.front();
mImageCustomFiles.clear();
return; return;
} }
@ -565,6 +597,10 @@ void Screensaver::pickRandomCustomImage(std::string& path)
mPreviousCustomImage = path; mPreviousCustomImage = path;
mGameName = ""; mGameName = "";
mSystemName = ""; mSystemName = "";
// Don't display the same image again until we've cycled through all entries.
auto it = mImageCustomFiles.begin() + index;
mImageCustomFiles.erase(it);
} }
void Screensaver::generateOverlayInfo() void Screensaver::generateOverlayInfo()

View file

@ -49,7 +49,9 @@ private:
std::vector<FileData*> mImageFiles; std::vector<FileData*> mImageFiles;
std::vector<FileData*> mVideoFiles; std::vector<FileData*> mVideoFiles;
std::vector<FileData*> mFilesInventory;
std::vector<std::string> mImageCustomFiles; std::vector<std::string> mImageCustomFiles;
std::vector<std::string> mCustomFilesInventory;
std::unique_ptr<ImageComponent> mImageScreensaver; std::unique_ptr<ImageComponent> mImageScreensaver;
std::unique_ptr<VideoComponent> mVideoScreensaver; std::unique_ptr<VideoComponent> mVideoScreensaver;

View file

@ -810,6 +810,7 @@ void Window::startScreensaver(bool onTimer)
setAllowTextScrolling(false); setAllowTextScrolling(false);
setAllowFileAnimation(false); setAllowFileAnimation(false);
mScreensaver->startScreensaver(true); mScreensaver->startScreensaver(true);
mScreensaver->renderScreensaver();
mRenderScreensaver = true; mRenderScreensaver = true;
} }
} }