diff --git a/client/CMT.cpp b/client/CMT.cpp index a35d245f2..64b85c69c 100644 --- a/client/CMT.cpp +++ b/client/CMT.cpp @@ -430,15 +430,15 @@ void playIntro() { auto audioData = CCS->videoh->getAudio(VideoPath::builtin("3DOLOGO.SMK")); int sound = CCS->soundh->playSound(audioData); - if(CCS->videoh->openAndPlayVideo(VideoPath::builtin("3DOLOGO.SMK"), 0, 1, true, true)) + if(CCS->videoh->openAndPlayVideo(VideoPath::builtin("3DOLOGO.SMK"), 0, 1, EVideoType::INTRO)) { audioData = CCS->videoh->getAudio(VideoPath::builtin("NWCLOGO.SMK")); sound = CCS->soundh->playSound(audioData); - if (CCS->videoh->openAndPlayVideo(VideoPath::builtin("NWCLOGO.SMK"), 0, 1, true, true)) + if (CCS->videoh->openAndPlayVideo(VideoPath::builtin("NWCLOGO.SMK"), 0, 1, EVideoType::INTRO)) { audioData = CCS->videoh->getAudio(VideoPath::builtin("H3INTRO.SMK")); sound = CCS->soundh->playSound(audioData); - CCS->videoh->openAndPlayVideo(VideoPath::builtin("H3INTRO.SMK"), 0, 1, true, true); + CCS->videoh->openAndPlayVideo(VideoPath::builtin("H3INTRO.SMK"), 0, 1, EVideoType::INTRO); } } CCS->soundh->stopSound(sound); diff --git a/client/CVideoHandler.cpp b/client/CVideoHandler.cpp index 9f5129898..4595e5977 100644 --- a/client/CVideoHandler.cpp +++ b/client/CVideoHandler.cpp @@ -101,8 +101,8 @@ bool CVideoPlayer::open(const VideoPath & fname, bool scale) } // loop = to loop through the video -// useOverlay = directly write to the screen. -bool CVideoPlayer::open(const VideoPath & videoToOpen, bool loop, bool useOverlay, bool scale) +// overlay = directly write to the screen. +bool CVideoPlayer::open(const VideoPath & videoToOpen, bool loop, bool overlay, bool scale) { close(); @@ -199,7 +199,7 @@ bool CVideoPlayer::open(const VideoPath & videoToOpen, bool loop, bool useOverla } // Allocate a place to put our YUV image on that screen - if (useOverlay) + if (overlay) { texture = SDL_CreateTexture( mainRenderer, SDL_PIXELFORMAT_IYUV, SDL_TEXTUREACCESS_STATIC, pos.w, pos.h); } @@ -624,7 +624,7 @@ Point CVideoPlayer::size() } // Plays a video. Only works for overlays. -bool CVideoPlayer::playVideo(int x, int y, bool stopOnKey) +bool CVideoPlayer::playVideo(int x, int y, bool stopOnKey, bool overlay) { // Note: either the windows player or the linux player is // broken. Compensate here until the bug is found. @@ -647,7 +647,14 @@ bool CVideoPlayer::playVideo(int x, int y, bool stopOnKey) SDL_Rect rect = CSDL_Ext::toSDL(pos); - SDL_RenderFillRect(mainRenderer, &rect); + if(overlay) + { + SDL_RenderFillRect(mainRenderer, &rect); + } + else + { + SDL_RenderClear(mainRenderer); + } SDL_RenderCopy(mainRenderer, texture, nullptr, &rect); SDL_RenderPresent(mainRenderer); @@ -672,10 +679,27 @@ bool CVideoPlayer::playVideo(int x, int y, bool stopOnKey) return true; } -bool CVideoPlayer::openAndPlayVideo(const VideoPath & name, int x, int y, bool stopOnKey, bool scale) +bool CVideoPlayer::openAndPlayVideo(const VideoPath & name, int x, int y, EVideoType videoType) { + bool scale; + bool stopOnKey; + bool overlay; + + switch(videoType) + { + case EVideoType::INTRO: + stopOnKey = true; + scale = true; + overlay = false; + break; + case EVideoType::SPELLBOOK: + default: + stopOnKey = false; + scale = false; + overlay = true; + } open(name, false, true, scale); - bool ret = playVideo(x, y, stopOnKey); + bool ret = playVideo(x, y, stopOnKey, overlay); close(); return ret; } diff --git a/client/CVideoHandler.h b/client/CVideoHandler.h index 38499bede..89f8016a2 100644 --- a/client/CVideoHandler.h +++ b/client/CVideoHandler.h @@ -15,6 +15,12 @@ struct SDL_Surface; struct SDL_Texture; +enum class EVideoType : ui8 +{ + INTRO = 0, // use entire window: stopOnKey = true, scale = true, overlay = false + SPELLBOOK // overlay video: stopOnKey = false, scale = false, overlay = true +}; + class IVideoPlayer : boost::noncopyable { public: @@ -33,7 +39,7 @@ class IMainVideoPlayer : public IVideoPlayer public: virtual ~IMainVideoPlayer() = default; virtual void update(int x, int y, SDL_Surface *dst, bool forceRedraw, bool update = true, std::function restart = nullptr){} - virtual bool openAndPlayVideo(const VideoPath & name, int x, int y, bool stopOnKey = false, bool scale = false) + virtual bool openAndPlayVideo(const VideoPath & name, int x, int y, EVideoType videoType) { return false; } @@ -90,7 +96,7 @@ class CVideoPlayer final : public IMainVideoPlayer double frameTime; bool doLoop; // loop through video - bool playVideo(int x, int y, bool stopOnKey); + bool playVideo(int x, int y, bool stopOnKey, bool overlay); bool open(const VideoPath & fname, bool loop, bool useOverlay = false, bool scale = false); public: CVideoPlayer(); @@ -106,7 +112,7 @@ public: void update(int x, int y, SDL_Surface *dst, bool forceRedraw, bool update = true, std::function onVideoRestart = nullptr) override; //moves to next frame if appropriate, and blits it or blits only if redraw parameter is set true // Opens video, calls playVideo, closes video; returns playVideo result (if whole video has been played) - bool openAndPlayVideo(const VideoPath & name, int x, int y, bool stopOnKey = false, bool scale = false) override; + bool openAndPlayVideo(const VideoPath & name, int x, int y, EVideoType videoType) override; std::pair, si64> getAudio(const VideoPath & videoToOpen) override; diff --git a/client/windows/CSpellWindow.cpp b/client/windows/CSpellWindow.cpp index fbbc8f5e3..a09670c5e 100644 --- a/client/windows/CSpellWindow.cpp +++ b/client/windows/CSpellWindow.cpp @@ -519,13 +519,13 @@ void CSpellWindow::setCurrentPage(int value) void CSpellWindow::turnPageLeft() { if(settings["video"]["spellbookAnimation"].Bool() && !isBigSpellbook) - CCS->videoh->openAndPlayVideo(VideoPath::builtin("PGTRNLFT.SMK"), pos.x+13, pos.y+15); + CCS->videoh->openAndPlayVideo(VideoPath::builtin("PGTRNLFT.SMK"), pos.x+13, pos.y+15, EVideoType::SPELLBOOK); } void CSpellWindow::turnPageRight() { if(settings["video"]["spellbookAnimation"].Bool() && !isBigSpellbook) - CCS->videoh->openAndPlayVideo(VideoPath::builtin("PGTRNRGH.SMK"), pos.x+13, pos.y+15); + CCS->videoh->openAndPlayVideo(VideoPath::builtin("PGTRNRGH.SMK"), pos.x+13, pos.y+15, EVideoType::SPELLBOOK); } void CSpellWindow::keyPressed(EShortcut key)