mirror of
https://github.com/panda3d/panda3d.git
synced 2025-10-03 02:15:43 -04:00
Change p3d_Color behavior to take ColorAttrib into account; assign white if missing
This commit is contained in:
parent
fdc8918946
commit
90ad6f00bf
@ -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;
|
||||
|
@ -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;
|
||||
|
@ -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
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -65,6 +65,7 @@ private:
|
||||
//typedef pvector<ParamContext> ParamContexts;
|
||||
//ParamContexts _params;
|
||||
|
||||
GLint _color_attrib_index;
|
||||
pvector<GLint> _glsl_parameter_map;
|
||||
pmap<GLint, GLuint64> _glsl_uniform_handles;
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user