From 30ef435607fed0467c00ed32ef95af27a014b586 Mon Sep 17 00:00:00 2001 From: rdb Date: Thu, 19 Sep 2013 19:49:03 +0000 Subject: [PATCH] Fix p3d_ModelViewMatrix and p3d_ProjectionMatrix and variants. Also add p3d_NormalMatrix. --- panda/src/glstuff/glShaderContext_src.cxx | 38 ++++++++++++++++++----- 1 file changed, 30 insertions(+), 8 deletions(-) diff --git a/panda/src/glstuff/glShaderContext_src.cxx b/panda/src/glstuff/glShaderContext_src.cxx index f7d8a99e1f..225b5cbd73 100755 --- a/panda/src/glstuff/glShaderContext_src.cxx +++ b/panda/src/glstuff/glShaderContext_src.cxx @@ -352,26 +352,48 @@ CLP(ShaderContext)(Shader *s, GSG *gsg) : ShaderContext(s) { bind._dep[1] = Shader::SSD_general | Shader::SSD_transform; } else if (matrix_name == "ModelViewMatrix") { - bind._func = Shader::SMF_first; + bind._func = Shader::SMF_compose; if (inverse) { - bind._part[0] = Shader::SMO_view_to_model; + bind._part[0] = Shader::SMO_apiview_to_view; + bind._part[1] = Shader::SMO_view_to_model; } else { bind._part[0] = Shader::SMO_model_to_view; + bind._part[1] = Shader::SMO_view_to_apiview; } - bind._part[1] = Shader::SMO_identity; bind._dep[0] = Shader::SSD_general | Shader::SSD_transform; - bind._dep[1] = Shader::SSD_NONE; + bind._dep[1] = Shader::SSD_general | Shader::SSD_transform; } else if (matrix_name == "ProjectionMatrix") { - bind._func = Shader::SMF_first; + bind._func = Shader::SMF_compose; if (inverse) { bind._part[0] = Shader::SMO_apiclip_to_view; + bind._part[1] = Shader::SMO_view_to_apiview; } else { - bind._part[0] = Shader::SMO_view_to_apiclip; + bind._part[0] = Shader::SMO_apiview_to_view; + bind._part[1] = Shader::SMO_view_to_apiclip; } - bind._part[1] = Shader::SMO_identity; bind._dep[0] = Shader::SSD_general | Shader::SSD_transform; - bind._dep[1] = Shader::SSD_NONE; + bind._dep[1] = Shader::SSD_general | Shader::SSD_transform; + + } else if (matrix_name == "NormalMatrix") { + // This is really the upper 3x3 of the ModelViewMatrixInverseTranspose. + bind._func = Shader::SMF_compose; + if (inverse) { + bind._part[0] = Shader::SMO_model_to_view; + bind._part[1] = Shader::SMO_view_to_apiview; + } else { + bind._part[0] = Shader::SMO_apiview_to_view; + bind._part[1] = Shader::SMO_view_to_model; + } + bind._dep[0] = Shader::SSD_general | Shader::SSD_transform; + bind._dep[1] = Shader::SSD_general | Shader::SSD_transform; + + if (transpose) { + bind._piece = Shader::SMP_whole; + } else { + bind._piece = Shader::SMP_transpose; + } + } else { GLCAT.error() << "Unrecognized uniform matrix name '" << matrix_name << "'!\n"; continue;