From b3aa95372e74764d1eee4d3f20b343d19e8ae1ac Mon Sep 17 00:00:00 2001 From: Unknown Date: Fri, 14 Dec 2018 16:53:27 +1300 Subject: [PATCH 1/4] Add video playback (libmpv) --- apps/freeablo/CMakeLists.txt | 2 +- apps/freeablo/engine/enginemain.cpp | 21 +++ apps/freeablo/engine/enginemain.h | 1 + apps/freeablo/engine/threadmanager.cpp | 65 ++++++++ apps/freeablo/engine/threadmanager.h | 14 ++ cmake/FindMPV.cmake | 25 ++++ components/CMakeLists.txt | 24 +++ components/video/mpv_sdl_backend.cpp | 196 +++++++++++++++++++++++++ components/video/stubbackend.cpp | 22 +++ components/video/video.h | 21 +++ components/video/videotest.cpp | 64 ++++++++ 11 files changed, 454 insertions(+), 1 deletion(-) create mode 100644 cmake/FindMPV.cmake create mode 100644 components/video/mpv_sdl_backend.cpp create mode 100644 components/video/stubbackend.cpp create mode 100644 components/video/video.h create mode 100644 components/video/videotest.cpp diff --git a/apps/freeablo/CMakeLists.txt b/apps/freeablo/CMakeLists.txt index de36797ae..128cfdf62 100644 --- a/apps/freeablo/CMakeLists.txt +++ b/apps/freeablo/CMakeLists.txt @@ -133,7 +133,7 @@ add_library(freeablo_lib # split into a library so I can link to it from tests fasavegame/gameloader.cpp ) -target_link_libraries(freeablo_lib PUBLIC NuklearMisc Render Audio Serial Input Random enet::enet) +target_link_libraries(freeablo_lib PUBLIC NuklearMisc Render Audio Video Serial Input Random enet::enet) add_executable(freeablo main.cpp) target_link_libraries(freeablo freeablo_lib) diff --git a/apps/freeablo/engine/enginemain.cpp b/apps/freeablo/engine/enginemain.cpp index 534d38cd3..b014c6c7b 100644 --- a/apps/freeablo/engine/enginemain.cpp +++ b/apps/freeablo/engine/enginemain.cpp @@ -64,6 +64,15 @@ namespace Engine mainThread.join(); } + void EngineMain::playVideo(const std::string& path) + { + Engine::ThreadManager::get()->playVideo(std::string(path)); + while (!Engine::ThreadManager::get()->waitForVideoComplete(100)) + { + mInputManager->update(false); + } + } + void EngineMain::runGameLoop(const bpo::variables_map& variables, const std::string& pathEXE) { FARender::Renderer& renderer = *FARender::Renderer::get(); @@ -81,6 +90,10 @@ namespace Engine return; } + // Play the intro cinematics. + playVideo("gendata/logo.smk"); + playVideo("gendata/diablo1.smk"); + FAWorld::ItemFactory itemFactory(*mExe, Random::DummyRng::instance); mPlayerFactory = boost::make_unique(*mExe, itemFactory); renderer.loadFonts(*mExe); @@ -243,6 +256,14 @@ namespace Engine void EngineMain::notify(KeyboardInputAction action) { + // Only handle the esc key when playing video. + if (Engine::ThreadManager::get()->videoInProgress()) + { + if (action == KeyboardInputAction::pause) + Engine::ThreadManager::get()->stopVideo(); + return; + } + if (mGuiManager->isPauseBlocked()) return; diff --git a/apps/freeablo/engine/enginemain.h b/apps/freeablo/engine/enginemain.h index ff0d4cc65..2b4a9366f 100644 --- a/apps/freeablo/engine/enginemain.h +++ b/apps/freeablo/engine/enginemain.h @@ -48,6 +48,7 @@ namespace Engine private: void runGameLoop(const boost::program_options::variables_map& variables, const std::string& pathEXE); + void playVideo(const std::string& path); private: static EngineMain* singletonInstance; diff --git a/apps/freeablo/engine/threadmanager.cpp b/apps/freeablo/engine/threadmanager.cpp index 4280ac887..9286f3d99 100644 --- a/apps/freeablo/engine/threadmanager.cpp +++ b/apps/freeablo/engine/threadmanager.cpp @@ -4,6 +4,7 @@ #include #include +#include