From 12beef7fec0a8e958c77a82a11b5322696917be4 Mon Sep 17 00:00:00 2001 From: Andrzej Kapolka Date: Thu, 29 May 2014 17:08:36 -0700 Subject: [PATCH] Apply the new shadow distances to the models, too. --- interface/src/renderer/Model.cpp | 32 +++++++++++++++++++++----------- interface/src/renderer/Model.h | 6 ++++++ 2 files changed, 27 insertions(+), 11 deletions(-) diff --git a/interface/src/renderer/Model.cpp b/interface/src/renderer/Model.cpp index a550064ef1..85392bd353 100644 --- a/interface/src/renderer/Model.cpp +++ b/interface/src/renderer/Model.cpp @@ -96,6 +96,11 @@ int Model::_shadowNormalSpecularMapTangentLocation; int Model::_cascadedShadowNormalMapTangentLocation; int Model::_cascadedShadowNormalSpecularMapTangentLocation; +int Model::_cascadedShadowMapDistancesLocation; +int Model::_cascadedShadowNormalMapDistancesLocation; +int Model::_cascadedShadowSpecularMapDistancesLocation; +int Model::_cascadedShadowNormalSpecularMapDistancesLocation; + Model::SkinLocations Model::_skinLocations; Model::SkinLocations Model::_skinNormalMapLocations; Model::SkinLocations Model::_skinSpecularMapLocations; @@ -144,12 +149,11 @@ void Model::initSkinProgram(ProgramObject& program, Model::SkinLocations& locati locations.clusterIndices = program.attributeLocation("clusterIndices"); locations.clusterWeights = program.attributeLocation("clusterWeights"); locations.tangent = program.attributeLocation("tangent"); + locations.shadowDistances = program.uniformLocation("shadowDistances"); program.setUniformValue("diffuseMap", 0); program.setUniformValue("normalMap", 1); program.setUniformValue("specularMap", specularTextureUnit); program.setUniformValue("shadowMap", shadowTextureUnit); - program.setUniformValue("shadowDistances", -SHADOW_MATRIX_DISTANCES[1], - -SHADOW_MATRIX_DISTANCES[2], -SHADOW_MATRIX_DISTANCES[3]); program.release(); } @@ -310,8 +314,7 @@ void Model::init() { _cascadedShadowMapProgram.bind(); _cascadedShadowMapProgram.setUniformValue("diffuseMap", 0); _cascadedShadowMapProgram.setUniformValue("shadowMap", 1); - _cascadedShadowMapProgram.setUniformValue("shadowDistances", -SHADOW_MATRIX_DISTANCES[1], - -SHADOW_MATRIX_DISTANCES[2], -SHADOW_MATRIX_DISTANCES[3]); + _cascadedShadowMapDistancesLocation = _cascadedShadowMapProgram.uniformLocation("shadowDistances"); _cascadedShadowMapProgram.release(); _cascadedShadowNormalMapProgram.addShaderFromSourceFile(QGLShader::Vertex, @@ -324,8 +327,7 @@ void Model::init() { _cascadedShadowNormalMapProgram.setUniformValue("diffuseMap", 0); _cascadedShadowNormalMapProgram.setUniformValue("normalMap", 1); _cascadedShadowNormalMapProgram.setUniformValue("shadowMap", 2); - _cascadedShadowNormalMapProgram.setUniformValue("shadowDistances", -SHADOW_MATRIX_DISTANCES[1], - -SHADOW_MATRIX_DISTANCES[2], -SHADOW_MATRIX_DISTANCES[3]); + _cascadedShadowNormalMapDistancesLocation = _cascadedShadowNormalMapProgram.uniformLocation("shadowDistances"); _cascadedShadowNormalMapTangentLocation = _cascadedShadowNormalMapProgram.attributeLocation("tangent"); _cascadedShadowNormalMapProgram.release(); @@ -339,8 +341,7 @@ void Model::init() { _cascadedShadowSpecularMapProgram.setUniformValue("diffuseMap", 0); _cascadedShadowSpecularMapProgram.setUniformValue("specularMap", 1); _cascadedShadowSpecularMapProgram.setUniformValue("shadowMap", 2); - _cascadedShadowSpecularMapProgram.setUniformValue("shadowDistances", -SHADOW_MATRIX_DISTANCES[1], - -SHADOW_MATRIX_DISTANCES[2], -SHADOW_MATRIX_DISTANCES[3]); + _cascadedShadowSpecularMapDistancesLocation = _cascadedShadowSpecularMapProgram.uniformLocation("shadowDistances"); _cascadedShadowSpecularMapProgram.release(); _cascadedShadowNormalSpecularMapProgram.addShaderFromSourceFile(QGLShader::Vertex, @@ -354,8 +355,8 @@ void Model::init() { _cascadedShadowNormalSpecularMapProgram.setUniformValue("normalMap", 1); _cascadedShadowNormalSpecularMapProgram.setUniformValue("specularMap", 2); _cascadedShadowNormalSpecularMapProgram.setUniformValue("shadowMap", 3); - _cascadedShadowNormalSpecularMapProgram.setUniformValue("shadowDistances", -SHADOW_MATRIX_DISTANCES[1], - -SHADOW_MATRIX_DISTANCES[2], -SHADOW_MATRIX_DISTANCES[3]); + _cascadedShadowNormalSpecularMapDistancesLocation = + _cascadedShadowNormalSpecularMapProgram.uniformLocation("shadowDistances"); _cascadedShadowNormalSpecularMapTangentLocation = _cascadedShadowNormalSpecularMapProgram.attributeLocation("tangent"); _cascadedShadowNormalSpecularMapProgram.release(); @@ -1641,6 +1642,7 @@ void Model::renderMeshes(float alpha, RenderMode mode, bool translucent, bool re ProgramObject* skinProgram = &_skinProgram; SkinLocations* skinLocations = &_skinLocations; int tangentLocation = _normalMapTangentLocation; + int shadowDistancesLocation = _cascadedShadowMapDistancesLocation; GLenum specularTextureUnit = 0; GLenum shadowTextureUnit = 0; if (mode == SHADOW_RENDER_MODE) { @@ -1656,6 +1658,7 @@ void Model::renderMeshes(float alpha, RenderMode mode, bool translucent, bool re skinProgram = &_skinCascadedShadowNormalSpecularMapProgram; skinLocations = &_skinCascadedShadowNormalSpecularMapLocations; tangentLocation = _cascadedShadowNormalSpecularMapTangentLocation; + shadowDistancesLocation = _cascadedShadowNormalSpecularMapDistancesLocation; } else { program = &_shadowNormalSpecularMapProgram; skinProgram = &_skinShadowNormalSpecularMapProgram; @@ -1677,6 +1680,7 @@ void Model::renderMeshes(float alpha, RenderMode mode, bool translucent, bool re skinProgram = &_skinCascadedShadowNormalMapProgram; skinLocations = &_skinCascadedShadowNormalMapLocations; tangentLocation = _cascadedShadowNormalMapTangentLocation; + shadowDistancesLocation = _cascadedShadowNormalMapDistancesLocation; } else { program = &_shadowNormalMapProgram; skinProgram = &_skinShadowNormalMapProgram; @@ -1695,6 +1699,7 @@ void Model::renderMeshes(float alpha, RenderMode mode, bool translucent, bool re program = &_cascadedShadowSpecularMapProgram; skinProgram = &_skinCascadedShadowSpecularMapProgram; skinLocations = &_skinCascadedShadowSpecularMapLocations; + shadowDistancesLocation = _cascadedShadowSpecularMapDistancesLocation; } else { program = &_shadowSpecularMapProgram; skinProgram = &_skinShadowSpecularMapProgram; @@ -1740,10 +1745,15 @@ void Model::renderMeshes(float alpha, RenderMode mode, bool translucent, bool re skinProgram->enableAttributeArray(skinLocations->clusterWeights); activeProgram = skinProgram; tangentLocation = skinLocations->tangent; - + if (cascadedShadows) { + program->setUniform(skinLocations->shadowDistances, Application::getInstance()->getShadowDistances()); + } } else { glMultMatrixf((const GLfloat*)&state.clusterMatrices[0]); program->bind(); + if (cascadedShadows) { + program->setUniform(shadowDistancesLocation, Application::getInstance()->getShadowDistances()); + } } if (mesh.blendshapes.isEmpty()) { diff --git a/interface/src/renderer/Model.h b/interface/src/renderer/Model.h index 5561855afb..5aa2c2160b 100644 --- a/interface/src/renderer/Model.h +++ b/interface/src/renderer/Model.h @@ -311,12 +311,18 @@ private: static int _cascadedShadowNormalMapTangentLocation; static int _cascadedShadowNormalSpecularMapTangentLocation; + static int _cascadedShadowMapDistancesLocation; + static int _cascadedShadowNormalMapDistancesLocation; + static int _cascadedShadowSpecularMapDistancesLocation; + static int _cascadedShadowNormalSpecularMapDistancesLocation; + class SkinLocations { public: int clusterMatrices; int clusterIndices; int clusterWeights; int tangent; + int shadowDistances; }; static SkinLocations _skinLocations;