mirror of
https://github.com/panda3d/panda3d.git
synced 2025-10-04 10:54:24 -04:00
support for using the mat3 type in a shader. make p3d_NormalMatrix a mat3.
This commit is contained in:
parent
30ef435607
commit
fccd9965ee
@ -1059,6 +1059,8 @@ reset() {
|
|||||||
get_extension_func(GLPREFIX_QUOTED, "Uniform3fv");
|
get_extension_func(GLPREFIX_QUOTED, "Uniform3fv");
|
||||||
_glUniform4fv = (PFNGLUNIFORM4FVPROC)
|
_glUniform4fv = (PFNGLUNIFORM4FVPROC)
|
||||||
get_extension_func(GLPREFIX_QUOTED, "Uniform4fv");
|
get_extension_func(GLPREFIX_QUOTED, "Uniform4fv");
|
||||||
|
_glUniformMatrix3fv = (PFNGLUNIFORMMATRIX3FVPROC)
|
||||||
|
get_extension_func(GLPREFIX_QUOTED, "UniformMatrix3fv");
|
||||||
_glUniformMatrix4fv = (PFNGLUNIFORMMATRIX4FVPROC)
|
_glUniformMatrix4fv = (PFNGLUNIFORMMATRIX4FVPROC)
|
||||||
get_extension_func(GLPREFIX_QUOTED, "UniformMatrix4fv");
|
get_extension_func(GLPREFIX_QUOTED, "UniformMatrix4fv");
|
||||||
_glValidateProgram = (PFNGLVALIDATEPROGRAMPROC)
|
_glValidateProgram = (PFNGLVALIDATEPROGRAMPROC)
|
||||||
@ -1112,6 +1114,7 @@ reset() {
|
|||||||
_glUniform2fv = glUniform2fv;
|
_glUniform2fv = glUniform2fv;
|
||||||
_glUniform3fv = glUniform3fv;
|
_glUniform3fv = glUniform3fv;
|
||||||
_glUniform4fv = glUniform4fv;
|
_glUniform4fv = glUniform4fv;
|
||||||
|
_glUniformMatrix3fv = glUniformMatrix3fv;
|
||||||
_glUniformMatrix4fv = glUniformMatrix4fv;
|
_glUniformMatrix4fv = glUniformMatrix4fv;
|
||||||
_glValidateProgram = glValidateProgram;
|
_glValidateProgram = glValidateProgram;
|
||||||
_glVertexAttribPointer = glVertexAttribPointer;
|
_glVertexAttribPointer = glVertexAttribPointer;
|
||||||
|
@ -161,6 +161,7 @@ typedef void (APIENTRYP PFNGLUNIFORM1FVPROC) (GLint location, GLsizei count, con
|
|||||||
typedef void (APIENTRYP PFNGLUNIFORM2FVPROC) (GLint location, GLsizei count, const GLfloat *value);
|
typedef void (APIENTRYP PFNGLUNIFORM2FVPROC) (GLint location, GLsizei count, const GLfloat *value);
|
||||||
typedef void (APIENTRYP PFNGLUNIFORM3FVPROC) (GLint location, GLsizei count, const GLfloat *value);
|
typedef void (APIENTRYP PFNGLUNIFORM3FVPROC) (GLint location, GLsizei count, const GLfloat *value);
|
||||||
typedef void (APIENTRYP PFNGLUNIFORM4FVPROC) (GLint location, GLsizei count, const GLfloat *value);
|
typedef void (APIENTRYP PFNGLUNIFORM4FVPROC) (GLint location, GLsizei count, 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 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);
|
||||||
@ -677,6 +678,7 @@ public:
|
|||||||
PFNGLUNIFORM2FVPROC _glUniform2fv;
|
PFNGLUNIFORM2FVPROC _glUniform2fv;
|
||||||
PFNGLUNIFORM3FVPROC _glUniform3fv;
|
PFNGLUNIFORM3FVPROC _glUniform3fv;
|
||||||
PFNGLUNIFORM4FVPROC _glUniform4fv;
|
PFNGLUNIFORM4FVPROC _glUniform4fv;
|
||||||
|
PFNGLUNIFORMMATRIX3FVPROC _glUniformMatrix3fv;
|
||||||
PFNGLUNIFORMMATRIX4FVPROC _glUniformMatrix4fv;
|
PFNGLUNIFORMMATRIX4FVPROC _glUniformMatrix4fv;
|
||||||
PFNGLVALIDATEPROGRAMPROC _glValidateProgram;
|
PFNGLVALIDATEPROGRAMPROC _glValidateProgram;
|
||||||
PFNGLVERTEXATTRIBPOINTERPROC _glVertexAttribPointer;
|
PFNGLVERTEXATTRIBPOINTERPROC _glVertexAttribPointer;
|
||||||
|
@ -389,9 +389,9 @@ CLP(ShaderContext)(Shader *s, GSG *gsg) : ShaderContext(s) {
|
|||||||
bind._dep[1] = Shader::SSD_general | Shader::SSD_transform;
|
bind._dep[1] = Shader::SSD_general | Shader::SSD_transform;
|
||||||
|
|
||||||
if (transpose) {
|
if (transpose) {
|
||||||
bind._piece = Shader::SMP_whole;
|
bind._piece = Shader::SMP_upper3x3;
|
||||||
} else {
|
} else {
|
||||||
bind._piece = Shader::SMP_transpose;
|
bind._piece = Shader::SMP_transpose3x3;
|
||||||
}
|
}
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
@ -495,7 +495,6 @@ CLP(ShaderContext)(Shader *s, GSG *gsg) : ShaderContext(s) {
|
|||||||
s->_tex_spec.push_back(bind);
|
s->_tex_spec.push_back(bind);
|
||||||
continue; }
|
continue; }
|
||||||
case GL_FLOAT_MAT2:
|
case GL_FLOAT_MAT2:
|
||||||
case GL_FLOAT_MAT3:
|
|
||||||
#ifndef OPENGLES
|
#ifndef OPENGLES
|
||||||
case GL_FLOAT_MAT2x3:
|
case GL_FLOAT_MAT2x3:
|
||||||
case GL_FLOAT_MAT2x4:
|
case GL_FLOAT_MAT2x4:
|
||||||
@ -506,6 +505,19 @@ CLP(ShaderContext)(Shader *s, GSG *gsg) : ShaderContext(s) {
|
|||||||
#endif
|
#endif
|
||||||
GLCAT.warning() << "GLSL shader requested an unrecognized matrix type\n";
|
GLCAT.warning() << "GLSL shader requested an unrecognized matrix type\n";
|
||||||
continue;
|
continue;
|
||||||
|
case GL_FLOAT_MAT3: {
|
||||||
|
Shader::ShaderMatSpec bind;
|
||||||
|
bind._id = arg_id;
|
||||||
|
bind._piece = Shader::SMP_upper3x3;
|
||||||
|
bind._func = Shader::SMF_first;
|
||||||
|
bind._part[0] = Shader::SMO_mat_constant_x;
|
||||||
|
bind._arg[0] = InternalName::make(param_name);
|
||||||
|
bind._dep[0] = Shader::SSD_general | Shader::SSD_shaderinputs;
|
||||||
|
bind._part[1] = Shader::SMO_identity;
|
||||||
|
bind._arg[1] = NULL;
|
||||||
|
bind._dep[1] = Shader::SSD_NONE;
|
||||||
|
s->_mat_spec.push_back(bind);
|
||||||
|
continue; }
|
||||||
case GL_FLOAT_MAT4: {
|
case GL_FLOAT_MAT4: {
|
||||||
Shader::ShaderMatSpec bind;
|
Shader::ShaderMatSpec bind;
|
||||||
bind._id = arg_id;
|
bind._id = arg_id;
|
||||||
@ -1023,6 +1035,18 @@ issue_parameters(GSG *gsg, int altered) {
|
|||||||
case Shader::SMP_row3x1: gsg->_glUniform1fv(p, 1, data+12); continue;
|
case Shader::SMP_row3x1: gsg->_glUniform1fv(p, 1, data+12); continue;
|
||||||
case Shader::SMP_row3x2: gsg->_glUniform2fv(p, 1, data+12); continue;
|
case Shader::SMP_row3x2: gsg->_glUniform2fv(p, 1, data+12); continue;
|
||||||
case Shader::SMP_row3x3: gsg->_glUniform3fv(p, 1, data+12); continue;
|
case Shader::SMP_row3x3: gsg->_glUniform3fv(p, 1, data+12); continue;
|
||||||
|
case Shader::SMP_upper3x3:
|
||||||
|
{
|
||||||
|
LMatrix3f upper3 = val->get_upper_3();
|
||||||
|
gsg->_glUniformMatrix3fv(p, 1, false, upper3.get_data());
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
case Shader::SMP_transpose3x3:
|
||||||
|
{
|
||||||
|
LMatrix3f upper3 = val->get_upper_3();
|
||||||
|
gsg->_glUniformMatrix3fv(p, 1, true, upper3.get_data());
|
||||||
|
continue;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#if defined(HAVE_CG) && !defined(OPENGLES)
|
#if defined(HAVE_CG) && !defined(OPENGLES)
|
||||||
@ -1042,6 +1066,18 @@ issue_parameters(GSG *gsg, int altered) {
|
|||||||
case Shader::SMP_row3x1: GLfv(cgGLSetParameter1)(p, data+12); continue;
|
case Shader::SMP_row3x1: GLfv(cgGLSetParameter1)(p, data+12); continue;
|
||||||
case Shader::SMP_row3x2: GLfv(cgGLSetParameter2)(p, data+12); continue;
|
case Shader::SMP_row3x2: GLfv(cgGLSetParameter2)(p, data+12); continue;
|
||||||
case Shader::SMP_row3x3: GLfv(cgGLSetParameter3)(p, data+12); continue;
|
case Shader::SMP_row3x3: GLfv(cgGLSetParameter3)(p, data+12); continue;
|
||||||
|
case Shader::SMP_upper3x3:
|
||||||
|
{
|
||||||
|
LMatrix3f upper3 = val->get_upper_3();
|
||||||
|
GLfc(cgGLSetMatrixParameter)(p, upper3.get_data());
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
case Shader::SMP_transpose3x3:
|
||||||
|
{
|
||||||
|
LMatrix3f upper3 = val->get_upper_3();
|
||||||
|
GLfr(cgGLSetMatrixParameter)(p, upper3.get_data());
|
||||||
|
continue;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
@ -188,6 +188,7 @@ cp_errchk_parameter_float(ShaderArgInfo &p, int lo, int hi)
|
|||||||
case SAT_vec2: nfloat = 2; break;
|
case SAT_vec2: nfloat = 2; break;
|
||||||
case SAT_vec3: nfloat = 3; break;
|
case SAT_vec3: nfloat = 3; break;
|
||||||
case SAT_vec4: nfloat = 4; break;
|
case SAT_vec4: nfloat = 4; break;
|
||||||
|
case SAT_mat3x3: nfloat = 9; break;
|
||||||
case SAT_mat4x4: nfloat = 16; break;
|
case SAT_mat4x4: nfloat = 16; break;
|
||||||
default: nfloat = 0; break;
|
default: nfloat = 0; break;
|
||||||
}
|
}
|
||||||
@ -737,7 +738,17 @@ compile_parameter(const ShaderArgId &arg_id,
|
|||||||
else if (pieces[0]=="col2") bind._piece = SMP_col2;
|
else if (pieces[0]=="col2") bind._piece = SMP_col2;
|
||||||
else if (pieces[0]=="col3") bind._piece = SMP_col3;
|
else if (pieces[0]=="col3") bind._piece = SMP_col3;
|
||||||
if ((bind._piece == SMP_whole)||(bind._piece == SMP_transpose)) {
|
if ((bind._piece == SMP_whole)||(bind._piece == SMP_transpose)) {
|
||||||
if (!cp_errchk_parameter_float(p, 16, 16)) return false;
|
if (p._type == SAT_mat3x3) {
|
||||||
|
if (!cp_errchk_parameter_float(p, 9, 9)) return false;
|
||||||
|
|
||||||
|
if (bind._piece == SMP_transpose) {
|
||||||
|
bind._piece = SMP_transpose3x3;
|
||||||
|
} else {
|
||||||
|
bind._piece = SMP_upper3x3;
|
||||||
|
}
|
||||||
|
} else if (!cp_errchk_parameter_float(p, 16, 16)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
if (!cp_errchk_parameter_float(p, 4, 4)) return false;
|
if (!cp_errchk_parameter_float(p, 4, 4)) return false;
|
||||||
}
|
}
|
||||||
|
@ -225,6 +225,8 @@ public:
|
|||||||
SMP_row3x1,
|
SMP_row3x1,
|
||||||
SMP_row3x2,
|
SMP_row3x2,
|
||||||
SMP_row3x3,
|
SMP_row3x3,
|
||||||
|
SMP_upper3x3,
|
||||||
|
SMP_transpose3x3,
|
||||||
};
|
};
|
||||||
|
|
||||||
enum ShaderStateDep {
|
enum ShaderStateDep {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user