mirror of
https://github.com/panda3d/panda3d.git
synced 2025-10-03 10:22:45 -04:00
Changes to GLSL input handling that further assist in efforts to port from Cg to GLSL
This commit is contained in:
parent
9178ed2871
commit
da6140a8cc
@ -51,59 +51,51 @@ TypeHandle CLP(ShaderContext)::_type_handle;
|
|||||||
// actually picked up and the appropriate ShaderMatSpec pushed onto _mat_spec.
|
// actually picked up and the appropriate ShaderMatSpec pushed onto _mat_spec.
|
||||||
////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////
|
||||||
bool CLP(ShaderContext)::
|
bool CLP(ShaderContext)::
|
||||||
parse_and_set_short_hand_shader_vars(Shader::ShaderArgId &arg_id, Shader *objShader) {
|
parse_and_set_short_hand_shader_vars(Shader::ShaderArgId &arg_id, GLenum param_type, GLint param_size, Shader *objShader) {
|
||||||
Shader::ShaderArgInfo p;
|
Shader::ShaderArgInfo p;
|
||||||
p._id = arg_id;
|
p._id = arg_id;
|
||||||
p._cat = GLCAT;
|
p._cat = GLCAT;
|
||||||
|
|
||||||
string basename(arg_id._name);
|
string basename(arg_id._name);
|
||||||
|
|
||||||
// Split it at the underscores.
|
// Split it at the underscores.
|
||||||
vector_string pieces;
|
vector_string pieces;
|
||||||
tokenize(basename, pieces, "_");
|
tokenize(basename, pieces, "_");
|
||||||
|
|
||||||
if (pieces[0] == "mstrans") {
|
if (pieces.size() == 0 || pieces[0].size() < 3) {
|
||||||
pieces[0] = "trans";
|
return false;
|
||||||
pieces.push_back("to");
|
|
||||||
pieces.push_back("model");
|
|
||||||
}
|
|
||||||
if (pieces[0] == "wstrans") {
|
|
||||||
pieces[0] = "trans";
|
|
||||||
pieces.push_back("to");
|
|
||||||
pieces.push_back("world");
|
|
||||||
}
|
|
||||||
if (pieces[0] == "vstrans") {
|
|
||||||
pieces[0] = "trans";
|
|
||||||
pieces.push_back("to");
|
|
||||||
pieces.push_back("view");
|
|
||||||
}
|
|
||||||
if (pieces[0] == "cstrans") {
|
|
||||||
pieces[0] = "trans";
|
|
||||||
pieces.push_back("to");
|
|
||||||
pieces.push_back("clip");
|
|
||||||
}
|
|
||||||
if (pieces[0] == "mspos") {
|
|
||||||
pieces[0] = "row3";
|
|
||||||
pieces.push_back("to");
|
|
||||||
pieces.push_back("model");
|
|
||||||
}
|
|
||||||
if (pieces[0] == "wspos") {
|
|
||||||
pieces[0] = "row3";
|
|
||||||
pieces.push_back("to");
|
|
||||||
pieces.push_back("world");
|
|
||||||
}
|
|
||||||
if (pieces[0] == "vspos") {
|
|
||||||
pieces[0] = "row3";
|
|
||||||
pieces.push_back("to");
|
|
||||||
pieces.push_back("view");
|
|
||||||
}
|
|
||||||
if (pieces[0] == "cspos") {
|
|
||||||
pieces[0] = "row3";
|
|
||||||
pieces.push_back("to");
|
|
||||||
pieces.push_back("clip");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((pieces[0] == "mat") || (pieces[0] == "inv") ||
|
// mstrans, wstrans, vstrans, cstrans, mspos, wspos, vspos, cspos
|
||||||
(pieces[0] == "tps") || (pieces[0] == "itp")) {
|
if (strcmp(pieces[0].c_str() + 1, "strans") == 0 ||
|
||||||
|
strcmp(pieces[0].c_str() + 1, "spos") == 0) {
|
||||||
|
pieces.push_back("to");
|
||||||
|
|
||||||
|
switch (pieces[0][0]) {
|
||||||
|
case 'm':
|
||||||
|
pieces.push_back("model");
|
||||||
|
break;
|
||||||
|
case 'w':
|
||||||
|
pieces.push_back("world");
|
||||||
|
break;
|
||||||
|
case 'v':
|
||||||
|
pieces.push_back("view");
|
||||||
|
break;
|
||||||
|
case 'c':
|
||||||
|
pieces.push_back("clip");
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if (strcmp(pieces[0].c_str() + 1, "strans") == 0) {
|
||||||
|
pieces[0] = "trans";
|
||||||
|
} else {
|
||||||
|
pieces[0] = "row3";
|
||||||
|
}
|
||||||
|
// mat_modelproj et al
|
||||||
|
} else if (pieces[0].size() == 3 &&
|
||||||
|
(pieces[0] == "mat" || pieces[0] == "inv" ||
|
||||||
|
pieces[0] == "tps" || pieces[0] == "itp")) {
|
||||||
if (!objShader->cp_errchk_parameter_words(p, 2)) {
|
if (!objShader->cp_errchk_parameter_words(p, 2)) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@ -156,16 +148,58 @@ parse_and_set_short_hand_shader_vars(Shader::ShaderArgId &arg_id, Shader *objSha
|
|||||||
pieces.push_back("");
|
pieces.push_back("");
|
||||||
|
|
||||||
// Decide whether this is a matrix or vector.
|
// Decide whether this is a matrix or vector.
|
||||||
if (pieces[0] == "trans") bind._piece = Shader::SMP_whole;
|
if (param_type == GL_FLOAT_MAT4) {
|
||||||
else if (pieces[0] == "tpose") bind._piece = Shader::SMP_transpose;
|
if (pieces[0] == "trans") bind._piece = Shader::SMP_whole;
|
||||||
else if (pieces[0] == "row0") bind._piece = Shader::SMP_row0;
|
else if (pieces[0] == "tpose") bind._piece = Shader::SMP_transpose;
|
||||||
else if (pieces[0] == "row1") bind._piece = Shader::SMP_row1;
|
else {
|
||||||
else if (pieces[0] == "row2") bind._piece = Shader::SMP_row2;
|
GLCAT.error() << basename << " should be vec4, not mat3\n";
|
||||||
else if (pieces[0] == "row3") bind._piece = Shader::SMP_row3;
|
return false;
|
||||||
else if (pieces[0] == "col0") bind._piece = Shader::SMP_col0;
|
}
|
||||||
else if (pieces[0] == "col1") bind._piece = Shader::SMP_col1;
|
} else if (param_type == GL_FLOAT_MAT3) {
|
||||||
else if (pieces[0] == "col2") bind._piece = Shader::SMP_col2;
|
if (pieces[0] == "trans") bind._piece = Shader::SMP_upper3x3;
|
||||||
else if (pieces[0] == "col3") bind._piece = Shader::SMP_col3;
|
else if (pieces[0] == "tpose") bind._piece = Shader::SMP_transpose3x3;
|
||||||
|
else {
|
||||||
|
GLCAT.error() << basename << " should be vec4, not mat3\n";
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
} else if (param_type == GL_FLOAT_VEC4) {
|
||||||
|
if (pieces[0] == "trans") bind._piece = Shader::SMP_col0;
|
||||||
|
else if (pieces[0] == "tpose") bind._piece = Shader::SMP_row0;
|
||||||
|
else if (pieces[0] == "row0") bind._piece = Shader::SMP_row0;
|
||||||
|
else if (pieces[0] == "row1") bind._piece = Shader::SMP_row1;
|
||||||
|
else if (pieces[0] == "row2") bind._piece = Shader::SMP_row2;
|
||||||
|
else if (pieces[0] == "row3") bind._piece = Shader::SMP_row3;
|
||||||
|
else if (pieces[0] == "col0") bind._piece = Shader::SMP_col0;
|
||||||
|
else if (pieces[0] == "col1") bind._piece = Shader::SMP_col1;
|
||||||
|
else if (pieces[0] == "col2") bind._piece = Shader::SMP_col2;
|
||||||
|
else if (pieces[0] == "col3") bind._piece = Shader::SMP_col3;
|
||||||
|
else {
|
||||||
|
GLCAT.error() << basename << " should be mat4, not vec4\n";
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
} else if (pieces[0] == "row3") {
|
||||||
|
// We'll permit this too, simply because we can support it.
|
||||||
|
switch (param_type) {
|
||||||
|
case GL_FLOAT:
|
||||||
|
bind._piece = Shader::SMP_row3x1;
|
||||||
|
break;
|
||||||
|
case GL_FLOAT_VEC2:
|
||||||
|
bind._piece = Shader::SMP_row3x2;
|
||||||
|
break;
|
||||||
|
case GL_FLOAT_VEC3:
|
||||||
|
bind._piece = Shader::SMP_row3x3;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
GLCAT.error() << basename << " should be vec4\n";
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
} else if (pieces[0] == "trans" || pieces[0] == "tpose") {
|
||||||
|
GLCAT.error() << basename << " should be mat4 or mat3\n";
|
||||||
|
return false;
|
||||||
|
} else {
|
||||||
|
GLCAT.error() << basename << " should be vec4\n";
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
if (!objShader->cp_parse_coord_sys(p, pieces, next, bind, true)) {
|
if (!objShader->cp_parse_coord_sys(p, pieces, next, bind, true)) {
|
||||||
return false;
|
return false;
|
||||||
@ -194,6 +228,25 @@ parse_and_set_short_hand_shader_vars(Shader::ShaderArgId &arg_id, Shader *objSha
|
|||||||
|
|
||||||
objShader->cp_optimize_mat_spec(bind);
|
objShader->cp_optimize_mat_spec(bind);
|
||||||
objShader->_mat_spec.push_back(bind);
|
objShader->_mat_spec.push_back(bind);
|
||||||
|
|
||||||
|
if (param_size > 1) {
|
||||||
|
// We support arrays of rows and arrays of columns, so we can
|
||||||
|
// run the GLSL shaders that cgc spits out.
|
||||||
|
if (bind._piece == Shader::SMP_row0 || bind._piece == Shader::SMP_col0) {
|
||||||
|
if (param_size > 4) {
|
||||||
|
GLCAT.warning() << basename << "[" << param_size << "] is too large, only the first four elements will be defined\n";
|
||||||
|
param_size = 4;
|
||||||
|
}
|
||||||
|
for (int i = 1; i < param_size; ++i) {
|
||||||
|
bind._id._seqno += 1;
|
||||||
|
bind._piece = (Shader::ShaderMatPiece)((int)bind._piece + 1);
|
||||||
|
objShader->_mat_spec.push_back(bind);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
GLCAT.warning() << basename << "[" << param_size << "] should not be an array, only the first element will be defined\n";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
@ -963,7 +1016,7 @@ reflect_uniform(int i, char *name_buffer, GLsizei name_buflen) {
|
|||||||
|
|
||||||
} else {
|
} else {
|
||||||
// Tries to parse shorthand notations like mspos_XXX and trans_model_to_clip_of_XXX
|
// Tries to parse shorthand notations like mspos_XXX and trans_model_to_clip_of_XXX
|
||||||
if (parse_and_set_short_hand_shader_vars(arg_id, _shader)) {
|
if (parse_and_set_short_hand_shader_vars(arg_id, param_type, param_size, _shader)) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -98,7 +98,7 @@ private:
|
|||||||
void glsl_report_program_errors(GLuint program, bool fatal);
|
void glsl_report_program_errors(GLuint program, bool fatal);
|
||||||
bool glsl_compile_shader(Shader::ShaderType type);
|
bool glsl_compile_shader(Shader::ShaderType type);
|
||||||
bool glsl_compile_and_link();
|
bool glsl_compile_and_link();
|
||||||
bool parse_and_set_short_hand_shader_vars(Shader::ShaderArgId &arg_id, Shader *s);
|
bool parse_and_set_short_hand_shader_vars(Shader::ShaderArgId &arg_id, GLenum param_type, GLint param_size, Shader *s);
|
||||||
void release_resources();
|
void release_resources();
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
Loading…
x
Reference in New Issue
Block a user