mirror of
https://gitlab.com/OpenMW/openmw.git
synced 2025-02-21 09:39:56 +00:00
Merge branch 'gui_shaders' into 'master'
Add shader path for mygui (#6162) See merge request OpenMW/openmw!1019
This commit is contained in:
commit
6949dd89c2
@ -31,6 +31,7 @@
|
|||||||
Feature #5489: MCP: Telekinesis fix for activators
|
Feature #5489: MCP: Telekinesis fix for activators
|
||||||
Feature #5996: Support Lua scripts in OpenMW
|
Feature #5996: Support Lua scripts in OpenMW
|
||||||
Feature #6017: Separate persistent and temporary cell references when saving
|
Feature #6017: Separate persistent and temporary cell references when saving
|
||||||
|
Feature #6162: Refactor GUI to use shaders and to be GLES and GL3+ friendly
|
||||||
|
|
||||||
0.47.0
|
0.47.0
|
||||||
------
|
------
|
||||||
|
@ -753,6 +753,12 @@ void OMW::Engine::prepareEngine (Settings::Manager & settings)
|
|||||||
else
|
else
|
||||||
gameControllerdb = ""; //if it doesn't exist, pass in an empty string
|
gameControllerdb = ""; //if it doesn't exist, pass in an empty string
|
||||||
|
|
||||||
|
// gui needs our shaders path before everything else
|
||||||
|
mResourceSystem->getSceneManager()->setShaderPath((mResDir / "shaders").string());
|
||||||
|
|
||||||
|
osg::ref_ptr<osg::GLExtensions> exts = osg::GLExtensions::Get(0, false);
|
||||||
|
bool shadersSupported = exts && (exts->glslLanguageVersion >= 1.2f);
|
||||||
|
|
||||||
std::string myguiResources = (mResDir / "mygui").string();
|
std::string myguiResources = (mResDir / "mygui").string();
|
||||||
osg::ref_ptr<osg::Group> guiRoot = new osg::Group;
|
osg::ref_ptr<osg::Group> guiRoot = new osg::Group;
|
||||||
guiRoot->setName("GUI Root");
|
guiRoot->setName("GUI Root");
|
||||||
@ -761,7 +767,7 @@ void OMW::Engine::prepareEngine (Settings::Manager & settings)
|
|||||||
MWGui::WindowManager* window = new MWGui::WindowManager(mWindow, mViewer, guiRoot, mResourceSystem.get(), mWorkQueue.get(),
|
MWGui::WindowManager* window = new MWGui::WindowManager(mWindow, mViewer, guiRoot, mResourceSystem.get(), mWorkQueue.get(),
|
||||||
mCfgMgr.getLogPath().string() + std::string("/"), myguiResources,
|
mCfgMgr.getLogPath().string() + std::string("/"), myguiResources,
|
||||||
mScriptConsoleMode, mTranslationDataStorage, mEncoding, mExportFonts,
|
mScriptConsoleMode, mTranslationDataStorage, mEncoding, mExportFonts,
|
||||||
Version::getOpenmwVersionDescription(mResDir.string()), mCfgMgr.getUserConfigPath().string());
|
Version::getOpenmwVersionDescription(mResDir.string()), mCfgMgr.getUserConfigPath().string(), shadersSupported);
|
||||||
mEnvironment.setWindowManager (window);
|
mEnvironment.setWindowManager (window);
|
||||||
|
|
||||||
MWInput::InputManager* input = new MWInput::InputManager (mWindow, mViewer, mScreenCaptureHandler, mScreenCaptureOperation, keybinderUser, keybinderUserExists, userGameControllerdb, gameControllerdb, mGrab);
|
MWInput::InputManager* input = new MWInput::InputManager (mWindow, mViewer, mScreenCaptureHandler, mScreenCaptureOperation, keybinderUser, keybinderUserExists, userGameControllerdb, gameControllerdb, mGrab);
|
||||||
|
@ -35,6 +35,7 @@
|
|||||||
|
|
||||||
#include <components/resource/resourcesystem.hpp>
|
#include <components/resource/resourcesystem.hpp>
|
||||||
#include <components/resource/imagemanager.hpp>
|
#include <components/resource/imagemanager.hpp>
|
||||||
|
#include <components/resource/scenemanager.hpp>
|
||||||
|
|
||||||
#include <components/sceneutil/workqueue.hpp>
|
#include <components/sceneutil/workqueue.hpp>
|
||||||
|
|
||||||
@ -124,7 +125,7 @@ namespace MWGui
|
|||||||
WindowManager::WindowManager(
|
WindowManager::WindowManager(
|
||||||
SDL_Window* window, osgViewer::Viewer* viewer, osg::Group* guiRoot, Resource::ResourceSystem* resourceSystem, SceneUtil::WorkQueue* workQueue,
|
SDL_Window* window, osgViewer::Viewer* viewer, osg::Group* guiRoot, Resource::ResourceSystem* resourceSystem, SceneUtil::WorkQueue* workQueue,
|
||||||
const std::string& logpath, const std::string& resourcePath, bool consoleOnlyScripts, Translation::Storage& translationDataStorage,
|
const std::string& logpath, const std::string& resourcePath, bool consoleOnlyScripts, Translation::Storage& translationDataStorage,
|
||||||
ToUTF8::FromType encoding, bool exportFonts, const std::string& versionDescription, const std::string& userDataPath)
|
ToUTF8::FromType encoding, bool exportFonts, const std::string& versionDescription, const std::string& userDataPath, bool useShaders)
|
||||||
: mOldUpdateMask(0)
|
: mOldUpdateMask(0)
|
||||||
, mOldCullMask(0)
|
, mOldCullMask(0)
|
||||||
, mStore(nullptr)
|
, mStore(nullptr)
|
||||||
@ -275,6 +276,9 @@ namespace MWGui
|
|||||||
mVideoWrapper->setGammaContrast(Settings::Manager::getFloat("gamma", "Video"),
|
mVideoWrapper->setGammaContrast(Settings::Manager::getFloat("gamma", "Video"),
|
||||||
Settings::Manager::getFloat("contrast", "Video"));
|
Settings::Manager::getFloat("contrast", "Video"));
|
||||||
|
|
||||||
|
if (useShaders)
|
||||||
|
mGuiPlatform->getRenderManagerPtr()->enableShaders(mResourceSystem->getSceneManager()->getShaderManager());
|
||||||
|
|
||||||
mStatsWatcher.reset(new StatsWatcher());
|
mStatsWatcher.reset(new StatsWatcher());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -135,7 +135,7 @@ namespace MWGui
|
|||||||
|
|
||||||
WindowManager(SDL_Window* window, osgViewer::Viewer* viewer, osg::Group* guiRoot, Resource::ResourceSystem* resourceSystem, SceneUtil::WorkQueue* workQueue,
|
WindowManager(SDL_Window* window, osgViewer::Viewer* viewer, osg::Group* guiRoot, Resource::ResourceSystem* resourceSystem, SceneUtil::WorkQueue* workQueue,
|
||||||
const std::string& logpath, const std::string& cacheDir, bool consoleOnlyScripts, Translation::Storage& translationDataStorage,
|
const std::string& logpath, const std::string& cacheDir, bool consoleOnlyScripts, Translation::Storage& translationDataStorage,
|
||||||
ToUTF8::FromType encoding, bool exportFonts, const std::string& versionDescription, const std::string& localPath);
|
ToUTF8::FromType encoding, bool exportFonts, const std::string& versionDescription, const std::string& localPath, bool useShaders);
|
||||||
virtual ~WindowManager();
|
virtual ~WindowManager();
|
||||||
|
|
||||||
/// Set the ESMStore to use for retrieving of GUI-related strings.
|
/// Set the ESMStore to use for retrieving of GUI-related strings.
|
||||||
|
@ -201,7 +201,6 @@ namespace MWRender
|
|||||||
auto lightingMethod = SceneUtil::LightManager::getLightingMethodFromString(Settings::Manager::getString("lighting method", "Shaders"));
|
auto lightingMethod = SceneUtil::LightManager::getLightingMethodFromString(Settings::Manager::getString("lighting method", "Shaders"));
|
||||||
|
|
||||||
resourceSystem->getSceneManager()->setParticleSystemMask(MWRender::Mask_ParticleSystem);
|
resourceSystem->getSceneManager()->setParticleSystemMask(MWRender::Mask_ParticleSystem);
|
||||||
resourceSystem->getSceneManager()->setShaderPath(resourcePath + "/shaders");
|
|
||||||
// Shadows and radial fog have problems with fixed-function mode
|
// Shadows and radial fog have problems with fixed-function mode
|
||||||
bool forceShaders = Settings::Manager::getBool("radial fog", "Shaders")
|
bool forceShaders = Settings::Manager::getBool("radial fog", "Shaders")
|
||||||
|| Settings::Manager::getBool("force shaders", "Shaders")
|
|| Settings::Manager::getBool("force shaders", "Shaders")
|
||||||
|
@ -14,6 +14,7 @@
|
|||||||
#include <osgGA/GUIEventHandler>
|
#include <osgGA/GUIEventHandler>
|
||||||
|
|
||||||
#include <components/resource/imagemanager.hpp>
|
#include <components/resource/imagemanager.hpp>
|
||||||
|
#include <components/shader/shadermanager.hpp>
|
||||||
|
|
||||||
#include <components/debug/debuglog.hpp>
|
#include <components/debug/debuglog.hpp>
|
||||||
|
|
||||||
@ -127,9 +128,13 @@ public:
|
|||||||
state->apply();
|
state->apply();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// A GUI element without an associated texture would be extremely rare.
|
||||||
|
// It is worth it to use a dummy 1x1 black texture sampler instead of either adding a conditional or relinking shaders.
|
||||||
osg::Texture2D* texture = batch.mTexture;
|
osg::Texture2D* texture = batch.mTexture;
|
||||||
if(texture)
|
if(texture)
|
||||||
state->applyTextureAttribute(0, texture);
|
state->applyTextureAttribute(0, texture);
|
||||||
|
else
|
||||||
|
state->applyTextureAttribute(0, mDummyTexture);
|
||||||
|
|
||||||
osg::GLBufferObject* bufferobject = state->isVertexBufferObjectSupported() ? vbo->getOrCreateGLBufferObject(state->getContextID()) : nullptr;
|
osg::GLBufferObject* bufferobject = state->isVertexBufferObjectSupported() ? vbo->getOrCreateGLBufferObject(state->getContextID()) : nullptr;
|
||||||
if (bufferobject)
|
if (bufferobject)
|
||||||
@ -189,6 +194,10 @@ public:
|
|||||||
mStateSet->setMode(GL_DEPTH_TEST, osg::StateAttribute::OFF);
|
mStateSet->setMode(GL_DEPTH_TEST, osg::StateAttribute::OFF);
|
||||||
mStateSet->setMode(GL_BLEND, osg::StateAttribute::ON);
|
mStateSet->setMode(GL_BLEND, osg::StateAttribute::ON);
|
||||||
|
|
||||||
|
mDummyTexture = new osg::Texture2D;
|
||||||
|
mDummyTexture->setInternalFormat(GL_RGB);
|
||||||
|
mDummyTexture->setTextureSize(1,1);
|
||||||
|
|
||||||
// need to flip tex coords since MyGUI uses DirectX convention of top left image origin
|
// need to flip tex coords since MyGUI uses DirectX convention of top left image origin
|
||||||
osg::Matrix flipMat;
|
osg::Matrix flipMat;
|
||||||
flipMat.preMultTranslate(osg::Vec3f(0,1,0));
|
flipMat.preMultTranslate(osg::Vec3f(0,1,0));
|
||||||
@ -201,6 +210,7 @@ public:
|
|||||||
, mStateSet(copy.mStateSet)
|
, mStateSet(copy.mStateSet)
|
||||||
, mWriteTo(0)
|
, mWriteTo(0)
|
||||||
, mReadFrom(0)
|
, mReadFrom(0)
|
||||||
|
, mDummyTexture(copy.mDummyTexture)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -231,6 +241,11 @@ public:
|
|||||||
mBatchVector[mWriteTo].clear();
|
mBatchVector[mWriteTo].clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
osg::StateSet* getDrawableStateSet()
|
||||||
|
{
|
||||||
|
return mStateSet;
|
||||||
|
}
|
||||||
|
|
||||||
META_Object(osgMyGUI, Drawable)
|
META_Object(osgMyGUI, Drawable)
|
||||||
|
|
||||||
private:
|
private:
|
||||||
@ -242,6 +257,8 @@ private:
|
|||||||
|
|
||||||
int mWriteTo;
|
int mWriteTo;
|
||||||
mutable int mReadFrom;
|
mutable int mReadFrom;
|
||||||
|
|
||||||
|
osg::ref_ptr<osg::Texture2D> mDummyTexture;
|
||||||
};
|
};
|
||||||
|
|
||||||
class OSGVertexBuffer : public MyGUI::IVertexBuffer
|
class OSGVertexBuffer : public MyGUI::IVertexBuffer
|
||||||
@ -417,6 +434,16 @@ void RenderManager::shutdown()
|
|||||||
mSceneRoot->removeChild(mGuiRoot);
|
mSceneRoot->removeChild(mGuiRoot);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void RenderManager::enableShaders(Shader::ShaderManager& shaderManager)
|
||||||
|
{
|
||||||
|
auto vertexShader = shaderManager.getShader("gui_vertex.glsl", {}, osg::Shader::VERTEX);
|
||||||
|
auto fragmentShader = shaderManager.getShader("gui_fragment.glsl", {}, osg::Shader::FRAGMENT);
|
||||||
|
auto program = shaderManager.getProgram(vertexShader, fragmentShader);
|
||||||
|
|
||||||
|
mDrawable->getDrawableStateSet()->setAttributeAndModes(program, osg::StateAttribute::ON);
|
||||||
|
mDrawable->getDrawableStateSet()->addUniform(new osg::Uniform("diffuseMap", 0));
|
||||||
|
}
|
||||||
|
|
||||||
MyGUI::IVertexBuffer* RenderManager::createVertexBuffer()
|
MyGUI::IVertexBuffer* RenderManager::createVertexBuffer()
|
||||||
{
|
{
|
||||||
return new OSGVertexBuffer();
|
return new OSGVertexBuffer();
|
||||||
|
@ -12,6 +12,11 @@ namespace Resource
|
|||||||
class ImageManager;
|
class ImageManager;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
namespace Shader
|
||||||
|
{
|
||||||
|
class ShaderManager;
|
||||||
|
}
|
||||||
|
|
||||||
namespace osgViewer
|
namespace osgViewer
|
||||||
{
|
{
|
||||||
class Viewer;
|
class Viewer;
|
||||||
@ -62,6 +67,8 @@ public:
|
|||||||
void initialise();
|
void initialise();
|
||||||
void shutdown();
|
void shutdown();
|
||||||
|
|
||||||
|
void enableShaders(Shader::ShaderManager& shaderManager);
|
||||||
|
|
||||||
void setScalingFactor(float factor);
|
void setScalingFactor(float factor);
|
||||||
|
|
||||||
static RenderManager& getInstance() { return *getInstancePtr(); }
|
static RenderManager& getInstance() { return *getInstancePtr(); }
|
||||||
|
@ -31,6 +31,8 @@ set(SHADER_FILES
|
|||||||
nv_default_fragment.glsl
|
nv_default_fragment.glsl
|
||||||
nv_nolighting_vertex.glsl
|
nv_nolighting_vertex.glsl
|
||||||
nv_nolighting_fragment.glsl
|
nv_nolighting_fragment.glsl
|
||||||
|
gui_vertex.glsl
|
||||||
|
gui_fragment.glsl
|
||||||
)
|
)
|
||||||
|
|
||||||
copy_all_resource_files(${CMAKE_CURRENT_SOURCE_DIR} ${OPENMW_SHADERS_ROOT} ${DDIRRELATIVE} "${SHADER_FILES}")
|
copy_all_resource_files(${CMAKE_CURRENT_SOURCE_DIR} ${OPENMW_SHADERS_ROOT} ${DDIRRELATIVE} "${SHADER_FILES}")
|
||||||
|
11
files/shaders/gui_fragment.glsl
Normal file
11
files/shaders/gui_fragment.glsl
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
#version 120
|
||||||
|
|
||||||
|
uniform sampler2D diffuseMap;
|
||||||
|
|
||||||
|
varying vec2 diffuseMapUV;
|
||||||
|
varying vec4 passColor;
|
||||||
|
|
||||||
|
void main()
|
||||||
|
{
|
||||||
|
gl_FragData[0] = texture2D(diffuseMap, diffuseMapUV) * passColor;
|
||||||
|
}
|
11
files/shaders/gui_vertex.glsl
Normal file
11
files/shaders/gui_vertex.glsl
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
#version 120
|
||||||
|
|
||||||
|
varying vec2 diffuseMapUV;
|
||||||
|
varying vec4 passColor;
|
||||||
|
|
||||||
|
void main()
|
||||||
|
{
|
||||||
|
gl_Position = vec4(gl_Vertex.xyz, 1.0);
|
||||||
|
diffuseMapUV = (gl_TextureMatrix[0] * gl_MultiTexCoord0).xy;
|
||||||
|
passColor = gl_Color;
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user