diff --git a/code/nel/include/nel/3d/program.h b/code/nel/include/nel/3d/program.h index 39db1b083..c431e6869 100644 --- a/code/nel/include/nel/3d/program.h +++ b/code/nel/include/nel/3d/program.h @@ -145,6 +145,8 @@ struct CProgramIndex TexMatrix2, TexMatrix3, + SelfIllumination, + Light0DirOrPos, Light1DirOrPos, Light2DirOrPos, diff --git a/code/nel/src/3d/driver/opengl3/driver_glsl_shader_generator.cpp b/code/nel/src/3d/driver/opengl3/driver_glsl_shader_generator.cpp index 63df018f4..7d0f7fe0a 100644 --- a/code/nel/src/3d/driver/opengl3/driver_glsl_shader_generator.cpp +++ b/code/nel/src/3d/driver/opengl3/driver_glsl_shader_generator.cpp @@ -81,15 +81,16 @@ namespace NL3D } ss << std::endl; - /*if (desc->lightingEnabled()) // LIGHTING DEBUG +#if 0 // LIGHTING DEBUG + if (desc->lightingEnabled()) { generateInvalidPS(); } else { generateNormalPS(); - }*/ - + } +#else switch(material->getShader()) { case CMaterial::Normal: @@ -118,6 +119,7 @@ namespace NL3D generateCloudPS(); break; } +#endif ps.assign(ss.str()); } @@ -521,7 +523,7 @@ namespace NL3D if (desc->lightingEnabled()) addLightsFS(); - ss << "fragColor = fragColor + vec4(0.0, 0.25, 0.0, 0.0);" << std::endl; + //ss << "fragColor = fragColor + vec4(0.0, 0.25, 0.0, 0.0);" << std::endl; /*if (desc->fogEnabled()) addFog(); diff --git a/code/nel/src/3d/driver/opengl3/driver_opengl.h b/code/nel/src/3d/driver/opengl3/driver_opengl.h index eae73e208..39d44f943 100644 --- a/code/nel/src/3d/driver/opengl3/driver_opengl.h +++ b/code/nel/src/3d/driver/opengl3/driver_opengl.h @@ -61,6 +61,7 @@ #include "driver_opengl_states.h" #include "driver_opengl_extension.h" #include "driver_opengl_shader_cache.h" +#include "driver_opengl_program.h" #ifdef NL_OS_WINDOWS @@ -276,20 +277,6 @@ public: void setupIndexBuffer(CIndexBuffer &vb); }; -/// Builtin vertex program description -struct CVPBuiltin -{ - uint16 VertexFormat; - bool Lighting; - sint LightMode[NL_OPENGL3_MAX_LIGHT]; // -1 when disabled - bool Fog; - bool VertexColorLighted; - - CVertexProgram *VertexProgram; -}; - -bool operator<(const CVPBuiltin &left, const CVPBuiltin &right); - class CGLSLShaderGenerator; class CUsrShaderManager; diff --git a/code/nel/src/3d/driver/opengl3/driver_opengl_program.cpp b/code/nel/src/3d/driver/opengl3/driver_opengl_program.cpp index d66449a0a..f097054db 100644 --- a/code/nel/src/3d/driver/opengl3/driver_opengl_program.cpp +++ b/code/nel/src/3d/driver/opengl3/driver_opengl_program.cpp @@ -132,6 +132,15 @@ bool CDriverGL3::compileVertexProgram(CVertexProgram *program) } return false; } + else // debug + { + std::vector lines; + NLMISC::explode(std::string(src->SourcePtr), std::string("\n"), lines); + for (std::vector::size_type i = 0; i < lines.size(); ++i) + { + nldebug("GL3: %i: %s", i, lines[i].c_str()); + } + } GLenum error = glGetError(); @@ -962,22 +971,26 @@ void CDriverGL3::setupUniforms(TProgram program) int diffuseIndex = p->getUniformIndex(CProgramIndex::DiffuseColor); if (diffuseIndex != -1) { - GLfloat glCol[ 4 ]; + /*GLfloat glCol[ 4 ]; CRGBA col = mat.getDiffuse(); glCol[ 0 ] = col.R / 255.0f; glCol[ 1 ] = col.G / 255.0f; glCol[ 2 ] = col.B / 255.0f; - glCol[ 3 ] = col.A / 255.0f; + glCol[ 3 ] = col.A / 255.0f;*/ - setUniform4f(program, diffuseIndex, glCol[ 0 ], glCol[ 1 ], glCol[ 2 ], glCol[ 3 ]); + setUniform4f(program, diffuseIndex, 1.0f, 1.0f, 1.0f, 0.0f); } + NLMISC::CRGBAF selfIllumination = NLMISC::CRGBAF(0.0f, 0.0f, 0.0f); + NLMISC::CRGBAF matDiffuse = NLMISC::CRGBAF(mat.getDiffuse()); + NLMISC::CRGBAF matSpecular = NLMISC::CRGBAF(mat.getSpecular()); - int maxLights = std::min(int(MaxLight), int(NL_OPENGL3_MAX_LIGHT)); - for (int i = 0; i < maxLights; i++) + for (int i = 0; i < NL_OPENGL3_MAX_LIGHT; ++i) { if (!_UserLightEnable[ i ]) continue; + + selfIllumination += NLMISC::CRGBAF(_UserLight[i].getAmbiant()); ////////////////// Temporary insanity /////////////////////////////// if ((_LightMode[ i ] != CLight::DirectionalLight) && (_LightMode[ i ] != CLight::PointLight)) @@ -1010,25 +1023,15 @@ void CDriverGL3::setupUniforms(TProgram program) int ldc = p->getUniformIndex(CProgramIndex::TName(CProgramIndex::Light0ColDiff + i)); if (ldc != -1) { - GLfloat glCol[ 4 ]; - CRGBA col = _UserLight[ i ].getDiffuse(); - glCol[ 0 ] = col.R / 255.0f; - glCol[ 1 ] = col.G / 255.0f; - glCol[ 2 ] = col.B / 255.0f; - glCol[ 3 ] = col.A / 255.0f; - setUniform4f(program, ldc, glCol[ 0 ], glCol[ 1 ], glCol[ 2 ], glCol[ 3 ]); + NLMISC::CRGBAF diffuse = NLMISC::CRGBAF(_UserLight[i].getDiffuse()) * matDiffuse; + setUniform4f(program, ldc, diffuse.R, diffuse.G, diffuse.B, 0.0f); // 1.0f? } int lsc = p->getUniformIndex(CProgramIndex::TName(CProgramIndex::Light0ColSpec + i)); if (lsc != -1) { - GLfloat glCol[ 4 ]; - CRGBA col = _UserLight[ i ].getSpecular(); - glCol[ 0 ] = col.R / 255.0f; - glCol[ 1 ] = col.G / 255.0f; - glCol[ 2 ] = col.B / 255.0f; - glCol[ 3 ] = col.A / 255.0f; - setUniform4f(program, lsc, glCol[ 0 ], glCol[ 1 ], glCol[ 2 ], glCol[ 3 ]); + NLMISC::CRGBAF specular = NLMISC::CRGBAF(_UserLight[i].getSpecular()) * matSpecular; + setUniform4f(program, lsc, specular.R, specular.G, specular.B, 0.0f); // 1.0f? } int shl = p->getUniformIndex(CProgramIndex::TName(CProgramIndex::Light0Shininess + i)); @@ -1037,7 +1040,7 @@ void CDriverGL3::setupUniforms(TProgram program) setUniform1f(program, shl, mat.getShininess()); } - int lac = p->getUniformIndex(CProgramIndex::TName(CProgramIndex::Light0ColAmb + i)); + /*int lac = p->getUniformIndex(CProgramIndex::TName(CProgramIndex::Light0ColAmb + i)); if (lac != -1) { GLfloat glCol[ 4 ]; @@ -1052,7 +1055,7 @@ void CDriverGL3::setupUniforms(TProgram program) glCol[ 2 ] = col.B / 255.0f; glCol[ 3 ] = col.A / 255.0f; setUniform4f(program, lac, glCol[ 0 ], glCol[ 1 ], glCol[ 2 ], glCol[ 3 ]); - } + }*/ int lca = p->getUniformIndex(CProgramIndex::TName(CProgramIndex::Light0ConstAttn + i)); if (lca != -1) @@ -1073,11 +1076,18 @@ void CDriverGL3::setupUniforms(TProgram program) } } + selfIllumination *= NLMISC::CRGBAF(mat.getAmbient()); + if (mat.getShader() != CMaterial::LightMap) // Really? + selfIllumination += NLMISC::CRGBAF(mat.getEmissive()); + int selfIlluminationId = p->getUniformIndex(CProgramIndex::TName(CProgramIndex::SelfIllumination)); + if (selfIlluminationId != -1) + { + setUniform4f(program, selfIlluminationId, selfIllumination.R, selfIllumination.G, selfIllumination.B, 0.0f); + } // Lightmaps have special constants if (mat.getShader() != CMaterial::LightMap) { - for (int i = 0; i < IDRV_MAT_MAXTEXTURES; i++) { int cl = p->getUniformIndex(CProgramIndex::TName(CProgramIndex::Constant0 + i)); @@ -1093,7 +1103,6 @@ void CDriverGL3::setupUniforms(TProgram program) setUniform4f(program, cl, glCol[ 0 ], glCol[ 1 ], glCol[ 2 ], glCol[ 3 ]); } } - } } diff --git a/code/nel/src/3d/driver/opengl3/driver_opengl_program.h b/code/nel/src/3d/driver/opengl3/driver_opengl_program.h index 5c69bf391..3ef44ca38 100644 --- a/code/nel/src/3d/driver/opengl3/driver_opengl_program.h +++ b/code/nel/src/3d/driver/opengl3/driver_opengl_program.h @@ -25,6 +25,21 @@ namespace NL3D { namespace NLDRIVERGL3 { #endif +/// Builtin vertex program description +struct CVPBuiltin +{ + uint16 VertexFormat; + bool Lighting; + sint LightMode[NL_OPENGL3_MAX_LIGHT]; // -1 when disabled + bool Specular; // Reflection + bool Fog; + // bool VertexColorLighted; + + CVertexProgram *VertexProgram; +}; + +bool operator<(const CVPBuiltin &left, const CVPBuiltin &right); + enum TAttribOffset { Position, diff --git a/code/nel/src/3d/driver/opengl3/driver_opengl_vertex_program.cpp b/code/nel/src/3d/driver/opengl3/driver_opengl_vertex_program.cpp index 6222ef922..b151a05e5 100644 --- a/code/nel/src/3d/driver/opengl3/driver_opengl_vertex_program.cpp +++ b/code/nel/src/3d/driver/opengl3/driver_opengl_vertex_program.cpp @@ -42,10 +42,12 @@ bool operator<(const CVPBuiltin &left, const CVPBuiltin &right) for (sint i = 0; i < NL_OPENGL3_MAX_LIGHT; ++i) if (left.LightMode[i] != right.LightMode[i]) return left.LightMode[i] < right.LightMode[i]; + if (left.Specular != right.Specular) + return right.Specular; if (left.Fog != right.Fog) return right.Fog; - if (left.VertexColorLighted != right.VertexColorLighted) - return right.VertexColorLighted; +// if (left.VertexColorLighted != right.VertexColorLighted) +// return right.VertexColorLighted; return false; } @@ -59,14 +61,14 @@ namespace case CLight::DirectionalLight: ss << "uniform vec3 light" << i << "DirOrPos;" << std::endl; ss << "uniform vec4 light" << i << "ColDiff;" << std::endl; - ss << "uniform vec4 light" << i << "ColAmb;" << std::endl; + //ss << "uniform vec4 light" << i << "ColAmb;" << std::endl; ss << "uniform vec4 light" << i << "ColSpec;" << std::endl; ss << "uniform float light" << i << "Shininess;" << std::endl; break; case CLight::PointLight: ss << "uniform vec3 light" << i << "DirOrPos;" << std::endl; ss << "uniform vec4 light" << i << "ColDiff;" << std::endl; - ss << "uniform vec4 light" << i << "ColAmb;" << std::endl; + //ss << "uniform vec4 light" << i << "ColAmb;" << std::endl; ss << "uniform vec4 light" << i << "ColSpec;" << std::endl; ss << "uniform float light" << i << "Shininess;" << std::endl; ss << "uniform float light" << i << "ConstAttn;" << std::endl; @@ -108,18 +110,10 @@ namespace ss << "normal3 = normalMatrix * normal3;" << std::endl; ss << "normal3 = normalize(normal3);" << std::endl; - //if (desc->useTextures() || (material->getShader() == CMaterial::LightMap)) - //{ - ss << "vec4 lc = getIntensity" << i << "(normal3, lightDir) * light" << i << "ColDiff + "; - ss << "getSpecIntensity" << i << "(normal3, lightDir) * light" << i << "ColSpec + "; - ss << "light" << i << "ColAmb;" << std::endl; - //} // FIXME: Ambient color is not correctly implemented - /*else - { - ss << "vec4 lc = getIntensity" << num << "(normal3, lightDir) * light" << num << "ColDiff * diffuseColor + "; - ss << "getSpecIntensity" << num << "(normal3, lightDir) * light" << num << "ColSpec * specularColor + "; - ss << "light" << num << "ColAmb * ambientColor;" << std::endl; - }*/ + ss << "vec4 lc = getIntensity" << i << "(normal3, lightDir) * light" << i << "ColDiff + "; + ss << "getSpecIntensity" << i << "(normal3, lightDir) * light" << i << "ColSpec;" << std::endl; + + // ss << "return vec4(0.0, 0.0, 0.0, 0.0);" << std::endl; // DISABLE DIR LIGHT ss << "return lc;" << std::endl; ss << "}" << std::endl; @@ -156,26 +150,19 @@ namespace ss << "float attenuation = light" << i << "ConstAttn + "; ss << "light" << i << "LinAttn * lightDistance +"; ss << "light" << i << "QuadAttn * lightDistance * lightDistance;" << std::endl; - + // ss << "attenuation = max(attenuation, 1.0);" << std::endl; // TEST + ss << "vec3 normal3 = vnormal.xyz / vnormal.w;" << std::endl; ss << "normal3 = normalMatrix * normal3;" << std::endl; ss << "normal3 = normalize(normal3);" << std::endl; - /*if (desc->useTextures() || (material->getShader() == CMaterial::LightMap)) - {*/ - ss << "vec4 lc = getIntensity" << i << "(normal3, lightDirection) * light" << i << "ColDiff + "; - ss << "getSpecIntensity" << i << "(normal3, lightDirection) * light" << i << "ColSpec + "; - ss << "light" << i << "ColAmb;" << std::endl; - // FIXME: Ambient stuff - /*} - else - { - ss << "vec4 lc = getIntensity" << num << "(normal3, lightDirection) * light" << num << "ColDiff * diffuseColor+ "; - ss << "getSpecIntensity" << num << "(normal3, lightDirection) * light" << num << "ColSpec * specularColor + "; - ss << "light" << num << "ColAmb * ambientColor;" << std::endl; - }*/ + ss << "vec4 lc = getIntensity" << i << "(normal3, lightDirection) * light" << i << "ColDiff + "; + ss << "getSpecIntensity" << i << "(normal3, lightDirection) * light" << i << "ColSpec;" << std::endl; ss << "lc = lc / attenuation;" << std::endl; + + // ss << "return vec4(0.0, 0.0, 0.0, 0.0);" << std::endl; // DISABLE POINT LIGHT + ss << "return lc;" << std::endl; ss << "}" << std::endl; ss << std::endl; @@ -214,9 +201,12 @@ namespace ss << std::endl; // if (!useTextures) { - ss << "uniform vec4 ambientColor;" << std::endl; // FIXME: ambient color of all lights is precalculated and added with self illumination! - ss << "uniform vec4 diffuseColor;" << std::endl; - ss << "uniform vec4 specularColor;" << std::endl; // } + + // Ambient color of all lights is precalculated and added with self illumination, and multiplied with the material ambient. + if (desc.Lighting) + ss << "uniform vec4 selfIllumination;" << std::endl; + // ss << "uniform vec4 diffuseColor;" << std::endl; + // ss << "uniform vec4 specularColor;" << std::endl; // } if (desc.Fog || desc.Lighting) ss << "uniform mat4 modelView;" << std::endl; @@ -256,6 +246,9 @@ namespace for (int i = 0; i < NL_OPENGL3_MAX_LIGHT; i++) if (desc.LightMode[i] == CLight::DirectionalLight || desc.LightMode[i] == CLight::PointLight) ss << "lightColor = lightColor + getLight" << i << "Color();" << std::endl; + ss << "lightColor = lightColor + selfIllumination;" << std::endl; + //ss << "lightColor = selfIllumination;" << std::endl; // DEBUG + ss << "lightColor.a = 1.0;" << std::endl; // ... } for (int i = Weight; i < NumOffsets; i++) diff --git a/code/nel/src/3d/program.cpp b/code/nel/src/3d/program.cpp index c080e7489..02689b634 100644 --- a/code/nel/src/3d/program.cpp +++ b/code/nel/src/3d/program.cpp @@ -114,6 +114,8 @@ const char *CProgramIndex::Names[NUM_UNIFORMS] = "texMatrix1", "texMatrix2", "texMatrix3", + + "selfIllumination", "light0DirOrPos", "light1DirOrPos",