1
0
Fork 1
mirror of https://github.com/TES3MP/openmw-tes3mp.git synced 2025-03-30 10:36:42 +00:00

Convert colorMode shader define to a uniform

This commit is contained in:
AnyOldName3 2018-10-15 23:12:15 +01:00
parent 0124be5713
commit ce15369bbd
4 changed files with 47 additions and 42 deletions

View file

@ -23,8 +23,6 @@ namespace Shader
ShaderVisitor::ShaderRequirements::ShaderRequirements() ShaderVisitor::ShaderRequirements::ShaderRequirements()
: mShaderRequired(false) : mShaderRequired(false)
, mColorMaterial(false)
, mVertexColorMode(GL_AMBIENT_AND_DIFFUSE)
, mMaterialOverridden(false) , mMaterialOverridden(false)
, mNormalHeight(false) , mNormalHeight(false)
, mTexStageRequiringTangents(-1) , mTexStageRequiringTangents(-1)
@ -230,8 +228,29 @@ namespace Shader
mRequirements.back().mMaterialOverridden = true; mRequirements.back().mMaterialOverridden = true;
const osg::Material* mat = static_cast<const osg::Material*>(it->second.first.get()); const osg::Material* mat = static_cast<const osg::Material*>(it->second.first.get());
mRequirements.back().mColorMaterial = (mat->getColorMode() != osg::Material::OFF);
mRequirements.back().mVertexColorMode = mat->getColorMode(); if (!writableStateSet)
writableStateSet = getWritableStateSet(node);
int colorMode;
switch (mat->getColorMode())
{
case osg::Material::OFF:
colorMode = 0;
break;
case GL_AMBIENT:
colorMode = 3;
break;
default:
case GL_AMBIENT_AND_DIFFUSE:
colorMode = 2;
break;
case GL_EMISSION:
colorMode = 1;
break;
}
writableStateSet->addUniform(new osg::Uniform("colorMode", colorMode));
} }
} }
} }
@ -272,25 +291,6 @@ namespace Shader
defineMap[texIt->second + std::string("UV")] = std::to_string(texIt->first); defineMap[texIt->second + std::string("UV")] = std::to_string(texIt->first);
} }
if (!reqs.mColorMaterial)
defineMap["colorMode"] = "0";
else
{
switch (reqs.mVertexColorMode)
{
case GL_AMBIENT:
defineMap["colorMode"] = "3";
break;
default:
case GL_AMBIENT_AND_DIFFUSE:
defineMap["colorMode"] = "2";
break;
case GL_EMISSION:
defineMap["colorMode"] = "1";
break;
}
}
defineMap["forcePPL"] = mForcePerPixelLighting ? "1" : "0"; defineMap["forcePPL"] = mForcePerPixelLighting ? "1" : "0";
defineMap["clamp"] = mClampLighting ? "1" : "0"; defineMap["clamp"] = mClampLighting ? "1" : "0";

View file

@ -81,9 +81,6 @@ namespace Shader
bool mShaderRequired; bool mShaderRequired;
bool mColorMaterial;
// osg::Material::ColorMode
int mVertexColorMode;
bool mMaterialOverridden; bool mMaterialOverridden;
bool mNormalHeight; // true if normal map has height info in alpha channel bool mNormalHeight; // true if normal map has height info in alpha channel

View file

@ -218,7 +218,6 @@ namespace Terrain
defineMap["clamp"] = clampLighting ? "1" : "0"; defineMap["clamp"] = clampLighting ? "1" : "0";
defineMap["normalMap"] = (it->mNormalMap) ? "1" : "0"; defineMap["normalMap"] = (it->mNormalMap) ? "1" : "0";
defineMap["blendMap"] = !firstLayer ? "1" : "0"; defineMap["blendMap"] = !firstLayer ? "1" : "0";
defineMap["colorMode"] = "2";
defineMap["specularMap"] = it->mSpecular ? "1" : "0"; defineMap["specularMap"] = it->mSpecular ? "1" : "0";
defineMap["parallax"] = (it->mNormalMap && it->mParallax) ? "1" : "0"; defineMap["parallax"] = (it->mNormalMap && it->mParallax) ? "1" : "0";
@ -231,6 +230,7 @@ namespace Terrain
} }
stateset->setAttributeAndModes(shaderManager->getProgram(vertexShader, fragmentShader)); stateset->setAttributeAndModes(shaderManager->getProgram(vertexShader, fragmentShader));
stateset->addUniform(new osg::Uniform("colorMode", 2));
} }
else else
{ {

View file

@ -1,5 +1,7 @@
#define MAX_LIGHTS 8 #define MAX_LIGHTS 8
uniform int colorMode;
void perLight(out vec3 ambientOut, out vec3 diffuseOut, int lightIndex, vec3 viewPos, vec3 viewNormal, vec4 diffuse, vec3 ambient) void perLight(out vec3 ambientOut, out vec3 diffuseOut, int lightIndex, vec3 viewPos, vec3 viewNormal, vec4 diffuse, vec3 ambient)
{ {
vec3 lightDir; vec3 lightDir;
@ -20,16 +22,23 @@ vec4 doLighting(vec3 viewPos, vec3 viewNormal, vec4 vertexColor, float shadowing
vec4 doLighting(vec3 viewPos, vec3 viewNormal, vec4 vertexColor, out vec3 shadowDiffuse) vec4 doLighting(vec3 viewPos, vec3 viewNormal, vec4 vertexColor, out vec3 shadowDiffuse)
#endif #endif
{ {
#if @colorMode == 3 vec4 diffuse;
vec4 diffuse = gl_FrontMaterial.diffuse; vec3 ambient;
vec3 ambient = vertexColor.xyz; if (colorMode == 3)
#elif @colorMode == 2 {
vec4 diffuse = vertexColor; diffuse = gl_FrontMaterial.diffuse;
vec3 ambient = vertexColor.xyz; ambient - vertexColor.xyz;
#else }
vec4 diffuse = gl_FrontMaterial.diffuse; else if (colorMode == 2)
vec3 ambient = gl_FrontMaterial.ambient.xyz; {
#endif diffuse = vertexColor;
ambient = vertexColor.xyz;
}
else
{
diffuse = gl_FrontMaterial.diffuse;
ambient = gl_FrontMaterial.ambient.xyz;
}
vec4 lightResult = vec4(0.0, 0.0, 0.0, diffuse.a); vec4 lightResult = vec4(0.0, 0.0, 0.0, diffuse.a);
vec3 diffuseLight, ambientLight; vec3 diffuseLight, ambientLight;
@ -48,11 +57,10 @@ vec4 doLighting(vec3 viewPos, vec3 viewNormal, vec4 vertexColor, out vec3 shadow
lightResult.xyz += gl_LightModel.ambient.xyz * ambient; lightResult.xyz += gl_LightModel.ambient.xyz * ambient;
#if @colorMode == 1 if (colorMode == 1)
lightResult.xyz += vertexColor.xyz; lightResult.xyz += vertexColor.xyz;
#else else
lightResult.xyz += gl_FrontMaterial.emission.xyz; lightResult.xyz += gl_FrontMaterial.emission.xyz;
#endif
#if @clamp #if @clamp
lightResult = clamp(lightResult, vec4(0.0, 0.0, 0.0, 0.0), vec4(1.0, 1.0, 1.0, 1.0)); lightResult = clamp(lightResult, vec4(0.0, 0.0, 0.0, 0.0), vec4(1.0, 1.0, 1.0, 1.0));