From 57a67e2887efe7c9360a00431fadc81e30ef7485 Mon Sep 17 00:00:00 2001 From: turanszkij Date: Sun, 27 Dec 2015 18:40:20 +0100 Subject: [PATCH] ReloadShaders completed --- ScriptingAPI-Documentation.md | 2 +- WickedEngine/wiEmittedParticle.cpp | 8 +- WickedEngine/wiEmittedParticle.h | 2 + WickedEngine/wiFont.cpp | 4 +- WickedEngine/wiFont.h | 2 + WickedEngine/wiHairParticle.cpp | 35 +++---- WickedEngine/wiHairParticle.h | 4 + WickedEngine/wiImage.cpp | 34 +++---- WickedEngine/wiImage.h | 2 + WickedEngine/wiLensFlare.cpp | 6 +- WickedEngine/wiLensFlare.h | 2 + WickedEngine/wiRenderer.cpp | 140 ++++++++++++++++------------ WickedEngine/wiRenderer.h | 3 +- WickedEngine/wiRenderer_BindLua.cpp | 4 + WickedEngine/wiResourceManager.cpp | 5 + WickedEngine/wiResourceManager.h | 1 + WickedEngine/wiVersion.cpp | 2 +- 17 files changed, 149 insertions(+), 107 deletions(-) diff --git a/ScriptingAPI-Documentation.md b/ScriptingAPI-Documentation.md index 1fb832a5b..f3c9cce85 100644 --- a/ScriptingAPI-Documentation.md +++ b/ScriptingAPI-Documentation.md @@ -124,7 +124,7 @@ You can use the Renderer with the following functions, all of which are in the g - PutWaterRipple(String imagename, Vector position) - PutDecal(Decal decal) - ClearWorld() -- ReloadShaders() +- ReloadShaders(opt string path) ## Utility Tools The scripting API provides certain engine features to be used in development. diff --git a/WickedEngine/wiEmittedParticle.cpp b/WickedEngine/wiEmittedParticle.cpp index cb2ea0ecb..229261503 100644 --- a/WickedEngine/wiEmittedParticle.cpp +++ b/WickedEngine/wiEmittedParticle.cpp @@ -345,7 +345,7 @@ void wiEmittedParticle::LoadShaders() { "VELOCITY", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, D3D11_APPEND_ALIGNED_ELEMENT, D3D11_INPUT_PER_VERTEX_DATA, 0 }, }; UINT numElements = ARRAYSIZE(layout); - wiRenderer::VertexShaderInfo* vsinfo = static_cast(wiResourceManager::GetGlobal()->add("shaders/pointspriteVS.cso", wiResourceManager::VERTEXSHADER, layout, numElements)); + wiRenderer::VertexShaderInfo* vsinfo = static_cast(wiResourceManager::GetShaderManager()->add(wiRenderer::SHADERPATH + "pointspriteVS.cso", wiResourceManager::VERTEXSHADER, layout, numElements)); if (vsinfo != nullptr){ vertexShader = vsinfo->vertexShader; vertexLayout = vsinfo->vertexLayout; @@ -353,10 +353,10 @@ void wiEmittedParticle::LoadShaders() delete vsinfo; - pixelShader = static_cast(wiResourceManager::GetGlobal()->add("shaders/pointspritePS.cso", wiResourceManager::PIXELSHADER)); - simplestPS = static_cast(wiResourceManager::GetGlobal()->add("shaders/pointspritePS_simplest.cso", wiResourceManager::PIXELSHADER)); + pixelShader = static_cast(wiResourceManager::GetShaderManager()->add(wiRenderer::SHADERPATH + "pointspritePS.cso", wiResourceManager::PIXELSHADER)); + simplestPS = static_cast(wiResourceManager::GetShaderManager()->add(wiRenderer::SHADERPATH + "pointspritePS_simplest.cso", wiResourceManager::PIXELSHADER)); - geometryShader = static_cast(wiResourceManager::GetGlobal()->add("shaders/pointspriteGS.cso", wiResourceManager::GEOMETRYSHADER)); + geometryShader = static_cast(wiResourceManager::GetShaderManager()->add(wiRenderer::SHADERPATH + "pointspriteGS.cso", wiResourceManager::GEOMETRYSHADER)); diff --git a/WickedEngine/wiEmittedParticle.h b/WickedEngine/wiEmittedParticle.h index d60cc5528..e9d0fe4dd 100644 --- a/WickedEngine/wiEmittedParticle.h +++ b/WickedEngine/wiEmittedParticle.h @@ -61,7 +61,9 @@ private: static ID3D11RasterizerState* rasterizerState,*wireFrameRS; static ID3D11DepthStencilState* depthStencilState; +public: static void LoadShaders(); +private: static void SetUpCB(); static void SetUpStates(); void LoadVertexBuffer(); diff --git a/WickedEngine/wiFont.cpp b/WickedEngine/wiFont.cpp index 58bf5de34..d0a2d5dd5 100644 --- a/WickedEngine/wiFont.cpp +++ b/WickedEngine/wiFont.cpp @@ -139,7 +139,7 @@ void wiFont::LoadShaders() { "TEXCOORD", 0, DXGI_FORMAT_R32G32_FLOAT, 0, D3D11_APPEND_ALIGNED_ELEMENT, D3D11_INPUT_PER_VERTEX_DATA, 0 }, }; UINT numElements = ARRAYSIZE(layout); - wiRenderer::VertexShaderInfo* vsinfo = static_cast(wiResourceManager::GetGlobal()->add("shaders/fontVS.cso", wiResourceManager::VERTEXSHADER, layout, numElements)); + wiRenderer::VertexShaderInfo* vsinfo = static_cast(wiResourceManager::GetShaderManager()->add(wiRenderer::SHADERPATH + "fontVS.cso", wiResourceManager::VERTEXSHADER, layout, numElements)); if (vsinfo != nullptr){ vertexShader = vsinfo->vertexShader; vertexLayout = vsinfo->vertexLayout; @@ -147,7 +147,7 @@ void wiFont::LoadShaders() delete vsinfo; - pixelShader = static_cast(wiResourceManager::GetGlobal()->add("shaders/fontPS.cso", wiResourceManager::PIXELSHADER)); + pixelShader = static_cast(wiResourceManager::GetShaderManager()->add(wiRenderer::SHADERPATH + "fontPS.cso", wiResourceManager::PIXELSHADER)); diff --git a/WickedEngine/wiFont.h b/WickedEngine/wiFont.h index dd53499e8..5a7816e84 100644 --- a/WickedEngine/wiFont.h +++ b/WickedEngine/wiFont.h @@ -63,7 +63,9 @@ protected: static void SetUpStates(); static void SetUpCB(); +public: static void LoadShaders(); +private: static void LoadVertexBuffer(); static void LoadIndices(); diff --git a/WickedEngine/wiHairParticle.cpp b/WickedEngine/wiHairParticle.cpp index d0e6170a7..d6327755b 100644 --- a/WickedEngine/wiHairParticle.cpp +++ b/WickedEngine/wiHairParticle.cpp @@ -66,9 +66,8 @@ void wiHairParticle::CleanUpStatic(){ if(ncrs) ncrs->Release(); ncrs=NULL; } -void wiHairParticle::SetUpStatic(){ - Settings(10,25,120); - +void wiHairParticle::LoadShaders() +{ D3D11_INPUT_ELEMENT_DESC layout[] = { @@ -77,8 +76,8 @@ void wiHairParticle::SetUpStatic(){ { "TANGENT", 0, DXGI_FORMAT_R32G32B32A32_FLOAT, 0, D3D11_APPEND_ALIGNED_ELEMENT, D3D11_INPUT_PER_VERTEX_DATA, 0 }, }; UINT numElements = ARRAYSIZE(layout); - wiRenderer::VertexShaderInfo* vsinfo = static_cast(wiResourceManager::GetGlobal()->add("shaders/grassVS.cso", wiResourceManager::VERTEXSHADER, layout, numElements)); - if (vsinfo != nullptr){ + wiRenderer::VertexShaderInfo* vsinfo = static_cast(wiResourceManager::GetShaderManager()->add(wiRenderer::SHADERPATH + "grassVS.cso", wiResourceManager::VERTEXSHADER, layout, numElements)); + if (vsinfo != nullptr) { vs = vsinfo->vertexShader; il = vsinfo->vertexLayout; } @@ -86,25 +85,21 @@ void wiHairParticle::SetUpStatic(){ - ps = static_cast(wiResourceManager::GetGlobal()->add("shaders/grassPS.cso", wiResourceManager::PIXELSHADER)); - qps = static_cast(wiResourceManager::GetGlobal()->add("shaders/qGrassPS.cso", wiResourceManager::PIXELSHADER)); - - gs[0] = static_cast(wiResourceManager::GetGlobal()->add("shaders/grassL0GS.cso", wiResourceManager::GEOMETRYSHADER)); - gs[1] = static_cast(wiResourceManager::GetGlobal()->add("shaders/grassL1GS.cso", wiResourceManager::GEOMETRYSHADER)); - gs[2] = static_cast(wiResourceManager::GetGlobal()->add("shaders/grassL2GS.cso", wiResourceManager::GEOMETRYSHADER)); - - qgs[0] = static_cast(wiResourceManager::GetGlobal()->add("shaders/qGrassLCloseGS.cso", wiResourceManager::GEOMETRYSHADER)); - qgs[1] = static_cast(wiResourceManager::GetGlobal()->add("shaders/qGrassLDistGS.cso", wiResourceManager::GEOMETRYSHADER)); - - - - - - + ps = static_cast(wiResourceManager::GetShaderManager()->add(wiRenderer::SHADERPATH + "grassPS.cso", wiResourceManager::PIXELSHADER)); + qps = static_cast(wiResourceManager::GetShaderManager()->add(wiRenderer::SHADERPATH + "qGrassPS.cso", wiResourceManager::PIXELSHADER)); + gs[0] = static_cast(wiResourceManager::GetShaderManager()->add(wiRenderer::SHADERPATH + "grassL0GS.cso", wiResourceManager::GEOMETRYSHADER)); + gs[1] = static_cast(wiResourceManager::GetShaderManager()->add(wiRenderer::SHADERPATH + "grassL1GS.cso", wiResourceManager::GEOMETRYSHADER)); + gs[2] = static_cast(wiResourceManager::GetShaderManager()->add(wiRenderer::SHADERPATH + "grassL2GS.cso", wiResourceManager::GEOMETRYSHADER)); + qgs[0] = static_cast(wiResourceManager::GetShaderManager()->add(wiRenderer::SHADERPATH + "qGrassLCloseGS.cso", wiResourceManager::GEOMETRYSHADER)); + qgs[1] = static_cast(wiResourceManager::GetShaderManager()->add(wiRenderer::SHADERPATH + "qGrassLDistGS.cso", wiResourceManager::GEOMETRYSHADER)); +} +void wiHairParticle::SetUpStatic(){ + Settings(10,25,120); + LoadShaders(); // diff --git a/WickedEngine/wiHairParticle.h b/WickedEngine/wiHairParticle.h index 541d77ebc..352dbeb30 100644 --- a/WickedEngine/wiHairParticle.h +++ b/WickedEngine/wiHairParticle.h @@ -55,6 +55,10 @@ private: static ID3D11SamplerState* ss; static ID3D11BlendState* bs; static int LOD[3]; +public: + static void LoadShaders(); +private: + public: wiHairParticle(); wiHairParticle(const string& newName, float newLen, int newCount diff --git a/WickedEngine/wiImage.cpp b/WickedEngine/wiImage.cpp index 0f1215c38..9e2bf1110 100644 --- a/WickedEngine/wiImage.cpp +++ b/WickedEngine/wiImage.cpp @@ -79,24 +79,24 @@ void wiImage::LoadShaders() { - vertexShader = static_cast(wiResourceManager::GetGlobal()->add("shaders/imageVS.cso", wiResourceManager::VERTEXSHADER)); - screenVS = static_cast(wiResourceManager::GetGlobal()->add("shaders/screenVS.cso", wiResourceManager::VERTEXSHADER)); + vertexShader = static_cast(wiResourceManager::GetShaderManager()->add(wiRenderer::SHADERPATH + "imageVS.cso", wiResourceManager::VERTEXSHADER)); + screenVS = static_cast(wiResourceManager::GetShaderManager()->add(wiRenderer::SHADERPATH + "screenVS.cso", wiResourceManager::VERTEXSHADER)); - pixelShader = static_cast(wiResourceManager::GetGlobal()->add("shaders/imagePS.cso", wiResourceManager::PIXELSHADER)); - blurHPS = static_cast(wiResourceManager::GetGlobal()->add("shaders/horizontalBlurPS.cso", wiResourceManager::PIXELSHADER)); - blurVPS = static_cast(wiResourceManager::GetGlobal()->add("shaders/verticalBlurPS.cso", wiResourceManager::PIXELSHADER)); - shaftPS = static_cast(wiResourceManager::GetGlobal()->add("shaders/lightShaftPS.cso", wiResourceManager::PIXELSHADER)); - outlinePS = static_cast(wiResourceManager::GetGlobal()->add("shaders/outlinePS.cso", wiResourceManager::PIXELSHADER)); - dofPS = static_cast(wiResourceManager::GetGlobal()->add("shaders/depthofFieldPS.cso", wiResourceManager::PIXELSHADER)); - motionBlurPS = static_cast(wiResourceManager::GetGlobal()->add("shaders/motionBlurPS.cso", wiResourceManager::PIXELSHADER)); - bloomSeparatePS = static_cast(wiResourceManager::GetGlobal()->add("shaders/bloomSeparatePS.cso", wiResourceManager::PIXELSHADER)); - fxaaPS = static_cast(wiResourceManager::GetGlobal()->add("shaders/fxaa.cso", wiResourceManager::PIXELSHADER)); - ssaoPS = static_cast(wiResourceManager::GetGlobal()->add("shaders/ssao.cso", wiResourceManager::PIXELSHADER)); - ssssPS = static_cast(wiResourceManager::GetGlobal()->add("shaders/ssss.cso", wiResourceManager::PIXELSHADER)); - linDepthPS = static_cast(wiResourceManager::GetGlobal()->add("shaders/linDepthPS.cso", wiResourceManager::PIXELSHADER)); - colorGradePS = static_cast(wiResourceManager::GetGlobal()->add("shaders/colorGradePS.cso", wiResourceManager::PIXELSHADER)); - deferredPS = static_cast(wiResourceManager::GetGlobal()->add("shaders/deferredPS.cso", wiResourceManager::PIXELSHADER)); - ssrPS = static_cast(wiResourceManager::GetGlobal()->add("shaders/ssr.cso", wiResourceManager::PIXELSHADER)); + pixelShader = static_cast(wiResourceManager::GetShaderManager()->add(wiRenderer::SHADERPATH + "imagePS.cso", wiResourceManager::PIXELSHADER)); + blurHPS = static_cast(wiResourceManager::GetShaderManager()->add(wiRenderer::SHADERPATH + "horizontalBlurPS.cso", wiResourceManager::PIXELSHADER)); + blurVPS = static_cast(wiResourceManager::GetShaderManager()->add(wiRenderer::SHADERPATH + "verticalBlurPS.cso", wiResourceManager::PIXELSHADER)); + shaftPS = static_cast(wiResourceManager::GetShaderManager()->add(wiRenderer::SHADERPATH + "lightShaftPS.cso", wiResourceManager::PIXELSHADER)); + outlinePS = static_cast(wiResourceManager::GetShaderManager()->add(wiRenderer::SHADERPATH + "outlinePS.cso", wiResourceManager::PIXELSHADER)); + dofPS = static_cast(wiResourceManager::GetShaderManager()->add(wiRenderer::SHADERPATH + "depthofFieldPS.cso", wiResourceManager::PIXELSHADER)); + motionBlurPS = static_cast(wiResourceManager::GetShaderManager()->add(wiRenderer::SHADERPATH + "motionBlurPS.cso", wiResourceManager::PIXELSHADER)); + bloomSeparatePS = static_cast(wiResourceManager::GetShaderManager()->add(wiRenderer::SHADERPATH + "bloomSeparatePS.cso", wiResourceManager::PIXELSHADER)); + fxaaPS = static_cast(wiResourceManager::GetShaderManager()->add(wiRenderer::SHADERPATH + "fxaa.cso", wiResourceManager::PIXELSHADER)); + ssaoPS = static_cast(wiResourceManager::GetShaderManager()->add(wiRenderer::SHADERPATH + "ssao.cso", wiResourceManager::PIXELSHADER)); + ssssPS = static_cast(wiResourceManager::GetShaderManager()->add(wiRenderer::SHADERPATH + "ssss.cso", wiResourceManager::PIXELSHADER)); + linDepthPS = static_cast(wiResourceManager::GetShaderManager()->add(wiRenderer::SHADERPATH + "linDepthPS.cso", wiResourceManager::PIXELSHADER)); + colorGradePS = static_cast(wiResourceManager::GetShaderManager()->add(wiRenderer::SHADERPATH + "colorGradePS.cso", wiResourceManager::PIXELSHADER)); + deferredPS = static_cast(wiResourceManager::GetShaderManager()->add(wiRenderer::SHADERPATH + "deferredPS.cso", wiResourceManager::PIXELSHADER)); + ssrPS = static_cast(wiResourceManager::GetShaderManager()->add(wiRenderer::SHADERPATH + "ssr.cso", wiResourceManager::PIXELSHADER)); diff --git a/WickedEngine/wiImage.h b/WickedEngine/wiImage.h index 9104d9175..6c1b5dd7b 100644 --- a/WickedEngine/wiImage.h +++ b/WickedEngine/wiImage.h @@ -74,7 +74,9 @@ protected: static ID3D11RasterizerState* rasterizerState; static ID3D11DepthStencilState* depthStencilStateGreater,*depthStencilStateLess,*depthNoStencilState; +public: static void LoadShaders(); +private: static void LoadBuffers(); static void SetUpStates(); diff --git a/WickedEngine/wiLensFlare.cpp b/WickedEngine/wiLensFlare.cpp index daf532b81..8d8ff2523 100644 --- a/WickedEngine/wiLensFlare.cpp +++ b/WickedEngine/wiLensFlare.cpp @@ -100,7 +100,7 @@ void wiLensFlare::LoadShaders(){ { "POSITION", 0, DXGI_FORMAT_R32G32B32A32_FLOAT, 0, D3D11_APPEND_ALIGNED_ELEMENT, D3D11_INPUT_PER_VERTEX_DATA, 0 }, }; UINT numElements = ARRAYSIZE(layout); - wiRenderer::VertexShaderInfo* vsinfo = static_cast(wiResourceManager::GetGlobal()->add("shaders/lensFlareVS.cso", wiResourceManager::VERTEXSHADER, layout, numElements)); + wiRenderer::VertexShaderInfo* vsinfo = static_cast(wiResourceManager::GetShaderManager()->add(wiRenderer::SHADERPATH + "lensFlareVS.cso", wiResourceManager::VERTEXSHADER, layout, numElements)); if (vsinfo != nullptr){ vertexShader = vsinfo->vertexShader; inputLayout = vsinfo->vertexLayout; @@ -108,9 +108,9 @@ void wiLensFlare::LoadShaders(){ delete vsinfo; - pixelShader = static_cast(wiResourceManager::GetGlobal()->add("shaders/lensFlarePS.cso", wiResourceManager::PIXELSHADER)); + pixelShader = static_cast(wiResourceManager::GetShaderManager()->add(wiRenderer::SHADERPATH + "lensFlarePS.cso", wiResourceManager::PIXELSHADER)); - geometryShader = static_cast(wiResourceManager::GetGlobal()->add("shaders/lensFlareGS.cso", wiResourceManager::GEOMETRYSHADER)); + geometryShader = static_cast(wiResourceManager::GetShaderManager()->add(wiRenderer::SHADERPATH + "lensFlareGS.cso", wiResourceManager::GEOMETRYSHADER)); diff --git a/WickedEngine/wiLensFlare.h b/WickedEngine/wiLensFlare.h index 6acea8c51..3ddb9a71e 100644 --- a/WickedEngine/wiLensFlare.h +++ b/WickedEngine/wiLensFlare.h @@ -23,7 +23,9 @@ private: ALIGN_16 }; +public: static void LoadShaders(); +private: static void SetUpStates(); static void SetUpCB(); public: diff --git a/WickedEngine/wiRenderer.cpp b/WickedEngine/wiRenderer.cpp index 7d42e012d..059ca2299 100644 --- a/WickedEngine/wiRenderer.cpp +++ b/WickedEngine/wiRenderer.cpp @@ -19,6 +19,7 @@ #include "wiWaterPlane.h" #include "wiGraphicsThreads.h" #include "wiRandom.h" +#include "wiFont.h" #pragma region STATICS D3D_DRIVER_TYPE wiRenderer::driverType; @@ -74,6 +75,8 @@ WorldInfo wiRenderer::worldInfo; vector wiRenderer::textureSlotsPS(D3D11_COMMONSHADER_INPUT_RESOURCE_SLOT_COUNT); wiRenderer::PixelShader wiRenderer::boundPS=nullptr; + +string wiRenderer::SHADERPATH = "shaders/"; #pragma endregion #pragma region STATIC TEMP @@ -996,7 +999,7 @@ void wiRenderer::LoadBasicShaders() { "COLOR_DITHER", 0, DXGI_FORMAT_R32G32B32A32_FLOAT, 1, D3D11_APPEND_ALIGNED_ELEMENT, D3D11_INPUT_PER_INSTANCE_DATA, 1 }, }; UINT numElements = ARRAYSIZE(layout); - VertexShaderInfo* vsinfo = static_cast(wiResourceManager::GetGlobal()->add("shaders/effectVS10.cso", wiResourceManager::VERTEXSHADER, layout, numElements)); + VertexShaderInfo* vsinfo = static_cast(wiResourceManager::GetShaderManager()->add(SHADERPATH + "effectVS10.cso", wiResourceManager::VERTEXSHADER, layout, numElements)); if (vsinfo != nullptr){ vertexShader10 = vsinfo->vertexShader; vertexLayout = vsinfo->vertexLayout; @@ -1017,7 +1020,7 @@ void wiRenderer::LoadBasicShaders() UINT numElements = ARRAYSIZE(oslayout); - VertexShaderInfo* vsinfo = static_cast(wiResourceManager::GetGlobal()->add("shaders/sOVS.cso", wiResourceManager::VERTEXSHADER, oslayout, numElements)); + VertexShaderInfo* vsinfo = static_cast(wiResourceManager::GetShaderManager()->add(SHADERPATH + "sOVS.cso", wiResourceManager::VERTEXSHADER, oslayout, numElements)); if (vsinfo != nullptr){ sOVS = vsinfo->vertexShader; sOIL = vsinfo->vertexLayout; @@ -1035,29 +1038,29 @@ void wiRenderer::LoadBasicShaders() { 0, "TEXCOORD", 1, 0, 4, 0 }, // output the first 2 texture coordinates }; - sOGS = static_cast(wiResourceManager::GetGlobal()->add("shaders/sOGS.cso", wiResourceManager::GEOMETRYSHADER, nullptr, 4, pDecl)); + sOGS = static_cast(wiResourceManager::GetShaderManager()->add(SHADERPATH + "sOGS.cso", wiResourceManager::GEOMETRYSHADER, nullptr, 4, pDecl)); } - vertexShader = static_cast(wiResourceManager::GetGlobal()->add("shaders/effectVS.cso", wiResourceManager::VERTEXSHADER)); - lightVS[0] = static_cast(wiResourceManager::GetGlobal()->add("shaders/dirLightVS.cso", wiResourceManager::VERTEXSHADER)); - lightVS[1] = static_cast(wiResourceManager::GetGlobal()->add("shaders/pointLightVS.cso", wiResourceManager::VERTEXSHADER)); - lightVS[2] = static_cast(wiResourceManager::GetGlobal()->add("shaders/spotLightVS.cso", wiResourceManager::VERTEXSHADER)); - vSpotLightVS = static_cast(wiResourceManager::GetGlobal()->add("shaders/vSpotLightVS.cso", wiResourceManager::VERTEXSHADER)); - vPointLightVS = static_cast(wiResourceManager::GetGlobal()->add("shaders/vPointLightVS.cso", wiResourceManager::VERTEXSHADER)); - decalVS = static_cast(wiResourceManager::GetGlobal()->add("shaders/decalVS.cso", wiResourceManager::VERTEXSHADER)); + vertexShader = static_cast(wiResourceManager::GetShaderManager()->add(SHADERPATH + "effectVS.cso", wiResourceManager::VERTEXSHADER)); + lightVS[0] = static_cast(wiResourceManager::GetShaderManager()->add(SHADERPATH + "dirLightVS.cso", wiResourceManager::VERTEXSHADER)); + lightVS[1] = static_cast(wiResourceManager::GetShaderManager()->add(SHADERPATH + "pointLightVS.cso", wiResourceManager::VERTEXSHADER)); + lightVS[2] = static_cast(wiResourceManager::GetShaderManager()->add(SHADERPATH + "spotLightVS.cso", wiResourceManager::VERTEXSHADER)); + vSpotLightVS = static_cast(wiResourceManager::GetShaderManager()->add(SHADERPATH + "vSpotLightVS.cso", wiResourceManager::VERTEXSHADER)); + vPointLightVS = static_cast(wiResourceManager::GetShaderManager()->add(SHADERPATH + "vPointLightVS.cso", wiResourceManager::VERTEXSHADER)); + decalVS = static_cast(wiResourceManager::GetShaderManager()->add(SHADERPATH + "decalVS.cso", wiResourceManager::VERTEXSHADER)); - pixelShader = static_cast(wiResourceManager::GetGlobal()->add("shaders/effectPS.cso", wiResourceManager::PIXELSHADER)); - transparentPS = static_cast(wiResourceManager::GetGlobal()->add("shaders/effectPS_transparent.cso", wiResourceManager::PIXELSHADER)); - simplestPS = static_cast(wiResourceManager::GetGlobal()->add("shaders/effectPS_simplest.cso", wiResourceManager::PIXELSHADER)); - fowardSimplePS = static_cast(wiResourceManager::GetGlobal()->add("shaders/effectPS_forwardSimple.cso", wiResourceManager::PIXELSHADER)); - blackoutPS = static_cast(wiResourceManager::GetGlobal()->add("shaders/effectPS_blackout.cso", wiResourceManager::PIXELSHADER)); - textureonlyPS = static_cast(wiResourceManager::GetGlobal()->add("shaders/effectPS_textureonly.cso", wiResourceManager::PIXELSHADER)); - lightPS[0] = static_cast(wiResourceManager::GetGlobal()->add("shaders/dirLightPS.cso", wiResourceManager::PIXELSHADER)); - lightPS[1] = static_cast(wiResourceManager::GetGlobal()->add("shaders/pointLightPS.cso", wiResourceManager::PIXELSHADER)); - lightPS[2] = static_cast(wiResourceManager::GetGlobal()->add("shaders/spotLightPS.cso", wiResourceManager::PIXELSHADER)); - vLightPS = static_cast(wiResourceManager::GetGlobal()->add("shaders/volumeLightPS.cso", wiResourceManager::PIXELSHADER)); - decalPS = static_cast(wiResourceManager::GetGlobal()->add("shaders/decalPS.cso", wiResourceManager::PIXELSHADER)); + pixelShader = static_cast(wiResourceManager::GetShaderManager()->add(SHADERPATH + "effectPS.cso", wiResourceManager::PIXELSHADER)); + transparentPS = static_cast(wiResourceManager::GetShaderManager()->add(SHADERPATH + "effectPS_transparent.cso", wiResourceManager::PIXELSHADER)); + simplestPS = static_cast(wiResourceManager::GetShaderManager()->add(SHADERPATH + "effectPS_simplest.cso", wiResourceManager::PIXELSHADER)); + fowardSimplePS = static_cast(wiResourceManager::GetShaderManager()->add(SHADERPATH + "effectPS_forwardSimple.cso", wiResourceManager::PIXELSHADER)); + blackoutPS = static_cast(wiResourceManager::GetShaderManager()->add(SHADERPATH + "effectPS_blackout.cso", wiResourceManager::PIXELSHADER)); + textureonlyPS = static_cast(wiResourceManager::GetShaderManager()->add(SHADERPATH + "effectPS_textureonly.cso", wiResourceManager::PIXELSHADER)); + lightPS[0] = static_cast(wiResourceManager::GetShaderManager()->add(SHADERPATH + "dirLightPS.cso", wiResourceManager::PIXELSHADER)); + lightPS[1] = static_cast(wiResourceManager::GetShaderManager()->add(SHADERPATH + "pointLightPS.cso", wiResourceManager::PIXELSHADER)); + lightPS[2] = static_cast(wiResourceManager::GetShaderManager()->add(SHADERPATH + "spotLightPS.cso", wiResourceManager::PIXELSHADER)); + vLightPS = static_cast(wiResourceManager::GetShaderManager()->add(SHADERPATH + "volumeLightPS.cso", wiResourceManager::PIXELSHADER)); + decalPS = static_cast(wiResourceManager::GetShaderManager()->add(SHADERPATH + "decalPS.cso", wiResourceManager::PIXELSHADER)); } void wiRenderer::LoadLineShaders() { @@ -1067,7 +1070,7 @@ void wiRenderer::LoadLineShaders() }; UINT numElements = ARRAYSIZE(layout); - VertexShaderInfo* vsinfo = static_cast(wiResourceManager::GetGlobal()->add("shaders/linesVS.cso", wiResourceManager::VERTEXSHADER, layout, numElements)); + VertexShaderInfo* vsinfo = static_cast(wiResourceManager::GetShaderManager()->add(SHADERPATH + "linesVS.cso", wiResourceManager::VERTEXSHADER, layout, numElements)); if (vsinfo != nullptr){ lineVS = vsinfo->vertexShader; lineIL = vsinfo->vertexLayout; @@ -1075,38 +1078,38 @@ void wiRenderer::LoadLineShaders() delete vsinfo; - linePS = static_cast(wiResourceManager::GetGlobal()->add("shaders/linesPS.cso", wiResourceManager::PIXELSHADER)); + linePS = static_cast(wiResourceManager::GetShaderManager()->add(SHADERPATH + "linesPS.cso", wiResourceManager::PIXELSHADER)); } void wiRenderer::LoadTessShaders() { - hullShader = static_cast(wiResourceManager::GetGlobal()->add("shaders/effectHS.cso", wiResourceManager::HULLSHADER)); - domainShader = static_cast(wiResourceManager::GetGlobal()->add("shaders/effectDS.cso", wiResourceManager::DOMAINSHADER)); + hullShader = static_cast(wiResourceManager::GetShaderManager()->add(SHADERPATH + "effectHS.cso", wiResourceManager::HULLSHADER)); + domainShader = static_cast(wiResourceManager::GetShaderManager()->add(SHADERPATH + "effectDS.cso", wiResourceManager::DOMAINSHADER)); } void wiRenderer::LoadSkyShaders() { - skyVS = static_cast(wiResourceManager::GetGlobal()->add("shaders/skyVS.cso", wiResourceManager::VERTEXSHADER)); - skyPS = static_cast(wiResourceManager::GetGlobal()->add("shaders/skyPS.cso", wiResourceManager::PIXELSHADER)); + skyVS = static_cast(wiResourceManager::GetShaderManager()->add(SHADERPATH + "skyVS.cso", wiResourceManager::VERTEXSHADER)); + skyPS = static_cast(wiResourceManager::GetShaderManager()->add(SHADERPATH + "skyPS.cso", wiResourceManager::PIXELSHADER)); } void wiRenderer::LoadShadowShaders() { - shVS = static_cast(wiResourceManager::GetGlobal()->add("shaders/shadowVS.cso", wiResourceManager::VERTEXSHADER)); - cubeShVS = static_cast(wiResourceManager::GetGlobal()->add("shaders/cubeShadowVS.cso", wiResourceManager::VERTEXSHADER)); + shVS = static_cast(wiResourceManager::GetShaderManager()->add(SHADERPATH + "shadowVS.cso", wiResourceManager::VERTEXSHADER)); + cubeShVS = static_cast(wiResourceManager::GetShaderManager()->add(SHADERPATH + "cubeShadowVS.cso", wiResourceManager::VERTEXSHADER)); - shPS = static_cast(wiResourceManager::GetGlobal()->add("shaders/shadowPS.cso", wiResourceManager::PIXELSHADER)); - cubeShPS = static_cast(wiResourceManager::GetGlobal()->add("shaders/cubeShadowPS.cso", wiResourceManager::PIXELSHADER)); + shPS = static_cast(wiResourceManager::GetShaderManager()->add(SHADERPATH + "shadowPS.cso", wiResourceManager::PIXELSHADER)); + cubeShPS = static_cast(wiResourceManager::GetShaderManager()->add(SHADERPATH + "cubeShadowPS.cso", wiResourceManager::PIXELSHADER)); - cubeShGS = static_cast(wiResourceManager::GetGlobal()->add("shaders/cubeShadowGS.cso", wiResourceManager::GEOMETRYSHADER)); + cubeShGS = static_cast(wiResourceManager::GetShaderManager()->add(SHADERPATH + "cubeShadowGS.cso", wiResourceManager::GEOMETRYSHADER)); } void wiRenderer::LoadWaterShaders() { - waterVS = static_cast(wiResourceManager::GetGlobal()->add("shaders/waterVS.cso", wiResourceManager::VERTEXSHADER)); - waterPS = static_cast(wiResourceManager::GetGlobal()->add("shaders/waterPS.cso", wiResourceManager::PIXELSHADER)); + waterVS = static_cast(wiResourceManager::GetShaderManager()->add(SHADERPATH + "waterVS.cso", wiResourceManager::VERTEXSHADER)); + waterPS = static_cast(wiResourceManager::GetShaderManager()->add(SHADERPATH + "waterPS.cso", wiResourceManager::PIXELSHADER)); } void wiRenderer::LoadTrailShaders(){ @@ -1118,7 +1121,7 @@ void wiRenderer::LoadTrailShaders(){ }; UINT numElements = ARRAYSIZE(layout); - VertexShaderInfo* vsinfo = static_cast(wiResourceManager::GetGlobal()->add("shaders/trailVS.cso", wiResourceManager::VERTEXSHADER, layout, numElements)); + VertexShaderInfo* vsinfo = static_cast(wiResourceManager::GetShaderManager()->add(SHADERPATH + "trailVS.cso", wiResourceManager::VERTEXSHADER, layout, numElements)); if (vsinfo != nullptr){ trailVS = vsinfo->vertexShader; trailIL = vsinfo->vertexLayout; @@ -1126,34 +1129,34 @@ void wiRenderer::LoadTrailShaders(){ delete vsinfo; - trailPS = static_cast(wiResourceManager::GetGlobal()->add("shaders/trailPS.cso", wiResourceManager::PIXELSHADER)); + trailPS = static_cast(wiResourceManager::GetShaderManager()->add(SHADERPATH + "trailPS.cso", wiResourceManager::PIXELSHADER)); } -void wiRenderer::ReloadShaders() +void wiRenderer::ReloadShaders(const string& path) { //// TODO : Also delete shaders from resourcemanager! - //wiResourceManager::GetGlobal()->del("shaders/effectVS10.cso"); - //wiResourceManager::GetGlobal()->del("shaders/sOVS.cso"); - //wiResourceManager::GetGlobal()->del("shaders/sOGS.cso"); - //wiResourceManager::GetGlobal()->del("shaders/effectVS.cso"); - //wiResourceManager::GetGlobal()->del("shaders/dirLightVS.cso"); - //wiResourceManager::GetGlobal()->del("shaders/pointLightVS.cso"); - //wiResourceManager::GetGlobal()->del("shaders/spotLightVS.cso"); - //wiResourceManager::GetGlobal()->del("shaders/vSpotLightVS.cso"); - //wiResourceManager::GetGlobal()->del("shaders/vPointLightVS.cso"); - //wiResourceManager::GetGlobal()->del("shaders/decalVS.cso"); - //wiResourceManager::GetGlobal()->del("shaders/effectPS.cso"); - //wiResourceManager::GetGlobal()->del("shaders/effectPS_transparent.cso"); - //wiResourceManager::GetGlobal()->del("shaders/effectPS_simplest.cso"); - //wiResourceManager::GetGlobal()->del("shaders/effectPS_forwardSimple.cso"); - //wiResourceManager::GetGlobal()->del("shaders/effectPS_blackout.cso"); - //wiResourceManager::GetGlobal()->del("shaders/effectPS_textureonly.cso"); - //wiResourceManager::GetGlobal()->del("shaders/dirLightPS.cso"); - //wiResourceManager::GetGlobal()->del("shaders/pointLightPS.cso"); - //wiResourceManager::GetGlobal()->del("shaders/spotLightPS.cso"); - //wiResourceManager::GetGlobal()->del("shaders/volumeLightPS.cso"); - //wiResourceManager::GetGlobal()->del("shaders/decalPS.cso"); + //wiResourceManager::GetGlobal()->del(SHADERPATH + "effectVS10.cso"); + //wiResourceManager::GetGlobal()->del(SHADERPATH + "sOVS.cso"); + //wiResourceManager::GetGlobal()->del(SHADERPATH + "sOGS.cso"); + //wiResourceManager::GetGlobal()->del(SHADERPATH + "effectVS.cso"); + //wiResourceManager::GetGlobal()->del(SHADERPATH + "dirLightVS.cso"); + //wiResourceManager::GetGlobal()->del(SHADERPATH + "pointLightVS.cso"); + //wiResourceManager::GetGlobal()->del(SHADERPATH + "spotLightVS.cso"); + //wiResourceManager::GetGlobal()->del(SHADERPATH + "vSpotLightVS.cso"); + //wiResourceManager::GetGlobal()->del(SHADERPATH + "vPointLightVS.cso"); + //wiResourceManager::GetGlobal()->del(SHADERPATH + "decalVS.cso"); + //wiResourceManager::GetGlobal()->del(SHADERPATH + "effectPS.cso"); + //wiResourceManager::GetGlobal()->del(SHADERPATH + "effectPS_transparent.cso"); + //wiResourceManager::GetGlobal()->del(SHADERPATH + "effectPS_simplest.cso"); + //wiResourceManager::GetGlobal()->del(SHADERPATH + "effectPS_forwardSimple.cso"); + //wiResourceManager::GetGlobal()->del(SHADERPATH + "effectPS_blackout.cso"); + //wiResourceManager::GetGlobal()->del(SHADERPATH + "effectPS_textureonly.cso"); + //wiResourceManager::GetGlobal()->del(SHADERPATH + "dirLightPS.cso"); + //wiResourceManager::GetGlobal()->del(SHADERPATH + "pointLightPS.cso"); + //wiResourceManager::GetGlobal()->del(SHADERPATH + "spotLightPS.cso"); + //wiResourceManager::GetGlobal()->del(SHADERPATH + "volumeLightPS.cso"); + //wiResourceManager::GetGlobal()->del(SHADERPATH + "decalPS.cso"); //LoadBasicShaders(); @@ -1163,6 +1166,27 @@ void wiRenderer::ReloadShaders() ////LoadShadowShaders(); ////LoadWaterShaders(); ////LoadTrailShaders(); + + if (path.length() > 0) + { + SHADERPATH = path; + } + + graphicsMutex.lock(); + wiResourceManager::GetShaderManager()->CleanUp(); + LoadBasicShaders(); + LoadLineShaders(); + LoadTessShaders(); + LoadSkyShaders(); + LoadShadowShaders(); + LoadWaterShaders(); + LoadTrailShaders(); + wiHairParticle::LoadShaders(); + wiEmittedParticle::LoadShaders(); + wiFont::LoadShaders(); + wiImage::LoadShaders(); + wiLensFlare::LoadShaders(); + graphicsMutex.unlock(); } diff --git a/WickedEngine/wiRenderer.h b/WickedEngine/wiRenderer.h index bd54597bf..6d90d6283 100644 --- a/WickedEngine/wiRenderer.h +++ b/WickedEngine/wiRenderer.h @@ -361,6 +361,7 @@ protected: static void RecursiveBoneTransform(Armature* armature, Bone* bone, const XMMATRIX& parentCombinedMat); static XMVECTOR InterPolateKeyFrames(float currentFrame, const int frameCount,const std::vector& keyframes, KeyFrameType type); public: + static string SHADERPATH; wiRenderer(); void CleanUp(); @@ -406,7 +407,7 @@ public: static Object* getObjectByName(const string& name); static Light* getLightByName(const string& name); - static void ReloadShaders(); + static void ReloadShaders(const string& path = ""); static Vertex TransformVertex(const Mesh* mesh, int vertexI, const XMMATRIX& mat = XMMatrixIdentity()); static Vertex TransformVertex(const Mesh* mesh, const SkinnedVertex& vertex, const XMMATRIX& mat = XMMatrixIdentity()); diff --git a/WickedEngine/wiRenderer_BindLua.cpp b/WickedEngine/wiRenderer_BindLua.cpp index 8db1e80bf..253a7f7b8 100644 --- a/WickedEngine/wiRenderer_BindLua.cpp +++ b/WickedEngine/wiRenderer_BindLua.cpp @@ -525,6 +525,10 @@ namespace wiRenderer_BindLua } int ReloadShaders(lua_State* L) { + if (wiLua::SGetArgCount(L) > 0) + { + wiRenderer::ReloadShaders(wiLua::SGetString(L, 1)); + } wiRenderer::ReloadShaders(); return 0; } diff --git a/WickedEngine/wiResourceManager.cpp b/WickedEngine/wiResourceManager.cpp index cbe30bdd0..7680401ff 100644 --- a/WickedEngine/wiResourceManager.cpp +++ b/WickedEngine/wiResourceManager.cpp @@ -29,6 +29,11 @@ wiResourceManager* wiResourceManager::GetGlobal() } return globalResources; } +wiResourceManager* wiResourceManager::GetShaderManager() +{ + static wiResourceManager* shaderManager = new wiResourceManager; + return shaderManager; +} void wiResourceManager::SetUp() { diff --git a/WickedEngine/wiResourceManager.h b/WickedEngine/wiResourceManager.h index f3b353ead..47556d64f 100644 --- a/WickedEngine/wiResourceManager.h +++ b/WickedEngine/wiResourceManager.h @@ -40,6 +40,7 @@ public: wiResourceManager(); ~wiResourceManager(); static wiResourceManager* GetGlobal(); + static wiResourceManager* GetShaderManager(); const Resource* get(const string& name); //specify datatype for shaders diff --git a/WickedEngine/wiVersion.cpp b/WickedEngine/wiVersion.cpp index eda6f2a44..c425592e3 100644 --- a/WickedEngine/wiVersion.cpp +++ b/WickedEngine/wiVersion.cpp @@ -7,7 +7,7 @@ namespace wiVersion // minor features, major bug fixes const int minor = 3; // minor bug fixes, alterations - const int revision = 2; + const int revision = 4; long GetVersion()