1
0
mirror of https://gitlab.com/OpenMW/openmw.git synced 2025-03-30 16:20:21 +00:00

Added lua bindings to toggle hot reload (disabled by default) or to trigger a reload

This commit is contained in:
florent.teppe 2022-08-03 19:56:19 +02:00
parent 4e7c1c5bef
commit 6b38d62223
3 changed files with 34 additions and 0 deletions

View File

@ -6,6 +6,10 @@
#include "../mwbase/world.hpp"
#include "../mwrender/renderingmanager.hpp"
#include <components/resource/resourcesystem.hpp>
#include <components/resource/scenemanager.hpp>
#include <components/shader/shadermanager.hpp>
#include <components/lua/luastate.hpp>
namespace MWLua
@ -46,6 +50,16 @@ namespace MWLua
});
};
api["triggerShaderReload"] = [context]()
{
MWBase::Environment::get().getWorld()->getRenderingManager()->getResourceSystem()->getSceneManager()->getShaderManager().triggerShaderReload();
};
api["togggleShaderHotReload"] = [context](bool value)
{
MWBase::Environment::get().getWorld()->getRenderingManager()->getResourceSystem()->getSceneManager()->getShaderManager().setHotReloadEnabled(value);
};
return LuaUtil::makeReadOnly(api);
}
}

View File

@ -367,8 +367,10 @@ namespace Shader
std::filesystem::file_time_type mLastAutoRecompileTime;
using KeysHolder = std::set<ShaderManager::MapKey>;
std::unordered_map<std::string, KeysHolder> mShaderFiles;
bool mHotReloadEnabled;
HotReloadManager()
{
mHotReloadEnabled = false;
mLastAutoRecompileTime = std::chrono::file_clock::now();
}
@ -392,6 +394,12 @@ namespace Shader
}
void update(ShaderManager& Manager)
{
if (mHotReloadEnabled)
reloadTouchedShaders(Manager);
}
void reloadTouchedShaders(ShaderManager& Manager)
{
for (auto& shader : mShaderFiles)
{
@ -635,4 +643,14 @@ namespace Shader
mHotReloadManager->update(*this);
}
void ShaderManager::setHotReloadEnabled(bool value)
{
mHotReloadManager->mHotReloadEnabled = value;
}
void ShaderManager::triggerShaderReload()
{
mHotReloadManager->reloadTouchedShaders(*this);
}
}

View File

@ -69,6 +69,8 @@ namespace Shader
int reserveGlobalTextureUnits(Slot slot);
void update();
void setHotReloadEnabled(bool value);
void triggerShaderReload();
private:
void getLinkedShaders(osg::ref_ptr<osg::Shader> shader, const std::vector<std::string>& linkedShaderNames, const DefineMap& defines);
void addLinkedShaders(osg::ref_ptr<osg::Shader> shader, osg::ref_ptr<osg::Program> program);