git-svn-id: svn://db.shs.com.ru/libs@636 a8b55f48-bf90-11e4-a774-851b48703e85

This commit is contained in:
2019-11-27 21:49:24 +00:00
parent 988c4e1150
commit 09298fadcd
22 changed files with 291 additions and 173 deletions

View File

@@ -24,7 +24,7 @@
using namespace QGLEngineShaders;
bool addShader(QOpenGLShaderProgram * prog, QOpenGLShader::ShaderType type, QString & content, const QString & file) {
bool addShader(QOpenGLShaderProgram * prog, QOpenGLShader::ShaderType type, QString & content, const QString & file, const QString & defs) {
if (type == 0 || content.isEmpty()) {
content.clear();
return true;
@@ -43,6 +43,7 @@ bool addShader(QOpenGLShaderProgram * prog, QOpenGLShader::ShaderType type, QStr
content.prepend(qgl_geometry_head);
break;
}
content.prepend(defs);
content.prepend(qgl_common_head);
bool ret = prog->addShaderFromSourceCode(type, content.toLatin1());
if (!ret) qDebug() << "[QGLView] Shader" << file << "Compile error:\n" << prog->log();
@@ -51,59 +52,57 @@ bool addShader(QOpenGLShaderProgram * prog, QOpenGLShader::ShaderType type, QStr
}
bool QGLEngineShaders::loadShadersMulti(QOpenGLShaderProgram *& prog, const QString & file) {
QString prepareDefines(const QStringList & defines) {
if (defines.isEmpty()) return QString();
QString ret;
foreach (QString s, defines)
ret.append("#define " + s + "\n");
return ret;
}
bool QGLEngineShaders::loadShadersMulti(QOpenGLShaderProgram *& prog, const QString & file, const QStringList & defines) {
if (!prog)
prog = new QOpenGLShaderProgram();
prog->removeAllShaders();
QFile f(file);
if (!f.open(QIODevice::ReadOnly)) return false;
QTextStream ts(&f);
QString cur_shader, line, pl;
QString cur_shader, line, pl, defs = prepareDefines(defines);
QOpenGLShader::ShaderType type = 0;
while (!ts.atEnd()) {
line = ts.readLine();
pl = line.trimmed().remove(' ').remove('\t').mid(2).toLower();
pl.chop(2);
if (pl == "vertex" || pl == "vert") {
if (!addShader(prog, type, cur_shader, file)) return false;
if (!addShader(prog, type, cur_shader, file, defs)) return false;
type = QOpenGLShader::Vertex;
continue;
}
if (pl == "fragment" || pl == "frag") {
if (!addShader(prog, type, cur_shader, file)) return false;
if (!addShader(prog, type, cur_shader, file, defs)) return false;
type = QOpenGLShader::Fragment;
continue;
}
if (pl == "geometry" || pl == "geom") {
if (!addShader(prog, type, cur_shader, file)) return false;
if (!addShader(prog, type, cur_shader, file, defs)) return false;
type = QOpenGLShader::Geometry;
continue;
}
if (pl == "tessellation_control") {
if (!addShader(prog, type, cur_shader, file)) return false;
if (!addShader(prog, type, cur_shader, file, defs)) return false;
type = QOpenGLShader::TessellationControl;
continue;
}
if (pl == "tessellation_evaluation") {
if (!addShader(prog, type, cur_shader, file)) return false;
if (!addShader(prog, type, cur_shader, file, defs)) return false;
type = QOpenGLShader::TessellationEvaluation;
continue;
}
cur_shader.append("\n");
cur_shader.append(line);
}
if (!addShader(prog, type, cur_shader, file)) return false;
/// WARNING
/*prog->bindAttributeLocation("qgl_Vertex" , 1 );
prog->bindAttributeLocation("qgl_Normal" , 2 );
prog->bindAttributeLocation("qgl_Tangent" , 3 );
prog->bindAttributeLocation("qgl_Bitangent" , 4 );
prog->bindAttributeLocation("qgl_Texture" , 5 );
prog->bindAttributeLocation("qgl_Material" , 6 );
prog->bindAttributeLocation("qgl_Color" , 7 );
prog->bindAttributeLocation("qgl_ModelViewMatrix" , 8 );
prog->bindAttributeLocation("qgl_ModelViewProjectionMatrix", 12);
prog->bindAttributeLocation("qgl_NormalMatrix" , 16);*/
if (!addShader(prog, type, cur_shader, file, defs)) return false;
if (!prog->link()) {
qDebug() << "[QGLView] Shader" << file << "Link error:\n" << prog->log();
return false;