mirror of
https://github.com/panda3d/panda3d.git
synced 2025-10-03 10:22:45 -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");
|
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;
|
||||||
|
@ -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;
|
||||||
|
@ -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
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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;
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user