diff --git a/panda/src/glstuff/glGraphicsStateGuardian_src.cxx b/panda/src/glstuff/glGraphicsStateGuardian_src.cxx index e831b13915..62c25d5795 100644 --- a/panda/src/glstuff/glGraphicsStateGuardian_src.cxx +++ b/panda/src/glstuff/glGraphicsStateGuardian_src.cxx @@ -1373,6 +1373,10 @@ reset() { get_extension_func("glUniformMatrix4fv"); _glValidateProgram = (PFNGLVALIDATEPROGRAMPROC) get_extension_func("glValidateProgram"); + _glVertexAttrib4fv = (PFNGLVERTEXATTRIB4FVPROC) + get_extension_func("glVertexAttrib4fv"); + _glVertexAttrib4dv = (PFNGLVERTEXATTRIB4DVPROC) + get_extension_func("glVertexAttrib4dv"); _glVertexAttribPointer = (PFNGLVERTEXATTRIBPOINTERPROC) get_extension_func("glVertexAttribPointer"); @@ -1438,6 +1442,8 @@ reset() { _glUniformMatrix3fv = glUniformMatrix3fv; _glUniformMatrix4fv = glUniformMatrix4fv; _glValidateProgram = glValidateProgram; + _glVertexAttrib4fv = glVertexAttrib4fv; + _glVertexAttrib4dv = NULL; _glVertexAttribPointer = glVertexAttribPointer; _glVertexAttribIPointer = NULL; _glVertexAttribLPointer = NULL; diff --git a/panda/src/glstuff/glGraphicsStateGuardian_src.h b/panda/src/glstuff/glGraphicsStateGuardian_src.h index 0898dfe309..f9eaa36ccb 100644 --- a/panda/src/glstuff/glGraphicsStateGuardian_src.h +++ b/panda/src/glstuff/glGraphicsStateGuardian_src.h @@ -180,6 +180,8 @@ typedef void (APIENTRYP PFNGLUNIFORM4IVPROC) (GLint location, GLsizei count, con typedef void (APIENTRYP PFNGLUNIFORMMATRIX3FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); typedef void (APIENTRYP PFNGLUNIFORMMATRIX4FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); typedef void (APIENTRYP PFNGLVALIDATEPROGRAMPROC) (GLuint program); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4FVPROC) (GLuint index, const GLfloat *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4DVPROC) (GLuint index, const GLdouble *v); typedef void (APIENTRYP PFNGLVERTEXATTRIBPOINTERPROC) (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const GLvoid *pointer); typedef void (APIENTRYP PFNGLVERTEXATTRIBIPOINTERPROC) (GLuint index, GLint size, GLenum type, GLsizei stride, const GLvoid *pointer); typedef void (APIENTRYP PFNGLVERTEXATTRIBLPOINTERPROC) (GLuint index, GLint size, GLenum type, GLsizei stride, const GLvoid *pointer); @@ -833,6 +835,8 @@ public: PFNGLUNIFORMMATRIX3FVPROC _glUniformMatrix3fv; PFNGLUNIFORMMATRIX4FVPROC _glUniformMatrix4fv; PFNGLVALIDATEPROGRAMPROC _glValidateProgram; + PFNGLVERTEXATTRIB4FVPROC _glVertexAttrib4fv; + PFNGLVERTEXATTRIB4DVPROC _glVertexAttrib4dv; PFNGLVERTEXATTRIBPOINTERPROC _glVertexAttribPointer; PFNGLVERTEXATTRIBIPOINTERPROC _glVertexAttribIPointer; PFNGLVERTEXATTRIBLPOINTERPROC _glVertexAttribLPointer; diff --git a/panda/src/glstuff/glShaderContext_src.cxx b/panda/src/glstuff/glShaderContext_src.cxx index 87fafebb48..a6818f85de 100644 --- a/panda/src/glstuff/glShaderContext_src.cxx +++ b/panda/src/glstuff/glShaderContext_src.cxx @@ -197,6 +197,7 @@ CLP(ShaderContext)(CLP(GraphicsStateGuardian) *glgsg, Shader *s) : ShaderContext _glsl_program = 0; _uses_standard_vertex_arrays = false; _has_divisor = false; + _color_attrib_index = -1; nassertv(s->get_language() == Shader::SL_GLSL); @@ -925,7 +926,7 @@ CLP(ShaderContext)(CLP(GraphicsStateGuardian) *glgsg, Shader *s) : ShaderContext param_type == GL_UNSIGNED_INT_VEC3 || param_type == GL_UNSIGNED_INT_VEC4 || #endif - param_type == GL_UNSIGNED_INT ); + param_type == GL_UNSIGNED_INT); if (noprefix.empty()) { // Arbitrarily named attribute. @@ -940,6 +941,9 @@ CLP(ShaderContext)(CLP(GraphicsStateGuardian) *glgsg, Shader *s) : ShaderContext } else if (noprefix == "Color") { bind._name = InternalName::get_color(); + // Save the index, so we can apply special handling to this attrib. + _color_attrib_index = p; + } else if (noprefix.substr(0, 7) == "Tangent") { bind._name = InternalName::get_tangent(); if (noprefix.size() > 7) { @@ -1419,9 +1423,11 @@ update_shader_vertex_arrays(ShaderContext *prev, bool force) { } GLint p = _glsl_parameter_map[bind._id._seqno]; + // Don't apply vertex colors if they are disabled with a ColorAttrib. int num_elements, element_stride, divisor; bool normalized; - if (_glgsg->_data_reader->get_array_info(name, array_reader, + if ((p != _color_attrib_index || _glgsg->_vertex_colors_enabled) && + _glgsg->_data_reader->get_array_info(name, array_reader, num_values, numeric_type, normalized, start, stride, divisor, num_elements, element_stride)) { @@ -1463,6 +1469,14 @@ update_shader_vertex_arrays(ShaderContext *prev, bool force) { for (int i = 0; i < bind._elements; ++i) { _glgsg->_glDisableVertexAttribArray(p + i); } + if (p == _color_attrib_index) { + // Vertex colors are disabled or not present. Apply flat color. +#if defined(STDFLOAT_DOUBLE) && !defined(OPENGLES) + _glgsg->_glVertexAttrib4dv(p, _glgsg->_scene_graph_color.get_data()); +#else + _glgsg->_glVertexAttrib4fv(p, _glgsg->_scene_graph_color.get_data()); +#endif + } } } } diff --git a/panda/src/glstuff/glShaderContext_src.h b/panda/src/glstuff/glShaderContext_src.h index e2a9aadc9d..f9ca285572 100644 --- a/panda/src/glstuff/glShaderContext_src.h +++ b/panda/src/glstuff/glShaderContext_src.h @@ -65,6 +65,7 @@ private: //typedef pvector ParamContexts; //ParamContexts _params; + GLint _color_attrib_index; pvector _glsl_parameter_map; pmap _glsl_uniform_handles;