Change p3d_Color behavior to take ColorAttrib into account; assign white if missing

This commit is contained in:
rdb 2015-05-02 15:48:21 +02:00
parent fdc8918946
commit 90ad6f00bf
4 changed files with 27 additions and 2 deletions

View File

@ -1373,6 +1373,10 @@ reset() {
get_extension_func("glUniformMatrix4fv"); get_extension_func("glUniformMatrix4fv");
_glValidateProgram = (PFNGLVALIDATEPROGRAMPROC) _glValidateProgram = (PFNGLVALIDATEPROGRAMPROC)
get_extension_func("glValidateProgram"); get_extension_func("glValidateProgram");
_glVertexAttrib4fv = (PFNGLVERTEXATTRIB4FVPROC)
get_extension_func("glVertexAttrib4fv");
_glVertexAttrib4dv = (PFNGLVERTEXATTRIB4DVPROC)
get_extension_func("glVertexAttrib4dv");
_glVertexAttribPointer = (PFNGLVERTEXATTRIBPOINTERPROC) _glVertexAttribPointer = (PFNGLVERTEXATTRIBPOINTERPROC)
get_extension_func("glVertexAttribPointer"); get_extension_func("glVertexAttribPointer");
@ -1438,6 +1442,8 @@ reset() {
_glUniformMatrix3fv = glUniformMatrix3fv; _glUniformMatrix3fv = glUniformMatrix3fv;
_glUniformMatrix4fv = glUniformMatrix4fv; _glUniformMatrix4fv = glUniformMatrix4fv;
_glValidateProgram = glValidateProgram; _glValidateProgram = glValidateProgram;
_glVertexAttrib4fv = glVertexAttrib4fv;
_glVertexAttrib4dv = NULL;
_glVertexAttribPointer = glVertexAttribPointer; _glVertexAttribPointer = glVertexAttribPointer;
_glVertexAttribIPointer = NULL; _glVertexAttribIPointer = NULL;
_glVertexAttribLPointer = NULL; _glVertexAttribLPointer = NULL;

View File

@ -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 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 PFNGLUNIFORMMATRIX4FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
typedef void (APIENTRYP PFNGLVALIDATEPROGRAMPROC) (GLuint program); 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 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 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); typedef void (APIENTRYP PFNGLVERTEXATTRIBLPOINTERPROC) (GLuint index, GLint size, GLenum type, GLsizei stride, const GLvoid *pointer);
@ -833,6 +835,8 @@ public:
PFNGLUNIFORMMATRIX3FVPROC _glUniformMatrix3fv; PFNGLUNIFORMMATRIX3FVPROC _glUniformMatrix3fv;
PFNGLUNIFORMMATRIX4FVPROC _glUniformMatrix4fv; PFNGLUNIFORMMATRIX4FVPROC _glUniformMatrix4fv;
PFNGLVALIDATEPROGRAMPROC _glValidateProgram; PFNGLVALIDATEPROGRAMPROC _glValidateProgram;
PFNGLVERTEXATTRIB4FVPROC _glVertexAttrib4fv;
PFNGLVERTEXATTRIB4DVPROC _glVertexAttrib4dv;
PFNGLVERTEXATTRIBPOINTERPROC _glVertexAttribPointer; PFNGLVERTEXATTRIBPOINTERPROC _glVertexAttribPointer;
PFNGLVERTEXATTRIBIPOINTERPROC _glVertexAttribIPointer; PFNGLVERTEXATTRIBIPOINTERPROC _glVertexAttribIPointer;
PFNGLVERTEXATTRIBLPOINTERPROC _glVertexAttribLPointer; PFNGLVERTEXATTRIBLPOINTERPROC _glVertexAttribLPointer;

View File

@ -197,6 +197,7 @@ CLP(ShaderContext)(CLP(GraphicsStateGuardian) *glgsg, Shader *s) : ShaderContext
_glsl_program = 0; _glsl_program = 0;
_uses_standard_vertex_arrays = false; _uses_standard_vertex_arrays = false;
_has_divisor = false; _has_divisor = false;
_color_attrib_index = -1;
nassertv(s->get_language() == Shader::SL_GLSL); 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_VEC3 ||
param_type == GL_UNSIGNED_INT_VEC4 || param_type == GL_UNSIGNED_INT_VEC4 ||
#endif #endif
param_type == GL_UNSIGNED_INT ); param_type == GL_UNSIGNED_INT);
if (noprefix.empty()) { if (noprefix.empty()) {
// Arbitrarily named attribute. // Arbitrarily named attribute.
@ -940,6 +941,9 @@ CLP(ShaderContext)(CLP(GraphicsStateGuardian) *glgsg, Shader *s) : ShaderContext
} else if (noprefix == "Color") { } else if (noprefix == "Color") {
bind._name = InternalName::get_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") { } else if (noprefix.substr(0, 7) == "Tangent") {
bind._name = InternalName::get_tangent(); bind._name = InternalName::get_tangent();
if (noprefix.size() > 7) { if (noprefix.size() > 7) {
@ -1419,9 +1423,11 @@ update_shader_vertex_arrays(ShaderContext *prev, bool force) {
} }
GLint p = _glsl_parameter_map[bind._id._seqno]; 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; int num_elements, element_stride, divisor;
bool normalized; 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, num_values, numeric_type,
normalized, start, stride, divisor, normalized, start, stride, divisor,
num_elements, element_stride)) { num_elements, element_stride)) {
@ -1463,6 +1469,14 @@ update_shader_vertex_arrays(ShaderContext *prev, bool force) {
for (int i = 0; i < bind._elements; ++i) { for (int i = 0; i < bind._elements; ++i) {
_glgsg->_glDisableVertexAttribArray(p + 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
}
} }
} }
} }

View File

@ -65,6 +65,7 @@ private:
//typedef pvector<ParamContext> ParamContexts; //typedef pvector<ParamContext> ParamContexts;
//ParamContexts _params; //ParamContexts _params;
GLint _color_attrib_index;
pvector<GLint> _glsl_parameter_map; pvector<GLint> _glsl_parameter_map;
pmap<GLint, GLuint64> _glsl_uniform_handles; pmap<GLint, GLuint64> _glsl_uniform_handles;