diff --git a/modules/base/rendering/renderablemodel.cpp b/modules/base/rendering/renderablemodel.cpp index 6e7ca13dd2..753a11a432 100644 --- a/modules/base/rendering/renderablemodel.cpp +++ b/modules/base/rendering/renderablemodel.cpp @@ -47,10 +47,11 @@ namespace { constexpr const char* ProgramName = "ModelProgram"; constexpr const char* KeyGeometry = "Geometry"; - constexpr const std::array UniformNames = { + constexpr const std::array UniformNames = { "opacity", "nLightSources", "lightDirectionsViewSpace", "lightIntensities", - "modelViewTransform", "projectionTransform", "performShading", "texture1", - "ambientIntensity", "diffuseIntensity", "specularIntensity" + "modelViewTransform", "crippedModelViewTransform", "projectionTransform", + "performShading", "texture1", "ambientIntensity", "diffuseIntensity", + "specularIntensity" }; constexpr openspace::properties::Property::PropertyInfo TextureInfo = { @@ -380,6 +381,16 @@ void RenderableModel::render(const RenderData& data, RendererTasks&) { _uniformCache.modelViewTransform, glm::mat4(modelViewTransform) ); + + glm::dmat4 crippedModelViewTransform = glm::transpose(glm::inverse( + glm::dmat4(glm::inverse(data.camera.sgctInternal.viewMatrix())) * modelViewTransform + )); + + _program->setUniform( + _uniformCache.crippedModelViewTransform, + glm::mat4(crippedModelViewTransform) + ); + _program->setUniform( _uniformCache.projectionTransform, data.camera.projectionMatrix() diff --git a/modules/base/rendering/renderablemodel.h b/modules/base/rendering/renderablemodel.h index 317b62d7d2..60c9499e19 100644 --- a/modules/base/rendering/renderablemodel.h +++ b/modules/base/rendering/renderablemodel.h @@ -88,8 +88,9 @@ private: ghoul::opengl::ProgramObject* _program = nullptr; UniformCache(opacity, nLightSources, lightDirectionsViewSpace, lightIntensities, - modelViewTransform, projectionTransform, performShading, texture, - ambientIntensity, diffuseIntensity, specularIntensity) _uniformCache; + modelViewTransform, crippedModelViewTransform, projectionTransform, + performShading, texture, ambientIntensity, diffuseIntensity, + specularIntensity) _uniformCache; std::unique_ptr _texture; std::vector> _lightSources; diff --git a/modules/base/shaders/model_vs.glsl b/modules/base/shaders/model_vs.glsl index 1d951f8ef5..8b55a1a7ba 100644 --- a/modules/base/shaders/model_vs.glsl +++ b/modules/base/shaders/model_vs.glsl @@ -37,7 +37,7 @@ out vec4 vs_positionCameraSpace; uniform mat4 modelViewTransform; uniform mat4 projectionTransform; - +uniform mat4 crippedModelViewTransform; void main() { vs_positionCameraSpace = modelViewTransform * in_position; @@ -48,6 +48,6 @@ void main() { vs_st = in_st; vs_screenSpaceDepth = positionScreenSpace.w; - // The normal transform should be the transposed inverse of the model transform? - vs_normalViewSpace = normalize(mat3(modelViewTransform) * in_normal); + //vs_normalViewSpace = normalize(transpose(inverse(mat3(crippedModelViewTransform))) * in_normal); + vs_normalViewSpace = normalize(mat3(crippedModelViewTransform) * in_normal); }