mirror of
https://github.com/OpenMW/openmw.git
synced 2025-04-09 01:06:43 +00:00
Added lua bindings to toggle hot reload (disabled by default) or to trigger a reload
This commit is contained in:
parent
4e7c1c5bef
commit
6b38d62223
3 changed files with 34 additions and 0 deletions
|
@ -6,6 +6,10 @@
|
||||||
#include "../mwbase/world.hpp"
|
#include "../mwbase/world.hpp"
|
||||||
#include "../mwrender/renderingmanager.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>
|
#include <components/lua/luastate.hpp>
|
||||||
|
|
||||||
namespace MWLua
|
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);
|
return LuaUtil::makeReadOnly(api);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -367,8 +367,10 @@ namespace Shader
|
||||||
std::filesystem::file_time_type mLastAutoRecompileTime;
|
std::filesystem::file_time_type mLastAutoRecompileTime;
|
||||||
using KeysHolder = std::set<ShaderManager::MapKey>;
|
using KeysHolder = std::set<ShaderManager::MapKey>;
|
||||||
std::unordered_map<std::string, KeysHolder> mShaderFiles;
|
std::unordered_map<std::string, KeysHolder> mShaderFiles;
|
||||||
|
bool mHotReloadEnabled;
|
||||||
HotReloadManager()
|
HotReloadManager()
|
||||||
{
|
{
|
||||||
|
mHotReloadEnabled = false;
|
||||||
mLastAutoRecompileTime = std::chrono::file_clock::now();
|
mLastAutoRecompileTime = std::chrono::file_clock::now();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -392,6 +394,12 @@ namespace Shader
|
||||||
}
|
}
|
||||||
|
|
||||||
void update(ShaderManager& Manager)
|
void update(ShaderManager& Manager)
|
||||||
|
{
|
||||||
|
if (mHotReloadEnabled)
|
||||||
|
reloadTouchedShaders(Manager);
|
||||||
|
}
|
||||||
|
|
||||||
|
void reloadTouchedShaders(ShaderManager& Manager)
|
||||||
{
|
{
|
||||||
for (auto& shader : mShaderFiles)
|
for (auto& shader : mShaderFiles)
|
||||||
{
|
{
|
||||||
|
@ -635,4 +643,14 @@ namespace Shader
|
||||||
mHotReloadManager->update(*this);
|
mHotReloadManager->update(*this);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void ShaderManager::setHotReloadEnabled(bool value)
|
||||||
|
{
|
||||||
|
mHotReloadManager->mHotReloadEnabled = value;
|
||||||
|
}
|
||||||
|
|
||||||
|
void ShaderManager::triggerShaderReload()
|
||||||
|
{
|
||||||
|
mHotReloadManager->reloadTouchedShaders(*this);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -69,6 +69,8 @@ namespace Shader
|
||||||
int reserveGlobalTextureUnits(Slot slot);
|
int reserveGlobalTextureUnits(Slot slot);
|
||||||
|
|
||||||
void update();
|
void update();
|
||||||
|
void setHotReloadEnabled(bool value);
|
||||||
|
void triggerShaderReload();
|
||||||
private:
|
private:
|
||||||
void getLinkedShaders(osg::ref_ptr<osg::Shader> shader, const std::vector<std::string>& linkedShaderNames, const DefineMap& defines);
|
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);
|
void addLinkedShaders(osg::ref_ptr<osg::Shader> shader, osg::ref_ptr<osg::Program> program);
|
||||||
|
|
Loading…
Reference in a new issue