From 459c5e7a0903f0aea33945e3f0d55038b5b664e8 Mon Sep 17 00:00:00 2001 From: Lynix Date: Sun, 18 Dec 2016 01:16:26 +0100 Subject: [PATCH] =?UTF-8?q?Graphics/Shaders:=20Add=20possibility=20to=20ov?= =?UTF-8?q?erride=20=C3=9Cber-shaders=20at=20runtime?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Nazara/Graphics/MaterialPipeline.cpp | 39 +++++++++++++++++++++--- 1 file changed, 35 insertions(+), 4 deletions(-) diff --git a/src/Nazara/Graphics/MaterialPipeline.cpp b/src/Nazara/Graphics/MaterialPipeline.cpp index e8799fdd1..e9f947c90 100644 --- a/src/Nazara/Graphics/MaterialPipeline.cpp +++ b/src/Nazara/Graphics/MaterialPipeline.cpp @@ -3,6 +3,8 @@ // For conditions of distribution and use, see copyright notice in Config.hpp #include +#include +#include #include #include #include @@ -26,6 +28,25 @@ namespace Nz const UInt8 r_phongLightingVertexShader[] = { #include }; + + void OverrideShader(const String& path, String* source) + { + File shaderFile(path, Nz::OpenMode_ReadOnly | Nz::OpenMode_Text); + if (shaderFile.IsOpen()) + { + StringStream shaderSource; + + while (!shaderFile.EndOfFile()) + { + shaderSource << shaderFile.ReadLine(); + shaderSource << '\n'; + } + + *source = shaderSource; + + NazaraNotice(path + " will be used to override built-in shader"); + } + } } /*! @@ -103,11 +124,11 @@ namespace Nz #undef CacheUniform // Send texture units (those never changes) - renderPipelineInfo.shader->SendInteger(instance.uniforms[MaterialUniform_AlphaMap], Material::GetTextureUnit(TextureMap_Alpha)); - renderPipelineInfo.shader->SendInteger(instance.uniforms[MaterialUniform_DiffuseMap], Material::GetTextureUnit(TextureMap_Diffuse)); + renderPipelineInfo.shader->SendInteger(instance.uniforms[MaterialUniform_AlphaMap], Material::GetTextureUnit(TextureMap_Alpha)); + renderPipelineInfo.shader->SendInteger(instance.uniforms[MaterialUniform_DiffuseMap], Material::GetTextureUnit(TextureMap_Diffuse)); renderPipelineInfo.shader->SendInteger(instance.uniforms[MaterialUniform_EmissiveMap], Material::GetTextureUnit(TextureMap_Emissive)); - renderPipelineInfo.shader->SendInteger(instance.uniforms[MaterialUniform_HeightMap], Material::GetTextureUnit(TextureMap_Height)); - renderPipelineInfo.shader->SendInteger(instance.uniforms[MaterialUniform_NormalMap], Material::GetTextureUnit(TextureMap_Normal)); + renderPipelineInfo.shader->SendInteger(instance.uniforms[MaterialUniform_HeightMap], Material::GetTextureUnit(TextureMap_Height)); + renderPipelineInfo.shader->SendInteger(instance.uniforms[MaterialUniform_NormalMap], Material::GetTextureUnit(TextureMap_Normal)); renderPipelineInfo.shader->SendInteger(instance.uniforms[MaterialUniform_SpecularMap], Material::GetTextureUnit(TextureMap_Specular)); renderPipelineInfo.shader->SendInteger(renderPipelineInfo.shader->GetUniformLocation("ReflectionMap"), Material::GetTextureUnit(TextureMap_ReflectionCube)); @@ -131,6 +152,11 @@ namespace Nz String fragmentShader(reinterpret_cast(r_basicFragmentShader), sizeof(r_basicFragmentShader)); String vertexShader(reinterpret_cast(r_basicVertexShader), sizeof(r_basicVertexShader)); + #ifdef NAZARA_DEBUG + OverrideShader("Shaders/Basic/core.frag", &fragmentShader); + OverrideShader("Shaders/Basic/core.vert", &vertexShader); + #endif + uberShader->SetShader(ShaderStageType_Fragment, fragmentShader, "FLAG_TEXTUREOVERLAY ALPHA_MAPPING ALPHA_TEST AUTO_TEXCOORDS DIFFUSE_MAPPING"); uberShader->SetShader(ShaderStageType_Vertex, vertexShader, "FLAG_BILLBOARD FLAG_INSTANCING FLAG_VERTEXCOLOR TEXTURE_MAPPING TRANSFORM UNIFORM_VERTEX_DEPTH"); @@ -144,6 +170,11 @@ namespace Nz String fragmentShader(reinterpret_cast(r_phongLightingFragmentShader), sizeof(r_phongLightingFragmentShader)); String vertexShader(reinterpret_cast(r_phongLightingVertexShader), sizeof(r_phongLightingVertexShader)); + #ifdef NAZARA_DEBUG + OverrideShader("Shaders/PhongLighting/core.frag", &fragmentShader); + OverrideShader("Shaders/PhongLighting/core.vert", &vertexShader); + #endif + uberShader->SetShader(ShaderStageType_Fragment, fragmentShader, "FLAG_DEFERRED FLAG_TEXTUREOVERLAY ALPHA_MAPPING ALPHA_TEST AUTO_TEXCOORDS DIFFUSE_MAPPING EMISSIVE_MAPPING NORMAL_MAPPING PARALLAX_MAPPING SHADOW_MAPPING SPECULAR_MAPPING"); uberShader->SetShader(ShaderStageType_Vertex, vertexShader, "FLAG_BILLBOARD FLAG_DEFERRED FLAG_INSTANCING FLAG_VERTEXCOLOR COMPUTE_TBNMATRIX PARALLAX_MAPPING SHADOW_MAPPING TEXTURE_MAPPING TRANSFORM UNIFORM_VERTEX_DEPTH");